
(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})()({"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/desandro-matches-selector/matches-selector.js":[function(require,module,exports){
/**
 * 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 == '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 );
  };

}));

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/ev-emitter/ev-emitter.js":[function(require,module,exports){
/**
 * 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 == 'object' && module.exports ) {
    // CommonJS - Browserify, Webpack
    module.exports = factory();
  } else {
    // Browser globals
    global.EvEmitter = factory();
  }

}( typeof window != 'undefined' ? window : this, 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;

}));

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/fizzy-ui-utils/utils.js":[function(require,module,exports){
/**
 * 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 == '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":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/desandro-matches-selector/matches-selector.js"}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/get-size/get-size.js":[function(require,module,exports){
/*!
 * 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 == '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;

});

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/imagesloaded/imagesloaded.js":[function(require,module,exports){
/*!
 * imagesLoaded v4.1.4
 * JavaScript is all like "You images are done yet or what?"
 * MIT License
 */

( function( window, factory ) { 'use strict';
  // universal module definition

  /*global define: false, module: false, require: false */

  if ( typeof define == 'function' && define.amd ) {
    // AMD
    define( [
      'ev-emitter/ev-emitter'
    ], function( EvEmitter ) {
      return factory( window, EvEmitter );
    });
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS
    module.exports = factory(
      window,
      require('ev-emitter')
    );
  } else {
    // browser global
    window.imagesLoaded = factory(
      window,
      window.EvEmitter
    );
  }

})( typeof window !== 'undefined' ? window : this,

// --------------------------  factory -------------------------- //

function factory( window, EvEmitter ) {

'use strict';

var $ = window.jQuery;
var console = window.console;

// -------------------------- helpers -------------------------- //

// extend objects
function extend( a, b ) {
  for ( var prop in b ) {
    a[ prop ] = b[ prop ];
  }
  return a;
}

var arraySlice = Array.prototype.slice;

// turn element or nodeList into an array
function makeArray( obj ) {
  if ( Array.isArray( obj ) ) {
    // use object if already an array
    return obj;
  }

  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 ];
}

// -------------------------- imagesLoaded -------------------------- //

/**
 * @param {Array, Element, NodeList, String} elem
 * @param {Object or Function} options - if function, use as callback
 * @param {Function} onAlways - callback function
 */
function ImagesLoaded( elem, options, onAlways ) {
  // coerce ImagesLoaded() without new, to be new ImagesLoaded()
  if ( !( this instanceof ImagesLoaded ) ) {
    return new ImagesLoaded( elem, options, onAlways );
  }
  // use elem as selector string
  var queryElem = elem;
  if ( typeof elem == 'string' ) {
    queryElem = document.querySelectorAll( elem );
  }
  // bail if bad element
  if ( !queryElem ) {
    console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );
    return;
  }

  this.elements = makeArray( queryElem );
  this.options = extend( {}, this.options );
  // shift arguments if no options set
  if ( typeof options == 'function' ) {
    onAlways = options;
  } else {
    extend( this.options, options );
  }

  if ( onAlways ) {
    this.on( 'always', onAlways );
  }

  this.getImages();

  if ( $ ) {
    // add jQuery Deferred object
    this.jqDeferred = new $.Deferred();
  }

  // HACK check async to allow time to bind listeners
  setTimeout( this.check.bind( this ) );
}

ImagesLoaded.prototype = Object.create( EvEmitter.prototype );

ImagesLoaded.prototype.options = {};

ImagesLoaded.prototype.getImages = function() {
  this.images = [];

  // filter & find items if we have an item selector
  this.elements.forEach( this.addElementImages, this );
};

/**
 * @param {Node} element
 */
ImagesLoaded.prototype.addElementImages = function( elem ) {
  // filter siblings
  if ( elem.nodeName == 'IMG' ) {
    this.addImage( elem );
  }
  // get background image on element
  if ( this.options.background === true ) {
    this.addElementBackgroundImages( elem );
  }

  // find children
  // no non-element nodes, #143
  var nodeType = elem.nodeType;
  if ( !nodeType || !elementNodeTypes[ nodeType ] ) {
    return;
  }
  var childImgs = elem.querySelectorAll('img');
  // concat childElems to filterFound array
  for ( var i=0; i < childImgs.length; i++ ) {
    var img = childImgs[i];
    this.addImage( img );
  }

  // get child background images
  if ( typeof this.options.background == 'string' ) {
    var children = elem.querySelectorAll( this.options.background );
    for ( i=0; i < children.length; i++ ) {
      var child = children[i];
      this.addElementBackgroundImages( child );
    }
  }
};

var elementNodeTypes = {
  1: true,
  9: true,
  11: true
};

ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
  var style = getComputedStyle( elem );
  if ( !style ) {
    // Firefox returns null if in a hidden iframe https://bugzil.la/548397
    return;
  }
  // get url inside url("...")
  var reURL = /url\((['"])?(.*?)\1\)/gi;
  var matches = reURL.exec( style.backgroundImage );
  while ( matches !== null ) {
    var url = matches && matches[2];
    if ( url ) {
      this.addBackground( url, elem );
    }
    matches = reURL.exec( style.backgroundImage );
  }
};

/**
 * @param {Image} img
 */
ImagesLoaded.prototype.addImage = function( img ) {
  var loadingImage = new LoadingImage( img );
  this.images.push( loadingImage );
};

ImagesLoaded.prototype.addBackground = function( url, elem ) {
  var background = new Background( url, elem );
  this.images.push( background );
};

ImagesLoaded.prototype.check = function() {
  var _this = this;
  this.progressedCount = 0;
  this.hasAnyBroken = false;
  // complete if no images
  if ( !this.images.length ) {
    this.complete();
    return;
  }

  function onProgress( image, elem, message ) {
    // HACK - Chrome triggers event before object properties have changed. #83
    setTimeout( function() {
      _this.progress( image, elem, message );
    });
  }

  this.images.forEach( function( loadingImage ) {
    loadingImage.once( 'progress', onProgress );
    loadingImage.check();
  });
};

ImagesLoaded.prototype.progress = function( image, elem, message ) {
  this.progressedCount++;
  this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
  // progress event
  this.emitEvent( 'progress', [ this, image, elem ] );
  if ( this.jqDeferred && this.jqDeferred.notify ) {
    this.jqDeferred.notify( this, image );
  }
  // check if completed
  if ( this.progressedCount == this.images.length ) {
    this.complete();
  }

  if ( this.options.debug && console ) {
    console.log( 'progress: ' + message, image, elem );
  }
};

ImagesLoaded.prototype.complete = function() {
  var eventName = this.hasAnyBroken ? 'fail' : 'done';
  this.isComplete = true;
  this.emitEvent( eventName, [ this ] );
  this.emitEvent( 'always', [ this ] );
  if ( this.jqDeferred ) {
    var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
    this.jqDeferred[ jqMethod ]( this );
  }
};

// --------------------------  -------------------------- //

function LoadingImage( img ) {
  this.img = img;
}

LoadingImage.prototype = Object.create( EvEmitter.prototype );

LoadingImage.prototype.check = function() {
  // If complete is true and browser supports natural sizes,
  // try to check for image status manually.
  var isComplete = this.getIsImageComplete();
  if ( isComplete ) {
    // report based on naturalWidth
    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
    return;
  }

  // If none of the checks above matched, simulate loading on detached element.
  this.proxyImage = new Image();
  this.proxyImage.addEventListener( 'load', this );
  this.proxyImage.addEventListener( 'error', this );
  // bind to image as well for Firefox. #191
  this.img.addEventListener( 'load', this );
  this.img.addEventListener( 'error', this );
  this.proxyImage.src = this.img.src;
};

LoadingImage.prototype.getIsImageComplete = function() {
  // check for non-zero, non-undefined naturalWidth
  // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
  return this.img.complete && this.img.naturalWidth;
};

LoadingImage.prototype.confirm = function( isLoaded, message ) {
  this.isLoaded = isLoaded;
  this.emitEvent( 'progress', [ this, this.img, message ] );
};

// ----- events ----- //

// trigger specified handler for event type
LoadingImage.prototype.handleEvent = function( event ) {
  var method = 'on' + event.type;
  if ( this[ method ] ) {
    this[ method ]( event );
  }
};

LoadingImage.prototype.onload = function() {
  this.confirm( true, 'onload' );
  this.unbindEvents();
};

LoadingImage.prototype.onerror = function() {
  this.confirm( false, 'onerror' );
  this.unbindEvents();
};

LoadingImage.prototype.unbindEvents = function() {
  this.proxyImage.removeEventListener( 'load', this );
  this.proxyImage.removeEventListener( 'error', this );
  this.img.removeEventListener( 'load', this );
  this.img.removeEventListener( 'error', this );
};

// -------------------------- Background -------------------------- //

function Background( url, element ) {
  this.url = url;
  this.element = element;
  this.img = new Image();
}

// inherit LoadingImage prototype
Background.prototype = Object.create( LoadingImage.prototype );

Background.prototype.check = function() {
  this.img.addEventListener( 'load', this );
  this.img.addEventListener( 'error', this );
  this.img.src = this.url;
  // check if image is already complete
  var isComplete = this.getIsImageComplete();
  if ( isComplete ) {
    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
    this.unbindEvents();
  }
};

Background.prototype.unbindEvents = function() {
  this.img.removeEventListener( 'load', this );
  this.img.removeEventListener( 'error', this );
};

Background.prototype.confirm = function( isLoaded, message ) {
  this.isLoaded = isLoaded;
  this.emitEvent( 'progress', [ this, this.element, message ] );
};

// -------------------------- jQuery -------------------------- //

ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
  jQuery = jQuery || window.jQuery;
  if ( !jQuery ) {
    return;
  }
  // set local variable
  $ = jQuery;
  // $().imagesLoaded()
  $.fn.imagesLoaded = function( options, callback ) {
    var instance = new ImagesLoaded( this, options, callback );
    return instance.jqDeferred.promise( $(this) );
  };
};
// try making plugin
ImagesLoaded.makeJQueryPlugin();

// --------------------------  -------------------------- //

return ImagesLoaded;

});

},{"ev-emitter":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/ev-emitter/ev-emitter.js"}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/masonry.js":[function(require,module,exports){
/*!
 * 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 == '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":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/get-size/get-size.js","outlayer":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/outlayer/outlayer.js"}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/outlayer/item.js":[function(require,module,exports){
/**
 * 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 == '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":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/ev-emitter/ev-emitter.js","get-size":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/get-size/get-size.js"}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/outlayer/outlayer.js":[function(require,module,exports){
/*!
 * 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 == '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() {};

// -------------------------- 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":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/outlayer/item.js","ev-emitter":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/ev-emitter/ev-emitter.js","fizzy-ui-utils":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/fizzy-ui-utils/utils.js","get-size":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/get-size/get-size.js"}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/svg4everybody/dist/svg4everybody.js":[function(require,module,exports){
!function(root, factory) {
    "function" == typeof define && define.amd ? // AMD. Register as an anonymous module unless amdModuleId is set
    define([], function() {
        return root.svg4everybody = factory();
    }) : "object" == typeof module && module.exports ? // Node. Does not work with strict CommonJS, but
    // only CommonJS-like environments that support module.exports,
    // like Node.
    module.exports = factory() : root.svg4everybody = factory();
}(this, function() {
    /*! svg4everybody v2.1.9 | github.com/jonathantneal/svg4everybody */
    function embed(parent, svg, target) {
        // if the target exists
        if (target) {
            // create a document fragment to hold the contents of the target
            var fragment = document.createDocumentFragment(), viewBox = !svg.hasAttribute("viewBox") && target.getAttribute("viewBox");
            // conditionally set the viewBox on the svg
            viewBox && svg.setAttribute("viewBox", viewBox);
            // copy the contents of the clone into the fragment
            for (// clone the target
            var clone = target.cloneNode(!0); clone.childNodes.length; ) {
                fragment.appendChild(clone.firstChild);
            }
            // append the fragment into the svg
            parent.appendChild(fragment);
        }
    }
    function loadreadystatechange(xhr) {
        // listen to changes in the request
        xhr.onreadystatechange = function() {
            // if the request is ready
            if (4 === xhr.readyState) {
                // get the cached html document
                var cachedDocument = xhr._cachedDocument;
                // ensure the cached html document based on the xhr response
                cachedDocument || (cachedDocument = xhr._cachedDocument = document.implementation.createHTMLDocument(""), 
                cachedDocument.body.innerHTML = xhr.responseText, xhr._cachedTarget = {}), // clear the xhr embeds list and embed each item
                xhr._embeds.splice(0).map(function(item) {
                    // get the cached target
                    var target = xhr._cachedTarget[item.id];
                    // ensure the cached target
                    target || (target = xhr._cachedTarget[item.id] = cachedDocument.getElementById(item.id)), 
                    // embed the target into the svg
                    embed(item.parent, item.svg, target);
                });
            }
        }, // test the ready state change immediately
        xhr.onreadystatechange();
    }
    function svg4everybody(rawopts) {
        function oninterval() {
            // while the index exists in the live <use> collection
            for (// get the cached <use> index
            var index = 0; index < uses.length; ) {
                // get the current <use>
                var use = uses[index], parent = use.parentNode, svg = getSVGAncestor(parent), src = use.getAttribute("xlink:href") || use.getAttribute("href");
                if (!src && opts.attributeName && (src = use.getAttribute(opts.attributeName)), 
                svg && src) {
                    if (polyfill) {
                        if (!opts.validate || opts.validate(src, svg, use)) {
                            // remove the <use> element
                            parent.removeChild(use);
                            // parse the src and get the url and id
                            var srcSplit = src.split("#"), url = srcSplit.shift(), id = srcSplit.join("#");
                            // if the link is external
                            if (url.length) {
                                // get the cached xhr request
                                var xhr = requests[url];
                                // ensure the xhr request exists
                                xhr || (xhr = requests[url] = new XMLHttpRequest(), xhr.open("GET", url), xhr.send(), 
                                xhr._embeds = []), // add the svg and id as an item to the xhr embeds list
                                xhr._embeds.push({
                                    parent: parent,
                                    svg: svg,
                                    id: id
                                }), // prepare the xhr ready state change event
                                loadreadystatechange(xhr);
                            } else {
                                // embed the local id into the svg
                                embed(parent, svg, document.getElementById(id));
                            }
                        } else {
                            // increase the index when the previous value was not "valid"
                            ++index, ++numberOfSvgUseElementsToBypass;
                        }
                    }
                } else {
                    // increase the index when the previous value was not "valid"
                    ++index;
                }
            }
            // continue the interval
            (!uses.length || uses.length - numberOfSvgUseElementsToBypass > 0) && requestAnimationFrame(oninterval, 67);
        }
        var polyfill, opts = Object(rawopts), newerIEUA = /\bTrident\/[567]\b|\bMSIE (?:9|10)\.0\b/, webkitUA = /\bAppleWebKit\/(\d+)\b/, olderEdgeUA = /\bEdge\/12\.(\d+)\b/, edgeUA = /\bEdge\/.(\d+)\b/, inIframe = window.top !== window.self;
        polyfill = "polyfill" in opts ? opts.polyfill : newerIEUA.test(navigator.userAgent) || (navigator.userAgent.match(olderEdgeUA) || [])[1] < 10547 || (navigator.userAgent.match(webkitUA) || [])[1] < 537 || edgeUA.test(navigator.userAgent) && inIframe;
        // create xhr requests object
        var requests = {}, requestAnimationFrame = window.requestAnimationFrame || setTimeout, uses = document.getElementsByTagName("use"), numberOfSvgUseElementsToBypass = 0;
        // conditionally start the interval if the polyfill is active
        polyfill && oninterval();
    }
    function getSVGAncestor(node) {
        for (var svg = node; "svg" !== svg.nodeName.toLowerCase() && (svg = svg.parentNode); ) {}
        return svg;
    }
    return svg4everybody;
});
},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/uikit/dist/js/uikit.js":[function(require,module,exports){
/*! UIkit 2.27.4 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
(function(core) {

    var uikit;

    if (!window.jQuery) {
        throw new Error('UIkit 2.x requires jQuery');
    } else {
        uikit = core(window.jQuery);
    }

    if (typeof define == 'function' && define.amd) { // AMD

        define('uikit', function(){

            uikit.load = function(res, req, onload, config) {

                var resources = res.split(','), load = [], i, base = (config.config && config.config.uikit && config.config.uikit.base ? config.config.uikit.base : '').replace(/\/+$/g, '');

                if (!base) {
                    throw new Error('Please define base path to UIkit in the requirejs config.');
                }

                for (i = 0; i < resources.length; i += 1) {
                    var resource = resources[i].replace(/\./g, '/');
                    load.push(base+'/components/'+resource);
                }

                req(load, function() {
                    onload(uikit);
                });
            };

            return uikit;
        });
    }

})(function($) {

    "use strict";

    if (window.UIkit2) {
        return window.UIkit2;
    }

    var UI = {}, _UI = window.UIkit || undefined;

    UI.version = '2.27.4';

    UI.noConflict = function() {
        // restore UIkit version
        if (_UI) {
            window.UIkit = _UI;
            $.UIkit      = _UI;
            $.fn.uk      = _UI.fn;
        }

        return UI;
    };

    window.UIkit2 = UI;

    if (!_UI) {
        window.UIkit = UI;
    }

    // cache jQuery
    UI.$ = $;

    UI.$doc  = UI.$(document);
    UI.$win  = UI.$(window);
    UI.$html = UI.$('html');

    UI.support = {};
    UI.support.transition = (function() {

        var transitionEnd = (function() {

            var element = document.body || document.documentElement,
                transEndEventNames = {
                    WebkitTransition : 'webkitTransitionEnd',
                    MozTransition    : 'transitionend',
                    OTransition      : 'oTransitionEnd otransitionend',
                    transition       : 'transitionend'
                }, name;

            for (name in transEndEventNames) {
                if (element.style[name] !== undefined) return transEndEventNames[name];
            }
        }());

        return transitionEnd && { end: transitionEnd };
    })();

    UI.support.animation = (function() {

        var animationEnd = (function() {

            var element = document.body || document.documentElement,
                animEndEventNames = {
                    WebkitAnimation : 'webkitAnimationEnd',
                    MozAnimation    : 'animationend',
                    OAnimation      : 'oAnimationEnd oanimationend',
                    animation       : 'animationend'
                }, name;

            for (name in animEndEventNames) {
                if (element.style[name] !== undefined) return animEndEventNames[name];
            }
        }());

        return animationEnd && { end: animationEnd };
    })();

    // requestAnimationFrame polyfill
    //https://github.com/darius/requestAnimationFrame
    (function() {

        Date.now = Date.now || function() { return new Date().getTime(); };

        var vendors = ['webkit', 'moz'];
        for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
            var vp = vendors[i];
            window.requestAnimationFrame = window[vp+'RequestAnimationFrame'];
            window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame']
                                       || window[vp+'CancelRequestAnimationFrame']);
        }
        if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) // iOS6 is buggy
            || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
            var lastTime = 0;
            window.requestAnimationFrame = function(callback) {
                var now = Date.now();
                var nextTime = Math.max(lastTime + 16, now);
                return setTimeout(function() { callback(lastTime = nextTime); },
                                  nextTime - now);
            };
            window.cancelAnimationFrame = clearTimeout;
        }
    }());

    UI.support.touch = (
        ('ontouchstart' in document) ||
        (window.DocumentTouch && document instanceof window.DocumentTouch)  ||
        (window.navigator.msPointerEnabled && window.navigator.msMaxTouchPoints > 0) || //IE 10
        (window.navigator.pointerEnabled && window.navigator.maxTouchPoints > 0) || //IE >=11
        false
    );

    UI.support.mutationobserver = (window.MutationObserver || window.WebKitMutationObserver || null);

    UI.Utils = {};

    UI.Utils.isFullscreen = function() {
        return document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement || document.fullscreenElement || false;
    };

    UI.Utils.str2json = function(str, notevil) {
        try {
            if (notevil) {
                return JSON.parse(str
                    // wrap keys without quote with valid double quote
                    .replace(/([\$\w]+)\s*:/g, function(_, $1){return '"'+$1+'":';})
                    // replacing single quote wrapped ones to double quote
                    .replace(/'([^']+)'/g, function(_, $1){return '"'+$1+'"';})
                );
            } else {
                return (new Function('', 'var json = ' + str + '; return JSON.parse(JSON.stringify(json));'))();
            }
        } catch(e) { return false; }
    };

    UI.Utils.debounce = function(func, wait, immediate) {
        var timeout;
        return function() {
            var context = this, args = arguments;
            var later = function() {
                timeout = null;
                if (!immediate) func.apply(context, args);
            };
            var callNow = immediate && !timeout;
            clearTimeout(timeout);
            timeout = setTimeout(later, wait);
            if (callNow) func.apply(context, args);
        };
    };

    UI.Utils.throttle = function (func, limit) {
        var wait = false;
        return function () {
            if (!wait) {
                func.call();
                wait = true;
                setTimeout(function () {
                    wait = false;
                }, limit);
            }
        }
    };

    UI.Utils.removeCssRules = function(selectorRegEx) {
        var idx, idxs, stylesheet, _i, _j, _k, _len, _len1, _len2, _ref;

        if(!selectorRegEx) return;

        setTimeout(function(){
            try {
              _ref = document.styleSheets;
              for (_i = 0, _len = _ref.length; _i < _len; _i++) {
                stylesheet = _ref[_i];
                idxs = [];
                stylesheet.cssRules = stylesheet.cssRules;
                for (idx = _j = 0, _len1 = stylesheet.cssRules.length; _j < _len1; idx = ++_j) {
                  if (stylesheet.cssRules[idx].type === CSSRule.STYLE_RULE && selectorRegEx.test(stylesheet.cssRules[idx].selectorText)) {
                    idxs.unshift(idx);
                  }
                }
                for (_k = 0, _len2 = idxs.length; _k < _len2; _k++) {
                  stylesheet.deleteRule(idxs[_k]);
                }
              }
            } catch (_error) {}
        }, 0);
    };

    UI.Utils.isInView = function(element, options) {

        var $element = $(element);

        if (!$element.is(':visible')) {
            return false;
        }

        var window_left = UI.$win.scrollLeft(), window_top = UI.$win.scrollTop(), offset = $element.offset(), left = offset.left, top = offset.top;

        options = $.extend({topoffset:0, leftoffset:0}, options);

        if (top + $element.height() >= window_top && top - options.topoffset <= window_top + UI.$win.height() &&
            left + $element.width() >= window_left && left - options.leftoffset <= window_left + UI.$win.width()) {
          return true;
        } else {
          return false;
        }
    };

    UI.Utils.checkDisplay = function(context, initanimation) {

        var elements = UI.$('[data-uk-margin], [data-uk-grid-match], [data-uk-grid-margin], [data-uk-check-display]', context || document), animated;

        if (context && !elements.length) {
            elements = $(context);
        }

        elements.trigger('display.uk.check');

        // fix firefox / IE animations
        if (initanimation) {

            if (typeof(initanimation)!='string') {
                initanimation = '[class*="uk-animation-"]';
            }

            elements.find(initanimation).each(function(){

                var ele  = UI.$(this),
                    cls  = ele.attr('class'),
                    anim = cls.match(/uk-animation-(.+)/);

                ele.removeClass(anim[0]).width();

                ele.addClass(anim[0]);
            });
        }

        return elements;
    };

    UI.Utils.options = function(string) {

        if ($.type(string)!='string') return string;

        if (string.indexOf(':') != -1 && string.trim().substr(-1) != '}') {
            string = '{'+string+'}';
        }

        var start = (string ? string.indexOf("{") : -1), options = {};

        if (start != -1) {
            try {
                options = UI.Utils.str2json(string.substr(start));
            } catch (e) {}
        }

        return options;
    };

    UI.Utils.animate = function(element, cls) {

        var d = $.Deferred();

        element = UI.$(element);

        element.css('display', 'none').addClass(cls).one(UI.support.animation.end, function() {
            element.removeClass(cls);
            d.resolve();
        });

        element.css('display', '');

        return d.promise();
    };

    UI.Utils.uid = function(prefix) {
        return (prefix || 'id') + (new Date().getTime())+"RAND"+(Math.ceil(Math.random() * 100000));
    };

    UI.Utils.template = function(str, data) {

        var tokens = str.replace(/\n/g, '\\n').replace(/\{\{\{\s*(.+?)\s*\}\}\}/g, "{{!$1}}").split(/(\{\{\s*(.+?)\s*\}\})/g),
            i=0, toc, cmd, prop, val, fn, output = [], openblocks = 0;

        while(i < tokens.length) {

            toc = tokens[i];

            if(toc.match(/\{\{\s*(.+?)\s*\}\}/)) {
                i = i + 1;
                toc  = tokens[i];
                cmd  = toc[0];
                prop = toc.substring(toc.match(/^(\^|\#|\!|\~|\:)/) ? 1:0);

                switch(cmd) {
                    case '~':
                        output.push('for(var $i=0;$i<'+prop+'.length;$i++) { var $item = '+prop+'[$i];');
                        openblocks++;
                        break;
                    case ':':
                        output.push('for(var $key in '+prop+') { var $val = '+prop+'[$key];');
                        openblocks++;
                        break;
                    case '#':
                        output.push('if('+prop+') {');
                        openblocks++;
                        break;
                    case '^':
                        output.push('if(!'+prop+') {');
                        openblocks++;
                        break;
                    case '/':
                        output.push('}');
                        openblocks--;
                        break;
                    case '!':
                        output.push('__ret.push('+prop+');');
                        break;
                    default:
                        output.push('__ret.push(escape('+prop+'));');
                        break;
                }
            } else {
                output.push("__ret.push('"+toc.replace(/\'/g, "\\'")+"');");
            }
            i = i + 1;
        }

        fn  = new Function('$data', [
            'var __ret = [];',
            'try {',
            'with($data){', (!openblocks ? output.join('') : '__ret = ["Not all blocks are closed correctly."]'), '};',
            '}catch(e){__ret = [e.message];}',
            'return __ret.join("").replace(/\\n\\n/g, "\\n");',
            "function escape(html) { return String(html).replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');}"
        ].join("\n"));

        return data ? fn(data) : fn;
    };

    UI.Utils.focus = function(element, extra) {

        element = $(element);

        if (!element.length) {
            return element;
        }

        var autofocus = element.find('[autofocus]:first'), tabidx;

        if (autofocus.length) {
            return autofocus.focus();
        }

        autofocus = element.find(':input'+(extra && (','+extra) || '')).first();

        if (autofocus.length) {
            return autofocus.focus();
        }

        if (!element.attr('tabindex')) {
            tabidx = 1000;
            element.attr('tabindex', tabidx);
        }

        element[0].focus();

        if (tabidx) {
            element.attr('tabindex', '');
        }

        return element;
    }

    UI.Utils.events       = {};
    UI.Utils.events.click = UI.support.touch ? 'tap' : 'click';

    // deprecated

    UI.fn = function(command, options) {

        var args = arguments, cmd = command.match(/^([a-z\-]+)(?:\.([a-z]+))?/i), component = cmd[1], method = cmd[2];

        if (!UI[component]) {
            $.error('UIkit component [' + component + '] does not exist.');
            return this;
        }

        return this.each(function() {
            var $this = $(this), data = $this.data(component);
            if (!data) $this.data(component, (data = UI[component](this, method ? undefined : options)));
            if (method) data[method].apply(data, Array.prototype.slice.call(args, 1));
        });
    };

    $.UIkit          = UI;
    $.fn.uk          = UI.fn;

    UI.langdirection = UI.$html.attr("dir") == "rtl" ? "right" : "left";

    UI.components    = {};

    UI.component = function(name, def, override) {

        if (UI.components[name] && !override) {
            return UI.components[name];
        }

        var fn = function(element, options) {

            var $this = this;

            this.UIkit   = UI;
            this.element = element ? UI.$(element) : null;
            this.options = $.extend(true, {}, this.defaults, options);
            this.plugins = {};

            if (this.element) {
                this.element.data(name, this);
            }

            this.init();

            (this.options.plugins.length ? this.options.plugins : Object.keys(fn.plugins)).forEach(function(plugin) {

                if (fn.plugins[plugin].init) {
                    fn.plugins[plugin].init($this);
                    $this.plugins[plugin] = true;
                }

            });

            this.trigger('init.uk.component', [name, this]);

            return this;
        };

        fn.plugins = {};

        $.extend(true, fn.prototype, {

            defaults : {plugins: []},

            boot: function(){},
            init: function(){},

            on: function(a1,a2,a3){
                return UI.$(this.element || this).on(a1,a2,a3);
            },

            one: function(a1,a2,a3){
                return UI.$(this.element || this).one(a1,a2,a3);
            },

            off: function(evt){
                return UI.$(this.element || this).off(evt);
            },

            trigger: function(evt, params) {
                return UI.$(this.element || this).trigger(evt, params);
            },

            find: function(selector) {
                return UI.$(this.element ? this.element: []).find(selector);
            },

            proxy: function(obj, methods) {

                var $this = this;

                methods.split(' ').forEach(function(method) {
                    if (!$this[method]) $this[method] = function() { return obj[method].apply(obj, arguments); };
                });
            },

            mixin: function(obj, methods) {

                var $this = this;

                methods.split(' ').forEach(function(method) {
                    if (!$this[method]) $this[method] = obj[method].bind($this);
                });
            },

            option: function() {

                if (arguments.length == 1) {
                    return this.options[arguments[0]] || undefined;
                } else if (arguments.length == 2) {
                    this.options[arguments[0]] = arguments[1];
                }
            }

        }, def);

        this.components[name] = fn;

        this[name] = function() {

            var element, options;

            if (arguments.length) {

                switch(arguments.length) {
                    case 1:

                        if (typeof arguments[0] === 'string' || arguments[0].nodeType || arguments[0] instanceof jQuery) {
                            element = $(arguments[0]);
                        } else {
                            options = arguments[0];
                        }

                        break;
                    case 2:

                        element = $(arguments[0]);
                        options = arguments[1];
                        break;
                }
            }

            if (element && element.data(name)) {
                return element.data(name);
            }

            return (new UI.components[name](element, options));
        };

        if (UI.domready) {
            UI.component.boot(name);
        }

        return fn;
    };

    UI.plugin = function(component, name, def) {
        this.components[component].plugins[name] = def;
    };

    UI.component.boot = function(name) {

        if (UI.components[name].prototype && UI.components[name].prototype.boot && !UI.components[name].booted) {
            UI.components[name].prototype.boot.apply(UI, []);
            UI.components[name].booted = true;
        }
    };

    UI.component.bootComponents = function() {

        for (var component in UI.components) {
            UI.component.boot(component);
        }
    };


    // DOM mutation save ready helper function

    UI.domObservers = [];
    UI.domready     = false;

    UI.ready = function(fn) {

        UI.domObservers.push(fn);

        if (UI.domready) {
            fn(document);
        }
    };

    UI.on = function(a1,a2,a3){

        if (a1 && a1.indexOf('ready.uk.dom') > -1 && UI.domready) {
            a2.apply(UI.$doc);
        }

        return UI.$doc.on(a1,a2,a3);
    };

    UI.one = function(a1,a2,a3){

        if (a1 && a1.indexOf('ready.uk.dom') > -1 && UI.domready) {
            a2.apply(UI.$doc);
            return UI.$doc;
        }

        return UI.$doc.one(a1,a2,a3);
    };

    UI.trigger = function(evt, params) {
        return UI.$doc.trigger(evt, params);
    };

    UI.domObserve = function(selector, fn) {

        if(!UI.support.mutationobserver) return;

        fn = fn || function() {};

        UI.$(selector).each(function() {

            var element  = this,
                $element = UI.$(element);

            if ($element.data('observer')) {
                return;
            }

            try {

                var observer = new UI.support.mutationobserver(UI.Utils.debounce(function(mutations) {
                    fn.apply(element, [$element]);
                    $element.trigger('changed.uk.dom');
                }, 50), {childList: true, subtree: true});

                // pass in the target node, as well as the observer options
                observer.observe(element, { childList: true, subtree: true });

                $element.data('observer', observer);

            } catch(e) {}
        });
    };

    UI.init = function(root) {

        root = root || document;

        UI.domObservers.forEach(function(fn){
            fn(root);
        });
    };

    UI.on('domready.uk.dom', function(){

        UI.init();

        if (UI.domready) UI.Utils.checkDisplay();
    });

    document.addEventListener('DOMContentLoaded', function(){

        var domReady = function() {

            UI.$body = UI.$('body');

            UI.trigger('beforeready.uk.dom');

            UI.component.bootComponents();

            // custom scroll observer
            var rafToken = requestAnimationFrame((function(){

                var memory = {dir: {x:0, y:0}, x: window.pageXOffset, y:window.pageYOffset};

                var fn = function(){
                    // reading this (window.page[X|Y]Offset) causes a full page recalc of the layout in Chrome,
                    // so we only want to do this once
                    var wpxo = window.pageXOffset;
                    var wpyo = window.pageYOffset;

                    // Did the scroll position change since the last time we were here?
                    if (memory.x != wpxo || memory.y != wpyo) {

                        // Set the direction of the scroll and store the new position
                        if (wpxo != memory.x) {memory.dir.x = wpxo > memory.x ? 1:-1; } else { memory.dir.x = 0; }
                        if (wpyo != memory.y) {memory.dir.y = wpyo > memory.y ? 1:-1; } else { memory.dir.y = 0; }

                        memory.x = wpxo;
                        memory.y = wpyo;

                        // Trigger the scroll event, this could probably be sent using memory.clone() but this is
                        // more explicit and easier to see exactly what is being sent in the event.
                        UI.$doc.trigger('scrolling.uk.document', [{
                            dir: {x: memory.dir.x, y: memory.dir.y}, x: wpxo, y: wpyo
                        }]);
                    }

                    cancelAnimationFrame(rafToken);
                    rafToken = requestAnimationFrame(fn);
                };

                if (UI.support.touch) {
                    UI.$html.on('touchmove touchend MSPointerMove MSPointerUp pointermove pointerup', fn);
                }

                if (memory.x || memory.y) fn();

                return fn;

            })());

            // run component init functions on dom
            UI.trigger('domready.uk.dom');

            if (UI.support.touch) {

                // remove css hover rules for touch devices
                // UI.Utils.removeCssRules(/\.uk-(?!navbar).*:hover/);

                // viewport unit fix for uk-height-viewport - should be fixed in iOS 8
                if (navigator.userAgent.match(/(iPad|iPhone|iPod)/g)) {

                    UI.$win.on('load orientationchange resize', UI.Utils.debounce((function(){

                        var fn = function() {
                            $('.uk-height-viewport').css('height', window.innerHeight);
                            return fn;
                        };

                        return fn();

                    })(), 100));
                }
            }

            UI.trigger('afterready.uk.dom');

            // mark that domready is left behind
            UI.domready = true;

            // auto init js components
            if (UI.support.mutationobserver) {

                var initFn = UI.Utils.debounce(function(){
                    requestAnimationFrame(function(){ UI.init(document.body);});
                }, 10);

                (new UI.support.mutationobserver(function(mutations) {

                    var init = false;

                    mutations.every(function(mutation){

                        if (mutation.type != 'childList') return true;

                        for (var i = 0, node; i < mutation.addedNodes.length; ++i) {

                            node = mutation.addedNodes[i];

                            if (node.outerHTML && node.outerHTML.indexOf('data-uk-') !== -1) {
                                return (init = true) && false;
                            }
                        }
                        return true;
                    });

                    if (init) initFn();

                })).observe(document.body, {childList: true, subtree: true});
            }
        };

        if (document.readyState == 'complete' || document.readyState == 'interactive') {
            setTimeout(domReady);
        }

        return domReady;

    }());

    // add touch identifier class
    UI.$html.addClass(UI.support.touch ? 'uk-touch' : 'uk-notouch');

    // add uk-hover class on tap to support overlays on touch devices
    if (UI.support.touch) {

        var hoverset = false,
            exclude,
            hovercls = 'uk-hover',
            selector = '.uk-overlay, .uk-overlay-hover, .uk-overlay-toggle, .uk-animation-hover, .uk-has-hover';

        UI.$html.on('mouseenter touchstart MSPointerDown pointerdown', selector, function() {

            if (hoverset) $('.'+hovercls).removeClass(hovercls);

            hoverset = $(this).addClass(hovercls);

        }).on('mouseleave touchend MSPointerUp pointerup', function(e) {

            exclude = $(e.target).parents(selector);

            if (hoverset) {
                hoverset.not(exclude).removeClass(hovercls);
            }
        });
    }

    return UI;
});

//  Based on Zeptos touch.js
//  https://raw.github.com/madrobby/zepto/master/src/touch.js
//  Zepto.js may be freely distributed under the MIT license.

;(function($){

  if ($.fn.swipeLeft) {
    return;
  }


  var touch = {}, touchTimeout, tapTimeout, swipeTimeout, longTapTimeout, longTapDelay = 750, gesture;
  var hasTouchEvents = 'ontouchstart' in window,
      hasPointerEvents = window.PointerEvent,
      hasTouch = hasTouchEvents
      || window.DocumentTouch && document instanceof DocumentTouch
      || navigator.msPointerEnabled && navigator.msMaxTouchPoints > 0 // IE 10
      || navigator.pointerEnabled && navigator.maxTouchPoints > 0; // IE >=11

  function swipeDirection(x1, x2, y1, y2) {
    return Math.abs(x1 - x2) >= Math.abs(y1 - y2) ? (x1 - x2 > 0 ? 'Left' : 'Right') : (y1 - y2 > 0 ? 'Up' : 'Down');
  }

  function longTap() {
    longTapTimeout = null;
    if (touch.last) {
      if ( touch.el !== undefined ) touch.el.trigger('longTap');
      touch = {};
    }
  }

  function cancelLongTap() {
    if (longTapTimeout) clearTimeout(longTapTimeout);
    longTapTimeout = null;
  }

  function cancelAll() {
    if (touchTimeout)   clearTimeout(touchTimeout);
    if (tapTimeout)     clearTimeout(tapTimeout);
    if (swipeTimeout)   clearTimeout(swipeTimeout);
    if (longTapTimeout) clearTimeout(longTapTimeout);
    touchTimeout = tapTimeout = swipeTimeout = longTapTimeout = null;
    touch = {};
  }

  function isPrimaryTouch(event){
    return event.pointerType == event.MSPOINTER_TYPE_TOUCH && event.isPrimary;
  }

  $(function(){
    var now, delta, deltaX = 0, deltaY = 0, firstTouch;

    if ('MSGesture' in window) {
      gesture = new MSGesture();
      gesture.target = document.body;
    }

    $(document)
      .on('MSGestureEnd gestureend', function(e){

        var swipeDirectionFromVelocity = e.originalEvent.velocityX > 1 ? 'Right' : e.originalEvent.velocityX < -1 ? 'Left' : e.originalEvent.velocityY > 1 ? 'Down' : e.originalEvent.velocityY < -1 ? 'Up' : null;

        if (swipeDirectionFromVelocity && touch.el !== undefined) {
          touch.el.trigger('swipe');
          touch.el.trigger('swipe'+ swipeDirectionFromVelocity);
        }
      })
      // MSPointerDown: for IE10
      // pointerdown: for IE11
      .on('touchstart MSPointerDown pointerdown', function(e){

        if(e.type == 'MSPointerDown' && !isPrimaryTouch(e.originalEvent)) return;

        firstTouch = (e.type == 'MSPointerDown' || e.type == 'pointerdown') ? e : e.originalEvent.touches[0];

        now      = Date.now();
        delta    = now - (touch.last || now);
        touch.el = $('tagName' in firstTouch.target ? firstTouch.target : firstTouch.target.parentNode);

        if(touchTimeout) clearTimeout(touchTimeout);

        touch.x1 = firstTouch.pageX;
        touch.y1 = firstTouch.pageY;

        if (delta > 0 && delta <= 250) touch.isDoubleTap = true;

        touch.last = now;
        longTapTimeout = setTimeout(longTap, longTapDelay);

        // adds the current touch contact for IE gesture recognition
        if (e.originalEvent && e.originalEvent.pointerId && gesture && ( e.type == 'MSPointerDown' || e.type == 'pointerdown' || e.type == 'touchstart' ) ) {
          gesture.addPointer(e.originalEvent.pointerId);
        }

      })
      // MSPointerMove: for IE10
      // pointermove: for IE11
      .on('touchmove MSPointerMove pointermove', function(e){

        if (e.type == 'MSPointerMove' && !isPrimaryTouch(e.originalEvent)) return;

        firstTouch = (e.type == 'MSPointerMove' || e.type == 'pointermove') ? e : e.originalEvent.touches[0];

        cancelLongTap();
        touch.x2 = firstTouch.pageX;
        touch.y2 = firstTouch.pageY;

        deltaX += Math.abs(touch.x1 - touch.x2);
        deltaY += Math.abs(touch.y1 - touch.y2);
      })
      // MSPointerUp: for IE10
      // pointerup: for IE11
      .on('touchend MSPointerUp pointerup', function(e){

        if (e.type == 'MSPointerUp' && !isPrimaryTouch(e.originalEvent)) return;

        cancelLongTap();

        // swipe
        if ((touch.x2 && Math.abs(touch.x1 - touch.x2) > 30) || (touch.y2 && Math.abs(touch.y1 - touch.y2) > 30)){

          swipeTimeout = setTimeout(function() {
            if ( touch.el !== undefined ) {
              touch.el.trigger('swipe');
              touch.el.trigger('swipe' + (swipeDirection(touch.x1, touch.x2, touch.y1, touch.y2)));
            }
            touch = {};
          }, 0);

        // normal tap
        } else if ('last' in touch) {

          // don't fire tap when delta position changed by more than 30 pixels,
          // for instance when moving to a point and back to origin
          if (isNaN(deltaX) || (deltaX < 30 && deltaY < 30)) {
            // delay by one tick so we can cancel the 'tap' event if 'scroll' fires
            // ('tap' fires before 'scroll')
            tapTimeout = setTimeout(function() {

              // trigger universal 'tap' with the option to cancelTouch()
              // (cancelTouch cancels processing of single vs double taps for faster 'tap' response)
              var event = $.Event('tap');
              event.cancelTouch = cancelAll;
              if ( touch.el !== undefined ) touch.el.trigger(event);

              // trigger double tap immediately
              if (touch.isDoubleTap) {
                if ( touch.el !== undefined ) touch.el.trigger('doubleTap');
                touch = {};
              }

              // trigger single tap after 250ms of inactivity
              else {
                touchTimeout = setTimeout(function(){
                  touchTimeout = null;
                  if ( touch.el !== undefined ) touch.el.trigger('singleTap');
                  touch = {};
                }, 250);
              }
            }, 0);
          } else {
            touch = {};
          }
          deltaX = deltaY = 0;
        }
      })
      // when the browser window loses focus,
      // for example when a modal dialog is shown,
      // cancel all ongoing events
      .on('touchcancel MSPointerCancel pointercancel', function(e){

        // Ignore pointercancel if the event supports touch events, to prevent pointercancel in swipe gesture
        if ((e.type == 'touchcancel' && hasTouchEvents && hasTouch) || (!hasTouchEvents && e.type == 'pointercancel' && hasPointerEvents)) {
          cancelAll();
        }

    });

    // scrolling the window indicates intention of the user
    // to scroll, not tap or swipe, so cancel all ongoing events
    $(window).on('scroll', cancelAll);
  });

  ['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'doubleTap', 'tap', 'singleTap', 'longTap'].forEach(function(eventName){
    $.fn[eventName] = function(callback){ return $(this).on(eventName, callback); };
  });
})(jQuery);

(function(UI) {

    "use strict";

    var stacks = [];

    UI.component('stackMargin', {

        defaults: {
            cls: 'uk-margin-small-top',
            rowfirst: false,
            observe: false
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-margin]', context).each(function() {

                    var ele = UI.$(this);

                    if (!ele.data('stackMargin')) {
                        UI.stackMargin(ele, UI.Utils.options(ele.attr('data-uk-margin')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            UI.$win.on('resize orientationchange', (function() {

                var fn = function() {
                    $this.process();
                };

                UI.$(function() {
                    fn();
                    UI.$win.on('load', fn);
                });

                return UI.Utils.debounce(fn, 20);
            })());

            this.on('display.uk.check', function(e) {
                if (this.element.is(':visible')) this.process();
            }.bind(this));

            if (this.options.observe) {

                UI.domObserve(this.element, function(e) {
                    if ($this.element.is(':visible')) $this.process();
                });
            }

            stacks.push(this);
        },

        process: function() {

            var $this = this, columns = this.element.children();

            UI.Utils.stackMargin(columns, this.options);

            if (!this.options.rowfirst || !columns.length) {
                return this;
            }

            // Mark first column elements
            var group = {}, minleft = false;

            columns.removeClass(this.options.rowfirst).each(function(offset, $ele){

                $ele = UI.$(this);

                if (this.style.display != 'none') {
                    offset = $ele.offset().left;
                    ((group[offset] = group[offset] || []) && group[offset]).push(this);
                    minleft = minleft === false ? offset : Math.min(minleft, offset);
                }
            });

            UI.$(group[minleft]).addClass(this.options.rowfirst);

            return this;
        }

    });


    // responsive element e.g. iframes

    (function(){

        var elements = [], check = function(ele) {

            if (!ele.is(':visible')) return;

            var width  = ele.parent().width(),
                iwidth = ele.data('width'),
                ratio  = (width / iwidth),
                height = Math.floor(ratio * ele.data('height'));

            ele.css({height: (width < iwidth) ? height : ele.data('height')});
        };

        UI.component('responsiveElement', {

            defaults: {},

            boot: function() {

                // init code
                UI.ready(function(context) {

                    UI.$('iframe.uk-responsive-width, [data-uk-responsive]', context).each(function() {

                        var ele = UI.$(this), obj;

                        if (!ele.data('responsiveElement')) {
                            obj = UI.responsiveElement(ele, {});
                        }
                    });
                });
            },

            init: function() {

                var ele = this.element;

                if (ele.attr('width') && ele.attr('height')) {

                    ele.data({
                        width : ele.attr('width'),
                        height: ele.attr('height')
                    }).on('display.uk.check', function(){
                        check(ele);
                    });

                    check(ele);

                    elements.push(ele);
                }
            }
        });

        UI.$win.on('resize load', UI.Utils.debounce(function(){

            elements.forEach(function(ele){
                check(ele);
            });

        }, 15));

    })();


    // helper

    UI.Utils.stackMargin = function(elements, options) {

        options = UI.$.extend({
            cls: 'uk-margin-small-top'
        }, options);

        elements = UI.$(elements).removeClass(options.cls);

        var min = false;

        elements.each(function(offset, height, pos, $ele){

            $ele   = UI.$(this);

            if ($ele.css('display') != 'none') {

                offset = $ele.offset();
                height = $ele.outerHeight();
                pos    = offset.top + height;

                $ele.data({
                    ukMarginPos: pos,
                    ukMarginTop: offset.top
                });

                if (min === false || (offset.top < min.top) ) {

                    min = {
                        top  : offset.top,
                        left : offset.left,
                        pos  : pos
                    };
                }
            }

        }).each(function($ele) {

            $ele   = UI.$(this);

            if ($ele.css('display') != 'none' && $ele.data('ukMarginTop') > min.top && $ele.data('ukMarginPos') > min.pos) {
                $ele.addClass(options.cls);
            }
        });
    };

    UI.Utils.matchHeights = function(elements, options) {

        elements = UI.$(elements).css('min-height', '');
        options  = UI.$.extend({ row : true }, options);

        var matchHeights = function(group){

            if (group.length < 2) return;

            var max = 0;

            group.each(function() {
                max = Math.max(max, UI.$(this).outerHeight());
            }).each(function() {

                var element = UI.$(this),
                    height  = max - (element.css('box-sizing') == 'border-box' ? 0 : (element.outerHeight() - element.height()));

                element.css('min-height', height + 'px');
            });
        };

        if (options.row) {

            elements.first().width(); // force redraw

            setTimeout(function(){

                var lastoffset = false, group = [];

                elements.each(function() {

                    var ele = UI.$(this), offset = ele.offset().top;

                    if (offset != lastoffset && group.length) {

                        matchHeights(UI.$(group));
                        group  = [];
                        offset = ele.offset().top;
                    }

                    group.push(ele);
                    lastoffset = offset;
                });

                if (group.length) {
                    matchHeights(UI.$(group));
                }

            }, 0);

        } else {
            matchHeights(elements);
        }
    };

    (function(cacheSvgs){

        UI.Utils.inlineSvg = function(selector, root) {

            var images = UI.$(selector || 'img[src$=".svg"]', root || document).each(function(){

                var img = UI.$(this),
                    src = img.attr('src');

                if (!cacheSvgs[src]) {

                    var d = UI.$.Deferred();

                    UI.$.get(src, {nc: Math.random()}, function(data){
                        d.resolve(UI.$(data).find('svg'));
                    });

                    cacheSvgs[src] = d.promise();
                }

                cacheSvgs[src].then(function(svg) {

                    var $svg = UI.$(svg).clone();

                    if (img.attr('id')) $svg.attr('id', img.attr('id'));
                    if (img.attr('class')) $svg.attr('class', img.attr('class'));
                    if (img.attr('style')) $svg.attr('style', img.attr('style'));

                    if (img.attr('width')) {
                        $svg.attr('width', img.attr('width'));
                        if (!img.attr('height'))  $svg.removeAttr('height');
                    }

                    if (img.attr('height')){
                        $svg.attr('height', img.attr('height'));
                        if (!img.attr('width')) $svg.removeAttr('width');
                    }

                    img.replaceWith($svg);
                });
            });
        };

        // init code
        UI.ready(function(context) {
            UI.Utils.inlineSvg('[data-uk-svg]', context);
        });

    })({});

    UI.Utils.getCssVar = function(name) {

        /* usage in css:  .var-name:before { content:"xyz" } */

        var val, doc = document.documentElement, element = doc.appendChild(document.createElement('div'));

        element.classList.add('var-'+name);

        try {
            val = JSON.parse(val = getComputedStyle(element, ':before').content.replace(/^["'](.*)["']$/, '$1'));
        } catch (e) {
            val = undefined;
        }

        doc.removeChild(element);

        return val;
    }

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('smoothScroll', {

        boot: function() {

            // init code
            UI.$html.on('click.smooth-scroll.uikit', '[data-uk-smooth-scroll]', function(e) {
                var ele = UI.$(this);

                if (!ele.data('smoothScroll')) {
                    var obj = UI.smoothScroll(ele, UI.Utils.options(ele.attr('data-uk-smooth-scroll')));
                    ele.trigger('click');
                }

                return false;
            });
        },

        init: function() {

            var $this = this;

            this.on('click', function(e) {
                e.preventDefault();
                scrollToElement(UI.$(this.hash).length ? UI.$(this.hash) : UI.$('body'), $this.options);
            });
        }
    });

    function scrollToElement(ele, options) {

        options = UI.$.extend({
            duration: 1000,
            transition: 'easeOutExpo',
            offset: 0,
            complete: function(){}
        }, options);

        // get / set parameters
        var target    = ele.offset().top - options.offset,
            docheight = UI.$doc.height(),
            winheight = window.innerHeight;

        if ((target + winheight) > docheight) {
            target = docheight - winheight;
        }

        // animate to target, fire callback when done
        UI.$('html,body').stop().animate({scrollTop: target}, options.duration, options.transition).promise().done(options.complete);
    }

    UI.Utils.scrollToElement = scrollToElement;

    if (!UI.$.easing.easeOutExpo) {
        UI.$.easing.easeOutExpo = function(x, t, b, c, d) { return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; };
    }

})(UIkit2);

(function(UI) {

    "use strict";

    var $win           = UI.$win,
        $doc           = UI.$doc,
        scrollspies    = [],
        checkScrollSpy = function() {
            for(var i=0; i < scrollspies.length; i++) {
                window.requestAnimationFrame.apply(window, [scrollspies[i].check]);
            }
        };

    UI.component('scrollspy', {

        defaults: {
            target     : false,
            cls        : 'uk-scrollspy-inview',
            initcls    : 'uk-scrollspy-init-inview',
            topoffset  : 0,
            leftoffset : 0,
            repeat     : false,
            delay      : 0
        },

        boot: function() {

            // listen to scroll and resize
            $doc.on('scrolling.uk.document', checkScrollSpy);
            $win.on('load resize orientationchange', UI.Utils.debounce(checkScrollSpy, 50));

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-scrollspy]', context).each(function() {

                    var element = UI.$(this);

                    if (!element.data('scrollspy')) {
                        var obj = UI.scrollspy(element, UI.Utils.options(element.attr('data-uk-scrollspy')));
                    }
                });
            });
        },

        init: function() {

            var $this = this, inviewstate, initinview, togglecls = this.options.cls.split(/,/), fn = function(){

                var elements     = $this.options.target ? $this.element.find($this.options.target) : $this.element,
                    delayIdx     = elements.length === 1 ? 1 : 0,
                    toggleclsIdx = 0;

                elements.each(function(idx){

                    var element     = UI.$(this),
                        inviewstate = element.data('inviewstate'),
                        inview      = UI.Utils.isInView(element, $this.options),
                        toggle      = element.attr('data-uk-scrollspy-cls') || togglecls[toggleclsIdx].trim();

                    if (inview && !inviewstate && !element.data('scrollspy-idle')) {

                        if (!initinview) {
                            element.addClass($this.options.initcls);
                            $this.offset = element.offset();
                            initinview = true;

                            element.trigger('init.uk.scrollspy');
                        }

                        element.data('scrollspy-idle', setTimeout(function(){

                            element.addClass('uk-scrollspy-inview').toggleClass(toggle).width();
                            element.trigger('inview.uk.scrollspy');

                            element.data('scrollspy-idle', false);
                            element.data('inviewstate', true);

                        }, $this.options.delay * delayIdx));

                        delayIdx++;
                    }

                    if (!inview && inviewstate && $this.options.repeat) {

                        if (element.data('scrollspy-idle')) {
                            clearTimeout(element.data('scrollspy-idle'));
                            element.data('scrollspy-idle', false);
                        }

                        element.removeClass('uk-scrollspy-inview').toggleClass(toggle);
                        element.data('inviewstate', false);

                        element.trigger('outview.uk.scrollspy');
                    }

                    toggleclsIdx = togglecls[toggleclsIdx + 1] ? (toggleclsIdx + 1) : 0;

                });
            };

            fn();

            this.check = fn;

            scrollspies.push(this);
        }
    });


    var scrollspynavs = [],
        checkScrollSpyNavs = function() {
            for(var i=0; i < scrollspynavs.length; i++) {
                window.requestAnimationFrame.apply(window, [scrollspynavs[i].check]);
            }
        };

    UI.component('scrollspynav', {

        defaults: {
            cls          : 'uk-active',
            closest      : false,
            topoffset    : 0,
            leftoffset   : 0,
            smoothscroll : false
        },

        boot: function() {

            // listen to scroll and resize
            $doc.on('scrolling.uk.document', checkScrollSpyNavs);
            $win.on('resize orientationchange', UI.Utils.debounce(checkScrollSpyNavs, 50));

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-scrollspy-nav]', context).each(function() {

                    var element = UI.$(this);

                    if (!element.data('scrollspynav')) {
                        var obj = UI.scrollspynav(element, UI.Utils.options(element.attr('data-uk-scrollspy-nav')));
                    }
                });
            });
        },

        init: function() {

            var ids     = [],
                links   = this.find("a[href^='#']").each(function(){ if(this.getAttribute('href').trim()!=='#') ids.push(this.getAttribute('href')); }),
                targets = UI.$(ids.join(",")),

                clsActive  = this.options.cls,
                clsClosest = this.options.closest || this.options.closest;

            var $this = this, inviews, fn = function(){

                inviews = [];

                for (var i=0 ; i < targets.length ; i++) {
                    if (UI.Utils.isInView(targets.eq(i), $this.options)) {
                        inviews.push(targets.eq(i));
                    }
                }

                if (inviews.length) {

                    var navitems,
                        scrollTop = $win.scrollTop(),
                        target = (function(){
                            for(var i=0; i< inviews.length;i++){
                                if (inviews[i].offset().top - $this.options.topoffset >= scrollTop){
                                    return inviews[i];
                                }
                            }
                        })();

                    if (!target) return;

                    if ($this.options.closest) {
                        links.blur().closest(clsClosest).removeClass(clsActive);
                        navitems = links.filter("a[href='#"+target.attr('id')+"']").closest(clsClosest).addClass(clsActive);
                    } else {
                        navitems = links.removeClass(clsActive).filter("a[href='#"+target.attr("id")+"']").addClass(clsActive);
                    }

                    $this.element.trigger('inview.uk.scrollspynav', [target, navitems]);
                }
            };

            if (this.options.smoothscroll && UI.smoothScroll) {
                links.each(function(){
                    UI.smoothScroll(this, $this.options.smoothscroll);
                });
            }

            fn();

            this.element.data('scrollspynav', this);

            this.check = fn;
            scrollspynavs.push(this);

        }
    });

})(UIkit2);

(function(UI){

    "use strict";

    var toggles = [];

    UI.component('toggle', {

        defaults: {
            target    : false,
            cls       : 'uk-hidden',
            animation : false,
            duration  : 200
        },

        boot: function(){

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-toggle]', context).each(function() {
                    var ele = UI.$(this);

                    if (!ele.data('toggle')) {
                        var obj = UI.toggle(ele, UI.Utils.options(ele.attr('data-uk-toggle')));
                    }
                });

                setTimeout(function(){

                    toggles.forEach(function(toggle){
                        toggle.getToggles();
                    });

                }, 0);
            });
        },

        init: function() {

            var $this = this;

            this.aria = (this.options.cls.indexOf('uk-hidden') !== -1);

            this.on('click', function(e) {

                if ($this.element.is('a[href="#"]')) {
                    e.preventDefault();
                }

                $this.toggle();
            });

            toggles.push(this);
        },

        toggle: function() {

            this.getToggles();

            if(!this.totoggle.length) return;

            if (this.options.animation && UI.support.animation) {

                var $this = this, animations = this.options.animation.split(',');

                if (animations.length == 1) {
                    animations[1] = animations[0];
                }

                animations[0] = animations[0].trim();
                animations[1] = animations[1].trim();

                this.totoggle.css('animation-duration', this.options.duration+'ms');

                this.totoggle.each(function(){

                    var ele = UI.$(this);

                    if (ele.hasClass($this.options.cls)) {

                        ele.toggleClass($this.options.cls);

                        UI.Utils.animate(ele, animations[0]).then(function(){
                            ele.css('animation-duration', '');
                            UI.Utils.checkDisplay(ele);
                        });

                    } else {

                        UI.Utils.animate(this, animations[1]+' uk-animation-reverse').then(function(){
                            ele.toggleClass($this.options.cls).css('animation-duration', '');
                            UI.Utils.checkDisplay(ele);
                        });

                    }

                });

            } else {
                this.totoggle.toggleClass(this.options.cls);
                UI.Utils.checkDisplay(this.totoggle);
            }

            this.updateAria();

        },

        getToggles: function() {
            this.totoggle = this.options.target ? UI.$(this.options.target):[];
            this.updateAria();
        },

        updateAria: function() {
            if (this.aria && this.totoggle.length) {
                this.totoggle.not('[aria-hidden]').each(function(){
                    UI.$(this).attr('aria-hidden', UI.$(this).hasClass('uk-hidden'));
                });
            }
        }
    });

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('alert', {

        defaults: {
            fade: true,
            duration: 200,
            trigger: '.uk-alert-close'
        },

        boot: function() {

            // init code
            UI.$html.on('click.alert.uikit', '[data-uk-alert]', function(e) {

                var ele = UI.$(this);

                if (!ele.data('alert')) {

                    var alert = UI.alert(ele, UI.Utils.options(ele.attr('data-uk-alert')));

                    if (UI.$(e.target).is(alert.options.trigger)) {
                        e.preventDefault();
                        alert.close();
                    }
                }
            });
        },

        init: function() {

            var $this = this;

            this.on('click', this.options.trigger, function(e) {
                e.preventDefault();
                $this.close();
            });
        },

        close: function() {

            var element       = this.trigger('close.uk.alert'),
                removeElement = function () {
                    this.trigger('closed.uk.alert').remove();
                }.bind(this);

            if (this.options.fade) {
                element.css('overflow', 'hidden').css("max-height", element.height()).animate({
                    height         : 0,
                    opacity        : 0,
                    paddingTop    : 0,
                    paddingBottom : 0,
                    marginTop     : 0,
                    marginBottom  : 0
                }, this.options.duration, removeElement);
            } else {
                removeElement();
            }
        }

    });

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('buttonRadio', {

        defaults: {
            activeClass: 'uk-active',
            target: '.uk-button'
        },

        boot: function() {

            // init code
            UI.$html.on('click.buttonradio.uikit', '[data-uk-button-radio]', function(e) {

                var ele = UI.$(this);

                if (!ele.data('buttonRadio')) {

                    var obj    = UI.buttonRadio(ele, UI.Utils.options(ele.attr('data-uk-button-radio'))),
                        target = UI.$(e.target);

                    if (target.is(obj.options.target)) {
                        target.trigger('click');
                    }
                }
            });
        },

        init: function() {

            var $this = this;

            // Init ARIA
            this.find($this.options.target).attr('aria-checked', 'false').filter('.' + $this.options.activeClass).attr('aria-checked', 'true');

            this.on('click', this.options.target, function(e) {

                var ele = UI.$(this);

                if (ele.is('a[href="#"]')) e.preventDefault();

                $this.find($this.options.target).not(ele).removeClass($this.options.activeClass).blur();
                ele.addClass($this.options.activeClass);

                // Update ARIA
                $this.find($this.options.target).not(ele).attr('aria-checked', 'false');
                ele.attr('aria-checked', 'true');

                $this.trigger('change.uk.button', [ele]);
            });

        },

        getSelected: function() {
            return this.find('.' + this.options.activeClass);
        }
    });

    UI.component('buttonCheckbox', {

        defaults: {
            activeClass: 'uk-active',
            target: '.uk-button'
        },

        boot: function() {

            UI.$html.on('click.buttoncheckbox.uikit', '[data-uk-button-checkbox]', function(e) {
                var ele = UI.$(this);

                if (!ele.data('buttonCheckbox')) {

                    var obj    = UI.buttonCheckbox(ele, UI.Utils.options(ele.attr('data-uk-button-checkbox'))),
                        target = UI.$(e.target);

                    if (target.is(obj.options.target)) {
                        target.trigger('click');
                    }
                }
            });
        },

        init: function() {

            var $this = this;

            // Init ARIA
            this.find($this.options.target).attr('aria-checked', 'false').filter('.' + $this.options.activeClass).attr('aria-checked', 'true');

            this.on('click', this.options.target, function(e) {
                var ele = UI.$(this);

                if (ele.is('a[href="#"]')) e.preventDefault();

                ele.toggleClass($this.options.activeClass).blur();

                // Update ARIA
                ele.attr('aria-checked', ele.hasClass($this.options.activeClass));

                $this.trigger('change.uk.button', [ele]);
            });

        },

        getSelected: function() {
            return this.find('.' + this.options.activeClass);
        }
    });


    UI.component('button', {

        defaults: {},

        boot: function() {

            UI.$html.on('click.button.uikit', '[data-uk-button]', function(e) {
                var ele = UI.$(this);

                if (!ele.data('button')) {

                    var obj = UI.button(ele, UI.Utils.options(ele.attr('data-uk-button')));
                    ele.trigger('click');
                }
            });
        },

        init: function() {

            var $this = this;

            // Init ARIA
            this.element.attr('aria-pressed', this.element.hasClass("uk-active"));

            this.on('click', function(e) {

                if ($this.element.is('a[href="#"]')) e.preventDefault();

                $this.toggle();
                $this.trigger('change.uk.button', [$this.element.blur().hasClass('uk-active')]);
            });

        },

        toggle: function() {
            this.element.toggleClass('uk-active');

            // Update ARIA
            this.element.attr('aria-pressed', this.element.hasClass('uk-active'));
        }
    });

})(UIkit2);

(function(UI) {

    "use strict";

    var active = false, hoverIdle, flips = {
        x: {
            'bottom-left'   : 'bottom-right',
            'bottom-right'  : 'bottom-left',
            'bottom-center' : 'bottom-center',
            'top-left'      : 'top-right',
            'top-right'     : 'top-left',
            'top-center'    : 'top-center',
            'left-top'      : 'right-top',
            'left-bottom'   : 'right-bottom',
            'left-center'   : 'right-center',
            'right-top'     : 'left-top',
            'right-bottom'  : 'left-bottom',
            'right-center'  : 'left-center'
        },
        y: {
            'bottom-left'   : 'top-left',
            'bottom-right'  : 'top-right',
            'bottom-center' : 'top-center',
            'top-left'      : 'bottom-left',
            'top-right'     : 'bottom-right',
            'top-center'    : 'bottom-center',
            'left-top'      : 'left-bottom',
            'left-bottom'   : 'left-top',
            'left-center'   : 'left-center',
            'right-top'     : 'right-bottom',
            'right-bottom'  : 'right-top',
            'right-center'  : 'right-center'
        },
        xy: {
            'bottom-left'   : 'top-right',
            'bottom-right'  : 'top-left',
            'bottom-center' : 'top-center',
            'top-left'      : 'bottom-right',
            'top-right'     : 'bottom-left',
            'top-center'    : 'bottom-center',
            'left-top'      : 'right-bottom',
            'left-bottom'   : 'right-top',
            'left-center'   : 'right-center',
            'right-top'     : 'left-bottom',
            'right-bottom'  : 'left-top',
            'right-center'  : 'left-center'
        }
    };

    UI.component('dropdown', {

        defaults: {
           mode            : 'hover',
           pos             : 'bottom-left',
           offset          : 0,
           remaintime      : 800,
           justify         : false,
           boundary        : UI.$win,
           delay           : 0,
           dropdownSelector: '.uk-dropdown,.uk-dropdown-blank',
           hoverDelayIdle  : 250,
           preventflip     : false
        },

        remainIdle: false,

        boot: function() {

            var triggerevent = UI.support.touch ? 'click' : 'mouseenter';

            // init code
            UI.$html.on(triggerevent+'.dropdown.uikit focus pointerdown', '[data-uk-dropdown]', function(e) {

                var ele = UI.$(this);

                if (!ele.data('dropdown')) {

                    var dropdown = UI.dropdown(ele, UI.Utils.options(ele.attr('data-uk-dropdown')));

                    if (e.type=='click' || (e.type=='mouseenter' && dropdown.options.mode=='hover')) {
                        dropdown.element.trigger(triggerevent);
                    }

                    if (dropdown.dropdown.length) {
                        e.preventDefault();
                    }
                }
            });
        },

        init: function() {

            var $this = this;

            this.dropdown     = this.find(this.options.dropdownSelector);
            this.offsetParent = this.dropdown.parents().filter(function() {
                return UI.$.inArray(UI.$(this).css('position'), ['relative', 'fixed', 'absolute']) !== -1;
            }).slice(0,1);

            if (!this.offsetParent.length) {
                this.offsetParent = this.element;
            }

            this.centered  = this.dropdown.hasClass('uk-dropdown-center');
            this.justified = this.options.justify ? UI.$(this.options.justify) : false;

            this.boundary  = UI.$(this.options.boundary);

            if (!this.boundary.length) {
                this.boundary = UI.$win;
            }

            // legacy DEPRECATED!
            if (this.dropdown.hasClass('uk-dropdown-up')) {
                this.options.pos = 'top-left';
            }
            if (this.dropdown.hasClass('uk-dropdown-flip')) {
                this.options.pos = this.options.pos.replace('left','right');
            }
            if (this.dropdown.hasClass('uk-dropdown-center')) {
                this.options.pos = this.options.pos.replace(/(left|right)/,'center');
            }
            //-- end legacy

            // Init ARIA
            this.element.attr('aria-haspopup', 'true');
            this.element.attr('aria-expanded', this.element.hasClass('uk-open'));
            this.dropdown.attr('aria-hidden', 'true');

            if (this.options.mode == 'click' || UI.support.touch) {

                this.on('click.uk.dropdown', function(e) {

                    var $target = UI.$(e.target);

                    if (!$target.parents($this.options.dropdownSelector).length) {

                        if ($target.is("a[href='#']") || $target.parent().is("a[href='#']") || ($this.dropdown.length && !$this.dropdown.is(':visible')) ){
                            e.preventDefault();
                        }

                        $target.blur();
                    }

                    if (!$this.element.hasClass('uk-open')) {

                        $this.show();

                    } else {

                        if (!$this.dropdown.find(e.target).length || $target.is('.uk-dropdown-close') || $target.parents('.uk-dropdown-close').length) {
                            $this.hide();
                        }
                    }
                });

            } else {

                this.on('mouseenter', function(e) {

                    $this.trigger('pointerenter.uk.dropdown', [$this]);

                    if ($this.remainIdle) {
                        clearTimeout($this.remainIdle);
                    }

                    if (hoverIdle) {
                        clearTimeout(hoverIdle);
                    }

                    if (active && active == $this) {
                        return;
                    }

                    // pseudo manuAim
                    if (active && active != $this) {

                        hoverIdle = setTimeout(function() {
                            hoverIdle = setTimeout($this.show.bind($this), $this.options.delay);
                        }, $this.options.hoverDelayIdle);

                    } else {

                        hoverIdle = setTimeout($this.show.bind($this), $this.options.delay);
                    }

                }).on('mouseleave', function() {

                    if (hoverIdle) {
                        clearTimeout(hoverIdle);
                    }

                    $this.remainIdle = setTimeout(function() {
                        if (active && active == $this) $this.hide();
                    }, $this.options.remaintime);

                    $this.trigger('pointerleave.uk.dropdown', [$this]);

                }).on('click', function(e){

                    var $target = UI.$(e.target);

                    if ($this.remainIdle) {
                        clearTimeout($this.remainIdle);
                    }

                    if (active && active == $this) {
                        if (!$this.dropdown.find(e.target).length || $target.is('.uk-dropdown-close') || $target.parents('.uk-dropdown-close').length) {
                            $this.hide();
                        }
                        return;
                    }

                    if ($target.is("a[href='#']") || $target.parent().is("a[href='#']")){
                        e.preventDefault();
                    }

                    $this.show();
                });
            }
        },

        show: function(){

            UI.$html.off('click.outer.dropdown');

            if (active && active != this) {
                active.hide(true);
            }

            if (hoverIdle) {
                clearTimeout(hoverIdle);
            }

            this.trigger('beforeshow.uk.dropdown', [this]);

            this.checkDimensions();
            this.element.addClass('uk-open');

            // Update ARIA
            this.element.attr('aria-expanded', 'true');
            this.dropdown.attr('aria-hidden', 'false');

            this.trigger('show.uk.dropdown', [this]);

            UI.Utils.checkDisplay(this.dropdown, true);
            UI.Utils.focus(this.dropdown);
            active = this;

            this.registerOuterClick();
        },

        hide: function(force) {

            this.trigger('beforehide.uk.dropdown', [this, force]);

            this.element.removeClass('uk-open');

            if (this.remainIdle) {
                clearTimeout(this.remainIdle);
            }

            this.remainIdle = false;

            // Update ARIA
            this.element.attr('aria-expanded', 'false');
            this.dropdown.attr('aria-hidden', 'true');

            this.trigger('hide.uk.dropdown', [this, force]);

            if (active == this) active = false;
        },

        registerOuterClick: function(){

            var $this = this;

            UI.$html.off('click.outer.dropdown');

            setTimeout(function() {

                UI.$html.on('click.outer.dropdown', function(e) {

                    if (hoverIdle) {
                        clearTimeout(hoverIdle);
                    }

                    var $target = UI.$(e.target);

                    if (active == $this && !$this.element.find(e.target).length) {
                        $this.hide(true);
                        UI.$html.off('click.outer.dropdown');
                    }
                });
            }, 10);
        },

        checkDimensions: function() {

            if (!this.dropdown.length) return;

            // reset
            this.dropdown.removeClass('uk-dropdown-top uk-dropdown-bottom uk-dropdown-left uk-dropdown-right uk-dropdown-stack uk-dropdown-autoflip').css({
                topLeft :'',
                left :'',
                marginLeft :'',
                marginRight :''
            });

            if (this.justified && this.justified.length) {
                this.dropdown.css('min-width', '');
            }

            var $this          = this,
                pos            = UI.$.extend({}, this.offsetParent.offset(), {width: this.offsetParent[0].offsetWidth, height: this.offsetParent[0].offsetHeight}),
                posoffset      = this.options.offset,
                dropdown       = this.dropdown,
                offset         = dropdown.show().offset() || {left: 0, top: 0},
                width          = dropdown.outerWidth(),
                height         = dropdown.outerHeight(),
                boundarywidth  = this.boundary.width(),
                boundaryoffset = this.boundary[0] !== window && this.boundary.offset() ? this.boundary.offset(): {top:0, left:0},
                dpos           = this.options.pos;

            var variants =  {
                    'bottom-left'   : {top: 0 + pos.height + posoffset, left: 0},
                    'bottom-right'  : {top: 0 + pos.height + posoffset, left: 0 + pos.width - width},
                    'bottom-center' : {top: 0 + pos.height + posoffset, left: 0 + pos.width / 2 - width / 2},
                    'top-left'      : {top: 0 - height - posoffset, left: 0},
                    'top-right'     : {top: 0 - height - posoffset, left: 0 + pos.width - width},
                    'top-center'    : {top: 0 - height - posoffset, left: 0 + pos.width / 2 - width / 2},
                    'left-top'      : {top: 0, left: 0 - width - posoffset},
                    'left-bottom'   : {top: 0 + pos.height - height, left: 0 - width - posoffset},
                    'left-center'   : {top: 0 + pos.height / 2 - height / 2, left: 0 - width - posoffset},
                    'right-top'     : {top: 0, left: 0 + pos.width + posoffset},
                    'right-bottom'  : {top: 0 + pos.height - height, left: 0 + pos.width + posoffset},
                    'right-center'  : {top: 0 + pos.height / 2 - height / 2, left: 0 + pos.width + posoffset}
                },
                css = {},
                pp;

            pp = dpos.split('-');
            css = variants[dpos] ? variants[dpos] : variants['bottom-left'];

            // justify dropdown
            if (this.justified && this.justified.length) {
                justify(dropdown.css({left:0}), this.justified, boundarywidth);
            } else {

                if (this.options.preventflip !== true) {

                    var fdpos;

                    switch(this.checkBoundary(pos.left + css.left, pos.top + css.top, width, height, boundarywidth)) {
                        case "x":
                            if(this.options.preventflip !=='x') fdpos = flips['x'][dpos] || 'right-top';
                            break;
                        case "y":
                            if(this.options.preventflip !=='y') fdpos = flips['y'][dpos] || 'top-left';
                            break;
                        case "xy":
                            if(!this.options.preventflip) fdpos = flips['xy'][dpos] || 'right-bottom';
                            break;
                    }

                    if (fdpos) {

                        pp  = fdpos.split('-');
                        css = variants[fdpos] ? variants[fdpos] : variants['bottom-left'];
                        dropdown.addClass('uk-dropdown-autoflip');

                        // check flipped
                        if (this.checkBoundary(pos.left + css.left, pos.top + css.top, width, height, boundarywidth)) {
                            pp  = dpos.split('-');
                            css = variants[dpos] ? variants[dpos] : variants['bottom-left'];
                        }
                    }
                }
            }

            if (width > boundarywidth) {
                dropdown.addClass('uk-dropdown-stack');
                this.trigger('stack.uk.dropdown', [this]);
            }

            dropdown.css(css).css('display', '').addClass('uk-dropdown-'+pp[0]);
        },

        checkBoundary: function(left, top, width, height, boundarywidth) {

            var axis = "";

            if (left < 0 || ((left - UI.$win.scrollLeft())+width) > boundarywidth) {
               axis += "x";
            }

            if ((top - UI.$win.scrollTop()) < 0 || ((top - UI.$win.scrollTop())+height) > window.innerHeight) {
               axis += "y";
            }

            return axis;
        }
    });


    UI.component('dropdownOverlay', {

        defaults: {
           justify : false,
           cls     : '',
           duration: 200
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-dropdown-overlay]', context).each(function() {
                    var ele = UI.$(this);

                    if (!ele.data('dropdownOverlay')) {
                        UI.dropdownOverlay(ele, UI.Utils.options(ele.attr('data-uk-dropdown-overlay')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.justified = this.options.justify ? UI.$(this.options.justify) : false;
            this.overlay   = this.element.find('uk-dropdown-overlay');

            if (!this.overlay.length) {
                this.overlay = UI.$('<div class="uk-dropdown-overlay"></div>').appendTo(this.element);
            }

            this.overlay.addClass(this.options.cls);

            this.on({

                'beforeshow.uk.dropdown': function(e, dropdown) {
                    $this.dropdown = dropdown;

                    if ($this.justified && $this.justified.length) {
                        justify($this.overlay.css({display:'block', marginLeft:'', marginRight:''}), $this.justified, $this.justified.outerWidth());
                    }
                },

                'show.uk.dropdown': function(e, dropdown) {

                    var h = $this.dropdown.dropdown.outerHeight(true);

                    $this.dropdown.element.removeClass('uk-open');

                    $this.overlay.stop().css('display', 'block').animate({height: h}, $this.options.duration, function() {

                       $this.dropdown.dropdown.css('visibility', '');
                       $this.dropdown.element.addClass('uk-open');

                       UI.Utils.checkDisplay($this.dropdown.dropdown, true);
                    });

                    $this.pointerleave = false;
                },

                'hide.uk.dropdown': function() {
                    $this.overlay.stop().animate({height: 0}, $this.options.duration);
                },

                'pointerenter.uk.dropdown': function(e, dropdown) {
                    clearTimeout($this.remainIdle);
                },

                'pointerleave.uk.dropdown': function(e, dropdown) {
                    $this.pointerleave = true;
                }
            });


            this.overlay.on({

                'mouseenter': function() {
                    if ($this.remainIdle) {
                        clearTimeout($this.dropdown.remainIdle);
                        clearTimeout($this.remainIdle);
                    }
                },

                'mouseleave': function(){

                    if ($this.pointerleave && active) {

                        $this.remainIdle = setTimeout(function() {
                           if(active) active.hide();
                        }, active.options.remaintime);
                    }
                }
            })
        }

    });


    function justify(ele, justifyTo, boundarywidth, offset) {

        ele           = UI.$(ele);
        justifyTo     = UI.$(justifyTo);
        boundarywidth = boundarywidth || window.innerWidth;
        offset        = offset || ele.offset();

        if (justifyTo.length) {

            var jwidth = justifyTo.outerWidth();

            ele.css('min-width', jwidth);

            if (UI.langdirection == 'right') {

                var right1   = boundarywidth - (justifyTo.offset().left + jwidth),
                    right2   = boundarywidth - (ele.offset().left + ele.outerWidth());

                ele.css('margin-right', right1 - right2);

            } else {
                ele.css('margin-left', justifyTo.offset().left - offset.left);
            }
        }
    }

})(UIkit2);

(function(UI) {

    "use strict";

    var grids = [];

    UI.component('gridMatchHeight', {

        defaults: {
            target        : false,
            row           : true,
            ignorestacked : false,
            observe       : false
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-grid-match]', context).each(function() {
                    var grid = UI.$(this), obj;

                    if (!grid.data('gridMatchHeight')) {
                        obj = UI.gridMatchHeight(grid, UI.Utils.options(grid.attr('data-uk-grid-match')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.columns  = this.element.children();
            this.elements = this.options.target ? this.find(this.options.target) : this.columns;

            if (!this.columns.length) return;

            UI.$win.on('load resize orientationchange', (function() {

                var fn = function() {
                    if ($this.element.is(':visible')) $this.match();
                };

                UI.$(function() { fn(); });

                return UI.Utils.debounce(fn, 50);
            })());

            if (this.options.observe) {

                UI.domObserve(this.element, function(e) {
                    if ($this.element.is(':visible')) $this.match();
                });
            }

            this.on('display.uk.check', function(e) {
                if(this.element.is(':visible')) this.match();
            }.bind(this));

            grids.push(this);
        },

        match: function() {

            var firstvisible = this.columns.filter(':visible:first');

            if (!firstvisible.length) return;

            var stacked = Math.ceil(100 * parseFloat(firstvisible.css('width')) / parseFloat(firstvisible.parent().css('width'))) >= 100;

            if (stacked && !this.options.ignorestacked) {
                this.revert();
            } else {
                UI.Utils.matchHeights(this.elements, this.options);
            }

            return this;
        },

        revert: function() {
            this.elements.css('min-height', '');
            return this;
        }
    });

    UI.component('gridMargin', {

        defaults: {
            cls      : 'uk-grid-margin',
            rowfirst : 'uk-row-first'
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-grid-margin]', context).each(function() {
                    var grid = UI.$(this), obj;

                    if (!grid.data('gridMargin')) {
                        obj = UI.gridMargin(grid, UI.Utils.options(grid.attr('data-uk-grid-margin')));
                    }
                });
            });
        },

        init: function() {

            var stackMargin = UI.stackMargin(this.element, this.options);
        }
    });

})(UIkit2);

(function(UI) {

    "use strict";

    var active = false, activeCount = 0, $html = UI.$html, body;

    UI.$win.on('resize orientationchange', UI.Utils.debounce(function(){
        UI.$('.uk-modal.uk-open').each(function(){
            return UI.$(this).data('modal') && UI.$(this).data('modal').resize();
        });
    }, 150));

    UI.component('modal', {

        defaults: {
            keyboard: true,
            bgclose: true,
            minScrollHeight: 150,
            center: false,
            modal: true
        },

        scrollable: false,
        transition: false,
        hasTransitioned: true,

        init: function() {

            if (!body) body = UI.$('body');

            if (!this.element.length) return;

            var $this = this;

            this.paddingdir = 'padding-' + (UI.langdirection == 'left' ? 'right':'left');
            this.dialog     = this.find('.uk-modal-dialog');

            this.active     = false;

            // Update ARIA
            this.element.attr('aria-hidden', this.element.hasClass('uk-open'));

            this.on('click', '.uk-modal-close', function(e) {
                e.preventDefault();
                $this.hide();
            }).on('click', function(e) {

                var target = UI.$(e.target);

                if (target[0] == $this.element[0] && $this.options.bgclose) {
                    $this.hide();
                }
            });

            UI.domObserve(this.element, function(e) { $this.resize(); });
        },

        toggle: function() {
            return this[this.isActive() ? 'hide' : 'show']();
        },

        show: function() {

            if (!this.element.length) return;

            var $this = this;

            if (this.isActive()) return;

            if (this.options.modal && active) {
                active.hide(true);
            }

            this.element.removeClass('uk-open').show();
            this.resize(true);

            if (this.options.modal) {
                active = this;
            }

            this.active = true;

            activeCount++;

            if (UI.support.transition) {
                this.hasTransitioned = false;
                this.element.one(UI.support.transition.end, function(){
                    $this.hasTransitioned = true;
                    UI.Utils.focus($this.dialog, 'a[href]');
                }).addClass('uk-open');
            } else {
                this.element.addClass('uk-open');
                UI.Utils.focus(this.dialog, 'a[href]');
            }

            $html.addClass('uk-modal-page').height(); // force browser engine redraw

            // Update ARIA
            this.element.attr('aria-hidden', 'false');

            this.element.trigger('show.uk.modal');

            UI.Utils.checkDisplay(this.dialog, true);

            return this;
        },

        hide: function(force) {

            if (!force && UI.support.transition && this.hasTransitioned) {

                var $this = this;

                this.one(UI.support.transition.end, function() {
                    $this._hide();
                }).removeClass('uk-open');

            } else {

                this._hide();
            }

            return this;
        },

        resize: function(force) {

            if (!this.isActive() && !force) return;

            var bodywidth  = body.width();

            this.scrollbarwidth = window.innerWidth - bodywidth;

            body.css(this.paddingdir, this.scrollbarwidth);

            this.element.css('overflow-y', this.scrollbarwidth ? 'scroll' : 'auto');

            if (!this.updateScrollable() && this.options.center) {

                var dh  = this.dialog.outerHeight(),
                pad = parseInt(this.dialog.css('margin-top'), 10) + parseInt(this.dialog.css('margin-bottom'), 10);

                if ((dh + pad) < window.innerHeight) {
                    this.dialog.css({top: (window.innerHeight/2 - dh/2) - pad });
                } else {
                    this.dialog.css({top: ''});
                }
            }
        },

        updateScrollable: function() {

            // has scrollable?
            var scrollable = this.dialog.find('.uk-overflow-container:visible:first');

            if (scrollable.length) {

                scrollable.css('height', 0);

                var offset = Math.abs(parseInt(this.dialog.css('margin-top'), 10)),
                dh     = this.dialog.outerHeight(),
                wh     = window.innerHeight,
                h      = wh - 2*(offset < 20 ? 20:offset) - dh;

                scrollable.css({
                    maxHeight: (h < this.options.minScrollHeight ? '':h),
                    height:''
                });

                return true;
            }

            return false;
        },

        _hide: function() {

            this.active = false;
            if (activeCount > 0) activeCount--;
            else activeCount = 0;

            this.element.hide().removeClass('uk-open');

            // Update ARIA
            this.element.attr('aria-hidden', 'true');

            if (!activeCount) {
                $html.removeClass('uk-modal-page');
                body.css(this.paddingdir, "");
            }

            if (active===this) active = false;

            this.trigger('hide.uk.modal');
        },

        isActive: function() {
            return this.element.hasClass('uk-open');
        }

    });

    UI.component('modalTrigger', {

        boot: function() {

            // init code
            UI.$html.on('click.modal.uikit', '[data-uk-modal]', function(e) {

                var ele = UI.$(this);

                if (ele.is('a')) {
                    e.preventDefault();
                }

                if (!ele.data('modalTrigger')) {
                    var modal = UI.modalTrigger(ele, UI.Utils.options(ele.attr('data-uk-modal')));
                    modal.show();
                }

            });

            // close modal on esc button
            UI.$html.on('keydown.modal.uikit', function (e) {

                if (active && e.keyCode === 27 && active.options.keyboard) { // ESC
                    e.preventDefault();
                    active.hide();
                }
            });
        },

        init: function() {

            var $this = this;

            this.options = UI.$.extend({
                target: $this.element.is('a') ? $this.element.attr('href') : false
            }, this.options);

            this.modal = UI.modal(this.options.target, this.options);

            this.on("click", function(e) {
                e.preventDefault();
                $this.show();
            });

            //methods
            this.proxy(this.modal, 'show hide isActive');
        }
    });

    UI.modal.dialog = function(content, options) {

        var modal = UI.modal(UI.$(UI.modal.dialog.template).appendTo('body'), options);

        modal.on('hide.uk.modal', function(){
            if (modal.persist) {
                modal.persist.appendTo(modal.persist.data('modalPersistParent'));
                modal.persist = false;
            }
            modal.element.remove();
        });

        setContent(content, modal);

        return modal;
    };

    UI.modal.dialog.template = '<div class="uk-modal"><div class="uk-modal-dialog" style="min-height:0;"></div></div>';

    UI.modal.alert = function(content, options) {

        options = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, options);

        var modal = UI.modal.dialog(([
            '<div class="uk-margin uk-modal-content">'+String(content)+'</div>',
            '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-button-primary uk-modal-close">'+options.labels.Ok+'</button></div>'
        ]).join(""), options);

        modal.on('show.uk.modal', function(){
            setTimeout(function(){
                modal.element.find('button:first').focus();
            }, 50);
        });

        return modal.show();
    };

    UI.modal.confirm = function(content, onconfirm, oncancel) {

        var options = arguments.length > 1 && arguments[arguments.length-1] ? arguments[arguments.length-1] : {};

        onconfirm = UI.$.isFunction(onconfirm) ? onconfirm : function(){};
        oncancel  = UI.$.isFunction(oncancel) ? oncancel : function(){};
        options   = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, UI.$.isFunction(options) ? {}:options);

        var modal = UI.modal.dialog(([
            '<div class="uk-margin uk-modal-content">'+String(content)+'</div>',
            '<div class="uk-modal-footer uk-text-right"><button class="uk-button js-modal-confirm-cancel">'+options.labels.Cancel+'</button> <button class="uk-button uk-button-primary js-modal-confirm">'+options.labels.Ok+'</button></div>'
        ]).join(""), options);

        modal.element.find(".js-modal-confirm, .js-modal-confirm-cancel").on("click", function(){
            UI.$(this).is('.js-modal-confirm') ? onconfirm() : oncancel();
            modal.hide();
        });

        modal.on('show.uk.modal', function(){
            setTimeout(function(){
                modal.element.find('.js-modal-confirm').focus();
            }, 50);
        });

        return modal.show();
    };

    UI.modal.prompt = function(text, value, onsubmit, options) {

        onsubmit = UI.$.isFunction(onsubmit) ? onsubmit : function(value){};
        options  = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, options);

        var modal = UI.modal.dialog(([
            text ? '<div class="uk-modal-content uk-form">'+String(text)+'</div>':'',
            '<div class="uk-margin-small-top uk-modal-content uk-form"><p><input type="text" class="uk-width-1-1"></p></div>',
            '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-modal-close">'+options.labels.Cancel+'</button> <button class="uk-button uk-button-primary js-modal-ok">'+options.labels.Ok+'</button></div>'
        ]).join(""), options),

        input = modal.element.find("input[type='text']").val(value || '').on('keyup', function(e){
            if (e.keyCode == 13) {
                modal.element.find('.js-modal-ok').trigger('click');
            }
        });

        modal.element.find('.js-modal-ok').on('click', function(){
            if (onsubmit(input.val())!==false){
                modal.hide();
            }
        });

        return modal.show();
    };

    UI.modal.blockUI = function(content, options) {

        var modal = UI.modal.dialog(([
            '<div class="uk-margin uk-modal-content">'+String(content || '<div class="uk-text-center">...</div>')+'</div>'
        ]).join(""), UI.$.extend({bgclose:false, keyboard:false, modal:false}, options));

        modal.content = modal.element.find('.uk-modal-content:first');

        return modal.show();
    };

    UI.modal.labels = {
        Ok: 'Ok',
        Cancel: 'Cancel'
    };

    // helper functions
    function setContent(content, modal){

        if(!modal) return;

        if (typeof content === 'object') {

            // convert DOM object to a jQuery object
            content = content instanceof jQuery ? content : UI.$(content);

            if(content.parent().length) {
                modal.persist = content;
                modal.persist.data('modalPersistParent', content.parent());
            }
        }else if (typeof content === 'string' || typeof content === 'number') {
                // just insert the data as innerHTML
                content = UI.$('<div></div>').html(content);
        }else {
                // unsupported data type!
                content = UI.$('<div></div>').html('UIkit2.modal Error: Unsupported data type: ' + typeof content);
        }

        content.appendTo(modal.element.find('.uk-modal-dialog'));

        return modal;
    }

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('nav', {

        defaults: {
            toggle: '>li.uk-parent > a[href="#"]',
            lists: '>li.uk-parent > ul',
            multiple: false
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-nav]', context).each(function() {
                    var nav = UI.$(this);

                    if (!nav.data('nav')) {
                        var obj = UI.nav(nav, UI.Utils.options(nav.attr('data-uk-nav')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.on('click.uk.nav', this.options.toggle, function(e) {
                e.preventDefault();
                var ele = UI.$(this);
                $this.open(ele.parent()[0] == $this.element[0] ? ele : ele.parent("li"));
            });

            this.update();

            UI.domObserve(this.element, function(e) {
                if ($this.element.find($this.options.lists).not('[role]').length) {
                    $this.update();
                }
            });
        },

        update: function() {

            var $this = this;

            this.find(this.options.lists).each(function() {

                var $ele   = UI.$(this).attr('role', 'menu'),
                    parent = $ele.closest('li'),
                    active = parent.hasClass("uk-active");

                if (!parent.data('list-container')) {
                    $ele.wrap('<div style="overflow:hidden;height:0;position:relative;"></div>');
                    parent.data('list-container', $ele.parent()[active ? 'removeClass':'addClass']('uk-hidden'));
                }

                // Init ARIA
                parent.attr('aria-expanded', parent.hasClass("uk-open"));

                if (active) $this.open(parent, true);
            });
        },

        open: function(li, noanimation) {

            var $this = this, element = this.element, $li = UI.$(li), $container = $li.data('list-container');

            if (!this.options.multiple) {

                element.children('.uk-open').not(li).each(function() {

                    var ele = UI.$(this);

                    if (ele.data('list-container')) {
                        ele.data('list-container').stop().animate({height: 0}, function() {
                            UI.$(this).parent().removeClass('uk-open').end().addClass('uk-hidden');
                        });
                    }
                });
            }

            $li.toggleClass('uk-open');

            // Update ARIA
            $li.attr('aria-expanded', $li.hasClass('uk-open'));

            if ($container) {

                if ($li.hasClass('uk-open')) {
                    $container.removeClass('uk-hidden');
                }

                if (noanimation) {

                    $container.stop().height($li.hasClass('uk-open') ? 'auto' : 0);

                    if (!$li.hasClass('uk-open')) {
                        $container.addClass('uk-hidden');
                    }

                    this.trigger('display.uk.check');

                } else {

                    $container.stop().animate({
                        height: ($li.hasClass('uk-open') ? getHeight($container.find('ul:first')) : 0)
                    }, function() {

                        if (!$li.hasClass('uk-open')) {
                            $container.addClass('uk-hidden');
                        } else {
                            $container.css('height', '');
                        }

                        $this.trigger('display.uk.check');
                    });
                }
            }
        }
    });


    // helper

    function getHeight(ele) {

        var $ele = UI.$(ele), height = 'auto';

        if ($ele.is(':visible')) {
            height = $ele.outerHeight();
        } else {

            var tmp = {
                position: $ele.css('position'),
                visibility: $ele.css('visibility'),
                display: $ele.css('display')
            };

            height = $ele.css({position: 'absolute', visibility: 'hidden', display: 'block'}).outerHeight();

            $ele.css(tmp); // reset element
        }

        return height;
    }

})(UIkit2);

(function(UI) {

    "use strict";

    var scrollpos = {x: window.scrollX, y: window.scrollY},
        $win      = UI.$win,
        $doc      = UI.$doc,
        $html     = UI.$html,
        Offcanvas = {

        show: function(element, options) {

            element = UI.$(element);

            if (!element.length) return;

            options = UI.$.extend({mode: 'push'}, options);

            var $body     = UI.$('body'),
                bar       = element.find('.uk-offcanvas-bar:first'),
                rtl       = (UI.langdirection == 'right'),
                flip      = bar.hasClass('uk-offcanvas-bar-flip') ? -1:1,
                dir       = flip * (rtl ? -1 : 1),

                scrollbarwidth =  window.innerWidth - $body.width();

            scrollpos = {x: window.pageXOffset, y: window.pageYOffset};

            bar.attr('mode', options.mode);
            element.addClass('uk-active');

            $body.css({width: window.innerWidth - scrollbarwidth, height: window.innerHeight}).addClass('uk-offcanvas-page');

            if (options.mode == 'push' || options.mode == 'reveal') {
                $body.css((rtl ? 'margin-right' : 'margin-left'), (rtl ? -1 : 1) * (bar.outerWidth() * dir));
            }

            if (options.mode == 'reveal') {
                bar.css('clip', 'rect(0, '+bar.outerWidth()+'px, 100vh, 0)');
            }

            $html.css('margin-top', scrollpos.y * -1).width(); // .width() - force redraw


            bar.addClass('uk-offcanvas-bar-show');

            this._initElement(element);

            bar.trigger('show.uk.offcanvas', [element, bar]);

            // Update ARIA
            element.attr('aria-hidden', 'false');
        },

        hide: function(force) {

            var $body = UI.$('body'),
                panel = UI.$('.uk-offcanvas.uk-active'),
                rtl   = (UI.langdirection == 'right'),
                bar   = panel.find('.uk-offcanvas-bar:first'),
                finalize = function() {
                    $body.removeClass('uk-offcanvas-page').css({width: '', height: '', marginLeft: '', marginRight: ''});
                    panel.removeClass('uk-active');

                    bar.removeClass('uk-offcanvas-bar-show');
                    $html.css('margin-top', '');
                    window.scrollTo(scrollpos.x, scrollpos.y);
                    bar.trigger('hide.uk.offcanvas', [panel, bar]);

                    // Update ARIA
                    panel.attr('aria-hidden', 'true');
                };

            if (!panel.length) return;
            if (bar.attr('mode') == 'none') force = true;

            if (UI.support.transition && !force) {

                $body.one(UI.support.transition.end, function() {
                    finalize();
                }).css((rtl ? 'margin-right' : 'margin-left'), '');

                if (bar.attr('mode') == 'reveal') {
                    bar.css('clip', '');
                }

                setTimeout(function(){
                    bar.removeClass('uk-offcanvas-bar-show');
                }, 0);

            } else {
                finalize();
            }
        },

        _initElement: function(element) {

            if (element.data('OffcanvasInit')) return;

            element.on('click.uk.offcanvas swipeRight.uk.offcanvas swipeLeft.uk.offcanvas', function(e) {

                var target = UI.$(e.target);

                if (!e.type.match(/swipe/)) {

                    if (!target.hasClass('uk-offcanvas-close')) {
                        if (target.hasClass('uk-offcanvas-bar')) return;
                        if (target.parents('.uk-offcanvas-bar:first').length) return;
                    }
                }

                e.stopImmediatePropagation();
                Offcanvas.hide();
            });

            element.on('click', 'a[href*="#"]', function(e){

                var link = UI.$(this),
                    href = link.attr('href');

                if (href == '#') {
                    return;
                }

                UI.$doc.one('hide.uk.offcanvas', function() {

                    var target;

                    try {
                        target = UI.$(link[0].hash);
                    } catch (e){
                        target = '';
                    }

                    if (!target.length) {
                        target = UI.$('[name="'+link[0].hash.replace('#','')+'"]');
                    }

                    if (target.length && UI.Utils.scrollToElement) {
                        UI.Utils.scrollToElement(target, UI.Utils.options(link.attr('data-uk-smooth-scroll') || '{}'));
                    } else {
                        window.location.href = href;
                    }
                });

                Offcanvas.hide();
            });

            element.data('OffcanvasInit', true);
        }
    };

    UI.component('offcanvasTrigger', {

        boot: function() {

            // init code
            $html.on('click.offcanvas.uikit', '[data-uk-offcanvas]', function(e) {

                e.preventDefault();

                var ele = UI.$(this);

                if (!ele.data('offcanvasTrigger')) {
                    var obj = UI.offcanvasTrigger(ele, UI.Utils.options(ele.attr('data-uk-offcanvas')));
                    ele.trigger("click");
                }
            });

            $html.on('keydown.uk.offcanvas', function(e) {

                if (e.keyCode === 27) { // ESC
                    Offcanvas.hide();
                }
            });
        },

        init: function() {

            var $this = this;

            this.options = UI.$.extend({
                target: $this.element.is('a') ? $this.element.attr('href') : false,
                mode: 'push'
            }, this.options);

            this.on('click', function(e) {
                e.preventDefault();
                Offcanvas.show($this.options.target, $this.options);
            });
        }
    });

    UI.offcanvas = Offcanvas;

})(UIkit2);

(function(UI) {

    "use strict";

    var Animations;

    UI.component('switcher', {

        defaults: {
            connect   : false,
            toggle    : '>*',
            active    : 0,
            animation : false,
            duration  : 200,
            swiping   : true
        },

        animating: false,

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-switcher]', context).each(function() {
                    var switcher = UI.$(this);

                    if (!switcher.data('switcher')) {
                        var obj = UI.switcher(switcher, UI.Utils.options(switcher.attr('data-uk-switcher')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.on('click.uk.switcher', this.options.toggle, function(e) {
                e.preventDefault();
                $this.show(this);
            });

            if (!this.options.connect) {
                return;
            }

            this.connect = UI.$(this.options.connect);

            if (!this.connect.length) {
                return;
            }

            this.connect.on('click.uk.switcher', '[data-uk-switcher-item]', function(e) {

                e.preventDefault();

                var item = UI.$(this).attr('data-uk-switcher-item');

                if ($this.index == item) return;

                switch(item) {
                    case 'next':
                    case 'previous':
                        $this.show($this.index + (item=='next' ? 1:-1));
                        break;
                    default:
                        $this.show(parseInt(item, 10));
                }
            });

            if (this.options.swiping) {

                this.connect.on('swipeRight swipeLeft', function(e) {
                    e.preventDefault();
                    if (!window.getSelection().toString()) {
                        $this.show($this.index + (e.type == 'swipeLeft' ? 1 : -1));
                    }
                });
            }

            this.update();
        },

        update: function() {

            this.connect.children().removeClass('uk-active').attr('aria-hidden', 'true');

            var toggles = this.find(this.options.toggle),
                active  = toggles.filter('.uk-active');

            if (active.length) {
                this.show(active, false);
            } else {

                if (this.options.active===false) return;

                active = toggles.eq(this.options.active);
                this.show(active.length ? active : toggles.eq(0), false);
            }

            // Init ARIA for toggles
            toggles.not(active).attr('aria-expanded', 'false');
            active.attr('aria-expanded', 'true');
        },

        show: function(tab, animate) {

            if (this.animating) {
                return;
            }

            var toggles = this.find(this.options.toggle);

            if (isNaN(tab)) {
                tab = UI.$(tab);
            } else {
                tab = tab < 0 ? toggles.length-1 : tab;
                tab = toggles.eq(toggles[tab] ? tab : 0);
            }

            var $this     = this,
                active    = UI.$(tab),
                animation = Animations[this.options.animation] || function(current, next) {

                    if (!$this.options.animation) {
                        return Animations.none.apply($this);
                    }

                    var anim = $this.options.animation.split(',');

                    if (anim.length == 1) {
                        anim[1] = anim[0];
                    }

                    anim[0] = anim[0].trim();
                    anim[1] = anim[1].trim();

                    return coreAnimation.apply($this, [anim, current, next]);
                };

            if (animate===false || !UI.support.animation) {
                animation = Animations.none;
            }

            if (active.hasClass("uk-disabled")) return;

            // Update ARIA for Toggles
            toggles.attr('aria-expanded', 'false');
            active.attr('aria-expanded', 'true');

            toggles.filter(".uk-active").removeClass("uk-active");
            active.addClass("uk-active");

            if (this.options.connect && this.connect.length) {

                this.index = this.find(this.options.toggle).index(active);

                if (this.index == -1 ) {
                    this.index = 0;
                }

                this.connect.each(function() {

                    var container = UI.$(this),
                        children  = UI.$(container.children()),
                        current   = UI.$(children.filter('.uk-active')),
                        next      = UI.$(children.eq($this.index));

                        $this.animating = true;

                        animation.apply($this, [current, next]).then(function(){

                            current.removeClass("uk-active");
                            next.addClass("uk-active");

                            // Update ARIA for connect
                            current.attr('aria-hidden', 'true');
                            next.attr('aria-hidden', 'false');

                            UI.Utils.checkDisplay(next, true);

                            $this.animating = false;

                        });
                });
            }

            this.trigger("show.uk.switcher", [active]);
        }
    });

    Animations = {

        'none': function() {
            var d = UI.$.Deferred();
            d.resolve();
            return d.promise();
        },

        'fade': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-fade', current, next]);
        },

        'slide-bottom': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-slide-bottom', current, next]);
        },

        'slide-top': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-slide-top', current, next]);
        },

        'slide-vertical': function(current, next, dir) {

            var anim = ['uk-animation-slide-top', 'uk-animation-slide-bottom'];

            if (current && current.index() > next.index()) {
                anim.reverse();
            }

            return coreAnimation.apply(this, [anim, current, next]);
        },

        'slide-left': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-slide-left', current, next]);
        },

        'slide-right': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-slide-right', current, next]);
        },

        'slide-horizontal': function(current, next, dir) {

            var anim = ['uk-animation-slide-right', 'uk-animation-slide-left'];

            if (current && current.index() > next.index()) {
                anim.reverse();
            }

            return coreAnimation.apply(this, [anim, current, next]);
        },

        'scale': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-scale-up', current, next]);
        }
    };

    UI.switcher.animations = Animations;


    // helpers

    function coreAnimation(cls, current, next) {

        var d = UI.$.Deferred(), clsIn = cls, clsOut = cls, release;

        if (next[0]===current[0]) {
            d.resolve();
            return d.promise();
        }

        if (typeof(cls) == 'object') {
            clsIn  = cls[0];
            clsOut = cls[1] || cls[0];
        }

        UI.$body.css('overflow-x', 'hidden'); // fix scroll jumping in iOS

        release = function() {

            if (current) current.hide().removeClass('uk-active '+clsOut+' uk-animation-reverse');

            next.addClass(clsIn).one(UI.support.animation.end, function() {

                setTimeout(function () {
                    next.removeClass(''+clsIn+'').css({opacity:'', display:''});
                }, 0);

                d.resolve();

                UI.$body.css('overflow-x', '');

                if (current) current.css({opacity:'', display:''});

            }.bind(this)).show();
        };

        next.css('animation-duration', this.options.duration+'ms');

        if (current && current.length) {

            current.css('animation-duration', this.options.duration+'ms');

            current.css('display', 'none').addClass(clsOut+' uk-animation-reverse').one(UI.support.animation.end, function() {
                release();
            }.bind(this)).css('display', '');

        } else {
            next.addClass('uk-active');
            release();
        }

        return d.promise();
    }

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('tab', {

        defaults: {
            target    : '>li:not(.uk-tab-responsive, .uk-disabled)',
            connect   : false,
            active    : 0,
            animation : false,
            duration  : 200,
            swiping   : true
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-tab]', context).each(function() {

                    var tab = UI.$(this);

                    if (!tab.data('tab')) {
                        var obj = UI.tab(tab, UI.Utils.options(tab.attr('data-uk-tab')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.current = false;

            this.on('click.uk.tab', this.options.target, function(e) {

                e.preventDefault();

                if ($this.switcher && $this.switcher.animating) {
                    return;
                }

                var current = $this.find($this.options.target).not(this);

                current.removeClass('uk-active').blur();

                $this.trigger('change.uk.tab', [UI.$(this).addClass('uk-active'), $this.current]);

                $this.current = UI.$(this);

                // Update ARIA
                if (!$this.options.connect) {
                    current.attr('aria-expanded', 'false');
                    UI.$(this).attr('aria-expanded', 'true');
                }
            });

            if (this.options.connect) {
                this.connect = UI.$(this.options.connect);
            }

            // init responsive tab
            this.responsivetab = UI.$('<li class="uk-tab-responsive uk-active"><a></a></li>').append('<div class="uk-dropdown uk-dropdown-small"><ul class="uk-nav uk-nav-dropdown"></ul><div>');

            this.responsivetab.dropdown = this.responsivetab.find('.uk-dropdown');
            this.responsivetab.lst      = this.responsivetab.dropdown.find('ul');
            this.responsivetab.caption  = this.responsivetab.find('a:first');

            if (this.element.hasClass('uk-tab-bottom')) this.responsivetab.dropdown.addClass('uk-dropdown-up');

            // handle click
            this.responsivetab.lst.on('click.uk.tab', 'a', function(e) {

                e.preventDefault();
                e.stopPropagation();

                var link = UI.$(this);

                $this.element.children('li:not(.uk-tab-responsive)').eq(link.data('index')).trigger('click');
            });

            this.on('show.uk.switcher change.uk.tab', function(e, tab) {
                $this.responsivetab.caption.html(tab.text());
            });

            this.element.append(this.responsivetab);

            // init UIkit components
            if (this.options.connect) {

                this.switcher = UI.switcher(this.element, {
                    toggle    : '>li:not(.uk-tab-responsive)',
                    connect   : this.options.connect,
                    active    : this.options.active,
                    animation : this.options.animation,
                    duration  : this.options.duration,
                    swiping   : this.options.swiping
                });
            }

            UI.dropdown(this.responsivetab, {mode: 'click', preventflip: 'y'});

            // init
            $this.trigger('change.uk.tab', [this.element.find(this.options.target).not('.uk-tab-responsive').filter('.uk-active')]);

            this.check();

            UI.$win.on('resize orientationchange', UI.Utils.debounce(function(){
                if ($this.element.is(':visible'))  $this.check();
            }, 100));

            this.on('display.uk.check', function(){
                if ($this.element.is(':visible'))  $this.check();
            });
        },

        check: function() {

            var children = this.element.children('li:not(.uk-tab-responsive)').removeClass('uk-hidden');

            if (!children.length) {
                this.responsivetab.addClass('uk-hidden');
                return;
            }

            var top          = (children.eq(0).offset().top + Math.ceil(children.eq(0).height()/2)),
                doresponsive = false,
                item, link, clone;

            this.responsivetab.lst.empty();

            children.each(function(){

                if (UI.$(this).offset().top > top) {
                    doresponsive = true;
                }
            });

            if (doresponsive) {

                for (var i = 0; i < children.length; i++) {

                    item  = UI.$(children.eq(i));
                    link  = item.find('a');

                    if (item.css('float') != 'none' && !item.attr('uk-dropdown')) {

                        if (!item.hasClass('uk-disabled')) {

                            clone = UI.$(item[0].outerHTML);
                            clone.find('a').data('index', i);

                            this.responsivetab.lst.append(clone);
                        }

                        item.addClass('uk-hidden');
                    }
                }
            }

            this.responsivetab[this.responsivetab.lst.children('li').length ? 'removeClass':'addClass']('uk-hidden');
        }
    });

})(UIkit2);

(function(UI){

    "use strict";

    UI.component('cover', {

        defaults: {
            automute : true
        },

        boot: function() {

            // auto init
            UI.ready(function(context) {

                UI.$('[data-uk-cover]', context).each(function(){

                    var ele = UI.$(this);

                    if(!ele.data('cover')) {
                        var plugin = UI.cover(ele, UI.Utils.options(ele.attr('data-uk-cover')));
                    }
                });
            });
        },

        init: function() {

            this.parent = this.element.parent();

            UI.$win.on('load resize orientationchange', UI.Utils.debounce(function(){
                this.check();
            }.bind(this), 100));

            this.on('display.uk.check', function(e) {
                if (this.element.is(':visible')) this.check();
            }.bind(this));

            this.check();

            if (this.element.is('iframe') && this.options.automute) {

                var src = this.element.attr('src');

                this.element.attr('src', '').on('load', function(){
                    this.contentWindow.postMessage('{ "event": "command", "func": "mute", "method":"setVolume", "value":0}', '*');
                }).attr('src', [src, (src.indexOf('?') > -1 ? '&':'?'), 'enablejsapi=1&api=1'].join(''));
            }
        },

        check: function() {

            this.element.css({ width  : '', height : '' });

            this.dimension = {w: this.element.width(), h: this.element.height()};

            if (this.element.attr('width') && !isNaN(this.element.attr('width'))) {
                this.dimension.w = this.element.attr('width');
            }

            if (this.element.attr('height') && !isNaN(this.element.attr('height'))) {
                this.dimension.h = this.element.attr('height');
            }

            this.ratio = this.dimension.w / this.dimension.h;

            var w = this.parent.width(), h = this.parent.height(), width, height;

            // if element height < parent height (gap underneath)
            if ((w / this.ratio) < h) {

                width  = Math.ceil(h * this.ratio);
                height = h;

            // element width < parent width (gap to right)
            } else {

                width  = w;
                height = Math.ceil(w / this.ratio);
            }

            this.element.css({ width  : width, height : height });
        }
    });

})(UIkit2);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/app.js":[function(require,module,exports){
window.$ = window.jQuery = require('./vendor/jquery');

// vendor
require('svg4everybody')();
require('uikit');

// require('./vendor/uikit/uikit.min');
require('./vendor/uikit/modal.min');
require('./vendor/uikit/lightbox.min');
require('./vendor/uikit/accordion.min');
require('./vendor/uikit/slider.min');
require('./vendor/uikit/slideset.min');
require('./vendor/uikit/slideshow.min');
require('./vendor/uikit/sticky.min');
require('./vendor/uikit/tooltip.min');

require('./vendor/owl.carousel');
// require('select2');
require('./vendor/picturefill.min');

// modules
require('./components/changer');
require('./components/slideshow');
require('./components/video');
require('./components/filter-accordion');
require('./components/sticky-header');
require('./components/sticky-submenu');
require('./components/onepager');
require('./components/smooth-scroll');
require('./components/clearable-input');
require('./components/OwlControl');
require('./components/events');
require('./components/formhandler');
require('./components/sharer');
require('./components/table');
require('./components/toggle-download-button');
require('./components/masonry-layout');

// don't upload!
// require('./vendor/configurator');


// needs refactor
require('./shame');

},{"./components/OwlControl":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/OwlControl.js","./components/changer":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/changer.js","./components/clearable-input":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/clearable-input.js","./components/events":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/events.js","./components/filter-accordion":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/filter-accordion.js","./components/formhandler":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/formhandler.js","./components/masonry-layout":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/masonry-layout.js","./components/onepager":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/onepager.js","./components/sharer":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sharer.js","./components/slideshow":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/slideshow.js","./components/smooth-scroll":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/smooth-scroll.js","./components/sticky-header":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sticky-header.js","./components/sticky-submenu":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sticky-submenu.js","./components/table":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/table.js","./components/toggle-download-button":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/toggle-download-button.js","./components/video":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/video.js","./shame":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/shame.js","./vendor/jquery":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/jquery.js","./vendor/owl.carousel":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/owl.carousel.js","./vendor/picturefill.min":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/picturefill.min.js","./vendor/uikit/accordion.min":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/accordion.min.js","./vendor/uikit/lightbox.min":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/lightbox.min.js","./vendor/uikit/modal.min":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/modal.min.js","./vendor/uikit/slider.min":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slider.min.js","./vendor/uikit/slideset.min":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slideset.min.js","./vendor/uikit/slideshow.min":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slideshow.min.js","./vendor/uikit/sticky.min":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/sticky.min.js","./vendor/uikit/tooltip.min":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/tooltip.min.js","svg4everybody":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/svg4everybody/dist/svg4everybody.js","uikit":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/uikit/dist/js/uikit.js"}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/OwlControl.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    /*
     * Constructor
     */

    var OwlControl = function (element, options) {

        this.element = element;

        this.$element = $(element);

        this.options = options;

        this.metaOptions = this.$element.data('owlcontrol');

        this.settings = $.extend({}, OwlControl.Defaults, this.options, this.metaOptions);
    };

    /*
     * Defaults
     */
    OwlControl.Defaults = {};

    /*
     * Initialize
     */
    OwlControl.prototype.initialize = function () {
        // console.log('initializing OwlControl');

        // console.log(this.settings);

        this.$element.owlCarousel(this.settings);
    };

    /*
     * jQuery Plugin Register
     */
    $.fn.owlControl = function (options) {
        return this.each(function () {
            new OwlControl(this, options).initialize();
        });
    };
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/changer.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var Changer = function (element, options) {
        var $this = $(this),
            _this = this;

        this.element = $(element);
        this.options = $.extend({}, this.defaults, options);

        this.element.on('mouseenter', function (e) {
            _this.changeMedia();
        });
    };

    $.extend(Changer.prototype, {

        defaults: {},

        changeMedia: function () {
            this.element.parents('.js-panel-story').find('picture source:first-child').attr('srcset', this.options.src);
        }

    });

    // init
    $(function () {
        $('[data-changer]').each(function () {
            var changer = $(this);
            new Changer(changer, transformOptions(changer.data('changer')));
        });
    });

    // helper
    var transformOptions = function (string) {

        if ($.isPlainObject(string)) return string;

        var start = string.indexOf("{"),
            options = {};

        if (start != -1) {
            try {
                options = new Function("", "var json = " + string.substr(start) + "; return JSON.parse(JSON.stringify(json));")();
            } catch (e) {}
        }

        return options;
    };
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/clearable-input.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var $element = $('.js-clearable-input'),
        defaults = {
        "submitonclick": false
    };

    $element.each(function () {
        var $this = $(this),
            options = $this.attr('data-clearable') ? JSON.parse($this.attr('data-clearable')) : {},
            settings = $.extend(true, {}, defaults, options);

        $this.wrap('<span class="tm-input tm-input--with-clear-icon" />').after($('<span />').on('click', function () {
            $(this).prev('input').val('').focus();

            if (settings.submitonclick) {
                var $form = $this.closest('form');

                if ($form.length) {
                    $form.submit();
                }
            }
        }));
    });
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/events.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var $eventsContainer = $('.js-event-list-container');
    var $filterButton = $('.js-filter-event-list');
    var buttonActive = 'tm-button-basic--active';

    var $eventsCategory = $('[data-filter-type="category"]');
    var $eventsLocation = $('[data-filter-type="location"]');

    //var filterUrl = 'http://kisk-mennekes-www-20151019-relaunch.10.6.0.109.xip.io:8888/schulungen/filter/';
    var filterUrlController = '?tx_sfeventmgt_pievent[action]=list&tx_sfeventmgt_pievent[controller]=Event';
    var filterUrlDemandCategory = '&tx_sfeventmgt_pievent[overwriteDemand][category]=';
    var filterUrlDemandLocation = '&tx_sfeventmgt_pievent[overwriteDemand][location]=';

    function handleEvents() {

        $('.js-tm-form-set-label').on('blur', function () {
            if ($(this).val()) {
                $(this).removeClass('is-empty');
            } else {
                $(this).addClass('is-empty');
            }
        });

        $('.js-filter-event-list-mobile').on('select2:select', function (e) {
            var url = filterUrl + filterUrlController;

            var demandCategory = $('.js-filter-event-list-mobile[data-filter-type="category"]').select2().find(":selected").data("uid");
            if (demandCategory) {
                url += filterUrlDemandCategory + demandCategory;
            }

            var demandLocation = $('.js-filter-event-list-mobile[data-filter-type="category"]').select2().find(":selected").data("uid");
            if (demandLocation) {
                url += filterUrlDemandLocation + demandLocation;
            }

            getData(url);
        });

        $('.js-filter-event-list').on('click', function filterButton(e) {
            e.preventDefault();
            var button = $(this);
            var url = filterUrl + filterUrlController;
            var arrDemandCategory = [];
            var arrDemandLocation = [];

            if (button.parents('[data-filter-type]').data('filterType') == 'category') {
                $eventsCategory.find('a').removeClass(buttonActive);
                button.addClass(buttonActive);
            }

            if (button.parents('[data-filter-type]').data('filterType') == 'location') {
                $eventsLocation.find('a').not($(this)).removeClass(buttonActive);
                button.toggleClass(buttonActive);
            }

            $eventsCategory.find('.' + buttonActive).each(function (i, e) {
                if ($(e).data('id')) {
                    arrDemandCategory[i] = $(e).data('id');
                }
            });

            $eventsLocation.find('.' + buttonActive).each(function (i, e) {
                if ($(e).data('id')) {
                    arrDemandLocation[i] = $(e).data('id');
                }
            });

            if (arrDemandCategory.length > 0) {
                url += filterUrlDemandCategory + arrDemandCategory.join(',');
            }

            if (arrDemandLocation.length > 0) {
                url += filterUrlDemandLocation + arrDemandLocation.join(',');
            }

            if (arrDemandCategory.length == 0 && arrDemandLocation.length > 0) {
                $('.js-filter-event-list-all').removeClass(buttonActive);
            }

            if (arrDemandCategory.length == 0 && arrDemandLocation.length == 0) {
                $('.js-filter-event-list-all').trigger('click');
                return;
            }

            getData(url);
        });

        $('.js-filter-event-list-all').on('click', function filterButton(e) {
            e.preventDefault();
            var url = $(this).attr('href');

            $filterButton.removeClass(buttonActive);
            $(this).addClass(buttonActive);

            getData(url);
        });

        if ($('.tm-block--mobile-sticky').length) {

            var scrollTimeout;
            var throttle = 100;
            $(window).on('scroll resize', function () {
                if (!scrollTimeout) {
                    if ($(window).width() < 768) {

                        scrollTimeout = setTimeout(function () {
                            if (isInViewport($('.js-events-sticky-trigger'))) {
                                $('.tm-block--mobile-sticky').addClass('tm-block--mobile-sticky--unset');
                            } else {
                                $('.tm-block--mobile-sticky').removeClass('tm-block--mobile-sticky--unset');
                            }
                            scrollTimeout = null;
                        }, throttle);
                    } else {
                        $('.tm-block--mobile-sticky').addClass('tm-block--mobile-sticky--unset');
                    }
                }
            });
        }

        if ($('.js-scroll-to-error').find('.f3-form-error').length > 0) {

            setTimeout(function scrollToError() {
                var scrollToErrorPosition = $('.js-scroll-to-error').first('.f3-form-error').offset().top;
                $('html, body').animate({
                    scrollTop: scrollToErrorPosition
                }, 1000);
            }, 750);
        }
    }

    function getData(url) {
        var _this = this;

        ajaxData(url).then(function (data) {

            var firstRun = 1;

            $eventsContainer.addClass('tm-events-overview__container--fade-out');
            $eventsContainer.one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function (e) {
                if (!firstRun) {
                    return;
                }

                var events = $(data).find('.js-event-list');
                firstRun = 0;

                $('.js-event-list').remove();
                $eventsContainer.append(events);

                $(this).removeClass('tm-events-overview__container--fade-out');
            });

            window.history.pushState(null, null, $(_this).attr('href'));
        }).catch(function (err) {});
    }

    function ajaxData(url) {
        return new Promise(function (resolve, reject) {
            var req = new XMLHttpRequest();
            req.open('GET', url);
            req.onload = function () {
                return req.status === 200 ? resolve(req.response) : reject(Error(req.statusText));
            };
            req.onerror = function (e) {
                return reject(Error('Network Error: ' + e));
            };
            req.send();
        });
    }

    function setButtonState(button) {
        $filterButton.removeClass(buttonActive);
        button.addClass(buttonActive);
    }

    function isInViewport(element) {
        var elementTop = $(element).offset().top;
        var elementBottom = elementTop + $(element).outerHeight();
        var viewportTop = $(window).scrollTop();
        var viewportBottom = viewportTop + $(window).height();
        return elementBottom > viewportTop && elementTop < viewportBottom;
    }

    handleEvents();
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/filter-accordion.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var accordionEnabled = false;
    var accordion = null;

    function checkMediaQuery() {
        return window.matchMedia("(min-width: 768px)").matches;
    }

    function checkAccordion() {
        if (checkMediaQuery()) {
            disableAccordion();
        } else {
            enableAccordion();
        }
    }

    function disableAccordion() {

        // console.log('disableAccordion because min-width is 768px');

        if (accordionEnabled) {
            $('.js-filter-accordion').off('click.uk.accordion');
            $('.js-filter-accordion .uk-accordion-title').removeClass('uk-active');
            $('.js-filter-accordion .uk-accordion-content').unwrap().removeClass('uk-active');

            accordion = null;
            accordionEnabled = false;
        }
    }

    function enableAccordion() {
        // console.log('enableAccordion because max-width is 767px');

        if (!accordionEnabled) {
            accordion = UIkit.accordion($('.js-filter-accordion'), { collapse: false });
            accordionEnabled = true;

            // console.log(accordion);
        }
    }

    $('.js-filter-accordion').find('.tm-tooltip-icon').on('click', function (e) {
        e.preventDefault();
        return false;
    });

    UIkit.on('afterready.uk.dom', function () {
        if ($('.js-filter-accordion').length) {
            checkAccordion();
        }

        $(window).on('resize orientationchange', UIkit.Utils.debounce(function (event) {
            if ($('.js-filter-accordion').length) {
                checkAccordion();
            }
        }, 100));

        $('html').on('update.filter.accordion', function () {
            // console.log('update.filter.accordion');

            if ($('.js-filter-accordion').length) {
                accordionEnabled = false; // reinit after ajax
                checkAccordion();
            }
        });
    });
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/formhandler.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var scrollToFormError = function () {

        var container = $('.js-scroll-to-error');
        var anchor = $('.js-scroll-to-anchor');
        var error = '.invalid';

        function init() {
            if (container.find(error).length > 0) {
                setTimeout(function () {
                    $('body, html').animate({
                        scrollTop: anchor.offset().top
                    }, 500);
                }, 300);
            }
        }

        return {
            init: init
        };
    }();

    var validateContactForm = function () {

        var container = $('#contact-form');
        var errorClass = 'invalid';

        function init() {

            container.find('.js-submit-form').on('click', function (e) {
                e.preventDefault();

                container.find('.validationWrapper').removeClass(errorClass);

                var required = container.find('.required');
                $.each(required, function () {
                    if (!$(this).val()) {
                        $(this).parents('.validationWrapper').addClass(errorClass);
                    }
                });

                if (container.find('.' + errorClass).length < 1) {
                    grecaptcha.execute();
                }
            });
        }

        return {
            init: init
        };
    }();

    scrollToFormError.init();
    validateContactForm.init();
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/masonry-layout.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var imagesLoaded = require('imagesloaded');
    var Masonry = require('masonry-layout');
    var grid = document.querySelector('.js-msnry-grid');
    var msnry;

    if (!grid) {
        return;
    }

    imagesLoaded(grid, function () {
        msnry = new Masonry(grid, {
            gutter: 10,
            itemSelector: '.msnry-grid__item',
            columnWidth: '.msnry-grid__sizer',
            percentPosition: true
        });
    });
})(jQuery, window, window.document);

},{"imagesloaded":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/imagesloaded/imagesloaded.js","masonry-layout":"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/masonry.js"}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/onepager.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var init = null;
    var $element = $('.js-sticky-cta');

    function stickyCTA() {

        function init() {
            return UIkit.sticky($element, { top: 200 });
        }

        $element.on({
            'active.uk.sticky': function () {
                $element.css({ top: 'inherit', bottom: 0 });
                $('body').addClass('sticky-cta');
            },
            'inactive.uk.sticky': function () {
                $element.css({ top: '', bottom: '' });
                $('body').removeClass('sticky-cta');
            }
        });

        $(window).on('scroll load', function (event) {

            var top = $(document).scrollTop() + $(window).height();
            var footer = $(document).outerHeight() - $('.tm-footer').outerHeight();

            if (!$element.hasClass('uk-active')) {
                $element.css({ top: '', position: '' });
                return;
            }

            if (top >= footer) {
                $element.css({
                    top: footer - $element.outerHeight() - $('.js-sticky-header').outerHeight(),
                    bottom: '',
                    position: 'absolute'
                });
            } else {
                $element.css({
                    bottom: 0,
                    top: 'inherit',
                    // top: $(window).height() - $element.outerHeight(),
                    position: 'fixed'
                });
            }
        });

        init = init();
    }

    /*
     * Tabs sizer
    **/
    function tmTabs() {
        var container = $('.js-tm-tabs-inner');
        var elems = container.find('.tm-tabs-card');
        var containerW = 0;

        elems.each(function (i, e) {
            containerW += $(e).outerWidth(true);
        });
        container.css({ width: containerW });
        container.parents('.uk-sticky-placeholder').css({ height: container.find('.tm-tabs-card').first().outerHeight(true) });
    }

    $(window).on('resize', function () {
        var container = $('.js-tm-tabs-inner');
        var elems = container.find('.tm-tabs-card');
        var containerW = 0;
        container.css({ width: 1400 });

        setTimeout(function () {
            elems.each(function (i, e) {
                containerW += $(e).outerWidth(true);
            });
            container.css({ width: containerW });
        }, 250);
    });

    var stickyCTA = stickyCTA();
    var tmTabs = tmTabs();
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sharer.js":[function(require,module,exports){
/*
Possible Fields:
	uri     Alias: url, Fallback: location.href
	title   Fallback: og:title, <title>
	message Fallback: field title
	image   Fallback: og:image

All fields can be defined at a specific sharer or at the parent element as data tag:
<ul class="sharer" data-title="Sharer title" data-message="Full sharing message">
	<li class="twitter" data-message="Short twitter message"></li>
	<li class="facebook"></li>
</ul>

Sharers with used fields:
	facebook:   title, uri
	twitter:    message, uri
	googleplus: uri
	pinterest:  uri, image, message
	mail:       title, message, uri	- use &#10; für line breaks in message

*/
(function ($, window, document, undefined) {
  'use strict';

  var getter = {};

  getter.uri = function getUri(el) {
    var uri;

    uri = uri || el.data('uri');
    uri = uri || el.data('url');
    uri = uri || el.closest('.sharer').data('uri');
    uri = uri || el.closest('.sharer').data('url');
    uri = uri || location.href;

    return uri;
  };

  getter.title = function getTitle(el) {
    var title;

    title = title || el.data('title');
    title = title || el.closest('.sharer').data('title');
    title = title || $('meta[property="og:title"]').prop('content');
    title = title || $('title').text();

    return title;
  };

  getter.message = function getMessage(el) {
    var message;

    message = message || el.data('message');
    message = message || el.closest('.sharer').data('message');
    message = message || getter.title(el);

    return message;
  };

  getter.image = function getMessage(el) {
    var image;

    image = image || el.data('image');
    image = image || el.closest('.sharer').data('image');
    image = image || $('meta[property="og:image"]').prop('content');

    return image;
  };

  function popup(uri, width, height) {
    open(uri, 'sharer', 'width=' + width + ',height=' + height);
  }

  var shareHandlers = {
    facebook: {
      uri: 'https://www.facebook.com/sharer/sharer.php?u=%uri%&p[title]=%title%&display=popup',
      replacements: ['title', 'uri'],
      width: 650,
      height: 320
    },
    twitter: {
      uri: 'https://twitter.com/intent/tweet?text=%message%&url=%uri%',
      replacements: ['message', 'uri'],
      width: 520,
      height: 260
    },
    googleplus: {
      uri: 'https://plus.google.com/share?url=%uri%',
      replacements: ['uri'],
      width: 510,
      height: 390
    },
    pinterest: {
      uri: 'http://pinterest.com/pin/create/button/?url=%uri%&media=%image%&description=%message%',
      replacements: ['uri', 'image', 'message'],
      width: 510,
      height: 390
    },
    mail: {
      uri: 'mailto:?subject=%title%&body=%message% %uri%',
      replacements: ['title', 'message', 'uri'],
      handler: function (uri) {
        location.href = uri;
      }
    }
  };

  var init = function initSharer() {
    $.each(shareHandlers, function (name, values) {
      $('body').on('click touchend', '.sharer .' + name, function (e) {
        e.preventDefault();
        var el = $(this);
        var uri = values.uri;
        $.each(values.replacements, function (k, v) {
          uri = uri.replace(new RegExp('%' + v + '%'), encodeURIComponent(getter[v](el)));
        });
        var handler = values.handler || popup;
        handler(uri, values.width, values.height);
      });
    });
  };

  var self = {
    init: init,
    getter: getter,
    popup: popup,
    handlers: shareHandlers
  };

  self.init();
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/slideshow.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    // on slide change reset video inside last slide

    $('[data-uk-slideshow]').on('show.uk.slideshow', function (event, nextSlide, currentSlide) {
        var $slide = $(currentSlide),
            $video = $slide.find('video'),
            $videoContainer = $slide.find('.js-video'),
            $playControl = $slide.find('.js-video-play'),
            $pauseControl = $slide.find('.js-video-pause'),
            $muteControl = $slide.find('.js-video-mute');

        if ($video.length > 0) {
            $video.css('display', 'none');
            $video[0].pause();
            $videoContainer.removeClass('tm-video--is-playing');

            $pauseControl.css('display', 'none');
            $muteControl.css('display', 'none');
            $playControl.css('display', 'inline-block');

            $video[0].currentTime = 0;
        }
    });

    function capitalizeHeadlines() {
        var headlines = document.querySelectorAll('.fancy-headline');

        headlines.forEach(function (element) {

            var str = element.innerHTML;
            var letters = str.split('');
            var output = '';

            for (var i = 0; i < letters.length; i++) {

                if (isUpperCase(letters[i])) {
                    output += '<span class="cap">' + letters[i] + '</span>';
                } else {
                    output += letters[i];
                }
            }

            element.innerHTML = output;
        });
    }

    function isUpperCase(char) {
        return char == char.toUpperCase() && char != char.toLowerCase();
    }

    capitalizeHeadlines();
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/smooth-scroll.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var smoothScroller = null,
        $element = $('.js-smooth-scroll');

    $element.each(function () {
        var $this = $(this);

        $this.on('click', function () {
            var offsetAdd = 0;

            if ($(window).width() < 960) {
                offsetAdd = $('#tm-header').outerHeight();
            } else {
                offsetAdd = $('#tm-header').outerHeight() / 2;
            }

            var offset = $this.parents('.tm-block').outerHeight() + offsetAdd;

            $("html,body").stop().animate({ scrollTop: offset }, 1000, 'easeOutExpo');
        });
    });
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sticky-header.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var stickyHeader = null,
        $element = $('.js-sticky-header'),
        $header = $element.find('.tm-header'),
        $mobileMenu = $('#tm-menu-mobile'),
        $mobileMenuHook = $('.js-sticky-mobile-menu'),
        mobileMenuIsClosed = $mobileMenu.hasClass('tm-menu-mobile--is-closed'),
        shrinkTriggerOffset = 108,
        placeholderMinHeight = 62;

    function isMobile() {
        return !window.matchMedia('(min-width: 960px)').matches;
    }

    function onScrollShrink() {
        var scrollTop = $(window).scrollTop(),
            shrinkOn = shrinkTriggerOffset,
            clsactive = 'tm-header--small';

        if (scrollTop > shrinkOn) {
            $header.addClass(clsactive);
        } else {
            $header.removeClass(clsactive);
        }
    }

    function onMobileMenuClick() {
        // console.log('onMobileMenuClick');
        mobileMenuIsClosed = !mobileMenuIsClosed;

        $element.css({
            'position': 'fixed',
            'top': 0,
            'width': $(window).width()
        }).addClass('uk-active');

        if (mobileMenuIsClosed) {
            $element.css({
                'height': 'auto',
                'overflow-y': 'visible'
            });

            $('body, html').removeClass('js-disabled-scrolling');
        } else {
            $element.css({
                'height': '100%',
                'overflow-y': 'scroll'
            });

            $('body, html').addClass('js-disabled-scrolling');
        }

        stickyHeader.sticky.options.showup = mobileMenuIsClosed;
    }

    function recalcWrapperHeight() {
        var placeholderHeight = $element.outerHeight() > placeholderMinHeight ? $element.outerHeight() : placeholderMinHeight;
        $element.parent().height(placeholderHeight);
    }

    function initSticky() {
        var options = {
            animation: 'uk-animation-slide-top'
        };

        if (!isMobile()) {
            $(window).on('scroll', onScrollShrink);
        }

        $mobileMenuHook.on('click', onMobileMenuClick);

        return UIkit.sticky($element, options);
    }

    $(window).on('resize', UIkit.Utils.debounce(function (event) {

        // console.log('stateIsMobile', isMobile());
        // console.log('stickyHeader.options.showup', stickyHeader.options.showup);
        // console.log('stickyHeader.options.showup !== stateIsMobile', stickyHeader.options.showup !== isMobile());

        // if mobile (< 960px), remove listener for header shrinking and activate showup feature
        if (isMobile()) {
            $(window).off('scroll', onScrollShrink);

            if ($header.hasClass('tm-header--small')) {
                $header.removeClass('tm-header--small');
            }
        } else {
            $(window).on('scroll', onScrollShrink);
            onScrollShrink();
        }

        recalcWrapperHeight();
    }, 200));

    stickyHeader = initSticky();

    $(document).on('touchmove', '.js-disabled-scrolling', function (event) {
        var menuHeight = $mobileMenu.outerHeight() + $('#tm-header').outerHeight(),
            viewportHeight = $(window).outerHeight();

        if (menuHeight < viewportHeight) {
            event.preventDefault();
        }
    });
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sticky-submenu.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var init = null;
    var offsetTop = null;
    var $submenu = $('.js-sticky-submenu');
    var $tabmenu = $('.js-sticky-tabmenu');
    var $header = $('.js-sticky-header .tm-header');
    var offsetTopMedium = 102;
    var offsetTopSmall = 62;

    // Slide to anchor
    $('.js-section-menu a').on('click', function (e) {
        e.preventDefault();

        var href = $(this).attr('href');

        if ($(this).hasClass('js-link') || href.indexOf('#') == '-1') {
            window.location = $(this).attr('href');
        } else {
            var aTag = $($(this).attr('href'));

            $(this).closest('ul').find('.active').removeClass('active');
            $(this).closest('li').addClass('active');

            scrollTop(aTag);
        }
    });

    $('.js-section-menu-mobile').on('select2:selecting', function (e) {
        var aTag = $($('.js-section-menu-mobile').find('option:selected').attr('data-href'));

        if ($(this).find(":selected").hasClass('js-link')) {
            window.location = $(this).find(":selected").data('href');
        } else {
            scrollTop(aTag);
        }
    });

    function scrollTop(aTag) {
        if (!aTag.offset()) {
            return;
        }

        var offset = setOffsetTop() + $submenu.outerHeight(true);
        $('html,body').animate({ scrollTop: aTag.offset().top, ease: 'easeinout' }, 500);
    }

    function isMobile() {
        return !window.matchMedia('(min-width: 1220px)').matches;
    }

    function setOffsetTop() {

        var offsetTop = offsetTopSmall;

        if (!isMobile()) {
            offsetTop = offsetTopMedium;
        }

        return offsetTop;
    }

    function setOffsetTopTabs() {

        var offsetTop = offsetTopSmall;

        if (!isMobile()) {
            offsetTop = offsetTopMedium;
        }

        return offsetTop;
    }

    function stickySubmenu() {

        function init() {
            var options = {
                top: setOffsetTop(),
                animation: 'uk-animation-slide-top'
            };

            return UIkit.sticky($submenu, options);
        }

        $submenu.on({
            'active.uk.sticky': function () {
                $('body').addClass('sticky-submenu');
            },
            'inactive.uk.sticky': function () {
                $('body').removeClass('sticky-submenu');
            }
        });

        $(window).on('resize', UIkit.Utils.debounce(function (event) {

            UIkit.sticky($submenu).options.top = setOffsetTop();
        }, 200));

        init = init();
    }

    var stickySubmenu = stickySubmenu();

    function stickyTabmenu() {
        var elem = $('.js-sticky-tabmenu');

        function init() {
            var options = {
                top: setOffsetTopTabs(),
                animation: 'uk-animation-slide-top',
                boundary: '#boundary'
            };

            return UIkit.sticky(elem, options);
        }

        elem.on({
            'active.uk.sticky': function () {
                $('body').addClass('sticky-tabmenu');
            },
            'inactive.uk.sticky': function () {
                $('body').removeClass('sticky-tabmenu');
            }
        });

        $(window).on('resize', UIkit.Utils.debounce(function (event) {

            UIkit.sticky(elem).options.top = setOffsetTopTabs();
        }, 200));

        init = init();
    }

    var stickyTabmenu = stickyTabmenu();

    $('.js-sticky-tabmenu').on('show.uk.switcher', function () {
        if ($('.js-tabs-content').length) {
            setTimeout(function () {
                var offset = $('.js-tabs-content').offset().top - $('.js-sticky-tabmenu').outerHeight(true) - setOffsetTop();
                $('html,body').animate({ scrollTop: offset, ease: 'easeinout' }, 0);
            }, 50);
        }
    });
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/table.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    // Fill Table with empty items if needed

    function fillTable() {
        var container = $('.js-tm-table');
        var empty = '<div class="tm-table__grid tm-table__grid__item tm-table__grid--empty"></div>';
        var itemsArray = [];
        var maxRows = [];
        var fill = 0;

        $.each(container, function getItems(i) {
            itemsArray[i] = [];
            $(this).find('.tm-table-item').each(function getItemsInner(f) {
                var items = $(this).data('items');
                var cols = $(this).data('cols');
                var rows = Math.ceil(items / cols);

                itemsArray[i][f] = [items, cols, rows];

                if (maxRows[i] < rows || maxRows[i] === undefined) {
                    maxRows[i] = rows;
                }
            });
        });

        $.each(itemsArray, function setItems(i, e) {

            $.each(e, function setItemsInner(f, g) {

                if (g[1] == 1) {
                    if (g[3] != maxRows[i]) {
                        fill = maxRows[i] - g[0];

                        for (var m = 0; m < fill; m++) {
                            $('.js-tm-table:eq(' + i + ')').find('.tm-table-item:eq(' + f + ')').append($(empty));
                        }
                    }
                }

                if (g[1] == 3) {
                    if (g[3] != maxRows[i]) {
                        fill = maxRows[i] * g[1] - g[0];

                        for (var m = 0; m < fill; m++) {
                            $('.js-tm-table:eq(' + i + ')').find('.tm-table-item:eq(' + f + ')').find('.tm-table__grid__container').append($(empty));
                        }
                    }
                }
            });
        });
    }

    fillTable();
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/toggle-download-button.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var selector = $('.js-download-toggle input[type=checkbox]');
    var target = $('.js-download-button');

    selector.on('change', function toggleDownloadButton() {

        if (target.hasClass('panel-download--hidden')) {
            $(this).closest('div').fadeOut(function buttonFadeIn() {
                target.fadeIn().removeClass('panel-download--hidden');
            });
        }
    });
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/video.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var videoHover = function () {

        function init() {
            $('.js-video-hover').hover(function () {
                $(this).find('video')[0].play();
            }, function () {
                $(this).find('video')[0].pause();
                $(this).find('video')[0].currentTime = 0;
            });
        }

        return {
            init: init
        };
    }();

    var videoLinks = function () {

        function init() {
            $('.js-video-links').each(function () {
                var $links = $(this).find('.tm-panel-story__links li');
                var numberOfLinks = $links.length;

                // break if less than 2 links
                if (numberOfLinks <= 1) return;

                $links.each(function (index) {
                    var $link = $(this);
                    var $parentPanel = $link.parents('.js-panel-story');
                    var $videoElement = $parentPanel.find('video').eq(index);

                    $link.hover(function () {
                        // hide all videos
                        $parentPanel.find('video').css('display', 'none');
                        // show the correct video
                        $videoElement.css('display', 'inline');
                        // start playing
                        $videoElement[0].play();
                    }, function () {
                        // stop playing
                        $videoElement[0].pause();
                        // reset video
                        $videoElement[0].currentTime = 0;
                    });
                });
            });
        }

        return {
            init: init
        };
    }();

    var videoSwitchPoster = function () {

        function init() {

            //$(window).on('resize', function (e) {
            //    checkWindowWidth();
            //});

            checkWindowWidth();
        }

        function checkWindowWidth() {
            var wWidth = $(window).width();

            if (wWidth > 767) {
                changeVideoPoster('large');
            } else if (wWidth > 320) {
                changeVideoPoster('medium');
            } else {
                changeVideoPoster('small');
            }
        }

        function changeVideoPoster(posterSize) {

            $('video').each(function (i, element) {
                var posterUrl = $(element).data('poster-' + posterSize);
                $(element).attr('poster', posterUrl);
            });
        }

        return {
            init: init
        };
    }();

    var videoControls = function () {
        var $videoContainer = $('.js-video'),
            $video = $videoContainer.find('video'),
            $playControl = $('.js-video-play'),
            $pauseControl = $('.js-video-pause'),
            $muteControl = $('.js-video-mute');

        function init() {

            $playControl.on('click', function () {
                var $this = $(this),
                    video = $this.parents('.js-video').find('video')[0];

                $(video).css('display', 'block');

                video.play();

                if ($('html').hasClass('uk-touch') && window.matchMedia('(max-width: 1024px)').matches) {
                    handleFullScreen(video);

                    try {
                        if (video.requestFullscreen) {
                            video.requestFullscreen();
                        } else if (video.mozRequestFullScreen) {
                            video.mozRequestFullScreen();
                        } else if (video.webkitRequestFullscreen) {
                            video.webkitRequestFullscreen();
                        } else if (video.webkitEnterFullscreen) {
                            video.webkitEnterFullScreen();
                        }
                    } catch (e) {}
                } else {
                    $this.css('display', 'none');
                    $pauseControl.css('display', 'inline-block');
                    $muteControl.css('display', 'inline-block');

                    if (!$videoContainer.hasClass('tm-video---is-playing')) {
                        $videoContainer.addClass('tm-video--is-playing');
                    }
                }

                // if video ended hide it and show image
                $(video).on('ended', function (e) {
                    $(video).css('display', 'none');
                    video.currentTime = 0;
                    $videoContainer.removeClass('tm-video--is-playing');

                    $pauseControl.css('display', 'none');
                    $muteControl.css('display', 'none');
                    $playControl.css('display', 'inline-block');
                });
            });

            $pauseControl.on('click', function () {
                var element = this;
                handlePause(element);
            });

            $muteControl.on('click', function () {
                var $this = $(this),
                    video = $this.parents('.js-video').find('video')[0];

                video.muted ? video.muted = false : video.muted = true;

                $this.toggleClass('tm-video-controls__mute--is-muted');
            });
        }

        function handlePause(element) {
            var $this = $(element) || $(this),
                video = $this.parents('.js-video').find('video')[0];

            $this.css('display', 'none');
            $muteControl.css('display', 'none');
            $playControl.css('display', 'inline-block');

            video.pause();
            $videoContainer.removeClass('tm-video--is-playing');

            // console.log("$('html').hasClass('uk-touch') || window.matchMedia('(max-width: 768px)').matches", $('html').hasClass('uk-touch') || window.matchMedia('(max-width: 768px)').matches);

            if ($('html').hasClass('uk-touch') || window.matchMedia('(max-width: 768px)').matches) {
                $(video).css('display', 'none');
            }
        }

        function handleFullScreen(video) {
            var isFullScreen;

            // desktop chrome/safari/opera/firefox / mobile chrome
            $(document).on('webkitfullscreenchange mozfullscreenchange fullscreenchange ', function (event) {
                isFullScreen = checkFullScreen(video);

                if (!isFullScreen) {
                    handlePause(video);
                }
            });

            // ios safari
            $(video).on('webkitbeginfullscreen webkitendfullscreen', function (event) {
                isFullScreen = checkFullScreen(video);

                if (!isFullScreen) {
                    handlePause(video);
                }
            });
        }

        function checkFullScreen(video) {
            var isFullScreen;

            if (document.fullscreen) {
                isFullScreen = document.fullscreen;
            } else if (document.mozFullScreen) {
                isFullScreen = document.mozFullScreen;
            } else if (document.webkitIsFullScreen) {
                isFullScreen = document.webkitIsFullScreen;
            } else if (video.webkitDisplayingFullscreen) {
                isFullScreen = video.webkitDisplayingFullscreen;
            } else {
                isFullScreen = false;
            }

            // console.log(isFullScreen);

            return isFullScreen;
        }

        return {
            init: init
        };
    }();

    videoHover.init();
    videoLinks.init();
    videoSwitchPoster.init();
    videoControls.init();
})(jQuery, window, window.document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/shame.js":[function(require,module,exports){
$(function () {
    'use strict';

    var UtilsMatchHeights = function () {

        function matchHeights(selector) {
            UIkit.Utils.matchHeights(selector);
        }

        return {
            match: matchHeights
        };
    }();

    if ($('.js-panel-story > .tm-panel-story__bottom').length > 1) {
        $(window).on('load resize orientationchange', function () {
            UIkit.Utils.debounce(UtilsMatchHeights.match('.js-panel-story > .tm-panel-story__bottom'), 50);
        }());
    }

    $('.tm-header [data-uk-dropdown]').on('show.uk.dropdown', function () {

        var $sliderElement = $(this).find('.js-menu-desktop');
        var $sliderElements = $sliderElement.find('li');
        var sliderConf = { infinite: false };

        if ($sliderElement.length) {

            if ($sliderElements.length >= 4) {
                sliderConf = { infinite: true };
            }

            UIkit.slider($sliderElement, sliderConf);

            setTimeout(function () {
                // $(window).trigger('resize');
                //console.log('trigger window resize');
            }, 200);
        }

        setTimeout(function () {
            UtilsMatchHeights.match('.js-panel-story > .tm-panel-story__bottom');
            UtilsMatchHeights.match('.js-menu-desktop-dropdown-nav__item');

            // $(window).trigger('resize');
        }, 100);
    });

    $('select').select2({
        placeholder: '',
        minimumResultsForSearch: Infinity
    });

    $('[data-owlcontrol]').each(function () {
        $(this).owlControl();
    });
});

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/jquery.js":[function(require,module,exports){
/*!
 * jQuery JavaScript Library v2.2.4
 * http://jquery.com/
 *
 * Includes Sizzle.js
 * http://sizzlejs.com/
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 *
 * Date: 2016-05-20T17:23Z
 */

(function (global, factory) {

	if (typeof module === "object" && typeof module.exports === "object") {
		// For CommonJS and CommonJS-like environments where a proper `window`
		// is present, execute the factory and get jQuery.
		// For environments that do not have a `window` with a `document`
		// (such as Node.js), expose a factory as module.exports.
		// This accentuates the need for the creation of a real `window`.
		// e.g. var jQuery = require("jquery")(window);
		// See ticket #14549 for more info.
		module.exports = global.document ? factory(global, true) : function (w) {
			if (!w.document) {
				throw new Error("jQuery requires a window with a document");
			}
			return factory(w);
		};
	} else {
		factory(global);
	}

	// Pass this if window is not defined yet
})(typeof window !== "undefined" ? window : this, function (window, noGlobal) {

	// Support: Firefox 18+
	// Can't be in strict mode, several libs including ASP.NET trace
	// the stack via arguments.caller.callee and Firefox dies if
	// you try to trace through "use strict" call chains. (#13335)
	//"use strict";
	var arr = [];

	var document = window.document;

	var slice = arr.slice;

	var concat = arr.concat;

	var push = arr.push;

	var indexOf = arr.indexOf;

	var class2type = {};

	var toString = class2type.toString;

	var hasOwn = class2type.hasOwnProperty;

	var support = {};

	var version = "2.2.4",


	// Define a local copy of jQuery
	jQuery = function (selector, context) {

		// The jQuery object is actually just the init constructor 'enhanced'
		// Need init if jQuery is called (just allow error to be thrown if not included)
		return new jQuery.fn.init(selector, context);
	},


	// Support: Android<4.1
	// Make sure we trim BOM and NBSP
	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,


	// Matches dashed string for camelizing
	rmsPrefix = /^-ms-/,
	    rdashAlpha = /-([\da-z])/gi,


	// Used by jQuery.camelCase as callback to replace()
	fcamelCase = function (all, letter) {
		return letter.toUpperCase();
	};

	jQuery.fn = jQuery.prototype = {

		// The current version of jQuery being used
		jquery: version,

		constructor: jQuery,

		// Start with an empty selector
		selector: "",

		// The default length of a jQuery object is 0
		length: 0,

		toArray: function () {
			return slice.call(this);
		},

		// Get the Nth element in the matched element set OR
		// Get the whole matched element set as a clean array
		get: function (num) {
			return num != null ?

			// Return just the one element from the set
			num < 0 ? this[num + this.length] : this[num] :

			// Return all the elements in a clean array
			slice.call(this);
		},

		// Take an array of elements and push it onto the stack
		// (returning the new matched element set)
		pushStack: function (elems) {

			// Build a new jQuery matched element set
			var ret = jQuery.merge(this.constructor(), elems);

			// Add the old object onto the stack (as a reference)
			ret.prevObject = this;
			ret.context = this.context;

			// Return the newly-formed element set
			return ret;
		},

		// Execute a callback for every element in the matched set.
		each: function (callback) {
			return jQuery.each(this, callback);
		},

		map: function (callback) {
			return this.pushStack(jQuery.map(this, function (elem, i) {
				return callback.call(elem, i, elem);
			}));
		},

		slice: function () {
			return this.pushStack(slice.apply(this, arguments));
		},

		first: function () {
			return this.eq(0);
		},

		last: function () {
			return this.eq(-1);
		},

		eq: function (i) {
			var len = this.length,
			    j = +i + (i < 0 ? len : 0);
			return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
		},

		end: function () {
			return this.prevObject || this.constructor();
		},

		// For internal use only.
		// Behaves like an Array's method, not like a jQuery method.
		push: push,
		sort: arr.sort,
		splice: arr.splice
	};

	jQuery.extend = jQuery.fn.extend = function () {
		var options,
		    name,
		    src,
		    copy,
		    copyIsArray,
		    clone,
		    target = arguments[0] || {},
		    i = 1,
		    length = arguments.length,
		    deep = false;

		// Handle a deep copy situation
		if (typeof target === "boolean") {
			deep = target;

			// Skip the boolean and the target
			target = arguments[i] || {};
			i++;
		}

		// Handle case when target is a string or something (possible in deep copy)
		if (typeof target !== "object" && !jQuery.isFunction(target)) {
			target = {};
		}

		// Extend jQuery itself if only one argument is passed
		if (i === length) {
			target = this;
			i--;
		}

		for (; i < length; i++) {

			// Only deal with non-null/undefined values
			if ((options = arguments[i]) != null) {

				// Extend the base object
				for (name in options) {
					src = target[name];
					copy = options[name];

					// Prevent never-ending loop
					if (target === copy) {
						continue;
					}

					// Recurse if we're merging plain objects or arrays
					if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {

						if (copyIsArray) {
							copyIsArray = false;
							clone = src && jQuery.isArray(src) ? src : [];
						} else {
							clone = src && jQuery.isPlainObject(src) ? src : {};
						}

						// Never move original objects, clone them
						target[name] = jQuery.extend(deep, clone, copy);

						// Don't bring in undefined values
					} else if (copy !== undefined) {
						target[name] = copy;
					}
				}
			}
		}

		// Return the modified object
		return target;
	};

	jQuery.extend({

		// Unique for each copy of jQuery on the page
		expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),

		// Assume jQuery is ready without the ready module
		isReady: true,

		error: function (msg) {
			throw new Error(msg);
		},

		noop: function () {},

		isFunction: function (obj) {
			return jQuery.type(obj) === "function";
		},

		isArray: Array.isArray,

		isWindow: function (obj) {
			return obj != null && obj === obj.window;
		},

		isNumeric: function (obj) {

			// parseFloat NaNs numeric-cast false positives (null|true|false|"")
			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
			// subtraction forces infinities to NaN
			// adding 1 corrects loss of precision from parseFloat (#15100)
			var realStringObj = obj && obj.toString();
			return !jQuery.isArray(obj) && realStringObj - parseFloat(realStringObj) + 1 >= 0;
		},

		isPlainObject: function (obj) {
			var key;

			// Not plain objects:
			// - Any object or value whose internal [[Class]] property is not "[object Object]"
			// - DOM nodes
			// - window
			if (jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) {
				return false;
			}

			// Not own constructor property must be Object
			if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype || {}, "isPrototypeOf")) {
				return false;
			}

			// Own properties are enumerated firstly, so to speed up,
			// if last one is own, then all properties are own
			for (key in obj) {}

			return key === undefined || hasOwn.call(obj, key);
		},

		isEmptyObject: function (obj) {
			var name;
			for (name in obj) {
				return false;
			}
			return true;
		},

		type: function (obj) {
			if (obj == null) {
				return obj + "";
			}

			// Support: Android<4.0, iOS<6 (functionish RegExp)
			return typeof obj === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : typeof obj;
		},

		// Evaluates a script in a global context
		globalEval: function (code) {
			var script,
			    indirect = eval;

			code = jQuery.trim(code);

			if (code) {

				// If the code includes a valid, prologue position
				// strict mode pragma, execute code by injecting a
				// script tag into the document.
				if (code.indexOf("use strict") === 1) {
					script = document.createElement("script");
					script.text = code;
					document.head.appendChild(script).parentNode.removeChild(script);
				} else {

					// Otherwise, avoid the DOM node creation, insertion
					// and removal by using an indirect global eval

					indirect(code);
				}
			}
		},

		// Convert dashed to camelCase; used by the css and data modules
		// Support: IE9-11+
		// Microsoft forgot to hump their vendor prefix (#9572)
		camelCase: function (string) {
			return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
		},

		nodeName: function (elem, name) {
			return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
		},

		each: function (obj, callback) {
			var length,
			    i = 0;

			if (isArrayLike(obj)) {
				length = obj.length;
				for (; i < length; i++) {
					if (callback.call(obj[i], i, obj[i]) === false) {
						break;
					}
				}
			} else {
				for (i in obj) {
					if (callback.call(obj[i], i, obj[i]) === false) {
						break;
					}
				}
			}

			return obj;
		},

		// Support: Android<4.1
		trim: function (text) {
			return text == null ? "" : (text + "").replace(rtrim, "");
		},

		// results is for internal usage only
		makeArray: function (arr, results) {
			var ret = results || [];

			if (arr != null) {
				if (isArrayLike(Object(arr))) {
					jQuery.merge(ret, typeof arr === "string" ? [arr] : arr);
				} else {
					push.call(ret, arr);
				}
			}

			return ret;
		},

		inArray: function (elem, arr, i) {
			return arr == null ? -1 : indexOf.call(arr, elem, i);
		},

		merge: function (first, second) {
			var len = +second.length,
			    j = 0,
			    i = first.length;

			for (; j < len; j++) {
				first[i++] = second[j];
			}

			first.length = i;

			return first;
		},

		grep: function (elems, callback, invert) {
			var callbackInverse,
			    matches = [],
			    i = 0,
			    length = elems.length,
			    callbackExpect = !invert;

			// Go through the array, only saving the items
			// that pass the validator function
			for (; i < length; i++) {
				callbackInverse = !callback(elems[i], i);
				if (callbackInverse !== callbackExpect) {
					matches.push(elems[i]);
				}
			}

			return matches;
		},

		// arg is for internal usage only
		map: function (elems, callback, arg) {
			var length,
			    value,
			    i = 0,
			    ret = [];

			// Go through the array, translating each of the items to their new values
			if (isArrayLike(elems)) {
				length = elems.length;
				for (; i < length; i++) {
					value = callback(elems[i], i, arg);

					if (value != null) {
						ret.push(value);
					}
				}

				// Go through every key on the object,
			} else {
				for (i in elems) {
					value = callback(elems[i], i, arg);

					if (value != null) {
						ret.push(value);
					}
				}
			}

			// Flatten any nested arrays
			return concat.apply([], ret);
		},

		// A global GUID counter for objects
		guid: 1,

		// Bind a function to a context, optionally partially applying any
		// arguments.
		proxy: function (fn, context) {
			var tmp, args, proxy;

			if (typeof context === "string") {
				tmp = fn[context];
				context = fn;
				fn = tmp;
			}

			// Quick check to determine if target is callable, in the spec
			// this throws a TypeError, but we will just return undefined.
			if (!jQuery.isFunction(fn)) {
				return undefined;
			}

			// Simulated bind
			args = slice.call(arguments, 2);
			proxy = function () {
				return fn.apply(context || this, args.concat(slice.call(arguments)));
			};

			// Set the guid of unique handler to the same of original handler, so it can be removed
			proxy.guid = fn.guid = fn.guid || jQuery.guid++;

			return proxy;
		},

		now: Date.now,

		// jQuery.support is not used in Core but other projects attach their
		// properties to it so it needs to exist.
		support: support
	});

	// JSHint would error on this code due to the Symbol not being defined in ES5.
	// Defining this global in .jshintrc would create a danger of using the global
	// unguarded in another place, it seems safer to just disable JSHint for these
	// three lines.
	/* jshint ignore: start */
	if (typeof Symbol === "function") {
		jQuery.fn[Symbol.iterator] = arr[Symbol.iterator];
	}
	/* jshint ignore: end */

	// Populate the class2type map
	jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (i, name) {
		class2type["[object " + name + "]"] = name.toLowerCase();
	});

	function isArrayLike(obj) {

		// Support: iOS 8.2 (not reproducible in simulator)
		// `in` check used to prevent JIT error (gh-2145)
		// hasOwn isn't used here due to false negatives
		// regarding Nodelist length in IE
		var length = !!obj && "length" in obj && obj.length,
		    type = jQuery.type(obj);

		if (type === "function" || jQuery.isWindow(obj)) {
			return false;
		}

		return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj;
	}
	var Sizzle =
	/*!
  * Sizzle CSS Selector Engine v2.2.1
  * http://sizzlejs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
  * http://jquery.org/license
  *
  * Date: 2015-10-17
  */
	function (window) {

		var i,
		    support,
		    Expr,
		    getText,
		    isXML,
		    tokenize,
		    compile,
		    select,
		    outermostContext,
		    sortInput,
		    hasDuplicate,


		// Local document vars
		setDocument,
		    document,
		    docElem,
		    documentIsHTML,
		    rbuggyQSA,
		    rbuggyMatches,
		    matches,
		    contains,


		// Instance-specific data
		expando = "sizzle" + 1 * new Date(),
		    preferredDoc = window.document,
		    dirruns = 0,
		    done = 0,
		    classCache = createCache(),
		    tokenCache = createCache(),
		    compilerCache = createCache(),
		    sortOrder = function (a, b) {
			if (a === b) {
				hasDuplicate = true;
			}
			return 0;
		},


		// General-purpose constants
		MAX_NEGATIVE = 1 << 31,


		// Instance methods
		hasOwn = {}.hasOwnProperty,
		    arr = [],
		    pop = arr.pop,
		    push_native = arr.push,
		    push = arr.push,
		    slice = arr.slice,

		// Use a stripped-down indexOf as it's faster than native
		// http://jsperf.com/thor-indexof-vs-for/5
		indexOf = function (list, elem) {
			var i = 0,
			    len = list.length;
			for (; i < len; i++) {
				if (list[i] === elem) {
					return i;
				}
			}
			return -1;
		},
		    booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",


		// Regular expressions

		// http://www.w3.org/TR/css3-selectors/#whitespace
		whitespace = "[\\x20\\t\\r\\n\\f]",


		// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
		identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",


		// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
		attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
		// Operator (capture 2)
		"*([*^$|!~]?=)" + whitespace +
		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]",
		    pseudos = ":(" + identifier + ")(?:\\((" +
		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
		// 1. quoted (capture 3; capture 4 or capture 5)
		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
		// 2. simple (capture 6)
		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
		// 3. anything else (capture 2)
		".*" + ")\\)|)",


		// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
		rwhitespace = new RegExp(whitespace + "+", "g"),
		    rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),
		    rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
		    rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"),
		    rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"),
		    rpseudo = new RegExp(pseudos),
		    ridentifier = new RegExp("^" + identifier + "$"),
		    matchExpr = {
			"ID": new RegExp("^#(" + identifier + ")"),
			"CLASS": new RegExp("^\\.(" + identifier + ")"),
			"TAG": new RegExp("^(" + identifier + "|[*])"),
			"ATTR": new RegExp("^" + attributes),
			"PSEUDO": new RegExp("^" + pseudos),
			"CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
			"bool": new RegExp("^(?:" + booleans + ")$", "i"),
			// For use in libraries implementing .is()
			// We use this for POS matching in `select`
			"needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
		},
		    rinputs = /^(?:input|select|textarea|button)$/i,
		    rheader = /^h\d$/i,
		    rnative = /^[^{]+\{\s*\[native \w/,


		// Easily-parseable/retrievable ID or TAG or CLASS selectors
		rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
		    rsibling = /[+~]/,
		    rescape = /'|\\/g,


		// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
		runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"),
		    funescape = function (_, escaped, escapedWhitespace) {
			var high = "0x" + escaped - 0x10000;
			// NaN means non-codepoint
			// Support: Firefox<24
			// Workaround erroneous numeric interpretation of +"0x"
			return high !== high || escapedWhitespace ? escaped : high < 0 ?
			// BMP codepoint
			String.fromCharCode(high + 0x10000) :
			// Supplemental Plane codepoint (surrogate pair)
			String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);
		},


		// Used for iframes
		// See setDocument()
		// Removing the function wrapper causes a "Permission Denied"
		// error in IE
		unloadHandler = function () {
			setDocument();
		};

		// Optimize for push.apply( _, NodeList )
		try {
			push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes);
			// Support: Android<4.0
			// Detect silently failing push.apply
			arr[preferredDoc.childNodes.length].nodeType;
		} catch (e) {
			push = { apply: arr.length ?

				// Leverage slice if possible
				function (target, els) {
					push_native.apply(target, slice.call(els));
				} :

				// Support: IE<9
				// Otherwise append directly
				function (target, els) {
					var j = target.length,
					    i = 0;
					// Can't trust NodeList.length
					while (target[j++] = els[i++]) {}
					target.length = j - 1;
				}
			};
		}

		function Sizzle(selector, context, results, seed) {
			var m,
			    i,
			    elem,
			    nid,
			    nidselect,
			    match,
			    groups,
			    newSelector,
			    newContext = context && context.ownerDocument,


			// nodeType defaults to 9, since context defaults to document
			nodeType = context ? context.nodeType : 9;

			results = results || [];

			// Return early from calls with invalid selector or context
			if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {

				return results;
			}

			// Try to shortcut find operations (as opposed to filters) in HTML documents
			if (!seed) {

				if ((context ? context.ownerDocument || context : preferredDoc) !== document) {
					setDocument(context);
				}
				context = context || document;

				if (documentIsHTML) {

					// If the selector is sufficiently simple, try using a "get*By*" DOM method
					// (excepting DocumentFragment context, where the methods don't exist)
					if (nodeType !== 11 && (match = rquickExpr.exec(selector))) {

						// ID selector
						if (m = match[1]) {

							// Document context
							if (nodeType === 9) {
								if (elem = context.getElementById(m)) {

									// Support: IE, Opera, Webkit
									// TODO: identify versions
									// getElementById can match elements by name instead of ID
									if (elem.id === m) {
										results.push(elem);
										return results;
									}
								} else {
									return results;
								}

								// Element context
							} else {

								// Support: IE, Opera, Webkit
								// TODO: identify versions
								// getElementById can match elements by name instead of ID
								if (newContext && (elem = newContext.getElementById(m)) && contains(context, elem) && elem.id === m) {

									results.push(elem);
									return results;
								}
							}

							// Type selector
						} else if (match[2]) {
							push.apply(results, context.getElementsByTagName(selector));
							return results;

							// Class selector
						} else if ((m = match[3]) && support.getElementsByClassName && context.getElementsByClassName) {

							push.apply(results, context.getElementsByClassName(m));
							return results;
						}
					}

					// Take advantage of querySelectorAll
					if (support.qsa && !compilerCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector))) {

						if (nodeType !== 1) {
							newContext = context;
							newSelector = selector;

							// qSA looks outside Element context, which is not what we want
							// Thanks to Andrew Dupont for this workaround technique
							// Support: IE <=8
							// Exclude object elements
						} else if (context.nodeName.toLowerCase() !== "object") {

							// Capture the context ID, setting it first if necessary
							if (nid = context.getAttribute("id")) {
								nid = nid.replace(rescape, "\\$&");
							} else {
								context.setAttribute("id", nid = expando);
							}

							// Prefix every selector in the list
							groups = tokenize(selector);
							i = groups.length;
							nidselect = ridentifier.test(nid) ? "#" + nid : "[id='" + nid + "']";
							while (i--) {
								groups[i] = nidselect + " " + toSelector(groups[i]);
							}
							newSelector = groups.join(",");

							// Expand context for sibling selectors
							newContext = rsibling.test(selector) && testContext(context.parentNode) || context;
						}

						if (newSelector) {
							try {
								push.apply(results, newContext.querySelectorAll(newSelector));
								return results;
							} catch (qsaError) {} finally {
								if (nid === expando) {
									context.removeAttribute("id");
								}
							}
						}
					}
				}
			}

			// All others
			return select(selector.replace(rtrim, "$1"), context, results, seed);
		}

		/**
   * Create key-value caches of limited size
   * @returns {function(string, object)} Returns the Object data after storing it on itself with
   *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
   *	deleting the oldest entry
   */
		function createCache() {
			var keys = [];

			function cache(key, value) {
				// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
				if (keys.push(key + " ") > Expr.cacheLength) {
					// Only keep the most recent entries
					delete cache[keys.shift()];
				}
				return cache[key + " "] = value;
			}
			return cache;
		}

		/**
   * Mark a function for special use by Sizzle
   * @param {Function} fn The function to mark
   */
		function markFunction(fn) {
			fn[expando] = true;
			return fn;
		}

		/**
   * Support testing using an element
   * @param {Function} fn Passed the created div and expects a boolean result
   */
		function assert(fn) {
			var div = document.createElement("div");

			try {
				return !!fn(div);
			} catch (e) {
				return false;
			} finally {
				// Remove from its parent by default
				if (div.parentNode) {
					div.parentNode.removeChild(div);
				}
				// release memory in IE
				div = null;
			}
		}

		/**
   * Adds the same handler for all of the specified attrs
   * @param {String} attrs Pipe-separated list of attributes
   * @param {Function} handler The method that will be applied
   */
		function addHandle(attrs, handler) {
			var arr = attrs.split("|"),
			    i = arr.length;

			while (i--) {
				Expr.attrHandle[arr[i]] = handler;
			}
		}

		/**
   * Checks document order of two siblings
   * @param {Element} a
   * @param {Element} b
   * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
   */
		function siblingCheck(a, b) {
			var cur = b && a,
			    diff = cur && a.nodeType === 1 && b.nodeType === 1 && (~b.sourceIndex || MAX_NEGATIVE) - (~a.sourceIndex || MAX_NEGATIVE);

			// Use IE sourceIndex if available on both nodes
			if (diff) {
				return diff;
			}

			// Check if b follows a
			if (cur) {
				while (cur = cur.nextSibling) {
					if (cur === b) {
						return -1;
					}
				}
			}

			return a ? 1 : -1;
		}

		/**
   * Returns a function to use in pseudos for input types
   * @param {String} type
   */
		function createInputPseudo(type) {
			return function (elem) {
				var name = elem.nodeName.toLowerCase();
				return name === "input" && elem.type === type;
			};
		}

		/**
   * Returns a function to use in pseudos for buttons
   * @param {String} type
   */
		function createButtonPseudo(type) {
			return function (elem) {
				var name = elem.nodeName.toLowerCase();
				return (name === "input" || name === "button") && elem.type === type;
			};
		}

		/**
   * Returns a function to use in pseudos for positionals
   * @param {Function} fn
   */
		function createPositionalPseudo(fn) {
			return markFunction(function (argument) {
				argument = +argument;
				return markFunction(function (seed, matches) {
					var j,
					    matchIndexes = fn([], seed.length, argument),
					    i = matchIndexes.length;

					// Match elements found at the specified indexes
					while (i--) {
						if (seed[j = matchIndexes[i]]) {
							seed[j] = !(matches[j] = seed[j]);
						}
					}
				});
			});
		}

		/**
   * Checks a node for validity as a Sizzle context
   * @param {Element|Object=} context
   * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
   */
		function testContext(context) {
			return context && typeof context.getElementsByTagName !== "undefined" && context;
		}

		// Expose support vars for convenience
		support = Sizzle.support = {};

		/**
   * Detects XML nodes
   * @param {Element|Object} elem An element or a document
   * @returns {Boolean} True iff elem is a non-HTML XML node
   */
		isXML = Sizzle.isXML = function (elem) {
			// documentElement is verified for cases where it doesn't yet exist
			// (such as loading iframes in IE - #4833)
			var documentElement = elem && (elem.ownerDocument || elem).documentElement;
			return documentElement ? documentElement.nodeName !== "HTML" : false;
		};

		/**
   * Sets document-related variables once based on the current document
   * @param {Element|Object} [doc] An element or document object to use to set the document
   * @returns {Object} Returns the current document
   */
		setDocument = Sizzle.setDocument = function (node) {
			var hasCompare,
			    parent,
			    doc = node ? node.ownerDocument || node : preferredDoc;

			// Return early if doc is invalid or already selected
			if (doc === document || doc.nodeType !== 9 || !doc.documentElement) {
				return document;
			}

			// Update global variables
			document = doc;
			docElem = document.documentElement;
			documentIsHTML = !isXML(document);

			// Support: IE 9-11, Edge
			// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
			if ((parent = document.defaultView) && parent.top !== parent) {
				// Support: IE 11
				if (parent.addEventListener) {
					parent.addEventListener("unload", unloadHandler, false);

					// Support: IE 9 - 10 only
				} else if (parent.attachEvent) {
					parent.attachEvent("onunload", unloadHandler);
				}
			}

			/* Attributes
   ---------------------------------------------------------------------- */

			// Support: IE<8
			// Verify that getAttribute really returns attributes and not properties
			// (excepting IE8 booleans)
			support.attributes = assert(function (div) {
				div.className = "i";
				return !div.getAttribute("className");
			});

			/* getElement(s)By*
   ---------------------------------------------------------------------- */

			// Check if getElementsByTagName("*") returns only elements
			support.getElementsByTagName = assert(function (div) {
				div.appendChild(document.createComment(""));
				return !div.getElementsByTagName("*").length;
			});

			// Support: IE<9
			support.getElementsByClassName = rnative.test(document.getElementsByClassName);

			// Support: IE<10
			// Check if getElementById returns elements by name
			// The broken getElementById methods don't pick up programatically-set names,
			// so use a roundabout getElementsByName test
			support.getById = assert(function (div) {
				docElem.appendChild(div).id = expando;
				return !document.getElementsByName || !document.getElementsByName(expando).length;
			});

			// ID find and filter
			if (support.getById) {
				Expr.find["ID"] = function (id, context) {
					if (typeof context.getElementById !== "undefined" && documentIsHTML) {
						var m = context.getElementById(id);
						return m ? [m] : [];
					}
				};
				Expr.filter["ID"] = function (id) {
					var attrId = id.replace(runescape, funescape);
					return function (elem) {
						return elem.getAttribute("id") === attrId;
					};
				};
			} else {
				// Support: IE6/7
				// getElementById is not reliable as a find shortcut
				delete Expr.find["ID"];

				Expr.filter["ID"] = function (id) {
					var attrId = id.replace(runescape, funescape);
					return function (elem) {
						var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
						return node && node.value === attrId;
					};
				};
			}

			// Tag
			Expr.find["TAG"] = support.getElementsByTagName ? function (tag, context) {
				if (typeof context.getElementsByTagName !== "undefined") {
					return context.getElementsByTagName(tag);

					// DocumentFragment nodes don't have gEBTN
				} else if (support.qsa) {
					return context.querySelectorAll(tag);
				}
			} : function (tag, context) {
				var elem,
				    tmp = [],
				    i = 0,

				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
				results = context.getElementsByTagName(tag);

				// Filter out possible comments
				if (tag === "*") {
					while (elem = results[i++]) {
						if (elem.nodeType === 1) {
							tmp.push(elem);
						}
					}

					return tmp;
				}
				return results;
			};

			// Class
			Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) {
				if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) {
					return context.getElementsByClassName(className);
				}
			};

			/* QSA/matchesSelector
   ---------------------------------------------------------------------- */

			// QSA and matchesSelector support

			// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
			rbuggyMatches = [];

			// qSa(:focus) reports false when true (Chrome 21)
			// We allow this because of a bug in IE8/9 that throws an error
			// whenever `document.activeElement` is accessed on an iframe
			// So, we allow :focus to pass through QSA all the time to avoid the IE error
			// See http://bugs.jquery.com/ticket/13378
			rbuggyQSA = [];

			if (support.qsa = rnative.test(document.querySelectorAll)) {
				// Build QSA regex
				// Regex strategy adopted from Diego Perini
				assert(function (div) {
					// Select is set to empty string on purpose
					// This is to test IE's treatment of not explicitly
					// setting a boolean content attribute,
					// since its presence should be enough
					// http://bugs.jquery.com/ticket/12359
					docElem.appendChild(div).innerHTML = "<a id='" + expando + "'></a>" + "<select id='" + expando + "-\r\\' msallowcapture=''>" + "<option selected=''></option></select>";

					// Support: IE8, Opera 11-12.16
					// Nothing should be selected when empty strings follow ^= or $= or *=
					// The test attribute must be unknown in Opera but "safe" for WinRT
					// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
					if (div.querySelectorAll("[msallowcapture^='']").length) {
						rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")");
					}

					// Support: IE8
					// Boolean attributes and "value" are not treated correctly
					if (!div.querySelectorAll("[selected]").length) {
						rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
					}

					// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
					if (!div.querySelectorAll("[id~=" + expando + "-]").length) {
						rbuggyQSA.push("~=");
					}

					// Webkit/Opera - :checked should return selected option elements
					// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
					// IE8 throws error here and will not see later tests
					if (!div.querySelectorAll(":checked").length) {
						rbuggyQSA.push(":checked");
					}

					// Support: Safari 8+, iOS 8+
					// https://bugs.webkit.org/show_bug.cgi?id=136851
					// In-page `selector#id sibing-combinator selector` fails
					if (!div.querySelectorAll("a#" + expando + "+*").length) {
						rbuggyQSA.push(".#.+[+~]");
					}
				});

				assert(function (div) {
					// Support: Windows 8 Native Apps
					// The type and name attributes are restricted during .innerHTML assignment
					var input = document.createElement("input");
					input.setAttribute("type", "hidden");
					div.appendChild(input).setAttribute("name", "D");

					// Support: IE8
					// Enforce case-sensitivity of name attribute
					if (div.querySelectorAll("[name=d]").length) {
						rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");
					}

					// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
					// IE8 throws error here and will not see later tests
					if (!div.querySelectorAll(":enabled").length) {
						rbuggyQSA.push(":enabled", ":disabled");
					}

					// Opera 10-11 does not throw on post-comma invalid pseudos
					div.querySelectorAll("*,:x");
					rbuggyQSA.push(",.*:");
				});
			}

			if (support.matchesSelector = rnative.test(matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector)) {

				assert(function (div) {
					// Check to see if it's possible to do matchesSelector
					// on a disconnected node (IE 9)
					support.disconnectedMatch = matches.call(div, "div");

					// This should fail with an exception
					// Gecko does not error, returns false instead
					matches.call(div, "[s!='']:x");
					rbuggyMatches.push("!=", pseudos);
				});
			}

			rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
			rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|"));

			/* Contains
   ---------------------------------------------------------------------- */
			hasCompare = rnative.test(docElem.compareDocumentPosition);

			// Element contains another
			// Purposefully self-exclusive
			// As in, an element does not contain itself
			contains = hasCompare || rnative.test(docElem.contains) ? function (a, b) {
				var adown = a.nodeType === 9 ? a.documentElement : a,
				    bup = b && b.parentNode;
				return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));
			} : function (a, b) {
				if (b) {
					while (b = b.parentNode) {
						if (b === a) {
							return true;
						}
					}
				}
				return false;
			};

			/* Sorting
   ---------------------------------------------------------------------- */

			// Document order sorting
			sortOrder = hasCompare ? function (a, b) {

				// Flag for duplicate removal
				if (a === b) {
					hasDuplicate = true;
					return 0;
				}

				// Sort on method existence if only one input has compareDocumentPosition
				var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
				if (compare) {
					return compare;
				}

				// Calculate position if both inputs belong to the same document
				compare = (a.ownerDocument || a) === (b.ownerDocument || b) ? a.compareDocumentPosition(b) :

				// Otherwise we know they are disconnected
				1;

				// Disconnected nodes
				if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) {

					// Choose the first element that is related to our preferred document
					if (a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) {
						return -1;
					}
					if (b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) {
						return 1;
					}

					// Maintain original order
					return sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0;
				}

				return compare & 4 ? -1 : 1;
			} : function (a, b) {
				// Exit early if the nodes are identical
				if (a === b) {
					hasDuplicate = true;
					return 0;
				}

				var cur,
				    i = 0,
				    aup = a.parentNode,
				    bup = b.parentNode,
				    ap = [a],
				    bp = [b];

				// Parentless nodes are either documents or disconnected
				if (!aup || !bup) {
					return a === document ? -1 : b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0;

					// If the nodes are siblings, we can do a quick check
				} else if (aup === bup) {
					return siblingCheck(a, b);
				}

				// Otherwise we need full lists of their ancestors for comparison
				cur = a;
				while (cur = cur.parentNode) {
					ap.unshift(cur);
				}
				cur = b;
				while (cur = cur.parentNode) {
					bp.unshift(cur);
				}

				// Walk down the tree looking for a discrepancy
				while (ap[i] === bp[i]) {
					i++;
				}

				return i ?
				// Do a sibling check if the nodes have a common ancestor
				siblingCheck(ap[i], bp[i]) :

				// Otherwise nodes in our document sort first
				ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0;
			};

			return document;
		};

		Sizzle.matches = function (expr, elements) {
			return Sizzle(expr, null, null, elements);
		};

		Sizzle.matchesSelector = function (elem, expr) {
			// Set document vars if needed
			if ((elem.ownerDocument || elem) !== document) {
				setDocument(elem);
			}

			// Make sure that attribute selectors are quoted
			expr = expr.replace(rattributeQuotes, "='$1']");

			if (support.matchesSelector && documentIsHTML && !compilerCache[expr + " "] && (!rbuggyMatches || !rbuggyMatches.test(expr)) && (!rbuggyQSA || !rbuggyQSA.test(expr))) {

				try {
					var ret = matches.call(elem, expr);

					// IE 9's matchesSelector returns false on disconnected nodes
					if (ret || support.disconnectedMatch ||
					// As well, disconnected nodes are said to be in a document
					// fragment in IE 9
					elem.document && elem.document.nodeType !== 11) {
						return ret;
					}
				} catch (e) {}
			}

			return Sizzle(expr, document, null, [elem]).length > 0;
		};

		Sizzle.contains = function (context, elem) {
			// Set document vars if needed
			if ((context.ownerDocument || context) !== document) {
				setDocument(context);
			}
			return contains(context, elem);
		};

		Sizzle.attr = function (elem, name) {
			// Set document vars if needed
			if ((elem.ownerDocument || elem) !== document) {
				setDocument(elem);
			}

			var fn = Expr.attrHandle[name.toLowerCase()],

			// Don't get fooled by Object.prototype properties (jQuery #13807)
			val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined;

			return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute(name) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
		};

		Sizzle.error = function (msg) {
			throw new Error("Syntax error, unrecognized expression: " + msg);
		};

		/**
   * Document sorting and removing duplicates
   * @param {ArrayLike} results
   */
		Sizzle.uniqueSort = function (results) {
			var elem,
			    duplicates = [],
			    j = 0,
			    i = 0;

			// Unless we *know* we can detect duplicates, assume their presence
			hasDuplicate = !support.detectDuplicates;
			sortInput = !support.sortStable && results.slice(0);
			results.sort(sortOrder);

			if (hasDuplicate) {
				while (elem = results[i++]) {
					if (elem === results[i]) {
						j = duplicates.push(i);
					}
				}
				while (j--) {
					results.splice(duplicates[j], 1);
				}
			}

			// Clear input after sorting to release objects
			// See https://github.com/jquery/sizzle/pull/225
			sortInput = null;

			return results;
		};

		/**
   * Utility function for retrieving the text value of an array of DOM nodes
   * @param {Array|Element} elem
   */
		getText = Sizzle.getText = function (elem) {
			var node,
			    ret = "",
			    i = 0,
			    nodeType = elem.nodeType;

			if (!nodeType) {
				// If no nodeType, this is expected to be an array
				while (node = elem[i++]) {
					// Do not traverse comment nodes
					ret += getText(node);
				}
			} else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
				// Use textContent for elements
				// innerText usage removed for consistency of new lines (jQuery #11153)
				if (typeof elem.textContent === "string") {
					return elem.textContent;
				} else {
					// Traverse its children
					for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
						ret += getText(elem);
					}
				}
			} else if (nodeType === 3 || nodeType === 4) {
				return elem.nodeValue;
			}
			// Do not include comment or processing instruction nodes

			return ret;
		};

		Expr = Sizzle.selectors = {

			// Can be adjusted by the user
			cacheLength: 50,

			createPseudo: markFunction,

			match: matchExpr,

			attrHandle: {},

			find: {},

			relative: {
				">": { dir: "parentNode", first: true },
				" ": { dir: "parentNode" },
				"+": { dir: "previousSibling", first: true },
				"~": { dir: "previousSibling" }
			},

			preFilter: {
				"ATTR": function (match) {
					match[1] = match[1].replace(runescape, funescape);

					// Move the given value to match[3] whether quoted or unquoted
					match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);

					if (match[2] === "~=") {
						match[3] = " " + match[3] + " ";
					}

					return match.slice(0, 4);
				},

				"CHILD": function (match) {
					/* matches from matchExpr["CHILD"]
     	1 type (only|nth|...)
     	2 what (child|of-type)
     	3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
     	4 xn-component of xn+y argument ([+-]?\d*n|)
     	5 sign of xn-component
     	6 x of xn-component
     	7 sign of y-component
     	8 y of y-component
     */
					match[1] = match[1].toLowerCase();

					if (match[1].slice(0, 3) === "nth") {
						// nth-* requires argument
						if (!match[3]) {
							Sizzle.error(match[0]);
						}

						// numeric x and y parameters for Expr.filter.CHILD
						// remember that false/true cast respectively to 0/1
						match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd"));
						match[5] = +(match[7] + match[8] || match[3] === "odd");

						// other types prohibit arguments
					} else if (match[3]) {
						Sizzle.error(match[0]);
					}

					return match;
				},

				"PSEUDO": function (match) {
					var excess,
					    unquoted = !match[6] && match[2];

					if (matchExpr["CHILD"].test(match[0])) {
						return null;
					}

					// Accept quoted arguments as-is
					if (match[3]) {
						match[2] = match[4] || match[5] || "";

						// Strip excess characters from unquoted arguments
					} else if (unquoted && rpseudo.test(unquoted) && (
					// Get excess from tokenize (recursively)
					excess = tokenize(unquoted, true)) && (
					// advance to the next closing parenthesis
					excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {

						// excess is a negative index
						match[0] = match[0].slice(0, excess);
						match[2] = unquoted.slice(0, excess);
					}

					// Return only captures needed by the pseudo filter method (type and argument)
					return match.slice(0, 3);
				}
			},

			filter: {

				"TAG": function (nodeNameSelector) {
					var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
					return nodeNameSelector === "*" ? function () {
						return true;
					} : function (elem) {
						return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
					};
				},

				"CLASS": function (className) {
					var pattern = classCache[className + " "];

					return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function (elem) {
						return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "");
					});
				},

				"ATTR": function (name, operator, check) {
					return function (elem) {
						var result = Sizzle.attr(elem, name);

						if (result == null) {
							return operator === "!=";
						}
						if (!operator) {
							return true;
						}

						result += "";

						return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf(check) === 0 : operator === "*=" ? check && result.indexOf(check) > -1 : operator === "$=" ? check && result.slice(-check.length) === check : operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 : operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : false;
					};
				},

				"CHILD": function (type, what, argument, first, last) {
					var simple = type.slice(0, 3) !== "nth",
					    forward = type.slice(-4) !== "last",
					    ofType = what === "of-type";

					return first === 1 && last === 0 ?

					// Shortcut for :nth-*(n)
					function (elem) {
						return !!elem.parentNode;
					} : function (elem, context, xml) {
						var cache,
						    uniqueCache,
						    outerCache,
						    node,
						    nodeIndex,
						    start,
						    dir = simple !== forward ? "nextSibling" : "previousSibling",
						    parent = elem.parentNode,
						    name = ofType && elem.nodeName.toLowerCase(),
						    useCache = !xml && !ofType,
						    diff = false;

						if (parent) {

							// :(first|last|only)-(child|of-type)
							if (simple) {
								while (dir) {
									node = elem;
									while (node = node[dir]) {
										if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) {

											return false;
										}
									}
									// Reverse direction for :only-* (if we haven't yet done so)
									start = dir = type === "only" && !start && "nextSibling";
								}
								return true;
							}

							start = [forward ? parent.firstChild : parent.lastChild];

							// non-xml :nth-child(...) stores cache data on `parent`
							if (forward && useCache) {

								// Seek `elem` from a previously-cached index

								// ...in a gzip-friendly way
								node = parent;
								outerCache = node[expando] || (node[expando] = {});

								// Support: IE <9 only
								// Defend against cloned attroperties (jQuery gh-1709)
								uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});

								cache = uniqueCache[type] || [];
								nodeIndex = cache[0] === dirruns && cache[1];
								diff = nodeIndex && cache[2];
								node = nodeIndex && parent.childNodes[nodeIndex];

								while (node = ++nodeIndex && node && node[dir] || (

								// Fallback to seeking `elem` from the start
								diff = nodeIndex = 0) || start.pop()) {

									// When found, cache indexes on `parent` and break
									if (node.nodeType === 1 && ++diff && node === elem) {
										uniqueCache[type] = [dirruns, nodeIndex, diff];
										break;
									}
								}
							} else {
								// Use previously-cached element index if available
								if (useCache) {
									// ...in a gzip-friendly way
									node = elem;
									outerCache = node[expando] || (node[expando] = {});

									// Support: IE <9 only
									// Defend against cloned attroperties (jQuery gh-1709)
									uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});

									cache = uniqueCache[type] || [];
									nodeIndex = cache[0] === dirruns && cache[1];
									diff = nodeIndex;
								}

								// xml :nth-child(...)
								// or :nth-last-child(...) or :nth(-last)?-of-type(...)
								if (diff === false) {
									// Use the same loop as above to seek `elem` from the start
									while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) {

										if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) {

											// Cache the index of each encountered element
											if (useCache) {
												outerCache = node[expando] || (node[expando] = {});

												// Support: IE <9 only
												// Defend against cloned attroperties (jQuery gh-1709)
												uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});

												uniqueCache[type] = [dirruns, diff];
											}

											if (node === elem) {
												break;
											}
										}
									}
								}
							}

							// Incorporate the offset, then check against cycle size
							diff -= last;
							return diff === first || diff % first === 0 && diff / first >= 0;
						}
					};
				},

				"PSEUDO": function (pseudo, argument) {
					// pseudo-class names are case-insensitive
					// http://www.w3.org/TR/selectors/#pseudo-classes
					// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
					// Remember that setFilters inherits from pseudos
					var args,
					    fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || Sizzle.error("unsupported pseudo: " + pseudo);

					// The user may use createPseudo to indicate that
					// arguments are needed to create the filter function
					// just as Sizzle does
					if (fn[expando]) {
						return fn(argument);
					}

					// But maintain support for old signatures
					if (fn.length > 1) {
						args = [pseudo, pseudo, "", argument];
						return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) {
							var idx,
							    matched = fn(seed, argument),
							    i = matched.length;
							while (i--) {
								idx = indexOf(seed, matched[i]);
								seed[idx] = !(matches[idx] = matched[i]);
							}
						}) : function (elem) {
							return fn(elem, 0, args);
						};
					}

					return fn;
				}
			},

			pseudos: {
				// Potentially complex pseudos
				"not": markFunction(function (selector) {
					// Trim the selector passed to compile
					// to avoid treating leading and trailing
					// spaces as combinators
					var input = [],
					    results = [],
					    matcher = compile(selector.replace(rtrim, "$1"));

					return matcher[expando] ? markFunction(function (seed, matches, context, xml) {
						var elem,
						    unmatched = matcher(seed, null, xml, []),
						    i = seed.length;

						// Match elements unmatched by `matcher`
						while (i--) {
							if (elem = unmatched[i]) {
								seed[i] = !(matches[i] = elem);
							}
						}
					}) : function (elem, context, xml) {
						input[0] = elem;
						matcher(input, null, xml, results);
						// Don't keep the element (issue #299)
						input[0] = null;
						return !results.pop();
					};
				}),

				"has": markFunction(function (selector) {
					return function (elem) {
						return Sizzle(selector, elem).length > 0;
					};
				}),

				"contains": markFunction(function (text) {
					text = text.replace(runescape, funescape);
					return function (elem) {
						return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1;
					};
				}),

				// "Whether an element is represented by a :lang() selector
				// is based solely on the element's language value
				// being equal to the identifier C,
				// or beginning with the identifier C immediately followed by "-".
				// The matching of C against the element's language value is performed case-insensitively.
				// The identifier C does not have to be a valid language name."
				// http://www.w3.org/TR/selectors/#lang-pseudo
				"lang": markFunction(function (lang) {
					// lang value must be a valid identifier
					if (!ridentifier.test(lang || "")) {
						Sizzle.error("unsupported lang: " + lang);
					}
					lang = lang.replace(runescape, funescape).toLowerCase();
					return function (elem) {
						var elemLang;
						do {
							if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) {

								elemLang = elemLang.toLowerCase();
								return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
							}
						} while ((elem = elem.parentNode) && elem.nodeType === 1);
						return false;
					};
				}),

				// Miscellaneous
				"target": function (elem) {
					var hash = window.location && window.location.hash;
					return hash && hash.slice(1) === elem.id;
				},

				"root": function (elem) {
					return elem === docElem;
				},

				"focus": function (elem) {
					return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
				},

				// Boolean properties
				"enabled": function (elem) {
					return elem.disabled === false;
				},

				"disabled": function (elem) {
					return elem.disabled === true;
				},

				"checked": function (elem) {
					// In CSS3, :checked should return both checked and selected elements
					// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
					var nodeName = elem.nodeName.toLowerCase();
					return nodeName === "input" && !!elem.checked || nodeName === "option" && !!elem.selected;
				},

				"selected": function (elem) {
					// Accessing this property makes selected-by-default
					// options in Safari work properly
					if (elem.parentNode) {
						elem.parentNode.selectedIndex;
					}

					return elem.selected === true;
				},

				// Contents
				"empty": function (elem) {
					// http://www.w3.org/TR/selectors/#empty-pseudo
					// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
					//   but not by others (comment: 8; processing instruction: 7; etc.)
					// nodeType < 6 works because attributes (2) do not appear as children
					for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
						if (elem.nodeType < 6) {
							return false;
						}
					}
					return true;
				},

				"parent": function (elem) {
					return !Expr.pseudos["empty"](elem);
				},

				// Element/input types
				"header": function (elem) {
					return rheader.test(elem.nodeName);
				},

				"input": function (elem) {
					return rinputs.test(elem.nodeName);
				},

				"button": function (elem) {
					var name = elem.nodeName.toLowerCase();
					return name === "input" && elem.type === "button" || name === "button";
				},

				"text": function (elem) {
					var attr;
					return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && (

					// Support: IE<8
					// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
					(attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text");
				},

				// Position-in-collection
				"first": createPositionalPseudo(function () {
					return [0];
				}),

				"last": createPositionalPseudo(function (matchIndexes, length) {
					return [length - 1];
				}),

				"eq": createPositionalPseudo(function (matchIndexes, length, argument) {
					return [argument < 0 ? argument + length : argument];
				}),

				"even": createPositionalPseudo(function (matchIndexes, length) {
					var i = 0;
					for (; i < length; i += 2) {
						matchIndexes.push(i);
					}
					return matchIndexes;
				}),

				"odd": createPositionalPseudo(function (matchIndexes, length) {
					var i = 1;
					for (; i < length; i += 2) {
						matchIndexes.push(i);
					}
					return matchIndexes;
				}),

				"lt": createPositionalPseudo(function (matchIndexes, length, argument) {
					var i = argument < 0 ? argument + length : argument;
					for (; --i >= 0;) {
						matchIndexes.push(i);
					}
					return matchIndexes;
				}),

				"gt": createPositionalPseudo(function (matchIndexes, length, argument) {
					var i = argument < 0 ? argument + length : argument;
					for (; ++i < length;) {
						matchIndexes.push(i);
					}
					return matchIndexes;
				})
			}
		};

		Expr.pseudos["nth"] = Expr.pseudos["eq"];

		// Add button/input type pseudos
		for (i in { radio: true, checkbox: true, file: true, password: true, image: true }) {
			Expr.pseudos[i] = createInputPseudo(i);
		}
		for (i in { submit: true, reset: true }) {
			Expr.pseudos[i] = createButtonPseudo(i);
		}

		// Easy API for creating new setFilters
		function setFilters() {}
		setFilters.prototype = Expr.filters = Expr.pseudos;
		Expr.setFilters = new setFilters();

		tokenize = Sizzle.tokenize = function (selector, parseOnly) {
			var matched,
			    match,
			    tokens,
			    type,
			    soFar,
			    groups,
			    preFilters,
			    cached = tokenCache[selector + " "];

			if (cached) {
				return parseOnly ? 0 : cached.slice(0);
			}

			soFar = selector;
			groups = [];
			preFilters = Expr.preFilter;

			while (soFar) {

				// Comma and first run
				if (!matched || (match = rcomma.exec(soFar))) {
					if (match) {
						// Don't consume trailing commas as valid
						soFar = soFar.slice(match[0].length) || soFar;
					}
					groups.push(tokens = []);
				}

				matched = false;

				// Combinators
				if (match = rcombinators.exec(soFar)) {
					matched = match.shift();
					tokens.push({
						value: matched,
						// Cast descendant combinators to space
						type: match[0].replace(rtrim, " ")
					});
					soFar = soFar.slice(matched.length);
				}

				// Filters
				for (type in Expr.filter) {
					if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {
						matched = match.shift();
						tokens.push({
							value: matched,
							type: type,
							matches: match
						});
						soFar = soFar.slice(matched.length);
					}
				}

				if (!matched) {
					break;
				}
			}

			// Return the length of the invalid excess
			// if we're just parsing
			// Otherwise, throw an error or return tokens
			return parseOnly ? soFar.length : soFar ? Sizzle.error(selector) :
			// Cache the tokens
			tokenCache(selector, groups).slice(0);
		};

		function toSelector(tokens) {
			var i = 0,
			    len = tokens.length,
			    selector = "";
			for (; i < len; i++) {
				selector += tokens[i].value;
			}
			return selector;
		}

		function addCombinator(matcher, combinator, base) {
			var dir = combinator.dir,
			    checkNonElements = base && dir === "parentNode",
			    doneName = done++;

			return combinator.first ?
			// Check against closest ancestor/preceding element
			function (elem, context, xml) {
				while (elem = elem[dir]) {
					if (elem.nodeType === 1 || checkNonElements) {
						return matcher(elem, context, xml);
					}
				}
			} :

			// Check against all ancestor/preceding elements
			function (elem, context, xml) {
				var oldCache,
				    uniqueCache,
				    outerCache,
				    newCache = [dirruns, doneName];

				// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
				if (xml) {
					while (elem = elem[dir]) {
						if (elem.nodeType === 1 || checkNonElements) {
							if (matcher(elem, context, xml)) {
								return true;
							}
						}
					}
				} else {
					while (elem = elem[dir]) {
						if (elem.nodeType === 1 || checkNonElements) {
							outerCache = elem[expando] || (elem[expando] = {});

							// Support: IE <9 only
							// Defend against cloned attroperties (jQuery gh-1709)
							uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {});

							if ((oldCache = uniqueCache[dir]) && oldCache[0] === dirruns && oldCache[1] === doneName) {

								// Assign to newCache so results back-propagate to previous elements
								return newCache[2] = oldCache[2];
							} else {
								// Reuse newcache so results back-propagate to previous elements
								uniqueCache[dir] = newCache;

								// A match means we're done; a fail means we have to keep checking
								if (newCache[2] = matcher(elem, context, xml)) {
									return true;
								}
							}
						}
					}
				}
			};
		}

		function elementMatcher(matchers) {
			return matchers.length > 1 ? function (elem, context, xml) {
				var i = matchers.length;
				while (i--) {
					if (!matchers[i](elem, context, xml)) {
						return false;
					}
				}
				return true;
			} : matchers[0];
		}

		function multipleContexts(selector, contexts, results) {
			var i = 0,
			    len = contexts.length;
			for (; i < len; i++) {
				Sizzle(selector, contexts[i], results);
			}
			return results;
		}

		function condense(unmatched, map, filter, context, xml) {
			var elem,
			    newUnmatched = [],
			    i = 0,
			    len = unmatched.length,
			    mapped = map != null;

			for (; i < len; i++) {
				if (elem = unmatched[i]) {
					if (!filter || filter(elem, context, xml)) {
						newUnmatched.push(elem);
						if (mapped) {
							map.push(i);
						}
					}
				}
			}

			return newUnmatched;
		}

		function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
			if (postFilter && !postFilter[expando]) {
				postFilter = setMatcher(postFilter);
			}
			if (postFinder && !postFinder[expando]) {
				postFinder = setMatcher(postFinder, postSelector);
			}
			return markFunction(function (seed, results, context, xml) {
				var temp,
				    i,
				    elem,
				    preMap = [],
				    postMap = [],
				    preexisting = results.length,


				// Get initial elements from seed or context
				elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []),


				// Prefilter to get matcher input, preserving a map for seed-results synchronization
				matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems,
				    matcherOut = matcher ?
				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
				postFinder || (seed ? preFilter : preexisting || postFilter) ?

				// ...intermediate processing is necessary
				[] :

				// ...otherwise use results directly
				results : matcherIn;

				// Find primary matches
				if (matcher) {
					matcher(matcherIn, matcherOut, context, xml);
				}

				// Apply postFilter
				if (postFilter) {
					temp = condense(matcherOut, postMap);
					postFilter(temp, [], context, xml);

					// Un-match failing elements by moving them back to matcherIn
					i = temp.length;
					while (i--) {
						if (elem = temp[i]) {
							matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
						}
					}
				}

				if (seed) {
					if (postFinder || preFilter) {
						if (postFinder) {
							// Get the final matcherOut by condensing this intermediate into postFinder contexts
							temp = [];
							i = matcherOut.length;
							while (i--) {
								if (elem = matcherOut[i]) {
									// Restore matcherIn since elem is not yet a final match
									temp.push(matcherIn[i] = elem);
								}
							}
							postFinder(null, matcherOut = [], temp, xml);
						}

						// Move matched elements from seed to results to keep them synchronized
						i = matcherOut.length;
						while (i--) {
							if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) {

								seed[temp] = !(results[temp] = elem);
							}
						}
					}

					// Add elements to results, through postFinder if defined
				} else {
					matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut);
					if (postFinder) {
						postFinder(null, results, matcherOut, xml);
					} else {
						push.apply(results, matcherOut);
					}
				}
			});
		}

		function matcherFromTokens(tokens) {
			var checkContext,
			    matcher,
			    j,
			    len = tokens.length,
			    leadingRelative = Expr.relative[tokens[0].type],
			    implicitRelative = leadingRelative || Expr.relative[" "],
			    i = leadingRelative ? 1 : 0,


			// The foundational matcher ensures that elements are reachable from top-level context(s)
			matchContext = addCombinator(function (elem) {
				return elem === checkContext;
			}, implicitRelative, true),
			    matchAnyContext = addCombinator(function (elem) {
				return indexOf(checkContext, elem) > -1;
			}, implicitRelative, true),
			    matchers = [function (elem, context, xml) {
				var ret = !leadingRelative && (xml || context !== outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml));
				// Avoid hanging onto element (issue #299)
				checkContext = null;
				return ret;
			}];

			for (; i < len; i++) {
				if (matcher = Expr.relative[tokens[i].type]) {
					matchers = [addCombinator(elementMatcher(matchers), matcher)];
				} else {
					matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);

					// Return special upon seeing a positional matcher
					if (matcher[expando]) {
						// Find the next relative operator (if any) for proper handling
						j = ++i;
						for (; j < len; j++) {
							if (Expr.relative[tokens[j].type]) {
								break;
							}
						}
						return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector(
						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
						tokens.slice(0, i - 1).concat({ value: tokens[i - 2].type === " " ? "*" : "" })).replace(rtrim, "$1"), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens));
					}
					matchers.push(matcher);
				}
			}

			return elementMatcher(matchers);
		}

		function matcherFromGroupMatchers(elementMatchers, setMatchers) {
			var bySet = setMatchers.length > 0,
			    byElement = elementMatchers.length > 0,
			    superMatcher = function (seed, context, xml, results, outermost) {
				var elem,
				    j,
				    matcher,
				    matchedCount = 0,
				    i = "0",
				    unmatched = seed && [],
				    setMatched = [],
				    contextBackup = outermostContext,

				// We must always have either seed elements or outermost context
				elems = seed || byElement && Expr.find["TAG"]("*", outermost),

				// Use integer dirruns iff this is the outermost matcher
				dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1,
				    len = elems.length;

				if (outermost) {
					outermostContext = context === document || context || outermost;
				}

				// Add elements passing elementMatchers directly to results
				// Support: IE<9, Safari
				// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
				for (; i !== len && (elem = elems[i]) != null; i++) {
					if (byElement && elem) {
						j = 0;
						if (!context && elem.ownerDocument !== document) {
							setDocument(elem);
							xml = !documentIsHTML;
						}
						while (matcher = elementMatchers[j++]) {
							if (matcher(elem, context || document, xml)) {
								results.push(elem);
								break;
							}
						}
						if (outermost) {
							dirruns = dirrunsUnique;
						}
					}

					// Track unmatched elements for set filters
					if (bySet) {
						// They will have gone through all possible matchers
						if (elem = !matcher && elem) {
							matchedCount--;
						}

						// Lengthen the array for every element, matched or not
						if (seed) {
							unmatched.push(elem);
						}
					}
				}

				// `i` is now the count of elements visited above, and adding it to `matchedCount`
				// makes the latter nonnegative.
				matchedCount += i;

				// Apply set filters to unmatched elements
				// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
				// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
				// no element matchers and no seed.
				// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
				// case, which will result in a "00" `matchedCount` that differs from `i` but is also
				// numerically zero.
				if (bySet && i !== matchedCount) {
					j = 0;
					while (matcher = setMatchers[j++]) {
						matcher(unmatched, setMatched, context, xml);
					}

					if (seed) {
						// Reintegrate element matches to eliminate the need for sorting
						if (matchedCount > 0) {
							while (i--) {
								if (!(unmatched[i] || setMatched[i])) {
									setMatched[i] = pop.call(results);
								}
							}
						}

						// Discard index placeholder values to get only actual matches
						setMatched = condense(setMatched);
					}

					// Add matches to results
					push.apply(results, setMatched);

					// Seedless set matches succeeding multiple successful matchers stipulate sorting
					if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {

						Sizzle.uniqueSort(results);
					}
				}

				// Override manipulation of globals by nested matchers
				if (outermost) {
					dirruns = dirrunsUnique;
					outermostContext = contextBackup;
				}

				return unmatched;
			};

			return bySet ? markFunction(superMatcher) : superMatcher;
		}

		compile = Sizzle.compile = function (selector, match /* Internal Use Only */) {
			var i,
			    setMatchers = [],
			    elementMatchers = [],
			    cached = compilerCache[selector + " "];

			if (!cached) {
				// Generate a function of recursive functions that can be used to check each element
				if (!match) {
					match = tokenize(selector);
				}
				i = match.length;
				while (i--) {
					cached = matcherFromTokens(match[i]);
					if (cached[expando]) {
						setMatchers.push(cached);
					} else {
						elementMatchers.push(cached);
					}
				}

				// Cache the compiled function
				cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));

				// Save selector and tokenization
				cached.selector = selector;
			}
			return cached;
		};

		/**
   * A low-level selection function that works with Sizzle's compiled
   *  selector functions
   * @param {String|Function} selector A selector or a pre-compiled
   *  selector function built with Sizzle.compile
   * @param {Element} context
   * @param {Array} [results]
   * @param {Array} [seed] A set of elements to match against
   */
		select = Sizzle.select = function (selector, context, results, seed) {
			var i,
			    tokens,
			    token,
			    type,
			    find,
			    compiled = typeof selector === "function" && selector,
			    match = !seed && tokenize(selector = compiled.selector || selector);

			results = results || [];

			// Try to minimize operations if there is only one selector in the list and no seed
			// (the latter of which guarantees us context)
			if (match.length === 1) {

				// Reduce context if the leading compound selector is an ID
				tokens = match[0] = match[0].slice(0);
				if (tokens.length > 2 && (token = tokens[0]).type === "ID" && support.getById && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {

					context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0];
					if (!context) {
						return results;

						// Precompiled matchers will still verify ancestry, so step up a level
					} else if (compiled) {
						context = context.parentNode;
					}

					selector = selector.slice(tokens.shift().value.length);
				}

				// Fetch a seed set for right-to-left matching
				i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;
				while (i--) {
					token = tokens[i];

					// Abort if we hit a combinator
					if (Expr.relative[type = token.type]) {
						break;
					}
					if (find = Expr.find[type]) {
						// Search, expanding context for leading sibling combinators
						if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testContext(context.parentNode) || context)) {

							// If seed is empty or no tokens remain, we can return early
							tokens.splice(i, 1);
							selector = seed.length && toSelector(tokens);
							if (!selector) {
								push.apply(results, seed);
								return results;
							}

							break;
						}
					}
				}
			}

			// Compile and execute a filtering function if one is not provided
			// Provide `match` to avoid retokenization if we modified the selector above
			(compiled || compile(selector, match))(seed, context, !documentIsHTML, results, !context || rsibling.test(selector) && testContext(context.parentNode) || context);
			return results;
		};

		// One-time assignments

		// Sort stability
		support.sortStable = expando.split("").sort(sortOrder).join("") === expando;

		// Support: Chrome 14-35+
		// Always assume duplicates if they aren't passed to the comparison function
		support.detectDuplicates = !!hasDuplicate;

		// Initialize against the default document
		setDocument();

		// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
		// Detached nodes confoundingly follow *each other*
		support.sortDetached = assert(function (div1) {
			// Should return 1, but returns 4 (following)
			return div1.compareDocumentPosition(document.createElement("div")) & 1;
		});

		// Support: IE<8
		// Prevent attribute/property "interpolation"
		// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
		if (!assert(function (div) {
			div.innerHTML = "<a href='#'></a>";
			return div.firstChild.getAttribute("href") === "#";
		})) {
			addHandle("type|href|height|width", function (elem, name, isXML) {
				if (!isXML) {
					return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2);
				}
			});
		}

		// Support: IE<9
		// Use defaultValue in place of getAttribute("value")
		if (!support.attributes || !assert(function (div) {
			div.innerHTML = "<input/>";
			div.firstChild.setAttribute("value", "");
			return div.firstChild.getAttribute("value") === "";
		})) {
			addHandle("value", function (elem, name, isXML) {
				if (!isXML && elem.nodeName.toLowerCase() === "input") {
					return elem.defaultValue;
				}
			});
		}

		// Support: IE<9
		// Use getAttributeNode to fetch booleans when getAttribute lies
		if (!assert(function (div) {
			return div.getAttribute("disabled") == null;
		})) {
			addHandle(booleans, function (elem, name, isXML) {
				var val;
				if (!isXML) {
					return elem[name] === true ? name.toLowerCase() : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
				}
			});
		}

		return Sizzle;
	}(window);

	jQuery.find = Sizzle;
	jQuery.expr = Sizzle.selectors;
	jQuery.expr[":"] = jQuery.expr.pseudos;
	jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
	jQuery.text = Sizzle.getText;
	jQuery.isXMLDoc = Sizzle.isXML;
	jQuery.contains = Sizzle.contains;

	var dir = function (elem, dir, until) {
		var matched = [],
		    truncate = until !== undefined;

		while ((elem = elem[dir]) && elem.nodeType !== 9) {
			if (elem.nodeType === 1) {
				if (truncate && jQuery(elem).is(until)) {
					break;
				}
				matched.push(elem);
			}
		}
		return matched;
	};

	var siblings = function (n, elem) {
		var matched = [];

		for (; n; n = n.nextSibling) {
			if (n.nodeType === 1 && n !== elem) {
				matched.push(n);
			}
		}

		return matched;
	};

	var rneedsContext = jQuery.expr.match.needsContext;

	var rsingleTag = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/;

	var risSimple = /^.[^:#\[\.,]*$/;

	// Implement the identical functionality for filter and not
	function winnow(elements, qualifier, not) {
		if (jQuery.isFunction(qualifier)) {
			return jQuery.grep(elements, function (elem, i) {
				/* jshint -W018 */
				return !!qualifier.call(elem, i, elem) !== not;
			});
		}

		if (qualifier.nodeType) {
			return jQuery.grep(elements, function (elem) {
				return elem === qualifier !== not;
			});
		}

		if (typeof qualifier === "string") {
			if (risSimple.test(qualifier)) {
				return jQuery.filter(qualifier, elements, not);
			}

			qualifier = jQuery.filter(qualifier, elements);
		}

		return jQuery.grep(elements, function (elem) {
			return indexOf.call(qualifier, elem) > -1 !== not;
		});
	}

	jQuery.filter = function (expr, elems, not) {
		var elem = elems[0];

		if (not) {
			expr = ":not(" + expr + ")";
		}

		return elems.length === 1 && elem.nodeType === 1 ? jQuery.find.matchesSelector(elem, expr) ? [elem] : [] : jQuery.find.matches(expr, jQuery.grep(elems, function (elem) {
			return elem.nodeType === 1;
		}));
	};

	jQuery.fn.extend({
		find: function (selector) {
			var i,
			    len = this.length,
			    ret = [],
			    self = this;

			if (typeof selector !== "string") {
				return this.pushStack(jQuery(selector).filter(function () {
					for (i = 0; i < len; i++) {
						if (jQuery.contains(self[i], this)) {
							return true;
						}
					}
				}));
			}

			for (i = 0; i < len; i++) {
				jQuery.find(selector, self[i], ret);
			}

			// Needed because $( selector, context ) becomes $( context ).find( selector )
			ret = this.pushStack(len > 1 ? jQuery.unique(ret) : ret);
			ret.selector = this.selector ? this.selector + " " + selector : selector;
			return ret;
		},
		filter: function (selector) {
			return this.pushStack(winnow(this, selector || [], false));
		},
		not: function (selector) {
			return this.pushStack(winnow(this, selector || [], true));
		},
		is: function (selector) {
			return !!winnow(this,

			// If this is a positional/relative selector, check membership in the returned set
			// so $("p:first").is("p:last") won't return true for a doc with two "p".
			typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length;
		}
	});

	// Initialize a jQuery object


	// A central reference to the root jQuery(document)
	var rootjQuery,


	// A simple way to check for HTML strings
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
	// Strict HTML recognition (#11290: must start with <)
	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
	    init = jQuery.fn.init = function (selector, context, root) {
		var match, elem;

		// HANDLE: $(""), $(null), $(undefined), $(false)
		if (!selector) {
			return this;
		}

		// Method init() accepts an alternate rootjQuery
		// so migrate can support jQuery.sub (gh-2101)
		root = root || rootjQuery;

		// Handle HTML strings
		if (typeof selector === "string") {
			if (selector[0] === "<" && selector[selector.length - 1] === ">" && selector.length >= 3) {

				// Assume that strings that start and end with <> are HTML and skip the regex check
				match = [null, selector, null];
			} else {
				match = rquickExpr.exec(selector);
			}

			// Match html or make sure no context is specified for #id
			if (match && (match[1] || !context)) {

				// HANDLE: $(html) -> $(array)
				if (match[1]) {
					context = context instanceof jQuery ? context[0] : context;

					// Option to run scripts is true for back-compat
					// Intentionally let the error be thrown if parseHTML is not present
					jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document, true));

					// HANDLE: $(html, props)
					if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
						for (match in context) {

							// Properties of context are called as methods if possible
							if (jQuery.isFunction(this[match])) {
								this[match](context[match]);

								// ...and otherwise set as attributes
							} else {
								this.attr(match, context[match]);
							}
						}
					}

					return this;

					// HANDLE: $(#id)
				} else {
					elem = document.getElementById(match[2]);

					// Support: Blackberry 4.6
					// gEBID returns nodes no longer in the document (#6963)
					if (elem && elem.parentNode) {

						// Inject the element directly into the jQuery object
						this.length = 1;
						this[0] = elem;
					}

					this.context = document;
					this.selector = selector;
					return this;
				}

				// HANDLE: $(expr, $(...))
			} else if (!context || context.jquery) {
				return (context || root).find(selector);

				// HANDLE: $(expr, context)
				// (which is just equivalent to: $(context).find(expr)
			} else {
				return this.constructor(context).find(selector);
			}

			// HANDLE: $(DOMElement)
		} else if (selector.nodeType) {
			this.context = this[0] = selector;
			this.length = 1;
			return this;

			// HANDLE: $(function)
			// Shortcut for document ready
		} else if (jQuery.isFunction(selector)) {
			return root.ready !== undefined ? root.ready(selector) :

			// Execute immediately if ready is not present
			selector(jQuery);
		}

		if (selector.selector !== undefined) {
			this.selector = selector.selector;
			this.context = selector.context;
		}

		return jQuery.makeArray(selector, this);
	};

	// Give the init function the jQuery prototype for later instantiation
	init.prototype = jQuery.fn;

	// Initialize central reference
	rootjQuery = jQuery(document);

	var rparentsprev = /^(?:parents|prev(?:Until|All))/,


	// Methods guaranteed to produce a unique set when starting from a unique set
	guaranteedUnique = {
		children: true,
		contents: true,
		next: true,
		prev: true
	};

	jQuery.fn.extend({
		has: function (target) {
			var targets = jQuery(target, this),
			    l = targets.length;

			return this.filter(function () {
				var i = 0;
				for (; i < l; i++) {
					if (jQuery.contains(this, targets[i])) {
						return true;
					}
				}
			});
		},

		closest: function (selectors, context) {
			var cur,
			    i = 0,
			    l = this.length,
			    matched = [],
			    pos = rneedsContext.test(selectors) || typeof selectors !== "string" ? jQuery(selectors, context || this.context) : 0;

			for (; i < l; i++) {
				for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {

					// Always skip document fragments
					if (cur.nodeType < 11 && (pos ? pos.index(cur) > -1 :

					// Don't pass non-elements to Sizzle
					cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) {

						matched.push(cur);
						break;
					}
				}
			}

			return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);
		},

		// Determine the position of an element within the set
		index: function (elem) {

			// No argument, return index in parent
			if (!elem) {
				return this[0] && this[0].parentNode ? this.first().prevAll().length : -1;
			}

			// Index in selector
			if (typeof elem === "string") {
				return indexOf.call(jQuery(elem), this[0]);
			}

			// Locate the position of the desired element
			return indexOf.call(this,

			// If it receives a jQuery object, the first element is used
			elem.jquery ? elem[0] : elem);
		},

		add: function (selector, context) {
			return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context))));
		},

		addBack: function (selector) {
			return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector));
		}
	});

	function sibling(cur, dir) {
		while ((cur = cur[dir]) && cur.nodeType !== 1) {}
		return cur;
	}

	jQuery.each({
		parent: function (elem) {
			var parent = elem.parentNode;
			return parent && parent.nodeType !== 11 ? parent : null;
		},
		parents: function (elem) {
			return dir(elem, "parentNode");
		},
		parentsUntil: function (elem, i, until) {
			return dir(elem, "parentNode", until);
		},
		next: function (elem) {
			return sibling(elem, "nextSibling");
		},
		prev: function (elem) {
			return sibling(elem, "previousSibling");
		},
		nextAll: function (elem) {
			return dir(elem, "nextSibling");
		},
		prevAll: function (elem) {
			return dir(elem, "previousSibling");
		},
		nextUntil: function (elem, i, until) {
			return dir(elem, "nextSibling", until);
		},
		prevUntil: function (elem, i, until) {
			return dir(elem, "previousSibling", until);
		},
		siblings: function (elem) {
			return siblings((elem.parentNode || {}).firstChild, elem);
		},
		children: function (elem) {
			return siblings(elem.firstChild);
		},
		contents: function (elem) {
			return elem.contentDocument || jQuery.merge([], elem.childNodes);
		}
	}, function (name, fn) {
		jQuery.fn[name] = function (until, selector) {
			var matched = jQuery.map(this, fn, until);

			if (name.slice(-5) !== "Until") {
				selector = until;
			}

			if (selector && typeof selector === "string") {
				matched = jQuery.filter(selector, matched);
			}

			if (this.length > 1) {

				// Remove duplicates
				if (!guaranteedUnique[name]) {
					jQuery.uniqueSort(matched);
				}

				// Reverse order for parents* and prev-derivatives
				if (rparentsprev.test(name)) {
					matched.reverse();
				}
			}

			return this.pushStack(matched);
		};
	});
	var rnotwhite = /\S+/g;

	// Convert String-formatted options into Object-formatted ones
	function createOptions(options) {
		var object = {};
		jQuery.each(options.match(rnotwhite) || [], function (_, flag) {
			object[flag] = true;
		});
		return object;
	}

	/*
  * Create a callback list using the following parameters:
  *
  *	options: an optional list of space-separated options that will change how
  *			the callback list behaves or a more traditional option object
  *
  * By default a callback list will act like an event callback list and can be
  * "fired" multiple times.
  *
  * Possible options:
  *
  *	once:			will ensure the callback list can only be fired once (like a Deferred)
  *
  *	memory:			will keep track of previous values and will call any callback added
  *					after the list has been fired right away with the latest "memorized"
  *					values (like a Deferred)
  *
  *	unique:			will ensure a callback can only be added once (no duplicate in the list)
  *
  *	stopOnFalse:	interrupt callings when a callback returns false
  *
  */
	jQuery.Callbacks = function (options) {

		// Convert options from String-formatted to Object-formatted if needed
		// (we check in cache first)
		options = typeof options === "string" ? createOptions(options) : jQuery.extend({}, options);

		var // Flag to know if list is currently firing
		firing,


		// Last fire value for non-forgettable lists
		memory,


		// Flag to know if list was already fired
		fired,


		// Flag to prevent firing
		locked,


		// Actual callback list
		list = [],


		// Queue of execution data for repeatable lists
		queue = [],


		// Index of currently firing callback (modified by add/remove as needed)
		firingIndex = -1,


		// Fire callbacks
		fire = function () {

			// Enforce single-firing
			locked = options.once;

			// Execute callbacks for all pending executions,
			// respecting firingIndex overrides and runtime changes
			fired = firing = true;
			for (; queue.length; firingIndex = -1) {
				memory = queue.shift();
				while (++firingIndex < list.length) {

					// Run callback and check for early termination
					if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) {

						// Jump to end and forget the data so .add doesn't re-fire
						firingIndex = list.length;
						memory = false;
					}
				}
			}

			// Forget the data if we're done with it
			if (!options.memory) {
				memory = false;
			}

			firing = false;

			// Clean up if we're done firing for good
			if (locked) {

				// Keep an empty list if we have data for future add calls
				if (memory) {
					list = [];

					// Otherwise, this object is spent
				} else {
					list = "";
				}
			}
		},


		// Actual Callbacks object
		self = {

			// Add a callback or a collection of callbacks to the list
			add: function () {
				if (list) {

					// If we have memory from a past run, we should fire after adding
					if (memory && !firing) {
						firingIndex = list.length - 1;
						queue.push(memory);
					}

					(function add(args) {
						jQuery.each(args, function (_, arg) {
							if (jQuery.isFunction(arg)) {
								if (!options.unique || !self.has(arg)) {
									list.push(arg);
								}
							} else if (arg && arg.length && jQuery.type(arg) !== "string") {

								// Inspect recursively
								add(arg);
							}
						});
					})(arguments);

					if (memory && !firing) {
						fire();
					}
				}
				return this;
			},

			// Remove a callback from the list
			remove: function () {
				jQuery.each(arguments, function (_, arg) {
					var index;
					while ((index = jQuery.inArray(arg, list, index)) > -1) {
						list.splice(index, 1);

						// Handle firing indexes
						if (index <= firingIndex) {
							firingIndex--;
						}
					}
				});
				return this;
			},

			// Check if a given callback is in the list.
			// If no argument is given, return whether or not list has callbacks attached.
			has: function (fn) {
				return fn ? jQuery.inArray(fn, list) > -1 : list.length > 0;
			},

			// Remove all callbacks from the list
			empty: function () {
				if (list) {
					list = [];
				}
				return this;
			},

			// Disable .fire and .add
			// Abort any current/pending executions
			// Clear all callbacks and values
			disable: function () {
				locked = queue = [];
				list = memory = "";
				return this;
			},
			disabled: function () {
				return !list;
			},

			// Disable .fire
			// Also disable .add unless we have memory (since it would have no effect)
			// Abort any pending executions
			lock: function () {
				locked = queue = [];
				if (!memory) {
					list = memory = "";
				}
				return this;
			},
			locked: function () {
				return !!locked;
			},

			// Call all callbacks with the given context and arguments
			fireWith: function (context, args) {
				if (!locked) {
					args = args || [];
					args = [context, args.slice ? args.slice() : args];
					queue.push(args);
					if (!firing) {
						fire();
					}
				}
				return this;
			},

			// Call all the callbacks with the given arguments
			fire: function () {
				self.fireWith(this, arguments);
				return this;
			},

			// To know if the callbacks have already been called at least once
			fired: function () {
				return !!fired;
			}
		};

		return self;
	};

	jQuery.extend({

		Deferred: function (func) {
			var tuples = [

			// action, add listener, listener list, final state
			["resolve", "done", jQuery.Callbacks("once memory"), "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"], ["notify", "progress", jQuery.Callbacks("memory")]],
			    state = "pending",
			    promise = {
				state: function () {
					return state;
				},
				always: function () {
					deferred.done(arguments).fail(arguments);
					return this;
				},
				then: function () /* fnDone, fnFail, fnProgress */{
					var fns = arguments;
					return jQuery.Deferred(function (newDefer) {
						jQuery.each(tuples, function (i, tuple) {
							var fn = jQuery.isFunction(fns[i]) && fns[i];

							// deferred[ done | fail | progress ] for forwarding actions to newDefer
							deferred[tuple[1]](function () {
								var returned = fn && fn.apply(this, arguments);
								if (returned && jQuery.isFunction(returned.promise)) {
									returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject);
								} else {
									newDefer[tuple[0] + "With"](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments);
								}
							});
						});
						fns = null;
					}).promise();
				},

				// Get a promise for this deferred
				// If obj is provided, the promise aspect is added to the object
				promise: function (obj) {
					return obj != null ? jQuery.extend(obj, promise) : promise;
				}
			},
			    deferred = {};

			// Keep pipe for back-compat
			promise.pipe = promise.then;

			// Add list-specific methods
			jQuery.each(tuples, function (i, tuple) {
				var list = tuple[2],
				    stateString = tuple[3];

				// promise[ done | fail | progress ] = list.add
				promise[tuple[1]] = list.add;

				// Handle state
				if (stateString) {
					list.add(function () {

						// state = [ resolved | rejected ]
						state = stateString;

						// [ reject_list | resolve_list ].disable; progress_list.lock
					}, tuples[i ^ 1][2].disable, tuples[2][2].lock);
				}

				// deferred[ resolve | reject | notify ]
				deferred[tuple[0]] = function () {
					deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments);
					return this;
				};
				deferred[tuple[0] + "With"] = list.fireWith;
			});

			// Make the deferred a promise
			promise.promise(deferred);

			// Call given func if any
			if (func) {
				func.call(deferred, deferred);
			}

			// All done!
			return deferred;
		},

		// Deferred helper
		when: function (subordinate /* , ..., subordinateN */) {
			var i = 0,
			    resolveValues = slice.call(arguments),
			    length = resolveValues.length,


			// the count of uncompleted subordinates
			remaining = length !== 1 || subordinate && jQuery.isFunction(subordinate.promise) ? length : 0,


			// the master Deferred.
			// If resolveValues consist of only a single Deferred, just use that.
			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),


			// Update function for both resolve and progress values
			updateFunc = function (i, contexts, values) {
				return function (value) {
					contexts[i] = this;
					values[i] = arguments.length > 1 ? slice.call(arguments) : value;
					if (values === progressValues) {
						deferred.notifyWith(contexts, values);
					} else if (! --remaining) {
						deferred.resolveWith(contexts, values);
					}
				};
			},
			    progressValues,
			    progressContexts,
			    resolveContexts;

			// Add listeners to Deferred subordinates; treat others as resolved
			if (length > 1) {
				progressValues = new Array(length);
				progressContexts = new Array(length);
				resolveContexts = new Array(length);
				for (; i < length; i++) {
					if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) {
						resolveValues[i].promise().progress(updateFunc(i, progressContexts, progressValues)).done(updateFunc(i, resolveContexts, resolveValues)).fail(deferred.reject);
					} else {
						--remaining;
					}
				}
			}

			// If we're not waiting on anything, resolve the master
			if (!remaining) {
				deferred.resolveWith(resolveContexts, resolveValues);
			}

			return deferred.promise();
		}
	});

	// The deferred used on DOM ready
	var readyList;

	jQuery.fn.ready = function (fn) {

		// Add the callback
		jQuery.ready.promise().done(fn);

		return this;
	};

	jQuery.extend({

		// Is the DOM ready to be used? Set to true once it occurs.
		isReady: false,

		// A counter to track how many items to wait for before
		// the ready event fires. See #6781
		readyWait: 1,

		// Hold (or release) the ready event
		holdReady: function (hold) {
			if (hold) {
				jQuery.readyWait++;
			} else {
				jQuery.ready(true);
			}
		},

		// Handle when the DOM is ready
		ready: function (wait) {

			// Abort if there are pending holds or we're already ready
			if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
				return;
			}

			// Remember that the DOM is ready
			jQuery.isReady = true;

			// If a normal DOM Ready event fired, decrement, and wait if need be
			if (wait !== true && --jQuery.readyWait > 0) {
				return;
			}

			// If there are functions bound, to execute
			readyList.resolveWith(document, [jQuery]);

			// Trigger any bound ready events
			if (jQuery.fn.triggerHandler) {
				jQuery(document).triggerHandler("ready");
				jQuery(document).off("ready");
			}
		}
	});

	/**
  * The ready event handler and self cleanup method
  */
	function completed() {
		document.removeEventListener("DOMContentLoaded", completed);
		window.removeEventListener("load", completed);
		jQuery.ready();
	}

	jQuery.ready.promise = function (obj) {
		if (!readyList) {

			readyList = jQuery.Deferred();

			// Catch cases where $(document).ready() is called
			// after the browser event has already occurred.
			// Support: IE9-10 only
			// Older IE sometimes signals "interactive" too soon
			if (document.readyState === "complete" || document.readyState !== "loading" && !document.documentElement.doScroll) {

				// Handle it asynchronously to allow scripts the opportunity to delay ready
				window.setTimeout(jQuery.ready);
			} else {

				// Use the handy event callback
				document.addEventListener("DOMContentLoaded", completed);

				// A fallback to window.onload, that will always work
				window.addEventListener("load", completed);
			}
		}
		return readyList.promise(obj);
	};

	// Kick off the DOM ready check even if the user does not
	jQuery.ready.promise();

	// Multifunctional method to get and set values of a collection
	// The value/s can optionally be executed if it's a function
	var access = function (elems, fn, key, value, chainable, emptyGet, raw) {
		var i = 0,
		    len = elems.length,
		    bulk = key == null;

		// Sets many values
		if (jQuery.type(key) === "object") {
			chainable = true;
			for (i in key) {
				access(elems, fn, i, key[i], true, emptyGet, raw);
			}

			// Sets one value
		} else if (value !== undefined) {
			chainable = true;

			if (!jQuery.isFunction(value)) {
				raw = true;
			}

			if (bulk) {

				// Bulk operations run against the entire set
				if (raw) {
					fn.call(elems, value);
					fn = null;

					// ...except when executing function values
				} else {
					bulk = fn;
					fn = function (elem, key, value) {
						return bulk.call(jQuery(elem), value);
					};
				}
			}

			if (fn) {
				for (; i < len; i++) {
					fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key)));
				}
			}
		}

		return chainable ? elems :

		// Gets
		bulk ? fn.call(elems) : len ? fn(elems[0], key) : emptyGet;
	};
	var acceptData = function (owner) {

		// Accepts only:
		//  - Node
		//    - Node.ELEMENT_NODE
		//    - Node.DOCUMENT_NODE
		//  - Object
		//    - Any
		/* jshint -W018 */
		return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType;
	};

	function Data() {
		this.expando = jQuery.expando + Data.uid++;
	}

	Data.uid = 1;

	Data.prototype = {

		register: function (owner, initial) {
			var value = initial || {};

			// If it is a node unlikely to be stringify-ed or looped over
			// use plain assignment
			if (owner.nodeType) {
				owner[this.expando] = value;

				// Otherwise secure it in a non-enumerable, non-writable property
				// configurability must be true to allow the property to be
				// deleted with the delete operator
			} else {
				Object.defineProperty(owner, this.expando, {
					value: value,
					writable: true,
					configurable: true
				});
			}
			return owner[this.expando];
		},
		cache: function (owner) {

			// We can accept data for non-element nodes in modern browsers,
			// but we should not, see #8335.
			// Always return an empty object.
			if (!acceptData(owner)) {
				return {};
			}

			// Check if the owner object already has a cache
			var value = owner[this.expando];

			// If not, create one
			if (!value) {
				value = {};

				// We can accept data for non-element nodes in modern browsers,
				// but we should not, see #8335.
				// Always return an empty object.
				if (acceptData(owner)) {

					// If it is a node unlikely to be stringify-ed or looped over
					// use plain assignment
					if (owner.nodeType) {
						owner[this.expando] = value;

						// Otherwise secure it in a non-enumerable property
						// configurable must be true to allow the property to be
						// deleted when data is removed
					} else {
						Object.defineProperty(owner, this.expando, {
							value: value,
							configurable: true
						});
					}
				}
			}

			return value;
		},
		set: function (owner, data, value) {
			var prop,
			    cache = this.cache(owner);

			// Handle: [ owner, key, value ] args
			if (typeof data === "string") {
				cache[data] = value;

				// Handle: [ owner, { properties } ] args
			} else {

				// Copy the properties one-by-one to the cache object
				for (prop in data) {
					cache[prop] = data[prop];
				}
			}
			return cache;
		},
		get: function (owner, key) {
			return key === undefined ? this.cache(owner) : owner[this.expando] && owner[this.expando][key];
		},
		access: function (owner, key, value) {
			var stored;

			// In cases where either:
			//
			//   1. No key was specified
			//   2. A string key was specified, but no value provided
			//
			// Take the "read" path and allow the get method to determine
			// which value to return, respectively either:
			//
			//   1. The entire cache object
			//   2. The data stored at the key
			//
			if (key === undefined || key && typeof key === "string" && value === undefined) {

				stored = this.get(owner, key);

				return stored !== undefined ? stored : this.get(owner, jQuery.camelCase(key));
			}

			// When the key is not a string, or both a key and value
			// are specified, set or extend (existing objects) with either:
			//
			//   1. An object of properties
			//   2. A key and value
			//
			this.set(owner, key, value);

			// Since the "set" path can have two possible entry points
			// return the expected data based on which path was taken[*]
			return value !== undefined ? value : key;
		},
		remove: function (owner, key) {
			var i,
			    name,
			    camel,
			    cache = owner[this.expando];

			if (cache === undefined) {
				return;
			}

			if (key === undefined) {
				this.register(owner);
			} else {

				// Support array or space separated string of keys
				if (jQuery.isArray(key)) {

					// If "name" is an array of keys...
					// When data is initially created, via ("key", "val") signature,
					// keys will be converted to camelCase.
					// Since there is no way to tell _how_ a key was added, remove
					// both plain key and camelCase key. #12786
					// This will only penalize the array argument path.
					name = key.concat(key.map(jQuery.camelCase));
				} else {
					camel = jQuery.camelCase(key);

					// Try the string as a key before any manipulation
					if (key in cache) {
						name = [key, camel];
					} else {

						// If a key with the spaces exists, use it.
						// Otherwise, create an array by matching non-whitespace
						name = camel;
						name = name in cache ? [name] : name.match(rnotwhite) || [];
					}
				}

				i = name.length;

				while (i--) {
					delete cache[name[i]];
				}
			}

			// Remove the expando if there's no more data
			if (key === undefined || jQuery.isEmptyObject(cache)) {

				// Support: Chrome <= 35-45+
				// Webkit & Blink performance suffers when deleting properties
				// from DOM nodes, so set to undefined instead
				// https://code.google.com/p/chromium/issues/detail?id=378607
				if (owner.nodeType) {
					owner[this.expando] = undefined;
				} else {
					delete owner[this.expando];
				}
			}
		},
		hasData: function (owner) {
			var cache = owner[this.expando];
			return cache !== undefined && !jQuery.isEmptyObject(cache);
		}
	};
	var dataPriv = new Data();

	var dataUser = new Data();

	//	Implementation Summary
	//
	//	1. Enforce API surface and semantic compatibility with 1.9.x branch
	//	2. Improve the module's maintainability by reducing the storage
	//		paths to a single mechanism.
	//	3. Use the same single mechanism to support "private" and "user" data.
	//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
	//	5. Avoid exposing implementation details on user objects (eg. expando properties)
	//	6. Provide a clear path for implementation upgrade to WeakMap in 2014

	var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
	    rmultiDash = /[A-Z]/g;

	function dataAttr(elem, key, data) {
		var name;

		// If nothing was found internally, try to fetch any
		// data from the HTML5 data-* attribute
		if (data === undefined && elem.nodeType === 1) {
			name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase();
			data = elem.getAttribute(name);

			if (typeof data === "string") {
				try {
					data = data === "true" ? true : data === "false" ? false : data === "null" ? null :

					// Only convert to a number if it doesn't change the string
					+data + "" === data ? +data : rbrace.test(data) ? jQuery.parseJSON(data) : data;
				} catch (e) {}

				// Make sure we set the data so it isn't changed later
				dataUser.set(elem, key, data);
			} else {
				data = undefined;
			}
		}
		return data;
	}

	jQuery.extend({
		hasData: function (elem) {
			return dataUser.hasData(elem) || dataPriv.hasData(elem);
		},

		data: function (elem, name, data) {
			return dataUser.access(elem, name, data);
		},

		removeData: function (elem, name) {
			dataUser.remove(elem, name);
		},

		// TODO: Now that all calls to _data and _removeData have been replaced
		// with direct calls to dataPriv methods, these can be deprecated.
		_data: function (elem, name, data) {
			return dataPriv.access(elem, name, data);
		},

		_removeData: function (elem, name) {
			dataPriv.remove(elem, name);
		}
	});

	jQuery.fn.extend({
		data: function (key, value) {
			var i,
			    name,
			    data,
			    elem = this[0],
			    attrs = elem && elem.attributes;

			// Gets all values
			if (key === undefined) {
				if (this.length) {
					data = dataUser.get(elem);

					if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) {
						i = attrs.length;
						while (i--) {

							// Support: IE11+
							// The attrs elements can be null (#14894)
							if (attrs[i]) {
								name = attrs[i].name;
								if (name.indexOf("data-") === 0) {
									name = jQuery.camelCase(name.slice(5));
									dataAttr(elem, name, data[name]);
								}
							}
						}
						dataPriv.set(elem, "hasDataAttrs", true);
					}
				}

				return data;
			}

			// Sets multiple values
			if (typeof key === "object") {
				return this.each(function () {
					dataUser.set(this, key);
				});
			}

			return access(this, function (value) {
				var data, camelKey;

				// The calling jQuery object (element matches) is not empty
				// (and therefore has an element appears at this[ 0 ]) and the
				// `value` parameter was not undefined. An empty jQuery object
				// will result in `undefined` for elem = this[ 0 ] which will
				// throw an exception if an attempt to read a data cache is made.
				if (elem && value === undefined) {

					// Attempt to get data from the cache
					// with the key as-is
					data = dataUser.get(elem, key) ||

					// Try to find dashed key if it exists (gh-2779)
					// This is for 2.2.x only
					dataUser.get(elem, key.replace(rmultiDash, "-$&").toLowerCase());

					if (data !== undefined) {
						return data;
					}

					camelKey = jQuery.camelCase(key);

					// Attempt to get data from the cache
					// with the key camelized
					data = dataUser.get(elem, camelKey);
					if (data !== undefined) {
						return data;
					}

					// Attempt to "discover" the data in
					// HTML5 custom data-* attrs
					data = dataAttr(elem, camelKey, undefined);
					if (data !== undefined) {
						return data;
					}

					// We tried really hard, but the data doesn't exist.
					return;
				}

				// Set the data...
				camelKey = jQuery.camelCase(key);
				this.each(function () {

					// First, attempt to store a copy or reference of any
					// data that might've been store with a camelCased key.
					var data = dataUser.get(this, camelKey);

					// For HTML5 data-* attribute interop, we have to
					// store property names with dashes in a camelCase form.
					// This might not apply to all properties...*
					dataUser.set(this, camelKey, value);

					// *... In the case of properties that might _actually_
					// have dashes, we need to also store a copy of that
					// unchanged property.
					if (key.indexOf("-") > -1 && data !== undefined) {
						dataUser.set(this, key, value);
					}
				});
			}, null, value, arguments.length > 1, null, true);
		},

		removeData: function (key) {
			return this.each(function () {
				dataUser.remove(this, key);
			});
		}
	});

	jQuery.extend({
		queue: function (elem, type, data) {
			var queue;

			if (elem) {
				type = (type || "fx") + "queue";
				queue = dataPriv.get(elem, type);

				// Speed up dequeue by getting out quickly if this is just a lookup
				if (data) {
					if (!queue || jQuery.isArray(data)) {
						queue = dataPriv.access(elem, type, jQuery.makeArray(data));
					} else {
						queue.push(data);
					}
				}
				return queue || [];
			}
		},

		dequeue: function (elem, type) {
			type = type || "fx";

			var queue = jQuery.queue(elem, type),
			    startLength = queue.length,
			    fn = queue.shift(),
			    hooks = jQuery._queueHooks(elem, type),
			    next = function () {
				jQuery.dequeue(elem, type);
			};

			// If the fx queue is dequeued, always remove the progress sentinel
			if (fn === "inprogress") {
				fn = queue.shift();
				startLength--;
			}

			if (fn) {

				// Add a progress sentinel to prevent the fx queue from being
				// automatically dequeued
				if (type === "fx") {
					queue.unshift("inprogress");
				}

				// Clear up the last queue stop function
				delete hooks.stop;
				fn.call(elem, next, hooks);
			}

			if (!startLength && hooks) {
				hooks.empty.fire();
			}
		},

		// Not public - generate a queueHooks object, or return the current one
		_queueHooks: function (elem, type) {
			var key = type + "queueHooks";
			return dataPriv.get(elem, key) || dataPriv.access(elem, key, {
				empty: jQuery.Callbacks("once memory").add(function () {
					dataPriv.remove(elem, [type + "queue", key]);
				})
			});
		}
	});

	jQuery.fn.extend({
		queue: function (type, data) {
			var setter = 2;

			if (typeof type !== "string") {
				data = type;
				type = "fx";
				setter--;
			}

			if (arguments.length < setter) {
				return jQuery.queue(this[0], type);
			}

			return data === undefined ? this : this.each(function () {
				var queue = jQuery.queue(this, type, data);

				// Ensure a hooks for this queue
				jQuery._queueHooks(this, type);

				if (type === "fx" && queue[0] !== "inprogress") {
					jQuery.dequeue(this, type);
				}
			});
		},
		dequeue: function (type) {
			return this.each(function () {
				jQuery.dequeue(this, type);
			});
		},
		clearQueue: function (type) {
			return this.queue(type || "fx", []);
		},

		// Get a promise resolved when queues of a certain type
		// are emptied (fx is the type by default)
		promise: function (type, obj) {
			var tmp,
			    count = 1,
			    defer = jQuery.Deferred(),
			    elements = this,
			    i = this.length,
			    resolve = function () {
				if (! --count) {
					defer.resolveWith(elements, [elements]);
				}
			};

			if (typeof type !== "string") {
				obj = type;
				type = undefined;
			}
			type = type || "fx";

			while (i--) {
				tmp = dataPriv.get(elements[i], type + "queueHooks");
				if (tmp && tmp.empty) {
					count++;
					tmp.empty.add(resolve);
				}
			}
			resolve();
			return defer.promise(obj);
		}
	});
	var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;

	var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");

	var cssExpand = ["Top", "Right", "Bottom", "Left"];

	var isHidden = function (elem, el) {

		// isHidden might be called from jQuery#filter function;
		// in that case, element will be second argument
		elem = el || elem;
		return jQuery.css(elem, "display") === "none" || !jQuery.contains(elem.ownerDocument, elem);
	};

	function adjustCSS(elem, prop, valueParts, tween) {
		var adjusted,
		    scale = 1,
		    maxIterations = 20,
		    currentValue = tween ? function () {
			return tween.cur();
		} : function () {
			return jQuery.css(elem, prop, "");
		},
		    initial = currentValue(),
		    unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"),


		// Starting value computation is required for potential unit mismatches
		initialInUnit = (jQuery.cssNumber[prop] || unit !== "px" && +initial) && rcssNum.exec(jQuery.css(elem, prop));

		if (initialInUnit && initialInUnit[3] !== unit) {

			// Trust units reported by jQuery.css
			unit = unit || initialInUnit[3];

			// Make sure we update the tween properties later on
			valueParts = valueParts || [];

			// Iteratively approximate from a nonzero starting point
			initialInUnit = +initial || 1;

			do {

				// If previous iteration zeroed out, double until we get *something*.
				// Use string for doubling so we don't accidentally see scale as unchanged below
				scale = scale || ".5";

				// Adjust and apply
				initialInUnit = initialInUnit / scale;
				jQuery.style(elem, prop, initialInUnit + unit);

				// Update scale, tolerating zero or NaN from tween.cur()
				// Break the loop if scale is unchanged or perfect, or if we've just had enough.
			} while (scale !== (scale = currentValue() / initial) && scale !== 1 && --maxIterations);
		}

		if (valueParts) {
			initialInUnit = +initialInUnit || +initial || 0;

			// Apply relative offset (+=/-=) if specified
			adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2];
			if (tween) {
				tween.unit = unit;
				tween.start = initialInUnit;
				tween.end = adjusted;
			}
		}
		return adjusted;
	}
	var rcheckableType = /^(?:checkbox|radio)$/i;

	var rtagName = /<([\w:-]+)/;

	var rscriptType = /^$|\/(?:java|ecma)script/i;

	// We have to close these tags to support XHTML (#13200)
	var wrapMap = {

		// Support: IE9
		option: [1, "<select multiple='multiple'>", "</select>"],

		// XHTML parsers do not magically insert elements in the
		// same way that tag soup parsers do. So we cannot shorten
		// this by omitting <tbody> or other required elements.
		thead: [1, "<table>", "</table>"],
		col: [2, "<table><colgroup>", "</colgroup></table>"],
		tr: [2, "<table><tbody>", "</tbody></table>"],
		td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],

		_default: [0, "", ""]
	};

	// Support: IE9
	wrapMap.optgroup = wrapMap.option;

	wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
	wrapMap.th = wrapMap.td;

	function getAll(context, tag) {

		// Support: IE9-11+
		// Use typeof to avoid zero-argument method invocation on host objects (#15151)
		var ret = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName(tag || "*") : typeof context.querySelectorAll !== "undefined" ? context.querySelectorAll(tag || "*") : [];

		return tag === undefined || tag && jQuery.nodeName(context, tag) ? jQuery.merge([context], ret) : ret;
	}

	// Mark scripts as having already been evaluated
	function setGlobalEval(elems, refElements) {
		var i = 0,
		    l = elems.length;

		for (; i < l; i++) {
			dataPriv.set(elems[i], "globalEval", !refElements || dataPriv.get(refElements[i], "globalEval"));
		}
	}

	var rhtml = /<|&#?\w+;/;

	function buildFragment(elems, context, scripts, selection, ignored) {
		var elem,
		    tmp,
		    tag,
		    wrap,
		    contains,
		    j,
		    fragment = context.createDocumentFragment(),
		    nodes = [],
		    i = 0,
		    l = elems.length;

		for (; i < l; i++) {
			elem = elems[i];

			if (elem || elem === 0) {

				// Add nodes directly
				if (jQuery.type(elem) === "object") {

					// Support: Android<4.1, PhantomJS<2
					// push.apply(_, arraylike) throws on ancient WebKit
					jQuery.merge(nodes, elem.nodeType ? [elem] : elem);

					// Convert non-html into a text node
				} else if (!rhtml.test(elem)) {
					nodes.push(context.createTextNode(elem));

					// Convert html into DOM nodes
				} else {
					tmp = tmp || fragment.appendChild(context.createElement("div"));

					// Deserialize a standard representation
					tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
					wrap = wrapMap[tag] || wrapMap._default;
					tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2];

					// Descend through wrappers to the right content
					j = wrap[0];
					while (j--) {
						tmp = tmp.lastChild;
					}

					// Support: Android<4.1, PhantomJS<2
					// push.apply(_, arraylike) throws on ancient WebKit
					jQuery.merge(nodes, tmp.childNodes);

					// Remember the top-level container
					tmp = fragment.firstChild;

					// Ensure the created nodes are orphaned (#12392)
					tmp.textContent = "";
				}
			}
		}

		// Remove wrapper from fragment
		fragment.textContent = "";

		i = 0;
		while (elem = nodes[i++]) {

			// Skip elements already in the context collection (trac-4087)
			if (selection && jQuery.inArray(elem, selection) > -1) {
				if (ignored) {
					ignored.push(elem);
				}
				continue;
			}

			contains = jQuery.contains(elem.ownerDocument, elem);

			// Append to fragment
			tmp = getAll(fragment.appendChild(elem), "script");

			// Preserve script evaluation history
			if (contains) {
				setGlobalEval(tmp);
			}

			// Capture executables
			if (scripts) {
				j = 0;
				while (elem = tmp[j++]) {
					if (rscriptType.test(elem.type || "")) {
						scripts.push(elem);
					}
				}
			}
		}

		return fragment;
	}

	(function () {
		var fragment = document.createDocumentFragment(),
		    div = fragment.appendChild(document.createElement("div")),
		    input = document.createElement("input");

		// Support: Android 4.0-4.3, Safari<=5.1
		// Check state lost if the name is set (#11217)
		// Support: Windows Web Apps (WWA)
		// `name` and `type` must use .setAttribute for WWA (#14901)
		input.setAttribute("type", "radio");
		input.setAttribute("checked", "checked");
		input.setAttribute("name", "t");

		div.appendChild(input);

		// Support: Safari<=5.1, Android<4.2
		// Older WebKit doesn't clone checked state correctly in fragments
		support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;

		// Support: IE<=11+
		// Make sure textarea (and checkbox) defaultValue is properly cloned
		div.innerHTML = "<textarea>x</textarea>";
		support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;
	})();

	var rkeyEvent = /^key/,
	    rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
	    rtypenamespace = /^([^.]*)(?:\.(.+)|)/;

	function returnTrue() {
		return true;
	}

	function returnFalse() {
		return false;
	}

	// Support: IE9
	// See #13393 for more info
	function safeActiveElement() {
		try {
			return document.activeElement;
		} catch (err) {}
	}

	function on(elem, types, selector, data, fn, one) {
		var origFn, type;

		// Types can be a map of types/handlers
		if (typeof types === "object") {

			// ( types-Object, selector, data )
			if (typeof selector !== "string") {

				// ( types-Object, data )
				data = data || selector;
				selector = undefined;
			}
			for (type in types) {
				on(elem, type, selector, data, types[type], one);
			}
			return elem;
		}

		if (data == null && fn == null) {

			// ( types, fn )
			fn = selector;
			data = selector = undefined;
		} else if (fn == null) {
			if (typeof selector === "string") {

				// ( types, selector, fn )
				fn = data;
				data = undefined;
			} else {

				// ( types, data, fn )
				fn = data;
				data = selector;
				selector = undefined;
			}
		}
		if (fn === false) {
			fn = returnFalse;
		} else if (!fn) {
			return elem;
		}

		if (one === 1) {
			origFn = fn;
			fn = function (event) {

				// Can use an empty set, since event contains the info
				jQuery().off(event);
				return origFn.apply(this, arguments);
			};

			// Use same guid so caller can remove using origFn
			fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
		}
		return elem.each(function () {
			jQuery.event.add(this, types, fn, data, selector);
		});
	}

	/*
  * Helper functions for managing events -- not part of the public interface.
  * Props to Dean Edwards' addEvent library for many of the ideas.
  */
	jQuery.event = {

		global: {},

		add: function (elem, types, handler, data, selector) {

			var handleObjIn,
			    eventHandle,
			    tmp,
			    events,
			    t,
			    handleObj,
			    special,
			    handlers,
			    type,
			    namespaces,
			    origType,
			    elemData = dataPriv.get(elem);

			// Don't attach events to noData or text/comment nodes (but allow plain objects)
			if (!elemData) {
				return;
			}

			// Caller can pass in an object of custom data in lieu of the handler
			if (handler.handler) {
				handleObjIn = handler;
				handler = handleObjIn.handler;
				selector = handleObjIn.selector;
			}

			// Make sure that the handler has a unique ID, used to find/remove it later
			if (!handler.guid) {
				handler.guid = jQuery.guid++;
			}

			// Init the element's event structure and main handler, if this is the first
			if (!(events = elemData.events)) {
				events = elemData.events = {};
			}
			if (!(eventHandle = elemData.handle)) {
				eventHandle = elemData.handle = function (e) {

					// Discard the second event of a jQuery.event.trigger() and
					// when an event is called after a page has unloaded
					return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply(elem, arguments) : undefined;
				};
			}

			// Handle multiple events separated by a space
			types = (types || "").match(rnotwhite) || [""];
			t = types.length;
			while (t--) {
				tmp = rtypenamespace.exec(types[t]) || [];
				type = origType = tmp[1];
				namespaces = (tmp[2] || "").split(".").sort();

				// There *must* be a type, no attaching namespace-only handlers
				if (!type) {
					continue;
				}

				// If event changes its type, use the special event handlers for the changed type
				special = jQuery.event.special[type] || {};

				// If selector defined, determine special event api type, otherwise given type
				type = (selector ? special.delegateType : special.bindType) || type;

				// Update special based on newly reset type
				special = jQuery.event.special[type] || {};

				// handleObj is passed to all event handlers
				handleObj = jQuery.extend({
					type: type,
					origType: origType,
					data: data,
					handler: handler,
					guid: handler.guid,
					selector: selector,
					needsContext: selector && jQuery.expr.match.needsContext.test(selector),
					namespace: namespaces.join(".")
				}, handleObjIn);

				// Init the event handler queue if we're the first
				if (!(handlers = events[type])) {
					handlers = events[type] = [];
					handlers.delegateCount = 0;

					// Only use addEventListener if the special events handler returns false
					if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {

						if (elem.addEventListener) {
							elem.addEventListener(type, eventHandle);
						}
					}
				}

				if (special.add) {
					special.add.call(elem, handleObj);

					if (!handleObj.handler.guid) {
						handleObj.handler.guid = handler.guid;
					}
				}

				// Add to the element's handler list, delegates in front
				if (selector) {
					handlers.splice(handlers.delegateCount++, 0, handleObj);
				} else {
					handlers.push(handleObj);
				}

				// Keep track of which events have ever been used, for event optimization
				jQuery.event.global[type] = true;
			}
		},

		// Detach an event or set of events from an element
		remove: function (elem, types, handler, selector, mappedTypes) {

			var j,
			    origCount,
			    tmp,
			    events,
			    t,
			    handleObj,
			    special,
			    handlers,
			    type,
			    namespaces,
			    origType,
			    elemData = dataPriv.hasData(elem) && dataPriv.get(elem);

			if (!elemData || !(events = elemData.events)) {
				return;
			}

			// Once for each type.namespace in types; type may be omitted
			types = (types || "").match(rnotwhite) || [""];
			t = types.length;
			while (t--) {
				tmp = rtypenamespace.exec(types[t]) || [];
				type = origType = tmp[1];
				namespaces = (tmp[2] || "").split(".").sort();

				// Unbind all events (on this namespace, if provided) for the element
				if (!type) {
					for (type in events) {
						jQuery.event.remove(elem, type + types[t], handler, selector, true);
					}
					continue;
				}

				special = jQuery.event.special[type] || {};
				type = (selector ? special.delegateType : special.bindType) || type;
				handlers = events[type] || [];
				tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");

				// Remove matching events
				origCount = j = handlers.length;
				while (j--) {
					handleObj = handlers[j];

					if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) {
						handlers.splice(j, 1);

						if (handleObj.selector) {
							handlers.delegateCount--;
						}
						if (special.remove) {
							special.remove.call(elem, handleObj);
						}
					}
				}

				// Remove generic event handler if we removed something and no more handlers exist
				// (avoids potential for endless recursion during removal of special event handlers)
				if (origCount && !handlers.length) {
					if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {

						jQuery.removeEvent(elem, type, elemData.handle);
					}

					delete events[type];
				}
			}

			// Remove data and the expando if it's no longer used
			if (jQuery.isEmptyObject(events)) {
				dataPriv.remove(elem, "handle events");
			}
		},

		dispatch: function (event) {

			// Make a writable jQuery.Event from the native event object
			event = jQuery.event.fix(event);

			var i,
			    j,
			    ret,
			    matched,
			    handleObj,
			    handlerQueue = [],
			    args = slice.call(arguments),
			    handlers = (dataPriv.get(this, "events") || {})[event.type] || [],
			    special = jQuery.event.special[event.type] || {};

			// Use the fix-ed jQuery.Event rather than the (read-only) native event
			args[0] = event;
			event.delegateTarget = this;

			// Call the preDispatch hook for the mapped type, and let it bail if desired
			if (special.preDispatch && special.preDispatch.call(this, event) === false) {
				return;
			}

			// Determine handlers
			handlerQueue = jQuery.event.handlers.call(this, event, handlers);

			// Run delegates first; they may want to stop propagation beneath us
			i = 0;
			while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
				event.currentTarget = matched.elem;

				j = 0;
				while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {

					// Triggered event must either 1) have no namespace, or 2) have namespace(s)
					// a subset or equal to those in the bound event (both can have no namespace).
					if (!event.rnamespace || event.rnamespace.test(handleObj.namespace)) {

						event.handleObj = handleObj;
						event.data = handleObj.data;

						ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);

						if (ret !== undefined) {
							if ((event.result = ret) === false) {
								event.preventDefault();
								event.stopPropagation();
							}
						}
					}
				}
			}

			// Call the postDispatch hook for the mapped type
			if (special.postDispatch) {
				special.postDispatch.call(this, event);
			}

			return event.result;
		},

		handlers: function (event, handlers) {
			var i,
			    matches,
			    sel,
			    handleObj,
			    handlerQueue = [],
			    delegateCount = handlers.delegateCount,
			    cur = event.target;

			// Support (at least): Chrome, IE9
			// Find delegate handlers
			// Black-hole SVG <use> instance trees (#13180)
			//
			// Support: Firefox<=42+
			// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
			if (delegateCount && cur.nodeType && (event.type !== "click" || isNaN(event.button) || event.button < 1)) {

				for (; cur !== this; cur = cur.parentNode || this) {

					// Don't check non-elements (#13208)
					// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
					if (cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click")) {
						matches = [];
						for (i = 0; i < delegateCount; i++) {
							handleObj = handlers[i];

							// Don't conflict with Object.prototype properties (#13203)
							sel = handleObj.selector + " ";

							if (matches[sel] === undefined) {
								matches[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length;
							}
							if (matches[sel]) {
								matches.push(handleObj);
							}
						}
						if (matches.length) {
							handlerQueue.push({ elem: cur, handlers: matches });
						}
					}
				}
			}

			// Add the remaining (directly-bound) handlers
			if (delegateCount < handlers.length) {
				handlerQueue.push({ elem: this, handlers: handlers.slice(delegateCount) });
			}

			return handlerQueue;
		},

		// Includes some event props shared by KeyEvent and MouseEvent
		props: ("altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + "metaKey relatedTarget shiftKey target timeStamp view which").split(" "),

		fixHooks: {},

		keyHooks: {
			props: "char charCode key keyCode".split(" "),
			filter: function (event, original) {

				// Add which for key events
				if (event.which == null) {
					event.which = original.charCode != null ? original.charCode : original.keyCode;
				}

				return event;
			}
		},

		mouseHooks: {
			props: ("button buttons clientX clientY offsetX offsetY pageX pageY " + "screenX screenY toElement").split(" "),
			filter: function (event, original) {
				var eventDoc,
				    doc,
				    body,
				    button = original.button;

				// Calculate pageX/Y if missing and clientX/Y available
				if (event.pageX == null && original.clientX != null) {
					eventDoc = event.target.ownerDocument || document;
					doc = eventDoc.documentElement;
					body = eventDoc.body;

					event.pageX = original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
					event.pageY = original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
				}

				// Add which for click: 1 === left; 2 === middle; 3 === right
				// Note: button is not normalized, so don't use it
				if (!event.which && button !== undefined) {
					event.which = button & 1 ? 1 : button & 2 ? 3 : button & 4 ? 2 : 0;
				}

				return event;
			}
		},

		fix: function (event) {
			if (event[jQuery.expando]) {
				return event;
			}

			// Create a writable copy of the event object and normalize some properties
			var i,
			    prop,
			    copy,
			    type = event.type,
			    originalEvent = event,
			    fixHook = this.fixHooks[type];

			if (!fixHook) {
				this.fixHooks[type] = fixHook = rmouseEvent.test(type) ? this.mouseHooks : rkeyEvent.test(type) ? this.keyHooks : {};
			}
			copy = fixHook.props ? this.props.concat(fixHook.props) : this.props;

			event = new jQuery.Event(originalEvent);

			i = copy.length;
			while (i--) {
				prop = copy[i];
				event[prop] = originalEvent[prop];
			}

			// Support: Cordova 2.5 (WebKit) (#13255)
			// All events should have a target; Cordova deviceready doesn't
			if (!event.target) {
				event.target = document;
			}

			// Support: Safari 6.0+, Chrome<28
			// Target should not be a text node (#504, #13143)
			if (event.target.nodeType === 3) {
				event.target = event.target.parentNode;
			}

			return fixHook.filter ? fixHook.filter(event, originalEvent) : event;
		},

		special: {
			load: {

				// Prevent triggered image.load events from bubbling to window.load
				noBubble: true
			},
			focus: {

				// Fire native event if possible so blur/focus sequence is correct
				trigger: function () {
					if (this !== safeActiveElement() && this.focus) {
						this.focus();
						return false;
					}
				},
				delegateType: "focusin"
			},
			blur: {
				trigger: function () {
					if (this === safeActiveElement() && this.blur) {
						this.blur();
						return false;
					}
				},
				delegateType: "focusout"
			},
			click: {

				// For checkbox, fire native event so checked state will be right
				trigger: function () {
					if (this.type === "checkbox" && this.click && jQuery.nodeName(this, "input")) {
						this.click();
						return false;
					}
				},

				// For cross-browser consistency, don't fire native .click() on links
				_default: function (event) {
					return jQuery.nodeName(event.target, "a");
				}
			},

			beforeunload: {
				postDispatch: function (event) {

					// Support: Firefox 20+
					// Firefox doesn't alert if the returnValue field is not set.
					if (event.result !== undefined && event.originalEvent) {
						event.originalEvent.returnValue = event.result;
					}
				}
			}
		}
	};

	jQuery.removeEvent = function (elem, type, handle) {

		// This "if" is needed for plain objects
		if (elem.removeEventListener) {
			elem.removeEventListener(type, handle);
		}
	};

	jQuery.Event = function (src, props) {

		// Allow instantiation without the 'new' keyword
		if (!(this instanceof jQuery.Event)) {
			return new jQuery.Event(src, props);
		}

		// Event object
		if (src && src.type) {
			this.originalEvent = src;
			this.type = src.type;

			// Events bubbling up the document may have been marked as prevented
			// by a handler lower down the tree; reflect the correct value.
			this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined &&

			// Support: Android<4.0
			src.returnValue === false ? returnTrue : returnFalse;

			// Event type
		} else {
			this.type = src;
		}

		// Put explicitly provided properties onto the event object
		if (props) {
			jQuery.extend(this, props);
		}

		// Create a timestamp if incoming event doesn't have one
		this.timeStamp = src && src.timeStamp || jQuery.now();

		// Mark it as fixed
		this[jQuery.expando] = true;
	};

	// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
	// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
	jQuery.Event.prototype = {
		constructor: jQuery.Event,
		isDefaultPrevented: returnFalse,
		isPropagationStopped: returnFalse,
		isImmediatePropagationStopped: returnFalse,
		isSimulated: false,

		preventDefault: function () {
			var e = this.originalEvent;

			this.isDefaultPrevented = returnTrue;

			if (e && !this.isSimulated) {
				e.preventDefault();
			}
		},
		stopPropagation: function () {
			var e = this.originalEvent;

			this.isPropagationStopped = returnTrue;

			if (e && !this.isSimulated) {
				e.stopPropagation();
			}
		},
		stopImmediatePropagation: function () {
			var e = this.originalEvent;

			this.isImmediatePropagationStopped = returnTrue;

			if (e && !this.isSimulated) {
				e.stopImmediatePropagation();
			}

			this.stopPropagation();
		}
	};

	// Create mouseenter/leave events using mouseover/out and event-time checks
	// so that event delegation works in jQuery.
	// Do the same for pointerenter/pointerleave and pointerover/pointerout
	//
	// Support: Safari 7 only
	// Safari sends mouseenter too often; see:
	// https://code.google.com/p/chromium/issues/detail?id=470258
	// for the description of the bug (it existed in older Chrome versions as well).
	jQuery.each({
		mouseenter: "mouseover",
		mouseleave: "mouseout",
		pointerenter: "pointerover",
		pointerleave: "pointerout"
	}, function (orig, fix) {
		jQuery.event.special[orig] = {
			delegateType: fix,
			bindType: fix,

			handle: function (event) {
				var ret,
				    target = this,
				    related = event.relatedTarget,
				    handleObj = event.handleObj;

				// For mouseenter/leave call the handler if related is outside the target.
				// NB: No relatedTarget if the mouse left/entered the browser window
				if (!related || related !== target && !jQuery.contains(target, related)) {
					event.type = handleObj.origType;
					ret = handleObj.handler.apply(this, arguments);
					event.type = fix;
				}
				return ret;
			}
		};
	});

	jQuery.fn.extend({
		on: function (types, selector, data, fn) {
			return on(this, types, selector, data, fn);
		},
		one: function (types, selector, data, fn) {
			return on(this, types, selector, data, fn, 1);
		},
		off: function (types, selector, fn) {
			var handleObj, type;
			if (types && types.preventDefault && types.handleObj) {

				// ( event )  dispatched jQuery.Event
				handleObj = types.handleObj;
				jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler);
				return this;
			}
			if (typeof types === "object") {

				// ( types-object [, selector] )
				for (type in types) {
					this.off(type, selector, types[type]);
				}
				return this;
			}
			if (selector === false || typeof selector === "function") {

				// ( types [, fn] )
				fn = selector;
				selector = undefined;
			}
			if (fn === false) {
				fn = returnFalse;
			}
			return this.each(function () {
				jQuery.event.remove(this, types, fn, selector);
			});
		}
	});

	var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,


	// Support: IE 10-11, Edge 10240+
	// In IE/Edge using regex groups here causes severe slowdowns.
	// See https://connect.microsoft.com/IE/feedback/details/1736512/
	rnoInnerhtml = /<script|<style|<link/i,


	// checked="checked" or checked
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
	    rscriptTypeMasked = /^true\/(.*)/,
	    rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;

	// Manipulating tables requires a tbody
	function manipulationTarget(elem, content) {
		return jQuery.nodeName(elem, "table") && jQuery.nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr") ? elem.getElementsByTagName("tbody")[0] || elem.appendChild(elem.ownerDocument.createElement("tbody")) : elem;
	}

	// Replace/restore the type attribute of script elements for safe DOM manipulation
	function disableScript(elem) {
		elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
		return elem;
	}
	function restoreScript(elem) {
		var match = rscriptTypeMasked.exec(elem.type);

		if (match) {
			elem.type = match[1];
		} else {
			elem.removeAttribute("type");
		}

		return elem;
	}

	function cloneCopyEvent(src, dest) {
		var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;

		if (dest.nodeType !== 1) {
			return;
		}

		// 1. Copy private data: events, handlers, etc.
		if (dataPriv.hasData(src)) {
			pdataOld = dataPriv.access(src);
			pdataCur = dataPriv.set(dest, pdataOld);
			events = pdataOld.events;

			if (events) {
				delete pdataCur.handle;
				pdataCur.events = {};

				for (type in events) {
					for (i = 0, l = events[type].length; i < l; i++) {
						jQuery.event.add(dest, type, events[type][i]);
					}
				}
			}
		}

		// 2. Copy user data
		if (dataUser.hasData(src)) {
			udataOld = dataUser.access(src);
			udataCur = jQuery.extend({}, udataOld);

			dataUser.set(dest, udataCur);
		}
	}

	// Fix IE bugs, see support tests
	function fixInput(src, dest) {
		var nodeName = dest.nodeName.toLowerCase();

		// Fails to persist the checked state of a cloned checkbox or radio button.
		if (nodeName === "input" && rcheckableType.test(src.type)) {
			dest.checked = src.checked;

			// Fails to return the selected option to the default selected state when cloning options
		} else if (nodeName === "input" || nodeName === "textarea") {
			dest.defaultValue = src.defaultValue;
		}
	}

	function domManip(collection, args, callback, ignored) {

		// Flatten any nested arrays
		args = concat.apply([], args);

		var fragment,
		    first,
		    scripts,
		    hasScripts,
		    node,
		    doc,
		    i = 0,
		    l = collection.length,
		    iNoClone = l - 1,
		    value = args[0],
		    isFunction = jQuery.isFunction(value);

		// We can't cloneNode fragments that contain checked, in WebKit
		if (isFunction || l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value)) {
			return collection.each(function (index) {
				var self = collection.eq(index);
				if (isFunction) {
					args[0] = value.call(this, index, self.html());
				}
				domManip(self, args, callback, ignored);
			});
		}

		if (l) {
			fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);
			first = fragment.firstChild;

			if (fragment.childNodes.length === 1) {
				fragment = first;
			}

			// Require either new content or an interest in ignored elements to invoke the callback
			if (first || ignored) {
				scripts = jQuery.map(getAll(fragment, "script"), disableScript);
				hasScripts = scripts.length;

				// Use the original fragment for the last item
				// instead of the first because it can end up
				// being emptied incorrectly in certain situations (#8070).
				for (; i < l; i++) {
					node = fragment;

					if (i !== iNoClone) {
						node = jQuery.clone(node, true, true);

						// Keep references to cloned scripts for later restoration
						if (hasScripts) {

							// Support: Android<4.1, PhantomJS<2
							// push.apply(_, arraylike) throws on ancient WebKit
							jQuery.merge(scripts, getAll(node, "script"));
						}
					}

					callback.call(collection[i], node, i);
				}

				if (hasScripts) {
					doc = scripts[scripts.length - 1].ownerDocument;

					// Reenable scripts
					jQuery.map(scripts, restoreScript);

					// Evaluate executable scripts on first document insertion
					for (i = 0; i < hasScripts; i++) {
						node = scripts[i];
						if (rscriptType.test(node.type || "") && !dataPriv.access(node, "globalEval") && jQuery.contains(doc, node)) {

							if (node.src) {

								// Optional AJAX dependency, but won't run scripts if not present
								if (jQuery._evalUrl) {
									jQuery._evalUrl(node.src);
								}
							} else {
								jQuery.globalEval(node.textContent.replace(rcleanScript, ""));
							}
						}
					}
				}
			}
		}

		return collection;
	}

	function remove(elem, selector, keepData) {
		var node,
		    nodes = selector ? jQuery.filter(selector, elem) : elem,
		    i = 0;

		for (; (node = nodes[i]) != null; i++) {
			if (!keepData && node.nodeType === 1) {
				jQuery.cleanData(getAll(node));
			}

			if (node.parentNode) {
				if (keepData && jQuery.contains(node.ownerDocument, node)) {
					setGlobalEval(getAll(node, "script"));
				}
				node.parentNode.removeChild(node);
			}
		}

		return elem;
	}

	jQuery.extend({
		htmlPrefilter: function (html) {
			return html.replace(rxhtmlTag, "<$1></$2>");
		},

		clone: function (elem, dataAndEvents, deepDataAndEvents) {
			var i,
			    l,
			    srcElements,
			    destElements,
			    clone = elem.cloneNode(true),
			    inPage = jQuery.contains(elem.ownerDocument, elem);

			// Fix IE cloning issues
			if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {

				// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
				destElements = getAll(clone);
				srcElements = getAll(elem);

				for (i = 0, l = srcElements.length; i < l; i++) {
					fixInput(srcElements[i], destElements[i]);
				}
			}

			// Copy the events from the original to the clone
			if (dataAndEvents) {
				if (deepDataAndEvents) {
					srcElements = srcElements || getAll(elem);
					destElements = destElements || getAll(clone);

					for (i = 0, l = srcElements.length; i < l; i++) {
						cloneCopyEvent(srcElements[i], destElements[i]);
					}
				} else {
					cloneCopyEvent(elem, clone);
				}
			}

			// Preserve script evaluation history
			destElements = getAll(clone, "script");
			if (destElements.length > 0) {
				setGlobalEval(destElements, !inPage && getAll(elem, "script"));
			}

			// Return the cloned set
			return clone;
		},

		cleanData: function (elems) {
			var data,
			    elem,
			    type,
			    special = jQuery.event.special,
			    i = 0;

			for (; (elem = elems[i]) !== undefined; i++) {
				if (acceptData(elem)) {
					if (data = elem[dataPriv.expando]) {
						if (data.events) {
							for (type in data.events) {
								if (special[type]) {
									jQuery.event.remove(elem, type);

									// This is a shortcut to avoid jQuery.event.remove's overhead
								} else {
									jQuery.removeEvent(elem, type, data.handle);
								}
							}
						}

						// Support: Chrome <= 35-45+
						// Assign undefined instead of using delete, see Data#remove
						elem[dataPriv.expando] = undefined;
					}
					if (elem[dataUser.expando]) {

						// Support: Chrome <= 35-45+
						// Assign undefined instead of using delete, see Data#remove
						elem[dataUser.expando] = undefined;
					}
				}
			}
		}
	});

	jQuery.fn.extend({

		// Keep domManip exposed until 3.0 (gh-2225)
		domManip: domManip,

		detach: function (selector) {
			return remove(this, selector, true);
		},

		remove: function (selector) {
			return remove(this, selector);
		},

		text: function (value) {
			return access(this, function (value) {
				return value === undefined ? jQuery.text(this) : this.empty().each(function () {
					if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
						this.textContent = value;
					}
				});
			}, null, value, arguments.length);
		},

		append: function () {
			return domManip(this, arguments, function (elem) {
				if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
					var target = manipulationTarget(this, elem);
					target.appendChild(elem);
				}
			});
		},

		prepend: function () {
			return domManip(this, arguments, function (elem) {
				if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
					var target = manipulationTarget(this, elem);
					target.insertBefore(elem, target.firstChild);
				}
			});
		},

		before: function () {
			return domManip(this, arguments, function (elem) {
				if (this.parentNode) {
					this.parentNode.insertBefore(elem, this);
				}
			});
		},

		after: function () {
			return domManip(this, arguments, function (elem) {
				if (this.parentNode) {
					this.parentNode.insertBefore(elem, this.nextSibling);
				}
			});
		},

		empty: function () {
			var elem,
			    i = 0;

			for (; (elem = this[i]) != null; i++) {
				if (elem.nodeType === 1) {

					// Prevent memory leaks
					jQuery.cleanData(getAll(elem, false));

					// Remove any remaining nodes
					elem.textContent = "";
				}
			}

			return this;
		},

		clone: function (dataAndEvents, deepDataAndEvents) {
			dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
			deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;

			return this.map(function () {
				return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
			});
		},

		html: function (value) {
			return access(this, function (value) {
				var elem = this[0] || {},
				    i = 0,
				    l = this.length;

				if (value === undefined && elem.nodeType === 1) {
					return elem.innerHTML;
				}

				// See if we can take a shortcut and just use innerHTML
				if (typeof value === "string" && !rnoInnerhtml.test(value) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) {

					value = jQuery.htmlPrefilter(value);

					try {
						for (; i < l; i++) {
							elem = this[i] || {};

							// Remove element nodes and prevent memory leaks
							if (elem.nodeType === 1) {
								jQuery.cleanData(getAll(elem, false));
								elem.innerHTML = value;
							}
						}

						elem = 0;

						// If using innerHTML throws an exception, use the fallback method
					} catch (e) {}
				}

				if (elem) {
					this.empty().append(value);
				}
			}, null, value, arguments.length);
		},

		replaceWith: function () {
			var ignored = [];

			// Make the changes, replacing each non-ignored context element with the new content
			return domManip(this, arguments, function (elem) {
				var parent = this.parentNode;

				if (jQuery.inArray(this, ignored) < 0) {
					jQuery.cleanData(getAll(this));
					if (parent) {
						parent.replaceChild(elem, this);
					}
				}

				// Force callback invocation
			}, ignored);
		}
	});

	jQuery.each({
		appendTo: "append",
		prependTo: "prepend",
		insertBefore: "before",
		insertAfter: "after",
		replaceAll: "replaceWith"
	}, function (name, original) {
		jQuery.fn[name] = function (selector) {
			var elems,
			    ret = [],
			    insert = jQuery(selector),
			    last = insert.length - 1,
			    i = 0;

			for (; i <= last; i++) {
				elems = i === last ? this : this.clone(true);
				jQuery(insert[i])[original](elems);

				// Support: QtWebKit
				// .get() because push.apply(_, arraylike) throws
				push.apply(ret, elems.get());
			}

			return this.pushStack(ret);
		};
	});

	var iframe,
	    elemdisplay = {

		// Support: Firefox
		// We have to pre-define these values for FF (#10227)
		HTML: "block",
		BODY: "block"
	};

	/**
  * Retrieve the actual display of a element
  * @param {String} name nodeName of the element
  * @param {Object} doc Document object
  */

	// Called only from within defaultDisplay
	function actualDisplay(name, doc) {
		var elem = jQuery(doc.createElement(name)).appendTo(doc.body),
		    display = jQuery.css(elem[0], "display");

		// We don't have any data stored on the element,
		// so use "detach" method as fast way to get rid of the element
		elem.detach();

		return display;
	}

	/**
  * Try to determine the default display value of an element
  * @param {String} nodeName
  */
	function defaultDisplay(nodeName) {
		var doc = document,
		    display = elemdisplay[nodeName];

		if (!display) {
			display = actualDisplay(nodeName, doc);

			// If the simple way fails, read from inside an iframe
			if (display === "none" || !display) {

				// Use the already-created iframe if possible
				iframe = (iframe || jQuery("<iframe frameborder='0' width='0' height='0'/>")).appendTo(doc.documentElement);

				// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
				doc = iframe[0].contentDocument;

				// Support: IE
				doc.write();
				doc.close();

				display = actualDisplay(nodeName, doc);
				iframe.detach();
			}

			// Store the correct default display
			elemdisplay[nodeName] = display;
		}

		return display;
	}
	var rmargin = /^margin/;

	var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");

	var getStyles = function (elem) {

		// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
		// IE throws on elements created in popups
		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
		var view = elem.ownerDocument.defaultView;

		if (!view || !view.opener) {
			view = window;
		}

		return view.getComputedStyle(elem);
	};

	var swap = function (elem, options, callback, args) {
		var ret,
		    name,
		    old = {};

		// Remember the old values, and insert the new ones
		for (name in options) {
			old[name] = elem.style[name];
			elem.style[name] = options[name];
		}

		ret = callback.apply(elem, args || []);

		// Revert the old values
		for (name in options) {
			elem.style[name] = old[name];
		}

		return ret;
	};

	var documentElement = document.documentElement;

	(function () {
		var pixelPositionVal,
		    boxSizingReliableVal,
		    pixelMarginRightVal,
		    reliableMarginLeftVal,
		    container = document.createElement("div"),
		    div = document.createElement("div");

		// Finish early in limited (non-browser) environments
		if (!div.style) {
			return;
		}

		// Support: IE9-11+
		// Style of cloned element affects source element cloned (#8908)
		div.style.backgroundClip = "content-box";
		div.cloneNode(true).style.backgroundClip = "";
		support.clearCloneStyle = div.style.backgroundClip === "content-box";

		container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + "padding:0;margin-top:1px;position:absolute";
		container.appendChild(div);

		// Executing both pixelPosition & boxSizingReliable tests require only one layout
		// so they're executed at the same time to save the second computation.
		function computeStyleTests() {
			div.style.cssText =

			// Support: Firefox<29, Android 2.3
			// Vendor-prefix box-sizing
			"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;" + "position:relative;display:block;" + "margin:auto;border:1px;padding:1px;" + "top:1%;width:50%";
			div.innerHTML = "";
			documentElement.appendChild(container);

			var divStyle = window.getComputedStyle(div);
			pixelPositionVal = divStyle.top !== "1%";
			reliableMarginLeftVal = divStyle.marginLeft === "2px";
			boxSizingReliableVal = divStyle.width === "4px";

			// Support: Android 4.0 - 4.3 only
			// Some styles come back with percentage values, even though they shouldn't
			div.style.marginRight = "50%";
			pixelMarginRightVal = divStyle.marginRight === "4px";

			documentElement.removeChild(container);
		}

		jQuery.extend(support, {
			pixelPosition: function () {

				// This test is executed only once but we still do memoizing
				// since we can use the boxSizingReliable pre-computing.
				// No need to check if the test was already performed, though.
				computeStyleTests();
				return pixelPositionVal;
			},
			boxSizingReliable: function () {
				if (boxSizingReliableVal == null) {
					computeStyleTests();
				}
				return boxSizingReliableVal;
			},
			pixelMarginRight: function () {

				// Support: Android 4.0-4.3
				// We're checking for boxSizingReliableVal here instead of pixelMarginRightVal
				// since that compresses better and they're computed together anyway.
				if (boxSizingReliableVal == null) {
					computeStyleTests();
				}
				return pixelMarginRightVal;
			},
			reliableMarginLeft: function () {

				// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
				if (boxSizingReliableVal == null) {
					computeStyleTests();
				}
				return reliableMarginLeftVal;
			},
			reliableMarginRight: function () {

				// Support: Android 2.3
				// Check if div with explicit width and no margin-right incorrectly
				// gets computed margin-right based on width of container. (#3333)
				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
				// This support function is only executed once so no memoizing is needed.
				var ret,
				    marginDiv = div.appendChild(document.createElement("div"));

				// Reset CSS: box-sizing; display; margin; border; padding
				marginDiv.style.cssText = div.style.cssText =

				// Support: Android 2.3
				// Vendor-prefix box-sizing
				"-webkit-box-sizing:content-box;box-sizing:content-box;" + "display:block;margin:0;border:0;padding:0";
				marginDiv.style.marginRight = marginDiv.style.width = "0";
				div.style.width = "1px";
				documentElement.appendChild(container);

				ret = !parseFloat(window.getComputedStyle(marginDiv).marginRight);

				documentElement.removeChild(container);
				div.removeChild(marginDiv);

				return ret;
			}
		});
	})();

	function curCSS(elem, name, computed) {
		var width,
		    minWidth,
		    maxWidth,
		    ret,
		    style = elem.style;

		computed = computed || getStyles(elem);
		ret = computed ? computed.getPropertyValue(name) || computed[name] : undefined;

		// Support: Opera 12.1x only
		// Fall back to style even without computed
		// computed is undefined for elems on document fragments
		if ((ret === "" || ret === undefined) && !jQuery.contains(elem.ownerDocument, elem)) {
			ret = jQuery.style(elem, name);
		}

		// Support: IE9
		// getPropertyValue is only needed for .css('filter') (#12537)
		if (computed) {

			// A tribute to the "awesome hack by Dean Edwards"
			// Android Browser returns percentage for some values,
			// but width seems to be reliably pixels.
			// This is against the CSSOM draft spec:
			// http://dev.w3.org/csswg/cssom/#resolved-values
			if (!support.pixelMarginRight() && rnumnonpx.test(ret) && rmargin.test(name)) {

				// Remember the original values
				width = style.width;
				minWidth = style.minWidth;
				maxWidth = style.maxWidth;

				// Put in the new values to get a computed value out
				style.minWidth = style.maxWidth = style.width = ret;
				ret = computed.width;

				// Revert the changed values
				style.width = width;
				style.minWidth = minWidth;
				style.maxWidth = maxWidth;
			}
		}

		return ret !== undefined ?

		// Support: IE9-11+
		// IE returns zIndex value as an integer.
		ret + "" : ret;
	}

	function addGetHookIf(conditionFn, hookFn) {

		// Define the hook, we'll check on the first run if it's really needed.
		return {
			get: function () {
				if (conditionFn()) {

					// Hook not needed (or it's not possible to use it due
					// to missing dependency), remove it.
					delete this.get;
					return;
				}

				// Hook needed; redefine it so that the support test is not executed again.
				return (this.get = hookFn).apply(this, arguments);
			}
		};
	}

	var

	// Swappable if display is none or starts with table
	// except "table", "table-cell", or "table-caption"
	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
	    cssShow = { position: "absolute", visibility: "hidden", display: "block" },
	    cssNormalTransform = {
		letterSpacing: "0",
		fontWeight: "400"
	},
	    cssPrefixes = ["Webkit", "O", "Moz", "ms"],
	    emptyStyle = document.createElement("div").style;

	// Return a css property mapped to a potentially vendor prefixed property
	function vendorPropName(name) {

		// Shortcut for names that are not vendor prefixed
		if (name in emptyStyle) {
			return name;
		}

		// Check for vendor prefixed names
		var capName = name[0].toUpperCase() + name.slice(1),
		    i = cssPrefixes.length;

		while (i--) {
			name = cssPrefixes[i] + capName;
			if (name in emptyStyle) {
				return name;
			}
		}
	}

	function setPositiveNumber(elem, value, subtract) {

		// Any relative (+/-) values have already been
		// normalized at this point
		var matches = rcssNum.exec(value);
		return matches ?

		// Guard against undefined "subtract", e.g., when used as in cssHooks
		Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px") : value;
	}

	function augmentWidthOrHeight(elem, name, extra, isBorderBox, styles) {
		var i = extra === (isBorderBox ? "border" : "content") ?

		// If we already have the right measurement, avoid augmentation
		4 :

		// Otherwise initialize for horizontal or vertical properties
		name === "width" ? 1 : 0,
		    val = 0;

		for (; i < 4; i += 2) {

			// Both box models exclude margin, so add it if we want it
			if (extra === "margin") {
				val += jQuery.css(elem, extra + cssExpand[i], true, styles);
			}

			if (isBorderBox) {

				// border-box includes padding, so remove it if we want content
				if (extra === "content") {
					val -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
				}

				// At this point, extra isn't border nor margin, so remove border
				if (extra !== "margin") {
					val -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
				}
			} else {

				// At this point, extra isn't content, so add padding
				val += jQuery.css(elem, "padding" + cssExpand[i], true, styles);

				// At this point, extra isn't content nor padding, so add border
				if (extra !== "padding") {
					val += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
				}
			}
		}

		return val;
	}

	function getWidthOrHeight(elem, name, extra) {

		// Start with offset property, which is equivalent to the border-box value
		var valueIsBorderBox = true,
		    val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
		    styles = getStyles(elem),
		    isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box";

		// Some non-html elements return undefined for offsetWidth, so check for null/undefined
		// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
		// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
		if (val <= 0 || val == null) {

			// Fall back to computed then uncomputed css if necessary
			val = curCSS(elem, name, styles);
			if (val < 0 || val == null) {
				val = elem.style[name];
			}

			// Computed unit is not pixels. Stop here and return.
			if (rnumnonpx.test(val)) {
				return val;
			}

			// Check for style in case a browser which returns unreliable values
			// for getComputedStyle silently falls back to the reliable elem.style
			valueIsBorderBox = isBorderBox && (support.boxSizingReliable() || val === elem.style[name]);

			// Normalize "", auto, and prepare for extra
			val = parseFloat(val) || 0;
		}

		// Use the active box-sizing model to add/subtract irrelevant styles
		return val + augmentWidthOrHeight(elem, name, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox, styles) + "px";
	}

	function showHide(elements, show) {
		var display,
		    elem,
		    hidden,
		    values = [],
		    index = 0,
		    length = elements.length;

		for (; index < length; index++) {
			elem = elements[index];
			if (!elem.style) {
				continue;
			}

			values[index] = dataPriv.get(elem, "olddisplay");
			display = elem.style.display;
			if (show) {

				// Reset the inline display of this element to learn if it is
				// being hidden by cascaded rules or not
				if (!values[index] && display === "none") {
					elem.style.display = "";
				}

				// Set elements which have been overridden with display: none
				// in a stylesheet to whatever the default browser style is
				// for such an element
				if (elem.style.display === "" && isHidden(elem)) {
					values[index] = dataPriv.access(elem, "olddisplay", defaultDisplay(elem.nodeName));
				}
			} else {
				hidden = isHidden(elem);

				if (display !== "none" || !hidden) {
					dataPriv.set(elem, "olddisplay", hidden ? display : jQuery.css(elem, "display"));
				}
			}
		}

		// Set the display of most of the elements in a second loop
		// to avoid the constant reflow
		for (index = 0; index < length; index++) {
			elem = elements[index];
			if (!elem.style) {
				continue;
			}
			if (!show || elem.style.display === "none" || elem.style.display === "") {
				elem.style.display = show ? values[index] || "" : "none";
			}
		}

		return elements;
	}

	jQuery.extend({

		// Add in style property hooks for overriding the default
		// behavior of getting and setting a style property
		cssHooks: {
			opacity: {
				get: function (elem, computed) {
					if (computed) {

						// We should always get a number back from opacity
						var ret = curCSS(elem, "opacity");
						return ret === "" ? "1" : ret;
					}
				}
			}
		},

		// Don't automatically add "px" to these possibly-unitless properties
		cssNumber: {
			"animationIterationCount": true,
			"columnCount": true,
			"fillOpacity": true,
			"flexGrow": true,
			"flexShrink": true,
			"fontWeight": true,
			"lineHeight": true,
			"opacity": true,
			"order": true,
			"orphans": true,
			"widows": true,
			"zIndex": true,
			"zoom": true
		},

		// Add in properties whose names you wish to fix before
		// setting or getting the value
		cssProps: {
			"float": "cssFloat"
		},

		// Get and set the style property on a DOM Node
		style: function (elem, name, value, extra) {

			// Don't set styles on text and comment nodes
			if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
				return;
			}

			// Make sure that we're working with the right name
			var ret,
			    type,
			    hooks,
			    origName = jQuery.camelCase(name),
			    style = elem.style;

			name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(origName) || origName);

			// Gets hook for the prefixed version, then unprefixed version
			hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];

			// Check if we're setting a value
			if (value !== undefined) {
				type = typeof value;

				// Convert "+=" or "-=" to relative numbers (#7345)
				if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) {
					value = adjustCSS(elem, name, ret);

					// Fixes bug #9237
					type = "number";
				}

				// Make sure that null and NaN values aren't set (#7116)
				if (value == null || value !== value) {
					return;
				}

				// If a number was passed in, add the unit (except for certain CSS properties)
				if (type === "number") {
					value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px");
				}

				// Support: IE9-11+
				// background-* props affect original clone's values
				if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {
					style[name] = "inherit";
				}

				// If a hook was provided, use that value, otherwise just set the specified value
				if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) {

					style[name] = value;
				}
			} else {

				// If a hook was provided get the non-computed value from there
				if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) {

					return ret;
				}

				// Otherwise just get the value from the style object
				return style[name];
			}
		},

		css: function (elem, name, extra, styles) {
			var val,
			    num,
			    hooks,
			    origName = jQuery.camelCase(name);

			// Make sure that we're working with the right name
			name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(origName) || origName);

			// Try prefixed name followed by the unprefixed name
			hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];

			// If a hook was provided get the computed value from there
			if (hooks && "get" in hooks) {
				val = hooks.get(elem, true, extra);
			}

			// Otherwise, if a way to get the computed value exists, use that
			if (val === undefined) {
				val = curCSS(elem, name, styles);
			}

			// Convert "normal" to computed value
			if (val === "normal" && name in cssNormalTransform) {
				val = cssNormalTransform[name];
			}

			// Make numeric if forced or a qualifier was provided and val looks numeric
			if (extra === "" || extra) {
				num = parseFloat(val);
				return extra === true || isFinite(num) ? num || 0 : val;
			}
			return val;
		}
	});

	jQuery.each(["height", "width"], function (i, name) {
		jQuery.cssHooks[name] = {
			get: function (elem, computed, extra) {
				if (computed) {

					// Certain elements can have dimension info if we invisibly show them
					// but it must have a current display style that would benefit
					return rdisplayswap.test(jQuery.css(elem, "display")) && elem.offsetWidth === 0 ? swap(elem, cssShow, function () {
						return getWidthOrHeight(elem, name, extra);
					}) : getWidthOrHeight(elem, name, extra);
				}
			},

			set: function (elem, value, extra) {
				var matches,
				    styles = extra && getStyles(elem),
				    subtract = extra && augmentWidthOrHeight(elem, name, extra, jQuery.css(elem, "boxSizing", false, styles) === "border-box", styles);

				// Convert to pixels if value adjustment is needed
				if (subtract && (matches = rcssNum.exec(value)) && (matches[3] || "px") !== "px") {

					elem.style[name] = value;
					value = jQuery.css(elem, name);
				}

				return setPositiveNumber(elem, value, subtract);
			}
		};
	});

	jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function (elem, computed) {
		if (computed) {
			return (parseFloat(curCSS(elem, "marginLeft")) || elem.getBoundingClientRect().left - swap(elem, { marginLeft: 0 }, function () {
				return elem.getBoundingClientRect().left;
			})) + "px";
		}
	});

	// Support: Android 2.3
	jQuery.cssHooks.marginRight = addGetHookIf(support.reliableMarginRight, function (elem, computed) {
		if (computed) {
			return swap(elem, { "display": "inline-block" }, curCSS, [elem, "marginRight"]);
		}
	});

	// These hooks are used by animate to expand properties
	jQuery.each({
		margin: "",
		padding: "",
		border: "Width"
	}, function (prefix, suffix) {
		jQuery.cssHooks[prefix + suffix] = {
			expand: function (value) {
				var i = 0,
				    expanded = {},


				// Assumes a single number if not a string
				parts = typeof value === "string" ? value.split(" ") : [value];

				for (; i < 4; i++) {
					expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];
				}

				return expanded;
			}
		};

		if (!rmargin.test(prefix)) {
			jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
		}
	});

	jQuery.fn.extend({
		css: function (name, value) {
			return access(this, function (elem, name, value) {
				var styles,
				    len,
				    map = {},
				    i = 0;

				if (jQuery.isArray(name)) {
					styles = getStyles(elem);
					len = name.length;

					for (; i < len; i++) {
						map[name[i]] = jQuery.css(elem, name[i], false, styles);
					}

					return map;
				}

				return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name);
			}, name, value, arguments.length > 1);
		},
		show: function () {
			return showHide(this, true);
		},
		hide: function () {
			return showHide(this);
		},
		toggle: function (state) {
			if (typeof state === "boolean") {
				return state ? this.show() : this.hide();
			}

			return this.each(function () {
				if (isHidden(this)) {
					jQuery(this).show();
				} else {
					jQuery(this).hide();
				}
			});
		}
	});

	function Tween(elem, options, prop, end, easing) {
		return new Tween.prototype.init(elem, options, prop, end, easing);
	}
	jQuery.Tween = Tween;

	Tween.prototype = {
		constructor: Tween,
		init: function (elem, options, prop, end, easing, unit) {
			this.elem = elem;
			this.prop = prop;
			this.easing = easing || jQuery.easing._default;
			this.options = options;
			this.start = this.now = this.cur();
			this.end = end;
			this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
		},
		cur: function () {
			var hooks = Tween.propHooks[this.prop];

			return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);
		},
		run: function (percent) {
			var eased,
			    hooks = Tween.propHooks[this.prop];

			if (this.options.duration) {
				this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration);
			} else {
				this.pos = eased = percent;
			}
			this.now = (this.end - this.start) * eased + this.start;

			if (this.options.step) {
				this.options.step.call(this.elem, this.now, this);
			}

			if (hooks && hooks.set) {
				hooks.set(this);
			} else {
				Tween.propHooks._default.set(this);
			}
			return this;
		}
	};

	Tween.prototype.init.prototype = Tween.prototype;

	Tween.propHooks = {
		_default: {
			get: function (tween) {
				var result;

				// Use a property on the element directly when it is not a DOM element,
				// or when there is no matching style property that exists.
				if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {
					return tween.elem[tween.prop];
				}

				// Passing an empty string as a 3rd parameter to .css will automatically
				// attempt a parseFloat and fallback to a string if the parse fails.
				// Simple values such as "10px" are parsed to Float;
				// complex values such as "rotate(1rad)" are returned as-is.
				result = jQuery.css(tween.elem, tween.prop, "");

				// Empty strings, null, undefined and "auto" are converted to 0.
				return !result || result === "auto" ? 0 : result;
			},
			set: function (tween) {

				// Use step hook for back compat.
				// Use cssHook if its there.
				// Use .style if available and use plain properties where available.
				if (jQuery.fx.step[tween.prop]) {
					jQuery.fx.step[tween.prop](tween);
				} else if (tween.elem.nodeType === 1 && (tween.elem.style[jQuery.cssProps[tween.prop]] != null || jQuery.cssHooks[tween.prop])) {
					jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
				} else {
					tween.elem[tween.prop] = tween.now;
				}
			}
		}
	};

	// Support: IE9
	// Panic based approach to setting things on disconnected nodes
	Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
		set: function (tween) {
			if (tween.elem.nodeType && tween.elem.parentNode) {
				tween.elem[tween.prop] = tween.now;
			}
		}
	};

	jQuery.easing = {
		linear: function (p) {
			return p;
		},
		swing: function (p) {
			return 0.5 - Math.cos(p * Math.PI) / 2;
		},
		_default: "swing"
	};

	jQuery.fx = Tween.prototype.init;

	// Back Compat <1.8 extension point
	jQuery.fx.step = {};

	var fxNow,
	    timerId,
	    rfxtypes = /^(?:toggle|show|hide)$/,
	    rrun = /queueHooks$/;

	// Animations created synchronously will run synchronously
	function createFxNow() {
		window.setTimeout(function () {
			fxNow = undefined;
		});
		return fxNow = jQuery.now();
	}

	// Generate parameters to create a standard animation
	function genFx(type, includeWidth) {
		var which,
		    i = 0,
		    attrs = { height: type };

		// If we include width, step value is 1 to do all cssExpand values,
		// otherwise step value is 2 to skip over Left and Right
		includeWidth = includeWidth ? 1 : 0;
		for (; i < 4; i += 2 - includeWidth) {
			which = cssExpand[i];
			attrs["margin" + which] = attrs["padding" + which] = type;
		}

		if (includeWidth) {
			attrs.opacity = attrs.width = type;
		}

		return attrs;
	}

	function createTween(value, prop, animation) {
		var tween,
		    collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]),
		    index = 0,
		    length = collection.length;
		for (; index < length; index++) {
			if (tween = collection[index].call(animation, prop, value)) {

				// We're done with this property
				return tween;
			}
		}
	}

	function defaultPrefilter(elem, props, opts) {
		/* jshint validthis: true */
		var prop,
		    value,
		    toggle,
		    tween,
		    hooks,
		    oldfire,
		    display,
		    checkDisplay,
		    anim = this,
		    orig = {},
		    style = elem.style,
		    hidden = elem.nodeType && isHidden(elem),
		    dataShow = dataPriv.get(elem, "fxshow");

		// Handle queue: false promises
		if (!opts.queue) {
			hooks = jQuery._queueHooks(elem, "fx");
			if (hooks.unqueued == null) {
				hooks.unqueued = 0;
				oldfire = hooks.empty.fire;
				hooks.empty.fire = function () {
					if (!hooks.unqueued) {
						oldfire();
					}
				};
			}
			hooks.unqueued++;

			anim.always(function () {

				// Ensure the complete handler is called before this completes
				anim.always(function () {
					hooks.unqueued--;
					if (!jQuery.queue(elem, "fx").length) {
						hooks.empty.fire();
					}
				});
			});
		}

		// Height/width overflow pass
		if (elem.nodeType === 1 && ("height" in props || "width" in props)) {

			// Make sure that nothing sneaks out
			// Record all 3 overflow attributes because IE9-10 do not
			// change the overflow attribute when overflowX and
			// overflowY are set to the same value
			opts.overflow = [style.overflow, style.overflowX, style.overflowY];

			// Set display property to inline-block for height/width
			// animations on inline elements that are having width/height animated
			display = jQuery.css(elem, "display");

			// Test default display if display is currently "none"
			checkDisplay = display === "none" ? dataPriv.get(elem, "olddisplay") || defaultDisplay(elem.nodeName) : display;

			if (checkDisplay === "inline" && jQuery.css(elem, "float") === "none") {
				style.display = "inline-block";
			}
		}

		if (opts.overflow) {
			style.overflow = "hidden";
			anim.always(function () {
				style.overflow = opts.overflow[0];
				style.overflowX = opts.overflow[1];
				style.overflowY = opts.overflow[2];
			});
		}

		// show/hide pass
		for (prop in props) {
			value = props[prop];
			if (rfxtypes.exec(value)) {
				delete props[prop];
				toggle = toggle || value === "toggle";
				if (value === (hidden ? "hide" : "show")) {

					// If there is dataShow left over from a stopped hide or show
					// and we are going to proceed with show, we should pretend to be hidden
					if (value === "show" && dataShow && dataShow[prop] !== undefined) {
						hidden = true;
					} else {
						continue;
					}
				}
				orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);

				// Any non-fx value stops us from restoring the original display value
			} else {
				display = undefined;
			}
		}

		if (!jQuery.isEmptyObject(orig)) {
			if (dataShow) {
				if ("hidden" in dataShow) {
					hidden = dataShow.hidden;
				}
			} else {
				dataShow = dataPriv.access(elem, "fxshow", {});
			}

			// Store state if its toggle - enables .stop().toggle() to "reverse"
			if (toggle) {
				dataShow.hidden = !hidden;
			}
			if (hidden) {
				jQuery(elem).show();
			} else {
				anim.done(function () {
					jQuery(elem).hide();
				});
			}
			anim.done(function () {
				var prop;

				dataPriv.remove(elem, "fxshow");
				for (prop in orig) {
					jQuery.style(elem, prop, orig[prop]);
				}
			});
			for (prop in orig) {
				tween = createTween(hidden ? dataShow[prop] : 0, prop, anim);

				if (!(prop in dataShow)) {
					dataShow[prop] = tween.start;
					if (hidden) {
						tween.end = tween.start;
						tween.start = prop === "width" || prop === "height" ? 1 : 0;
					}
				}
			}

			// If this is a noop like .hide().hide(), restore an overwritten display value
		} else if ((display === "none" ? defaultDisplay(elem.nodeName) : display) === "inline") {
			style.display = display;
		}
	}

	function propFilter(props, specialEasing) {
		var index, name, easing, value, hooks;

		// camelCase, specialEasing and expand cssHook pass
		for (index in props) {
			name = jQuery.camelCase(index);
			easing = specialEasing[name];
			value = props[index];
			if (jQuery.isArray(value)) {
				easing = value[1];
				value = props[index] = value[0];
			}

			if (index !== name) {
				props[name] = value;
				delete props[index];
			}

			hooks = jQuery.cssHooks[name];
			if (hooks && "expand" in hooks) {
				value = hooks.expand(value);
				delete props[name];

				// Not quite $.extend, this won't overwrite existing keys.
				// Reusing 'index' because we have the correct "name"
				for (index in value) {
					if (!(index in props)) {
						props[index] = value[index];
						specialEasing[index] = easing;
					}
				}
			} else {
				specialEasing[name] = easing;
			}
		}
	}

	function Animation(elem, properties, options) {
		var result,
		    stopped,
		    index = 0,
		    length = Animation.prefilters.length,
		    deferred = jQuery.Deferred().always(function () {

			// Don't match elem in the :animated selector
			delete tick.elem;
		}),
		    tick = function () {
			if (stopped) {
				return false;
			}
			var currentTime = fxNow || createFxNow(),
			    remaining = Math.max(0, animation.startTime + animation.duration - currentTime),


			// Support: Android 2.3
			// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
			temp = remaining / animation.duration || 0,
			    percent = 1 - temp,
			    index = 0,
			    length = animation.tweens.length;

			for (; index < length; index++) {
				animation.tweens[index].run(percent);
			}

			deferred.notifyWith(elem, [animation, percent, remaining]);

			if (percent < 1 && length) {
				return remaining;
			} else {
				deferred.resolveWith(elem, [animation]);
				return false;
			}
		},
		    animation = deferred.promise({
			elem: elem,
			props: jQuery.extend({}, properties),
			opts: jQuery.extend(true, {
				specialEasing: {},
				easing: jQuery.easing._default
			}, options),
			originalProperties: properties,
			originalOptions: options,
			startTime: fxNow || createFxNow(),
			duration: options.duration,
			tweens: [],
			createTween: function (prop, end) {
				var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing);
				animation.tweens.push(tween);
				return tween;
			},
			stop: function (gotoEnd) {
				var index = 0,


				// If we are going to the end, we want to run all the tweens
				// otherwise we skip this part
				length = gotoEnd ? animation.tweens.length : 0;
				if (stopped) {
					return this;
				}
				stopped = true;
				for (; index < length; index++) {
					animation.tweens[index].run(1);
				}

				// Resolve when we played the last frame; otherwise, reject
				if (gotoEnd) {
					deferred.notifyWith(elem, [animation, 1, 0]);
					deferred.resolveWith(elem, [animation, gotoEnd]);
				} else {
					deferred.rejectWith(elem, [animation, gotoEnd]);
				}
				return this;
			}
		}),
		    props = animation.props;

		propFilter(props, animation.opts.specialEasing);

		for (; index < length; index++) {
			result = Animation.prefilters[index].call(animation, elem, props, animation.opts);
			if (result) {
				if (jQuery.isFunction(result.stop)) {
					jQuery._queueHooks(animation.elem, animation.opts.queue).stop = jQuery.proxy(result.stop, result);
				}
				return result;
			}
		}

		jQuery.map(props, createTween, animation);

		if (jQuery.isFunction(animation.opts.start)) {
			animation.opts.start.call(elem, animation);
		}

		jQuery.fx.timer(jQuery.extend(tick, {
			elem: elem,
			anim: animation,
			queue: animation.opts.queue
		}));

		// attach callbacks from options
		return animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);
	}

	jQuery.Animation = jQuery.extend(Animation, {
		tweeners: {
			"*": [function (prop, value) {
				var tween = this.createTween(prop, value);
				adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
				return tween;
			}]
		},

		tweener: function (props, callback) {
			if (jQuery.isFunction(props)) {
				callback = props;
				props = ["*"];
			} else {
				props = props.match(rnotwhite);
			}

			var prop,
			    index = 0,
			    length = props.length;

			for (; index < length; index++) {
				prop = props[index];
				Animation.tweeners[prop] = Animation.tweeners[prop] || [];
				Animation.tweeners[prop].unshift(callback);
			}
		},

		prefilters: [defaultPrefilter],

		prefilter: function (callback, prepend) {
			if (prepend) {
				Animation.prefilters.unshift(callback);
			} else {
				Animation.prefilters.push(callback);
			}
		}
	});

	jQuery.speed = function (speed, easing, fn) {
		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
			complete: fn || !fn && easing || jQuery.isFunction(speed) && speed,
			duration: speed,
			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
		};

		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;

		// Normalize opt.queue - true/undefined/null -> "fx"
		if (opt.queue == null || opt.queue === true) {
			opt.queue = "fx";
		}

		// Queueing
		opt.old = opt.complete;

		opt.complete = function () {
			if (jQuery.isFunction(opt.old)) {
				opt.old.call(this);
			}

			if (opt.queue) {
				jQuery.dequeue(this, opt.queue);
			}
		};

		return opt;
	};

	jQuery.fn.extend({
		fadeTo: function (speed, to, easing, callback) {

			// Show any hidden elements after setting opacity to 0
			return this.filter(isHidden).css("opacity", 0).show()

			// Animate to the value specified
			.end().animate({ opacity: to }, speed, easing, callback);
		},
		animate: function (prop, speed, easing, callback) {
			var empty = jQuery.isEmptyObject(prop),
			    optall = jQuery.speed(speed, easing, callback),
			    doAnimation = function () {

				// Operate on a copy of prop so per-property easing won't be lost
				var anim = Animation(this, jQuery.extend({}, prop), optall);

				// Empty animations, or finishing resolves immediately
				if (empty || dataPriv.get(this, "finish")) {
					anim.stop(true);
				}
			};
			doAnimation.finish = doAnimation;

			return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);
		},
		stop: function (type, clearQueue, gotoEnd) {
			var stopQueue = function (hooks) {
				var stop = hooks.stop;
				delete hooks.stop;
				stop(gotoEnd);
			};

			if (typeof type !== "string") {
				gotoEnd = clearQueue;
				clearQueue = type;
				type = undefined;
			}
			if (clearQueue && type !== false) {
				this.queue(type || "fx", []);
			}

			return this.each(function () {
				var dequeue = true,
				    index = type != null && type + "queueHooks",
				    timers = jQuery.timers,
				    data = dataPriv.get(this);

				if (index) {
					if (data[index] && data[index].stop) {
						stopQueue(data[index]);
					}
				} else {
					for (index in data) {
						if (data[index] && data[index].stop && rrun.test(index)) {
							stopQueue(data[index]);
						}
					}
				}

				for (index = timers.length; index--;) {
					if (timers[index].elem === this && (type == null || timers[index].queue === type)) {

						timers[index].anim.stop(gotoEnd);
						dequeue = false;
						timers.splice(index, 1);
					}
				}

				// Start the next in the queue if the last step wasn't forced.
				// Timers currently will call their complete callbacks, which
				// will dequeue but only if they were gotoEnd.
				if (dequeue || !gotoEnd) {
					jQuery.dequeue(this, type);
				}
			});
		},
		finish: function (type) {
			if (type !== false) {
				type = type || "fx";
			}
			return this.each(function () {
				var index,
				    data = dataPriv.get(this),
				    queue = data[type + "queue"],
				    hooks = data[type + "queueHooks"],
				    timers = jQuery.timers,
				    length = queue ? queue.length : 0;

				// Enable finishing flag on private data
				data.finish = true;

				// Empty the queue first
				jQuery.queue(this, type, []);

				if (hooks && hooks.stop) {
					hooks.stop.call(this, true);
				}

				// Look for any active animations, and finish them
				for (index = timers.length; index--;) {
					if (timers[index].elem === this && timers[index].queue === type) {
						timers[index].anim.stop(true);
						timers.splice(index, 1);
					}
				}

				// Look for any animations in the old queue and finish them
				for (index = 0; index < length; index++) {
					if (queue[index] && queue[index].finish) {
						queue[index].finish.call(this);
					}
				}

				// Turn off finishing flag
				delete data.finish;
			});
		}
	});

	jQuery.each(["toggle", "show", "hide"], function (i, name) {
		var cssFn = jQuery.fn[name];
		jQuery.fn[name] = function (speed, easing, callback) {
			return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);
		};
	});

	// Generate shortcuts for custom animations
	jQuery.each({
		slideDown: genFx("show"),
		slideUp: genFx("hide"),
		slideToggle: genFx("toggle"),
		fadeIn: { opacity: "show" },
		fadeOut: { opacity: "hide" },
		fadeToggle: { opacity: "toggle" }
	}, function (name, props) {
		jQuery.fn[name] = function (speed, easing, callback) {
			return this.animate(props, speed, easing, callback);
		};
	});

	jQuery.timers = [];
	jQuery.fx.tick = function () {
		var timer,
		    i = 0,
		    timers = jQuery.timers;

		fxNow = jQuery.now();

		for (; i < timers.length; i++) {
			timer = timers[i];

			// Checks the timer has not already been removed
			if (!timer() && timers[i] === timer) {
				timers.splice(i--, 1);
			}
		}

		if (!timers.length) {
			jQuery.fx.stop();
		}
		fxNow = undefined;
	};

	jQuery.fx.timer = function (timer) {
		jQuery.timers.push(timer);
		if (timer()) {
			jQuery.fx.start();
		} else {
			jQuery.timers.pop();
		}
	};

	jQuery.fx.interval = 13;
	jQuery.fx.start = function () {
		if (!timerId) {
			timerId = window.setInterval(jQuery.fx.tick, jQuery.fx.interval);
		}
	};

	jQuery.fx.stop = function () {
		window.clearInterval(timerId);

		timerId = null;
	};

	jQuery.fx.speeds = {
		slow: 600,
		fast: 200,

		// Default speed
		_default: 400
	};

	// Based off of the plugin by Clint Helfers, with permission.
	// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
	jQuery.fn.delay = function (time, type) {
		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
		type = type || "fx";

		return this.queue(type, function (next, hooks) {
			var timeout = window.setTimeout(next, time);
			hooks.stop = function () {
				window.clearTimeout(timeout);
			};
		});
	};

	(function () {
		var input = document.createElement("input"),
		    select = document.createElement("select"),
		    opt = select.appendChild(document.createElement("option"));

		input.type = "checkbox";

		// Support: iOS<=5.1, Android<=4.2+
		// Default value for a checkbox should be "on"
		support.checkOn = input.value !== "";

		// Support: IE<=11+
		// Must access selectedIndex to make default options select
		support.optSelected = opt.selected;

		// Support: Android<=2.3
		// Options inside disabled selects are incorrectly marked as disabled
		select.disabled = true;
		support.optDisabled = !opt.disabled;

		// Support: IE<=11+
		// An input loses its value after becoming a radio
		input = document.createElement("input");
		input.value = "t";
		input.type = "radio";
		support.radioValue = input.value === "t";
	})();

	var boolHook,
	    attrHandle = jQuery.expr.attrHandle;

	jQuery.fn.extend({
		attr: function (name, value) {
			return access(this, jQuery.attr, name, value, arguments.length > 1);
		},

		removeAttr: function (name) {
			return this.each(function () {
				jQuery.removeAttr(this, name);
			});
		}
	});

	jQuery.extend({
		attr: function (elem, name, value) {
			var ret,
			    hooks,
			    nType = elem.nodeType;

			// Don't get/set attributes on text, comment and attribute nodes
			if (nType === 3 || nType === 8 || nType === 2) {
				return;
			}

			// Fallback to prop when attributes are not supported
			if (typeof elem.getAttribute === "undefined") {
				return jQuery.prop(elem, name, value);
			}

			// All attributes are lowercase
			// Grab necessary hook if one is defined
			if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
				name = name.toLowerCase();
				hooks = jQuery.attrHooks[name] || (jQuery.expr.match.bool.test(name) ? boolHook : undefined);
			}

			if (value !== undefined) {
				if (value === null) {
					jQuery.removeAttr(elem, name);
					return;
				}

				if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
					return ret;
				}

				elem.setAttribute(name, value + "");
				return value;
			}

			if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
				return ret;
			}

			ret = jQuery.find.attr(elem, name);

			// Non-existent attributes return null, we normalize to undefined
			return ret == null ? undefined : ret;
		},

		attrHooks: {
			type: {
				set: function (elem, value) {
					if (!support.radioValue && value === "radio" && jQuery.nodeName(elem, "input")) {
						var val = elem.value;
						elem.setAttribute("type", value);
						if (val) {
							elem.value = val;
						}
						return value;
					}
				}
			}
		},

		removeAttr: function (elem, value) {
			var name,
			    propName,
			    i = 0,
			    attrNames = value && value.match(rnotwhite);

			if (attrNames && elem.nodeType === 1) {
				while (name = attrNames[i++]) {
					propName = jQuery.propFix[name] || name;

					// Boolean attributes get special treatment (#10870)
					if (jQuery.expr.match.bool.test(name)) {

						// Set corresponding property to false
						elem[propName] = false;
					}

					elem.removeAttribute(name);
				}
			}
		}
	});

	// Hooks for boolean attributes
	boolHook = {
		set: function (elem, value, name) {
			if (value === false) {

				// Remove boolean attributes when set to false
				jQuery.removeAttr(elem, name);
			} else {
				elem.setAttribute(name, name);
			}
			return name;
		}
	};
	jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (i, name) {
		var getter = attrHandle[name] || jQuery.find.attr;

		attrHandle[name] = function (elem, name, isXML) {
			var ret, handle;
			if (!isXML) {

				// Avoid an infinite loop by temporarily removing this function from the getter
				handle = attrHandle[name];
				attrHandle[name] = ret;
				ret = getter(elem, name, isXML) != null ? name.toLowerCase() : null;
				attrHandle[name] = handle;
			}
			return ret;
		};
	});

	var rfocusable = /^(?:input|select|textarea|button)$/i,
	    rclickable = /^(?:a|area)$/i;

	jQuery.fn.extend({
		prop: function (name, value) {
			return access(this, jQuery.prop, name, value, arguments.length > 1);
		},

		removeProp: function (name) {
			return this.each(function () {
				delete this[jQuery.propFix[name] || name];
			});
		}
	});

	jQuery.extend({
		prop: function (elem, name, value) {
			var ret,
			    hooks,
			    nType = elem.nodeType;

			// Don't get/set properties on text, comment and attribute nodes
			if (nType === 3 || nType === 8 || nType === 2) {
				return;
			}

			if (nType !== 1 || !jQuery.isXMLDoc(elem)) {

				// Fix name and attach hooks
				name = jQuery.propFix[name] || name;
				hooks = jQuery.propHooks[name];
			}

			if (value !== undefined) {
				if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
					return ret;
				}

				return elem[name] = value;
			}

			if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
				return ret;
			}

			return elem[name];
		},

		propHooks: {
			tabIndex: {
				get: function (elem) {

					// elem.tabIndex doesn't always return the
					// correct value when it hasn't been explicitly set
					// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
					// Use proper attribute retrieval(#12072)
					var tabindex = jQuery.find.attr(elem, "tabindex");

					return tabindex ? parseInt(tabindex, 10) : rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href ? 0 : -1;
				}
			}
		},

		propFix: {
			"for": "htmlFor",
			"class": "className"
		}
	});

	// Support: IE <=11 only
	// Accessing the selectedIndex property
	// forces the browser to respect setting selected
	// on the option
	// The getter ensures a default option is selected
	// when in an optgroup
	if (!support.optSelected) {
		jQuery.propHooks.selected = {
			get: function (elem) {
				var parent = elem.parentNode;
				if (parent && parent.parentNode) {
					parent.parentNode.selectedIndex;
				}
				return null;
			},
			set: function (elem) {
				var parent = elem.parentNode;
				if (parent) {
					parent.selectedIndex;

					if (parent.parentNode) {
						parent.parentNode.selectedIndex;
					}
				}
			}
		};
	}

	jQuery.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () {
		jQuery.propFix[this.toLowerCase()] = this;
	});

	var rclass = /[\t\r\n\f]/g;

	function getClass(elem) {
		return elem.getAttribute && elem.getAttribute("class") || "";
	}

	jQuery.fn.extend({
		addClass: function (value) {
			var classes,
			    elem,
			    cur,
			    curValue,
			    clazz,
			    j,
			    finalValue,
			    i = 0;

			if (jQuery.isFunction(value)) {
				return this.each(function (j) {
					jQuery(this).addClass(value.call(this, j, getClass(this)));
				});
			}

			if (typeof value === "string" && value) {
				classes = value.match(rnotwhite) || [];

				while (elem = this[i++]) {
					curValue = getClass(elem);
					cur = elem.nodeType === 1 && (" " + curValue + " ").replace(rclass, " ");

					if (cur) {
						j = 0;
						while (clazz = classes[j++]) {
							if (cur.indexOf(" " + clazz + " ") < 0) {
								cur += clazz + " ";
							}
						}

						// Only assign if different to avoid unneeded rendering.
						finalValue = jQuery.trim(cur);
						if (curValue !== finalValue) {
							elem.setAttribute("class", finalValue);
						}
					}
				}
			}

			return this;
		},

		removeClass: function (value) {
			var classes,
			    elem,
			    cur,
			    curValue,
			    clazz,
			    j,
			    finalValue,
			    i = 0;

			if (jQuery.isFunction(value)) {
				return this.each(function (j) {
					jQuery(this).removeClass(value.call(this, j, getClass(this)));
				});
			}

			if (!arguments.length) {
				return this.attr("class", "");
			}

			if (typeof value === "string" && value) {
				classes = value.match(rnotwhite) || [];

				while (elem = this[i++]) {
					curValue = getClass(elem);

					// This expression is here for better compressibility (see addClass)
					cur = elem.nodeType === 1 && (" " + curValue + " ").replace(rclass, " ");

					if (cur) {
						j = 0;
						while (clazz = classes[j++]) {

							// Remove *all* instances
							while (cur.indexOf(" " + clazz + " ") > -1) {
								cur = cur.replace(" " + clazz + " ", " ");
							}
						}

						// Only assign if different to avoid unneeded rendering.
						finalValue = jQuery.trim(cur);
						if (curValue !== finalValue) {
							elem.setAttribute("class", finalValue);
						}
					}
				}
			}

			return this;
		},

		toggleClass: function (value, stateVal) {
			var type = typeof value;

			if (typeof stateVal === "boolean" && type === "string") {
				return stateVal ? this.addClass(value) : this.removeClass(value);
			}

			if (jQuery.isFunction(value)) {
				return this.each(function (i) {
					jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal), stateVal);
				});
			}

			return this.each(function () {
				var className, i, self, classNames;

				if (type === "string") {

					// Toggle individual class names
					i = 0;
					self = jQuery(this);
					classNames = value.match(rnotwhite) || [];

					while (className = classNames[i++]) {

						// Check each className given, space separated list
						if (self.hasClass(className)) {
							self.removeClass(className);
						} else {
							self.addClass(className);
						}
					}

					// Toggle whole class name
				} else if (value === undefined || type === "boolean") {
					className = getClass(this);
					if (className) {

						// Store className if set
						dataPriv.set(this, "__className__", className);
					}

					// If the element has a class name or if we're passed `false`,
					// then remove the whole classname (if there was one, the above saved it).
					// Otherwise bring back whatever was previously saved (if anything),
					// falling back to the empty string if nothing was stored.
					if (this.setAttribute) {
						this.setAttribute("class", className || value === false ? "" : dataPriv.get(this, "__className__") || "");
					}
				}
			});
		},

		hasClass: function (selector) {
			var className,
			    elem,
			    i = 0;

			className = " " + selector + " ";
			while (elem = this[i++]) {
				if (elem.nodeType === 1 && (" " + getClass(elem) + " ").replace(rclass, " ").indexOf(className) > -1) {
					return true;
				}
			}

			return false;
		}
	});

	var rreturn = /\r/g,
	    rspaces = /[\x20\t\r\n\f]+/g;

	jQuery.fn.extend({
		val: function (value) {
			var hooks,
			    ret,
			    isFunction,
			    elem = this[0];

			if (!arguments.length) {
				if (elem) {
					hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];

					if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) {
						return ret;
					}

					ret = elem.value;

					return typeof ret === "string" ?

					// Handle most common string cases
					ret.replace(rreturn, "") :

					// Handle cases where value is null/undef or number
					ret == null ? "" : ret;
				}

				return;
			}

			isFunction = jQuery.isFunction(value);

			return this.each(function (i) {
				var val;

				if (this.nodeType !== 1) {
					return;
				}

				if (isFunction) {
					val = value.call(this, i, jQuery(this).val());
				} else {
					val = value;
				}

				// Treat null/undefined as ""; convert numbers to string
				if (val == null) {
					val = "";
				} else if (typeof val === "number") {
					val += "";
				} else if (jQuery.isArray(val)) {
					val = jQuery.map(val, function (value) {
						return value == null ? "" : value + "";
					});
				}

				hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];

				// If set returns undefined, fall back to normal setting
				if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {
					this.value = val;
				}
			});
		}
	});

	jQuery.extend({
		valHooks: {
			option: {
				get: function (elem) {

					var val = jQuery.find.attr(elem, "value");
					return val != null ? val :

					// Support: IE10-11+
					// option.text throws exceptions (#14686, #14858)
					// Strip and collapse whitespace
					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
					jQuery.trim(jQuery.text(elem)).replace(rspaces, " ");
				}
			},
			select: {
				get: function (elem) {
					var value,
					    option,
					    options = elem.options,
					    index = elem.selectedIndex,
					    one = elem.type === "select-one" || index < 0,
					    values = one ? null : [],
					    max = one ? index + 1 : options.length,
					    i = index < 0 ? max : one ? index : 0;

					// Loop through all the selected options
					for (; i < max; i++) {
						option = options[i];

						// IE8-9 doesn't update selected after form reset (#2551)
						if ((option.selected || i === index) && (

						// Don't return options that are disabled or in a disabled optgroup
						support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup"))) {

							// Get the specific value for the option
							value = jQuery(option).val();

							// We don't need an array for one selects
							if (one) {
								return value;
							}

							// Multi-Selects return an array
							values.push(value);
						}
					}

					return values;
				},

				set: function (elem, value) {
					var optionSet,
					    option,
					    options = elem.options,
					    values = jQuery.makeArray(value),
					    i = options.length;

					while (i--) {
						option = options[i];
						if (option.selected = jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) {
							optionSet = true;
						}
					}

					// Force browsers to behave consistently when non-matching value is set
					if (!optionSet) {
						elem.selectedIndex = -1;
					}
					return values;
				}
			}
		}
	});

	// Radios and checkboxes getter/setter
	jQuery.each(["radio", "checkbox"], function () {
		jQuery.valHooks[this] = {
			set: function (elem, value) {
				if (jQuery.isArray(value)) {
					return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1;
				}
			}
		};
		if (!support.checkOn) {
			jQuery.valHooks[this].get = function (elem) {
				return elem.getAttribute("value") === null ? "on" : elem.value;
			};
		}
	});

	// Return jQuery for attributes-only inclusion


	var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;

	jQuery.extend(jQuery.event, {

		trigger: function (event, data, elem, onlyHandlers) {

			var i,
			    cur,
			    tmp,
			    bubbleType,
			    ontype,
			    handle,
			    special,
			    eventPath = [elem || document],
			    type = hasOwn.call(event, "type") ? event.type : event,
			    namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];

			cur = tmp = elem = elem || document;

			// Don't do events on text and comment nodes
			if (elem.nodeType === 3 || elem.nodeType === 8) {
				return;
			}

			// focus/blur morphs to focusin/out; ensure we're not firing them right now
			if (rfocusMorph.test(type + jQuery.event.triggered)) {
				return;
			}

			if (type.indexOf(".") > -1) {

				// Namespaced trigger; create a regexp to match event type in handle()
				namespaces = type.split(".");
				type = namespaces.shift();
				namespaces.sort();
			}
			ontype = type.indexOf(":") < 0 && "on" + type;

			// Caller can pass in a jQuery.Event object, Object, or just an event type string
			event = event[jQuery.expando] ? event : new jQuery.Event(type, typeof event === "object" && event);

			// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
			event.isTrigger = onlyHandlers ? 2 : 3;
			event.namespace = namespaces.join(".");
			event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;

			// Clean up the event in case it is being reused
			event.result = undefined;
			if (!event.target) {
				event.target = elem;
			}

			// Clone any incoming data and prepend the event, creating the handler arg list
			data = data == null ? [event] : jQuery.makeArray(data, [event]);

			// Allow special events to draw outside the lines
			special = jQuery.event.special[type] || {};
			if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {
				return;
			}

			// Determine event propagation path in advance, per W3C events spec (#9951)
			// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
			if (!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) {

				bubbleType = special.delegateType || type;
				if (!rfocusMorph.test(bubbleType + type)) {
					cur = cur.parentNode;
				}
				for (; cur; cur = cur.parentNode) {
					eventPath.push(cur);
					tmp = cur;
				}

				// Only add window if we got to document (e.g., not plain obj or detached DOM)
				if (tmp === (elem.ownerDocument || document)) {
					eventPath.push(tmp.defaultView || tmp.parentWindow || window);
				}
			}

			// Fire handlers on the event path
			i = 0;
			while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {

				event.type = i > 1 ? bubbleType : special.bindType || type;

				// jQuery handler
				handle = (dataPriv.get(cur, "events") || {})[event.type] && dataPriv.get(cur, "handle");
				if (handle) {
					handle.apply(cur, data);
				}

				// Native handler
				handle = ontype && cur[ontype];
				if (handle && handle.apply && acceptData(cur)) {
					event.result = handle.apply(cur, data);
					if (event.result === false) {
						event.preventDefault();
					}
				}
			}
			event.type = type;

			// If nobody prevented the default action, do it now
			if (!onlyHandlers && !event.isDefaultPrevented()) {

				if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) {

					// Call a native DOM method on the target with the same name name as the event.
					// Don't do default actions on window, that's where global variables be (#6170)
					if (ontype && jQuery.isFunction(elem[type]) && !jQuery.isWindow(elem)) {

						// Don't re-trigger an onFOO event when we call its FOO() method
						tmp = elem[ontype];

						if (tmp) {
							elem[ontype] = null;
						}

						// Prevent re-triggering of the same event, since we already bubbled it above
						jQuery.event.triggered = type;
						elem[type]();
						jQuery.event.triggered = undefined;

						if (tmp) {
							elem[ontype] = tmp;
						}
					}
				}
			}

			return event.result;
		},

		// Piggyback on a donor event to simulate a different one
		// Used only for `focus(in | out)` events
		simulate: function (type, elem, event) {
			var e = jQuery.extend(new jQuery.Event(), event, {
				type: type,
				isSimulated: true
			});

			jQuery.event.trigger(e, null, elem);
		}

	});

	jQuery.fn.extend({

		trigger: function (type, data) {
			return this.each(function () {
				jQuery.event.trigger(type, data, this);
			});
		},
		triggerHandler: function (type, data) {
			var elem = this[0];
			if (elem) {
				return jQuery.event.trigger(type, data, elem, true);
			}
		}
	});

	jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function (i, name) {

		// Handle event binding
		jQuery.fn[name] = function (data, fn) {
			return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);
		};
	});

	jQuery.fn.extend({
		hover: function (fnOver, fnOut) {
			return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
		}
	});

	support.focusin = "onfocusin" in window;

	// Support: Firefox
	// Firefox doesn't have focus(in | out) events
	// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
	//
	// Support: Chrome, Safari
	// focus(in | out) events fire after focus & blur events,
	// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
	// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
	if (!support.focusin) {
		jQuery.each({ focus: "focusin", blur: "focusout" }, function (orig, fix) {

			// Attach a single capturing handler on the document while someone wants focusin/focusout
			var handler = function (event) {
				jQuery.event.simulate(fix, event.target, jQuery.event.fix(event));
			};

			jQuery.event.special[fix] = {
				setup: function () {
					var doc = this.ownerDocument || this,
					    attaches = dataPriv.access(doc, fix);

					if (!attaches) {
						doc.addEventListener(orig, handler, true);
					}
					dataPriv.access(doc, fix, (attaches || 0) + 1);
				},
				teardown: function () {
					var doc = this.ownerDocument || this,
					    attaches = dataPriv.access(doc, fix) - 1;

					if (!attaches) {
						doc.removeEventListener(orig, handler, true);
						dataPriv.remove(doc, fix);
					} else {
						dataPriv.access(doc, fix, attaches);
					}
				}
			};
		});
	}
	var location = window.location;

	var nonce = jQuery.now();

	var rquery = /\?/;

	// Support: Android 2.3
	// Workaround failure to string-cast null input
	jQuery.parseJSON = function (data) {
		return JSON.parse(data + "");
	};

	// Cross-browser xml parsing
	jQuery.parseXML = function (data) {
		var xml;
		if (!data || typeof data !== "string") {
			return null;
		}

		// Support: IE9
		try {
			xml = new window.DOMParser().parseFromString(data, "text/xml");
		} catch (e) {
			xml = undefined;
		}

		if (!xml || xml.getElementsByTagName("parsererror").length) {
			jQuery.error("Invalid XML: " + data);
		}
		return xml;
	};

	var rhash = /#.*$/,
	    rts = /([?&])_=[^&]*/,
	    rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,


	// #7653, #8125, #8152: local protocol detection
	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
	    rnoContent = /^(?:GET|HEAD)$/,
	    rprotocol = /^\/\//,


	/* Prefilters
  * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
  * 2) These are called:
  *    - BEFORE asking for a transport
  *    - AFTER param serialization (s.data is a string if s.processData is true)
  * 3) key is the dataType
  * 4) the catchall symbol "*" can be used
  * 5) execution will start with transport dataType and THEN continue down to "*" if needed
  */
	prefilters = {},


	/* Transports bindings
  * 1) key is the dataType
  * 2) the catchall symbol "*" can be used
  * 3) selection will start with transport dataType and THEN go to "*" if needed
  */
	transports = {},


	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
	allTypes = "*/".concat("*"),


	// Anchor tag for parsing the document origin
	originAnchor = document.createElement("a");
	originAnchor.href = location.href;

	// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
	function addToPrefiltersOrTransports(structure) {

		// dataTypeExpression is optional and defaults to "*"
		return function (dataTypeExpression, func) {

			if (typeof dataTypeExpression !== "string") {
				func = dataTypeExpression;
				dataTypeExpression = "*";
			}

			var dataType,
			    i = 0,
			    dataTypes = dataTypeExpression.toLowerCase().match(rnotwhite) || [];

			if (jQuery.isFunction(func)) {

				// For each dataType in the dataTypeExpression
				while (dataType = dataTypes[i++]) {

					// Prepend if requested
					if (dataType[0] === "+") {
						dataType = dataType.slice(1) || "*";
						(structure[dataType] = structure[dataType] || []).unshift(func);

						// Otherwise append
					} else {
						(structure[dataType] = structure[dataType] || []).push(func);
					}
				}
			}
		};
	}

	// Base inspection function for prefilters and transports
	function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {

		var inspected = {},
		    seekingTransport = structure === transports;

		function inspect(dataType) {
			var selected;
			inspected[dataType] = true;
			jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) {
				var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
				if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) {

					options.dataTypes.unshift(dataTypeOrTransport);
					inspect(dataTypeOrTransport);
					return false;
				} else if (seekingTransport) {
					return !(selected = dataTypeOrTransport);
				}
			});
			return selected;
		}

		return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
	}

	// A special extend for ajax options
	// that takes "flat" options (not to be deep extended)
	// Fixes #9887
	function ajaxExtend(target, src) {
		var key,
		    deep,
		    flatOptions = jQuery.ajaxSettings.flatOptions || {};

		for (key in src) {
			if (src[key] !== undefined) {
				(flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
			}
		}
		if (deep) {
			jQuery.extend(true, target, deep);
		}

		return target;
	}

	/* Handles responses to an ajax request:
  * - finds the right dataType (mediates between content-type and expected dataType)
  * - returns the corresponding response
  */
	function ajaxHandleResponses(s, jqXHR, responses) {

		var ct,
		    type,
		    finalDataType,
		    firstDataType,
		    contents = s.contents,
		    dataTypes = s.dataTypes;

		// Remove auto dataType and get content-type in the process
		while (dataTypes[0] === "*") {
			dataTypes.shift();
			if (ct === undefined) {
				ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
			}
		}

		// Check if we're dealing with a known content-type
		if (ct) {
			for (type in contents) {
				if (contents[type] && contents[type].test(ct)) {
					dataTypes.unshift(type);
					break;
				}
			}
		}

		// Check to see if we have a response for the expected dataType
		if (dataTypes[0] in responses) {
			finalDataType = dataTypes[0];
		} else {

			// Try convertible dataTypes
			for (type in responses) {
				if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
					finalDataType = type;
					break;
				}
				if (!firstDataType) {
					firstDataType = type;
				}
			}

			// Or just use first one
			finalDataType = finalDataType || firstDataType;
		}

		// If we found a dataType
		// We add the dataType to the list if needed
		// and return the corresponding response
		if (finalDataType) {
			if (finalDataType !== dataTypes[0]) {
				dataTypes.unshift(finalDataType);
			}
			return responses[finalDataType];
		}
	}

	/* Chain conversions given the request and the original response
  * Also sets the responseXXX fields on the jqXHR instance
  */
	function ajaxConvert(s, response, jqXHR, isSuccess) {
		var conv2,
		    current,
		    conv,
		    tmp,
		    prev,
		    converters = {},


		// Work with a copy of dataTypes in case we need to modify it for conversion
		dataTypes = s.dataTypes.slice();

		// Create converters map with lowercased keys
		if (dataTypes[1]) {
			for (conv in s.converters) {
				converters[conv.toLowerCase()] = s.converters[conv];
			}
		}

		current = dataTypes.shift();

		// Convert to each sequential dataType
		while (current) {

			if (s.responseFields[current]) {
				jqXHR[s.responseFields[current]] = response;
			}

			// Apply the dataFilter if provided
			if (!prev && isSuccess && s.dataFilter) {
				response = s.dataFilter(response, s.dataType);
			}

			prev = current;
			current = dataTypes.shift();

			if (current) {

				// There's only work to do if current dataType is non-auto
				if (current === "*") {

					current = prev;

					// Convert response if prev dataType is non-auto and differs from current
				} else if (prev !== "*" && prev !== current) {

					// Seek a direct converter
					conv = converters[prev + " " + current] || converters["* " + current];

					// If none found, seek a pair
					if (!conv) {
						for (conv2 in converters) {

							// If conv2 outputs current
							tmp = conv2.split(" ");
							if (tmp[1] === current) {

								// If prev can be converted to accepted input
								conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]];
								if (conv) {

									// Condense equivalence converters
									if (conv === true) {
										conv = converters[conv2];

										// Otherwise, insert the intermediate dataType
									} else if (converters[conv2] !== true) {
										current = tmp[0];
										dataTypes.unshift(tmp[1]);
									}
									break;
								}
							}
						}
					}

					// Apply converter (if not an equivalence)
					if (conv !== true) {

						// Unless errors are allowed to bubble, catch and return them
						if (conv && s.throws) {
							response = conv(response);
						} else {
							try {
								response = conv(response);
							} catch (e) {
								return {
									state: "parsererror",
									error: conv ? e : "No conversion from " + prev + " to " + current
								};
							}
						}
					}
				}
			}
		}

		return { state: "success", data: response };
	}

	jQuery.extend({

		// Counter for holding the number of active queries
		active: 0,

		// Last-Modified header cache for next request
		lastModified: {},
		etag: {},

		ajaxSettings: {
			url: location.href,
			type: "GET",
			isLocal: rlocalProtocol.test(location.protocol),
			global: true,
			processData: true,
			async: true,
			contentType: "application/x-www-form-urlencoded; charset=UTF-8",
			/*
   timeout: 0,
   data: null,
   dataType: null,
   username: null,
   password: null,
   cache: null,
   throws: false,
   traditional: false,
   headers: {},
   */

			accepts: {
				"*": allTypes,
				text: "text/plain",
				html: "text/html",
				xml: "application/xml, text/xml",
				json: "application/json, text/javascript"
			},

			contents: {
				xml: /\bxml\b/,
				html: /\bhtml/,
				json: /\bjson\b/
			},

			responseFields: {
				xml: "responseXML",
				text: "responseText",
				json: "responseJSON"
			},

			// Data converters
			// Keys separate source (or catchall "*") and destination types with a single space
			converters: {

				// Convert anything to text
				"* text": String,

				// Text to html (true = no transformation)
				"text html": true,

				// Evaluate text as a json expression
				"text json": jQuery.parseJSON,

				// Parse text as xml
				"text xml": jQuery.parseXML
			},

			// For options that shouldn't be deep extended:
			// you can add your own custom options here if
			// and when you create one that shouldn't be
			// deep extended (see ajaxExtend)
			flatOptions: {
				url: true,
				context: true
			}
		},

		// Creates a full fledged settings object into target
		// with both ajaxSettings and settings fields.
		// If target is omitted, writes into ajaxSettings.
		ajaxSetup: function (target, settings) {
			return settings ?

			// Building a settings object
			ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) :

			// Extending ajaxSettings
			ajaxExtend(jQuery.ajaxSettings, target);
		},

		ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
		ajaxTransport: addToPrefiltersOrTransports(transports),

		// Main method
		ajax: function (url, options) {

			// If url is an object, simulate pre-1.5 signature
			if (typeof url === "object") {
				options = url;
				url = undefined;
			}

			// Force options to be an object
			options = options || {};

			var transport,


			// URL without anti-cache param
			cacheURL,


			// Response headers
			responseHeadersString,
			    responseHeaders,


			// timeout handle
			timeoutTimer,


			// Url cleanup var
			urlAnchor,


			// To know if global events are to be dispatched
			fireGlobals,


			// Loop variable
			i,


			// Create the final options object
			s = jQuery.ajaxSetup({}, options),


			// Callbacks context
			callbackContext = s.context || s,


			// Context for global events is callbackContext if it is a DOM node or jQuery collection
			globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event,


			// Deferreds
			deferred = jQuery.Deferred(),
			    completeDeferred = jQuery.Callbacks("once memory"),


			// Status-dependent callbacks
			statusCode = s.statusCode || {},


			// Headers (they are sent all at once)
			requestHeaders = {},
			    requestHeadersNames = {},


			// The jqXHR state
			state = 0,


			// Default abort message
			strAbort = "canceled",


			// Fake xhr
			jqXHR = {
				readyState: 0,

				// Builds headers hashtable if needed
				getResponseHeader: function (key) {
					var match;
					if (state === 2) {
						if (!responseHeaders) {
							responseHeaders = {};
							while (match = rheaders.exec(responseHeadersString)) {
								responseHeaders[match[1].toLowerCase()] = match[2];
							}
						}
						match = responseHeaders[key.toLowerCase()];
					}
					return match == null ? null : match;
				},

				// Raw string
				getAllResponseHeaders: function () {
					return state === 2 ? responseHeadersString : null;
				},

				// Caches the header
				setRequestHeader: function (name, value) {
					var lname = name.toLowerCase();
					if (!state) {
						name = requestHeadersNames[lname] = requestHeadersNames[lname] || name;
						requestHeaders[name] = value;
					}
					return this;
				},

				// Overrides response content-type header
				overrideMimeType: function (type) {
					if (!state) {
						s.mimeType = type;
					}
					return this;
				},

				// Status-dependent callbacks
				statusCode: function (map) {
					var code;
					if (map) {
						if (state < 2) {
							for (code in map) {

								// Lazy-add the new callback in a way that preserves old ones
								statusCode[code] = [statusCode[code], map[code]];
							}
						} else {

							// Execute the appropriate callbacks
							jqXHR.always(map[jqXHR.status]);
						}
					}
					return this;
				},

				// Cancel the request
				abort: function (statusText) {
					var finalText = statusText || strAbort;
					if (transport) {
						transport.abort(finalText);
					}
					done(0, finalText);
					return this;
				}
			};

			// Attach deferreds
			deferred.promise(jqXHR).complete = completeDeferred.add;
			jqXHR.success = jqXHR.done;
			jqXHR.error = jqXHR.fail;

			// Remove hash character (#7531: and string promotion)
			// Add protocol if not provided (prefilters might expect it)
			// Handle falsy url in the settings object (#10093: consistency with old signature)
			// We also use the url parameter if available
			s.url = ((url || s.url || location.href) + "").replace(rhash, "").replace(rprotocol, location.protocol + "//");

			// Alias method option to type as per ticket #12004
			s.type = options.method || options.type || s.method || s.type;

			// Extract dataTypes list
			s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().match(rnotwhite) || [""];

			// A cross-domain request is in order when the origin doesn't match the current origin.
			if (s.crossDomain == null) {
				urlAnchor = document.createElement("a");

				// Support: IE8-11+
				// IE throws exception if url is malformed, e.g. http://example.com:80x/
				try {
					urlAnchor.href = s.url;

					// Support: IE8-11+
					// Anchor's host property isn't correctly set when s.url is relative
					urlAnchor.href = urlAnchor.href;
					s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host;
				} catch (e) {

					// If there is an error parsing the URL, assume it is crossDomain,
					// it can be rejected by the transport if it is invalid
					s.crossDomain = true;
				}
			}

			// Convert data if not already a string
			if (s.data && s.processData && typeof s.data !== "string") {
				s.data = jQuery.param(s.data, s.traditional);
			}

			// Apply prefilters
			inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);

			// If request was aborted inside a prefilter, stop there
			if (state === 2) {
				return jqXHR;
			}

			// We can fire global events as of now if asked to
			// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
			fireGlobals = jQuery.event && s.global;

			// Watch for a new set of requests
			if (fireGlobals && jQuery.active++ === 0) {
				jQuery.event.trigger("ajaxStart");
			}

			// Uppercase the type
			s.type = s.type.toUpperCase();

			// Determine if request has content
			s.hasContent = !rnoContent.test(s.type);

			// Save the URL in case we're toying with the If-Modified-Since
			// and/or If-None-Match header later on
			cacheURL = s.url;

			// More options handling for requests with no content
			if (!s.hasContent) {

				// If data is available, append data to url
				if (s.data) {
					cacheURL = s.url += (rquery.test(cacheURL) ? "&" : "?") + s.data;

					// #9682: remove data so that it's not used in an eventual retry
					delete s.data;
				}

				// Add anti-cache in url if needed
				if (s.cache === false) {
					s.url = rts.test(cacheURL) ?

					// If there is already a '_' parameter, set its value
					cacheURL.replace(rts, "$1_=" + nonce++) :

					// Otherwise add one to the end
					cacheURL + (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce++;
				}
			}

			// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
			if (s.ifModified) {
				if (jQuery.lastModified[cacheURL]) {
					jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
				}
				if (jQuery.etag[cacheURL]) {
					jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
				}
			}

			// Set the correct header, if data is being sent
			if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
				jqXHR.setRequestHeader("Content-Type", s.contentType);
			}

			// Set the Accepts header for the server, depending on the dataType
			jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]);

			// Check for headers option
			for (i in s.headers) {
				jqXHR.setRequestHeader(i, s.headers[i]);
			}

			// Allow custom headers/mimetypes and early abort
			if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || state === 2)) {

				// Abort if not done already and return
				return jqXHR.abort();
			}

			// Aborting is no longer a cancellation
			strAbort = "abort";

			// Install callbacks on deferreds
			for (i in { success: 1, error: 1, complete: 1 }) {
				jqXHR[i](s[i]);
			}

			// Get transport
			transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);

			// If no transport, we auto-abort
			if (!transport) {
				done(-1, "No Transport");
			} else {
				jqXHR.readyState = 1;

				// Send global event
				if (fireGlobals) {
					globalEventContext.trigger("ajaxSend", [jqXHR, s]);
				}

				// If request was aborted inside ajaxSend, stop there
				if (state === 2) {
					return jqXHR;
				}

				// Timeout
				if (s.async && s.timeout > 0) {
					timeoutTimer = window.setTimeout(function () {
						jqXHR.abort("timeout");
					}, s.timeout);
				}

				try {
					state = 1;
					transport.send(requestHeaders, done);
				} catch (e) {

					// Propagate exception as error if not done
					if (state < 2) {
						done(-1, e);

						// Simply rethrow otherwise
					} else {
						throw e;
					}
				}
			}

			// Callback for when everything is done
			function done(status, nativeStatusText, responses, headers) {
				var isSuccess,
				    success,
				    error,
				    response,
				    modified,
				    statusText = nativeStatusText;

				// Called once
				if (state === 2) {
					return;
				}

				// State is "done" now
				state = 2;

				// Clear timeout if it exists
				if (timeoutTimer) {
					window.clearTimeout(timeoutTimer);
				}

				// Dereference transport for early garbage collection
				// (no matter how long the jqXHR object will be used)
				transport = undefined;

				// Cache response headers
				responseHeadersString = headers || "";

				// Set readyState
				jqXHR.readyState = status > 0 ? 4 : 0;

				// Determine if successful
				isSuccess = status >= 200 && status < 300 || status === 304;

				// Get response data
				if (responses) {
					response = ajaxHandleResponses(s, jqXHR, responses);
				}

				// Convert no matter what (that way responseXXX fields are always set)
				response = ajaxConvert(s, response, jqXHR, isSuccess);

				// If successful, handle type chaining
				if (isSuccess) {

					// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
					if (s.ifModified) {
						modified = jqXHR.getResponseHeader("Last-Modified");
						if (modified) {
							jQuery.lastModified[cacheURL] = modified;
						}
						modified = jqXHR.getResponseHeader("etag");
						if (modified) {
							jQuery.etag[cacheURL] = modified;
						}
					}

					// if no content
					if (status === 204 || s.type === "HEAD") {
						statusText = "nocontent";

						// if not modified
					} else if (status === 304) {
						statusText = "notmodified";

						// If we have data, let's convert it
					} else {
						statusText = response.state;
						success = response.data;
						error = response.error;
						isSuccess = !error;
					}
				} else {

					// Extract error from statusText and normalize for non-aborts
					error = statusText;
					if (status || !statusText) {
						statusText = "error";
						if (status < 0) {
							status = 0;
						}
					}
				}

				// Set data for the fake xhr object
				jqXHR.status = status;
				jqXHR.statusText = (nativeStatusText || statusText) + "";

				// Success/Error
				if (isSuccess) {
					deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
				} else {
					deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
				}

				// Status-dependent callbacks
				jqXHR.statusCode(statusCode);
				statusCode = undefined;

				if (fireGlobals) {
					globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]);
				}

				// Complete
				completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);

				if (fireGlobals) {
					globalEventContext.trigger("ajaxComplete", [jqXHR, s]);

					// Handle the global AJAX counter
					if (! --jQuery.active) {
						jQuery.event.trigger("ajaxStop");
					}
				}
			}

			return jqXHR;
		},

		getJSON: function (url, data, callback) {
			return jQuery.get(url, data, callback, "json");
		},

		getScript: function (url, callback) {
			return jQuery.get(url, undefined, callback, "script");
		}
	});

	jQuery.each(["get", "post"], function (i, method) {
		jQuery[method] = function (url, data, callback, type) {

			// Shift arguments if data argument was omitted
			if (jQuery.isFunction(data)) {
				type = type || callback;
				callback = data;
				data = undefined;
			}

			// The url can be an options object (which then must have .url)
			return jQuery.ajax(jQuery.extend({
				url: url,
				type: method,
				dataType: type,
				data: data,
				success: callback
			}, jQuery.isPlainObject(url) && url));
		};
	});

	jQuery._evalUrl = function (url) {
		return jQuery.ajax({
			url: url,

			// Make this explicit, since user can override this through ajaxSetup (#11264)
			type: "GET",
			dataType: "script",
			async: false,
			global: false,
			"throws": true
		});
	};

	jQuery.fn.extend({
		wrapAll: function (html) {
			var wrap;

			if (jQuery.isFunction(html)) {
				return this.each(function (i) {
					jQuery(this).wrapAll(html.call(this, i));
				});
			}

			if (this[0]) {

				// The elements to wrap the target around
				wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);

				if (this[0].parentNode) {
					wrap.insertBefore(this[0]);
				}

				wrap.map(function () {
					var elem = this;

					while (elem.firstElementChild) {
						elem = elem.firstElementChild;
					}

					return elem;
				}).append(this);
			}

			return this;
		},

		wrapInner: function (html) {
			if (jQuery.isFunction(html)) {
				return this.each(function (i) {
					jQuery(this).wrapInner(html.call(this, i));
				});
			}

			return this.each(function () {
				var self = jQuery(this),
				    contents = self.contents();

				if (contents.length) {
					contents.wrapAll(html);
				} else {
					self.append(html);
				}
			});
		},

		wrap: function (html) {
			var isFunction = jQuery.isFunction(html);

			return this.each(function (i) {
				jQuery(this).wrapAll(isFunction ? html.call(this, i) : html);
			});
		},

		unwrap: function () {
			return this.parent().each(function () {
				if (!jQuery.nodeName(this, "body")) {
					jQuery(this).replaceWith(this.childNodes);
				}
			}).end();
		}
	});

	jQuery.expr.filters.hidden = function (elem) {
		return !jQuery.expr.filters.visible(elem);
	};
	jQuery.expr.filters.visible = function (elem) {

		// Support: Opera <= 12.12
		// Opera reports offsetWidths and offsetHeights less than zero on some elements
		// Use OR instead of AND as the element is not visible if either is true
		// See tickets #10406 and #13132
		return elem.offsetWidth > 0 || elem.offsetHeight > 0 || elem.getClientRects().length > 0;
	};

	var r20 = /%20/g,
	    rbracket = /\[\]$/,
	    rCRLF = /\r?\n/g,
	    rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
	    rsubmittable = /^(?:input|select|textarea|keygen)/i;

	function buildParams(prefix, obj, traditional, add) {
		var name;

		if (jQuery.isArray(obj)) {

			// Serialize array item.
			jQuery.each(obj, function (i, v) {
				if (traditional || rbracket.test(prefix)) {

					// Treat each array item as a scalar.
					add(prefix, v);
				} else {

					// Item is non-scalar (array or object), encode its numeric index.
					buildParams(prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]", v, traditional, add);
				}
			});
		} else if (!traditional && jQuery.type(obj) === "object") {

			// Serialize object item.
			for (name in obj) {
				buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
			}
		} else {

			// Serialize scalar item.
			add(prefix, obj);
		}
	}

	// Serialize an array of form elements or a set of
	// key/values into a query string
	jQuery.param = function (a, traditional) {
		var prefix,
		    s = [],
		    add = function (key, value) {

			// If value is a function, invoke it and return its value
			value = jQuery.isFunction(value) ? value() : value == null ? "" : value;
			s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
		};

		// Set traditional to true for jQuery <= 1.3.2 behavior.
		if (traditional === undefined) {
			traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
		}

		// If an array was passed in, assume that it is an array of form elements.
		if (jQuery.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {

			// Serialize the form elements
			jQuery.each(a, function () {
				add(this.name, this.value);
			});
		} else {

			// If traditional, encode the "old" way (the way 1.3.2 or older
			// did it), otherwise encode params recursively.
			for (prefix in a) {
				buildParams(prefix, a[prefix], traditional, add);
			}
		}

		// Return the resulting serialization
		return s.join("&").replace(r20, "+");
	};

	jQuery.fn.extend({
		serialize: function () {
			return jQuery.param(this.serializeArray());
		},
		serializeArray: function () {
			return this.map(function () {

				// Can add propHook for "elements" to filter or add form elements
				var elements = jQuery.prop(this, "elements");
				return elements ? jQuery.makeArray(elements) : this;
			}).filter(function () {
				var type = this.type;

				// Use .is( ":disabled" ) so that fieldset[disabled] works
				return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type));
			}).map(function (i, elem) {
				var val = jQuery(this).val();

				return val == null ? null : jQuery.isArray(val) ? jQuery.map(val, function (val) {
					return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
				}) : { name: elem.name, value: val.replace(rCRLF, "\r\n") };
			}).get();
		}
	});

	jQuery.ajaxSettings.xhr = function () {
		try {
			return new window.XMLHttpRequest();
		} catch (e) {}
	};

	var xhrSuccessStatus = {

		// File protocol always yields status code 0, assume 200
		0: 200,

		// Support: IE9
		// #1450: sometimes IE returns 1223 when it should be 204
		1223: 204
	},
	    xhrSupported = jQuery.ajaxSettings.xhr();

	support.cors = !!xhrSupported && "withCredentials" in xhrSupported;
	support.ajax = xhrSupported = !!xhrSupported;

	jQuery.ajaxTransport(function (options) {
		var callback, errorCallback;

		// Cross domain only allowed if supported through XMLHttpRequest
		if (support.cors || xhrSupported && !options.crossDomain) {
			return {
				send: function (headers, complete) {
					var i,
					    xhr = options.xhr();

					xhr.open(options.type, options.url, options.async, options.username, options.password);

					// Apply custom fields if provided
					if (options.xhrFields) {
						for (i in options.xhrFields) {
							xhr[i] = options.xhrFields[i];
						}
					}

					// Override mime type if needed
					if (options.mimeType && xhr.overrideMimeType) {
						xhr.overrideMimeType(options.mimeType);
					}

					// X-Requested-With header
					// For cross-domain requests, seeing as conditions for a preflight are
					// akin to a jigsaw puzzle, we simply never set it to be sure.
					// (it can always be set on a per-request basis or even using ajaxSetup)
					// For same-domain requests, won't change header if already provided.
					if (!options.crossDomain && !headers["X-Requested-With"]) {
						headers["X-Requested-With"] = "XMLHttpRequest";
					}

					// Set headers
					for (i in headers) {
						xhr.setRequestHeader(i, headers[i]);
					}

					// Callback
					callback = function (type) {
						return function () {
							if (callback) {
								callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;

								if (type === "abort") {
									xhr.abort();
								} else if (type === "error") {

									// Support: IE9
									// On a manual native abort, IE9 throws
									// errors on any property access that is not readyState
									if (typeof xhr.status !== "number") {
										complete(0, "error");
									} else {
										complete(

										// File: protocol always yields status 0; see #8605, #14207
										xhr.status, xhr.statusText);
									}
								} else {
									complete(xhrSuccessStatus[xhr.status] || xhr.status, xhr.statusText,

									// Support: IE9 only
									// IE9 has no XHR2 but throws on binary (trac-11426)
									// For XHR2 non-text, let the caller handle it (gh-2498)
									(xhr.responseType || "text") !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText }, xhr.getAllResponseHeaders());
								}
							}
						};
					};

					// Listen to events
					xhr.onload = callback();
					errorCallback = xhr.onerror = callback("error");

					// Support: IE9
					// Use onreadystatechange to replace onabort
					// to handle uncaught aborts
					if (xhr.onabort !== undefined) {
						xhr.onabort = errorCallback;
					} else {
						xhr.onreadystatechange = function () {

							// Check readyState before timeout as it changes
							if (xhr.readyState === 4) {

								// Allow onerror to be called first,
								// but that will not handle a native abort
								// Also, save errorCallback to a variable
								// as xhr.onerror cannot be accessed
								window.setTimeout(function () {
									if (callback) {
										errorCallback();
									}
								});
							}
						};
					}

					// Create the abort callback
					callback = callback("abort");

					try {

						// Do send the request (this may raise an exception)
						xhr.send(options.hasContent && options.data || null);
					} catch (e) {

						// #14683: Only rethrow if this hasn't been notified as an error yet
						if (callback) {
							throw e;
						}
					}
				},

				abort: function () {
					if (callback) {
						callback();
					}
				}
			};
		}
	});

	// Install script dataType
	jQuery.ajaxSetup({
		accepts: {
			script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript"
		},
		contents: {
			script: /\b(?:java|ecma)script\b/
		},
		converters: {
			"text script": function (text) {
				jQuery.globalEval(text);
				return text;
			}
		}
	});

	// Handle cache's special case and crossDomain
	jQuery.ajaxPrefilter("script", function (s) {
		if (s.cache === undefined) {
			s.cache = false;
		}
		if (s.crossDomain) {
			s.type = "GET";
		}
	});

	// Bind script tag hack transport
	jQuery.ajaxTransport("script", function (s) {

		// This transport only deals with cross domain requests
		if (s.crossDomain) {
			var script, callback;
			return {
				send: function (_, complete) {
					script = jQuery("<script>").prop({
						charset: s.scriptCharset,
						src: s.url
					}).on("load error", callback = function (evt) {
						script.remove();
						callback = null;
						if (evt) {
							complete(evt.type === "error" ? 404 : 200, evt.type);
						}
					});

					// Use native DOM manipulation to avoid our domManip AJAX trickery
					document.head.appendChild(script[0]);
				},
				abort: function () {
					if (callback) {
						callback();
					}
				}
			};
		}
	});

	var oldCallbacks = [],
	    rjsonp = /(=)\?(?=&|$)|\?\?/;

	// Default jsonp settings
	jQuery.ajaxSetup({
		jsonp: "callback",
		jsonpCallback: function () {
			var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce++;
			this[callback] = true;
			return callback;
		}
	});

	// Detect, normalize options and install callbacks for jsonp requests
	jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) {

		var callbackName,
		    overwritten,
		    responseContainer,
		    jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : typeof s.data === "string" && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(s.data) && "data");

		// Handle iff the expected data type is "jsonp" or we have a parameter to set
		if (jsonProp || s.dataTypes[0] === "jsonp") {

			// Get callback name, remembering preexisting value associated with it
			callbackName = s.jsonpCallback = jQuery.isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback;

			// Insert callback into url or form data
			if (jsonProp) {
				s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);
			} else if (s.jsonp !== false) {
				s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
			}

			// Use data converter to retrieve json after script execution
			s.converters["script json"] = function () {
				if (!responseContainer) {
					jQuery.error(callbackName + " was not called");
				}
				return responseContainer[0];
			};

			// Force json dataType
			s.dataTypes[0] = "json";

			// Install callback
			overwritten = window[callbackName];
			window[callbackName] = function () {
				responseContainer = arguments;
			};

			// Clean-up function (fires after converters)
			jqXHR.always(function () {

				// If previous value didn't exist - remove it
				if (overwritten === undefined) {
					jQuery(window).removeProp(callbackName);

					// Otherwise restore preexisting value
				} else {
					window[callbackName] = overwritten;
				}

				// Save back as free
				if (s[callbackName]) {

					// Make sure that re-using the options doesn't screw things around
					s.jsonpCallback = originalSettings.jsonpCallback;

					// Save the callback name for future use
					oldCallbacks.push(callbackName);
				}

				// Call if it was a function and we have a response
				if (responseContainer && jQuery.isFunction(overwritten)) {
					overwritten(responseContainer[0]);
				}

				responseContainer = overwritten = undefined;
			});

			// Delegate to script
			return "script";
		}
	});

	// Argument "data" should be string of html
	// context (optional): If specified, the fragment will be created in this context,
	// defaults to document
	// keepScripts (optional): If true, will include scripts passed in the html string
	jQuery.parseHTML = function (data, context, keepScripts) {
		if (!data || typeof data !== "string") {
			return null;
		}
		if (typeof context === "boolean") {
			keepScripts = context;
			context = false;
		}
		context = context || document;

		var parsed = rsingleTag.exec(data),
		    scripts = !keepScripts && [];

		// Single tag
		if (parsed) {
			return [context.createElement(parsed[1])];
		}

		parsed = buildFragment([data], context, scripts);

		if (scripts && scripts.length) {
			jQuery(scripts).remove();
		}

		return jQuery.merge([], parsed.childNodes);
	};

	// Keep a copy of the old load method
	var _load = jQuery.fn.load;

	/**
  * Load a url into a page
  */
	jQuery.fn.load = function (url, params, callback) {
		if (typeof url !== "string" && _load) {
			return _load.apply(this, arguments);
		}

		var selector,
		    type,
		    response,
		    self = this,
		    off = url.indexOf(" ");

		if (off > -1) {
			selector = jQuery.trim(url.slice(off));
			url = url.slice(0, off);
		}

		// If it's a function
		if (jQuery.isFunction(params)) {

			// We assume that it's the callback
			callback = params;
			params = undefined;

			// Otherwise, build a param string
		} else if (params && typeof params === "object") {
			type = "POST";
		}

		// If we have elements to modify, make the request
		if (self.length > 0) {
			jQuery.ajax({
				url: url,

				// If "type" variable is undefined, then "GET" method will be used.
				// Make value of this field explicit since
				// user can override it through ajaxSetup method
				type: type || "GET",
				dataType: "html",
				data: params
			}).done(function (responseText) {

				// Save response for use in complete callback
				response = arguments;

				self.html(selector ?

				// If a selector was specified, locate the right elements in a dummy div
				// Exclude scripts to avoid IE 'Permission Denied' errors
				jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :

				// Otherwise use the full result
				responseText);

				// If the request succeeds, this function gets "data", "status", "jqXHR"
				// but they are ignored because response was set above.
				// If it fails, this function gets "jqXHR", "status", "error"
			}).always(callback && function (jqXHR, status) {
				self.each(function () {
					callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
				});
			});
		}

		return this;
	};

	// Attach a bunch of functions for handling common AJAX events
	jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (i, type) {
		jQuery.fn[type] = function (fn) {
			return this.on(type, fn);
		};
	});

	jQuery.expr.filters.animated = function (elem) {
		return jQuery.grep(jQuery.timers, function (fn) {
			return elem === fn.elem;
		}).length;
	};

	/**
  * Gets a window from an element
  */
	function getWindow(elem) {
		return jQuery.isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;
	}

	jQuery.offset = {
		setOffset: function (elem, options, i) {
			var curPosition,
			    curLeft,
			    curCSSTop,
			    curTop,
			    curOffset,
			    curCSSLeft,
			    calculatePosition,
			    position = jQuery.css(elem, "position"),
			    curElem = jQuery(elem),
			    props = {};

			// Set position first, in-case top/left are set even on static elem
			if (position === "static") {
				elem.style.position = "relative";
			}

			curOffset = curElem.offset();
			curCSSTop = jQuery.css(elem, "top");
			curCSSLeft = jQuery.css(elem, "left");
			calculatePosition = (position === "absolute" || position === "fixed") && (curCSSTop + curCSSLeft).indexOf("auto") > -1;

			// Need to be able to calculate position if either
			// top or left is auto and position is either absolute or fixed
			if (calculatePosition) {
				curPosition = curElem.position();
				curTop = curPosition.top;
				curLeft = curPosition.left;
			} else {
				curTop = parseFloat(curCSSTop) || 0;
				curLeft = parseFloat(curCSSLeft) || 0;
			}

			if (jQuery.isFunction(options)) {

				// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
				options = options.call(elem, i, jQuery.extend({}, curOffset));
			}

			if (options.top != null) {
				props.top = options.top - curOffset.top + curTop;
			}
			if (options.left != null) {
				props.left = options.left - curOffset.left + curLeft;
			}

			if ("using" in options) {
				options.using.call(elem, props);
			} else {
				curElem.css(props);
			}
		}
	};

	jQuery.fn.extend({
		offset: function (options) {
			if (arguments.length) {
				return options === undefined ? this : this.each(function (i) {
					jQuery.offset.setOffset(this, options, i);
				});
			}

			var docElem,
			    win,
			    elem = this[0],
			    box = { top: 0, left: 0 },
			    doc = elem && elem.ownerDocument;

			if (!doc) {
				return;
			}

			docElem = doc.documentElement;

			// Make sure it's not a disconnected DOM node
			if (!jQuery.contains(docElem, elem)) {
				return box;
			}

			box = elem.getBoundingClientRect();
			win = getWindow(doc);
			return {
				top: box.top + win.pageYOffset - docElem.clientTop,
				left: box.left + win.pageXOffset - docElem.clientLeft
			};
		},

		position: function () {
			if (!this[0]) {
				return;
			}

			var offsetParent,
			    offset,
			    elem = this[0],
			    parentOffset = { top: 0, left: 0 };

			// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
			// because it is its only offset parent
			if (jQuery.css(elem, "position") === "fixed") {

				// Assume getBoundingClientRect is there when computed position is fixed
				offset = elem.getBoundingClientRect();
			} else {

				// Get *real* offsetParent
				offsetParent = this.offsetParent();

				// Get correct offsets
				offset = this.offset();
				if (!jQuery.nodeName(offsetParent[0], "html")) {
					parentOffset = offsetParent.offset();
				}

				// Add offsetParent borders
				parentOffset.top += jQuery.css(offsetParent[0], "borderTopWidth", true);
				parentOffset.left += jQuery.css(offsetParent[0], "borderLeftWidth", true);
			}

			// Subtract parent offsets and element margins
			return {
				top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
				left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
			};
		},

		// This method will return documentElement in the following cases:
		// 1) For the element inside the iframe without offsetParent, this method will return
		//    documentElement of the parent window
		// 2) For the hidden or detached element
		// 3) For body or html element, i.e. in case of the html node - it will return itself
		//
		// but those exceptions were never presented as a real life use-cases
		// and might be considered as more preferable results.
		//
		// This logic, however, is not guaranteed and can change at any point in the future
		offsetParent: function () {
			return this.map(function () {
				var offsetParent = this.offsetParent;

				while (offsetParent && jQuery.css(offsetParent, "position") === "static") {
					offsetParent = offsetParent.offsetParent;
				}

				return offsetParent || documentElement;
			});
		}
	});

	// Create scrollLeft and scrollTop methods
	jQuery.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function (method, prop) {
		var top = "pageYOffset" === prop;

		jQuery.fn[method] = function (val) {
			return access(this, function (elem, method, val) {
				var win = getWindow(elem);

				if (val === undefined) {
					return win ? win[prop] : elem[method];
				}

				if (win) {
					win.scrollTo(!top ? val : win.pageXOffset, top ? val : win.pageYOffset);
				} else {
					elem[method] = val;
				}
			}, method, val, arguments.length);
		};
	});

	// Support: Safari<7-8+, Chrome<37-44+
	// Add the top/left cssHooks using jQuery.fn.position
	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
	// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280
	// getComputedStyle returns percent when specified for top/left/bottom/right;
	// rather than make the css module depend on the offset module, just check for it here
	jQuery.each(["top", "left"], function (i, prop) {
		jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function (elem, computed) {
			if (computed) {
				computed = curCSS(elem, prop);

				// If curCSS returns percentage, fallback to offset
				return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed;
			}
		});
	});

	// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
	jQuery.each({ Height: "height", Width: "width" }, function (name, type) {
		jQuery.each({ padding: "inner" + name, content: type, "": "outer" + name }, function (defaultExtra, funcName) {

			// Margin is only for outerHeight, outerWidth
			jQuery.fn[funcName] = function (margin, value) {
				var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"),
				    extra = defaultExtra || (margin === true || value === true ? "margin" : "border");

				return access(this, function (elem, type, value) {
					var doc;

					if (jQuery.isWindow(elem)) {

						// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
						// isn't a whole lot we can do. See pull request at this URL for discussion:
						// https://github.com/jquery/jquery/pull/764
						return elem.document.documentElement["client" + name];
					}

					// Get document width or height
					if (elem.nodeType === 9) {
						doc = elem.documentElement;

						// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
						// whichever is greatest
						return Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name]);
					}

					return value === undefined ?

					// Get width or height on the element, requesting but not forcing parseFloat
					jQuery.css(elem, type, extra) :

					// Set width or height on the element
					jQuery.style(elem, type, value, extra);
				}, type, chainable ? margin : undefined, chainable, null);
			};
		});
	});

	jQuery.fn.extend({

		bind: function (types, data, fn) {
			return this.on(types, null, data, fn);
		},
		unbind: function (types, fn) {
			return this.off(types, null, fn);
		},

		delegate: function (selector, types, data, fn) {
			return this.on(types, selector, data, fn);
		},
		undelegate: function (selector, types, fn) {

			// ( namespace ) or ( selector, types [, fn] )
			return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn);
		},
		size: function () {
			return this.length;
		}
	});

	jQuery.fn.andSelf = jQuery.fn.addBack;

	// Register as a named AMD module, since jQuery can be concatenated with other
	// files that may use define, but not via a proper concatenation script that
	// understands anonymous AMD modules. A named AMD is safest and most robust
	// way to register. Lowercase jquery is used because AMD module names are
	// derived from file names, and jQuery is normally delivered in a lowercase
	// file name. Do this after creating the global so that if an AMD module wants
	// to call noConflict to hide this version of jQuery, it will work.

	// Note that for maximum portability, libraries that are not jQuery should
	// declare themselves as anonymous modules, and avoid setting a global if an
	// AMD loader is present. jQuery is a special case. For more information, see
	// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon

	if (typeof define === "function" && define.amd) {
		define("jquery", [], function () {
			return jQuery;
		});
	}

	var

	// Map over jQuery in case of overwrite
	_jQuery = window.jQuery,


	// Map over the $ in case of overwrite
	_$ = window.$;

	jQuery.noConflict = function (deep) {
		if (window.$ === jQuery) {
			window.$ = _$;
		}

		if (deep && window.jQuery === jQuery) {
			window.jQuery = _jQuery;
		}

		return jQuery;
	};

	// Expose jQuery and $ identifiers, even in AMD
	// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
	// and CommonJS for browser emulators (#13566)
	if (!noGlobal) {
		window.jQuery = window.$ = jQuery;
	}

	return jQuery;
});

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/owl.carousel.js":[function(require,module,exports){
/**
 * Owl Carousel v2.1.4
 * Copyright 2013-2016 David Deutsch
 * Licensed under MIT (https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE)
 */
/**
 * Owl carousel
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 * @todo Lazy Load Icon
 * @todo prevent animationend bubling
 * @todo itemsScaleUp
 * @todo Test Zepto
 * @todo stagePadding calculate wrong active classes
 */
;(function ($, window, document, undefined) {

	/**
  * Creates a carousel.
  * @class The Owl Carousel.
  * @public
  * @param {HTMLElement|jQuery} element - The element to create the carousel for.
  * @param {Object} [options] - The options
  */
	function Owl(element, options) {

		/**
   * Current settings for the carousel.
   * @public
   */
		this.settings = null;

		/**
   * Current options set by the caller including defaults.
   * @public
   */
		this.options = $.extend({}, Owl.Defaults, options);

		/**
   * Plugin element.
   * @public
   */
		this.$element = $(element);

		/**
   * Proxied event handlers.
   * @protected
   */
		this._handlers = {};

		/**
   * References to the running plugins of this carousel.
   * @protected
   */
		this._plugins = {};

		/**
   * Currently suppressed events to prevent them from beeing retriggered.
   * @protected
   */
		this._supress = {};

		/**
   * Absolute current position.
   * @protected
   */
		this._current = null;

		/**
   * Animation speed in milliseconds.
   * @protected
   */
		this._speed = null;

		/**
   * Coordinates of all items in pixel.
   * @todo The name of this member is missleading.
   * @protected
   */
		this._coordinates = [];

		/**
   * Current breakpoint.
   * @todo Real media queries would be nice.
   * @protected
   */
		this._breakpoint = null;

		/**
   * Current width of the plugin element.
   */
		this._width = null;

		/**
   * All real items.
   * @protected
   */
		this._items = [];

		/**
   * All cloned items.
   * @protected
   */
		this._clones = [];

		/**
   * Merge values of all items.
   * @todo Maybe this could be part of a plugin.
   * @protected
   */
		this._mergers = [];

		/**
   * Widths of all items.
   */
		this._widths = [];

		/**
   * Invalidated parts within the update process.
   * @protected
   */
		this._invalidated = {};

		/**
   * Ordered list of workers for the update process.
   * @protected
   */
		this._pipe = [];

		/**
   * Current state information for the drag operation.
   * @todo #261
   * @protected
   */
		this._drag = {
			time: null,
			target: null,
			pointer: null,
			stage: {
				start: null,
				current: null
			},
			direction: null
		};

		/**
   * Current state information and their tags.
   * @type {Object}
   * @protected
   */
		this._states = {
			current: {},
			tags: {
				'initializing': ['busy'],
				'animating': ['busy'],
				'dragging': ['interacting']
			}
		};

		$.each(['onResize', 'onThrottledResize'], $.proxy(function (i, handler) {
			this._handlers[handler] = $.proxy(this[handler], this);
		}, this));

		$.each(Owl.Plugins, $.proxy(function (key, plugin) {
			this._plugins[key.charAt(0).toLowerCase() + key.slice(1)] = new plugin(this);
		}, this));

		$.each(Owl.Workers, $.proxy(function (priority, worker) {
			this._pipe.push({
				'filter': worker.filter,
				'run': $.proxy(worker.run, this)
			});
		}, this));

		this.setup();
		this.initialize();
	}

	/**
  * Default options for the carousel.
  * @public
  */
	Owl.Defaults = {
		items: 3,
		loop: false,
		center: false,
		rewind: false,

		mouseDrag: true,
		touchDrag: true,
		pullDrag: true,
		freeDrag: false,

		margin: 0,
		stagePadding: 0,

		merge: false,
		mergeFit: true,
		autoWidth: false,

		startPosition: 0,
		rtl: false,

		smartSpeed: 250,
		fluidSpeed: false,
		dragEndSpeed: false,

		responsive: {},
		responsiveRefreshRate: 200,
		responsiveBaseElement: window,

		fallbackEasing: 'swing',

		info: false,

		nestedItemSelector: false,
		itemElement: 'div',
		stageElement: 'div',

		refreshClass: 'owl-refresh',
		loadedClass: 'owl-loaded',
		loadingClass: 'owl-loading',
		rtlClass: 'owl-rtl',
		responsiveClass: 'owl-responsive',
		dragClass: 'owl-drag',
		itemClass: 'owl-item',
		stageClass: 'owl-stage',
		stageOuterClass: 'owl-stage-outer',
		grabClass: 'owl-grab'
	};

	/**
  * Enumeration for width.
  * @public
  * @readonly
  * @enum {String}
  */
	Owl.Width = {
		Default: 'default',
		Inner: 'inner',
		Outer: 'outer'
	};

	/**
  * Enumeration for types.
  * @public
  * @readonly
  * @enum {String}
  */
	Owl.Type = {
		Event: 'event',
		State: 'state'
	};

	/**
  * Contains all registered plugins.
  * @public
  */
	Owl.Plugins = {};

	/**
  * List of workers involved in the update process.
  */
	Owl.Workers = [{
		filter: ['width', 'settings'],
		run: function () {
			this._width = this.$element.width();
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			cache.current = this._items && this._items[this.relative(this._current)];
		}
	}, {
		filter: ['items', 'settings'],
		run: function () {
			this.$stage.children('.cloned').remove();
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			var margin = this.settings.margin || '',
			    grid = !this.settings.autoWidth,
			    rtl = this.settings.rtl,
			    css = {
				'width': 'auto',
				'margin-left': rtl ? margin : '',
				'margin-right': rtl ? '' : margin
			};

			!grid && this.$stage.children().css(css);

			cache.css = css;
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			var width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin,
			    merge = null,
			    iterator = this._items.length,
			    grid = !this.settings.autoWidth,
			    widths = [];

			cache.items = {
				merge: false,
				width: width
			};

			while (iterator--) {
				merge = this._mergers[iterator];
				merge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge;

				cache.items.merge = merge > 1 || cache.items.merge;

				widths[iterator] = !grid ? this._items[iterator].width() : width * merge;
			}

			this._widths = widths;
		}
	}, {
		filter: ['items', 'settings'],
		run: function () {
			var clones = [],
			    items = this._items,
			    settings = this.settings,
			    view = Math.max(settings.items * 2, 4),
			    size = Math.ceil(items.length / 2) * 2,
			    repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0,
			    append = '',
			    prepend = '';

			repeat /= 2;

			while (repeat--) {
				clones.push(this.normalize(clones.length / 2, true));
				append = append + items[clones[clones.length - 1]][0].outerHTML;
				clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));
				prepend = items[clones[clones.length - 1]][0].outerHTML + prepend;
			}

			this._clones = clones;

			$(append).addClass('cloned').appendTo(this.$stage);
			$(prepend).addClass('cloned').prependTo(this.$stage);
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function () {
			var rtl = this.settings.rtl ? 1 : -1,
			    size = this._clones.length + this._items.length,
			    iterator = -1,
			    previous = 0,
			    current = 0,
			    coordinates = [];

			while (++iterator < size) {
				previous = coordinates[iterator - 1] || 0;
				current = this._widths[this.relative(iterator)] + this.settings.margin;
				coordinates.push(previous + current * rtl);
			}

			this._coordinates = coordinates;
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function () {
			var padding = this.settings.stagePadding,
			    coordinates = this._coordinates,
			    css = {
				'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,
				'padding-left': padding || '',
				'padding-right': padding || ''
			};

			this.$stage.css(css);
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			var iterator = this._coordinates.length,
			    grid = !this.settings.autoWidth,
			    items = this.$stage.children();

			if (grid && cache.items.merge) {
				while (iterator--) {
					cache.css.width = this._widths[this.relative(iterator)];
					items.eq(iterator).css(cache.css);
				}
			} else if (grid) {
				cache.css.width = cache.items.width;
				items.css(cache.css);
			}
		}
	}, {
		filter: ['items'],
		run: function () {
			this._coordinates.length < 1 && this.$stage.removeAttr('style');
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			cache.current = cache.current ? this.$stage.children().index(cache.current) : 0;
			cache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current));
			this.reset(cache.current);
		}
	}, {
		filter: ['position'],
		run: function () {
			this.animate(this.coordinates(this._current));
		}
	}, {
		filter: ['width', 'position', 'items', 'settings'],
		run: function () {
			var rtl = this.settings.rtl ? 1 : -1,
			    padding = this.settings.stagePadding * 2,
			    begin = this.coordinates(this.current()) + padding,
			    end = begin + this.width() * rtl,
			    inner,
			    outer,
			    matches = [],
			    i,
			    n;

			for (i = 0, n = this._coordinates.length; i < n; i++) {
				inner = this._coordinates[i - 1] || 0;
				outer = Math.abs(this._coordinates[i]) + padding * rtl;

				if (this.op(inner, '<=', begin) && this.op(inner, '>', end) || this.op(outer, '<', begin) && this.op(outer, '>', end)) {
					matches.push(i);
				}
			}

			this.$stage.children('.active').removeClass('active');
			this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active');

			if (this.settings.center) {
				this.$stage.children('.center').removeClass('center');
				this.$stage.children().eq(this.current()).addClass('center');
			}
		}
	}];

	/**
  * Initializes the carousel.
  * @protected
  */
	Owl.prototype.initialize = function () {
		this.enter('initializing');
		this.trigger('initialize');

		this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl);

		if (this.settings.autoWidth && !this.is('pre-loading')) {
			var imgs, nestedSelector, width;
			imgs = this.$element.find('img');
			nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined;
			width = this.$element.children(nestedSelector).width();

			if (imgs.length && width <= 0) {
				this.preloadAutoWidthImages(imgs);
			}
		}

		this.$element.addClass(this.options.loadingClass);

		// create stage
		this.$stage = $('<' + this.settings.stageElement + ' class="' + this.settings.stageClass + '"/>').wrap('<div class="' + this.settings.stageOuterClass + '"/>');

		// append stage
		this.$element.append(this.$stage.parent());

		// append content
		this.replace(this.$element.children().not(this.$stage.parent()));

		// check visibility
		if (this.$element.is(':visible')) {
			// update view
			this.refresh();
		} else {
			// invalidate width
			this.invalidate('width');
		}

		this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass);

		// register event handlers
		this.registerEventHandlers();

		this.leave('initializing');
		this.trigger('initialized');
	};

	/**
  * Setups the current settings.
  * @todo Remove responsive classes. Why should adaptive designs be brought into IE8?
  * @todo Support for media queries by using `matchMedia` would be nice.
  * @public
  */
	Owl.prototype.setup = function () {
		var viewport = this.viewport(),
		    overwrites = this.options.responsive,
		    match = -1,
		    settings = null;

		if (!overwrites) {
			settings = $.extend({}, this.options);
		} else {
			$.each(overwrites, function (breakpoint) {
				if (breakpoint <= viewport && breakpoint > match) {
					match = Number(breakpoint);
				}
			});

			settings = $.extend({}, this.options, overwrites[match]);
			delete settings.responsive;

			// responsive class
			if (settings.responsiveClass) {
				this.$element.attr('class', this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match));
			}
		}

		if (this.settings === null || this._breakpoint !== match) {
			this.trigger('change', { property: { name: 'settings', value: settings } });
			this._breakpoint = match;
			this.settings = settings;
			this.invalidate('settings');
			this.trigger('changed', { property: { name: 'settings', value: this.settings } });
		}
	};

	/**
  * Updates option logic if necessery.
  * @protected
  */
	Owl.prototype.optionsLogic = function () {
		if (this.settings.autoWidth) {
			this.settings.stagePadding = false;
			this.settings.merge = false;
		}
	};

	/**
  * Prepares an item before add.
  * @todo Rename event parameter `content` to `item`.
  * @protected
  * @returns {jQuery|HTMLElement} - The item container.
  */
	Owl.prototype.prepare = function (item) {
		var event = this.trigger('prepare', { content: item });

		if (!event.data) {
			event.data = $('<' + this.settings.itemElement + '/>').addClass(this.options.itemClass).append(item);
		}

		this.trigger('prepared', { content: event.data });

		return event.data;
	};

	/**
  * Updates the view.
  * @public
  */
	Owl.prototype.update = function () {
		var i = 0,
		    n = this._pipe.length,
		    filter = $.proxy(function (p) {
			return this[p];
		}, this._invalidated),
		    cache = {};

		while (i < n) {
			if (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) {
				this._pipe[i].run(cache);
			}
			i++;
		}

		this._invalidated = {};

		!this.is('valid') && this.enter('valid');
	};

	/**
  * Gets the width of the view.
  * @public
  * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return.
  * @returns {Number} - The width of the view in pixel.
  */
	Owl.prototype.width = function (dimension) {
		dimension = dimension || Owl.Width.Default;
		switch (dimension) {
			case Owl.Width.Inner:
			case Owl.Width.Outer:
				return this._width;
			default:
				return this._width - this.settings.stagePadding * 2 + this.settings.margin;
		}
	};

	/**
  * Refreshes the carousel primarily for adaptive purposes.
  * @public
  */
	Owl.prototype.refresh = function () {
		this.enter('refreshing');
		this.trigger('refresh');

		this.setup();

		this.optionsLogic();

		this.$element.addClass(this.options.refreshClass);

		this.update();

		this.$element.removeClass(this.options.refreshClass);

		this.leave('refreshing');
		this.trigger('refreshed');
	};

	/**
  * Checks window `resize` event.
  * @protected
  */
	Owl.prototype.onThrottledResize = function () {
		window.clearTimeout(this.resizeTimer);
		this.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate);
	};

	/**
  * Checks window `resize` event.
  * @protected
  */
	Owl.prototype.onResize = function () {
		if (!this._items.length) {
			return false;
		}

		if (this._width === this.$element.width()) {
			return false;
		}

		if (!this.$element.is(':visible')) {
			return false;
		}

		this.enter('resizing');

		if (this.trigger('resize').isDefaultPrevented()) {
			this.leave('resizing');
			return false;
		}

		this.invalidate('width');

		this.refresh();

		this.leave('resizing');
		this.trigger('resized');
	};

	/**
  * Registers event handlers.
  * @todo Check `msPointerEnabled`
  * @todo #261
  * @protected
  */
	Owl.prototype.registerEventHandlers = function () {
		if ($.support.transition) {
			this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this));
		}

		if (this.settings.responsive !== false) {
			this.on(window, 'resize', this._handlers.onThrottledResize);
		}

		if (this.settings.mouseDrag) {
			this.$element.addClass(this.options.dragClass);
			this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this));
			this.$stage.on('dragstart.owl.core selectstart.owl.core', function () {
				return false;
			});
		}

		if (this.settings.touchDrag) {
			this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this));
			this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this));
		}
	};

	/**
  * Handles `touchstart` and `mousedown` events.
  * @todo Horizontal swipe threshold as option
  * @todo #261
  * @protected
  * @param {Event} event - The event arguments.
  */
	Owl.prototype.onDragStart = function (event) {
		var stage = null;

		if (event.which === 3) {
			return;
		}

		if ($.support.transform) {
			stage = this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(',');
			stage = {
				x: stage[stage.length === 16 ? 12 : 4],
				y: stage[stage.length === 16 ? 13 : 5]
			};
		} else {
			stage = this.$stage.position();
			stage = {
				x: this.settings.rtl ? stage.left + this.$stage.width() - this.width() + this.settings.margin : stage.left,
				y: stage.top
			};
		}

		if (this.is('animating')) {
			$.support.transform ? this.animate(stage.x) : this.$stage.stop();
			this.invalidate('position');
		}

		this.$element.toggleClass(this.options.grabClass, event.type === 'mousedown');

		this.speed(0);

		this._drag.time = new Date().getTime();
		this._drag.target = $(event.target);
		this._drag.stage.start = stage;
		this._drag.stage.current = stage;
		this._drag.pointer = this.pointer(event);

		$(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this));

		$(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function (event) {
			var delta = this.difference(this._drag.pointer, this.pointer(event));

			$(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this));

			if (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) {
				return;
			}

			event.preventDefault();

			this.enter('dragging');
			this.trigger('drag');
		}, this));
	};

	/**
  * Handles the `touchmove` and `mousemove` events.
  * @todo #261
  * @protected
  * @param {Event} event - The event arguments.
  */
	Owl.prototype.onDragMove = function (event) {
		var minimum = null,
		    maximum = null,
		    pull = null,
		    delta = this.difference(this._drag.pointer, this.pointer(event)),
		    stage = this.difference(this._drag.stage.start, delta);

		if (!this.is('dragging')) {
			return;
		}

		event.preventDefault();

		if (this.settings.loop) {
			minimum = this.coordinates(this.minimum());
			maximum = this.coordinates(this.maximum() + 1) - minimum;
			stage.x = ((stage.x - minimum) % maximum + maximum) % maximum + minimum;
		} else {
			minimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum());
			maximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum());
			pull = this.settings.pullDrag ? -1 * delta.x / 5 : 0;
			stage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull);
		}

		this._drag.stage.current = stage;

		this.animate(stage.x);
	};

	/**
  * Handles the `touchend` and `mouseup` events.
  * @todo #261
  * @todo Threshold for click event
  * @protected
  * @param {Event} event - The event arguments.
  */
	Owl.prototype.onDragEnd = function (event) {
		var delta = this.difference(this._drag.pointer, this.pointer(event)),
		    stage = this._drag.stage.current,
		    direction = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right';

		$(document).off('.owl.core');

		this.$element.removeClass(this.options.grabClass);

		if (delta.x !== 0 && this.is('dragging') || !this.is('valid')) {
			this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed);
			this.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction));
			this.invalidate('position');
			this.update();

			this._drag.direction = direction;

			if (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) {
				this._drag.target.one('click.owl.core', function () {
					return false;
				});
			}
		}

		if (!this.is('dragging')) {
			return;
		}

		this.leave('dragging');
		this.trigger('dragged');
	};

	/**
  * Gets absolute position of the closest item for a coordinate.
  * @todo Setting `freeDrag` makes `closest` not reusable. See #165.
  * @protected
  * @param {Number} coordinate - The coordinate in pixel.
  * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`.
  * @return {Number} - The absolute position of the closest item.
  */
	Owl.prototype.closest = function (coordinate, direction) {
		var position = -1,
		    pull = 30,
		    width = this.width(),
		    coordinates = this.coordinates();

		if (!this.settings.freeDrag) {
			// check closest item
			$.each(coordinates, $.proxy(function (index, value) {
				// on a left pull, check on current index
				if (direction === 'left' && coordinate > value - pull && coordinate < value + pull) {
					position = index;
					// on a right pull, check on previous index
					// to do so, subtract width from value and set position = index + 1
				} else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) {
					position = index + 1;
				} else if (this.op(coordinate, '<', value) && this.op(coordinate, '>', coordinates[index + 1] || value - width)) {
					position = direction === 'left' ? index + 1 : index;
				}
				return position === -1;
			}, this));
		}

		if (!this.settings.loop) {
			// non loop boundries
			if (this.op(coordinate, '>', coordinates[this.minimum()])) {
				position = coordinate = this.minimum();
			} else if (this.op(coordinate, '<', coordinates[this.maximum()])) {
				position = coordinate = this.maximum();
			}
		}

		return position;
	};

	/**
  * Animates the stage.
  * @todo #270
  * @public
  * @param {Number} coordinate - The coordinate in pixels.
  */
	Owl.prototype.animate = function (coordinate) {
		var animate = this.speed() > 0;

		this.is('animating') && this.onTransitionEnd();

		if (animate) {
			this.enter('animating');
			this.trigger('translate');
		}

		if ($.support.transform3d && $.support.transition) {
			this.$stage.css({
				transform: 'translate3d(' + coordinate + 'px,0px,0px)',
				transition: this.speed() / 1000 + 's'
			});
		} else if (animate) {
			this.$stage.animate({
				left: coordinate + 'px'
			}, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this));
		} else {
			this.$stage.css({
				left: coordinate + 'px'
			});
		}
	};

	/**
  * Checks whether the carousel is in a specific state or not.
  * @param {String} state - The state to check.
  * @returns {Boolean} - The flag which indicates if the carousel is busy.
  */
	Owl.prototype.is = function (state) {
		return this._states.current[state] && this._states.current[state] > 0;
	};

	/**
  * Sets the absolute position of the current item.
  * @public
  * @param {Number} [position] - The new absolute position or nothing to leave it unchanged.
  * @returns {Number} - The absolute position of the current item.
  */
	Owl.prototype.current = function (position) {
		if (position === undefined) {
			return this._current;
		}

		if (this._items.length === 0) {
			return undefined;
		}

		position = this.normalize(position);

		if (this._current !== position) {
			var event = this.trigger('change', { property: { name: 'position', value: position } });

			if (event.data !== undefined) {
				position = this.normalize(event.data);
			}

			this._current = position;

			this.invalidate('position');

			this.trigger('changed', { property: { name: 'position', value: this._current } });
		}

		return this._current;
	};

	/**
  * Invalidates the given part of the update routine.
  * @param {String} [part] - The part to invalidate.
  * @returns {Array.<String>} - The invalidated parts.
  */
	Owl.prototype.invalidate = function (part) {
		if ($.type(part) === 'string') {
			this._invalidated[part] = true;
			this.is('valid') && this.leave('valid');
		}
		return $.map(this._invalidated, function (v, i) {
			return i;
		});
	};

	/**
  * Resets the absolute position of the current item.
  * @public
  * @param {Number} position - The absolute position of the new item.
  */
	Owl.prototype.reset = function (position) {
		position = this.normalize(position);

		if (position === undefined) {
			return;
		}

		this._speed = 0;
		this._current = position;

		this.suppress(['translate', 'translated']);

		this.animate(this.coordinates(position));

		this.release(['translate', 'translated']);
	};

	/**
  * Normalizes an absolute or a relative position of an item.
  * @public
  * @param {Number} position - The absolute or relative position to normalize.
  * @param {Boolean} [relative=false] - Whether the given position is relative or not.
  * @returns {Number} - The normalized position.
  */
	Owl.prototype.normalize = function (position, relative) {
		var n = this._items.length,
		    m = relative ? 0 : this._clones.length;

		if (!this.isNumeric(position) || n < 1) {
			position = undefined;
		} else if (position < 0 || position >= n + m) {
			position = ((position - m / 2) % n + n) % n + m / 2;
		}

		return position;
	};

	/**
  * Converts an absolute position of an item into a relative one.
  * @public
  * @param {Number} position - The absolute position to convert.
  * @returns {Number} - The converted position.
  */
	Owl.prototype.relative = function (position) {
		position -= this._clones.length / 2;
		return this.normalize(position, true);
	};

	/**
  * Gets the maximum position for the current item.
  * @public
  * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
  * @returns {Number}
  */
	Owl.prototype.maximum = function (relative) {
		var settings = this.settings,
		    maximum = this._coordinates.length,
		    boundary = Math.abs(this._coordinates[maximum - 1]) - this._width,
		    i = -1,
		    j;

		if (settings.loop) {
			maximum = this._clones.length / 2 + this._items.length - 1;
		} else if (settings.autoWidth || settings.merge) {
			// binary search
			while (maximum - i > 1) {
				Math.abs(this._coordinates[j = maximum + i >> 1]) < boundary ? i = j : maximum = j;
			}
		} else if (settings.center) {
			maximum = this._items.length - 1;
		} else {
			maximum = this._items.length - settings.items;
		}

		if (relative) {
			maximum -= this._clones.length / 2;
		}

		return Math.max(maximum, 0);
	};

	/**
  * Gets the minimum position for the current item.
  * @public
  * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
  * @returns {Number}
  */
	Owl.prototype.minimum = function (relative) {
		return relative ? 0 : this._clones.length / 2;
	};

	/**
  * Gets an item at the specified relative position.
  * @public
  * @param {Number} [position] - The relative position of the item.
  * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
  */
	Owl.prototype.items = function (position) {
		if (position === undefined) {
			return this._items.slice();
		}

		position = this.normalize(position, true);
		return this._items[position];
	};

	/**
  * Gets an item at the specified relative position.
  * @public
  * @param {Number} [position] - The relative position of the item.
  * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
  */
	Owl.prototype.mergers = function (position) {
		if (position === undefined) {
			return this._mergers.slice();
		}

		position = this.normalize(position, true);
		return this._mergers[position];
	};

	/**
  * Gets the absolute positions of clones for an item.
  * @public
  * @param {Number} [position] - The relative position of the item.
  * @returns {Array.<Number>} - The absolute positions of clones for the item or all if no position was given.
  */
	Owl.prototype.clones = function (position) {
		var odd = this._clones.length / 2,
		    even = odd + this._items.length,
		    map = function (index) {
			return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2;
		};

		if (position === undefined) {
			return $.map(this._clones, function (v, i) {
				return map(i);
			});
		}

		return $.map(this._clones, function (v, i) {
			return v === position ? map(i) : null;
		});
	};

	/**
  * Sets the current animation speed.
  * @public
  * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged.
  * @returns {Number} - The current animation speed in milliseconds.
  */
	Owl.prototype.speed = function (speed) {
		if (speed !== undefined) {
			this._speed = speed;
		}

		return this._speed;
	};

	/**
  * Gets the coordinate of an item.
  * @todo The name of this method is missleanding.
  * @public
  * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`.
  * @returns {Number|Array.<Number>} - The coordinate of the item in pixel or all coordinates.
  */
	Owl.prototype.coordinates = function (position) {
		var multiplier = 1,
		    newPosition = position - 1,
		    coordinate;

		if (position === undefined) {
			return $.map(this._coordinates, $.proxy(function (coordinate, index) {
				return this.coordinates(index);
			}, this));
		}

		if (this.settings.center) {
			if (this.settings.rtl) {
				multiplier = -1;
				newPosition = position + 1;
			}

			coordinate = this._coordinates[position];
			coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier;
		} else {
			coordinate = this._coordinates[newPosition] || 0;
		}

		coordinate = Math.ceil(coordinate);

		return coordinate;
	};

	/**
  * Calculates the speed for a translation.
  * @protected
  * @param {Number} from - The absolute position of the start item.
  * @param {Number} to - The absolute position of the target item.
  * @param {Number} [factor=undefined] - The time factor in milliseconds.
  * @returns {Number} - The time in milliseconds for the translation.
  */
	Owl.prototype.duration = function (from, to, factor) {
		if (factor === 0) {
			return 0;
		}

		return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs(factor || this.settings.smartSpeed);
	};

	/**
  * Slides to the specified item.
  * @public
  * @param {Number} position - The position of the item.
  * @param {Number} [speed] - The time in milliseconds for the transition.
  */
	Owl.prototype.to = function (position, speed) {
		var current = this.current(),
		    revert = null,
		    distance = position - this.relative(current),
		    direction = (distance > 0) - (distance < 0),
		    items = this._items.length,
		    minimum = this.minimum(),
		    maximum = this.maximum();

		if (this.settings.loop) {
			if (!this.settings.rewind && Math.abs(distance) > items / 2) {
				distance += direction * -1 * items;
			}

			position = current + distance;
			revert = ((position - minimum) % items + items) % items + minimum;

			if (revert !== position && revert - distance <= maximum && revert - distance > 0) {
				current = revert - distance;
				position = revert;
				this.reset(current);
			}
		} else if (this.settings.rewind) {
			maximum += 1;
			position = (position % maximum + maximum) % maximum;
		} else {
			position = Math.max(minimum, Math.min(maximum, position));
		}

		this.speed(this.duration(current, position, speed));
		this.current(position);

		if (this.$element.is(':visible')) {
			this.update();
		}
	};

	/**
  * Slides to the next item.
  * @public
  * @param {Number} [speed] - The time in milliseconds for the transition.
  */
	Owl.prototype.next = function (speed) {
		speed = speed || false;
		this.to(this.relative(this.current()) + 1, speed);
	};

	/**
  * Slides to the previous item.
  * @public
  * @param {Number} [speed] - The time in milliseconds for the transition.
  */
	Owl.prototype.prev = function (speed) {
		speed = speed || false;
		this.to(this.relative(this.current()) - 1, speed);
	};

	/**
  * Handles the end of an animation.
  * @protected
  * @param {Event} event - The event arguments.
  */
	Owl.prototype.onTransitionEnd = function (event) {

		// if css2 animation then event object is undefined
		if (event !== undefined) {
			event.stopPropagation();

			// Catch only owl-stage transitionEnd event
			if ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) {
				return false;
			}
		}

		this.leave('animating');
		this.trigger('translated');
	};

	/**
  * Gets viewport width.
  * @protected
  * @return {Number} - The width in pixel.
  */
	Owl.prototype.viewport = function () {
		var width;
		if (this.options.responsiveBaseElement !== window) {
			width = $(this.options.responsiveBaseElement).width();
		} else if (window.innerWidth) {
			width = window.innerWidth;
		} else if (document.documentElement && document.documentElement.clientWidth) {
			width = document.documentElement.clientWidth;
		} else {
			throw 'Can not detect viewport width.';
		}
		return width;
	};

	/**
  * Replaces the current content.
  * @public
  * @param {HTMLElement|jQuery|String} content - The new content.
  */
	Owl.prototype.replace = function (content) {
		this.$stage.empty();
		this._items = [];

		if (content) {
			content = content instanceof jQuery ? content : $(content);
		}

		if (this.settings.nestedItemSelector) {
			content = content.find('.' + this.settings.nestedItemSelector);
		}

		content.filter(function () {
			return this.nodeType === 1;
		}).each($.proxy(function (index, item) {
			item = this.prepare(item);
			this.$stage.append(item);
			this._items.push(item);
			this._mergers.push(item.find('[data-merge]').andSelf('[data-merge]').attr('data-merge') * 1 || 1);
		}, this));

		this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0);

		this.invalidate('items');
	};

	/**
  * Adds an item.
  * @todo Use `item` instead of `content` for the event arguments.
  * @public
  * @param {HTMLElement|jQuery|String} content - The item content to add.
  * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end.
  */
	Owl.prototype.add = function (content, position) {
		var current = this.relative(this._current);

		position = position === undefined ? this._items.length : this.normalize(position, true);
		content = content instanceof jQuery ? content : $(content);

		this.trigger('add', { content: content, position: position });

		content = this.prepare(content);

		if (this._items.length === 0 || position === this._items.length) {
			this._items.length === 0 && this.$stage.append(content);
			this._items.length !== 0 && this._items[position - 1].after(content);
			this._items.push(content);
			this._mergers.push(content.find('[data-merge]').andSelf('[data-merge]').attr('data-merge') * 1 || 1);
		} else {
			this._items[position].before(content);
			this._items.splice(position, 0, content);
			this._mergers.splice(position, 0, content.find('[data-merge]').andSelf('[data-merge]').attr('data-merge') * 1 || 1);
		}

		this._items[current] && this.reset(this._items[current].index());

		this.invalidate('items');

		this.trigger('added', { content: content, position: position });
	};

	/**
  * Removes an item by its position.
  * @todo Use `item` instead of `content` for the event arguments.
  * @public
  * @param {Number} position - The relative position of the item to remove.
  */
	Owl.prototype.remove = function (position) {
		position = this.normalize(position, true);

		if (position === undefined) {
			return;
		}

		this.trigger('remove', { content: this._items[position], position: position });

		this._items[position].remove();
		this._items.splice(position, 1);
		this._mergers.splice(position, 1);

		this.invalidate('items');

		this.trigger('removed', { content: null, position: position });
	};

	/**
  * Preloads images with auto width.
  * @todo Replace by a more generic approach
  * @protected
  */
	Owl.prototype.preloadAutoWidthImages = function (images) {
		images.each($.proxy(function (i, element) {
			this.enter('pre-loading');
			element = $(element);
			$(new Image()).one('load', $.proxy(function (e) {
				element.attr('src', e.target.src);
				element.css('opacity', 1);
				this.leave('pre-loading');
				!this.is('pre-loading') && !this.is('initializing') && this.refresh();
			}, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina'));
		}, this));
	};

	/**
  * Destroys the carousel.
  * @public
  */
	Owl.prototype.destroy = function () {

		this.$element.off('.owl.core');
		this.$stage.off('.owl.core');
		$(document).off('.owl.core');

		if (this.settings.responsive !== false) {
			window.clearTimeout(this.resizeTimer);
			this.off(window, 'resize', this._handlers.onThrottledResize);
		}

		for (var i in this._plugins) {
			this._plugins[i].destroy();
		}

		this.$stage.children('.cloned').remove();

		this.$stage.unwrap();
		this.$stage.children().contents().unwrap();
		this.$stage.children().unwrap();

		this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), '')).removeData('owl.carousel');
	};

	/**
  * Operators to calculate right-to-left and left-to-right.
  * @protected
  * @param {Number} [a] - The left side operand.
  * @param {String} [o] - The operator.
  * @param {Number} [b] - The right side operand.
  */
	Owl.prototype.op = function (a, o, b) {
		var rtl = this.settings.rtl;
		switch (o) {
			case '<':
				return rtl ? a > b : a < b;
			case '>':
				return rtl ? a < b : a > b;
			case '>=':
				return rtl ? a <= b : a >= b;
			case '<=':
				return rtl ? a >= b : a <= b;
			default:
				break;
		}
	};

	/**
  * Attaches to an internal event.
  * @protected
  * @param {HTMLElement} element - The event source.
  * @param {String} event - The event name.
  * @param {Function} listener - The event handler to attach.
  * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not.
  */
	Owl.prototype.on = function (element, event, listener, capture) {
		if (element.addEventListener) {
			element.addEventListener(event, listener, capture);
		} else if (element.attachEvent) {
			element.attachEvent('on' + event, listener);
		}
	};

	/**
  * Detaches from an internal event.
  * @protected
  * @param {HTMLElement} element - The event source.
  * @param {String} event - The event name.
  * @param {Function} listener - The attached event handler to detach.
  * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not.
  */
	Owl.prototype.off = function (element, event, listener, capture) {
		if (element.removeEventListener) {
			element.removeEventListener(event, listener, capture);
		} else if (element.detachEvent) {
			element.detachEvent('on' + event, listener);
		}
	};

	/**
  * Triggers a public event.
  * @todo Remove `status`, `relatedTarget` should be used instead.
  * @protected
  * @param {String} name - The event name.
  * @param {*} [data=null] - The event data.
  * @param {String} [namespace=carousel] - The event namespace.
  * @param {String} [state] - The state which is associated with the event.
  * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not.
  * @returns {Event} - The event arguments.
  */
	Owl.prototype.trigger = function (name, data, namespace, state, enter) {
		var status = {
			item: { count: this._items.length, index: this.current() }
		},
		    handler = $.camelCase($.grep(['on', name, namespace], function (v) {
			return v;
		}).join('-').toLowerCase()),
		    event = $.Event([name, 'owl', namespace || 'carousel'].join('.').toLowerCase(), $.extend({ relatedTarget: this }, status, data));

		if (!this._supress[name]) {
			$.each(this._plugins, function (name, plugin) {
				if (plugin.onTrigger) {
					plugin.onTrigger(event);
				}
			});

			this.register({ type: Owl.Type.Event, name: name });
			this.$element.trigger(event);

			if (this.settings && typeof this.settings[handler] === 'function') {
				this.settings[handler].call(this, event);
			}
		}

		return event;
	};

	/**
  * Enters a state.
  * @param name - The state name.
  */
	Owl.prototype.enter = function (name) {
		$.each([name].concat(this._states.tags[name] || []), $.proxy(function (i, name) {
			if (this._states.current[name] === undefined) {
				this._states.current[name] = 0;
			}

			this._states.current[name]++;
		}, this));
	};

	/**
  * Leaves a state.
  * @param name - The state name.
  */
	Owl.prototype.leave = function (name) {
		$.each([name].concat(this._states.tags[name] || []), $.proxy(function (i, name) {
			this._states.current[name]--;
		}, this));
	};

	/**
  * Registers an event or state.
  * @public
  * @param {Object} object - The event or state to register.
  */
	Owl.prototype.register = function (object) {
		if (object.type === Owl.Type.Event) {
			if (!$.event.special[object.name]) {
				$.event.special[object.name] = {};
			}

			if (!$.event.special[object.name].owl) {
				var _default = $.event.special[object.name]._default;
				$.event.special[object.name]._default = function (e) {
					if (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) {
						return _default.apply(this, arguments);
					}
					return e.namespace && e.namespace.indexOf('owl') > -1;
				};
				$.event.special[object.name].owl = true;
			}
		} else if (object.type === Owl.Type.State) {
			if (!this._states.tags[object.name]) {
				this._states.tags[object.name] = object.tags;
			} else {
				this._states.tags[object.name] = this._states.tags[object.name].concat(object.tags);
			}

			this._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function (tag, i) {
				return $.inArray(tag, this._states.tags[object.name]) === i;
			}, this));
		}
	};

	/**
  * Suppresses events.
  * @protected
  * @param {Array.<String>} events - The events to suppress.
  */
	Owl.prototype.suppress = function (events) {
		$.each(events, $.proxy(function (index, event) {
			this._supress[event] = true;
		}, this));
	};

	/**
  * Releases suppressed events.
  * @protected
  * @param {Array.<String>} events - The events to release.
  */
	Owl.prototype.release = function (events) {
		$.each(events, $.proxy(function (index, event) {
			delete this._supress[event];
		}, this));
	};

	/**
  * Gets unified pointer coordinates from event.
  * @todo #261
  * @protected
  * @param {Event} - The `mousedown` or `touchstart` event.
  * @returns {Object} - Contains `x` and `y` coordinates of current pointer position.
  */
	Owl.prototype.pointer = function (event) {
		var result = { x: null, y: null };

		event = event.originalEvent || event || window.event;

		event = event.touches && event.touches.length ? event.touches[0] : event.changedTouches && event.changedTouches.length ? event.changedTouches[0] : event;

		if (event.pageX) {
			result.x = event.pageX;
			result.y = event.pageY;
		} else {
			result.x = event.clientX;
			result.y = event.clientY;
		}

		return result;
	};

	/**
  * Determines if the input is a Number or something that can be coerced to a Number
  * @protected
  * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested
  * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number
  */
	Owl.prototype.isNumeric = function (number) {
		return !isNaN(parseFloat(number));
	};

	/**
  * Gets the difference of two vectors.
  * @todo #261
  * @protected
  * @param {Object} - The first vector.
  * @param {Object} - The second vector.
  * @returns {Object} - The difference.
  */
	Owl.prototype.difference = function (first, second) {
		return {
			x: first.x - second.x,
			y: first.y - second.y
		};
	};

	/**
  * The jQuery Plugin for the Owl Carousel
  * @todo Navigation plugin `next` and `prev`
  * @public
  */
	$.fn.owlCarousel = function (option) {
		var args = Array.prototype.slice.call(arguments, 1);

		return this.each(function () {
			var $this = $(this),
			    data = $this.data('owl.carousel');

			if (!data) {
				data = new Owl(this, typeof option == 'object' && option);
				$this.data('owl.carousel', data);

				$.each(['next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove'], function (i, event) {
					data.register({ type: Owl.Type.Event, name: event });
					data.$element.on(event + '.owl.carousel.core', $.proxy(function (e) {
						if (e.namespace && e.relatedTarget !== this) {
							this.suppress([event]);
							data[event].apply(this, [].slice.call(arguments, 1));
							this.release([event]);
						}
					}, data));
				});
			}

			if (typeof option == 'string' && option.charAt(0) !== '_') {
				data[option].apply(data, args);
			}
		});
	};

	/**
  * The constructor for the jQuery Plugin
  * @public
  */
	$.fn.owlCarousel.Constructor = Owl;
})(window.Zepto || window.jQuery, window, document);

/**
 * AutoRefresh Plugin
 * @version 2.1.0
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the auto refresh plugin.
  * @class The Auto Refresh Plugin
  * @param {Owl} carousel - The Owl Carousel
  */
	var AutoRefresh = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Refresh interval.
   * @protected
   * @type {number}
   */
		this._interval = null;

		/**
   * Whether the element is currently visible or not.
   * @protected
   * @type {Boolean}
   */
		this._visible = null;

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoRefresh) {
					this.watch();
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options);

		// register event handlers
		this._core.$element.on(this._handlers);
	};

	/**
  * Default options.
  * @public
  */
	AutoRefresh.Defaults = {
		autoRefresh: true,
		autoRefreshInterval: 500
	};

	/**
  * Watches the element.
  */
	AutoRefresh.prototype.watch = function () {
		if (this._interval) {
			return;
		}

		this._visible = this._core.$element.is(':visible');
		this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval);
	};

	/**
  * Refreshes the element.
  */
	AutoRefresh.prototype.refresh = function () {
		if (this._core.$element.is(':visible') === this._visible) {
			return;
		}

		this._visible = !this._visible;

		this._core.$element.toggleClass('owl-hidden', !this._visible);

		this._visible && this._core.invalidate('width') && this._core.refresh();
	};

	/**
  * Destroys the plugin.
  */
	AutoRefresh.prototype.destroy = function () {
		var handler, property;

		window.clearInterval(this._interval);

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh;
})(window.Zepto || window.jQuery, window, document);

/**
 * Lazy Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the lazy plugin.
  * @class The Lazy Plugin
  * @param {Owl} carousel - The Owl Carousel
  */
	var Lazy = function (carousel) {

		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Already loaded items.
   * @protected
   * @type {Array.<jQuery>}
   */
		this._loaded = [];

		/**
   * Event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function (e) {
				if (!e.namespace) {
					return;
				}

				if (!this._core.settings || !this._core.settings.lazyLoad) {
					return;
				}

				if (e.property && e.property.name == 'position' || e.type == 'initialized') {
					var settings = this._core.settings,
					    n = settings.center && Math.ceil(settings.items / 2) || settings.items,
					    i = settings.center && n * -1 || 0,
					    position = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i,
					    clones = this._core.clones().length,
					    load = $.proxy(function (i, v) {
						this.load(v);
					}, this);

					while (i++ < n) {
						this.load(clones / 2 + this._core.relative(position));
						clones && $.each(this._core.clones(this._core.relative(position)), load);
						position++;
					}
				}
			}, this)
		};

		// set the default options
		this._core.options = $.extend({}, Lazy.Defaults, this._core.options);

		// register event handler
		this._core.$element.on(this._handlers);
	};

	/**
  * Default options.
  * @public
  */
	Lazy.Defaults = {
		lazyLoad: false
	};

	/**
  * Loads all resources of an item at the specified position.
  * @param {Number} position - The absolute position of the item.
  * @protected
  */
	Lazy.prototype.load = function (position) {
		var $item = this._core.$stage.children().eq(position),
		    $elements = $item && $item.find('.owl-lazy');

		if (!$elements || $.inArray($item.get(0), this._loaded) > -1) {
			return;
		}

		$elements.each($.proxy(function (index, element) {
			var $element = $(element),
			    image,
			    url = window.devicePixelRatio > 1 && $element.attr('data-src-retina') || $element.attr('data-src');

			this._core.trigger('load', { element: $element, url: url }, 'lazy');

			if ($element.is('img')) {
				$element.one('load.owl.lazy', $.proxy(function () {
					$element.css('opacity', 1);
					this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
				}, this)).attr('src', url);
			} else {
				image = new Image();
				image.onload = $.proxy(function () {
					$element.css({
						'background-image': 'url(' + url + ')',
						'opacity': '1'
					});
					this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
				}, this);
				image.src = url;
			}
		}, this));

		this._loaded.push($item.get(0));
	};

	/**
  * Destroys the plugin.
  * @public
  */
	Lazy.prototype.destroy = function () {
		var handler, property;

		for (handler in this.handlers) {
			this._core.$element.off(handler, this.handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy;
})(window.Zepto || window.jQuery, window, document);

/**
 * AutoHeight Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the auto height plugin.
  * @class The Auto Height Plugin
  * @param {Owl} carousel - The Owl Carousel
  */
	var AutoHeight = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoHeight) {
					this.update();
				}
			}, this),
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoHeight && e.property.name == 'position') {
					this.update();
				}
			}, this),
			'loaded.owl.lazy': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoHeight && e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) {
					this.update();
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, AutoHeight.Defaults, this._core.options);

		// register event handlers
		this._core.$element.on(this._handlers);
	};

	/**
  * Default options.
  * @public
  */
	AutoHeight.Defaults = {
		autoHeight: false,
		autoHeightClass: 'owl-height'
	};

	/**
  * Updates the view.
  */
	AutoHeight.prototype.update = function () {
		var start = this._core._current,
		    end = start + this._core.settings.items,
		    visible = this._core.$stage.children().toArray().slice(start, end),
		    heights = [],
		    maxheight = 0;

		$.each(visible, function (index, item) {
			heights.push($(item).height());
		});

		maxheight = Math.max.apply(null, heights);

		this._core.$stage.parent().height(maxheight).addClass(this._core.settings.autoHeightClass);
	};

	AutoHeight.prototype.destroy = function () {
		var handler, property;

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight;
})(window.Zepto || window.jQuery, window, document);

/**
 * Video Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the video plugin.
  * @class The Video Plugin
  * @param {Owl} carousel - The Owl Carousel
  */
	var Video = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Cache all video URLs.
   * @protected
   * @type {Object}
   */
		this._videos = {};

		/**
   * Current playing item.
   * @protected
   * @type {jQuery}
   */
		this._playing = null;

		/**
   * All event handlers.
   * @todo The cloned content removale is too late
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace) {
					this._core.register({ type: 'state', name: 'playing', tags: ['interacting'] });
				}
			}, this),
			'resize.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.video && this.isInFullScreen()) {
					e.preventDefault();
				}
			}, this),
			'refreshed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.is('resizing')) {
					this._core.$stage.find('.cloned .owl-video-frame').remove();
				}
			}, this),
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name === 'position' && this._playing) {
					this.stop();
				}
			}, this),
			'prepared.owl.carousel': $.proxy(function (e) {
				if (!e.namespace) {
					return;
				}

				var $element = $(e.content).find('.owl-video');

				if ($element.length) {
					$element.css('display', 'none');
					this.fetch($element, $(e.content));
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, Video.Defaults, this._core.options);

		// register event handlers
		this._core.$element.on(this._handlers);

		this._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function (e) {
			this.play(e);
		}, this));
	};

	/**
  * Default options.
  * @public
  */
	Video.Defaults = {
		video: false,
		videoHeight: false,
		videoWidth: false
	};

	/**
  * Gets the video ID and the type (YouTube/Vimeo/vzaar only).
  * @protected
  * @param {jQuery} target - The target containing the video data.
  * @param {jQuery} item - The item containing the video.
  */
	Video.prototype.fetch = function (target, item) {
		var type = function () {
			if (target.attr('data-vimeo-id')) {
				return 'vimeo';
			} else if (target.attr('data-vzaar-id')) {
				return 'vzaar';
			} else {
				return 'youtube';
			}
		}(),
		    id = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'),
		    width = target.attr('data-width') || this._core.settings.videoWidth,
		    height = target.attr('data-height') || this._core.settings.videoHeight,
		    url = target.attr('href');

		if (url) {

			/*
   		Parses the id's out of the following urls (and probably more):
   		https://www.youtube.com/watch?v=:id
   		https://youtu.be/:id
   		https://vimeo.com/:id
   		https://vimeo.com/channels/:channel/:id
   		https://vimeo.com/groups/:group/videos/:id
   		https://app.vzaar.com/videos/:id
   			Visual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F
   */

			id = url.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);

			if (id[3].indexOf('youtu') > -1) {
				type = 'youtube';
			} else if (id[3].indexOf('vimeo') > -1) {
				type = 'vimeo';
			} else if (id[3].indexOf('vzaar') > -1) {
				type = 'vzaar';
			} else {
				throw new Error('Video URL not supported.');
			}
			id = id[6];
		} else {
			throw new Error('Missing video URL.');
		}

		this._videos[url] = {
			type: type,
			id: id,
			width: width,
			height: height
		};

		item.attr('data-video', url);

		this.thumbnail(target, this._videos[url]);
	};

	/**
  * Creates video thumbnail.
  * @protected
  * @param {jQuery} target - The target containing the video data.
  * @param {Object} info - The video info object.
  * @see `fetch`
  */
	Video.prototype.thumbnail = function (target, video) {
		var tnLink,
		    icon,
		    path,
		    dimensions = video.width && video.height ? 'style="width:' + video.width + 'px;height:' + video.height + 'px;"' : '',
		    customTn = target.find('img'),
		    srcType = 'src',
		    lazyClass = '',
		    settings = this._core.settings,
		    create = function (path) {
			icon = '<div class="owl-video-play-icon"></div>';

			if (settings.lazyLoad) {
				tnLink = '<div class="owl-video-tn ' + lazyClass + '" ' + srcType + '="' + path + '"></div>';
			} else {
				tnLink = '<div class="owl-video-tn" style="opacity:1;background-image:url(' + path + ')"></div>';
			}
			target.after(tnLink);
			target.after(icon);
		};

		// wrap video content into owl-video-wrapper div
		target.wrap('<div class="owl-video-wrapper"' + dimensions + '></div>');

		if (this._core.settings.lazyLoad) {
			srcType = 'data-src';
			lazyClass = 'owl-lazy';
		}

		// custom thumbnail
		if (customTn.length) {
			create(customTn.attr(srcType));
			customTn.remove();
			return false;
		}

		if (video.type === 'youtube') {
			path = "//img.youtube.com/vi/" + video.id + "/hqdefault.jpg";
			create(path);
		} else if (video.type === 'vimeo') {
			$.ajax({
				type: 'GET',
				url: '//vimeo.com/api/v2/video/' + video.id + '.json',
				jsonp: 'callback',
				dataType: 'jsonp',
				success: function (data) {
					path = data[0].thumbnail_large;
					create(path);
				}
			});
		} else if (video.type === 'vzaar') {
			$.ajax({
				type: 'GET',
				url: '//vzaar.com/api/videos/' + video.id + '.json',
				jsonp: 'callback',
				dataType: 'jsonp',
				success: function (data) {
					path = data.framegrab_url;
					create(path);
				}
			});
		}
	};

	/**
  * Stops the current video.
  * @public
  */
	Video.prototype.stop = function () {
		this._core.trigger('stop', null, 'video');
		this._playing.find('.owl-video-frame').remove();
		this._playing.removeClass('owl-video-playing');
		this._playing = null;
		this._core.leave('playing');
		this._core.trigger('stopped', null, 'video');
	};

	/**
  * Starts the current video.
  * @public
  * @param {Event} event - The event arguments.
  */
	Video.prototype.play = function (event) {
		var target = $(event.target),
		    item = target.closest('.' + this._core.settings.itemClass),
		    video = this._videos[item.attr('data-video')],
		    width = video.width || '100%',
		    height = video.height || this._core.$stage.height(),
		    html;

		if (this._playing) {
			return;
		}

		this._core.enter('playing');
		this._core.trigger('play', null, 'video');

		item = this._core.items(this._core.relative(item.index()));

		this._core.reset(item.index());

		if (video.type === 'youtube') {
			html = '<iframe width="' + width + '" height="' + height + '" src="//www.youtube.com/embed/' + video.id + '?autoplay=1&v=' + video.id + '" frameborder="0" allowfullscreen></iframe>';
		} else if (video.type === 'vimeo') {
			html = '<iframe src="//player.vimeo.com/video/' + video.id + '?autoplay=1" width="' + width + '" height="' + height + '" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>';
		} else if (video.type === 'vzaar') {
			html = '<iframe frameborder="0"' + 'height="' + height + '"' + 'width="' + width + '" allowfullscreen mozallowfullscreen webkitAllowFullScreen ' + 'src="//view.vzaar.com/' + video.id + '/player?autoplay=true"></iframe>';
		}

		$('<div class="owl-video-frame">' + html + '</div>').insertAfter(item.find('.owl-video'));

		this._playing = item.addClass('owl-video-playing');
	};

	/**
  * Checks whether an video is currently in full screen mode or not.
  * @todo Bad style because looks like a readonly method but changes members.
  * @protected
  * @returns {Boolean}
  */
	Video.prototype.isInFullScreen = function () {
		var element = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement;

		return element && $(element).parent().hasClass('owl-video-frame');
	};

	/**
  * Destroys the plugin.
  */
	Video.prototype.destroy = function () {
		var handler, property;

		this._core.$element.off('click.owl.video');

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Video = Video;
})(window.Zepto || window.jQuery, window, document);

/**
 * Animate Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the animate plugin.
  * @class The Navigation Plugin
  * @param {Owl} scope - The Owl Carousel
  */
	var Animate = function (scope) {
		this.core = scope;
		this.core.options = $.extend({}, Animate.Defaults, this.core.options);
		this.swapping = true;
		this.previous = undefined;
		this.next = undefined;

		this.handlers = {
			'change.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name == 'position') {
					this.previous = this.core.current();
					this.next = e.property.value;
				}
			}, this),
			'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function (e) {
				if (e.namespace) {
					this.swapping = e.type == 'translated';
				}
			}, this),
			'translate.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) {
					this.swap();
				}
			}, this)
		};

		this.core.$element.on(this.handlers);
	};

	/**
  * Default options.
  * @public
  */
	Animate.Defaults = {
		animateOut: false,
		animateIn: false
	};

	/**
  * Toggles the animation classes whenever an translations starts.
  * @protected
  * @returns {Boolean|undefined}
  */
	Animate.prototype.swap = function () {

		if (this.core.settings.items !== 1) {
			return;
		}

		if (!$.support.animation || !$.support.transition) {
			return;
		}

		this.core.speed(0);

		var left,
		    clear = $.proxy(this.clear, this),
		    previous = this.core.$stage.children().eq(this.previous),
		    next = this.core.$stage.children().eq(this.next),
		    incoming = this.core.settings.animateIn,
		    outgoing = this.core.settings.animateOut;

		if (this.core.current() === this.previous) {
			return;
		}

		if (outgoing) {
			left = this.core.coordinates(this.previous) - this.core.coordinates(this.next);
			previous.one($.support.animation.end, clear).css({ 'left': left + 'px' }).addClass('animated owl-animated-out').addClass(outgoing);
		}

		if (incoming) {
			next.one($.support.animation.end, clear).addClass('animated owl-animated-in').addClass(incoming);
		}
	};

	Animate.prototype.clear = function (e) {
		$(e.target).css({ 'left': '' }).removeClass('animated owl-animated-out owl-animated-in').removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut);
		this.core.onTransitionEnd();
	};

	/**
  * Destroys the plugin.
  * @public
  */
	Animate.prototype.destroy = function () {
		var handler, property;

		for (handler in this.handlers) {
			this.core.$element.off(handler, this.handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Animate = Animate;
})(window.Zepto || window.jQuery, window, document);

/**
 * Autoplay Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the autoplay plugin.
  * @class The Autoplay Plugin
  * @param {Owl} scope - The Owl Carousel
  */
	var Autoplay = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * The autoplay timeout.
   * @type {Timeout}
   */
		this._timeout = null;

		/**
   * Indicates whenever the autoplay is paused.
   * @type {Boolean}
   */
		this._paused = false;

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name === 'settings') {
					if (this._core.settings.autoplay) {
						this.play();
					} else {
						this.stop();
					}
				} else if (e.namespace && e.property.name === 'position') {
					//console.log('play?', e);
					if (this._core.settings.autoplay) {
						this._setAutoPlayInterval();
					}
				}
			}, this),
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoplay) {
					this.play();
				}
			}, this),
			'play.owl.autoplay': $.proxy(function (e, t, s) {
				if (e.namespace) {
					this.play(t, s);
				}
			}, this),
			'stop.owl.autoplay': $.proxy(function (e) {
				if (e.namespace) {
					this.stop();
				}
			}, this),
			'mouseover.owl.autoplay': $.proxy(function () {
				if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
					this.pause();
				}
			}, this),
			'mouseleave.owl.autoplay': $.proxy(function () {
				if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
					this.play();
				}
			}, this),
			'touchstart.owl.core': $.proxy(function () {
				if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
					this.pause();
				}
			}, this),
			'touchend.owl.core': $.proxy(function () {
				if (this._core.settings.autoplayHoverPause) {
					this.play();
				}
			}, this)
		};

		// register event handlers
		this._core.$element.on(this._handlers);

		// set default options
		this._core.options = $.extend({}, Autoplay.Defaults, this._core.options);
	};

	/**
  * Default options.
  * @public
  */
	Autoplay.Defaults = {
		autoplay: false,
		autoplayTimeout: 5000,
		autoplayHoverPause: false,
		autoplaySpeed: false
	};

	/**
  * Starts the autoplay.
  * @public
  * @param {Number} [timeout] - The interval before the next animation starts.
  * @param {Number} [speed] - The animation speed for the animations.
  */
	Autoplay.prototype.play = function (timeout, speed) {
		this._paused = false;

		if (this._core.is('rotating')) {
			return;
		}

		this._core.enter('rotating');

		this._setAutoPlayInterval();
	};

	/**
  * Gets a new timeout
  * @private
  * @param {Number} [timeout] - The interval before the next animation starts.
  * @param {Number} [speed] - The animation speed for the animations.
  * @return {Timeout}
  */
	Autoplay.prototype._getNextTimeout = function (timeout, speed) {
		if (this._timeout) {
			window.clearTimeout(this._timeout);
		}
		return window.setTimeout($.proxy(function () {
			if (this._paused || this._core.is('busy') || this._core.is('interacting') || document.hidden) {
				return;
			}
			this._core.next(speed || this._core.settings.autoplaySpeed);
		}, this), timeout || this._core.settings.autoplayTimeout);
	};

	/**
  * Sets autoplay in motion.
  * @private
  */
	Autoplay.prototype._setAutoPlayInterval = function () {
		this._timeout = this._getNextTimeout();
	};

	/**
  * Stops the autoplay.
  * @public
  */
	Autoplay.prototype.stop = function () {
		if (!this._core.is('rotating')) {
			return;
		}

		window.clearTimeout(this._timeout);
		this._core.leave('rotating');
	};

	/**
  * Stops the autoplay.
  * @public
  */
	Autoplay.prototype.pause = function () {
		if (!this._core.is('rotating')) {
			return;
		}

		this._paused = true;
	};

	/**
  * Destroys the plugin.
  */
	Autoplay.prototype.destroy = function () {
		var handler, property;

		this.stop();

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay;
})(window.Zepto || window.jQuery, window, document);

/**
 * Navigation Plugin
 * @version 2.1.0
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {
	'use strict';

	/**
  * Creates the navigation plugin.
  * @class The Navigation Plugin
  * @param {Owl} carousel - The Owl Carousel.
  */

	var Navigation = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Indicates whether the plugin is initialized or not.
   * @protected
   * @type {Boolean}
   */
		this._initialized = false;

		/**
   * The current paging indexes.
   * @protected
   * @type {Array}
   */
		this._pages = [];

		/**
   * All DOM elements of the user interface.
   * @protected
   * @type {Object}
   */
		this._controls = {};

		/**
   * Markup for an indicator.
   * @protected
   * @type {Array.<String>}
   */
		this._templates = [];

		/**
   * The carousel element.
   * @type {jQuery}
   */
		this.$element = this._core.$element;

		/**
   * Overridden methods of the carousel.
   * @protected
   * @type {Object}
   */
		this._overrides = {
			next: this._core.next,
			prev: this._core.prev,
			to: this._core.to
		};

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'prepared.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.dotsData) {
					this._templates.push('<div class="' + this._core.settings.dotClass + '">' + $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '</div>');
				}
			}, this),
			'added.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.dotsData) {
					this._templates.splice(e.position, 0, this._templates.pop());
				}
			}, this),
			'remove.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.dotsData) {
					this._templates.splice(e.position, 1);
				}
			}, this),
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name == 'position') {
					this.draw();
				}
			}, this),
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace && !this._initialized) {
					this._core.trigger('initialize', null, 'navigation');
					this.initialize();
					this.update();
					this.draw();
					this._initialized = true;
					this._core.trigger('initialized', null, 'navigation');
				}
			}, this),
			'refreshed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._initialized) {
					this._core.trigger('refresh', null, 'navigation');
					this.update();
					this.draw();
					this._core.trigger('refreshed', null, 'navigation');
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, Navigation.Defaults, this._core.options);

		// register event handlers
		this.$element.on(this._handlers);
	};

	/**
  * Default options.
  * @public
  * @todo Rename `slideBy` to `navBy`
  */
	Navigation.Defaults = {
		nav: false,
		navText: ['prev', 'next'],
		navSpeed: false,
		navElement: 'div',
		navContainer: false,
		navContainerClass: 'owl-nav',
		navClass: ['owl-prev', 'owl-next'],
		slideBy: 1,
		dotClass: 'owl-dot',
		dotsClass: 'owl-dots',
		dots: true,
		dotsEach: false,
		dotsData: false,
		dotsSpeed: false,
		dotsContainer: false
	};

	/**
  * Initializes the layout of the plugin and extends the carousel.
  * @protected
  */
	Navigation.prototype.initialize = function () {
		var override,
		    settings = this._core.settings;

		// create DOM structure for relative navigation
		this._controls.$relative = (settings.navContainer ? $(settings.navContainer) : $('<div>').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled');

		this._controls.$previous = $('<' + settings.navElement + '>').addClass(settings.navClass[0]).html(settings.navText[0]).prependTo(this._controls.$relative).on('click', $.proxy(function (e) {
			this.prev(settings.navSpeed);
		}, this));
		this._controls.$next = $('<' + settings.navElement + '>').addClass(settings.navClass[1]).html(settings.navText[1]).appendTo(this._controls.$relative).on('click', $.proxy(function (e) {
			this.next(settings.navSpeed);
		}, this));

		// create DOM structure for absolute navigation
		if (!settings.dotsData) {
			this._templates = [$('<div>').addClass(settings.dotClass).append($('<span>')).prop('outerHTML')];
		}

		this._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer) : $('<div>').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled');

		this._controls.$absolute.on('click', 'div', $.proxy(function (e) {
			var index = $(e.target).parent().is(this._controls.$absolute) ? $(e.target).index() : $(e.target).parent().index();

			e.preventDefault();

			this.to(index, settings.dotsSpeed);
		}, this));

		// override public methods of the carousel
		for (override in this._overrides) {
			this._core[override] = $.proxy(this[override], this);
		}
	};

	/**
  * Destroys the plugin.
  * @protected
  */
	Navigation.prototype.destroy = function () {
		var handler, control, property, override;

		for (handler in this._handlers) {
			this.$element.off(handler, this._handlers[handler]);
		}
		for (control in this._controls) {
			this._controls[control].remove();
		}
		for (override in this.overides) {
			this._core[override] = this._overrides[override];
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	/**
  * Updates the internal state.
  * @protected
  */
	Navigation.prototype.update = function () {
		var i,
		    j,
		    k,
		    lower = this._core.clones().length / 2,
		    upper = lower + this._core.items().length,
		    maximum = this._core.maximum(true),
		    settings = this._core.settings,
		    size = settings.center || settings.autoWidth || settings.dotsData ? 1 : settings.dotsEach || settings.items;

		if (settings.slideBy !== 'page') {
			settings.slideBy = Math.min(settings.slideBy, settings.items);
		}

		if (settings.dots || settings.slideBy == 'page') {
			this._pages = [];

			for (i = lower, j = 0, k = 0; i < upper; i++) {
				if (j >= size || j === 0) {
					this._pages.push({
						start: Math.min(maximum, i - lower),
						end: i - lower + size - 1
					});
					if (Math.min(maximum, i - lower) === maximum) {
						break;
					}
					j = 0, ++k;
				}
				j += this._core.mergers(this._core.relative(i));
			}
		}
	};

	/**
  * Draws the user interface.
  * @todo The option `dotsData` wont work.
  * @protected
  */
	Navigation.prototype.draw = function () {
		var difference,
		    settings = this._core.settings,
		    disabled = this._core.items().length <= settings.items,
		    index = this._core.relative(this._core.current()),
		    loop = settings.loop || settings.rewind;

		this._controls.$relative.toggleClass('disabled', !settings.nav || disabled);

		if (settings.nav) {
			this._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true));
			this._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true));
		}

		this._controls.$absolute.toggleClass('disabled', !settings.dots || disabled);

		if (settings.dots) {
			difference = this._pages.length - this._controls.$absolute.children().length;

			if (settings.dotsData && difference !== 0) {
				this._controls.$absolute.html(this._templates.join(''));
			} else if (difference > 0) {
				this._controls.$absolute.append(new Array(difference + 1).join(this._templates[0]));
			} else if (difference < 0) {
				this._controls.$absolute.children().slice(difference).remove();
			}

			this._controls.$absolute.find('.active').removeClass('active');
			this._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active');
		}
	};

	/**
  * Extends event data.
  * @protected
  * @param {Event} event - The event object which gets thrown.
  */
	Navigation.prototype.onTrigger = function (event) {
		var settings = this._core.settings;

		event.page = {
			index: $.inArray(this.current(), this._pages),
			count: this._pages.length,
			size: settings && (settings.center || settings.autoWidth || settings.dotsData ? 1 : settings.dotsEach || settings.items)
		};
	};

	/**
  * Gets the current page position of the carousel.
  * @protected
  * @returns {Number}
  */
	Navigation.prototype.current = function () {
		var current = this._core.relative(this._core.current());
		return $.grep(this._pages, $.proxy(function (page, index) {
			return page.start <= current && page.end >= current;
		}, this)).pop();
	};

	/**
  * Gets the current succesor/predecessor position.
  * @protected
  * @returns {Number}
  */
	Navigation.prototype.getPosition = function (successor) {
		var position,
		    length,
		    settings = this._core.settings;

		if (settings.slideBy == 'page') {
			position = $.inArray(this.current(), this._pages);
			length = this._pages.length;
			successor ? ++position : --position;
			position = this._pages[(position % length + length) % length].start;
		} else {
			position = this._core.relative(this._core.current());
			length = this._core.items().length;
			successor ? position += settings.slideBy : position -= settings.slideBy;
		}

		return position;
	};

	/**
  * Slides to the next item or page.
  * @public
  * @param {Number} [speed=false] - The time in milliseconds for the transition.
  */
	Navigation.prototype.next = function (speed) {
		$.proxy(this._overrides.to, this._core)(this.getPosition(true), speed);
	};

	/**
  * Slides to the previous item or page.
  * @public
  * @param {Number} [speed=false] - The time in milliseconds for the transition.
  */
	Navigation.prototype.prev = function (speed) {
		$.proxy(this._overrides.to, this._core)(this.getPosition(false), speed);
	};

	/**
  * Slides to the specified item or page.
  * @public
  * @param {Number} position - The position of the item or page.
  * @param {Number} [speed] - The time in milliseconds for the transition.
  * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not.
  */
	Navigation.prototype.to = function (position, speed, standard) {
		var length;

		if (!standard && this._pages.length) {
			length = this._pages.length;
			$.proxy(this._overrides.to, this._core)(this._pages[(position % length + length) % length].start, speed);
		} else {
			$.proxy(this._overrides.to, this._core)(position, speed);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation;
})(window.Zepto || window.jQuery, window, document);

/**
 * Hash Plugin
 * @version 2.1.0
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {
	'use strict';

	/**
  * Creates the hash plugin.
  * @class The Hash Plugin
  * @param {Owl} carousel - The Owl Carousel
  */

	var Hash = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Hash index for the items.
   * @protected
   * @type {Object}
   */
		this._hashes = {};

		/**
   * The carousel element.
   * @type {jQuery}
   */
		this.$element = this._core.$element;

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.startPosition === 'URLHash') {
					$(window).trigger('hashchange.owl.navigation');
				}
			}, this),
			'prepared.owl.carousel': $.proxy(function (e) {
				if (e.namespace) {
					var hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash');

					if (!hash) {
						return;
					}

					this._hashes[hash] = e.content;
				}
			}, this),
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name === 'position') {
					var current = this._core.items(this._core.relative(this._core.current())),
					    hash = $.map(this._hashes, function (item, hash) {
						return item === current ? hash : null;
					}).join();

					if (!hash || window.location.hash.slice(1) === hash) {
						return;
					}

					window.location.hash = hash;
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, Hash.Defaults, this._core.options);

		// register the event handlers
		this.$element.on(this._handlers);

		// register event listener for hash navigation
		$(window).on('hashchange.owl.navigation', $.proxy(function (e) {
			var hash = window.location.hash.substring(1),
			    items = this._core.$stage.children(),
			    position = this._hashes[hash] && items.index(this._hashes[hash]);

			if (position === undefined || position === this._core.current()) {
				return;
			}

			this._core.to(this._core.relative(position), false, true);
		}, this));
	};

	/**
  * Default options.
  * @public
  */
	Hash.Defaults = {
		URLhashListener: false
	};

	/**
  * Destroys the plugin.
  * @public
  */
	Hash.prototype.destroy = function () {
		var handler, property;

		$(window).off('hashchange.owl.navigation');

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Hash = Hash;
})(window.Zepto || window.jQuery, window, document);

/**
 * Support Plugin
 *
 * @version 2.1.0
 * @author Vivid Planet Software GmbH
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	var style = $('<support>').get(0).style,
	    prefixes = 'Webkit Moz O ms'.split(' '),
	    events = {
		transition: {
			end: {
				WebkitTransition: 'webkitTransitionEnd',
				MozTransition: 'transitionend',
				OTransition: 'oTransitionEnd',
				transition: 'transitionend'
			}
		},
		animation: {
			end: {
				WebkitAnimation: 'webkitAnimationEnd',
				MozAnimation: 'animationend',
				OAnimation: 'oAnimationEnd',
				animation: 'animationend'
			}
		}
	},
	    tests = {
		csstransforms: function () {
			return !!test('transform');
		},
		csstransforms3d: function () {
			return !!test('perspective');
		},
		csstransitions: function () {
			return !!test('transition');
		},
		cssanimations: function () {
			return !!test('animation');
		}
	};

	function test(property, prefixed) {
		var result = false,
		    upper = property.charAt(0).toUpperCase() + property.slice(1);

		$.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function (i, property) {
			if (style[property] !== undefined) {
				result = prefixed ? property : true;
				return false;
			}
		});

		return result;
	}

	function prefixed(property) {
		return test(property, true);
	}

	if (tests.csstransitions()) {
		/* jshint -W053 */
		$.support.transition = new String(prefixed('transition'));
		$.support.transition.end = events.transition.end[$.support.transition];
	}

	if (tests.cssanimations()) {
		/* jshint -W053 */
		$.support.animation = new String(prefixed('animation'));
		$.support.animation.end = events.animation.end[$.support.animation];
	}

	if (tests.csstransforms()) {
		/* jshint -W053 */
		$.support.transform = new String(prefixed('transform'));
		$.support.transform3d = tests.csstransforms3d();
	}
})(window.Zepto || window.jQuery, window, document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/picturefill.min.js":[function(require,module,exports){
/*! picturefill - v3.0.2 - 2016-02-12
 * https://scottjehl.github.io/picturefill/
 * Copyright (c) 2016 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT
 */
!function (a) {
  var b = navigator.userAgent;a.HTMLPictureElement && /ecko/.test(b) && b.match(/rv\:(\d+)/) && RegExp.$1 < 45 && addEventListener("resize", function () {
    var b,
        c = document.createElement("source"),
        d = function (a) {
      var b,
          d,
          e = a.parentNode;"PICTURE" === e.nodeName.toUpperCase() ? (b = c.cloneNode(), e.insertBefore(b, e.firstElementChild), setTimeout(function () {
        e.removeChild(b);
      })) : (!a._pfLastSize || a.offsetWidth > a._pfLastSize) && (a._pfLastSize = a.offsetWidth, d = a.sizes, a.sizes += ",100vw", setTimeout(function () {
        a.sizes = d;
      }));
    },
        e = function () {
      var a,
          b = document.querySelectorAll("picture > img, img[srcset][sizes]");for (a = 0; a < b.length; a++) d(b[a]);
    },
        f = function () {
      clearTimeout(b), b = setTimeout(e, 99);
    },
        g = a.matchMedia && matchMedia("(orientation: landscape)"),
        h = function () {
      f(), g && g.addListener && g.addListener(f);
    };return c.srcset = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", /^[c|i]|d$/.test(document.readyState || "") ? h() : document.addEventListener("DOMContentLoaded", h), f;
  }());
}(window), function (a, b, c) {
  "use strict";
  function d(a) {
    return " " === a || "	" === a || "\n" === a || "\f" === a || "\r" === a;
  }function e(b, c) {
    var d = new a.Image();return d.onerror = function () {
      A[b] = !1, ba();
    }, d.onload = function () {
      A[b] = 1 === d.width, ba();
    }, d.src = c, "pending";
  }function f() {
    M = !1, P = a.devicePixelRatio, N = {}, O = {}, s.DPR = P || 1, Q.width = Math.max(a.innerWidth || 0, z.clientWidth), Q.height = Math.max(a.innerHeight || 0, z.clientHeight), Q.vw = Q.width / 100, Q.vh = Q.height / 100, r = [Q.height, Q.width, P].join("-"), Q.em = s.getEmValue(), Q.rem = Q.em;
  }function g(a, b, c, d) {
    var e, f, g, h;return "saveData" === B.algorithm ? a > 2.7 ? h = c + 1 : (f = b - c, e = Math.pow(a - .6, 1.5), g = f * e, d && (g += .1 * e), h = a + g) : h = c > 1 ? Math.sqrt(a * b) : a, h > c;
  }function h(a) {
    var b,
        c = s.getSet(a),
        d = !1;"pending" !== c && (d = r, c && (b = s.setRes(c), s.applySetCandidate(b, a))), a[s.ns].evaled = d;
  }function i(a, b) {
    return a.res - b.res;
  }function j(a, b, c) {
    var d;return !c && b && (c = a[s.ns].sets, c = c && c[c.length - 1]), d = k(b, c), d && (b = s.makeUrl(b), a[s.ns].curSrc = b, a[s.ns].curCan = d, d.res || aa(d, d.set.sizes)), d;
  }function k(a, b) {
    var c, d, e;if (a && b) for (e = s.parseSet(b), a = s.makeUrl(a), c = 0; c < e.length; c++) if (a === s.makeUrl(e[c].url)) {
      d = e[c];break;
    }return d;
  }function l(a, b) {
    var c,
        d,
        e,
        f,
        g = a.getElementsByTagName("source");for (c = 0, d = g.length; d > c; c++) e = g[c], e[s.ns] = !0, f = e.getAttribute("srcset"), f && b.push({ srcset: f, media: e.getAttribute("media"), type: e.getAttribute("type"), sizes: e.getAttribute("sizes") });
  }function m(a, b) {
    function c(b) {
      var c,
          d = b.exec(a.substring(m));return d ? (c = d[0], m += c.length, c) : void 0;
    }function e() {
      var a,
          c,
          d,
          e,
          f,
          i,
          j,
          k,
          l,
          m = !1,
          o = {};for (e = 0; e < h.length; e++) f = h[e], i = f[f.length - 1], j = f.substring(0, f.length - 1), k = parseInt(j, 10), l = parseFloat(j), X.test(j) && "w" === i ? ((a || c) && (m = !0), 0 === k ? m = !0 : a = k) : Y.test(j) && "x" === i ? ((a || c || d) && (m = !0), 0 > l ? m = !0 : c = l) : X.test(j) && "h" === i ? ((d || c) && (m = !0), 0 === k ? m = !0 : d = k) : m = !0;m || (o.url = g, a && (o.w = a), c && (o.d = c), d && (o.h = d), d || c || a || (o.d = 1), 1 === o.d && (b.has1x = !0), o.set = b, n.push(o));
    }function f() {
      for (c(T), i = "", j = "in descriptor";;) {
        if (k = a.charAt(m), "in descriptor" === j) {
          if (d(k)) i && (h.push(i), i = "", j = "after descriptor");else {
            if ("," === k) return m += 1, i && h.push(i), void e();if ("(" === k) i += k, j = "in parens";else {
              if ("" === k) return i && h.push(i), void e();i += k;
            }
          }
        } else if ("in parens" === j) {
          if (")" === k) i += k, j = "in descriptor";else {
            if ("" === k) return h.push(i), void e();i += k;
          }
        } else if ("after descriptor" === j) if (d(k)) ;else {
          if ("" === k) return void e();j = "in descriptor", m -= 1;
        }m += 1;
      }
    }for (var g, h, i, j, k, l = a.length, m = 0, n = [];;) {
      if (c(U), m >= l) return n;g = c(V), h = [], "," === g.slice(-1) ? (g = g.replace(W, ""), e()) : f();
    }
  }function n(a) {
    function b(a) {
      function b() {
        f && (g.push(f), f = "");
      }function c() {
        g[0] && (h.push(g), g = []);
      }for (var e, f = "", g = [], h = [], i = 0, j = 0, k = !1;;) {
        if (e = a.charAt(j), "" === e) return b(), c(), h;if (k) {
          if ("*" === e && "/" === a[j + 1]) {
            k = !1, j += 2, b();continue;
          }j += 1;
        } else {
          if (d(e)) {
            if (a.charAt(j - 1) && d(a.charAt(j - 1)) || !f) {
              j += 1;continue;
            }if (0 === i) {
              b(), j += 1;continue;
            }e = " ";
          } else if ("(" === e) i += 1;else if (")" === e) i -= 1;else {
            if ("," === e) {
              b(), c(), j += 1;continue;
            }if ("/" === e && "*" === a.charAt(j + 1)) {
              k = !0, j += 2;continue;
            }
          }f += e, j += 1;
        }
      }
    }function c(a) {
      return k.test(a) && parseFloat(a) >= 0 ? !0 : l.test(a) ? !0 : "0" === a || "-0" === a || "+0" === a ? !0 : !1;
    }var e,
        f,
        g,
        h,
        i,
        j,
        k = /^(?:[+-]?[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?(?:ch|cm|em|ex|in|mm|pc|pt|px|rem|vh|vmin|vmax|vw)$/i,
        l = /^calc\((?:[0-9a-z \.\+\-\*\/\(\)]+)\)$/i;for (f = b(a), g = f.length, e = 0; g > e; e++) if (h = f[e], i = h[h.length - 1], c(i)) {
      if (j = i, h.pop(), 0 === h.length) return j;if (h = h.join(" "), s.matchesMedia(h)) return j;
    }return "100vw";
  }b.createElement("picture");var o,
      p,
      q,
      r,
      s = {},
      t = !1,
      u = function () {},
      v = b.createElement("img"),
      w = v.getAttribute,
      x = v.setAttribute,
      y = v.removeAttribute,
      z = b.documentElement,
      A = {},
      B = { algorithm: "" },
      C = "data-pfsrc",
      D = C + "set",
      E = navigator.userAgent,
      F = /rident/.test(E) || /ecko/.test(E) && E.match(/rv\:(\d+)/) && RegExp.$1 > 35,
      G = "currentSrc",
      H = /\s+\+?\d+(e\d+)?w/,
      I = /(\([^)]+\))?\s*(.+)/,
      J = a.picturefillCFG,
      K = "position:absolute;left:0;visibility:hidden;display:block;padding:0;border:none;font-size:1em;width:1em;overflow:hidden;clip:rect(0px, 0px, 0px, 0px)",
      L = "font-size:100%!important;",
      M = !0,
      N = {},
      O = {},
      P = a.devicePixelRatio,
      Q = { px: 1, "in": 96 },
      R = b.createElement("a"),
      S = !1,
      T = /^[ \t\n\r\u000c]+/,
      U = /^[, \t\n\r\u000c]+/,
      V = /^[^ \t\n\r\u000c]+/,
      W = /[,]+$/,
      X = /^\d+$/,
      Y = /^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/,
      Z = function (a, b, c, d) {
    a.addEventListener ? a.addEventListener(b, c, d || !1) : a.attachEvent && a.attachEvent("on" + b, c);
  },
      $ = function (a) {
    var b = {};return function (c) {
      return c in b || (b[c] = a(c)), b[c];
    };
  },
      _ = function () {
    var a = /^([\d\.]+)(em|vw|px)$/,
        b = function () {
      for (var a = arguments, b = 0, c = a[0]; ++b in a;) c = c.replace(a[b], a[++b]);return c;
    },
        c = $(function (a) {
      return "return " + b((a || "").toLowerCase(), /\band\b/g, "&&", /,/g, "||", /min-([a-z-\s]+):/g, "e.$1>=", /max-([a-z-\s]+):/g, "e.$1<=", /calc([^)]+)/g, "($1)", /(\d+[\.]*[\d]*)([a-z]+)/g, "($1 * e.$2)", /^(?!(e.[a-z]|[0-9\.&=|><\+\-\*\(\)\/])).*/gi, "") + ";";
    });return function (b, d) {
      var e;if (!(b in N)) if (N[b] = !1, d && (e = b.match(a))) N[b] = e[1] * Q[e[2]];else try {
        N[b] = new Function("e", c(b))(Q);
      } catch (f) {}return N[b];
    };
  }(),
      aa = function (a, b) {
    return a.w ? (a.cWidth = s.calcListLength(b || "100vw"), a.res = a.w / a.cWidth) : a.res = a.d, a;
  },
      ba = function (a) {
    if (t) {
      var c,
          d,
          e,
          f = a || {};if (f.elements && 1 === f.elements.nodeType && ("IMG" === f.elements.nodeName.toUpperCase() ? f.elements = [f.elements] : (f.context = f.elements, f.elements = null)), c = f.elements || s.qsa(f.context || b, f.reevaluate || f.reselect ? s.sel : s.selShort), e = c.length) {
        for (s.setupRun(f), S = !0, d = 0; e > d; d++) s.fillImg(c[d], f);s.teardownRun(f);
      }
    }
  };o = a.console && console.warn ? function (a) {
    console.warn(a);
  } : u, G in v || (G = "src"), A["image/jpeg"] = !0, A["image/gif"] = !0, A["image/png"] = !0, A["image/svg+xml"] = b.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1"), s.ns = ("pf" + new Date().getTime()).substr(0, 9), s.supSrcset = "srcset" in v, s.supSizes = "sizes" in v, s.supPicture = !!a.HTMLPictureElement, s.supSrcset && s.supPicture && !s.supSizes && !function (a) {
    v.srcset = "data:,a", a.src = "data:,a", s.supSrcset = v.complete === a.complete, s.supPicture = s.supSrcset && s.supPicture;
  }(b.createElement("img")), s.supSrcset && !s.supSizes ? !function () {
    var a = "data:image/gif;base64,R0lGODlhAgABAPAAAP///wAAACH5BAAAAAAALAAAAAACAAEAAAICBAoAOw==",
        c = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",
        d = b.createElement("img"),
        e = function () {
      var a = d.width;2 === a && (s.supSizes = !0), q = s.supSrcset && !s.supSizes, t = !0, setTimeout(ba);
    };d.onload = e, d.onerror = e, d.setAttribute("sizes", "9px"), d.srcset = c + " 1w," + a + " 9w", d.src = c;
  }() : t = !0, s.selShort = "picture>img,img[srcset]", s.sel = s.selShort, s.cfg = B, s.DPR = P || 1, s.u = Q, s.types = A, s.setSize = u, s.makeUrl = $(function (a) {
    return R.href = a, R.href;
  }), s.qsa = function (a, b) {
    return "querySelector" in a ? a.querySelectorAll(b) : [];
  }, s.matchesMedia = function () {
    return a.matchMedia && (matchMedia("(min-width: 0.1em)") || {}).matches ? s.matchesMedia = function (a) {
      return !a || matchMedia(a).matches;
    } : s.matchesMedia = s.mMQ, s.matchesMedia.apply(this, arguments);
  }, s.mMQ = function (a) {
    return a ? _(a) : !0;
  }, s.calcLength = function (a) {
    var b = _(a, !0) || !1;return 0 > b && (b = !1), b;
  }, s.supportsType = function (a) {
    return a ? A[a] : !0;
  }, s.parseSize = $(function (a) {
    var b = (a || "").match(I);return { media: b && b[1], length: b && b[2] };
  }), s.parseSet = function (a) {
    return a.cands || (a.cands = m(a.srcset, a)), a.cands;
  }, s.getEmValue = function () {
    var a;if (!p && (a = b.body)) {
      var c = b.createElement("div"),
          d = z.style.cssText,
          e = a.style.cssText;c.style.cssText = K, z.style.cssText = L, a.style.cssText = L, a.appendChild(c), p = c.offsetWidth, a.removeChild(c), p = parseFloat(p, 10), z.style.cssText = d, a.style.cssText = e;
    }return p || 16;
  }, s.calcListLength = function (a) {
    if (!(a in O) || B.uT) {
      var b = s.calcLength(n(a));O[a] = b ? b : Q.width;
    }return O[a];
  }, s.setRes = function (a) {
    var b;if (a) {
      b = s.parseSet(a);for (var c = 0, d = b.length; d > c; c++) aa(b[c], a.sizes);
    }return b;
  }, s.setRes.res = aa, s.applySetCandidate = function (a, b) {
    if (a.length) {
      var c,
          d,
          e,
          f,
          h,
          k,
          l,
          m,
          n,
          o = b[s.ns],
          p = s.DPR;if (k = o.curSrc || b[G], l = o.curCan || j(b, k, a[0].set), l && l.set === a[0].set && (n = F && !b.complete && l.res - .1 > p, n || (l.cached = !0, l.res >= p && (h = l))), !h) for (a.sort(i), f = a.length, h = a[f - 1], d = 0; f > d; d++) if (c = a[d], c.res >= p) {
        e = d - 1, h = a[e] && (n || k !== s.makeUrl(c.url)) && g(a[e].res, c.res, p, a[e].cached) ? a[e] : c;break;
      }h && (m = s.makeUrl(h.url), o.curSrc = m, o.curCan = h, m !== k && s.setSrc(b, h), s.setSize(b));
    }
  }, s.setSrc = function (a, b) {
    var c;a.src = b.url, "image/svg+xml" === b.set.type && (c = a.style.width, a.style.width = a.offsetWidth + 1 + "px", a.offsetWidth + 1 && (a.style.width = c));
  }, s.getSet = function (a) {
    var b,
        c,
        d,
        e = !1,
        f = a[s.ns].sets;for (b = 0; b < f.length && !e; b++) if (c = f[b], c.srcset && s.matchesMedia(c.media) && (d = s.supportsType(c.type))) {
      "pending" === d && (c = d), e = c;break;
    }return e;
  }, s.parseSets = function (a, b, d) {
    var e,
        f,
        g,
        h,
        i = b && "PICTURE" === b.nodeName.toUpperCase(),
        j = a[s.ns];(j.src === c || d.src) && (j.src = w.call(a, "src"), j.src ? x.call(a, C, j.src) : y.call(a, C)), (j.srcset === c || d.srcset || !s.supSrcset || a.srcset) && (e = w.call(a, "srcset"), j.srcset = e, h = !0), j.sets = [], i && (j.pic = !0, l(b, j.sets)), j.srcset ? (f = { srcset: j.srcset, sizes: w.call(a, "sizes") }, j.sets.push(f), g = (q || j.src) && H.test(j.srcset || ""), g || !j.src || k(j.src, f) || f.has1x || (f.srcset += ", " + j.src, f.cands.push({ url: j.src, d: 1, set: f }))) : j.src && j.sets.push({ srcset: j.src, sizes: null }), j.curCan = null, j.curSrc = c, j.supported = !(i || f && !s.supSrcset || g && !s.supSizes), h && s.supSrcset && !j.supported && (e ? (x.call(a, D, e), a.srcset = "") : y.call(a, D)), j.supported && !j.srcset && (!j.src && a.src || a.src !== s.makeUrl(j.src)) && (null === j.src ? a.removeAttribute("src") : a.src = j.src), j.parsed = !0;
  }, s.fillImg = function (a, b) {
    var c,
        d = b.reselect || b.reevaluate;a[s.ns] || (a[s.ns] = {}), c = a[s.ns], (d || c.evaled !== r) && ((!c.parsed || b.reevaluate) && s.parseSets(a, a.parentNode, b), c.supported ? c.evaled = r : h(a));
  }, s.setupRun = function () {
    (!S || M || P !== a.devicePixelRatio) && f();
  }, s.supPicture ? (ba = u, s.fillImg = u) : !function () {
    var c,
        d = a.attachEvent ? /d$|^c/ : /d$|^c|^i/,
        e = function () {
      var a = b.readyState || "";f = setTimeout(e, "loading" === a ? 200 : 999), b.body && (s.fillImgs(), c = c || d.test(a), c && clearTimeout(f));
    },
        f = setTimeout(e, b.body ? 9 : 99),
        g = function (a, b) {
      var c,
          d,
          e = function () {
        var f = new Date() - d;b > f ? c = setTimeout(e, b - f) : (c = null, a());
      };return function () {
        d = new Date(), c || (c = setTimeout(e, b));
      };
    },
        h = z.clientHeight,
        i = function () {
      M = Math.max(a.innerWidth || 0, z.clientWidth) !== Q.width || z.clientHeight !== h, h = z.clientHeight, M && s.fillImgs();
    };Z(a, "resize", g(i, 99)), Z(b, "readystatechange", e);
  }(), s.picturefill = ba, s.fillImgs = ba, s.teardownRun = u, ba._ = s, a.picturefillCFG = { pf: s, push: function (a) {
      var b = a.shift();"function" == typeof s[b] ? s[b].apply(s, a) : (B[b] = a[0], S && s.fillImgs({ reselect: !0 }));
    } };for (; J && J.length;) a.picturefillCFG.push(J.shift());a.picturefill = ba, "object" == typeof module && "object" == typeof module.exports ? module.exports = ba : "function" == typeof define && define.amd && define("picturefill", function () {
    return ba;
  }), s.supPicture || (A["image/webp"] = e("image/webp", "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA=="));
}(window, document);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/accordion.min.js":[function(require,module,exports){
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var i;window.UIkit && (i = t(UIkit)), "function" == typeof define && define.amd && define("uikit-accordion", ["uikit"], function () {
    return i || t(UIkit);
  });
}(function (t) {
  "use strict";
  function i(i) {
    var o = t.$(i),
        e = "auto";if (o.is(":visible")) e = o.outerHeight();else {
      var a = { position: o.css("position"), visibility: o.css("visibility"), display: o.css("display") };e = o.css({ position: "absolute", visibility: "hidden", display: "block" }).outerHeight(), o.css(a);
    }return e;
  }return t.component("accordion", { defaults: { showfirst: !0, collapse: !0, animate: !0, easing: "swing", duration: 300, toggle: ".uk-accordion-title", containers: ".uk-accordion-content", clsactive: "uk-active" }, boot: function () {
      t.ready(function (i) {
        setTimeout(function () {
          t.$("[data-uk-accordion]", i).each(function () {
            var i = t.$(this);i.data("accordion") || t.accordion(i, t.Utils.options(i.attr("data-uk-accordion")));
          });
        }, 0);
      });
    }, init: function () {
      var i = this;this.element.on("click.uk.accordion", this.options.toggle, function (o) {
        o.preventDefault(), i.toggleItem(t.$(this).data("wrapper"), i.options.animate, i.options.collapse);
      }), this.update(), this.options.showfirst && this.toggleItem(this.toggle.eq(0).data("wrapper"), !1, !1);
    }, toggleItem: function (o, e, a) {
      var n = this;o.data("toggle").toggleClass(this.options.clsactive), o.data("content").toggleClass(this.options.clsactive);var s = o.data("toggle").hasClass(this.options.clsactive);a && (this.toggle.not(o.data("toggle")).removeClass(this.options.clsactive), this.content.not(o.data("content")).removeClass(this.options.clsactive).parent().stop().css("overflow", "hidden").animate({ height: 0 }, { easing: this.options.easing, duration: e ? this.options.duration : 0 }).attr("aria-expanded", "false")), o.stop().css("overflow", "hidden"), e ? o.animate({ height: s ? i(o.data("content")) : 0 }, { easing: this.options.easing, duration: this.options.duration, complete: function () {
          s && (o.css({ overflow: "", height: "auto" }), t.Utils.checkDisplay(o.data("content"))), n.trigger("display.uk.check");
        } }) : (o.height(s ? "auto" : 0), s && (o.css({ overflow: "" }), t.Utils.checkDisplay(o.data("content"))), this.trigger("display.uk.check")), o.attr("aria-expanded", s), this.element.trigger("toggle.uk.accordion", [s, o.data("toggle"), o.data("content")]);
    }, update: function () {
      var i,
          o,
          e,
          a = this;this.toggle = this.find(this.options.toggle), this.content = this.find(this.options.containers), this.content.each(function (n) {
        i = t.$(this), i.parent().data("wrapper") ? o = i.parent() : (o = t.$(this).wrap('<div data-wrapper="true" style="overflow:hidden;height:0;position:relative;"></div>').parent(), o.attr("aria-expanded", "false")), e = a.toggle.eq(n), o.data("toggle", e), o.data("content", i), e.data("wrapper", o), i.data("wrapper", o);
      }), this.element.trigger("update.uk.accordion", [this]);
    } }), t.accordion;
});

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/lightbox.min.js":[function(require,module,exports){
/*! UIkit 2.27.4 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (i) {
  var t;window.UIkit2 && (t = i(UIkit2)), "function" == typeof define && define.amd && define("uikit-lightbox", ["uikit"], function () {
    return t || i(UIkit2);
  });
}(function (i) {
  "use strict";
  function t(t) {
    if (e) return e.lightbox = t, e;e = i.$(['<div class="uk-modal">', '<div class="uk-modal-dialog uk-modal-dialog-lightbox uk-slidenav-position" style="margin-left:auto;margin-right:auto;width:200px;height:200px;top:' + Math.abs(window.innerHeight / 2 - 200) + 'px;">', '<a href="#" class="uk-modal-close uk-close uk-close-alt"></a>', '<div class="uk-lightbox-content"></div>', '<div class="uk-modal-spinner uk-hidden"></div>', "</div>", "</div>"].join("")).appendTo("body"), e.dialog = e.find(".uk-modal-dialog:first"), e.content = e.find(".uk-lightbox-content:first"), e.loader = e.find(".uk-modal-spinner:first"), e.closer = e.find(".uk-close.uk-close-alt"), e.modal = i.modal(e, { modal: !1 }), e.on("swipeRight swipeLeft", function (i) {
      e.lightbox["swipeLeft" == i.type ? "next" : "previous"]();
    }).on("click", "[data-lightbox-previous], [data-lightbox-next]", function (t) {
      t.preventDefault(), e.lightbox[i.$(this).is("[data-lightbox-next]") ? "next" : "previous"]();
    }), e.on("hide.uk.modal", function () {
      e.content.html("");
    });var o = { w: window.innerWidth, h: window.innerHeight };return i.$win.on("load resize orientationchange", i.Utils.debounce(function () {
      o.w !== window.innerWidth && e.is(":visible") && !i.Utils.isFullscreen() && e.lightbox.fitSize(), o = { w: window.innerWidth, h: window.innerHeight };
    }, 100)), e.lightbox = t, e;
  }var e,
      o = {};return i.component("lightbox", { defaults: { allowfullscreen: !0, duration: 400, group: !1, keyboard: !0 }, index: 0, items: !1, boot: function () {
      i.$html.on("click", "[data-uk-lightbox]", function (t) {
        t.preventDefault();var e = i.$(this);e.data("lightbox") || i.lightbox(e, i.Utils.options(e.attr("data-uk-lightbox"))), e.data("lightbox").show(e);
      }), i.$doc.on("keyup", function (i) {
        if (e && e.is(":visible") && e.lightbox.options.keyboard) switch (i.preventDefault(), i.keyCode) {case 37:
            e.lightbox.previous();break;case 39:
            e.lightbox.next();}
      });
    }, init: function () {
      var t = [];if (this.index = 0, this.siblings = [], this.element && this.element.length) {
        var e = this.options.group ? i.$('[data-uk-lightbox*="' + this.options.group + '"]') : this.element;e.each(function () {
          var e = i.$(this);t.push({ source: e.attr("href"), title: e.attr("data-title") || e.attr("title"), type: e.attr("data-lightbox-type") || "auto", link: e });
        }), this.index = e.index(this.element), this.siblings = t;
      } else this.options.group && this.options.group.length && (this.siblings = this.options.group);this.trigger("lightbox-init", [this]);
    }, show: function (e) {
      this.modal = t(this), this.modal.dialog.stop(), this.modal.content.stop();var o,
          n,
          s = this,
          h = i.$.Deferred();e = e || 0, "object" == typeof e && this.siblings.forEach(function (i, t) {
        e[0] === i.link[0] && (e = t);
      }), 0 > e ? e = this.siblings.length - e : this.siblings[e] || (e = 0), n = this.siblings[e], o = { lightbox: s, source: n.source, type: n.type, index: e, promise: h, title: n.title, item: n, meta: { content: "", width: null, height: null } }, this.index = e, this.modal.content.empty(), this.modal.is(":visible") || (this.modal.content.css({ width: "", height: "" }).empty(), this.modal.modal.show()), this.modal.loader.removeClass("uk-hidden"), h.promise().done(function () {
        s.data = o, s.fitSize(o);
      }).fail(function () {
        o.meta.content = '<div class="uk-position-cover uk-flex uk-flex-middle uk-flex-center"><strong>Loading resource failed!</strong></div>', o.meta.width = 400, o.meta.height = 300, s.data = o, s.fitSize(o);
      }), s.trigger("showitem.uk.lightbox", [o]);
    }, fitSize: function () {
      var t = this,
          e = this.data,
          o = this.modal.dialog.outerWidth() - this.modal.dialog.width(),
          n = parseInt(this.modal.dialog.css("margin-top"), 10),
          s = parseInt(this.modal.dialog.css("margin-bottom"), 10),
          h = n + s,
          a = e.meta.content,
          l = t.options.duration;this.siblings.length > 1 && (a = [a, '<a href="#" class="uk-slidenav uk-slidenav-contrast uk-slidenav-previous uk-hidden-touch" data-lightbox-previous></a>', '<a href="#" class="uk-slidenav uk-slidenav-contrast uk-slidenav-next uk-hidden-touch" data-lightbox-next></a>'].join(""));var d,
          r,
          u = i.$("<div>&nbsp;</div>").css({ opacity: 0, position: "absolute", top: 0, left: 0, width: "100%", maxWidth: t.modal.dialog.css("max-width"), padding: t.modal.dialog.css("padding"), margin: t.modal.dialog.css("margin") }),
          c = e.meta.width,
          g = e.meta.height;u.appendTo("body").width(), d = u.width(), r = window.innerHeight - h, u.remove(), this.modal.dialog.find(".uk-modal-caption").remove(), e.title && (this.modal.dialog.append('<div class="uk-modal-caption">' + e.title + "</div>"), r -= this.modal.dialog.find(".uk-modal-caption").outerHeight()), d < e.meta.width && (g = Math.floor(g * (d / c)), c = d), g > r && (g = Math.floor(r), c = Math.ceil(e.meta.width * (r / e.meta.height))), this.modal.content.css("opacity", 0).width(c).html(a), "iframe" == e.type && this.modal.content.find("iframe:first").height(g);var m = g + o,
          p = Math.floor(window.innerHeight / 2 - m / 2) - h;0 > p && (p = 0), this.modal.closer.addClass("uk-hidden"), t.modal.data("mwidth") == c && t.modal.data("mheight") == g && (l = 0), this.modal.dialog.animate({ width: c + o, height: g + o, top: p }, l, "swing", function () {
        t.modal.loader.addClass("uk-hidden"), t.modal.content.css({ width: "" }).animate({ opacity: 1 }, function () {
          t.modal.closer.removeClass("uk-hidden");
        }), t.modal.data({ mwidth: c, mheight: g });
      });
    }, next: function () {
      this.show(this.siblings[this.index + 1] ? this.index + 1 : 0);
    }, previous: function () {
      this.show(this.siblings[this.index - 1] ? this.index - 1 : this.siblings.length - 1);
    } }), i.plugin("lightbox", "image", { init: function (i) {
      i.on("showitem.uk.lightbox", function (i, t) {
        if ("image" == t.type || t.source && t.source.match(/\.(jpg|jpeg|png|gif|svg)$/i)) {
          var e = function (i, e, o) {
            t.meta = { content: '<img class="uk-responsive-width" width="' + e + '" height="' + o + '" src ="' + i + '">', width: e, height: o }, t.type = "image", t.promise.resolve();
          };if (o[t.source]) e(t.source, o[t.source].width, o[t.source].height);else {
            var n = new Image();n.onerror = function () {
              t.promise.reject("Loading image failed");
            }, n.onload = function () {
              o[t.source] = { width: n.width, height: n.height }, e(t.source, o[t.source].width, o[t.source].height);
            }, n.src = t.source;
          }
        }
      });
    } }), i.plugin("lightbox", "youtube", { init: function (i) {
      var t = /(\/\/.*?youtube\.[a-z]+)\/watch\?v=([^&]+)&?(.*)/,
          n = /youtu\.be\/(.*)/;i.on("showitem.uk.lightbox", function (i, s) {
        var h,
            a,
            l = function (i, t, o) {
          s.meta = { content: '<iframe src="//www.youtube.com/embed/' + i + '" width="' + t + '" height="' + o + '" style="max-width:100%;"' + (e.lightbox.options.allowfullscreen ? " allowfullscreen" : "") + "></iframe>", width: t, height: o }, s.type = "iframe", s.promise.resolve();
        };if ((a = s.source.match(t)) && (h = a[2]), (a = s.source.match(n)) && (h = a[1]), h) {
          if (o[h]) l(h, o[h].width, o[h].height);else {
            var d = new Image(),
                r = !1;d.onerror = function () {
              o[h] = { width: 640, height: 320 }, l(h, o[h].width, o[h].height);
            }, d.onload = function () {
              120 == d.width && 90 == d.height ? r ? (o[h] = { width: 640, height: 320 }, l(h, o[h].width, o[h].height)) : (r = !0, d.src = "//img.youtube.com/vi/" + h + "/0.jpg") : (o[h] = { width: d.width, height: d.height }, l(h, d.width, d.height));
            }, d.src = "//img.youtube.com/vi/" + h + "/maxresdefault.jpg";
          }i.stopImmediatePropagation();
        }
      });
    } }), i.plugin("lightbox", "vimeo", { init: function (t) {
      var n,
          s = /(\/\/.*?)vimeo\.[a-z]+\/([0-9]+).*?/;t.on("showitem.uk.lightbox", function (t, h) {
        var a,
            l = function (i, t, o) {
          h.meta = { content: '<iframe src="//player.vimeo.com/video/' + i + '" width="' + t + '" height="' + o + '" style="width:100%;box-sizing:border-box;"' + (e.lightbox.options.allowfullscreen ? " allowfullscreen" : "") + "></iframe>", width: t, height: o }, h.type = "iframe", h.promise.resolve();
        };(n = h.source.match(s)) && (a = n[2], o[a] ? l(a, o[a].width, o[a].height) : i.$.ajax({ type: "GET", url: "//vimeo.com/api/oembed.json?url=" + encodeURI(h.source), jsonp: "callback", dataType: "jsonp", success: function (i) {
            o[a] = { width: i.width, height: i.height }, l(a, o[a].width, o[a].height);
          } }), t.stopImmediatePropagation());
      });
    } }), i.plugin("lightbox", "video", { init: function (t) {
      t.on("showitem.uk.lightbox", function (t, e) {
        var n = function (i, t, o) {
          e.meta = { content: '<video class="uk-responsive-width" src="' + i + '" width="' + t + '" height="' + o + '" controls></video>', width: t, height: o }, e.type = "video", e.promise.resolve();
        };if ("video" == e.type || e.source.match(/\.(mp4|webm|ogv)$/i)) if (o[e.source]) n(e.source, o[e.source].width, o[e.source].height);else var s = i.$('<video style="position:fixed;visibility:hidden;top:-10000px;"></video>').attr("src", e.source).appendTo("body"),
            h = setInterval(function () {
          s[0].videoWidth && (clearInterval(h), o[e.source] = { width: s[0].videoWidth, height: s[0].videoHeight }, n(e.source, o[e.source].width, o[e.source].height), s.remove());
        }, 20);
      });
    } }), i.plugin("lightbox", "iframe", { init: function (i) {
      i.on("showitem.uk.lightbox", function (t, o) {
        var n = function (i, t, n) {
          o.meta = { content: '<iframe class="uk-responsive-width" src="' + i + '" width="' + t + '" height="' + n + '"' + (e.lightbox.options.allowfullscreen ? " allowfullscreen" : "") + "></iframe>", width: t, height: n }, o.type = "iframe", o.promise.resolve();
        };("iframe" === o.type || o.source.match(/\.(html|php)$/)) && n(o.source, i.options.width || 800, i.options.height || 600);
      });
    } }), i.lightbox.create = function (t, e) {
    if (t) {
      var o,
          n = [];return t.forEach(function (t) {
        n.push(i.$.extend({ source: "", title: "", type: "auto", link: !1 }, "string" == typeof t ? { source: t } : t));
      }), o = i.lightbox(i.$.extend({}, e, { group: n }));
    }
  }, i.lightbox;
});

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/modal.min.js":[function(require,module,exports){
/*! UIkit 2.27.4 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  "use strict";
  function i(i, e) {
    return e ? ("object" == typeof i ? (i = i instanceof jQuery ? i : t.$(i), i.parent().length && (e.persist = i, e.persist.data("modalPersistParent", i.parent()))) : i = "string" == typeof i || "number" == typeof i ? t.$("<div></div>").html(i) : t.$("<div></div>").html("UIkit2.modal Error: Unsupported data type: " + typeof i), i.appendTo(e.element.find(".uk-modal-dialog")), e) : void 0;
  }var e,
      o = !1,
      n = 0,
      s = t.$html;t.$win.on("resize orientationchange", t.Utils.debounce(function () {
    t.$(".uk-modal.uk-open").each(function () {
      return t.$(this).data("modal") && t.$(this).data("modal").resize();
    });
  }, 150)), t.component("modal", { defaults: { keyboard: !0, bgclose: !0, minScrollHeight: 150, center: !1, modal: !0 }, scrollable: !1, transition: !1, hasTransitioned: !0, init: function () {
      if (e || (e = t.$("body")), this.element.length) {
        var i = this;this.paddingdir = "padding-" + ("left" == t.langdirection ? "right" : "left"), this.dialog = this.find(".uk-modal-dialog"), this.active = !1, this.element.attr("aria-hidden", this.element.hasClass("uk-open")), this.on("click", ".uk-modal-close", function (t) {
          t.preventDefault(), i.hide();
        }).on("click", function (e) {
          var o = t.$(e.target);o[0] == i.element[0] && i.options.bgclose && i.hide();
        }), t.domObserve(this.element, function () {
          i.resize();
        });
      }
    }, toggle: function () {
      return this[this.isActive() ? "hide" : "show"]();
    }, show: function () {
      if (this.element.length) {
        var i = this;if (!this.isActive()) return this.options.modal && o && o.hide(!0), this.element.removeClass("uk-open").show(), this.resize(!0), this.options.modal && (o = this), this.active = !0, n++, t.support.transition ? (this.hasTransitioned = !1, this.element.one(t.support.transition.end, function () {
          i.hasTransitioned = !0, t.Utils.focus(i.dialog, "a[href]");
        }).addClass("uk-open")) : (this.element.addClass("uk-open"), t.Utils.focus(this.dialog, "a[href]")), s.addClass("uk-modal-page").height(), this.element.attr("aria-hidden", "false"), this.element.trigger("show.uk.modal"), t.Utils.checkDisplay(this.dialog, !0), this;
      }
    }, hide: function (i) {
      if (!i && t.support.transition && this.hasTransitioned) {
        var e = this;this.one(t.support.transition.end, function () {
          e._hide();
        }).removeClass("uk-open");
      } else this._hide();return this;
    }, resize: function (t) {
      if (this.isActive() || t) {
        var i = e.width();if (this.scrollbarwidth = window.innerWidth - i, e.css(this.paddingdir, this.scrollbarwidth), this.element.css("overflow-y", this.scrollbarwidth ? "scroll" : "auto"), !this.updateScrollable() && this.options.center) {
          var o = this.dialog.outerHeight(),
              n = parseInt(this.dialog.css("margin-top"), 10) + parseInt(this.dialog.css("margin-bottom"), 10);o + n < window.innerHeight ? this.dialog.css({ top: window.innerHeight / 2 - o / 2 - n }) : this.dialog.css({ top: "" });
        }
      }
    }, updateScrollable: function () {
      var t = this.dialog.find(".uk-overflow-container:visible:first");if (t.length) {
        t.css("height", 0);var i = Math.abs(parseInt(this.dialog.css("margin-top"), 10)),
            e = this.dialog.outerHeight(),
            o = window.innerHeight,
            n = o - 2 * (20 > i ? 20 : i) - e;return t.css({ maxHeight: n < this.options.minScrollHeight ? "" : n, height: "" }), !0;
      }return !1;
    }, _hide: function () {
      this.active = !1, n > 0 ? n-- : n = 0, this.element.hide().removeClass("uk-open"), this.element.attr("aria-hidden", "true"), n || (s.removeClass("uk-modal-page"), e.css(this.paddingdir, "")), o === this && (o = !1), this.trigger("hide.uk.modal");
    }, isActive: function () {
      return this.element.hasClass("uk-open");
    } }), t.component("modalTrigger", { boot: function () {
      t.$html.on("click.modal.uikit", "[data-uk-modal]", function (i) {
        var e = t.$(this);if (e.is("a") && i.preventDefault(), !e.data("modalTrigger")) {
          var o = t.modalTrigger(e, t.Utils.options(e.attr("data-uk-modal")));o.show();
        }
      }), t.$html.on("keydown.modal.uikit", function (t) {
        o && 27 === t.keyCode && o.options.keyboard && (t.preventDefault(), o.hide());
      });
    }, init: function () {
      var i = this;this.options = t.$.extend({ target: i.element.is("a") ? i.element.attr("href") : !1 }, this.options), this.modal = t.modal(this.options.target, this.options), this.on("click", function (t) {
        t.preventDefault(), i.show();
      }), this.proxy(this.modal, "show hide isActive");
    } }), t.modal.dialog = function (e, o) {
    var n = t.modal(t.$(t.modal.dialog.template).appendTo("body"), o);return n.on("hide.uk.modal", function () {
      n.persist && (n.persist.appendTo(n.persist.data("modalPersistParent")), n.persist = !1), n.element.remove();
    }), i(e, n), n;
  }, t.modal.dialog.template = '<div class="uk-modal"><div class="uk-modal-dialog" style="min-height:0;"></div></div>', t.modal.alert = function (i, e) {
    e = t.$.extend(!0, { bgclose: !1, keyboard: !1, modal: !1, labels: t.modal.labels }, e);var o = t.modal.dialog(['<div class="uk-margin uk-modal-content">' + String(i) + "</div>", '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-button-primary uk-modal-close">' + e.labels.Ok + "</button></div>"].join(""), e);return o.on("show.uk.modal", function () {
      setTimeout(function () {
        o.element.find("button:first").focus();
      }, 50);
    }), o.show();
  }, t.modal.confirm = function (i, e, o) {
    var n = arguments.length > 1 && arguments[arguments.length - 1] ? arguments[arguments.length - 1] : {};e = t.$.isFunction(e) ? e : function () {}, o = t.$.isFunction(o) ? o : function () {}, n = t.$.extend(!0, { bgclose: !1, keyboard: !1, modal: !1, labels: t.modal.labels }, t.$.isFunction(n) ? {} : n);var s = t.modal.dialog(['<div class="uk-margin uk-modal-content">' + String(i) + "</div>", '<div class="uk-modal-footer uk-text-right"><button class="uk-button js-modal-confirm-cancel">' + n.labels.Cancel + '</button> <button class="uk-button uk-button-primary js-modal-confirm">' + n.labels.Ok + "</button></div>"].join(""), n);return s.element.find(".js-modal-confirm, .js-modal-confirm-cancel").on("click", function () {
      t.$(this).is(".js-modal-confirm") ? e() : o(), s.hide();
    }), s.on("show.uk.modal", function () {
      setTimeout(function () {
        s.element.find(".js-modal-confirm").focus();
      }, 50);
    }), s.show();
  }, t.modal.prompt = function (i, e, o, n) {
    o = t.$.isFunction(o) ? o : function () {}, n = t.$.extend(!0, { bgclose: !1, keyboard: !1, modal: !1, labels: t.modal.labels }, n);var s = t.modal.dialog([i ? '<div class="uk-modal-content uk-form">' + String(i) + "</div>" : "", '<div class="uk-margin-small-top uk-modal-content uk-form"><p><input type="text" class="uk-width-1-1"></p></div>', '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-modal-close">' + n.labels.Cancel + '</button> <button class="uk-button uk-button-primary js-modal-ok">' + n.labels.Ok + "</button></div>"].join(""), n),
        a = s.element.find("input[type='text']").val(e || "").on("keyup", function (t) {
      13 == t.keyCode && s.element.find(".js-modal-ok").trigger("click");
    });return s.element.find(".js-modal-ok").on("click", function () {
      o(a.val()) !== !1 && s.hide();
    }), s.show();
  }, t.modal.blockUI = function (i, e) {
    var o = t.modal.dialog(['<div class="uk-margin uk-modal-content">' + String(i || '<div class="uk-text-center">...</div>') + "</div>"].join(""), t.$.extend({ bgclose: !1, keyboard: !1, modal: !1 }, e));return o.content = o.element.find(".uk-modal-content:first"), o.show();
  }, t.modal.labels = { Ok: "Ok", Cancel: "Cancel" };
}(UIkit2);

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slider.min.js":[function(require,module,exports){
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var e;window.UIkit && (e = t(UIkit)), "function" == typeof define && define.amd && define("uikit-slider", ["uikit"], function () {
    return e || t(UIkit);
  });
}(function (t) {
  "use strict";
  var e,
      i,
      s,
      n,
      a = {};return t.component("slider", { defaults: { center: !1, threshold: 10, infinite: !0, autoplay: !1, autoplayInterval: 7e3, pauseOnHover: !0, activecls: "uk-active" }, boot: function () {
      t.ready(function (e) {
        setTimeout(function () {
          t.$("[data-uk-slider]", e).each(function () {
            var e = t.$(this);e.data("slider") || t.slider(e, t.Utils.options(e.attr("data-uk-slider")));
          });
        }, 0);
      });
    }, init: function () {
      var o = this;this.container = this.element.find(".uk-slider"), this.focus = 0, t.$win.on("resize load", t.Utils.debounce(function () {
        o.resize(!0);
      }, 100)), this.on("click.uk.slider", "[data-uk-slider-item]", function (e) {
        e.preventDefault();var i = t.$(this).attr("data-uk-slider-item");if (o.focus != i) switch (o.stop(), i) {case "next":case "previous":
            o["next" == i ? "next" : "previous"]();break;default:
            o.updateFocus(parseInt(i, 10));}
      }), this.container.on({ "touchstart mousedown": function (h) {
          h.originalEvent && h.originalEvent.touches && (h = h.originalEvent.touches[0]), h.button && 2 == h.button || !o.active || (o.stop(), s = t.$(h.target).is("a") ? t.$(h.target) : t.$(h.target).parents("a:first"), n = !1, s.length && s.one("click", function (t) {
            n && t.preventDefault();
          }), i = function (t) {
            n = !0, e = o, a = { touchx: parseInt(t.pageX, 10), dir: 1, focus: o.focus, base: o.options.center ? "center" : "area" }, t.originalEvent && t.originalEvent.touches && (t = t.originalEvent.touches[0]), e.element.data({ "pointer-start": { x: parseInt(t.pageX, 10), y: parseInt(t.pageY, 10) }, "pointer-pos-start": o.pos }), o.container.addClass("uk-drag"), i = !1;
          }, i.x = parseInt(h.pageX, 10), i.threshold = o.options.threshold);
        }, mouseenter: function () {
          o.options.pauseOnHover && (o.hovering = !0);
        }, mouseleave: function () {
          o.hovering = !1;
        } }), this.resize(!0), this.on("display.uk.check", function () {
        o.element.is(":visible") && o.resize(!0);
      }), this.element.find("a,img").attr("draggable", "false"), this.options.autoplay && this.start();
    }, resize: function (e) {
      var i,
          s,
          n,
          a,
          o = this,
          h = 0,
          r = 0;return this.items = this.container.children().filter(":visible"), this.vp = this.element[0].getBoundingClientRect().width, this.container.css({ "min-width": "", "min-height": "" }), this.items.each(function (e) {
        i = t.$(this), a = i.css({ left: "", width: "" })[0].getBoundingClientRect(), s = a.width, n = i.width(), r = Math.max(r, a.height), i.css({ left: h, width: s }).data({ idx: e, left: h, width: s, cwidth: n, area: h + s, center: h - (o.vp / 2 - n / 2) }), h += s;
      }), this.container.css({ "min-width": h, "min-height": r }), this.options.infinite && (h <= 2 * this.vp || this.items.length < 5) && !this.itemsResized ? (this.container.children().each(function (t) {
        o.container.append(o.items.eq(t).clone(!0).attr("id", ""));
      }).each(function (t) {
        o.container.append(o.items.eq(t).clone(!0).attr("id", ""));
      }), this.itemsResized = !0, this.resize()) : (this.cw = h, this.pos = 0, this.active = h >= this.vp, this.container.css({ "-ms-transform": "", "-webkit-transform": "", transform: "" }), e && this.updateFocus(this.focus), void 0);
    }, updatePos: function (t) {
      this.pos = t, this.container.css({ "-ms-transform": "translateX(" + t + "px)", "-webkit-transform": "translateX(" + t + "px)", transform: "translateX(" + t + "px)" });
    }, updateFocus: function (e, i) {
      if (this.active) {
        i = i || (e > this.focus ? 1 : -1);var s,
            n,
            a = this.items.eq(e);if (this.options.infinite && this.infinite(e, i), this.options.center) this.updatePos(-1 * a.data("center")), this.items.filter("." + this.options.activecls).removeClass(this.options.activecls), a.addClass(this.options.activecls);else if (this.options.infinite) this.updatePos(-1 * a.data("left"));else {
          for (s = 0, n = e; n < this.items.length; n++) s += this.items.eq(n).data("width");if (s > this.vp) this.updatePos(-1 * a.data("left"));else if (1 == i) {
            for (s = 0, n = this.items.length - 1; n >= 0; n--) {
              if (s += this.items.eq(n).data("width"), s == this.vp) {
                e = n;break;
              }if (s > this.vp) {
                e = n < this.items.length - 1 ? n + 1 : n;break;
              }
            }s > this.vp ? this.updatePos(-1 * (this.container.width() - this.vp)) : this.updatePos(-1 * this.items.eq(e).data("left"));
          }
        }var o = this.items.eq(e).data("left");this.items.removeClass("uk-slide-before uk-slide-after").each(function (i) {
          i !== e && t.$(this).addClass(t.$(this).data("left") < o ? "uk-slide-before" : "uk-slide-after");
        }), this.focus = e, this.trigger("focusitem.uk.slider", [e, this.items.eq(e), this]);
      }
    }, next: function () {
      var t = this.items[this.focus + 1] ? this.focus + 1 : this.options.infinite ? 0 : this.focus;this.updateFocus(t, 1);
    }, previous: function () {
      var t = this.items[this.focus - 1] ? this.focus - 1 : this.options.infinite ? this.items[this.focus - 1] ? this.items - 1 : this.items.length - 1 : this.focus;this.updateFocus(t, -1);
    }, start: function () {
      this.stop();var t = this;this.interval = setInterval(function () {
        t.hovering || t.next();
      }, this.options.autoplayInterval);
    }, stop: function () {
      this.interval && clearInterval(this.interval);
    }, infinite: function (t, e) {
      var i,
          s = this,
          n = this.items.eq(t),
          a = t,
          o = [],
          h = 0;if (1 == e) {
        for (i = 0; i < this.items.length && (a != t && (h += this.items.eq(a).data("width"), o.push(this.items.eq(a))), !(h > this.vp)); i++) a = a + 1 == this.items.length ? 0 : a + 1;o.length && o.forEach(function (t) {
          var e = n.data("area");t.css({ left: e }).data({ left: e, area: e + t.data("width"), center: e - (s.vp / 2 - t.data("cwidth") / 2) }), n = t;
        });
      } else {
        for (i = this.items.length - 1; i > -1 && (h += this.items.eq(a).data("width"), a != t && o.push(this.items.eq(a)), !(h > this.vp)); i--) a = a - 1 == -1 ? this.items.length - 1 : a - 1;o.length && o.forEach(function (t) {
          var e = n.data("left") - t.data("width");t.css({ left: e }).data({ left: e, area: e + t.data("width"), center: e - (s.vp / 2 - t.data("cwidth") / 2) }), n = t;
        });
      }
    } }), t.$doc.on("mousemove.uk.slider touchmove.uk.slider", function (t) {
    if (t.originalEvent && t.originalEvent.touches && (t = t.originalEvent.touches[0]), i && Math.abs(t.pageX - i.x) > i.threshold && (window.getSelection().toString() ? e = i = !1 : i(t)), e) {
      var s, n, o, h, r, c, f, u, d, l;if (t.clientX || t.clientY ? s = t.clientX : (t.pageX || t.pageY) && (s = t.pageX - document.body.scrollLeft - document.documentElement.scrollLeft), r = a.focus, n = s - e.element.data("pointer-start").x, o = e.element.data("pointer-pos-start") + n, h = s > e.element.data("pointer-start").x ? -1 : 1, c = e.items.eq(a.focus), 1 == h) for (f = c.data("left") + Math.abs(n), u = 0, d = a.focus; u < e.items.length; u++) {
        if (l = e.items.eq(d), d != a.focus && l.data("left") < f && l.data("area") > f) {
          r = d;break;
        }d = d + 1 == e.items.length ? 0 : d + 1;
      } else for (f = c.data("left") - Math.abs(n), u = 0, d = a.focus; u < e.items.length; u++) {
        if (l = e.items.eq(d), d != a.focus && l.data("area") <= c.data("left") && l.data("center") < f) {
          r = d;break;
        }d = d - 1 == -1 ? e.items.length - 1 : d - 1;
      }e.options.infinite && r != a._focus && e.infinite(r, h), e.updatePos(o), a.dir = h, a._focus = r, a.touchx = parseInt(t.pageX, 10), a.diff = f;
    }
  }), t.$doc.on("mouseup.uk.slider touchend.uk.slider", function () {
    if (e) {
      e.container.removeClass("uk-drag"), e.items.eq(a.focus);var t,
          s,
          n,
          o = !1;if (1 == a.dir) for (s = 0, n = a.focus; s < e.items.length; s++) {
        if (t = e.items.eq(n), n != a.focus && t.data("left") > a.diff) {
          o = n;break;
        }n = n + 1 == e.items.length ? 0 : n + 1;
      } else for (s = 0, n = a.focus; s < e.items.length; s++) {
        if (t = e.items.eq(n), n != a.focus && t.data("left") < a.diff) {
          o = n;break;
        }n = n - 1 == -1 ? e.items.length - 1 : n - 1;
      }e.updateFocus(o !== !1 ? o : a._focus);
    }e = i = !1;
  }), t.slider;
});

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slideset.min.js":[function(require,module,exports){
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var i;window.UIkit && (i = t(UIkit)), "function" == typeof define && define.amd && define("uikit-slideset", ["uikit"], function () {
    return i || t(UIkit);
  });
}(function (t) {
  "use strict";
  function i(i, e, s, n) {
    var a,
        o,
        r,
        l,
        h = t.$.Deferred(),
        u = this.options.delay === !1 ? Math.floor(this.options.duration / 2) : this.options.delay,
        d = this;if (n = n || 1, this.element.css("min-height", this.element.height()), s[0] === e[0]) return h.resolve(), h.promise();if ("object" == typeof i ? (a = i[0], o = i[1] || i[0]) : (a = i, o = a), r = function () {
      if (e && e.length && e.hide().removeClass(o + " uk-animation-reverse").css({ opacity: "", "animation-delay": "", animation: "" }), !s.length) return h.resolve(), void 0;for (l = 0; l < s.length; l++) s.eq(1 == n ? l : s.length - l - 1).css("animation-delay", l * u + "ms");var i = function () {
        s.removeClass("" + a).css({ opacity: "", display: "", "animation-delay": "", animation: "" }), h.resolve(), d.element.css("min-height", ""), i = !1;
      };s.addClass(a)[1 == n ? "last" : "first"]().one(t.support.animation.end, function () {
        i && i();
      }).end().css("display", ""), setTimeout(function () {
        i && i();
      }, s.length * u * 2);
    }, s.length && s.css("animation-duration", this.options.duration + "ms"), e && e.length) for (e.css("animation-duration", this.options.duration + "ms")[1 == n ? "last" : "first"]().one(t.support.animation.end, function () {
      r();
    }), l = 0; l < e.length; l++) !function (i, e) {
      setTimeout(function () {
        e.css("display", "none").css("display", "").css("opacity", 0).on(t.support.animation.end, function () {
          e.removeClass(o);
        }).addClass(o + " uk-animation-reverse");
      }.bind(this), l * u);
    }(l, e.eq(1 == n ? l : e.length - l - 1));else r();return h.promise();
  }function e(t, i) {
    var e,
        s = 0,
        n = -1,
        a = t.length || 0,
        o = [];if (1 > i) return null;for (; a > s;) e = s % i, e ? o[n][e] = t[s] : o[++n] = [t[s]], s++;for (s = 0, a = o.length; a > s;) o[s] = jQuery(o[s]), s++;return o;
  }var s;t.component("slideset", { defaults: { "default": 1, animation: "fade", duration: 200, filter: "", delay: !1, controls: !1, autoplay: !1, autoplayInterval: 7e3, pauseOnHover: !0 }, sets: [], boot: function () {
      t.ready(function (i) {
        t.$("[data-uk-slideset]", i).each(function () {
          var i = t.$(this);i.data("slideset") || t.slideset(i, t.Utils.options(i.attr("data-uk-slideset")));
        });
      });
    }, init: function () {
      var i = this;this.activeSet = !1, this.list = this.element.find(".uk-slideset"), this.nav = this.element.find(".uk-slideset-nav"), this.controls = this.options.controls ? t.$(this.options.controls) : this.element, t.$win.on("resize load", t.Utils.debounce(function () {
        i.updateSets();
      }, 100)), i.list.addClass("uk-grid-width-1-" + i.options.default), ["xlarge", "large", "medium", "small"].forEach(function (t) {
        i.options[t] && i.list.addClass("uk-grid-width-" + t + "-1-" + i.options[t]);
      }), this.on("click.uk.slideset", "[data-uk-slideset-item]", function (e) {
        if (e.preventDefault(), !i.animating) {
          var s = t.$(this).attr("data-uk-slideset-item");if (i.activeSet !== s) switch (s) {case "next":case "previous":
              i["next" == s ? "next" : "previous"]();break;default:
              i.show(parseInt(s, 10));}
        }
      }), this.controls.on("click.uk.slideset", "[data-uk-filter]", function (e) {
        var s = t.$(this);s.parent().hasClass("uk-slideset") || (e.preventDefault(), i.animating || i.currentFilter == s.attr("data-uk-filter") || (i.updateFilter(s.attr("data-uk-filter")), i._hide().then(function () {
          i.updateSets(!0, !0);
        })));
      }), this.on("swipeRight swipeLeft", function (t) {
        i["swipeLeft" == t.type ? "next" : "previous"]();
      }), this.updateFilter(this.options.filter), this.updateSets(), this.element.on({ mouseenter: function () {
          i.options.pauseOnHover && (i.hovering = !0);
        }, mouseleave: function () {
          i.hovering = !1;
        } }), this.options.autoplay && this.start();
    }, updateSets: function (t, i) {
      var s,
          n = this.visible;if (this.visible = this.getVisibleOnCurrenBreakpoint(), n != this.visible || i) {
        for (this.children = this.list.children().hide(), this.items = this.getItems(), this.sets = e(this.items, this.visible), s = 0; s < this.sets.length; s++) this.sets[s].css({ display: "none" });if (this.nav.length && this.nav.empty()) {
          for (s = 0; s < this.sets.length; s++) this.nav.append('<li data-uk-slideset-item="' + s + '"><a></a></li>');this.nav[1 == this.nav.children().length ? "addClass" : "removeClass"]("uk-invisible");
        }this.activeSet = !1, this.show(0, !t);
      }
    }, updateFilter: function (i) {
      var e,
          s = this;this.currentFilter = i, this.controls.find("[data-uk-filter]").each(function () {
        e = t.$(this), e.parent().hasClass("uk-slideset") || (e.attr("data-uk-filter") == s.currentFilter ? e.addClass("uk-active") : e.removeClass("uk-active"));
      });
    }, getVisibleOnCurrenBreakpoint: function () {
      var i = null,
          e = t.$('<div style="position:absolute;height:1px;top:-1000px;width:100px"><div></div></div>').appendTo("body"),
          s = e.children().eq(0),
          n = this.options;return ["xlarge", "large", "medium", "small"].forEach(function (t) {
        n[t] && !i && (e.attr("class", "uk-grid-width-" + t + "-1-2").width(), 50 == s.width() && (i = t));
      }), e.remove(), this.options[i] || this.options["default"];
    }, getItems: function () {
      var i,
          e = [];return this.currentFilter ? (i = this.currentFilter || [], "string" == typeof i && (i = i.split(/,/).map(function (t) {
        return t.trim();
      })), this.children.each(function () {
        var s = t.$(this),
            n = s.attr("data-uk-filter"),
            a = i.length ? !1 : !0;n && (n = n.split(/,/).map(function (t) {
          return t.trim();
        }), i.forEach(function (t) {
          n.indexOf(t) > -1 && (a = !0);
        })), a && e.push(s[0]);
      }), e = t.$(e)) : e = this.list.children(), e;
    }, show: function (i, e, n) {
      var a = this;if (this.activeSet !== i && !this.animating) {
        n = n || (i < this.activeSet ? -1 : 1);var o = this.sets[this.activeSet] || [],
            r = this.sets[i],
            l = this._getAnimation();(e || !t.support.animation) && (l = s.none), this.animating = !0, this.nav.length && this.nav.children().removeClass("uk-active").eq(i).addClass("uk-active"), l.apply(a, [o, r, n]).then(function () {
          t.Utils.checkDisplay(r, !0), a.children.hide().removeClass("uk-active"), r.addClass("uk-active").css({ display: "", opacity: "" }), a.animating = !1, a.activeSet = i, t.Utils.checkDisplay(r, !0), a.trigger("show.uk.slideset", [r]);
        });
      }
    }, _getAnimation: function () {
      var i = s[this.options.animation] || s.none;return t.support.animation || (i = s.none), i;
    }, _hide: function () {
      var t = this,
          i = this.sets[this.activeSet] || [],
          e = this._getAnimation();return this.animating = !0, e.apply(t, [i, [], 1]).then(function () {
        t.animating = !1;
      });
    }, next: function () {
      this.show(this.sets[this.activeSet + 1] ? this.activeSet + 1 : 0, !1, 1);
    }, previous: function () {
      this.show(this.sets[this.activeSet - 1] ? this.activeSet - 1 : this.sets.length - 1, !1, -1);
    }, start: function () {
      this.stop();var t = this;this.interval = setInterval(function () {
        t.hovering || t.animating || t.next();
      }, this.options.autoplayInterval);
    }, stop: function () {
      this.interval && clearInterval(this.interval);
    } }), s = { none: function () {
      var i = t.$.Deferred();return i.resolve(), i.promise();
    }, fade: function (t, e) {
      return i.apply(this, ["uk-animation-fade", t, e]);
    }, "slide-bottom": function (t, e) {
      return i.apply(this, ["uk-animation-slide-bottom", t, e]);
    }, "slide-top": function (t, e) {
      return i.apply(this, ["uk-animation-slide-top", t, e]);
    }, "slide-vertical": function (t, e, s) {
      var n = ["uk-animation-slide-top", "uk-animation-slide-bottom"];return -1 == s && n.reverse(), i.apply(this, [n, t, e]);
    }, "slide-horizontal": function (t, e, s) {
      var n = ["uk-animation-slide-right", "uk-animation-slide-left"];return -1 == s && n.reverse(), i.apply(this, [n, t, e, s]);
    }, scale: function (t, e) {
      return i.apply(this, ["uk-animation-scale-up", t, e]);
    } }, t.slideset.animations = s;
});

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slideshow.min.js":[function(require,module,exports){
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (i) {
    var t;
    window.UIkit && (t = i(UIkit)), "function" == typeof define && define.amd && define("uikit-slideshow", ["uikit"], function () {
        return t || i(UIkit);
    });
}(function (i) {
    "use strict";

    var t,
        s = 0;
    i.component("slideshow", {
        defaults: {
            animation: "fade",
            duration: 500,
            height: "auto",
            start: 0,
            autoplay: !1,
            autoplayInterval: 7e3,
            videoautoplay: !0,
            videomute: !0,
            slices: 15,
            pauseOnHover: !0,
            kenburns: !1,
            kenburnsanimations: ["uk-animation-middle-left", "uk-animation-top-right", "uk-animation-bottom-left", "uk-animation-top-center", "", "uk-animation-bottom-right"]
        }, current: !1, interval: null, hovering: !1, boot: function () {
            i.ready(function (t) {
                i.$("[data-uk-slideshow]", t).each(function () {
                    var t = i.$(this);
                    t.data("slideshow") || i.slideshow(t, i.Utils.options(t.attr("data-uk-slideshow")));
                });
            });
        }, init: function () {
            var t,
                e,
                a = this;
            this.container = this.element.hasClass("uk-slideshow") ? this.element : i.$(this.find(".uk-slideshow")), this.slides = this.container.children(), this.slidesCount = this.slides.length, this.current = this.options.start, this.animating = !1, this.triggers = this.find("[data-uk-slideshow-item]"), this.fixFullscreen = navigator.userAgent.match(/(iPad|iPhone|iPod)/g) && this.container.hasClass("uk-slideshow-fullscreen"), this.options.kenburns && (e = this.options.kenburns === !0 ? "15s" : this.options.kenburns, String(e).match(/(ms|s)$/) || (e += "ms"), "string" == typeof this.options.kenburnsanimations && (this.options.kenburnsanimations = this.options.kenburnsanimations.split(","))), this.slides.each(function (n) {
                var o = i.$(this),
                    r = o.children("img,video,iframe").eq(0);
                if (o.data("media", r), o.data("sizer", r), r.length) {
                    var d;
                    switch (r[0].nodeName) {
                        case "PICTURE":
                        case "IMG":
                            var u = i.$('<div class="uk-cover-background uk-position-cover"></div>').css({ "background-image": "url(" + r.attr("src") + ")" });
                            r.attr("width") && r.attr("height") && (d = i.$("<canvas></canvas>").attr({
                                width: r.attr("width"),
                                height: r.attr("height")
                            }), r.replaceWith(d), r = d, d = void 0), r.css({
                                width: "100%",
                                height: "auto",
                                opacity: 0
                            }), o.prepend(u).data("cover", u);
                            break;
                        case "IFRAME":
                            var h = r[0].src,
                                c = "sw-" + ++s;
                            r.attr("src", "").on("load", function () {
                                if ((n !== a.current || n == a.current && !a.options.videoautoplay) && a.pausemedia(r), a.options.videomute) {
                                    a.mutemedia(r);
                                    var i = setInterval(function (t) {
                                        return function () {
                                            a.mutemedia(r), ++t >= 4 && clearInterval(i);
                                        };
                                    }(0), 250);
                                }
                            }).data("slideshow", a).attr("data-player-id", c).attr("src", [h, h.indexOf("?") > -1 ? "&" : "?", "enablejsapi=1&api=1&player_id=" + c].join("")).addClass("uk-position-absolute"), i.support.touch || r.css("pointer-events", "none"), d = !0, i.cover && (i.cover(r), r.attr("data-uk-cover", "{}"));
                            break;
                        case "VIDEO":
                            r.addClass("uk-cover-object uk-position-absolute"), d = !0, a.options.videomute && a.mutemedia(r);
                    }
                    if (d) {
                        t = i.$("<canvas></canvas>").attr({ width: r[0].width, height: r[0].height });
                        var l = i.$('<img style="width:100%;height:auto;">').attr("src", t[0].toDataURL());
                        o.prepend(l), o.data("sizer", l);
                    }
                } else o.data("sizer", o);
                a.hasKenBurns(o) && o.data("cover").css({ "-webkit-animation-duration": e, "animation-duration": e });
            }), this.on("click.uk.slideshow", "[data-uk-slideshow-item]", function (t) {
                t.preventDefault();
                var s = i.$(this).attr("data-uk-slideshow-item");
                if (a.current != s) {
                    switch (s) {
                        case "next":
                        case "previous":
                            a["next" == s ? "next" : "previous"]();
                            break;
                        default:
                            a.show(parseInt(s, 10));
                    }
                    a.stop();
                }
            }), this.slides.attr("aria-hidden", "true").eq(this.current).addClass("uk-active").attr("aria-hidden", "false"), this.triggers.filter('[data-uk-slideshow-item="' + this.current + '"]').addClass("uk-active"), i.$win.on("resize load", i.Utils.debounce(function () {
                a.resize(), a.fixFullscreen && (a.container.css("height", window.innerHeight), a.slides.css("height", window.innerHeight));
            }, 100)), setTimeout(function () {
                a.resize();
            }, 80), this.options.autoplay && this.start(), this.options.videoautoplay && this.slides.eq(this.current).data("media") && this.playmedia(this.slides.eq(this.current).data("media")), this.options.kenburns && this.applyKenBurns(this.slides.eq(this.current)), this.container.on({
                mouseenter: function () {
                    a.options.pauseOnHover && (a.hovering = !0);
                }, mouseleave: function () {
                    a.hovering = !1;
                }
            }), this.on("swipeRight swipeLeft", function (i) {
                a["swipeLeft" == i.type ? "next" : "previous"]();
            }), this.on("display.uk.check", function () {
                a.element.is(":visible") && (a.resize(), a.fixFullscreen && (a.container.css("height", window.innerHeight), a.slides.css("height", window.innerHeight)));
            });
        }, resize: function () {
            if (!this.container.hasClass("uk-slideshow-fullscreen")) {
                var t = this.options.height;
                "auto" === this.options.height && (t = 0, this.slides.css("height", "").each(function () {
                    t = Math.max(t, i.$(this).height());
                })), this.container.css("height", t), this.slides.css("height", t);
            }
        }, show: function (s, e) {
            if (!this.animating && this.current != s) {
                this.animating = !0;
                var a = this,
                    n = this.slides.eq(this.current),
                    o = this.slides.eq(s),
                    r = e ? e : this.current < s ? 1 : -1,
                    d = n.data("media"),
                    u = t[this.options.animation] ? this.options.animation : "fade",
                    h = o.data("media"),
                    c = function () {
                    a.animating && (d && d.is("video,iframe") && a.pausemedia(d), h && h.is("video,iframe") && a.playmedia(h), o.addClass("uk-active").attr("aria-hidden", "false"), n.removeClass("uk-active").attr("aria-hidden", "true"), a.animating = !1, a.current = s, i.Utils.checkDisplay(o, '[class*="uk-animation-"]:not(.uk-cover-background.uk-position-cover)'), a.trigger("show.uk.slideshow", [o, n, a]));
                };
                a.applyKenBurns(o), i.support.animation || (u = "none"), n = i.$(n), o = i.$(o), a.trigger("beforeshow.uk.slideshow", [o, n, a]), t[u].apply(this, [n, o, r]).then(c), a.triggers.removeClass("uk-active"), a.triggers.filter('[data-uk-slideshow-item="' + s + '"]').addClass("uk-active");
            }
        }, applyKenBurns: function (i) {
            if (this.hasKenBurns(i)) {
                var t = this.options.kenburnsanimations,
                    s = this.kbindex || 0;
                i.data("cover").attr("class", "uk-cover-background uk-position-cover").width(), i.data("cover").addClass(["uk-animation-scale", "uk-animation-reverse", t[s].trim()].join(" ")), this.kbindex = t[s + 1] ? s + 1 : 0;
            }
        }, hasKenBurns: function (i) {
            return this.options.kenburns && i.data("cover");
        }, next: function () {
            this.show(this.slides[this.current + 1] ? this.current + 1 : 0, 1);
        }, previous: function () {
            this.show(this.slides[this.current - 1] ? this.current - 1 : this.slides.length - 1, -1);
        }, start: function () {
            this.stop();
            var i = this;
            this.interval = setInterval(function () {
                i.hovering || i.next();
            }, this.options.autoplayInterval);
        }, stop: function () {
            this.interval && clearInterval(this.interval);
        }, playmedia: function (i) {
            if (i && i[0]) switch (i[0].nodeName) {
                case "VIDEO":
                    this.options.videomute || (i[0].muted = !1), i[0].play();
                    break;
                case "IFRAME":
                    this.options.videomute || i[0].contentWindow.postMessage('{ "event": "command", "func": "unmute", "method":"setVolume", "value":1}', "*"), i[0].contentWindow.postMessage('{ "event": "command", "func": "playVideo", "method":"play"}', "*");
            }
        }, pausemedia: function (i) {
            switch (i[0].nodeName) {
                case "VIDEO":
                    i[0].pause();
                    break;
                case "IFRAME":
                    i[0].contentWindow.postMessage('{ "event": "command", "func": "pauseVideo", "method":"pause"}', "*");
            }
        }, mutemedia: function (i) {
            switch (i[0].nodeName) {
                case "VIDEO":
                    i[0].muted = !0;
                    break;
                case "IFRAME":
                    i[0].contentWindow.postMessage('{ "event": "command", "func": "mute", "method":"setVolume", "value":0}', "*");
            }
        }
    }), t = {
        none: function () {
            var t = i.$.Deferred();
            return t.resolve(), t.promise();
        }, scroll: function (t, s, e) {
            var a = i.$.Deferred();
            return t.css("animation-duration", this.options.duration + "ms"), s.css("animation-duration", this.options.duration + "ms"), s.css("opacity", 1).one(i.support.animation.end, function () {
                t.removeClass(-1 == e ? "uk-slideshow-scroll-backward-out" : "uk-slideshow-scroll-forward-out"), s.css("opacity", "").removeClass(-1 == e ? "uk-slideshow-scroll-backward-in" : "uk-slideshow-scroll-forward-in"), a.resolve();
            }.bind(this)), t.addClass(-1 == e ? "uk-slideshow-scroll-backward-out" : "uk-slideshow-scroll-forward-out"), s.addClass(-1 == e ? "uk-slideshow-scroll-backward-in" : "uk-slideshow-scroll-forward-in"), s.width(), a.promise();
        }, swipe: function (t, s, e) {
            var a = i.$.Deferred();
            return t.css("animation-duration", this.options.duration + "ms"), s.css("animation-duration", this.options.duration + "ms"), s.css("opacity", 1).one(i.support.animation.end, function () {
                t.removeClass(-1 === e ? "uk-slideshow-swipe-backward-out" : "uk-slideshow-swipe-forward-out"), s.css("opacity", "").removeClass(-1 === e ? "uk-slideshow-swipe-backward-in" : "uk-slideshow-swipe-forward-in"), a.resolve();
            }.bind(this)), t.addClass(-1 == e ? "uk-slideshow-swipe-backward-out" : "uk-slideshow-swipe-forward-out"), s.addClass(-1 == e ? "uk-slideshow-swipe-backward-in" : "uk-slideshow-swipe-forward-in"), s.width(), a.promise();
        }, scale: function (t, s) {
            var e = i.$.Deferred();
            return t.css("animation-duration", this.options.duration + "ms"), s.css("animation-duration", this.options.duration + "ms"), s.css("opacity", 1), t.one(i.support.animation.end, function () {
                t.removeClass("uk-slideshow-scale-out"), s.css("opacity", ""), e.resolve();
            }.bind(this)), t.addClass("uk-slideshow-scale-out"), t.width(), e.promise();
        }, fade: function (t, s) {
            var e = i.$.Deferred();
            return t.css("animation-duration", this.options.duration + "ms"), s.css("animation-duration", this.options.duration + "ms"), s.css("opacity", 1), s.data("cover") || s.data("placeholder") || s.css("opacity", 1).one(i.support.animation.end, function () {
                s.removeClass("uk-slideshow-fade-in");
            }).addClass("uk-slideshow-fade-in"), t.one(i.support.animation.end, function () {
                t.removeClass("uk-slideshow-fade-out"), s.css("opacity", ""), e.resolve();
            }.bind(this)), t.addClass("uk-slideshow-fade-out"), t.width(), e.promise();
        }
    }, i.slideshow.animations = t, window.addEventListener("message", function (t) {
        var s,
            e = t.data;
        if ("string" == typeof e) try {
            e = JSON.parse(e);
        } catch (a) {
            e = {};
        }
        t.origin && t.origin.indexOf("vimeo") > -1 && "ready" == e.event && e.player_id && (s = i.$('[data-player-id="' + e.player_id + '"]'), s.length && s.data("slideshow").mutemedia(s));
    }, !1);
});

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/sticky.min.js":[function(require,module,exports){
/*! UIkit 2.26.3 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var i;window.UIkit && (i = t(UIkit)), "function" == typeof define && define.amd && define("uikit-sticky", ["uikit"], function () {
    return i || t(UIkit);
  });
}(function (t) {
  "use strict";
  function i() {
    var i = arguments.length ? arguments : n;if (i.length && !(e.scrollTop() < 0)) for (var o, a, r, h, p = e.scrollTop(), c = s.height(), l = e.height(), d = c - l, u = p > d ? d - p : 0, m = 0; m < i.length; m++) if (h = i[m], h.element.is(":visible") && !h.animate) {
      if (h.check()) {
        if (h.top < 0 ? o = 0 : (r = h.element.outerHeight(), o = c - r - h.top - h.options.bottom - p - u, o = 0 > o ? o + h.top : h.top), h.boundary && h.boundary.length) {
          var f = h.boundary.offset().top;a = h.boundtoparent ? c - (f + h.boundary.outerHeight()) + parseInt(h.boundary.css("padding-bottom")) : c - f, o = p + r > c - a - (h.top < 0 ? 0 : h.top) ? c - a - (p + r) : o;
        }if (h.currentTop != o) {
          if (h.element.css({ position: "fixed", top: o, width: h.getWidthFrom.length ? h.getWidthFrom.width() : h.element.width() }), !h.init && (h.element.addClass(h.options.clsinit), location.hash && p > 0 && h.options.target)) {
            var g = t.$(location.hash);g.length && setTimeout(function (t, i) {
              return function () {
                i.element.width();var e = t.offset(),
                    s = e.top + t.outerHeight(),
                    n = i.element.offset(),
                    o = i.element.outerHeight(),
                    a = n.top + o;n.top < s && e.top < a && (p = e.top - o - i.options.target, window.scrollTo(0, p));
              };
            }(g, h), 0);
          }h.element.addClass(h.options.clsactive).removeClass(h.options.clsinactive), h.element.trigger("active.uk.sticky"), h.element.css("margin", ""), h.options.animation && h.init && !t.Utils.isInView(h.wrapper) && h.element.addClass(h.options.animation), h.currentTop = o;
        }
      } else null !== h.currentTop && h.reset();h.init = !0;
    }
  }var e = t.$win,
      s = t.$doc,
      n = [],
      o = 1;return t.component("sticky", { defaults: { top: 0, bottom: 0, animation: "", clsinit: "uk-sticky-init", clsactive: "uk-active", clsinactive: "", getWidthFrom: "", showup: !1, boundary: !1, media: !1, target: !1, disabled: !1 }, boot: function () {
      t.$doc.on("scrolling.uk.document", function (t, e) {
        e && e.dir && (o = e.dir.y, i());
      }), t.$win.on("resize orientationchange", t.Utils.debounce(function () {
        if (n.length) {
          for (var t = 0; t < n.length; t++) n[t].reset(!0);i();
        }
      }, 100)), t.ready(function (e) {
        setTimeout(function () {
          t.$("[data-uk-sticky]", e).each(function () {
            var i = t.$(this);i.data("sticky") || t.sticky(i, t.Utils.options(i.attr("data-uk-sticky")));
          }), i();
        }, 0);
      });
    }, init: function () {
      var i,
          a = this.options.boundary;this.wrapper = this.element.wrap('<div class="uk-sticky-placeholder"></div>').parent(), this.computeWrapper(), this.element.css("margin", 0), a && (a === !0 || "!" === a[0] ? (a = a === !0 ? this.wrapper.parent() : this.wrapper.closest(a.substr(1)), i = !0) : "string" == typeof a && (a = t.$(a))), this.sticky = { self: this, options: this.options, element: this.element, currentTop: null, wrapper: this.wrapper, init: !1, getWidthFrom: t.$(this.options.getWidthFrom || this.wrapper), boundary: a, boundtoparent: i, top: 0, calcTop: function () {
          var i = this.options.top;if (this.options.top && "string" == typeof this.options.top) if (this.options.top.match(/^(-|)(\d+)vh$/)) i = window.innerHeight * parseInt(this.options.top, 10) / 100;else {
            var e = t.$(this.options.top).first();e.length && e.is(":visible") && (i = -1 * (e.offset().top + e.outerHeight() - this.wrapper.offset().top));
          }this.top = i;
        }, reset: function (i) {
          this.calcTop();var e = function () {
            this.element.css({ position: "", top: "", width: "", left: "", margin: "0" }), this.element.removeClass([this.options.animation, "uk-animation-reverse", this.options.clsactive].join(" ")), this.element.addClass(this.options.clsinactive), this.element.trigger("inactive.uk.sticky"), this.currentTop = null, this.animate = !1;
          }.bind(this);!i && this.options.animation && t.support.animation && !t.Utils.isInView(this.wrapper) ? (this.animate = !0, this.element.removeClass(this.options.animation).one(t.support.animation.end, function () {
            e();
          }).width(), this.element.addClass(this.options.animation + " uk-animation-reverse")) : e();
        }, check: function () {
          if (this.options.disabled) return !1;if (this.options.media) switch (typeof this.options.media) {case "number":
              if (window.innerWidth < this.options.media) return !1;break;case "string":
              if (window.matchMedia && !window.matchMedia(this.options.media).matches) return !1;}var i = e.scrollTop(),
              n = s.height(),
              a = n - window.innerHeight,
              r = i > a ? a - i : 0,
              h = this.wrapper.offset().top,
              p = h - this.top - r,
              c = i >= p;return c && this.options.showup && (1 == o && (c = !1), -1 == o && !this.element.hasClass(this.options.clsactive) && t.Utils.isInView(this.wrapper) && (c = !1)), c;
        } }, this.sticky.calcTop(), n.push(this.sticky);
    }, update: function () {
      i(this.sticky);
    }, enable: function () {
      this.options.disabled = !1, this.update();
    }, disable: function (t) {
      this.options.disabled = !0, this.sticky.reset(t);
    }, computeWrapper: function () {
      this.wrapper.css({ height: -1 == ["absolute", "fixed"].indexOf(this.element.css("position")) ? this.element.outerHeight() : "", "float": "none" != this.element.css("float") ? this.element.css("float") : "", margin: this.element.css("margin") }), "fixed" == this.element.css("position") && this.element.css({ width: this.sticky.getWidthFrom.length ? this.sticky.getWidthFrom.width() : this.element.width() });
    } }), t.sticky;
});

},{}],"/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/tooltip.min.js":[function(require,module,exports){
/*! UIkit 2.26.3 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var i;window.UIkit && (i = t(UIkit)), "function" == typeof define && define.amd && define("uikit-tooltip", ["uikit"], function () {
    return i || t(UIkit);
  });
}(function (t) {
  "use strict";
  var i, o, e;return t.component("tooltip", { defaults: { offset: 5, pos: "top", animation: !1, delay: 0, cls: "", activeClass: "uk-active", src: function (t) {
        var i = t.attr("title");return void 0 !== i && t.data("cached-title", i).removeAttr("title"), t.data("cached-title");
      } }, tip: "", boot: function () {
      t.$html.on("mouseenter.tooltip.uikit focus.tooltip.uikit", "[data-uk-tooltip]", function () {
        var i = t.$(this);i.data("tooltip") || (t.tooltip(i, t.Utils.options(i.attr("data-uk-tooltip"))), i.trigger("mouseenter"));
      });
    }, init: function () {
      var o = this;i || (i = t.$('<div class="uk-tooltip"></div>').appendTo("body")), this.on({ focus: function () {
          o.show();
        }, blur: function () {
          o.hide();
        }, mouseenter: function () {
          o.show();
        }, mouseleave: function () {
          o.hide();
        } });
    }, show: function () {
      if (this.tip = "function" == typeof this.options.src ? this.options.src(this.element) : this.options.src, o && clearTimeout(o), e && clearTimeout(e), "string" == typeof this.tip ? this.tip.length : 0) {
        i.stop().css({ top: -2e3, visibility: "hidden" }).removeClass(this.options.activeClass).show(), i.html('<div class="uk-tooltip-inner">' + this.tip + "</div>");var s = this,
            n = t.$.extend({}, this.element.offset(), { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight }),
            l = i[0].offsetWidth,
            f = i[0].offsetHeight,
            p = "function" == typeof this.options.offset ? this.options.offset.call(this.element) : this.options.offset,
            a = "function" == typeof this.options.pos ? this.options.pos.call(this.element) : this.options.pos,
            h = a.split("-"),
            c = { display: "none", visibility: "visible", top: n.top + n.height + f, left: n.left };if ("fixed" == t.$html.css("position") || "fixed" == t.$body.css("position")) {
          var r = t.$("body").offset(),
              d = t.$("html").offset(),
              u = { top: d.top + r.top, left: d.left + r.left };n.left -= u.left, n.top -= u.top;
        }"left" != h[0] && "right" != h[0] || "right" != t.langdirection || (h[0] = "left" == h[0] ? "right" : "left");var m = { bottom: { top: n.top + n.height + p, left: n.left + n.width / 2 - l / 2 }, top: { top: n.top - f - p, left: n.left + n.width / 2 - l / 2 }, left: { top: n.top + n.height / 2 - f / 2, left: n.left - l - p }, right: { top: n.top + n.height / 2 - f / 2, left: n.left + n.width + p } };t.$.extend(c, m[h[0]]), 2 == h.length && (c.left = "left" == h[1] ? n.left : n.left + n.width - l);var v = this.checkBoundary(c.left, c.top, l, f);if (v) {
          switch (v) {case "x":
              a = 2 == h.length ? h[0] + "-" + (c.left < 0 ? "left" : "right") : c.left < 0 ? "right" : "left";break;case "y":
              a = 2 == h.length ? (c.top < 0 ? "bottom" : "top") + "-" + h[1] : c.top < 0 ? "bottom" : "top";break;case "xy":
              a = 2 == h.length ? (c.top < 0 ? "bottom" : "top") + "-" + (c.left < 0 ? "left" : "right") : c.left < 0 ? "right" : "left";}h = a.split("-"), t.$.extend(c, m[h[0]]), 2 == h.length && (c.left = "left" == h[1] ? n.left : n.left + n.width - l);
        }c.left -= t.$body.position().left, o = setTimeout(function () {
          i.css(c).attr("class", ["uk-tooltip", "uk-tooltip-" + a, s.options.cls].join(" ")), s.options.animation ? i.css({ opacity: 0, display: "block" }).addClass(s.options.activeClass).animate({ opacity: 1 }, parseInt(s.options.animation, 10) || 400) : i.show().addClass(s.options.activeClass), o = !1, e = setInterval(function () {
            s.element.is(":visible") || s.hide();
          }, 150);
        }, parseInt(this.options.delay, 10) || 0);
      }
    }, hide: function () {
      if (!this.element.is("input") || this.element[0] !== document.activeElement) if (o && clearTimeout(o), e && clearTimeout(e), i.stop(), this.options.animation) {
        var t = this;i.fadeOut(parseInt(this.options.animation, 10) || 400, function () {
          i.removeClass(t.options.activeClass);
        });
      } else i.hide().removeClass(this.options.activeClass);
    }, content: function () {
      return this.tip;
    }, checkBoundary: function (i, o, e, s) {
      var n = "";return (0 > i || i - t.$win.scrollLeft() + e > window.innerWidth) && (n += "x"), (0 > o || o - t.$win.scrollTop() + s > window.innerHeight) && (n += "y"), n;
    } }), t.tooltip;
});

},{}]},{},["/Applications/XAMPP/xamppfiles/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/app.js"])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvZGVzYW5kcm8tbWF0Y2hlcy1zZWxlY3Rvci9tYXRjaGVzLXNlbGVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL2V2LWVtaXR0ZXIvZXYtZW1pdHRlci5qcyIsIm5vZGVfbW9kdWxlcy9maXp6eS11aS11dGlscy91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9nZXQtc2l6ZS9nZXQtc2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9pbWFnZXNsb2FkZWQvaW1hZ2VzbG9hZGVkLmpzIiwibm9kZV9tb2R1bGVzL21hc29ucnktbGF5b3V0L21hc29ucnkuanMiLCJub2RlX21vZHVsZXMvb3V0bGF5ZXIvaXRlbS5qcyIsIm5vZGVfbW9kdWxlcy9vdXRsYXllci9vdXRsYXllci5qcyIsIm5vZGVfbW9kdWxlcy9zdmc0ZXZlcnlib2R5L2Rpc3Qvc3ZnNGV2ZXJ5Ym9keS5qcyIsIm5vZGVfbW9kdWxlcy91aWtpdC9kaXN0L2pzL3Vpa2l0LmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvYXBwLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9Pd2xDb250cm9sLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9jaGFuZ2VyLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9jbGVhcmFibGUtaW5wdXQuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL2V2ZW50cy5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvZmlsdGVyLWFjY29yZGlvbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvZm9ybWhhbmRsZXIuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL21hc29ucnktbGF5b3V0LmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9vbmVwYWdlci5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvc2hhcmVyLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9zbGlkZXNob3cuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL3Ntb290aC1zY3JvbGwuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL3N0aWNreS1oZWFkZXIuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL3N0aWNreS1zdWJtZW51LmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy90YWJsZS5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvdG9nZ2xlLWRvd25sb2FkLWJ1dHRvbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvdmlkZW8uanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9zaGFtZS5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci9qcXVlcnkuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy92ZW5kb3Ivb3dsLmNhcm91c2VsLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvdmVuZG9yL3BpY3R1cmVmaWxsLm1pbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci91aWtpdC9hY2NvcmRpb24ubWluLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvdmVuZG9yL3Vpa2l0L2xpZ2h0Ym94Lm1pbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci91aWtpdC9tb2RhbC5taW4uanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy92ZW5kb3IvdWlraXQvc2xpZGVyLm1pbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci91aWtpdC9zbGlkZXNldC5taW4uanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy92ZW5kb3IvdWlraXQvc2xpZGVzaG93Lm1pbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci91aWtpdC9zdGlja3kubWluLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvdmVuZG9yL3Vpa2l0L3Rvb2x0aXAubWluLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxaUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzM2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNTBIQSxPQUFPLENBQVAsR0FBVyxPQUFPLE1BQVAsR0FBZ0IsUUFBUSxpQkFBUixDQUEzQjs7QUFFQTtBQUNBLFFBQVEsZUFBUjtBQUNBLFFBQVEsT0FBUjs7QUFFQTtBQUNBLFFBQVEsMEJBQVI7QUFDQSxRQUFRLDZCQUFSO0FBQ0EsUUFBUSw4QkFBUjtBQUNBLFFBQVEsMkJBQVI7QUFDQSxRQUFRLDZCQUFSO0FBQ0EsUUFBUSw4QkFBUjtBQUNBLFFBQVEsMkJBQVI7QUFDQSxRQUFRLDRCQUFSOztBQUVBLFFBQVEsdUJBQVI7QUFDQTtBQUNBLFFBQVEsMEJBQVI7O0FBRUE7QUFDQSxRQUFRLHNCQUFSO0FBQ0EsUUFBUSx3QkFBUjtBQUNBLFFBQVEsb0JB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QUFGLENBQU8sVUFBUCxFQUFGLEdBQXNCLENBQXRCLEdBQXdCLE9BQU8sVUFBckMsTUFBbUQsS0FBRyxHQUF0RCxHQUEyRCxDQUFDLElBQUUsQ0FBRixJQUFLLElBQUUsRUFBRSxJQUFGLENBQU8sU0FBUCxFQUFGLEdBQXFCLENBQXJCLEdBQXVCLE9BQU8sV0FBcEMsTUFBbUQsS0FBRyxHQUF0RCxDQUEzRCxFQUFzSCxDQUE1SDtBQUE4SCxLQUE1MEcsRUFBdEIsR0FBcTJHLEVBQUUsT0FBOTJHO0FBQXMzRyxDQUEvaUgsQ0FBRCIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qKlxuICogbWF0Y2hlc1NlbGVjdG9yIHYyLjAuMlxuICogbWF0Y2hlc1NlbGVjdG9yKCBlbGVtZW50LCAnLnNlbGVjdG9yJyApXG4gKiBNSVQgbGljZW5zZVxuICovXG5cbi8qanNoaW50IGJyb3dzZXI6IHRydWUsIHN0cmljdDogdHJ1ZSwgdW5kZWY6IHRydWUsIHVudXNlZDogdHJ1ZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8qZ2xvYmFsIGRlZmluZTogZmFsc2UsIG1vZHVsZTogZmFsc2UgKi9cbiAgJ3VzZSBzdHJpY3QnO1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIGZhY3RvcnkgKTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93Lm1hdGNoZXNTZWxlY3RvciA9IGZhY3RvcnkoKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbWF0Y2hlc01ldGhvZCA9ICggZnVuY3Rpb24oKSB7XG4gICAgdmFyIEVsZW1Qcm90byA9IHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZTtcbiAgICAvLyBjaGVjayBmb3IgdGhlIHN0YW5kYXJkIG1ldGhvZCBuYW1lIGZpcnN0XG4gICAgaWYgKCBFbGVtUHJvdG8ubWF0Y2hlcyApIHtcbiAgICAgIHJldHVybiAnbWF0Y2hlcyc7XG4gICAgfVxuICAgIC8vIGNoZWNrIHVuLXByZWZpeGVkXG4gICAgaWYgKCBFbGVtUHJvdG8ubWF0Y2hlc1NlbGVjdG9yICkge1xuICAgICAgcmV0dXJuICdtYXRjaGVzU2VsZWN0b3InO1xuICAgIH1cbiAgICAvLyBjaGVjayB2ZW5kb3IgcHJlZml4ZXNcbiAgICB2YXIgcHJlZml4ZXMgPSBbICd3ZWJraXQnLCAnbW96JywgJ21zJywgJ28nIF07XG5cbiAgICBmb3IgKCB2YXIgaT0wOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICB2YXIgcHJlZml4ID0gcHJlZml4ZXNbaV07XG4gICAgICB2YXIgbWV0aG9kID0gcHJlZml4ICsgJ01hdGNoZXNTZWxlY3Rvcic7XG4gICAgICBpZiAoIEVsZW1Qcm90b1sgbWV0aG9kIF0gKSB7XG4gICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICB9XG4gICAgfVxuICB9KSgpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IoIGVsZW0sIHNlbGVjdG9yICkge1xuICAgIHJldHVybiBlbGVtWyBtYXRjaGVzTWV0aG9kIF0oIHNlbGVjdG9yICk7XG4gIH07XG5cbn0pKTtcbiIsIi8qKlxuICogRXZFbWl0dGVyIHYxLjEuMFxuICogTGlsJyBldmVudCBlbWl0dGVyXG4gKiBNSVQgTGljZW5zZVxuICovXG5cbi8qIGpzaGludCB1bnVzZWQ6IHRydWUsIHVuZGVmOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLyoganNoaW50IHN0cmljdDogZmFsc2UgKi8gLyogZ2xvYmFscyBkZWZpbmUsIG1vZHVsZSwgd2luZG93ICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EIC0gUmVxdWlyZUpTXG4gICAgZGVmaW5lKCBmYWN0b3J5ICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlMgLSBCcm93c2VyaWZ5LCBXZWJwYWNrXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQnJvd3NlciBnbG9iYWxzXG4gICAgZ2xvYmFsLkV2RW1pdHRlciA9IGZhY3RvcnkoKTtcbiAgfVxuXG59KCB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBFdkVtaXR0ZXIoKSB7fVxuXG52YXIgcHJvdG8gPSBFdkVtaXR0ZXIucHJvdG90eXBlO1xuXG5wcm90by5vbiA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGxpc3RlbmVyICkge1xuICBpZiAoICFldmVudE5hbWUgfHwgIWxpc3RlbmVyICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBzZXQgZXZlbnRzIGhhc2hcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgLy8gc2V0IGxpc3RlbmVycyBhcnJheVxuICB2YXIgbGlzdGVuZXJzID0gZXZlbnRzWyBldmVudE5hbWUgXSA9IGV2ZW50c1sgZXZlbnROYW1lIF0gfHwgW107XG4gIC8vIG9ubHkgYWRkIG9uY2VcbiAgaWYgKCBsaXN0ZW5lcnMuaW5kZXhPZiggbGlzdGVuZXIgKSA9PSAtMSApIHtcbiAgICBsaXN0ZW5lcnMucHVzaCggbGlzdGVuZXIgKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxucHJvdG8ub25jZSA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGxpc3RlbmVyICkge1xuICBpZiAoICFldmVudE5hbWUgfHwgIWxpc3RlbmVyICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBhZGQgZXZlbnRcbiAgdGhpcy5vbiggZXZlbnROYW1lLCBsaXN0ZW5lciApO1xuICAvLyBzZXQgb25jZSBmbGFnXG4gIC8vIHNldCBvbmNlRXZlbnRzIGhhc2hcbiAgdmFyIG9uY2VFdmVudHMgPSB0aGlzLl9vbmNlRXZlbnRzID0gdGhpcy5fb25jZUV2ZW50cyB8fCB7fTtcbiAgLy8gc2V0IG9uY2VMaXN0ZW5lcnMgb2JqZWN0XG4gIHZhciBvbmNlTGlzdGVuZXJzID0gb25jZUV2ZW50c1sgZXZlbnROYW1lIF0gPSBvbmNlRXZlbnRzWyBldmVudE5hbWUgXSB8fCB7fTtcbiAgLy8gc2V0IGZsYWdcbiAgb25jZUxpc3RlbmVyc1sgbGlzdGVuZXIgXSA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5vZmYgPSBmdW5jdGlvbiggZXZlbnROYW1lLCBsaXN0ZW5lciApIHtcbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50cyAmJiB0aGlzLl9ldmVudHNbIGV2ZW50TmFtZSBdO1xuICBpZiAoICFsaXN0ZW5lcnMgfHwgIWxpc3RlbmVycy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKCBsaXN0ZW5lciApO1xuICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgIGxpc3RlbmVycy5zcGxpY2UoIGluZGV4LCAxICk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbnByb3RvLmVtaXRFdmVudCA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGFyZ3MgKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHMgJiYgdGhpcy5fZXZlbnRzWyBldmVudE5hbWUgXTtcbiAgaWYgKCAhbGlzdGVuZXJzIHx8ICFsaXN0ZW5lcnMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBjb3B5IG92ZXIgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIGlmIC5vZmYoKSBpbiBsaXN0ZW5lclxuICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoMCk7XG4gIGFyZ3MgPSBhcmdzIHx8IFtdO1xuICAvLyBvbmNlIHN0dWZmXG4gIHZhciBvbmNlTGlzdGVuZXJzID0gdGhpcy5fb25jZUV2ZW50cyAmJiB0aGlzLl9vbmNlRXZlbnRzWyBldmVudE5hbWUgXTtcblxuICBmb3IgKCB2YXIgaT0wOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXVxuICAgIHZhciBpc09uY2UgPSBvbmNlTGlzdGVuZXJzICYmIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF07XG4gICAgaWYgKCBpc09uY2UgKSB7XG4gICAgICAvLyByZW1vdmUgbGlzdGVuZXJcbiAgICAgIC8vIHJlbW92ZSBiZWZvcmUgdHJpZ2dlciB0byBwcmV2ZW50IHJlY3Vyc2lvblxuICAgICAgdGhpcy5vZmYoIGV2ZW50TmFtZSwgbGlzdGVuZXIgKTtcbiAgICAgIC8vIHVuc2V0IG9uY2UgZmxhZ1xuICAgICAgZGVsZXRlIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF07XG4gICAgfVxuICAgIC8vIHRyaWdnZXIgbGlzdGVuZXJcbiAgICBsaXN0ZW5lci5hcHBseSggdGhpcywgYXJncyApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5hbGxPZmYgPSBmdW5jdGlvbigpIHtcbiAgZGVsZXRlIHRoaXMuX2V2ZW50cztcbiAgZGVsZXRlIHRoaXMuX29uY2VFdmVudHM7XG59O1xuXG5yZXR1cm4gRXZFbWl0dGVyO1xuXG59KSk7XG4iLCIvKipcbiAqIEZpenp5IFVJIHV0aWxzIHYyLjAuN1xuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCB1bmRlZjogdHJ1ZSwgdW51c2VkOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLypqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cblxuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ2Rlc2FuZHJvLW1hdGNoZXMtc2VsZWN0b3IvbWF0Y2hlcy1zZWxlY3RvcidcbiAgICBdLCBmdW5jdGlvbiggbWF0Y2hlc1NlbGVjdG9yICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgbWF0Y2hlc1NlbGVjdG9yICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdkZXNhbmRyby1tYXRjaGVzLXNlbGVjdG9yJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LmZpenp5VUlVdGlscyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cubWF0Y2hlc1NlbGVjdG9yXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgbWF0Y2hlc1NlbGVjdG9yICkge1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHt9O1xuXG4vLyAtLS0tLSBleHRlbmQgLS0tLS0gLy9cblxuLy8gZXh0ZW5kcyBvYmplY3RzXG51dGlscy5leHRlbmQgPSBmdW5jdGlvbiggYSwgYiApIHtcbiAgZm9yICggdmFyIHByb3AgaW4gYiApIHtcbiAgICBhWyBwcm9wIF0gPSBiWyBwcm9wIF07XG4gIH1cbiAgcmV0dXJuIGE7XG59O1xuXG4vLyAtLS0tLSBtb2R1bG8gLS0tLS0gLy9cblxudXRpbHMubW9kdWxvID0gZnVuY3Rpb24oIG51bSwgZGl2ICkge1xuICByZXR1cm4gKCAoIG51bSAlIGRpdiApICsgZGl2ICkgJSBkaXY7XG59O1xuXG4vLyAtLS0tLSBtYWtlQXJyYXkgLS0tLS0gLy9cblxudmFyIGFycmF5U2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbi8vIHR1cm4gZWxlbWVudCBvciBub2RlTGlzdCBpbnRvIGFuIGFycmF5XG51dGlscy5tYWtlQXJyYXkgPSBmdW5jdGlvbiggb2JqICkge1xuICBpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuICAgIC8vIHVzZSBvYmplY3QgaWYgYWxyZWFkeSBhbiBhcnJheVxuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgLy8gcmV0dXJuIGVtcHR5IGFycmF5IGlmIHVuZGVmaW5lZCBvciBudWxsLiAjNlxuICBpZiAoIG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgaXNBcnJheUxpa2UgPSB0eXBlb2Ygb2JqID09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoubGVuZ3RoID09ICdudW1iZXInO1xuICBpZiAoIGlzQXJyYXlMaWtlICkge1xuICAgIC8vIGNvbnZlcnQgbm9kZUxpc3QgdG8gYXJyYXlcbiAgICByZXR1cm4gYXJyYXlTbGljZS5jYWxsKCBvYmogKTtcbiAgfVxuXG4gIC8vIGFycmF5IG9mIHNpbmdsZSBpbmRleFxuICByZXR1cm4gWyBvYmogXTtcbn07XG5cbi8vIC0tLS0tIHJlbW92ZUZyb20gLS0tLS0gLy9cblxudXRpbHMucmVtb3ZlRnJvbSA9IGZ1bmN0aW9uKCBhcnksIG9iaiApIHtcbiAgdmFyIGluZGV4ID0gYXJ5LmluZGV4T2YoIG9iaiApO1xuICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgIGFyeS5zcGxpY2UoIGluZGV4LCAxICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGdldFBhcmVudCAtLS0tLSAvL1xuXG51dGlscy5nZXRQYXJlbnQgPSBmdW5jdGlvbiggZWxlbSwgc2VsZWN0b3IgKSB7XG4gIHdoaWxlICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0gIT0gZG9jdW1lbnQuYm9keSApIHtcbiAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgcmV0dXJuIGVsZW07XG4gICAgfVxuICB9XG59O1xuXG4vLyAtLS0tLSBnZXRRdWVyeUVsZW1lbnQgLS0tLS0gLy9cblxuLy8gdXNlIGVsZW1lbnQgYXMgc2VsZWN0b3Igc3RyaW5nXG51dGlscy5nZXRRdWVyeUVsZW1lbnQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgaWYgKCB0eXBlb2YgZWxlbSA9PSAnc3RyaW5nJyApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggZWxlbSApO1xuICB9XG4gIHJldHVybiBlbGVtO1xufTtcblxuLy8gLS0tLS0gaGFuZGxlRXZlbnQgLS0tLS0gLy9cblxuLy8gZW5hYmxlIC5vbnR5cGUgdG8gdHJpZ2dlciBmcm9tIC5hZGRFdmVudExpc3RlbmVyKCBlbGVtLCAndHlwZScgKVxudXRpbHMuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBtZXRob2QgPSAnb24nICsgZXZlbnQudHlwZTtcbiAgaWYgKCB0aGlzWyBtZXRob2QgXSApIHtcbiAgICB0aGlzWyBtZXRob2QgXSggZXZlbnQgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gZmlsdGVyRmluZEVsZW1lbnRzIC0tLS0tIC8vXG5cbnV0aWxzLmZpbHRlckZpbmRFbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcywgc2VsZWN0b3IgKSB7XG4gIC8vIG1ha2UgYXJyYXkgb2YgZWxlbXNcbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHZhciBmZkVsZW1zID0gW107XG5cbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgLy8gY2hlY2sgdGhhdCBlbGVtIGlzIGFuIGFjdHVhbCBlbGVtZW50XG4gICAgaWYgKCAhKCBlbGVtIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgKSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYWRkIGVsZW0gaWYgbm8gc2VsZWN0b3JcbiAgICBpZiAoICFzZWxlY3RvciApIHtcbiAgICAgIGZmRWxlbXMucHVzaCggZWxlbSApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBmaWx0ZXIgJiBmaW5kIGl0ZW1zIGlmIHdlIGhhdmUgYSBzZWxlY3RvclxuICAgIC8vIGZpbHRlclxuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBlbGVtICk7XG4gICAgfVxuICAgIC8vIGZpbmQgY2hpbGRyZW5cbiAgICB2YXIgY2hpbGRFbGVtcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCggc2VsZWN0b3IgKTtcbiAgICAvLyBjb25jYXQgY2hpbGRFbGVtcyB0byBmaWx0ZXJGb3VuZCBhcnJheVxuICAgIGZvciAoIHZhciBpPTA7IGkgPCBjaGlsZEVsZW1zLmxlbmd0aDsgaSsrICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBjaGlsZEVsZW1zW2ldICk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZmZFbGVtcztcbn07XG5cbi8vIC0tLS0tIGRlYm91bmNlTWV0aG9kIC0tLS0tIC8vXG5cbnV0aWxzLmRlYm91bmNlTWV0aG9kID0gZnVuY3Rpb24oIF9jbGFzcywgbWV0aG9kTmFtZSwgdGhyZXNob2xkICkge1xuICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgfHwgMTAwO1xuICAvLyBvcmlnaW5hbCBtZXRob2RcbiAgdmFyIG1ldGhvZCA9IF9jbGFzcy5wcm90b3R5cGVbIG1ldGhvZE5hbWUgXTtcbiAgdmFyIHRpbWVvdXROYW1lID0gbWV0aG9kTmFtZSArICdUaW1lb3V0JztcblxuICBfY2xhc3MucHJvdG90eXBlWyBtZXRob2ROYW1lIF0gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGltZW91dCA9IHRoaXNbIHRpbWVvdXROYW1lIF07XG4gICAgY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXNbIHRpbWVvdXROYW1lIF0gPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcbiAgICAgIG1ldGhvZC5hcHBseSggX3RoaXMsIGFyZ3MgKTtcbiAgICAgIGRlbGV0ZSBfdGhpc1sgdGltZW91dE5hbWUgXTtcbiAgICB9LCB0aHJlc2hvbGQgKTtcbiAgfTtcbn07XG5cbi8vIC0tLS0tIGRvY1JlYWR5IC0tLS0tIC8vXG5cbnV0aWxzLmRvY1JlYWR5ID0gZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuICB2YXIgcmVhZHlTdGF0ZSA9IGRvY3VtZW50LnJlYWR5U3RhdGU7XG4gIGlmICggcmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnIHx8IHJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJyApIHtcbiAgICAvLyBkbyBhc3luYyB0byBhbGxvdyBmb3Igb3RoZXIgc2NyaXB0cyB0byBydW4uIG1ldGFmaXp6eS9mbGlja2l0eSM0NDFcbiAgICBzZXRUaW1lb3V0KCBjYWxsYmFjayApO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdET01Db250ZW50TG9hZGVkJywgY2FsbGJhY2sgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gaHRtbEluaXQgLS0tLS0gLy9cblxuLy8gaHR0cDovL2phbWVzcm9iZXJ0cy5uYW1lL2Jsb2cvMjAxMC8wMi8yMi9zdHJpbmctZnVuY3Rpb25zLWZvci1qYXZhc2NyaXB0LXRyaW0tdG8tY2FtZWwtY2FzZS10by1kYXNoZWQtYW5kLXRvLXVuZGVyc2NvcmUvXG51dGlscy50b0Rhc2hlZCA9IGZ1bmN0aW9uKCBzdHIgKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSggLyguKShbQS1aXSkvZywgZnVuY3Rpb24oIG1hdGNoLCAkMSwgJDIgKSB7XG4gICAgcmV0dXJuICQxICsgJy0nICsgJDI7XG4gIH0pLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlO1xuLyoqXG4gKiBhbGxvdyB1c2VyIHRvIGluaXRpYWxpemUgY2xhc3NlcyB2aWEgW2RhdGEtbmFtZXNwYWNlXSBvciAuanMtbmFtZXNwYWNlIGNsYXNzXG4gKiBodG1sSW5pdCggV2lkZ2V0LCAnd2lkZ2V0TmFtZScgKVxuICogb3B0aW9ucyBhcmUgcGFyc2VkIGZyb20gZGF0YS1uYW1lc3BhY2Utb3B0aW9uc1xuICovXG51dGlscy5odG1sSW5pdCA9IGZ1bmN0aW9uKCBXaWRnZXRDbGFzcywgbmFtZXNwYWNlICkge1xuICB1dGlscy5kb2NSZWFkeSggZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRhc2hlZE5hbWVzcGFjZSA9IHV0aWxzLnRvRGFzaGVkKCBuYW1lc3BhY2UgKTtcbiAgICB2YXIgZGF0YUF0dHIgPSAnZGF0YS0nICsgZGFzaGVkTmFtZXNwYWNlO1xuICAgIHZhciBkYXRhQXR0ckVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1snICsgZGF0YUF0dHIgKyAnXScgKTtcbiAgICB2YXIganNEYXNoRWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLmpzLScgKyBkYXNoZWROYW1lc3BhY2UgKTtcbiAgICB2YXIgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGRhdGFBdHRyRWxlbXMgKVxuICAgICAgLmNvbmNhdCggdXRpbHMubWFrZUFycmF5KCBqc0Rhc2hFbGVtcyApICk7XG4gICAgdmFyIGRhdGFPcHRpb25zQXR0ciA9IGRhdGFBdHRyICsgJy1vcHRpb25zJztcbiAgICB2YXIgalF1ZXJ5ID0gd2luZG93LmpRdWVyeTtcblxuICAgIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgICAgdmFyIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YUF0dHIgKSB8fFxuICAgICAgICBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YU9wdGlvbnNBdHRyICk7XG4gICAgICB2YXIgb3B0aW9ucztcbiAgICAgIHRyeSB7XG4gICAgICAgIG9wdGlvbnMgPSBhdHRyICYmIEpTT04ucGFyc2UoIGF0dHIgKTtcbiAgICAgIH0gY2F0Y2ggKCBlcnJvciApIHtcbiAgICAgICAgLy8gbG9nIGVycm9yLCBkbyBub3QgaW5pdGlhbGl6ZVxuICAgICAgICBpZiAoIGNvbnNvbGUgKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvciggJ0Vycm9yIHBhcnNpbmcgJyArIGRhdGFBdHRyICsgJyBvbiAnICsgZWxlbS5jbGFzc05hbWUgK1xuICAgICAgICAgICc6ICcgKyBlcnJvciApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGluaXRpYWxpemVcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBXaWRnZXRDbGFzcyggZWxlbSwgb3B0aW9ucyApO1xuICAgICAgLy8gbWFrZSBhdmFpbGFibGUgdmlhICQoKS5kYXRhKCduYW1lc3BhY2UnKVxuICAgICAgaWYgKCBqUXVlcnkgKSB7XG4gICAgICAgIGpRdWVyeS5kYXRhKCBlbGVtLCBuYW1lc3BhY2UsIGluc3RhbmNlICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfSk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIHV0aWxzO1xuXG59KSk7XG4iLCIvKiFcbiAqIGdldFNpemUgdjIuMC4zXG4gKiBtZWFzdXJlIHNpemUgb2YgZWxlbWVudHNcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLyoganNoaW50IGJyb3dzZXI6IHRydWUsIHN0cmljdDogdHJ1ZSwgdW5kZWY6IHRydWUsIHVudXNlZDogdHJ1ZSAqL1xuLyogZ2xvYmFscyBjb25zb2xlOiBmYWxzZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIGZhY3RvcnkgKTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LmdldFNpemUgPSBmYWN0b3J5KCk7XG4gIH1cblxufSkoIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSgpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBnZXQgYSBudW1iZXIgZnJvbSBhIHN0cmluZywgbm90IGEgcGVyY2VudGFnZVxuZnVuY3Rpb24gZ2V0U3R5bGVTaXplKCB2YWx1ZSApIHtcbiAgdmFyIG51bSA9IHBhcnNlRmxvYXQoIHZhbHVlICk7XG4gIC8vIG5vdCBhIHBlcmNlbnQgbGlrZSAnMTAwJScsIGFuZCBhIG51bWJlclxuICB2YXIgaXNWYWxpZCA9IHZhbHVlLmluZGV4T2YoJyUnKSA9PSAtMSAmJiAhaXNOYU4oIG51bSApO1xuICByZXR1cm4gaXNWYWxpZCAmJiBudW07XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG52YXIgbG9nRXJyb3IgPSB0eXBlb2YgY29uc29sZSA9PSAndW5kZWZpbmVkJyA/IG5vb3AgOlxuICBmdW5jdGlvbiggbWVzc2FnZSApIHtcbiAgICBjb25zb2xlLmVycm9yKCBtZXNzYWdlICk7XG4gIH07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lYXN1cmVtZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgbWVhc3VyZW1lbnRzID0gW1xuICAncGFkZGluZ0xlZnQnLFxuICAncGFkZGluZ1JpZ2h0JyxcbiAgJ3BhZGRpbmdUb3AnLFxuICAncGFkZGluZ0JvdHRvbScsXG4gICdtYXJnaW5MZWZ0JyxcbiAgJ21hcmdpblJpZ2h0JyxcbiAgJ21hcmdpblRvcCcsXG4gICdtYXJnaW5Cb3R0b20nLFxuICAnYm9yZGVyTGVmdFdpZHRoJyxcbiAgJ2JvcmRlclJpZ2h0V2lkdGgnLFxuICAnYm9yZGVyVG9wV2lkdGgnLFxuICAnYm9yZGVyQm90dG9tV2lkdGgnXG5dO1xuXG52YXIgbWVhc3VyZW1lbnRzTGVuZ3RoID0gbWVhc3VyZW1lbnRzLmxlbmd0aDtcblxuZnVuY3Rpb24gZ2V0WmVyb1NpemUoKSB7XG4gIHZhciBzaXplID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMCxcbiAgICBpbm5lcldpZHRoOiAwLFxuICAgIGlubmVySGVpZ2h0OiAwLFxuICAgIG91dGVyV2lkdGg6IDAsXG4gICAgb3V0ZXJIZWlnaHQ6IDBcbiAgfTtcbiAgZm9yICggdmFyIGk9MDsgaSA8IG1lYXN1cmVtZW50c0xlbmd0aDsgaSsrICkge1xuICAgIHZhciBtZWFzdXJlbWVudCA9IG1lYXN1cmVtZW50c1tpXTtcbiAgICBzaXplWyBtZWFzdXJlbWVudCBdID0gMDtcbiAgfVxuICByZXR1cm4gc2l6ZTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2V0U3R5bGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBnZXRTdHlsZSwgZ2V0IHN0eWxlIG9mIGVsZW1lbnQsIGNoZWNrIGZvciBGaXJlZm94IGJ1Z1xuICogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQ4Mzk3XG4gKi9cbmZ1bmN0aW9uIGdldFN0eWxlKCBlbGVtICkge1xuICB2YXIgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG4gIGlmICggIXN0eWxlICkge1xuICAgIGxvZ0Vycm9yKCAnU3R5bGUgcmV0dXJuZWQgJyArIHN0eWxlICtcbiAgICAgICcuIEFyZSB5b3UgcnVubmluZyB0aGlzIGNvZGUgaW4gYSBoaWRkZW4gaWZyYW1lIG9uIEZpcmVmb3g/ICcgK1xuICAgICAgJ1NlZSBodHRwczovL2JpdC5seS9nZXRzaXplYnVnMScgKTtcbiAgfVxuICByZXR1cm4gc3R5bGU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNldHVwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnZhciBpc1NldHVwID0gZmFsc2U7XG5cbnZhciBpc0JveFNpemVPdXRlcjtcblxuLyoqXG4gKiBzZXR1cFxuICogY2hlY2sgaXNCb3hTaXplck91dGVyXG4gKiBkbyBvbiBmaXJzdCBnZXRTaXplKCkgcmF0aGVyIHRoYW4gb24gcGFnZSBsb2FkIGZvciBGaXJlZm94IGJ1Z1xuICovXG5mdW5jdGlvbiBzZXR1cCgpIHtcbiAgLy8gc2V0dXAgb25jZVxuICBpZiAoIGlzU2V0dXAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzU2V0dXAgPSB0cnVlO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGJveCBzaXppbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAvKipcbiAgICogQ2hyb21lICYgU2FmYXJpIG1lYXN1cmUgdGhlIG91dGVyLXdpZHRoIG9uIHN0eWxlLndpZHRoIG9uIGJvcmRlci1ib3ggZWxlbXNcbiAgICogSUUxMSAmIEZpcmVmb3g8MjkgbWVhc3VyZXMgdGhlIGlubmVyLXdpZHRoXG4gICAqL1xuICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGRpdi5zdHlsZS53aWR0aCA9ICcyMDBweCc7XG4gIGRpdi5zdHlsZS5wYWRkaW5nID0gJzFweCAycHggM3B4IDRweCc7XG4gIGRpdi5zdHlsZS5ib3JkZXJTdHlsZSA9ICdzb2xpZCc7XG4gIGRpdi5zdHlsZS5ib3JkZXJXaWR0aCA9ICcxcHggMnB4IDNweCA0cHgnO1xuICBkaXYuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuXG4gIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIGJvZHkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuICB2YXIgc3R5bGUgPSBnZXRTdHlsZSggZGl2ICk7XG4gIC8vIHJvdW5kIHZhbHVlIGZvciBicm93c2VyIHpvb20uIGRlc2FuZHJvL21hc29ucnkjOTI4XG4gIGlzQm94U2l6ZU91dGVyID0gTWF0aC5yb3VuZCggZ2V0U3R5bGVTaXplKCBzdHlsZS53aWR0aCApICkgPT0gMjAwO1xuICBnZXRTaXplLmlzQm94U2l6ZU91dGVyID0gaXNCb3hTaXplT3V0ZXI7XG5cbiAgYm9keS5yZW1vdmVDaGlsZCggZGl2ICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdldFNpemUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gZ2V0U2l6ZSggZWxlbSApIHtcbiAgc2V0dXAoKTtcblxuICAvLyB1c2UgcXVlcnlTZWxldG9yIGlmIGVsZW0gaXMgc3RyaW5nXG4gIGlmICggdHlwZW9mIGVsZW0gPT0gJ3N0cmluZycgKSB7XG4gICAgZWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGVsZW0gKTtcbiAgfVxuXG4gIC8vIGRvIG5vdCBwcm9jZWVkIG9uIG5vbi1vYmplY3RzXG4gIGlmICggIWVsZW0gfHwgdHlwZW9mIGVsZW0gIT0gJ29iamVjdCcgfHwgIWVsZW0ubm9kZVR5cGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHN0eWxlID0gZ2V0U3R5bGUoIGVsZW0gKTtcblxuICAvLyBpZiBoaWRkZW4sIGV2ZXJ5dGhpbmcgaXMgMFxuICBpZiAoIHN0eWxlLmRpc3BsYXkgPT0gJ25vbmUnICkge1xuICAgIHJldHVybiBnZXRaZXJvU2l6ZSgpO1xuICB9XG5cbiAgdmFyIHNpemUgPSB7fTtcbiAgc2l6ZS53aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGg7XG4gIHNpemUuaGVpZ2h0ID0gZWxlbS5vZmZzZXRIZWlnaHQ7XG5cbiAgdmFyIGlzQm9yZGVyQm94ID0gc2l6ZS5pc0JvcmRlckJveCA9IHN0eWxlLmJveFNpemluZyA9PSAnYm9yZGVyLWJveCc7XG5cbiAgLy8gZ2V0IGFsbCBtZWFzdXJlbWVudHNcbiAgZm9yICggdmFyIGk9MDsgaSA8IG1lYXN1cmVtZW50c0xlbmd0aDsgaSsrICkge1xuICAgIHZhciBtZWFzdXJlbWVudCA9IG1lYXN1cmVtZW50c1tpXTtcbiAgICB2YXIgdmFsdWUgPSBzdHlsZVsgbWVhc3VyZW1lbnQgXTtcbiAgICB2YXIgbnVtID0gcGFyc2VGbG9hdCggdmFsdWUgKTtcbiAgICAvLyBhbnkgJ2F1dG8nLCAnbWVkaXVtJyB2YWx1ZSB3aWxsIGJlIDBcbiAgICBzaXplWyBtZWFzdXJlbWVudCBdID0gIWlzTmFOKCBudW0gKSA/IG51bSA6IDA7XG4gIH1cblxuICB2YXIgcGFkZGluZ1dpZHRoID0gc2l6ZS5wYWRkaW5nTGVmdCArIHNpemUucGFkZGluZ1JpZ2h0O1xuICB2YXIgcGFkZGluZ0hlaWdodCA9IHNpemUucGFkZGluZ1RvcCArIHNpemUucGFkZGluZ0JvdHRvbTtcbiAgdmFyIG1hcmdpbldpZHRoID0gc2l6ZS5tYXJnaW5MZWZ0ICsgc2l6ZS5tYXJnaW5SaWdodDtcbiAgdmFyIG1hcmdpbkhlaWdodCA9IHNpemUubWFyZ2luVG9wICsgc2l6ZS5tYXJnaW5Cb3R0b207XG4gIHZhciBib3JkZXJXaWR0aCA9IHNpemUuYm9yZGVyTGVmdFdpZHRoICsgc2l6ZS5ib3JkZXJSaWdodFdpZHRoO1xuICB2YXIgYm9yZGVySGVpZ2h0ID0gc2l6ZS5ib3JkZXJUb3BXaWR0aCArIHNpemUuYm9yZGVyQm90dG9tV2lkdGg7XG5cbiAgdmFyIGlzQm9yZGVyQm94U2l6ZU91dGVyID0gaXNCb3JkZXJCb3ggJiYgaXNCb3hTaXplT3V0ZXI7XG5cbiAgLy8gb3ZlcndyaXRlIHdpZHRoIGFuZCBoZWlnaHQgaWYgd2UgY2FuIGdldCBpdCBmcm9tIHN0eWxlXG4gIHZhciBzdHlsZVdpZHRoID0gZ2V0U3R5bGVTaXplKCBzdHlsZS53aWR0aCApO1xuICBpZiAoIHN0eWxlV2lkdGggIT09IGZhbHNlICkge1xuICAgIHNpemUud2lkdGggPSBzdHlsZVdpZHRoICtcbiAgICAgIC8vIGFkZCBwYWRkaW5nIGFuZCBib3JkZXIgdW5sZXNzIGl0J3MgYWxyZWFkeSBpbmNsdWRpbmcgaXRcbiAgICAgICggaXNCb3JkZXJCb3hTaXplT3V0ZXIgPyAwIDogcGFkZGluZ1dpZHRoICsgYm9yZGVyV2lkdGggKTtcbiAgfVxuXG4gIHZhciBzdHlsZUhlaWdodCA9IGdldFN0eWxlU2l6ZSggc3R5bGUuaGVpZ2h0ICk7XG4gIGlmICggc3R5bGVIZWlnaHQgIT09IGZhbHNlICkge1xuICAgIHNpemUuaGVpZ2h0ID0gc3R5bGVIZWlnaHQgK1xuICAgICAgLy8gYWRkIHBhZGRpbmcgYW5kIGJvcmRlciB1bmxlc3MgaXQncyBhbHJlYWR5IGluY2x1ZGluZyBpdFxuICAgICAgKCBpc0JvcmRlckJveFNpemVPdXRlciA/IDAgOiBwYWRkaW5nSGVpZ2h0ICsgYm9yZGVySGVpZ2h0ICk7XG4gIH1cblxuICBzaXplLmlubmVyV2lkdGggPSBzaXplLndpZHRoIC0gKCBwYWRkaW5nV2lkdGggKyBib3JkZXJXaWR0aCApO1xuICBzaXplLmlubmVySGVpZ2h0ID0gc2l6ZS5oZWlnaHQgLSAoIHBhZGRpbmdIZWlnaHQgKyBib3JkZXJIZWlnaHQgKTtcblxuICBzaXplLm91dGVyV2lkdGggPSBzaXplLndpZHRoICsgbWFyZ2luV2lkdGg7XG4gIHNpemUub3V0ZXJIZWlnaHQgPSBzaXplLmhlaWdodCArIG1hcmdpbkhlaWdodDtcblxuICByZXR1cm4gc2l6ZTtcbn1cblxucmV0dXJuIGdldFNpemU7XG5cbn0pO1xuIiwiLyohXG4gKiBpbWFnZXNMb2FkZWQgdjQuMS40XG4gKiBKYXZhU2NyaXB0IGlzIGFsbCBsaWtlIFwiWW91IGltYWdlcyBhcmUgZG9uZSB5ZXQgb3Igd2hhdD9cIlxuICogTUlUIExpY2Vuc2VcbiAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7ICd1c2Ugc3RyaWN0JztcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG5cbiAgLypnbG9iYWwgZGVmaW5lOiBmYWxzZSwgbW9kdWxlOiBmYWxzZSwgcmVxdWlyZTogZmFsc2UgKi9cblxuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ2V2LWVtaXR0ZXIvZXYtZW1pdHRlcidcbiAgICBdLCBmdW5jdGlvbiggRXZFbWl0dGVyICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdldi1lbWl0dGVyJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LmltYWdlc0xvYWRlZCA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuRXZFbWl0dGVyXG4gICAgKTtcbiAgfVxuXG59KSggdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0aGlzLFxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgZmFjdG9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5mdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciApIHtcblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgJCA9IHdpbmRvdy5qUXVlcnk7XG52YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGV4dGVuZCBvYmplY3RzXG5mdW5jdGlvbiBleHRlbmQoIGEsIGIgKSB7XG4gIGZvciAoIHZhciBwcm9wIGluIGIgKSB7XG4gICAgYVsgcHJvcCBdID0gYlsgcHJvcCBdO1xuICB9XG4gIHJldHVybiBhO1xufVxuXG52YXIgYXJyYXlTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuLy8gdHVybiBlbGVtZW50IG9yIG5vZGVMaXN0IGludG8gYW4gYXJyYXlcbmZ1bmN0aW9uIG1ha2VBcnJheSggb2JqICkge1xuICBpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuICAgIC8vIHVzZSBvYmplY3QgaWYgYWxyZWFkeSBhbiBhcnJheVxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIgaXNBcnJheUxpa2UgPSB0eXBlb2Ygb2JqID09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoubGVuZ3RoID09ICdudW1iZXInO1xuICBpZiAoIGlzQXJyYXlMaWtlICkge1xuICAgIC8vIGNvbnZlcnQgbm9kZUxpc3QgdG8gYXJyYXlcbiAgICByZXR1cm4gYXJyYXlTbGljZS5jYWxsKCBvYmogKTtcbiAgfVxuXG4gIC8vIGFycmF5IG9mIHNpbmdsZSBpbmRleFxuICByZXR1cm4gWyBvYmogXTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW1hZ2VzTG9hZGVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogQHBhcmFtIHtBcnJheSwgRWxlbWVudCwgTm9kZUxpc3QsIFN0cmluZ30gZWxlbVxuICogQHBhcmFtIHtPYmplY3Qgb3IgRnVuY3Rpb259IG9wdGlvbnMgLSBpZiBmdW5jdGlvbiwgdXNlIGFzIGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkFsd2F5cyAtIGNhbGxiYWNrIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIEltYWdlc0xvYWRlZCggZWxlbSwgb3B0aW9ucywgb25BbHdheXMgKSB7XG4gIC8vIGNvZXJjZSBJbWFnZXNMb2FkZWQoKSB3aXRob3V0IG5ldywgdG8gYmUgbmV3IEltYWdlc0xvYWRlZCgpXG4gIGlmICggISggdGhpcyBpbnN0YW5jZW9mIEltYWdlc0xvYWRlZCApICkge1xuICAgIHJldHVybiBuZXcgSW1hZ2VzTG9hZGVkKCBlbGVtLCBvcHRpb25zLCBvbkFsd2F5cyApO1xuICB9XG4gIC8vIHVzZSBlbGVtIGFzIHNlbGVjdG9yIHN0cmluZ1xuICB2YXIgcXVlcnlFbGVtID0gZWxlbTtcbiAgaWYgKCB0eXBlb2YgZWxlbSA9PSAnc3RyaW5nJyApIHtcbiAgICBxdWVyeUVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCBlbGVtICk7XG4gIH1cbiAgLy8gYmFpbCBpZiBiYWQgZWxlbWVudFxuICBpZiAoICFxdWVyeUVsZW0gKSB7XG4gICAgY29uc29sZS5lcnJvciggJ0JhZCBlbGVtZW50IGZvciBpbWFnZXNMb2FkZWQgJyArICggcXVlcnlFbGVtIHx8IGVsZW0gKSApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuZWxlbWVudHMgPSBtYWtlQXJyYXkoIHF1ZXJ5RWxlbSApO1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoIHt9LCB0aGlzLm9wdGlvbnMgKTtcbiAgLy8gc2hpZnQgYXJndW1lbnRzIGlmIG5vIG9wdGlvbnMgc2V0XG4gIGlmICggdHlwZW9mIG9wdGlvbnMgPT0gJ2Z1bmN0aW9uJyApIHtcbiAgICBvbkFsd2F5cyA9IG9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgZXh0ZW5kKCB0aGlzLm9wdGlvbnMsIG9wdGlvbnMgKTtcbiAgfVxuXG4gIGlmICggb25BbHdheXMgKSB7XG4gICAgdGhpcy5vbiggJ2Fsd2F5cycsIG9uQWx3YXlzICk7XG4gIH1cblxuICB0aGlzLmdldEltYWdlcygpO1xuXG4gIGlmICggJCApIHtcbiAgICAvLyBhZGQgalF1ZXJ5IERlZmVycmVkIG9iamVjdFxuICAgIHRoaXMuanFEZWZlcnJlZCA9IG5ldyAkLkRlZmVycmVkKCk7XG4gIH1cblxuICAvLyBIQUNLIGNoZWNrIGFzeW5jIHRvIGFsbG93IHRpbWUgdG8gYmluZCBsaXN0ZW5lcnNcbiAgc2V0VGltZW91dCggdGhpcy5jaGVjay5iaW5kKCB0aGlzICkgKTtcbn1cblxuSW1hZ2VzTG9hZGVkLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV2RW1pdHRlci5wcm90b3R5cGUgKTtcblxuSW1hZ2VzTG9hZGVkLnByb3RvdHlwZS5vcHRpb25zID0ge307XG5cbkltYWdlc0xvYWRlZC5wcm90b3R5cGUuZ2V0SW1hZ2VzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuaW1hZ2VzID0gW107XG5cbiAgLy8gZmlsdGVyICYgZmluZCBpdGVtcyBpZiB3ZSBoYXZlIGFuIGl0ZW0gc2VsZWN0b3JcbiAgdGhpcy5lbGVtZW50cy5mb3JFYWNoKCB0aGlzLmFkZEVsZW1lbnRJbWFnZXMsIHRoaXMgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gKi9cbkltYWdlc0xvYWRlZC5wcm90b3R5cGUuYWRkRWxlbWVudEltYWdlcyA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICAvLyBmaWx0ZXIgc2libGluZ3NcbiAgaWYgKCBlbGVtLm5vZGVOYW1lID09ICdJTUcnICkge1xuICAgIHRoaXMuYWRkSW1hZ2UoIGVsZW0gKTtcbiAgfVxuICAvLyBnZXQgYmFja2dyb3VuZCBpbWFnZSBvbiBlbGVtZW50XG4gIGlmICggdGhpcy5vcHRpb25zLmJhY2tncm91bmQgPT09IHRydWUgKSB7XG4gICAgdGhpcy5hZGRFbGVtZW50QmFja2dyb3VuZEltYWdlcyggZWxlbSApO1xuICB9XG5cbiAgLy8gZmluZCBjaGlsZHJlblxuICAvLyBubyBub24tZWxlbWVudCBub2RlcywgIzE0M1xuICB2YXIgbm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuICBpZiAoICFub2RlVHlwZSB8fCAhZWxlbWVudE5vZGVUeXBlc1sgbm9kZVR5cGUgXSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGNoaWxkSW1ncyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCgnaW1nJyk7XG4gIC8vIGNvbmNhdCBjaGlsZEVsZW1zIHRvIGZpbHRlckZvdW5kIGFycmF5XG4gIGZvciAoIHZhciBpPTA7IGkgPCBjaGlsZEltZ3MubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIGltZyA9IGNoaWxkSW1nc1tpXTtcbiAgICB0aGlzLmFkZEltYWdlKCBpbWcgKTtcbiAgfVxuXG4gIC8vIGdldCBjaGlsZCBiYWNrZ3JvdW5kIGltYWdlc1xuICBpZiAoIHR5cGVvZiB0aGlzLm9wdGlvbnMuYmFja2dyb3VuZCA9PSAnc3RyaW5nJyApIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoIHRoaXMub3B0aW9ucy5iYWNrZ3JvdW5kICk7XG4gICAgZm9yICggaT0wOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKSB7XG4gICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIHRoaXMuYWRkRWxlbWVudEJhY2tncm91bmRJbWFnZXMoIGNoaWxkICk7XG4gICAgfVxuICB9XG59O1xuXG52YXIgZWxlbWVudE5vZGVUeXBlcyA9IHtcbiAgMTogdHJ1ZSxcbiAgOTogdHJ1ZSxcbiAgMTE6IHRydWVcbn07XG5cbkltYWdlc0xvYWRlZC5wcm90b3R5cGUuYWRkRWxlbWVudEJhY2tncm91bmRJbWFnZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuICBpZiAoICFzdHlsZSApIHtcbiAgICAvLyBGaXJlZm94IHJldHVybnMgbnVsbCBpZiBpbiBhIGhpZGRlbiBpZnJhbWUgaHR0cHM6Ly9idWd6aWwubGEvNTQ4Mzk3XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGdldCB1cmwgaW5zaWRlIHVybChcIi4uLlwiKVxuICB2YXIgcmVVUkwgPSAvdXJsXFwoKFsnXCJdKT8oLio/KVxcMVxcKS9naTtcbiAgdmFyIG1hdGNoZXMgPSByZVVSTC5leGVjKCBzdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgKTtcbiAgd2hpbGUgKCBtYXRjaGVzICE9PSBudWxsICkge1xuICAgIHZhciB1cmwgPSBtYXRjaGVzICYmIG1hdGNoZXNbMl07XG4gICAgaWYgKCB1cmwgKSB7XG4gICAgICB0aGlzLmFkZEJhY2tncm91bmQoIHVybCwgZWxlbSApO1xuICAgIH1cbiAgICBtYXRjaGVzID0gcmVVUkwuZXhlYyggc3R5bGUuYmFja2dyb3VuZEltYWdlICk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtJbWFnZX0gaW1nXG4gKi9cbkltYWdlc0xvYWRlZC5wcm90b3R5cGUuYWRkSW1hZ2UgPSBmdW5jdGlvbiggaW1nICkge1xuICB2YXIgbG9hZGluZ0ltYWdlID0gbmV3IExvYWRpbmdJbWFnZSggaW1nICk7XG4gIHRoaXMuaW1hZ2VzLnB1c2goIGxvYWRpbmdJbWFnZSApO1xufTtcblxuSW1hZ2VzTG9hZGVkLnByb3RvdHlwZS5hZGRCYWNrZ3JvdW5kID0gZnVuY3Rpb24oIHVybCwgZWxlbSApIHtcbiAgdmFyIGJhY2tncm91bmQgPSBuZXcgQmFja2dyb3VuZCggdXJsLCBlbGVtICk7XG4gIHRoaXMuaW1hZ2VzLnB1c2goIGJhY2tncm91bmQgKTtcbn07XG5cbkltYWdlc0xvYWRlZC5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcbiAgdGhpcy5wcm9ncmVzc2VkQ291bnQgPSAwO1xuICB0aGlzLmhhc0FueUJyb2tlbiA9IGZhbHNlO1xuICAvLyBjb21wbGV0ZSBpZiBubyBpbWFnZXNcbiAgaWYgKCAhdGhpcy5pbWFnZXMubGVuZ3RoICkge1xuICAgIHRoaXMuY29tcGxldGUoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmdW5jdGlvbiBvblByb2dyZXNzKCBpbWFnZSwgZWxlbSwgbWVzc2FnZSApIHtcbiAgICAvLyBIQUNLIC0gQ2hyb21lIHRyaWdnZXJzIGV2ZW50IGJlZm9yZSBvYmplY3QgcHJvcGVydGllcyBoYXZlIGNoYW5nZWQuICM4M1xuICAgIHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgICAgX3RoaXMucHJvZ3Jlc3MoIGltYWdlLCBlbGVtLCBtZXNzYWdlICk7XG4gICAgfSk7XG4gIH1cblxuICB0aGlzLmltYWdlcy5mb3JFYWNoKCBmdW5jdGlvbiggbG9hZGluZ0ltYWdlICkge1xuICAgIGxvYWRpbmdJbWFnZS5vbmNlKCAncHJvZ3Jlc3MnLCBvblByb2dyZXNzICk7XG4gICAgbG9hZGluZ0ltYWdlLmNoZWNrKCk7XG4gIH0pO1xufTtcblxuSW1hZ2VzTG9hZGVkLnByb3RvdHlwZS5wcm9ncmVzcyA9IGZ1bmN0aW9uKCBpbWFnZSwgZWxlbSwgbWVzc2FnZSApIHtcbiAgdGhpcy5wcm9ncmVzc2VkQ291bnQrKztcbiAgdGhpcy5oYXNBbnlCcm9rZW4gPSB0aGlzLmhhc0FueUJyb2tlbiB8fCAhaW1hZ2UuaXNMb2FkZWQ7XG4gIC8vIHByb2dyZXNzIGV2ZW50XG4gIHRoaXMuZW1pdEV2ZW50KCAncHJvZ3Jlc3MnLCBbIHRoaXMsIGltYWdlLCBlbGVtIF0gKTtcbiAgaWYgKCB0aGlzLmpxRGVmZXJyZWQgJiYgdGhpcy5qcURlZmVycmVkLm5vdGlmeSApIHtcbiAgICB0aGlzLmpxRGVmZXJyZWQubm90aWZ5KCB0aGlzLCBpbWFnZSApO1xuICB9XG4gIC8vIGNoZWNrIGlmIGNvbXBsZXRlZFxuICBpZiAoIHRoaXMucHJvZ3Jlc3NlZENvdW50ID09IHRoaXMuaW1hZ2VzLmxlbmd0aCApIHtcbiAgICB0aGlzLmNvbXBsZXRlKCk7XG4gIH1cblxuICBpZiAoIHRoaXMub3B0aW9ucy5kZWJ1ZyAmJiBjb25zb2xlICkge1xuICAgIGNvbnNvbGUubG9nKCAncHJvZ3Jlc3M6ICcgKyBtZXNzYWdlLCBpbWFnZSwgZWxlbSApO1xuICB9XG59O1xuXG5JbWFnZXNMb2FkZWQucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBldmVudE5hbWUgPSB0aGlzLmhhc0FueUJyb2tlbiA/ICdmYWlsJyA6ICdkb25lJztcbiAgdGhpcy5pc0NvbXBsZXRlID0gdHJ1ZTtcbiAgdGhpcy5lbWl0RXZlbnQoIGV2ZW50TmFtZSwgWyB0aGlzIF0gKTtcbiAgdGhpcy5lbWl0RXZlbnQoICdhbHdheXMnLCBbIHRoaXMgXSApO1xuICBpZiAoIHRoaXMuanFEZWZlcnJlZCApIHtcbiAgICB2YXIganFNZXRob2QgPSB0aGlzLmhhc0FueUJyb2tlbiA/ICdyZWplY3QnIDogJ3Jlc29sdmUnO1xuICAgIHRoaXMuanFEZWZlcnJlZFsganFNZXRob2QgXSggdGhpcyApO1xuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gTG9hZGluZ0ltYWdlKCBpbWcgKSB7XG4gIHRoaXMuaW1nID0gaW1nO1xufVxuXG5Mb2FkaW5nSW1hZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXZFbWl0dGVyLnByb3RvdHlwZSApO1xuXG5Mb2FkaW5nSW1hZ2UucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24oKSB7XG4gIC8vIElmIGNvbXBsZXRlIGlzIHRydWUgYW5kIGJyb3dzZXIgc3VwcG9ydHMgbmF0dXJhbCBzaXplcyxcbiAgLy8gdHJ5IHRvIGNoZWNrIGZvciBpbWFnZSBzdGF0dXMgbWFudWFsbHkuXG4gIHZhciBpc0NvbXBsZXRlID0gdGhpcy5nZXRJc0ltYWdlQ29tcGxldGUoKTtcbiAgaWYgKCBpc0NvbXBsZXRlICkge1xuICAgIC8vIHJlcG9ydCBiYXNlZCBvbiBuYXR1cmFsV2lkdGhcbiAgICB0aGlzLmNvbmZpcm0oIHRoaXMuaW1nLm5hdHVyYWxXaWR0aCAhPT0gMCwgJ25hdHVyYWxXaWR0aCcgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJZiBub25lIG9mIHRoZSBjaGVja3MgYWJvdmUgbWF0Y2hlZCwgc2ltdWxhdGUgbG9hZGluZyBvbiBkZXRhY2hlZCBlbGVtZW50LlxuICB0aGlzLnByb3h5SW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgdGhpcy5wcm94eUltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgdGhpcyApO1xuICB0aGlzLnByb3h5SW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgdGhpcyApO1xuICAvLyBiaW5kIHRvIGltYWdlIGFzIHdlbGwgZm9yIEZpcmVmb3guICMxOTFcbiAgdGhpcy5pbWcuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCB0aGlzICk7XG4gIHRoaXMuaW1nLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIHRoaXMgKTtcbiAgdGhpcy5wcm94eUltYWdlLnNyYyA9IHRoaXMuaW1nLnNyYztcbn07XG5cbkxvYWRpbmdJbWFnZS5wcm90b3R5cGUuZ2V0SXNJbWFnZUNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNoZWNrIGZvciBub24temVybywgbm9uLXVuZGVmaW5lZCBuYXR1cmFsV2lkdGhcbiAgLy8gZml4ZXMgU2FmYXJpK0luZmluaXRlU2Nyb2xsK01hc29ucnkgYnVnIGluZmluaXRlLXNjcm9sbCM2NzFcbiAgcmV0dXJuIHRoaXMuaW1nLmNvbXBsZXRlICYmIHRoaXMuaW1nLm5hdHVyYWxXaWR0aDtcbn07XG5cbkxvYWRpbmdJbWFnZS5wcm90b3R5cGUuY29uZmlybSA9IGZ1bmN0aW9uKCBpc0xvYWRlZCwgbWVzc2FnZSApIHtcbiAgdGhpcy5pc0xvYWRlZCA9IGlzTG9hZGVkO1xuICB0aGlzLmVtaXRFdmVudCggJ3Byb2dyZXNzJywgWyB0aGlzLCB0aGlzLmltZywgbWVzc2FnZSBdICk7XG59O1xuXG4vLyAtLS0tLSBldmVudHMgLS0tLS0gLy9cblxuLy8gdHJpZ2dlciBzcGVjaWZpZWQgaGFuZGxlciBmb3IgZXZlbnQgdHlwZVxuTG9hZGluZ0ltYWdlLnByb3RvdHlwZS5oYW5kbGVFdmVudCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIG1ldGhvZCA9ICdvbicgKyBldmVudC50eXBlO1xuICBpZiAoIHRoaXNbIG1ldGhvZCBdICkge1xuICAgIHRoaXNbIG1ldGhvZCBdKCBldmVudCApO1xuICB9XG59O1xuXG5Mb2FkaW5nSW1hZ2UucHJvdG90eXBlLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNvbmZpcm0oIHRydWUsICdvbmxvYWQnICk7XG4gIHRoaXMudW5iaW5kRXZlbnRzKCk7XG59O1xuXG5Mb2FkaW5nSW1hZ2UucHJvdG90eXBlLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5jb25maXJtKCBmYWxzZSwgJ29uZXJyb3InICk7XG4gIHRoaXMudW5iaW5kRXZlbnRzKCk7XG59O1xuXG5Mb2FkaW5nSW1hZ2UucHJvdG90eXBlLnVuYmluZEV2ZW50cyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnByb3h5SW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCB0aGlzICk7XG4gIHRoaXMucHJveHlJbWFnZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZXJyb3InLCB0aGlzICk7XG4gIHRoaXMuaW1nLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdsb2FkJywgdGhpcyApO1xuICB0aGlzLmltZy5yZW1vdmVFdmVudExpc3RlbmVyKCAnZXJyb3InLCB0aGlzICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCYWNrZ3JvdW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIEJhY2tncm91bmQoIHVybCwgZWxlbWVudCApIHtcbiAgdGhpcy51cmwgPSB1cmw7XG4gIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gIHRoaXMuaW1nID0gbmV3IEltYWdlKCk7XG59XG5cbi8vIGluaGVyaXQgTG9hZGluZ0ltYWdlIHByb3RvdHlwZVxuQmFja2dyb3VuZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMb2FkaW5nSW1hZ2UucHJvdG90eXBlICk7XG5cbkJhY2tncm91bmQucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuaW1nLmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgdGhpcyApO1xuICB0aGlzLmltZy5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCB0aGlzICk7XG4gIHRoaXMuaW1nLnNyYyA9IHRoaXMudXJsO1xuICAvLyBjaGVjayBpZiBpbWFnZSBpcyBhbHJlYWR5IGNvbXBsZXRlXG4gIHZhciBpc0NvbXBsZXRlID0gdGhpcy5nZXRJc0ltYWdlQ29tcGxldGUoKTtcbiAgaWYgKCBpc0NvbXBsZXRlICkge1xuICAgIHRoaXMuY29uZmlybSggdGhpcy5pbWcubmF0dXJhbFdpZHRoICE9PSAwLCAnbmF0dXJhbFdpZHRoJyApO1xuICAgIHRoaXMudW5iaW5kRXZlbnRzKCk7XG4gIH1cbn07XG5cbkJhY2tncm91bmQucHJvdG90eXBlLnVuYmluZEV2ZW50cyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmltZy5yZW1vdmVFdmVudExpc3RlbmVyKCAnbG9hZCcsIHRoaXMgKTtcbiAgdGhpcy5pbWcucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgdGhpcyApO1xufTtcblxuQmFja2dyb3VuZC5wcm90b3R5cGUuY29uZmlybSA9IGZ1bmN0aW9uKCBpc0xvYWRlZCwgbWVzc2FnZSApIHtcbiAgdGhpcy5pc0xvYWRlZCA9IGlzTG9hZGVkO1xuICB0aGlzLmVtaXRFdmVudCggJ3Byb2dyZXNzJywgWyB0aGlzLCB0aGlzLmVsZW1lbnQsIG1lc3NhZ2UgXSApO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0galF1ZXJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbkltYWdlc0xvYWRlZC5tYWtlSlF1ZXJ5UGx1Z2luID0gZnVuY3Rpb24oIGpRdWVyeSApIHtcbiAgalF1ZXJ5ID0galF1ZXJ5IHx8IHdpbmRvdy5qUXVlcnk7XG4gIGlmICggIWpRdWVyeSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gc2V0IGxvY2FsIHZhcmlhYmxlXG4gICQgPSBqUXVlcnk7XG4gIC8vICQoKS5pbWFnZXNMb2FkZWQoKVxuICAkLmZuLmltYWdlc0xvYWRlZCA9IGZ1bmN0aW9uKCBvcHRpb25zLCBjYWxsYmFjayApIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBuZXcgSW1hZ2VzTG9hZGVkKCB0aGlzLCBvcHRpb25zLCBjYWxsYmFjayApO1xuICAgIHJldHVybiBpbnN0YW5jZS5qcURlZmVycmVkLnByb21pc2UoICQodGhpcykgKTtcbiAgfTtcbn07XG4vLyB0cnkgbWFraW5nIHBsdWdpblxuSW1hZ2VzTG9hZGVkLm1ha2VKUXVlcnlQbHVnaW4oKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnJldHVybiBJbWFnZXNMb2FkZWQ7XG5cbn0pO1xuIiwiLyohXG4gKiBNYXNvbnJ5IHY0LjIuMlxuICogQ2FzY2FkaW5nIGdyaWQgbGF5b3V0IGxpYnJhcnlcbiAqIGh0dHBzOi8vbWFzb25yeS5kZXNhbmRyby5jb21cbiAqIE1JVCBMaWNlbnNlXG4gKiBieSBEYXZpZCBEZVNhbmRyb1xuICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qZ2xvYmFscyBkZWZpbmUsIG1vZHVsZSwgcmVxdWlyZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgICAnb3V0bGF5ZXIvb3V0bGF5ZXInLFxuICAgICAgICAnZ2V0LXNpemUvZ2V0LXNpemUnXG4gICAgICBdLFxuICAgICAgZmFjdG9yeSApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgcmVxdWlyZSgnb3V0bGF5ZXInKSxcbiAgICAgIHJlcXVpcmUoJ2dldC1zaXplJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93Lk1hc29ucnkgPSBmYWN0b3J5KFxuICAgICAgd2luZG93Lk91dGxheWVyLFxuICAgICAgd2luZG93LmdldFNpemVcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggT3V0bGF5ZXIsIGdldFNpemUgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWFzb25yeURlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAvLyBjcmVhdGUgYW4gT3V0bGF5ZXIgbGF5b3V0IGNsYXNzXG4gIHZhciBNYXNvbnJ5ID0gT3V0bGF5ZXIuY3JlYXRlKCdtYXNvbnJ5Jyk7XG4gIC8vIGlzRml0V2lkdGggLT4gZml0V2lkdGhcbiAgTWFzb25yeS5jb21wYXRPcHRpb25zLmZpdFdpZHRoID0gJ2lzRml0V2lkdGgnO1xuXG4gIHZhciBwcm90byA9IE1hc29ucnkucHJvdG90eXBlO1xuXG4gIHByb3RvLl9yZXNldExheW91dCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZ2V0U2l6ZSgpO1xuICAgIHRoaXMuX2dldE1lYXN1cmVtZW50KCAnY29sdW1uV2lkdGgnLCAnb3V0ZXJXaWR0aCcgKTtcbiAgICB0aGlzLl9nZXRNZWFzdXJlbWVudCggJ2d1dHRlcicsICdvdXRlcldpZHRoJyApO1xuICAgIHRoaXMubWVhc3VyZUNvbHVtbnMoKTtcblxuICAgIC8vIHJlc2V0IGNvbHVtbiBZXG4gICAgdGhpcy5jb2xZcyA9IFtdO1xuICAgIGZvciAoIHZhciBpPTA7IGkgPCB0aGlzLmNvbHM7IGkrKyApIHtcbiAgICAgIHRoaXMuY29sWXMucHVzaCggMCApO1xuICAgIH1cblxuICAgIHRoaXMubWF4WSA9IDA7XG4gICAgdGhpcy5ob3Jpem9udGFsQ29sSW5kZXggPSAwO1xuICB9O1xuXG4gIHByb3RvLm1lYXN1cmVDb2x1bW5zID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5nZXRDb250YWluZXJXaWR0aCgpO1xuICAgIC8vIGlmIGNvbHVtbldpZHRoIGlzIDAsIGRlZmF1bHQgdG8gb3V0ZXJXaWR0aCBvZiBmaXJzdCBpdGVtXG4gICAgaWYgKCAhdGhpcy5jb2x1bW5XaWR0aCApIHtcbiAgICAgIHZhciBmaXJzdEl0ZW0gPSB0aGlzLml0ZW1zWzBdO1xuICAgICAgdmFyIGZpcnN0SXRlbUVsZW0gPSBmaXJzdEl0ZW0gJiYgZmlyc3RJdGVtLmVsZW1lbnQ7XG4gICAgICAvLyBjb2x1bW5XaWR0aCBmYWxsIGJhY2sgdG8gaXRlbSBvZiBmaXJzdCBlbGVtZW50XG4gICAgICB0aGlzLmNvbHVtbldpZHRoID0gZmlyc3RJdGVtRWxlbSAmJiBnZXRTaXplKCBmaXJzdEl0ZW1FbGVtICkub3V0ZXJXaWR0aCB8fFxuICAgICAgICAvLyBpZiBmaXJzdCBlbGVtIGhhcyBubyB3aWR0aCwgZGVmYXVsdCB0byBzaXplIG9mIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoO1xuICAgIH1cblxuICAgIHZhciBjb2x1bW5XaWR0aCA9IHRoaXMuY29sdW1uV2lkdGggKz0gdGhpcy5ndXR0ZXI7XG5cbiAgICAvLyBjYWxjdWxhdGUgY29sdW1uc1xuICAgIHZhciBjb250YWluZXJXaWR0aCA9IHRoaXMuY29udGFpbmVyV2lkdGggKyB0aGlzLmd1dHRlcjtcbiAgICB2YXIgY29scyA9IGNvbnRhaW5lcldpZHRoIC8gY29sdW1uV2lkdGg7XG4gICAgLy8gZml4IHJvdW5kaW5nIGVycm9ycywgdHlwaWNhbGx5IHdpdGggZ3V0dGVyc1xuICAgIHZhciBleGNlc3MgPSBjb2x1bW5XaWR0aCAtIGNvbnRhaW5lcldpZHRoICUgY29sdW1uV2lkdGg7XG4gICAgLy8gaWYgb3ZlcnNob290IGlzIGxlc3MgdGhhbiBhIHBpeGVsLCByb3VuZCB1cCwgb3RoZXJ3aXNlIGZsb29yIGl0XG4gICAgdmFyIG1hdGhNZXRob2QgPSBleGNlc3MgJiYgZXhjZXNzIDwgMSA/ICdyb3VuZCcgOiAnZmxvb3InO1xuICAgIGNvbHMgPSBNYXRoWyBtYXRoTWV0aG9kIF0oIGNvbHMgKTtcbiAgICB0aGlzLmNvbHMgPSBNYXRoLm1heCggY29scywgMSApO1xuICB9O1xuXG4gIHByb3RvLmdldENvbnRhaW5lcldpZHRoID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gY29udGFpbmVyIGlzIHBhcmVudCBpZiBmaXQgd2lkdGhcbiAgICB2YXIgaXNGaXRXaWR0aCA9IHRoaXMuX2dldE9wdGlvbignZml0V2lkdGgnKTtcbiAgICB2YXIgY29udGFpbmVyID0gaXNGaXRXaWR0aCA/IHRoaXMuZWxlbWVudC5wYXJlbnROb2RlIDogdGhpcy5lbGVtZW50O1xuICAgIC8vIGNoZWNrIHRoYXQgdGhpcy5zaXplIGFuZCBzaXplIGFyZSB0aGVyZVxuICAgIC8vIElFOCB0cmlnZ2VycyByZXNpemUgb24gYm9keSBzaXplIGNoYW5nZSwgc28gdGhleSBtaWdodCBub3QgYmVcbiAgICB2YXIgc2l6ZSA9IGdldFNpemUoIGNvbnRhaW5lciApO1xuICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBzaXplICYmIHNpemUuaW5uZXJXaWR0aDtcbiAgfTtcblxuICBwcm90by5fZ2V0SXRlbUxheW91dFBvc2l0aW9uID0gZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgaXRlbS5nZXRTaXplKCk7XG4gICAgLy8gaG93IG1hbnkgY29sdW1ucyBkb2VzIHRoaXMgYnJpY2sgc3BhblxuICAgIHZhciByZW1haW5kZXIgPSBpdGVtLnNpemUub3V0ZXJXaWR0aCAlIHRoaXMuY29sdW1uV2lkdGg7XG4gICAgdmFyIG1hdGhNZXRob2QgPSByZW1haW5kZXIgJiYgcmVtYWluZGVyIDwgMSA/ICdyb3VuZCcgOiAnY2VpbCc7XG4gICAgLy8gcm91bmQgaWYgb2ZmIGJ5IDEgcGl4ZWwsIG90aGVyd2lzZSB1c2UgY2VpbFxuICAgIHZhciBjb2xTcGFuID0gTWF0aFsgbWF0aE1ldGhvZCBdKCBpdGVtLnNpemUub3V0ZXJXaWR0aCAvIHRoaXMuY29sdW1uV2lkdGggKTtcbiAgICBjb2xTcGFuID0gTWF0aC5taW4oIGNvbFNwYW4sIHRoaXMuY29scyApO1xuICAgIC8vIHVzZSBob3Jpem9udGFsIG9yIHRvcCBjb2x1bW4gcG9zaXRpb25cbiAgICB2YXIgY29sUG9zTWV0aG9kID0gdGhpcy5vcHRpb25zLmhvcml6b250YWxPcmRlciA/XG4gICAgICAnX2dldEhvcml6b250YWxDb2xQb3NpdGlvbicgOiAnX2dldFRvcENvbFBvc2l0aW9uJztcbiAgICB2YXIgY29sUG9zaXRpb24gPSB0aGlzWyBjb2xQb3NNZXRob2QgXSggY29sU3BhbiwgaXRlbSApO1xuICAgIC8vIHBvc2l0aW9uIHRoZSBicmlja1xuICAgIHZhciBwb3NpdGlvbiA9IHtcbiAgICAgIHg6IHRoaXMuY29sdW1uV2lkdGggKiBjb2xQb3NpdGlvbi5jb2wsXG4gICAgICB5OiBjb2xQb3NpdGlvbi55XG4gICAgfTtcbiAgICAvLyBhcHBseSBzZXRIZWlnaHQgdG8gbmVjZXNzYXJ5IGNvbHVtbnNcbiAgICB2YXIgc2V0SGVpZ2h0ID0gY29sUG9zaXRpb24ueSArIGl0ZW0uc2l6ZS5vdXRlckhlaWdodDtcbiAgICB2YXIgc2V0TWF4ID0gY29sU3BhbiArIGNvbFBvc2l0aW9uLmNvbDtcbiAgICBmb3IgKCB2YXIgaSA9IGNvbFBvc2l0aW9uLmNvbDsgaSA8IHNldE1heDsgaSsrICkge1xuICAgICAgdGhpcy5jb2xZc1tpXSA9IHNldEhlaWdodDtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH07XG5cbiAgcHJvdG8uX2dldFRvcENvbFBvc2l0aW9uID0gZnVuY3Rpb24oIGNvbFNwYW4gKSB7XG4gICAgdmFyIGNvbEdyb3VwID0gdGhpcy5fZ2V0VG9wQ29sR3JvdXAoIGNvbFNwYW4gKTtcbiAgICAvLyBnZXQgdGhlIG1pbmltdW0gWSB2YWx1ZSBmcm9tIHRoZSBjb2x1bW5zXG4gICAgdmFyIG1pbmltdW1ZID0gTWF0aC5taW4uYXBwbHkoIE1hdGgsIGNvbEdyb3VwICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sOiBjb2xHcm91cC5pbmRleE9mKCBtaW5pbXVtWSApLFxuICAgICAgeTogbWluaW11bVksXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNvbFNwYW4gLSBudW1iZXIgb2YgY29sdW1ucyB0aGUgZWxlbWVudCBzcGFuc1xuICAgKiBAcmV0dXJucyB7QXJyYXl9IGNvbEdyb3VwXG4gICAqL1xuICBwcm90by5fZ2V0VG9wQ29sR3JvdXAgPSBmdW5jdGlvbiggY29sU3BhbiApIHtcbiAgICBpZiAoIGNvbFNwYW4gPCAyICkge1xuICAgICAgLy8gaWYgYnJpY2sgc3BhbnMgb25seSBvbmUgY29sdW1uLCB1c2UgYWxsIHRoZSBjb2x1bW4gWXNcbiAgICAgIHJldHVybiB0aGlzLmNvbFlzO1xuICAgIH1cblxuICAgIHZhciBjb2xHcm91cCA9IFtdO1xuICAgIC8vIGhvdyBtYW55IGRpZmZlcmVudCBwbGFjZXMgY291bGQgdGhpcyBicmljayBmaXQgaG9yaXpvbnRhbGx5XG4gICAgdmFyIGdyb3VwQ291bnQgPSB0aGlzLmNvbHMgKyAxIC0gY29sU3BhbjtcbiAgICAvLyBmb3IgZWFjaCBncm91cCBwb3RlbnRpYWwgaG9yaXpvbnRhbCBwb3NpdGlvblxuICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGdyb3VwQ291bnQ7IGkrKyApIHtcbiAgICAgIGNvbEdyb3VwW2ldID0gdGhpcy5fZ2V0Q29sR3JvdXBZKCBpLCBjb2xTcGFuICk7XG4gICAgfVxuICAgIHJldHVybiBjb2xHcm91cDtcbiAgfTtcblxuICBwcm90by5fZ2V0Q29sR3JvdXBZID0gZnVuY3Rpb24oIGNvbCwgY29sU3BhbiApIHtcbiAgICBpZiAoIGNvbFNwYW4gPCAyICkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sWXNbIGNvbCBdO1xuICAgIH1cbiAgICAvLyBtYWtlIGFuIGFycmF5IG9mIGNvbFkgdmFsdWVzIGZvciB0aGF0IG9uZSBncm91cFxuICAgIHZhciBncm91cENvbFlzID0gdGhpcy5jb2xZcy5zbGljZSggY29sLCBjb2wgKyBjb2xTcGFuICk7XG4gICAgLy8gYW5kIGdldCB0aGUgbWF4IHZhbHVlIG9mIHRoZSBhcnJheVxuICAgIHJldHVybiBNYXRoLm1heC5hcHBseSggTWF0aCwgZ3JvdXBDb2xZcyApO1xuICB9O1xuXG4gIC8vIGdldCBjb2x1bW4gcG9zaXRpb24gYmFzZWQgb24gaG9yaXpvbnRhbCBpbmRleC4gIzg3M1xuICBwcm90by5fZ2V0SG9yaXpvbnRhbENvbFBvc2l0aW9uID0gZnVuY3Rpb24oIGNvbFNwYW4sIGl0ZW0gKSB7XG4gICAgdmFyIGNvbCA9IHRoaXMuaG9yaXpvbnRhbENvbEluZGV4ICUgdGhpcy5jb2xzO1xuICAgIHZhciBpc092ZXIgPSBjb2xTcGFuID4gMSAmJiBjb2wgKyBjb2xTcGFuID4gdGhpcy5jb2xzO1xuICAgIC8vIHNoaWZ0IHRvIG5leHQgcm93IGlmIGl0ZW0gY2FuJ3QgZml0IG9uIGN1cnJlbnQgcm93XG4gICAgY29sID0gaXNPdmVyID8gMCA6IGNvbDtcbiAgICAvLyBkb24ndCBsZXQgemVyby1zaXplIGl0ZW1zIHRha2UgdXAgc3BhY2VcbiAgICB2YXIgaGFzU2l6ZSA9IGl0ZW0uc2l6ZS5vdXRlcldpZHRoICYmIGl0ZW0uc2l6ZS5vdXRlckhlaWdodDtcbiAgICB0aGlzLmhvcml6b250YWxDb2xJbmRleCA9IGhhc1NpemUgPyBjb2wgKyBjb2xTcGFuIDogdGhpcy5ob3Jpem9udGFsQ29sSW5kZXg7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sOiBjb2wsXG4gICAgICB5OiB0aGlzLl9nZXRDb2xHcm91cFkoIGNvbCwgY29sU3BhbiApLFxuICAgIH07XG4gIH07XG5cbiAgcHJvdG8uX21hbmFnZVN0YW1wID0gZnVuY3Rpb24oIHN0YW1wICkge1xuICAgIHZhciBzdGFtcFNpemUgPSBnZXRTaXplKCBzdGFtcCApO1xuICAgIHZhciBvZmZzZXQgPSB0aGlzLl9nZXRFbGVtZW50T2Zmc2V0KCBzdGFtcCApO1xuICAgIC8vIGdldCB0aGUgY29sdW1ucyB0aGF0IHRoaXMgc3RhbXAgYWZmZWN0c1xuICAgIHZhciBpc09yaWdpbkxlZnQgPSB0aGlzLl9nZXRPcHRpb24oJ29yaWdpbkxlZnQnKTtcbiAgICB2YXIgZmlyc3RYID0gaXNPcmlnaW5MZWZ0ID8gb2Zmc2V0LmxlZnQgOiBvZmZzZXQucmlnaHQ7XG4gICAgdmFyIGxhc3RYID0gZmlyc3RYICsgc3RhbXBTaXplLm91dGVyV2lkdGg7XG4gICAgdmFyIGZpcnN0Q29sID0gTWF0aC5mbG9vciggZmlyc3RYIC8gdGhpcy5jb2x1bW5XaWR0aCApO1xuICAgIGZpcnN0Q29sID0gTWF0aC5tYXgoIDAsIGZpcnN0Q29sICk7XG4gICAgdmFyIGxhc3RDb2wgPSBNYXRoLmZsb29yKCBsYXN0WCAvIHRoaXMuY29sdW1uV2lkdGggKTtcbiAgICAvLyBsYXN0Q29sIHNob3VsZCBub3QgZ28gb3ZlciBpZiBtdWx0aXBsZSBvZiBjb2x1bW5XaWR0aCAjNDI1XG4gICAgbGFzdENvbCAtPSBsYXN0WCAlIHRoaXMuY29sdW1uV2lkdGggPyAwIDogMTtcbiAgICBsYXN0Q29sID0gTWF0aC5taW4oIHRoaXMuY29scyAtIDEsIGxhc3RDb2wgKTtcbiAgICAvLyBzZXQgY29sWXMgdG8gYm90dG9tIG9mIHRoZSBzdGFtcFxuXG4gICAgdmFyIGlzT3JpZ2luVG9wID0gdGhpcy5fZ2V0T3B0aW9uKCdvcmlnaW5Ub3AnKTtcbiAgICB2YXIgc3RhbXBNYXhZID0gKCBpc09yaWdpblRvcCA/IG9mZnNldC50b3AgOiBvZmZzZXQuYm90dG9tICkgK1xuICAgICAgc3RhbXBTaXplLm91dGVySGVpZ2h0O1xuICAgIGZvciAoIHZhciBpID0gZmlyc3RDb2w7IGkgPD0gbGFzdENvbDsgaSsrICkge1xuICAgICAgdGhpcy5jb2xZc1tpXSA9IE1hdGgubWF4KCBzdGFtcE1heFksIHRoaXMuY29sWXNbaV0gKTtcbiAgICB9XG4gIH07XG5cbiAgcHJvdG8uX2dldENvbnRhaW5lclNpemUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLm1heFkgPSBNYXRoLm1heC5hcHBseSggTWF0aCwgdGhpcy5jb2xZcyApO1xuICAgIHZhciBzaXplID0ge1xuICAgICAgaGVpZ2h0OiB0aGlzLm1heFlcbiAgICB9O1xuXG4gICAgaWYgKCB0aGlzLl9nZXRPcHRpb24oJ2ZpdFdpZHRoJykgKSB7XG4gICAgICBzaXplLndpZHRoID0gdGhpcy5fZ2V0Q29udGFpbmVyRml0V2lkdGgoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2l6ZTtcbiAgfTtcblxuICBwcm90by5fZ2V0Q29udGFpbmVyRml0V2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdW51c2VkQ29scyA9IDA7XG4gICAgLy8gY291bnQgdW51c2VkIGNvbHVtbnNcbiAgICB2YXIgaSA9IHRoaXMuY29scztcbiAgICB3aGlsZSAoIC0taSApIHtcbiAgICAgIGlmICggdGhpcy5jb2xZc1tpXSAhPT0gMCApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB1bnVzZWRDb2xzKys7XG4gICAgfVxuICAgIC8vIGZpdCBjb250YWluZXIgdG8gY29sdW1ucyB0aGF0IGhhdmUgYmVlbiB1c2VkXG4gICAgcmV0dXJuICggdGhpcy5jb2xzIC0gdW51c2VkQ29scyApICogdGhpcy5jb2x1bW5XaWR0aCAtIHRoaXMuZ3V0dGVyO1xuICB9O1xuXG4gIHByb3RvLm5lZWRzUmVzaXplTGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHByZXZpb3VzV2lkdGggPSB0aGlzLmNvbnRhaW5lcldpZHRoO1xuICAgIHRoaXMuZ2V0Q29udGFpbmVyV2lkdGgoKTtcbiAgICByZXR1cm4gcHJldmlvdXNXaWR0aCAhPSB0aGlzLmNvbnRhaW5lcldpZHRoO1xuICB9O1xuXG4gIHJldHVybiBNYXNvbnJ5O1xuXG59KSk7XG4iLCIvKipcbiAqIE91dGxheWVyIEl0ZW1cbiAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKiBnbG9iYWxzIGRlZmluZSwgbW9kdWxlLCByZXF1aXJlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EIC0gUmVxdWlyZUpTXG4gICAgZGVmaW5lKCBbXG4gICAgICAgICdldi1lbWl0dGVyL2V2LWVtaXR0ZXInLFxuICAgICAgICAnZ2V0LXNpemUvZ2V0LXNpemUnXG4gICAgICBdLFxuICAgICAgZmFjdG9yeVxuICAgICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlMgLSBCcm93c2VyaWZ5LCBXZWJwYWNrXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgcmVxdWlyZSgnZXYtZW1pdHRlcicpLFxuICAgICAgcmVxdWlyZSgnZ2V0LXNpemUnKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuT3V0bGF5ZXIgPSB7fTtcbiAgICB3aW5kb3cuT3V0bGF5ZXIuSXRlbSA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3cuRXZFbWl0dGVyLFxuICAgICAgd2luZG93LmdldFNpemVcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggRXZFbWl0dGVyLCBnZXRTaXplICkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyAtLS0tLSBoZWxwZXJzIC0tLS0tIC8vXG5cbmZ1bmN0aW9uIGlzRW1wdHlPYmooIG9iaiApIHtcbiAgZm9yICggdmFyIHByb3AgaW4gb2JqICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm9wID0gbnVsbDtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENTUzMgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5cbnZhciBkb2NFbGVtU3R5bGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG5cbnZhciB0cmFuc2l0aW9uUHJvcGVydHkgPSB0eXBlb2YgZG9jRWxlbVN0eWxlLnRyYW5zaXRpb24gPT0gJ3N0cmluZycgP1xuICAndHJhbnNpdGlvbicgOiAnV2Via2l0VHJhbnNpdGlvbic7XG52YXIgdHJhbnNmb3JtUHJvcGVydHkgPSB0eXBlb2YgZG9jRWxlbVN0eWxlLnRyYW5zZm9ybSA9PSAnc3RyaW5nJyA/XG4gICd0cmFuc2Zvcm0nIDogJ1dlYmtpdFRyYW5zZm9ybSc7XG5cbnZhciB0cmFuc2l0aW9uRW5kRXZlbnQgPSB7XG4gIFdlYmtpdFRyYW5zaXRpb246ICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgdHJhbnNpdGlvbjogJ3RyYW5zaXRpb25lbmQnXG59WyB0cmFuc2l0aW9uUHJvcGVydHkgXTtcblxuLy8gY2FjaGUgYWxsIHZlbmRvciBwcm9wZXJ0aWVzIHRoYXQgY291bGQgaGF2ZSB2ZW5kb3IgcHJlZml4XG52YXIgdmVuZG9yUHJvcGVydGllcyA9IHtcbiAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1Qcm9wZXJ0eSxcbiAgdHJhbnNpdGlvbjogdHJhbnNpdGlvblByb3BlcnR5LFxuICB0cmFuc2l0aW9uRHVyYXRpb246IHRyYW5zaXRpb25Qcm9wZXJ0eSArICdEdXJhdGlvbicsXG4gIHRyYW5zaXRpb25Qcm9wZXJ0eTogdHJhbnNpdGlvblByb3BlcnR5ICsgJ1Byb3BlcnR5JyxcbiAgdHJhbnNpdGlvbkRlbGF5OiB0cmFuc2l0aW9uUHJvcGVydHkgKyAnRGVsYXknXG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIEl0ZW0oIGVsZW1lbnQsIGxheW91dCApIHtcbiAgaWYgKCAhZWxlbWVudCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAvLyBwYXJlbnQgbGF5b3V0IGNsYXNzLCBpLmUuIE1hc29ucnksIElzb3RvcGUsIG9yIFBhY2tlcnlcbiAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gIHRoaXMucG9zaXRpb24gPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgdGhpcy5fY3JlYXRlKCk7XG59XG5cbi8vIGluaGVyaXQgRXZFbWl0dGVyXG52YXIgcHJvdG8gPSBJdGVtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV2RW1pdHRlci5wcm90b3R5cGUgKTtcbnByb3RvLmNvbnN0cnVjdG9yID0gSXRlbTtcblxucHJvdG8uX2NyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyB0cmFuc2l0aW9uIG9iamVjdHNcbiAgdGhpcy5fdHJhbnNuID0ge1xuICAgIGluZ1Byb3BlcnRpZXM6IHt9LFxuICAgIGNsZWFuOiB7fSxcbiAgICBvbkVuZDoge31cbiAgfTtcblxuICB0aGlzLmNzcyh7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgfSk7XG59O1xuXG4vLyB0cmlnZ2VyIHNwZWNpZmllZCBoYW5kbGVyIGZvciBldmVudCB0eXBlXG5wcm90by5oYW5kbGVFdmVudCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIG1ldGhvZCA9ICdvbicgKyBldmVudC50eXBlO1xuICBpZiAoIHRoaXNbIG1ldGhvZCBdICkge1xuICAgIHRoaXNbIG1ldGhvZCBdKCBldmVudCApO1xuICB9XG59O1xuXG5wcm90by5nZXRTaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuc2l6ZSA9IGdldFNpemUoIHRoaXMuZWxlbWVudCApO1xufTtcblxuLyoqXG4gKiBhcHBseSBDU1Mgc3R5bGVzIHRvIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZVxuICovXG5wcm90by5jc3MgPSBmdW5jdGlvbiggc3R5bGUgKSB7XG4gIHZhciBlbGVtU3R5bGUgPSB0aGlzLmVsZW1lbnQuc3R5bGU7XG5cbiAgZm9yICggdmFyIHByb3AgaW4gc3R5bGUgKSB7XG4gICAgLy8gdXNlIHZlbmRvciBwcm9wZXJ0eSBpZiBhdmFpbGFibGVcbiAgICB2YXIgc3VwcG9ydGVkUHJvcCA9IHZlbmRvclByb3BlcnRpZXNbIHByb3AgXSB8fCBwcm9wO1xuICAgIGVsZW1TdHlsZVsgc3VwcG9ydGVkUHJvcCBdID0gc3R5bGVbIHByb3AgXTtcbiAgfVxufTtcblxuIC8vIG1lYXN1cmUgcG9zaXRpb24sIGFuZCBzZXRzIGl0XG5wcm90by5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKCB0aGlzLmVsZW1lbnQgKTtcbiAgdmFyIGlzT3JpZ2luTGVmdCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ29yaWdpbkxlZnQnKTtcbiAgdmFyIGlzT3JpZ2luVG9wID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignb3JpZ2luVG9wJyk7XG4gIHZhciB4VmFsdWUgPSBzdHlsZVsgaXNPcmlnaW5MZWZ0ID8gJ2xlZnQnIDogJ3JpZ2h0JyBdO1xuICB2YXIgeVZhbHVlID0gc3R5bGVbIGlzT3JpZ2luVG9wID8gJ3RvcCcgOiAnYm90dG9tJyBdO1xuICB2YXIgeCA9IHBhcnNlRmxvYXQoIHhWYWx1ZSApO1xuICB2YXIgeSA9IHBhcnNlRmxvYXQoIHlWYWx1ZSApO1xuICAvLyBjb252ZXJ0IHBlcmNlbnQgdG8gcGl4ZWxzXG4gIHZhciBsYXlvdXRTaXplID0gdGhpcy5sYXlvdXQuc2l6ZTtcbiAgaWYgKCB4VmFsdWUuaW5kZXhPZignJScpICE9IC0xICkge1xuICAgIHggPSAoIHggLyAxMDAgKSAqIGxheW91dFNpemUud2lkdGg7XG4gIH1cbiAgaWYgKCB5VmFsdWUuaW5kZXhPZignJScpICE9IC0xICkge1xuICAgIHkgPSAoIHkgLyAxMDAgKSAqIGxheW91dFNpemUuaGVpZ2h0O1xuICB9XG4gIC8vIGNsZWFuIHVwICdhdXRvJyBvciBvdGhlciBub24taW50ZWdlciB2YWx1ZXNcbiAgeCA9IGlzTmFOKCB4ICkgPyAwIDogeDtcbiAgeSA9IGlzTmFOKCB5ICkgPyAwIDogeTtcbiAgLy8gcmVtb3ZlIHBhZGRpbmcgZnJvbSBtZWFzdXJlbWVudFxuICB4IC09IGlzT3JpZ2luTGVmdCA/IGxheW91dFNpemUucGFkZGluZ0xlZnQgOiBsYXlvdXRTaXplLnBhZGRpbmdSaWdodDtcbiAgeSAtPSBpc09yaWdpblRvcCA/IGxheW91dFNpemUucGFkZGluZ1RvcCA6IGxheW91dFNpemUucGFkZGluZ0JvdHRvbTtcblxuICB0aGlzLnBvc2l0aW9uLnggPSB4O1xuICB0aGlzLnBvc2l0aW9uLnkgPSB5O1xufTtcblxuLy8gc2V0IHNldHRsZWQgcG9zaXRpb24sIGFwcGx5IHBhZGRpbmdcbnByb3RvLmxheW91dFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciBsYXlvdXRTaXplID0gdGhpcy5sYXlvdXQuc2l6ZTtcbiAgdmFyIHN0eWxlID0ge307XG4gIHZhciBpc09yaWdpbkxlZnQgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdvcmlnaW5MZWZ0Jyk7XG4gIHZhciBpc09yaWdpblRvcCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ29yaWdpblRvcCcpO1xuXG4gIC8vIHhcbiAgdmFyIHhQYWRkaW5nID0gaXNPcmlnaW5MZWZ0ID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICB2YXIgeFByb3BlcnR5ID0gaXNPcmlnaW5MZWZ0ID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgdmFyIHhSZXNldFByb3BlcnR5ID0gaXNPcmlnaW5MZWZ0ID8gJ3JpZ2h0JyA6ICdsZWZ0JztcblxuICB2YXIgeCA9IHRoaXMucG9zaXRpb24ueCArIGxheW91dFNpemVbIHhQYWRkaW5nIF07XG4gIC8vIHNldCBpbiBwZXJjZW50YWdlIG9yIHBpeGVsc1xuICBzdHlsZVsgeFByb3BlcnR5IF0gPSB0aGlzLmdldFhWYWx1ZSggeCApO1xuICAvLyByZXNldCBvdGhlciBwcm9wZXJ0eVxuICBzdHlsZVsgeFJlc2V0UHJvcGVydHkgXSA9ICcnO1xuXG4gIC8vIHlcbiAgdmFyIHlQYWRkaW5nID0gaXNPcmlnaW5Ub3AgPyAncGFkZGluZ1RvcCcgOiAncGFkZGluZ0JvdHRvbSc7XG4gIHZhciB5UHJvcGVydHkgPSBpc09yaWdpblRvcCA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gIHZhciB5UmVzZXRQcm9wZXJ0eSA9IGlzT3JpZ2luVG9wID8gJ2JvdHRvbScgOiAndG9wJztcblxuICB2YXIgeSA9IHRoaXMucG9zaXRpb24ueSArIGxheW91dFNpemVbIHlQYWRkaW5nIF07XG4gIC8vIHNldCBpbiBwZXJjZW50YWdlIG9yIHBpeGVsc1xuICBzdHlsZVsgeVByb3BlcnR5IF0gPSB0aGlzLmdldFlWYWx1ZSggeSApO1xuICAvLyByZXNldCBvdGhlciBwcm9wZXJ0eVxuICBzdHlsZVsgeVJlc2V0UHJvcGVydHkgXSA9ICcnO1xuXG4gIHRoaXMuY3NzKCBzdHlsZSApO1xuICB0aGlzLmVtaXRFdmVudCggJ2xheW91dCcsIFsgdGhpcyBdICk7XG59O1xuXG5wcm90by5nZXRYVmFsdWUgPSBmdW5jdGlvbiggeCApIHtcbiAgdmFyIGlzSG9yaXpvbnRhbCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ2hvcml6b250YWwnKTtcbiAgcmV0dXJuIHRoaXMubGF5b3V0Lm9wdGlvbnMucGVyY2VudFBvc2l0aW9uICYmICFpc0hvcml6b250YWwgP1xuICAgICggKCB4IC8gdGhpcy5sYXlvdXQuc2l6ZS53aWR0aCApICogMTAwICkgKyAnJScgOiB4ICsgJ3B4Jztcbn07XG5cbnByb3RvLmdldFlWYWx1ZSA9IGZ1bmN0aW9uKCB5ICkge1xuICB2YXIgaXNIb3Jpem9udGFsID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignaG9yaXpvbnRhbCcpO1xuICByZXR1cm4gdGhpcy5sYXlvdXQub3B0aW9ucy5wZXJjZW50UG9zaXRpb24gJiYgaXNIb3Jpem9udGFsID9cbiAgICAoICggeSAvIHRoaXMubGF5b3V0LnNpemUuaGVpZ2h0ICkgKiAxMDAgKSArICclJyA6IHkgKyAncHgnO1xufTtcblxucHJvdG8uX3RyYW5zaXRpb25UbyA9IGZ1bmN0aW9uKCB4LCB5ICkge1xuICB0aGlzLmdldFBvc2l0aW9uKCk7XG4gIC8vIGdldCBjdXJyZW50IHggJiB5IGZyb20gdG9wL2xlZnRcbiAgdmFyIGN1clggPSB0aGlzLnBvc2l0aW9uLng7XG4gIHZhciBjdXJZID0gdGhpcy5wb3NpdGlvbi55O1xuXG4gIHZhciBkaWROb3RNb3ZlID0geCA9PSB0aGlzLnBvc2l0aW9uLnggJiYgeSA9PSB0aGlzLnBvc2l0aW9uLnk7XG5cbiAgLy8gc2F2ZSBlbmQgcG9zaXRpb25cbiAgdGhpcy5zZXRQb3NpdGlvbiggeCwgeSApO1xuXG4gIC8vIGlmIGRpZCBub3QgbW92ZSBhbmQgbm90IHRyYW5zaXRpb25pbmcsIGp1c3QgZ28gdG8gbGF5b3V0XG4gIGlmICggZGlkTm90TW92ZSAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcgKSB7XG4gICAgdGhpcy5sYXlvdXRQb3NpdGlvbigpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0cmFuc1ggPSB4IC0gY3VyWDtcbiAgdmFyIHRyYW5zWSA9IHkgLSBjdXJZO1xuICB2YXIgdHJhbnNpdGlvblN0eWxlID0ge307XG4gIHRyYW5zaXRpb25TdHlsZS50cmFuc2Zvcm0gPSB0aGlzLmdldFRyYW5zbGF0ZSggdHJhbnNYLCB0cmFuc1kgKTtcblxuICB0aGlzLnRyYW5zaXRpb24oe1xuICAgIHRvOiB0cmFuc2l0aW9uU3R5bGUsXG4gICAgb25UcmFuc2l0aW9uRW5kOiB7XG4gICAgICB0cmFuc2Zvcm06IHRoaXMubGF5b3V0UG9zaXRpb25cbiAgICB9LFxuICAgIGlzQ2xlYW5pbmc6IHRydWVcbiAgfSk7XG59O1xuXG5wcm90by5nZXRUcmFuc2xhdGUgPSBmdW5jdGlvbiggeCwgeSApIHtcbiAgLy8gZmxpcCBjb29yaWRpbmF0ZXMgaWYgb3JpZ2luIG9uIHJpZ2h0IG9yIGJvdHRvbVxuICB2YXIgaXNPcmlnaW5MZWZ0ID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignb3JpZ2luTGVmdCcpO1xuICB2YXIgaXNPcmlnaW5Ub3AgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdvcmlnaW5Ub3AnKTtcbiAgeCA9IGlzT3JpZ2luTGVmdCA/IHggOiAteDtcbiAgeSA9IGlzT3JpZ2luVG9wID8geSA6IC15O1xuICByZXR1cm4gJ3RyYW5zbGF0ZTNkKCcgKyB4ICsgJ3B4LCAnICsgeSArICdweCwgMCknO1xufTtcblxuLy8gbm9uIHRyYW5zaXRpb24gKyB0cmFuc2Zvcm0gc3VwcG9ydFxucHJvdG8uZ29UbyA9IGZ1bmN0aW9uKCB4LCB5ICkge1xuICB0aGlzLnNldFBvc2l0aW9uKCB4LCB5ICk7XG4gIHRoaXMubGF5b3V0UG9zaXRpb24oKTtcbn07XG5cbnByb3RvLm1vdmVUbyA9IHByb3RvLl90cmFuc2l0aW9uVG87XG5cbnByb3RvLnNldFBvc2l0aW9uID0gZnVuY3Rpb24oIHgsIHkgKSB7XG4gIHRoaXMucG9zaXRpb24ueCA9IHBhcnNlRmxvYXQoIHggKTtcbiAgdGhpcy5wb3NpdGlvbi55ID0gcGFyc2VGbG9hdCggeSApO1xufTtcblxuLy8gLS0tLS0gdHJhbnNpdGlvbiAtLS0tLSAvL1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZSAtIENTU1xuICogQHBhcmFtIHtGdW5jdGlvbn0gb25UcmFuc2l0aW9uRW5kXG4gKi9cblxuLy8gbm9uIHRyYW5zaXRpb24sIGp1c3QgdHJpZ2dlciBjYWxsYmFja1xucHJvdG8uX25vblRyYW5zaXRpb24gPSBmdW5jdGlvbiggYXJncyApIHtcbiAgdGhpcy5jc3MoIGFyZ3MudG8gKTtcbiAgaWYgKCBhcmdzLmlzQ2xlYW5pbmcgKSB7XG4gICAgdGhpcy5fcmVtb3ZlU3R5bGVzKCBhcmdzLnRvICk7XG4gIH1cbiAgZm9yICggdmFyIHByb3AgaW4gYXJncy5vblRyYW5zaXRpb25FbmQgKSB7XG4gICAgYXJncy5vblRyYW5zaXRpb25FbmRbIHByb3AgXS5jYWxsKCB0aGlzICk7XG4gIH1cbn07XG5cbi8qKlxuICogcHJvcGVyIHRyYW5zaXRpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gYXJndW1lbnRzXG4gKiAgIEBwYXJhbSB7T2JqZWN0fSB0byAtIHN0eWxlIHRvIHRyYW5zaXRpb24gdG9cbiAqICAgQHBhcmFtIHtPYmplY3R9IGZyb20gLSBzdHlsZSB0byBzdGFydCB0cmFuc2l0aW9uIGZyb21cbiAqICAgQHBhcmFtIHtCb29sZWFufSBpc0NsZWFuaW5nIC0gcmVtb3ZlcyB0cmFuc2l0aW9uIHN0eWxlcyBhZnRlciB0cmFuc2l0aW9uXG4gKiAgIEBwYXJhbSB7RnVuY3Rpb259IG9uVHJhbnNpdGlvbkVuZCAtIGNhbGxiYWNrXG4gKi9cbnByb3RvLnRyYW5zaXRpb24gPSBmdW5jdGlvbiggYXJncyApIHtcbiAgLy8gcmVkaXJlY3QgdG8gbm9uVHJhbnNpdGlvbiBpZiBubyB0cmFuc2l0aW9uIGR1cmF0aW9uXG4gIGlmICggIXBhcnNlRmxvYXQoIHRoaXMubGF5b3V0Lm9wdGlvbnMudHJhbnNpdGlvbkR1cmF0aW9uICkgKSB7XG4gICAgdGhpcy5fbm9uVHJhbnNpdGlvbiggYXJncyApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfdHJhbnNpdGlvbiA9IHRoaXMuX3RyYW5zbjtcbiAgLy8ga2VlcCB0cmFjayBvZiBvblRyYW5zaXRpb25FbmQgY2FsbGJhY2sgYnkgY3NzIHByb3BlcnR5XG4gIGZvciAoIHZhciBwcm9wIGluIGFyZ3Mub25UcmFuc2l0aW9uRW5kICkge1xuICAgIF90cmFuc2l0aW9uLm9uRW5kWyBwcm9wIF0gPSBhcmdzLm9uVHJhbnNpdGlvbkVuZFsgcHJvcCBdO1xuICB9XG4gIC8vIGtlZXAgdHJhY2sgb2YgcHJvcGVydGllcyB0aGF0IGFyZSB0cmFuc2l0aW9uaW5nXG4gIGZvciAoIHByb3AgaW4gYXJncy50byApIHtcbiAgICBfdHJhbnNpdGlvbi5pbmdQcm9wZXJ0aWVzWyBwcm9wIF0gPSB0cnVlO1xuICAgIC8vIGtlZXAgdHJhY2sgb2YgcHJvcGVydGllcyB0byBjbGVhbiB1cCB3aGVuIHRyYW5zaXRpb24gaXMgZG9uZVxuICAgIGlmICggYXJncy5pc0NsZWFuaW5nICkge1xuICAgICAgX3RyYW5zaXRpb24uY2xlYW5bIHByb3AgXSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gc2V0IGZyb20gc3R5bGVzXG4gIGlmICggYXJncy5mcm9tICkge1xuICAgIHRoaXMuY3NzKCBhcmdzLmZyb20gKTtcbiAgICAvLyBmb3JjZSByZWRyYXcuIGh0dHA6Ly9ibG9nLmFsZXhtYWNjYXcuY29tL2Nzcy10cmFuc2l0aW9uc1xuICAgIHZhciBoID0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAvLyBoYWNrIGZvciBKU0hpbnQgdG8gaHVzaCBhYm91dCB1bnVzZWQgdmFyXG4gICAgaCA9IG51bGw7XG4gIH1cbiAgLy8gZW5hYmxlIHRyYW5zaXRpb25cbiAgdGhpcy5lbmFibGVUcmFuc2l0aW9uKCBhcmdzLnRvICk7XG4gIC8vIHNldCBzdHlsZXMgdGhhdCBhcmUgdHJhbnNpdGlvbmluZ1xuICB0aGlzLmNzcyggYXJncy50byApO1xuXG4gIHRoaXMuaXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcblxufTtcblxuLy8gZGFzaCBiZWZvcmUgYWxsIGNhcCBsZXR0ZXJzLCBpbmNsdWRpbmcgZmlyc3QgZm9yXG4vLyBXZWJraXRUcmFuc2Zvcm0gPT4gLXdlYmtpdC10cmFuc2Zvcm1cbmZ1bmN0aW9uIHRvRGFzaGVkQWxsKCBzdHIgKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSggLyhbQS1aXSkvZywgZnVuY3Rpb24oICQxICkge1xuICAgIHJldHVybiAnLScgKyAkMS50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn1cblxudmFyIHRyYW5zaXRpb25Qcm9wcyA9ICdvcGFjaXR5LCcgKyB0b0Rhc2hlZEFsbCggdHJhbnNmb3JtUHJvcGVydHkgKTtcblxucHJvdG8uZW5hYmxlVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKC8qIHN0eWxlICovKSB7XG4gIC8vIEhBQ0sgY2hhbmdpbmcgdHJhbnNpdGlvblByb3BlcnR5IGR1cmluZyBhIHRyYW5zaXRpb25cbiAgLy8gd2lsbCBjYXVzZSB0cmFuc2l0aW9uIHRvIGp1bXBcbiAgaWYgKCB0aGlzLmlzVHJhbnNpdGlvbmluZyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBtYWtlIGB0cmFuc2l0aW9uOiBmb28sIGJhciwgYmF6YCBmcm9tIHN0eWxlIG9iamVjdFxuICAvLyBIQUNLIHVuLWNvbW1lbnQgdGhpcyB3aGVuIGVuYWJsZVRyYW5zaXRpb24gY2FuIHdvcmtcbiAgLy8gd2hpbGUgYSB0cmFuc2l0aW9uIGlzIGhhcHBlbmluZ1xuICAvLyB2YXIgdHJhbnNpdGlvblZhbHVlcyA9IFtdO1xuICAvLyBmb3IgKCB2YXIgcHJvcCBpbiBzdHlsZSApIHtcbiAgLy8gICAvLyBkYXNoLWlmeSBjYW1lbENhc2VkIHByb3BlcnRpZXMgbGlrZSBXZWJraXRUcmFuc2l0aW9uXG4gIC8vICAgcHJvcCA9IHZlbmRvclByb3BlcnRpZXNbIHByb3AgXSB8fCBwcm9wO1xuICAvLyAgIHRyYW5zaXRpb25WYWx1ZXMucHVzaCggdG9EYXNoZWRBbGwoIHByb3AgKSApO1xuICAvLyB9XG4gIC8vIG11bmdlIG51bWJlciB0byBtaWxsaXNlY29uZCwgdG8gbWF0Y2ggc3RhZ2dlclxuICB2YXIgZHVyYXRpb24gPSB0aGlzLmxheW91dC5vcHRpb25zLnRyYW5zaXRpb25EdXJhdGlvbjtcbiAgZHVyYXRpb24gPSB0eXBlb2YgZHVyYXRpb24gPT0gJ251bWJlcicgPyBkdXJhdGlvbiArICdtcycgOiBkdXJhdGlvbjtcbiAgLy8gZW5hYmxlIHRyYW5zaXRpb24gc3R5bGVzXG4gIHRoaXMuY3NzKHtcbiAgICB0cmFuc2l0aW9uUHJvcGVydHk6IHRyYW5zaXRpb25Qcm9wcyxcbiAgICB0cmFuc2l0aW9uRHVyYXRpb246IGR1cmF0aW9uLFxuICAgIHRyYW5zaXRpb25EZWxheTogdGhpcy5zdGFnZ2VyRGVsYXkgfHwgMFxuICB9KTtcbiAgLy8gbGlzdGVuIGZvciB0cmFuc2l0aW9uIGVuZCBldmVudFxuICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHJhbnNpdGlvbkVuZEV2ZW50LCB0aGlzLCBmYWxzZSApO1xufTtcblxuLy8gLS0tLS0gZXZlbnRzIC0tLS0tIC8vXG5cbnByb3RvLm9ud2Via2l0VHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdGhpcy5vbnRyYW5zaXRpb25lbmQoIGV2ZW50ICk7XG59O1xuXG5wcm90by5vbm90cmFuc2l0aW9uZW5kID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB0aGlzLm9udHJhbnNpdGlvbmVuZCggZXZlbnQgKTtcbn07XG5cbi8vIHByb3BlcnRpZXMgdGhhdCBJIG11bmdlIHRvIG1ha2UgbXkgbGlmZSBlYXNpZXJcbnZhciBkYXNoZWRWZW5kb3JQcm9wZXJ0aWVzID0ge1xuICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNmb3JtJ1xufTtcblxucHJvdG8ub250cmFuc2l0aW9uZW5kID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICAvLyBkaXNyZWdhcmQgYnViYmxlZCBldmVudHMgZnJvbSBjaGlsZHJlblxuICBpZiAoIGV2ZW50LnRhcmdldCAhPT0gdGhpcy5lbGVtZW50ICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgX3RyYW5zaXRpb24gPSB0aGlzLl90cmFuc247XG4gIC8vIGdldCBwcm9wZXJ0eSBuYW1lIG9mIHRyYW5zaXRpb25lZCBwcm9wZXJ0eSwgY29udmVydCB0byBwcmVmaXgtZnJlZVxuICB2YXIgcHJvcGVydHlOYW1lID0gZGFzaGVkVmVuZG9yUHJvcGVydGllc1sgZXZlbnQucHJvcGVydHlOYW1lIF0gfHwgZXZlbnQucHJvcGVydHlOYW1lO1xuXG4gIC8vIHJlbW92ZSBwcm9wZXJ0eSB0aGF0IGhhcyBjb21wbGV0ZWQgdHJhbnNpdGlvbmluZ1xuICBkZWxldGUgX3RyYW5zaXRpb24uaW5nUHJvcGVydGllc1sgcHJvcGVydHlOYW1lIF07XG4gIC8vIGNoZWNrIGlmIGFueSBwcm9wZXJ0aWVzIGFyZSBzdGlsbCB0cmFuc2l0aW9uaW5nXG4gIGlmICggaXNFbXB0eU9iaiggX3RyYW5zaXRpb24uaW5nUHJvcGVydGllcyApICkge1xuICAgIC8vIGFsbCBwcm9wZXJ0aWVzIGhhdmUgY29tcGxldGVkIHRyYW5zaXRpb25pbmdcbiAgICB0aGlzLmRpc2FibGVUcmFuc2l0aW9uKCk7XG4gIH1cbiAgLy8gY2xlYW4gc3R5bGVcbiAgaWYgKCBwcm9wZXJ0eU5hbWUgaW4gX3RyYW5zaXRpb24uY2xlYW4gKSB7XG4gICAgLy8gY2xlYW4gdXAgc3R5bGVcbiAgICB0aGlzLmVsZW1lbnQuc3R5bGVbIGV2ZW50LnByb3BlcnR5TmFtZSBdID0gJyc7XG4gICAgZGVsZXRlIF90cmFuc2l0aW9uLmNsZWFuWyBwcm9wZXJ0eU5hbWUgXTtcbiAgfVxuICAvLyB0cmlnZ2VyIG9uVHJhbnNpdGlvbkVuZCBjYWxsYmFja1xuICBpZiAoIHByb3BlcnR5TmFtZSBpbiBfdHJhbnNpdGlvbi5vbkVuZCApIHtcbiAgICB2YXIgb25UcmFuc2l0aW9uRW5kID0gX3RyYW5zaXRpb24ub25FbmRbIHByb3BlcnR5TmFtZSBdO1xuICAgIG9uVHJhbnNpdGlvbkVuZC5jYWxsKCB0aGlzICk7XG4gICAgZGVsZXRlIF90cmFuc2l0aW9uLm9uRW5kWyBwcm9wZXJ0eU5hbWUgXTtcbiAgfVxuXG4gIHRoaXMuZW1pdEV2ZW50KCAndHJhbnNpdGlvbkVuZCcsIFsgdGhpcyBdICk7XG59O1xuXG5wcm90by5kaXNhYmxlVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJlbW92ZVRyYW5zaXRpb25TdHlsZXMoKTtcbiAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHRyYW5zaXRpb25FbmRFdmVudCwgdGhpcywgZmFsc2UgKTtcbiAgdGhpcy5pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbn07XG5cbi8qKlxuICogcmVtb3ZlcyBzdHlsZSBwcm9wZXJ0eSBmcm9tIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZVxuKiovXG5wcm90by5fcmVtb3ZlU3R5bGVzID0gZnVuY3Rpb24oIHN0eWxlICkge1xuICAvLyBjbGVhbiB1cCB0cmFuc2l0aW9uIHN0eWxlc1xuICB2YXIgY2xlYW5TdHlsZSA9IHt9O1xuICBmb3IgKCB2YXIgcHJvcCBpbiBzdHlsZSApIHtcbiAgICBjbGVhblN0eWxlWyBwcm9wIF0gPSAnJztcbiAgfVxuICB0aGlzLmNzcyggY2xlYW5TdHlsZSApO1xufTtcblxudmFyIGNsZWFuVHJhbnNpdGlvblN0eWxlID0ge1xuICB0cmFuc2l0aW9uUHJvcGVydHk6ICcnLFxuICB0cmFuc2l0aW9uRHVyYXRpb246ICcnLFxuICB0cmFuc2l0aW9uRGVsYXk6ICcnXG59O1xuXG5wcm90by5yZW1vdmVUcmFuc2l0aW9uU3R5bGVzID0gZnVuY3Rpb24oKSB7XG4gIC8vIHJlbW92ZSB0cmFuc2l0aW9uXG4gIHRoaXMuY3NzKCBjbGVhblRyYW5zaXRpb25TdHlsZSApO1xufTtcblxuLy8gLS0tLS0gc3RhZ2dlciAtLS0tLSAvL1xuXG5wcm90by5zdGFnZ2VyID0gZnVuY3Rpb24oIGRlbGF5ICkge1xuICBkZWxheSA9IGlzTmFOKCBkZWxheSApID8gMCA6IGRlbGF5O1xuICB0aGlzLnN0YWdnZXJEZWxheSA9IGRlbGF5ICsgJ21zJztcbn07XG5cbi8vIC0tLS0tIHNob3cvaGlkZS9yZW1vdmUgLS0tLS0gLy9cblxuLy8gcmVtb3ZlIGVsZW1lbnQgZnJvbSBET01cbnByb3RvLnJlbW92ZUVsZW0gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRoaXMuZWxlbWVudCApO1xuICAvLyByZW1vdmUgZGlzcGxheTogbm9uZVxuICB0aGlzLmNzcyh7IGRpc3BsYXk6ICcnIH0pO1xuICB0aGlzLmVtaXRFdmVudCggJ3JlbW92ZScsIFsgdGhpcyBdICk7XG59O1xuXG5wcm90by5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgLy8ganVzdCByZW1vdmUgZWxlbWVudCBpZiBubyB0cmFuc2l0aW9uIHN1cHBvcnQgb3Igbm8gdHJhbnNpdGlvblxuICBpZiAoICF0cmFuc2l0aW9uUHJvcGVydHkgfHwgIXBhcnNlRmxvYXQoIHRoaXMubGF5b3V0Lm9wdGlvbnMudHJhbnNpdGlvbkR1cmF0aW9uICkgKSB7XG4gICAgdGhpcy5yZW1vdmVFbGVtKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gc3RhcnQgdHJhbnNpdGlvblxuICB0aGlzLm9uY2UoICd0cmFuc2l0aW9uRW5kJywgZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVFbGVtKCk7XG4gIH0pO1xuICB0aGlzLmhpZGUoKTtcbn07XG5cbnByb3RvLnJldmVhbCA9IGZ1bmN0aW9uKCkge1xuICBkZWxldGUgdGhpcy5pc0hpZGRlbjtcbiAgLy8gcmVtb3ZlIGRpc3BsYXk6IG5vbmVcbiAgdGhpcy5jc3MoeyBkaXNwbGF5OiAnJyB9KTtcblxuICB2YXIgb3B0aW9ucyA9IHRoaXMubGF5b3V0Lm9wdGlvbnM7XG5cbiAgdmFyIG9uVHJhbnNpdGlvbkVuZCA9IHt9O1xuICB2YXIgdHJhbnNpdGlvbkVuZFByb3BlcnR5ID0gdGhpcy5nZXRIaWRlUmV2ZWFsVHJhbnNpdGlvbkVuZFByb3BlcnR5KCd2aXNpYmxlU3R5bGUnKTtcbiAgb25UcmFuc2l0aW9uRW5kWyB0cmFuc2l0aW9uRW5kUHJvcGVydHkgXSA9IHRoaXMub25SZXZlYWxUcmFuc2l0aW9uRW5kO1xuXG4gIHRoaXMudHJhbnNpdGlvbih7XG4gICAgZnJvbTogb3B0aW9ucy5oaWRkZW5TdHlsZSxcbiAgICB0bzogb3B0aW9ucy52aXNpYmxlU3R5bGUsXG4gICAgaXNDbGVhbmluZzogdHJ1ZSxcbiAgICBvblRyYW5zaXRpb25FbmQ6IG9uVHJhbnNpdGlvbkVuZFxuICB9KTtcbn07XG5cbnByb3RvLm9uUmV2ZWFsVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uKCkge1xuICAvLyBjaGVjayBpZiBzdGlsbCB2aXNpYmxlXG4gIC8vIGR1cmluZyB0cmFuc2l0aW9uLCBpdGVtIG1heSBoYXZlIGJlZW4gaGlkZGVuXG4gIGlmICggIXRoaXMuaXNIaWRkZW4gKSB7XG4gICAgdGhpcy5lbWl0RXZlbnQoJ3JldmVhbCcpO1xuICB9XG59O1xuXG4vKipcbiAqIGdldCBzdHlsZSBwcm9wZXJ0eSB1c2UgZm9yIGhpZGUvcmV2ZWFsIHRyYW5zaXRpb24gZW5kXG4gKiBAcGFyYW0ge1N0cmluZ30gc3R5bGVQcm9wZXJ0eSAtIGhpZGRlblN0eWxlL3Zpc2libGVTdHlsZVxuICogQHJldHVybnMge1N0cmluZ31cbiAqL1xucHJvdG8uZ2V0SGlkZVJldmVhbFRyYW5zaXRpb25FbmRQcm9wZXJ0eSA9IGZ1bmN0aW9uKCBzdHlsZVByb3BlcnR5ICkge1xuICB2YXIgb3B0aW9uU3R5bGUgPSB0aGlzLmxheW91dC5vcHRpb25zWyBzdHlsZVByb3BlcnR5IF07XG4gIC8vIHVzZSBvcGFjaXR5XG4gIGlmICggb3B0aW9uU3R5bGUub3BhY2l0eSApIHtcbiAgICByZXR1cm4gJ29wYWNpdHknO1xuICB9XG4gIC8vIGdldCBmaXJzdCBwcm9wZXJ0eVxuICBmb3IgKCB2YXIgcHJvcCBpbiBvcHRpb25TdHlsZSApIHtcbiAgICByZXR1cm4gcHJvcDtcbiAgfVxufTtcblxucHJvdG8uaGlkZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBzZXQgZmxhZ1xuICB0aGlzLmlzSGlkZGVuID0gdHJ1ZTtcbiAgLy8gcmVtb3ZlIGRpc3BsYXk6IG5vbmVcbiAgdGhpcy5jc3MoeyBkaXNwbGF5OiAnJyB9KTtcblxuICB2YXIgb3B0aW9ucyA9IHRoaXMubGF5b3V0Lm9wdGlvbnM7XG5cbiAgdmFyIG9uVHJhbnNpdGlvbkVuZCA9IHt9O1xuICB2YXIgdHJhbnNpdGlvbkVuZFByb3BlcnR5ID0gdGhpcy5nZXRIaWRlUmV2ZWFsVHJhbnNpdGlvbkVuZFByb3BlcnR5KCdoaWRkZW5TdHlsZScpO1xuICBvblRyYW5zaXRpb25FbmRbIHRyYW5zaXRpb25FbmRQcm9wZXJ0eSBdID0gdGhpcy5vbkhpZGVUcmFuc2l0aW9uRW5kO1xuXG4gIHRoaXMudHJhbnNpdGlvbih7XG4gICAgZnJvbTogb3B0aW9ucy52aXNpYmxlU3R5bGUsXG4gICAgdG86IG9wdGlvbnMuaGlkZGVuU3R5bGUsXG4gICAgLy8ga2VlcCBoaWRkZW4gc3R1ZmYgaGlkZGVuXG4gICAgaXNDbGVhbmluZzogdHJ1ZSxcbiAgICBvblRyYW5zaXRpb25FbmQ6IG9uVHJhbnNpdGlvbkVuZFxuICB9KTtcbn07XG5cbnByb3RvLm9uSGlkZVRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbigpIHtcbiAgLy8gY2hlY2sgaWYgc3RpbGwgaGlkZGVuXG4gIC8vIGR1cmluZyB0cmFuc2l0aW9uLCBpdGVtIG1heSBoYXZlIGJlZW4gdW4taGlkZGVuXG4gIGlmICggdGhpcy5pc0hpZGRlbiApIHtcbiAgICB0aGlzLmNzcyh7IGRpc3BsYXk6ICdub25lJyB9KTtcbiAgICB0aGlzLmVtaXRFdmVudCgnaGlkZScpO1xuICB9XG59O1xuXG5wcm90by5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuY3NzKHtcbiAgICBwb3NpdGlvbjogJycsXG4gICAgbGVmdDogJycsXG4gICAgcmlnaHQ6ICcnLFxuICAgIHRvcDogJycsXG4gICAgYm90dG9tOiAnJyxcbiAgICB0cmFuc2l0aW9uOiAnJyxcbiAgICB0cmFuc2Zvcm06ICcnXG4gIH0pO1xufTtcblxucmV0dXJuIEl0ZW07XG5cbn0pKTtcbiIsIi8qIVxuICogT3V0bGF5ZXIgdjIuMS4xXG4gKiB0aGUgYnJhaW5zIGFuZCBndXRzIG9mIGEgbGF5b3V0IGxpYnJhcnlcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAndXNlIHN0cmljdCc7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKiBnbG9iYWxzIGRlZmluZSwgbW9kdWxlLCByZXF1aXJlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EIC0gUmVxdWlyZUpTXG4gICAgZGVmaW5lKCBbXG4gICAgICAgICdldi1lbWl0dGVyL2V2LWVtaXR0ZXInLFxuICAgICAgICAnZ2V0LXNpemUvZ2V0LXNpemUnLFxuICAgICAgICAnZml6enktdWktdXRpbHMvdXRpbHMnLFxuICAgICAgICAnLi9pdGVtJ1xuICAgICAgXSxcbiAgICAgIGZ1bmN0aW9uKCBFdkVtaXR0ZXIsIGdldFNpemUsIHV0aWxzLCBJdGVtICkge1xuICAgICAgICByZXR1cm4gZmFjdG9yeSggd2luZG93LCBFdkVtaXR0ZXIsIGdldFNpemUsIHV0aWxzLCBJdGVtKTtcbiAgICAgIH1cbiAgICApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTIC0gQnJvd3NlcmlmeSwgV2VicGFja1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJ2V2LWVtaXR0ZXInKSxcbiAgICAgIHJlcXVpcmUoJ2dldC1zaXplJyksXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpLFxuICAgICAgcmVxdWlyZSgnLi9pdGVtJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93Lk91dGxheWVyID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5FdkVtaXR0ZXIsXG4gICAgICB3aW5kb3cuZ2V0U2l6ZSxcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHMsXG4gICAgICB3aW5kb3cuT3V0bGF5ZXIuSXRlbVxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciwgZ2V0U2l6ZSwgdXRpbHMsIEl0ZW0gKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIC0tLS0tIHZhcnMgLS0tLS0gLy9cblxudmFyIGNvbnNvbGUgPSB3aW5kb3cuY29uc29sZTtcbnZhciBqUXVlcnkgPSB3aW5kb3cualF1ZXJ5O1xudmFyIG5vb3AgPSBmdW5jdGlvbigpIHt9O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdXRsYXllciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBnbG9iYWxseSB1bmlxdWUgaWRlbnRpZmllcnNcbnZhciBHVUlEID0gMDtcbi8vIGludGVybmFsIHN0b3JlIG9mIGFsbCBPdXRsYXllciBpbnRhbmNlc1xudmFyIGluc3RhbmNlcyA9IHt9O1xuXG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50LCBTdHJpbmd9IGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gT3V0bGF5ZXIoIGVsZW1lbnQsIG9wdGlvbnMgKSB7XG4gIHZhciBxdWVyeUVsZW1lbnQgPSB1dGlscy5nZXRRdWVyeUVsZW1lbnQoIGVsZW1lbnQgKTtcbiAgaWYgKCAhcXVlcnlFbGVtZW50ICkge1xuICAgIGlmICggY29uc29sZSApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoICdCYWQgZWxlbWVudCBmb3IgJyArIHRoaXMuY29uc3RydWN0b3IubmFtZXNwYWNlICtcbiAgICAgICAgJzogJyArICggcXVlcnlFbGVtZW50IHx8IGVsZW1lbnQgKSApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5lbGVtZW50ID0gcXVlcnlFbGVtZW50O1xuICAvLyBhZGQgalF1ZXJ5XG4gIGlmICggalF1ZXJ5ICkge1xuICAgIHRoaXMuJGVsZW1lbnQgPSBqUXVlcnkoIHRoaXMuZWxlbWVudCApO1xuICB9XG5cbiAgLy8gb3B0aW9uc1xuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5leHRlbmQoIHt9LCB0aGlzLmNvbnN0cnVjdG9yLmRlZmF1bHRzICk7XG4gIHRoaXMub3B0aW9uKCBvcHRpb25zICk7XG5cbiAgLy8gYWRkIGlkIGZvciBPdXRsYXllci5nZXRGcm9tRWxlbWVudFxuICB2YXIgaWQgPSArK0dVSUQ7XG4gIHRoaXMuZWxlbWVudC5vdXRsYXllckdVSUQgPSBpZDsgLy8gZXhwYW5kb1xuICBpbnN0YW5jZXNbIGlkIF0gPSB0aGlzOyAvLyBhc3NvY2lhdGUgdmlhIGlkXG5cbiAgLy8ga2ljayBpdCBvZmZcbiAgdGhpcy5fY3JlYXRlKCk7XG5cbiAgdmFyIGlzSW5pdExheW91dCA9IHRoaXMuX2dldE9wdGlvbignaW5pdExheW91dCcpO1xuICBpZiAoIGlzSW5pdExheW91dCApIHtcbiAgICB0aGlzLmxheW91dCgpO1xuICB9XG59XG5cbi8vIHNldHRpbmdzIGFyZSBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbk91dGxheWVyLm5hbWVzcGFjZSA9ICdvdXRsYXllcic7XG5PdXRsYXllci5JdGVtID0gSXRlbTtcblxuLy8gZGVmYXVsdCBvcHRpb25zXG5PdXRsYXllci5kZWZhdWx0cyA9IHtcbiAgY29udGFpbmVyU3R5bGU6IHtcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICB9LFxuICBpbml0TGF5b3V0OiB0cnVlLFxuICBvcmlnaW5MZWZ0OiB0cnVlLFxuICBvcmlnaW5Ub3A6IHRydWUsXG4gIHJlc2l6ZTogdHJ1ZSxcbiAgcmVzaXplQ29udGFpbmVyOiB0cnVlLFxuICAvLyBpdGVtIG9wdGlvbnNcbiAgdHJhbnNpdGlvbkR1cmF0aW9uOiAnMC40cycsXG4gIGhpZGRlblN0eWxlOiB7XG4gICAgb3BhY2l0eTogMCxcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjAwMSknXG4gIH0sXG4gIHZpc2libGVTdHlsZToge1xuICAgIG9wYWNpdHk6IDEsXG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknXG4gIH1cbn07XG5cbnZhciBwcm90byA9IE91dGxheWVyLnByb3RvdHlwZTtcbi8vIGluaGVyaXQgRXZFbWl0dGVyXG51dGlscy5leHRlbmQoIHByb3RvLCBFdkVtaXR0ZXIucHJvdG90eXBlICk7XG5cbi8qKlxuICogc2V0IG9wdGlvbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gKi9cbnByb3RvLm9wdGlvbiA9IGZ1bmN0aW9uKCBvcHRzICkge1xuICB1dGlscy5leHRlbmQoIHRoaXMub3B0aW9ucywgb3B0cyApO1xufTtcblxuLyoqXG4gKiBnZXQgYmFja3dhcmRzIGNvbXBhdGlibGUgb3B0aW9uIHZhbHVlLCBjaGVjayBvbGQgbmFtZVxuICovXG5wcm90by5fZ2V0T3B0aW9uID0gZnVuY3Rpb24oIG9wdGlvbiApIHtcbiAgdmFyIG9sZE9wdGlvbiA9IHRoaXMuY29uc3RydWN0b3IuY29tcGF0T3B0aW9uc1sgb3B0aW9uIF07XG4gIHJldHVybiBvbGRPcHRpb24gJiYgdGhpcy5vcHRpb25zWyBvbGRPcHRpb24gXSAhPT0gdW5kZWZpbmVkID9cbiAgICB0aGlzLm9wdGlvbnNbIG9sZE9wdGlvbiBdIDogdGhpcy5vcHRpb25zWyBvcHRpb24gXTtcbn07XG5cbk91dGxheWVyLmNvbXBhdE9wdGlvbnMgPSB7XG4gIC8vIGN1cnJlbnROYW1lOiBvbGROYW1lXG4gIGluaXRMYXlvdXQ6ICdpc0luaXRMYXlvdXQnLFxuICBob3Jpem9udGFsOiAnaXNIb3Jpem9udGFsJyxcbiAgbGF5b3V0SW5zdGFudDogJ2lzTGF5b3V0SW5zdGFudCcsXG4gIG9yaWdpbkxlZnQ6ICdpc09yaWdpbkxlZnQnLFxuICBvcmlnaW5Ub3A6ICdpc09yaWdpblRvcCcsXG4gIHJlc2l6ZTogJ2lzUmVzaXplQm91bmQnLFxuICByZXNpemVDb250YWluZXI6ICdpc1Jlc2l6aW5nQ29udGFpbmVyJ1xufTtcblxucHJvdG8uX2NyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBnZXQgaXRlbXMgZnJvbSBjaGlsZHJlblxuICB0aGlzLnJlbG9hZEl0ZW1zKCk7XG4gIC8vIGVsZW1lbnRzIHRoYXQgYWZmZWN0IGxheW91dCwgYnV0IGFyZSBub3QgbGFpZCBvdXRcbiAgdGhpcy5zdGFtcHMgPSBbXTtcbiAgdGhpcy5zdGFtcCggdGhpcy5vcHRpb25zLnN0YW1wICk7XG4gIC8vIHNldCBjb250YWluZXIgc3R5bGVcbiAgdXRpbHMuZXh0ZW5kKCB0aGlzLmVsZW1lbnQuc3R5bGUsIHRoaXMub3B0aW9ucy5jb250YWluZXJTdHlsZSApO1xuXG4gIC8vIGJpbmQgcmVzaXplIG1ldGhvZFxuICB2YXIgY2FuQmluZFJlc2l6ZSA9IHRoaXMuX2dldE9wdGlvbigncmVzaXplJyk7XG4gIGlmICggY2FuQmluZFJlc2l6ZSApIHtcbiAgICB0aGlzLmJpbmRSZXNpemUoKTtcbiAgfVxufTtcblxuLy8gZ29lcyB0aHJvdWdoIGFsbCBjaGlsZHJlbiBhZ2FpbiBhbmQgZ2V0cyBicmlja3MgaW4gcHJvcGVyIG9yZGVyXG5wcm90by5yZWxvYWRJdGVtcyA9IGZ1bmN0aW9uKCkge1xuICAvLyBjb2xsZWN0aW9uIG9mIGl0ZW0gZWxlbWVudHNcbiAgdGhpcy5pdGVtcyA9IHRoaXMuX2l0ZW1pemUoIHRoaXMuZWxlbWVudC5jaGlsZHJlbiApO1xufTtcblxuXG4vKipcbiAqIHR1cm4gZWxlbWVudHMgaW50byBPdXRsYXllci5JdGVtcyB0byBiZSB1c2VkIGluIGxheW91dFxuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBIVE1MRWxlbWVudH0gZWxlbXNcbiAqIEByZXR1cm5zIHtBcnJheX0gaXRlbXMgLSBjb2xsZWN0aW9uIG9mIG5ldyBPdXRsYXllciBJdGVtc1xuICovXG5wcm90by5faXRlbWl6ZSA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuICB2YXIgaXRlbUVsZW1zID0gdGhpcy5fZmlsdGVyRmluZEl0ZW1FbGVtZW50cyggZWxlbXMgKTtcbiAgdmFyIEl0ZW0gPSB0aGlzLmNvbnN0cnVjdG9yLkl0ZW07XG5cbiAgLy8gY3JlYXRlIG5ldyBPdXRsYXllciBJdGVtcyBmb3IgY29sbGVjdGlvblxuICB2YXIgaXRlbXMgPSBbXTtcbiAgZm9yICggdmFyIGk9MDsgaSA8IGl0ZW1FbGVtcy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgZWxlbSA9IGl0ZW1FbGVtc1tpXTtcbiAgICB2YXIgaXRlbSA9IG5ldyBJdGVtKCBlbGVtLCB0aGlzICk7XG4gICAgaXRlbXMucHVzaCggaXRlbSApO1xuICB9XG5cbiAgcmV0dXJuIGl0ZW1zO1xufTtcblxuLyoqXG4gKiBnZXQgaXRlbSBlbGVtZW50cyB0byBiZSB1c2VkIGluIGxheW91dFxuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBIVE1MRWxlbWVudH0gZWxlbXNcbiAqIEByZXR1cm5zIHtBcnJheX0gaXRlbXMgLSBpdGVtIGVsZW1lbnRzXG4gKi9cbnByb3RvLl9maWx0ZXJGaW5kSXRlbUVsZW1lbnRzID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICByZXR1cm4gdXRpbHMuZmlsdGVyRmluZEVsZW1lbnRzKCBlbGVtcywgdGhpcy5vcHRpb25zLml0ZW1TZWxlY3RvciApO1xufTtcblxuLyoqXG4gKiBnZXR0ZXIgbWV0aG9kIGZvciBnZXR0aW5nIGl0ZW0gZWxlbWVudHNcbiAqIEByZXR1cm5zIHtBcnJheX0gZWxlbXMgLSBjb2xsZWN0aW9uIG9mIGl0ZW0gZWxlbWVudHNcbiAqL1xucHJvdG8uZ2V0SXRlbUVsZW1lbnRzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLml0ZW1zLm1hcCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgcmV0dXJuIGl0ZW0uZWxlbWVudDtcbiAgfSk7XG59O1xuXG4vLyAtLS0tLSBpbml0ICYgbGF5b3V0IC0tLS0tIC8vXG5cbi8qKlxuICogbGF5cyBvdXQgYWxsIGl0ZW1zXG4gKi9cbnByb3RvLmxheW91dCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9yZXNldExheW91dCgpO1xuICB0aGlzLl9tYW5hZ2VTdGFtcHMoKTtcblxuICAvLyBkb24ndCBhbmltYXRlIGZpcnN0IGxheW91dFxuICB2YXIgbGF5b3V0SW5zdGFudCA9IHRoaXMuX2dldE9wdGlvbignbGF5b3V0SW5zdGFudCcpO1xuICB2YXIgaXNJbnN0YW50ID0gbGF5b3V0SW5zdGFudCAhPT0gdW5kZWZpbmVkID9cbiAgICBsYXlvdXRJbnN0YW50IDogIXRoaXMuX2lzTGF5b3V0SW5pdGVkO1xuICB0aGlzLmxheW91dEl0ZW1zKCB0aGlzLml0ZW1zLCBpc0luc3RhbnQgKTtcblxuICAvLyBmbGFnIGZvciBpbml0YWxpemVkXG4gIHRoaXMuX2lzTGF5b3V0SW5pdGVkID0gdHJ1ZTtcbn07XG5cbi8vIF9pbml0IGlzIGFsaWFzIGZvciBsYXlvdXRcbnByb3RvLl9pbml0ID0gcHJvdG8ubGF5b3V0O1xuXG4vKipcbiAqIGxvZ2ljIGJlZm9yZSBhbnkgbmV3IGxheW91dFxuICovXG5wcm90by5fcmVzZXRMYXlvdXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5nZXRTaXplKCk7XG59O1xuXG5cbnByb3RvLmdldFNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zaXplID0gZ2V0U2l6ZSggdGhpcy5lbGVtZW50ICk7XG59O1xuXG4vKipcbiAqIGdldCBtZWFzdXJlbWVudCBmcm9tIG9wdGlvbiwgZm9yIGNvbHVtbldpZHRoLCByb3dIZWlnaHQsIGd1dHRlclxuICogaWYgb3B0aW9uIGlzIFN0cmluZyAtPiBnZXQgZWxlbWVudCBmcm9tIHNlbGVjdG9yIHN0cmluZywgJiBnZXQgc2l6ZSBvZiBlbGVtZW50XG4gKiBpZiBvcHRpb24gaXMgRWxlbWVudCAtPiBnZXQgc2l6ZSBvZiBlbGVtZW50XG4gKiBlbHNlIHVzZSBvcHRpb24gYXMgYSBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVhc3VyZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzaXplIC0gd2lkdGggb3IgaGVpZ2h0XG4gKiBAcHJpdmF0ZVxuICovXG5wcm90by5fZ2V0TWVhc3VyZW1lbnQgPSBmdW5jdGlvbiggbWVhc3VyZW1lbnQsIHNpemUgKSB7XG4gIHZhciBvcHRpb24gPSB0aGlzLm9wdGlvbnNbIG1lYXN1cmVtZW50IF07XG4gIHZhciBlbGVtO1xuICBpZiAoICFvcHRpb24gKSB7XG4gICAgLy8gZGVmYXVsdCB0byAwXG4gICAgdGhpc1sgbWVhc3VyZW1lbnQgXSA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXNlIG9wdGlvbiBhcyBhbiBlbGVtZW50XG4gICAgaWYgKCB0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnICkge1xuICAgICAgZWxlbSA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCBvcHRpb24gKTtcbiAgICB9IGVsc2UgaWYgKCBvcHRpb24gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCApIHtcbiAgICAgIGVsZW0gPSBvcHRpb247XG4gICAgfVxuICAgIC8vIHVzZSBzaXplIG9mIGVsZW1lbnQsIGlmIGVsZW1lbnRcbiAgICB0aGlzWyBtZWFzdXJlbWVudCBdID0gZWxlbSA/IGdldFNpemUoIGVsZW0gKVsgc2l6ZSBdIDogb3B0aW9uO1xuICB9XG59O1xuXG4vKipcbiAqIGxheW91dCBhIGNvbGxlY3Rpb24gb2YgaXRlbSBlbGVtZW50c1xuICogQGFwaSBwdWJsaWNcbiAqL1xucHJvdG8ubGF5b3V0SXRlbXMgPSBmdW5jdGlvbiggaXRlbXMsIGlzSW5zdGFudCApIHtcbiAgaXRlbXMgPSB0aGlzLl9nZXRJdGVtc0ZvckxheW91dCggaXRlbXMgKTtcblxuICB0aGlzLl9sYXlvdXRJdGVtcyggaXRlbXMsIGlzSW5zdGFudCApO1xuXG4gIHRoaXMuX3Bvc3RMYXlvdXQoKTtcbn07XG5cbi8qKlxuICogZ2V0IHRoZSBpdGVtcyB0byBiZSBsYWlkIG91dFxuICogeW91IG1heSB3YW50IHRvIHNraXAgb3ZlciBzb21lIGl0ZW1zXG4gKiBAcGFyYW0ge0FycmF5fSBpdGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtc1xuICovXG5wcm90by5fZ2V0SXRlbXNGb3JMYXlvdXQgPSBmdW5jdGlvbiggaXRlbXMgKSB7XG4gIHJldHVybiBpdGVtcy5maWx0ZXIoIGZ1bmN0aW9uKCBpdGVtICkge1xuICAgIHJldHVybiAhaXRlbS5pc0lnbm9yZWQ7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBsYXlvdXQgaXRlbXNcbiAqIEBwYXJhbSB7QXJyYXl9IGl0ZW1zXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzSW5zdGFudFxuICovXG5wcm90by5fbGF5b3V0SXRlbXMgPSBmdW5jdGlvbiggaXRlbXMsIGlzSW5zdGFudCApIHtcbiAgdGhpcy5fZW1pdENvbXBsZXRlT25JdGVtcyggJ2xheW91dCcsIGl0ZW1zICk7XG5cbiAgaWYgKCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCApIHtcbiAgICAvLyBubyBpdGVtcywgZW1pdCBldmVudCB3aXRoIGVtcHR5IGFycmF5XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHF1ZXVlID0gW107XG5cbiAgaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgLy8gZ2V0IHgveSBvYmplY3QgZnJvbSBtZXRob2RcbiAgICB2YXIgcG9zaXRpb24gPSB0aGlzLl9nZXRJdGVtTGF5b3V0UG9zaXRpb24oIGl0ZW0gKTtcbiAgICAvLyBlbnF1ZXVlXG4gICAgcG9zaXRpb24uaXRlbSA9IGl0ZW07XG4gICAgcG9zaXRpb24uaXNJbnN0YW50ID0gaXNJbnN0YW50IHx8IGl0ZW0uaXNMYXlvdXRJbnN0YW50O1xuICAgIHF1ZXVlLnB1c2goIHBvc2l0aW9uICk7XG4gIH0sIHRoaXMgKTtcblxuICB0aGlzLl9wcm9jZXNzTGF5b3V0UXVldWUoIHF1ZXVlICk7XG59O1xuXG4vKipcbiAqIGdldCBpdGVtIGxheW91dCBwb3NpdGlvblxuICogQHBhcmFtIHtPdXRsYXllci5JdGVtfSBpdGVtXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB4IGFuZCB5IHBvc2l0aW9uXG4gKi9cbnByb3RvLl9nZXRJdGVtTGF5b3V0UG9zaXRpb24gPSBmdW5jdGlvbiggLyogaXRlbSAqLyApIHtcbiAgcmV0dXJuIHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcbn07XG5cbi8qKlxuICogaXRlcmF0ZSBvdmVyIGFycmF5IGFuZCBwb3NpdGlvbiBlYWNoIGl0ZW1cbiAqIFJlYXNvbiBiZWluZyAtIHNlcGFyYXRpbmcgdGhpcyBsb2dpYyBwcmV2ZW50cyAnbGF5b3V0IGludmFsaWRhdGlvbidcbiAqIHRoeCBAcGF1bF9pcmlzaFxuICogQHBhcmFtIHtBcnJheX0gcXVldWVcbiAqL1xucHJvdG8uX3Byb2Nlc3NMYXlvdXRRdWV1ZSA9IGZ1bmN0aW9uKCBxdWV1ZSApIHtcbiAgdGhpcy51cGRhdGVTdGFnZ2VyKCk7XG4gIHF1ZXVlLmZvckVhY2goIGZ1bmN0aW9uKCBvYmosIGkgKSB7XG4gICAgdGhpcy5fcG9zaXRpb25JdGVtKCBvYmouaXRlbSwgb2JqLngsIG9iai55LCBvYmouaXNJbnN0YW50LCBpICk7XG4gIH0sIHRoaXMgKTtcbn07XG5cbi8vIHNldCBzdGFnZ2VyIGZyb20gb3B0aW9uIGluIG1pbGxpc2Vjb25kcyBudW1iZXJcbnByb3RvLnVwZGF0ZVN0YWdnZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0YWdnZXIgPSB0aGlzLm9wdGlvbnMuc3RhZ2dlcjtcbiAgaWYgKCBzdGFnZ2VyID09PSBudWxsIHx8IHN0YWdnZXIgPT09IHVuZGVmaW5lZCApIHtcbiAgICB0aGlzLnN0YWdnZXIgPSAwO1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnN0YWdnZXIgPSBnZXRNaWxsaXNlY29uZHMoIHN0YWdnZXIgKTtcbiAgcmV0dXJuIHRoaXMuc3RhZ2dlcjtcbn07XG5cbi8qKlxuICogU2V0cyBwb3NpdGlvbiBvZiBpdGVtIGluIERPTVxuICogQHBhcmFtIHtPdXRsYXllci5JdGVtfSBpdGVtXG4gKiBAcGFyYW0ge051bWJlcn0geCAtIGhvcml6b250YWwgcG9zaXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSB5IC0gdmVydGljYWwgcG9zaXRpb25cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbnN0YW50IC0gZGlzYWJsZXMgdHJhbnNpdGlvbnNcbiAqL1xucHJvdG8uX3Bvc2l0aW9uSXRlbSA9IGZ1bmN0aW9uKCBpdGVtLCB4LCB5LCBpc0luc3RhbnQsIGkgKSB7XG4gIGlmICggaXNJbnN0YW50ICkge1xuICAgIC8vIGlmIG5vdCB0cmFuc2l0aW9uLCBqdXN0IHNldCBDU1NcbiAgICBpdGVtLmdvVG8oIHgsIHkgKTtcbiAgfSBlbHNlIHtcbiAgICBpdGVtLnN0YWdnZXIoIGkgKiB0aGlzLnN0YWdnZXIgKTtcbiAgICBpdGVtLm1vdmVUbyggeCwgeSApO1xuICB9XG59O1xuXG4vKipcbiAqIEFueSBsb2dpYyB5b3Ugd2FudCB0byBkbyBhZnRlciBlYWNoIGxheW91dCxcbiAqIGkuZS4gc2l6ZSB0aGUgY29udGFpbmVyXG4gKi9cbnByb3RvLl9wb3N0TGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVzaXplQ29udGFpbmVyKCk7XG59O1xuXG5wcm90by5yZXNpemVDb250YWluZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGlzUmVzaXppbmdDb250YWluZXIgPSB0aGlzLl9nZXRPcHRpb24oJ3Jlc2l6ZUNvbnRhaW5lcicpO1xuICBpZiAoICFpc1Jlc2l6aW5nQ29udGFpbmVyICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc2l6ZSA9IHRoaXMuX2dldENvbnRhaW5lclNpemUoKTtcbiAgaWYgKCBzaXplICkge1xuICAgIHRoaXMuX3NldENvbnRhaW5lck1lYXN1cmUoIHNpemUud2lkdGgsIHRydWUgKTtcbiAgICB0aGlzLl9zZXRDb250YWluZXJNZWFzdXJlKCBzaXplLmhlaWdodCwgZmFsc2UgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZXRzIHdpZHRoIG9yIGhlaWdodCBvZiBjb250YWluZXIgaWYgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IHNpemVcbiAqICAgQHBhcmFtIHtOdW1iZXJ9IHdpZHRoXG4gKiAgIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAqL1xucHJvdG8uX2dldENvbnRhaW5lclNpemUgPSBub29wO1xuXG4vKipcbiAqIEBwYXJhbSB7TnVtYmVyfSBtZWFzdXJlIC0gc2l6ZSBvZiB3aWR0aCBvciBoZWlnaHRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNXaWR0aFxuICovXG5wcm90by5fc2V0Q29udGFpbmVyTWVhc3VyZSA9IGZ1bmN0aW9uKCBtZWFzdXJlLCBpc1dpZHRoICkge1xuICBpZiAoIG1lYXN1cmUgPT09IHVuZGVmaW5lZCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZWxlbVNpemUgPSB0aGlzLnNpemU7XG4gIC8vIGFkZCBwYWRkaW5nIGFuZCBib3JkZXIgd2lkdGggaWYgYm9yZGVyIGJveFxuICBpZiAoIGVsZW1TaXplLmlzQm9yZGVyQm94ICkge1xuICAgIG1lYXN1cmUgKz0gaXNXaWR0aCA/IGVsZW1TaXplLnBhZGRpbmdMZWZ0ICsgZWxlbVNpemUucGFkZGluZ1JpZ2h0ICtcbiAgICAgIGVsZW1TaXplLmJvcmRlckxlZnRXaWR0aCArIGVsZW1TaXplLmJvcmRlclJpZ2h0V2lkdGggOlxuICAgICAgZWxlbVNpemUucGFkZGluZ0JvdHRvbSArIGVsZW1TaXplLnBhZGRpbmdUb3AgK1xuICAgICAgZWxlbVNpemUuYm9yZGVyVG9wV2lkdGggKyBlbGVtU2l6ZS5ib3JkZXJCb3R0b21XaWR0aDtcbiAgfVxuXG4gIG1lYXN1cmUgPSBNYXRoLm1heCggbWVhc3VyZSwgMCApO1xuICB0aGlzLmVsZW1lbnQuc3R5bGVbIGlzV2lkdGggPyAnd2lkdGgnIDogJ2hlaWdodCcgXSA9IG1lYXN1cmUgKyAncHgnO1xufTtcblxuLyoqXG4gKiBlbWl0IGV2ZW50Q29tcGxldGUgb24gYSBjb2xsZWN0aW9uIG9mIGl0ZW1zIGV2ZW50c1xuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogQHBhcmFtIHtBcnJheX0gaXRlbXMgLSBPdXRsYXllci5JdGVtc1xuICovXG5wcm90by5fZW1pdENvbXBsZXRlT25JdGVtcyA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGl0ZW1zICkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBmdW5jdGlvbiBvbkNvbXBsZXRlKCkge1xuICAgIF90aGlzLmRpc3BhdGNoRXZlbnQoIGV2ZW50TmFtZSArICdDb21wbGV0ZScsIG51bGwsIFsgaXRlbXMgXSApO1xuICB9XG5cbiAgdmFyIGNvdW50ID0gaXRlbXMubGVuZ3RoO1xuICBpZiAoICFpdGVtcyB8fCAhY291bnQgKSB7XG4gICAgb25Db21wbGV0ZSgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBkb25lQ291bnQgPSAwO1xuICBmdW5jdGlvbiB0aWNrKCkge1xuICAgIGRvbmVDb3VudCsrO1xuICAgIGlmICggZG9uZUNvdW50ID09IGNvdW50ICkge1xuICAgICAgb25Db21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGJpbmQgY2FsbGJhY2tcbiAgaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgaXRlbS5vbmNlKCBldmVudE5hbWUsIHRpY2sgKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIGVtaXRzIGV2ZW50cyB2aWEgRXZFbWl0dGVyIGFuZCBqUXVlcnkgZXZlbnRzXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIG5hbWUgb2YgZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gb3JpZ2luYWwgZXZlbnRcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgLSBleHRyYSBhcmd1bWVudHNcbiAqL1xucHJvdG8uZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uKCB0eXBlLCBldmVudCwgYXJncyApIHtcbiAgLy8gYWRkIG9yaWdpbmFsIGV2ZW50IHRvIGFyZ3VtZW50c1xuICB2YXIgZW1pdEFyZ3MgPSBldmVudCA/IFsgZXZlbnQgXS5jb25jYXQoIGFyZ3MgKSA6IGFyZ3M7XG4gIHRoaXMuZW1pdEV2ZW50KCB0eXBlLCBlbWl0QXJncyApO1xuXG4gIGlmICggalF1ZXJ5ICkge1xuICAgIC8vIHNldCB0aGlzLiRlbGVtZW50XG4gICAgdGhpcy4kZWxlbWVudCA9IHRoaXMuJGVsZW1lbnQgfHwgalF1ZXJ5KCB0aGlzLmVsZW1lbnQgKTtcbiAgICBpZiAoIGV2ZW50ICkge1xuICAgICAgLy8gY3JlYXRlIGpRdWVyeSBldmVudFxuICAgICAgdmFyICRldmVudCA9IGpRdWVyeS5FdmVudCggZXZlbnQgKTtcbiAgICAgICRldmVudC50eXBlID0gdHlwZTtcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlciggJGV2ZW50LCBhcmdzICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGp1c3QgdHJpZ2dlciB3aXRoIHR5cGUgaWYgbm8gZXZlbnQgYXZhaWxhYmxlXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoIHR5cGUsIGFyZ3MgKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGlnbm9yZSAmIHN0YW1wcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5cbi8qKlxuICoga2VlcCBpdGVtIGluIGNvbGxlY3Rpb24sIGJ1dCBkbyBub3QgbGF5IGl0IG91dFxuICogaWdub3JlZCBpdGVtcyBkbyBub3QgZ2V0IHNraXBwZWQgaW4gbGF5b3V0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1cbiAqL1xucHJvdG8uaWdub3JlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtKCBlbGVtICk7XG4gIGlmICggaXRlbSApIHtcbiAgICBpdGVtLmlzSWdub3JlZCA9IHRydWU7XG4gIH1cbn07XG5cbi8qKlxuICogcmV0dXJuIGl0ZW0gdG8gbGF5b3V0IGNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICovXG5wcm90by51bmlnbm9yZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbSggZWxlbSApO1xuICBpZiAoIGl0ZW0gKSB7XG4gICAgZGVsZXRlIGl0ZW0uaXNJZ25vcmVkO1xuICB9XG59O1xuXG4vKipcbiAqIGFkZHMgZWxlbWVudHMgdG8gc3RhbXBzXG4gKiBAcGFyYW0ge05vZGVMaXN0LCBBcnJheSwgRWxlbWVudCwgb3IgU3RyaW5nfSBlbGVtc1xuICovXG5wcm90by5zdGFtcCA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgZWxlbXMgPSB0aGlzLl9maW5kKCBlbGVtcyApO1xuICBpZiAoICFlbGVtcyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnN0YW1wcyA9IHRoaXMuc3RhbXBzLmNvbmNhdCggZWxlbXMgKTtcbiAgLy8gaWdub3JlXG4gIGVsZW1zLmZvckVhY2goIHRoaXMuaWdub3JlLCB0aGlzICk7XG59O1xuXG4vKipcbiAqIHJlbW92ZXMgZWxlbWVudHMgdG8gc3RhbXBzXG4gKiBAcGFyYW0ge05vZGVMaXN0LCBBcnJheSwgb3IgRWxlbWVudH0gZWxlbXNcbiAqL1xucHJvdG8udW5zdGFtcCA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgZWxlbXMgPSB0aGlzLl9maW5kKCBlbGVtcyApO1xuICBpZiAoICFlbGVtcyApe1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgIC8vIGZpbHRlciBvdXQgcmVtb3ZlZCBzdGFtcCBlbGVtZW50c1xuICAgIHV0aWxzLnJlbW92ZUZyb20oIHRoaXMuc3RhbXBzLCBlbGVtICk7XG4gICAgdGhpcy51bmlnbm9yZSggZWxlbSApO1xuICB9LCB0aGlzICk7XG59O1xuXG4vKipcbiAqIGZpbmRzIGNoaWxkIGVsZW1lbnRzXG4gKiBAcGFyYW0ge05vZGVMaXN0LCBBcnJheSwgRWxlbWVudCwgb3IgU3RyaW5nfSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBlbGVtc1xuICovXG5wcm90by5fZmluZCA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgaWYgKCAhZWxlbXMgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGlmIHN0cmluZywgdXNlIGFyZ3VtZW50IGFzIHNlbGVjdG9yIHN0cmluZ1xuICBpZiAoIHR5cGVvZiBlbGVtcyA9PSAnc3RyaW5nJyApIHtcbiAgICBlbGVtcyA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCBlbGVtcyApO1xuICB9XG4gIGVsZW1zID0gdXRpbHMubWFrZUFycmF5KCBlbGVtcyApO1xuICByZXR1cm4gZWxlbXM7XG59O1xuXG5wcm90by5fbWFuYWdlU3RhbXBzID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMuc3RhbXBzIHx8ICF0aGlzLnN0YW1wcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5fZ2V0Qm91bmRpbmdSZWN0KCk7XG5cbiAgdGhpcy5zdGFtcHMuZm9yRWFjaCggdGhpcy5fbWFuYWdlU3RhbXAsIHRoaXMgKTtcbn07XG5cbi8vIHVwZGF0ZSBib3VuZGluZ0xlZnQgLyBUb3BcbnByb3RvLl9nZXRCb3VuZGluZ1JlY3QgPSBmdW5jdGlvbigpIHtcbiAgLy8gZ2V0IGJvdW5kaW5nIHJlY3QgZm9yIGNvbnRhaW5lciBlbGVtZW50XG4gIHZhciBib3VuZGluZ1JlY3QgPSB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzaXplID0gdGhpcy5zaXplO1xuICB0aGlzLl9ib3VuZGluZ1JlY3QgPSB7XG4gICAgbGVmdDogYm91bmRpbmdSZWN0LmxlZnQgKyBzaXplLnBhZGRpbmdMZWZ0ICsgc2l6ZS5ib3JkZXJMZWZ0V2lkdGgsXG4gICAgdG9wOiBib3VuZGluZ1JlY3QudG9wICsgc2l6ZS5wYWRkaW5nVG9wICsgc2l6ZS5ib3JkZXJUb3BXaWR0aCxcbiAgICByaWdodDogYm91bmRpbmdSZWN0LnJpZ2h0IC0gKCBzaXplLnBhZGRpbmdSaWdodCArIHNpemUuYm9yZGVyUmlnaHRXaWR0aCApLFxuICAgIGJvdHRvbTogYm91bmRpbmdSZWN0LmJvdHRvbSAtICggc2l6ZS5wYWRkaW5nQm90dG9tICsgc2l6ZS5ib3JkZXJCb3R0b21XaWR0aCApXG4gIH07XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gc3RhbXBcbioqL1xucHJvdG8uX21hbmFnZVN0YW1wID0gbm9vcDtcblxuLyoqXG4gKiBnZXQgeC95IHBvc2l0aW9uIG9mIGVsZW1lbnQgcmVsYXRpdmUgdG8gY29udGFpbmVyIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICogQHJldHVybnMge09iamVjdH0gb2Zmc2V0IC0gaGFzIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbVxuICovXG5wcm90by5fZ2V0RWxlbWVudE9mZnNldCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB2YXIgYm91bmRpbmdSZWN0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHRoaXNSZWN0ID0gdGhpcy5fYm91bmRpbmdSZWN0O1xuICB2YXIgc2l6ZSA9IGdldFNpemUoIGVsZW0gKTtcbiAgdmFyIG9mZnNldCA9IHtcbiAgICBsZWZ0OiBib3VuZGluZ1JlY3QubGVmdCAtIHRoaXNSZWN0LmxlZnQgLSBzaXplLm1hcmdpbkxlZnQsXG4gICAgdG9wOiBib3VuZGluZ1JlY3QudG9wIC0gdGhpc1JlY3QudG9wIC0gc2l6ZS5tYXJnaW5Ub3AsXG4gICAgcmlnaHQ6IHRoaXNSZWN0LnJpZ2h0IC0gYm91bmRpbmdSZWN0LnJpZ2h0IC0gc2l6ZS5tYXJnaW5SaWdodCxcbiAgICBib3R0b206IHRoaXNSZWN0LmJvdHRvbSAtIGJvdW5kaW5nUmVjdC5ib3R0b20gLSBzaXplLm1hcmdpbkJvdHRvbVxuICB9O1xuICByZXR1cm4gb2Zmc2V0O1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVzaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGVuYWJsZSBldmVudCBoYW5kbGVycyBmb3IgbGlzdGVuZXJzXG4vLyBpLmUuIHJlc2l6ZSAtPiBvbnJlc2l6ZVxucHJvdG8uaGFuZGxlRXZlbnQgPSB1dGlscy5oYW5kbGVFdmVudDtcblxuLyoqXG4gKiBCaW5kIGxheW91dCB0byB3aW5kb3cgcmVzaXppbmdcbiAqL1xucHJvdG8uYmluZFJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3Jlc2l6ZScsIHRoaXMgKTtcbiAgdGhpcy5pc1Jlc2l6ZUJvdW5kID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogVW5iaW5kIGxheW91dCB0byB3aW5kb3cgcmVzaXppbmdcbiAqL1xucHJvdG8udW5iaW5kUmVzaXplID0gZnVuY3Rpb24oKSB7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAncmVzaXplJywgdGhpcyApO1xuICB0aGlzLmlzUmVzaXplQm91bmQgPSBmYWxzZTtcbn07XG5cbnByb3RvLm9ucmVzaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVzaXplKCk7XG59O1xuXG51dGlscy5kZWJvdW5jZU1ldGhvZCggT3V0bGF5ZXIsICdvbnJlc2l6ZScsIDEwMCApO1xuXG5wcm90by5yZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgLy8gZG9uJ3QgdHJpZ2dlciBpZiBzaXplIGRpZCBub3QgY2hhbmdlXG4gIC8vIG9yIGlmIHJlc2l6ZSB3YXMgdW5ib3VuZC4gU2VlICM5XG4gIGlmICggIXRoaXMuaXNSZXNpemVCb3VuZCB8fCAhdGhpcy5uZWVkc1Jlc2l6ZUxheW91dCgpICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMubGF5b3V0KCk7XG59O1xuXG4vKipcbiAqIGNoZWNrIGlmIGxheW91dCBpcyBuZWVkZWQgcG9zdCBsYXlvdXRcbiAqIEByZXR1cm5zIEJvb2xlYW5cbiAqL1xucHJvdG8ubmVlZHNSZXNpemVMYXlvdXQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNpemUgPSBnZXRTaXplKCB0aGlzLmVsZW1lbnQgKTtcbiAgLy8gY2hlY2sgdGhhdCB0aGlzLnNpemUgYW5kIHNpemUgYXJlIHRoZXJlXG4gIC8vIElFOCB0cmlnZ2VycyByZXNpemUgb24gYm9keSBzaXplIGNoYW5nZSwgc28gdGhleSBtaWdodCBub3QgYmVcbiAgdmFyIGhhc1NpemVzID0gdGhpcy5zaXplICYmIHNpemU7XG4gIHJldHVybiBoYXNTaXplcyAmJiBzaXplLmlubmVyV2lkdGggIT09IHRoaXMuc2l6ZS5pbm5lcldpZHRoO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIGFkZCBpdGVtcyB0byBPdXRsYXllciBpbnN0YW5jZVxuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBFbGVtZW50fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIE91dGxheWVyLkl0ZW1zXG4qKi9cbnByb3RvLmFkZEl0ZW1zID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtaXplKCBlbGVtcyApO1xuICAvLyBhZGQgaXRlbXMgdG8gY29sbGVjdGlvblxuICBpZiAoIGl0ZW1zLmxlbmd0aCApIHtcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5jb25jYXQoIGl0ZW1zICk7XG4gIH1cbiAgcmV0dXJuIGl0ZW1zO1xufTtcblxuLyoqXG4gKiBMYXlvdXQgbmV3bHktYXBwZW5kZWQgaXRlbSBlbGVtZW50c1xuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBFbGVtZW50fSBlbGVtc1xuICovXG5wcm90by5hcHBlbmRlZCA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIGl0ZW1zID0gdGhpcy5hZGRJdGVtcyggZWxlbXMgKTtcbiAgaWYgKCAhaXRlbXMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBsYXlvdXQgYW5kIHJldmVhbCBqdXN0IHRoZSBuZXcgaXRlbXNcbiAgdGhpcy5sYXlvdXRJdGVtcyggaXRlbXMsIHRydWUgKTtcbiAgdGhpcy5yZXZlYWwoIGl0ZW1zICk7XG59O1xuXG4vKipcbiAqIExheW91dCBwcmVwZW5kZWQgZWxlbWVudHNcbiAqIEBwYXJhbSB7QXJyYXkgb3IgTm9kZUxpc3Qgb3IgRWxlbWVudH0gZWxlbXNcbiAqL1xucHJvdG8ucHJlcGVuZGVkID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtaXplKCBlbGVtcyApO1xuICBpZiAoICFpdGVtcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGFkZCBpdGVtcyB0byBiZWdpbm5pbmcgb2YgY29sbGVjdGlvblxuICB2YXIgcHJldmlvdXNJdGVtcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCk7XG4gIHRoaXMuaXRlbXMgPSBpdGVtcy5jb25jYXQoIHByZXZpb3VzSXRlbXMgKTtcbiAgLy8gc3RhcnQgbmV3IGxheW91dFxuICB0aGlzLl9yZXNldExheW91dCgpO1xuICB0aGlzLl9tYW5hZ2VTdGFtcHMoKTtcbiAgLy8gbGF5b3V0IG5ldyBzdHVmZiB3aXRob3V0IHRyYW5zaXRpb25cbiAgdGhpcy5sYXlvdXRJdGVtcyggaXRlbXMsIHRydWUgKTtcbiAgdGhpcy5yZXZlYWwoIGl0ZW1zICk7XG4gIC8vIGxheW91dCBwcmV2aW91cyBpdGVtc1xuICB0aGlzLmxheW91dEl0ZW1zKCBwcmV2aW91c0l0ZW1zICk7XG59O1xuXG4vKipcbiAqIHJldmVhbCBhIGNvbGxlY3Rpb24gb2YgaXRlbXNcbiAqIEBwYXJhbSB7QXJyYXkgb2YgT3V0bGF5ZXIuSXRlbXN9IGl0ZW1zXG4gKi9cbnByb3RvLnJldmVhbCA9IGZ1bmN0aW9uKCBpdGVtcyApIHtcbiAgdGhpcy5fZW1pdENvbXBsZXRlT25JdGVtcyggJ3JldmVhbCcsIGl0ZW1zICk7XG4gIGlmICggIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBzdGFnZ2VyID0gdGhpcy51cGRhdGVTdGFnZ2VyKCk7XG4gIGl0ZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBpdGVtLCBpICkge1xuICAgIGl0ZW0uc3RhZ2dlciggaSAqIHN0YWdnZXIgKTtcbiAgICBpdGVtLnJldmVhbCgpO1xuICB9KTtcbn07XG5cbi8qKlxuICogaGlkZSBhIGNvbGxlY3Rpb24gb2YgaXRlbXNcbiAqIEBwYXJhbSB7QXJyYXkgb2YgT3V0bGF5ZXIuSXRlbXN9IGl0ZW1zXG4gKi9cbnByb3RvLmhpZGUgPSBmdW5jdGlvbiggaXRlbXMgKSB7XG4gIHRoaXMuX2VtaXRDb21wbGV0ZU9uSXRlbXMoICdoaWRlJywgaXRlbXMgKTtcbiAgaWYgKCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHN0YWdnZXIgPSB0aGlzLnVwZGF0ZVN0YWdnZXIoKTtcbiAgaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0sIGkgKSB7XG4gICAgaXRlbS5zdGFnZ2VyKCBpICogc3RhZ2dlciApO1xuICAgIGl0ZW0uaGlkZSgpO1xuICB9KTtcbn07XG5cbi8qKlxuICogcmV2ZWFsIGl0ZW0gZWxlbWVudHNcbiAqIEBwYXJhbSB7QXJyYXl9LCB7RWxlbWVudH0sIHtOb2RlTGlzdH0gaXRlbXNcbiAqL1xucHJvdG8ucmV2ZWFsSXRlbUVsZW1lbnRzID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCBlbGVtcyApO1xuICB0aGlzLnJldmVhbCggaXRlbXMgKTtcbn07XG5cbi8qKlxuICogaGlkZSBpdGVtIGVsZW1lbnRzXG4gKiBAcGFyYW0ge0FycmF5fSwge0VsZW1lbnR9LCB7Tm9kZUxpc3R9IGl0ZW1zXG4gKi9cbnByb3RvLmhpZGVJdGVtRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoIGVsZW1zICk7XG4gIHRoaXMuaGlkZSggaXRlbXMgKTtcbn07XG5cbi8qKlxuICogZ2V0IE91dGxheWVyLkl0ZW0sIGdpdmVuIGFuIEVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtPdXRsYXllci5JdGVtfSBpdGVtXG4gKi9cbnByb3RvLmdldEl0ZW0gPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgLy8gbG9vcCB0aHJvdWdoIGl0ZW1zIHRvIGdldCB0aGUgb25lIHRoYXQgbWF0Y2hlc1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaV07XG4gICAgaWYgKCBpdGVtLmVsZW1lbnQgPT0gZWxlbSApIHtcbiAgICAgIC8vIHJldHVybiBpdGVtXG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogZ2V0IGNvbGxlY3Rpb24gb2YgT3V0bGF5ZXIuSXRlbXMsIGdpdmVuIEVsZW1lbnRzXG4gKiBAcGFyYW0ge0FycmF5fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIE91dGxheWVyLkl0ZW1zXG4gKi9cbnByb3RvLmdldEl0ZW1zID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICBlbGVtcyA9IHV0aWxzLm1ha2VBcnJheSggZWxlbXMgKTtcbiAgdmFyIGl0ZW1zID0gW107XG4gIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtKCBlbGVtICk7XG4gICAgaWYgKCBpdGVtICkge1xuICAgICAgaXRlbXMucHVzaCggaXRlbSApO1xuICAgIH1cbiAgfSwgdGhpcyApO1xuXG4gIHJldHVybiBpdGVtcztcbn07XG5cbi8qKlxuICogcmVtb3ZlIGVsZW1lbnQocykgZnJvbSBpbnN0YW5jZSBhbmQgRE9NXG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEVsZW1lbnR9IGVsZW1zXG4gKi9cbnByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIHJlbW92ZUl0ZW1zID0gdGhpcy5nZXRJdGVtcyggZWxlbXMgKTtcblxuICB0aGlzLl9lbWl0Q29tcGxldGVPbkl0ZW1zKCAncmVtb3ZlJywgcmVtb3ZlSXRlbXMgKTtcblxuICAvLyBiYWlsIGlmIG5vIGl0ZW1zIHRvIHJlbW92ZVxuICBpZiAoICFyZW1vdmVJdGVtcyB8fCAhcmVtb3ZlSXRlbXMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlbW92ZUl0ZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBpdGVtICkge1xuICAgIGl0ZW0ucmVtb3ZlKCk7XG4gICAgLy8gcmVtb3ZlIGl0ZW0gZnJvbSBjb2xsZWN0aW9uXG4gICAgdXRpbHMucmVtb3ZlRnJvbSggdGhpcy5pdGVtcywgaXRlbSApO1xuICB9LCB0aGlzICk7XG59O1xuXG4vLyAtLS0tLSBkZXN0cm95IC0tLS0tIC8vXG5cbi8vIHJlbW92ZSBhbmQgZGlzYWJsZSBPdXRsYXllciBpbnN0YW5jZVxucHJvdG8uZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAvLyBjbGVhbiB1cCBkeW5hbWljIHN0eWxlc1xuICB2YXIgc3R5bGUgPSB0aGlzLmVsZW1lbnQuc3R5bGU7XG4gIHN0eWxlLmhlaWdodCA9ICcnO1xuICBzdHlsZS5wb3NpdGlvbiA9ICcnO1xuICBzdHlsZS53aWR0aCA9ICcnO1xuICAvLyBkZXN0cm95IGl0ZW1zXG4gIHRoaXMuaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgaXRlbS5kZXN0cm95KCk7XG4gIH0pO1xuXG4gIHRoaXMudW5iaW5kUmVzaXplKCk7XG5cbiAgdmFyIGlkID0gdGhpcy5lbGVtZW50Lm91dGxheWVyR1VJRDtcbiAgZGVsZXRlIGluc3RhbmNlc1sgaWQgXTsgLy8gcmVtb3ZlIHJlZmVyZW5jZSB0byBpbnN0YW5jZSBieSBpZFxuICBkZWxldGUgdGhpcy5lbGVtZW50Lm91dGxheWVyR1VJRDtcbiAgLy8gcmVtb3ZlIGRhdGEgZm9yIGpRdWVyeVxuICBpZiAoIGpRdWVyeSApIHtcbiAgICBqUXVlcnkucmVtb3ZlRGF0YSggdGhpcy5lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLm5hbWVzcGFjZSApO1xuICB9XG5cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBnZXQgT3V0bGF5ZXIgaW5zdGFuY2UgZnJvbSBlbGVtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1cbiAqIEByZXR1cm5zIHtPdXRsYXllcn1cbiAqL1xuT3V0bGF5ZXIuZGF0YSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICBlbGVtID0gdXRpbHMuZ2V0UXVlcnlFbGVtZW50KCBlbGVtICk7XG4gIHZhciBpZCA9IGVsZW0gJiYgZWxlbS5vdXRsYXllckdVSUQ7XG4gIHJldHVybiBpZCAmJiBpbnN0YW5jZXNbIGlkIF07XG59O1xuXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNyZWF0ZSBPdXRsYXllciBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIGNyZWF0ZSBhIGxheW91dCBjbGFzc1xuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICovXG5PdXRsYXllci5jcmVhdGUgPSBmdW5jdGlvbiggbmFtZXNwYWNlLCBvcHRpb25zICkge1xuICAvLyBzdWItY2xhc3MgT3V0bGF5ZXJcbiAgdmFyIExheW91dCA9IHN1YmNsYXNzKCBPdXRsYXllciApO1xuICAvLyBhcHBseSBuZXcgb3B0aW9ucyBhbmQgY29tcGF0T3B0aW9uc1xuICBMYXlvdXQuZGVmYXVsdHMgPSB1dGlscy5leHRlbmQoIHt9LCBPdXRsYXllci5kZWZhdWx0cyApO1xuICB1dGlscy5leHRlbmQoIExheW91dC5kZWZhdWx0cywgb3B0aW9ucyApO1xuICBMYXlvdXQuY29tcGF0T3B0aW9ucyA9IHV0aWxzLmV4dGVuZCgge30sIE91dGxheWVyLmNvbXBhdE9wdGlvbnMgICk7XG5cbiAgTGF5b3V0Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblxuICBMYXlvdXQuZGF0YSA9IE91dGxheWVyLmRhdGE7XG5cbiAgLy8gc3ViLWNsYXNzIEl0ZW1cbiAgTGF5b3V0Lkl0ZW0gPSBzdWJjbGFzcyggSXRlbSApO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlY2xhcmF0aXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgdXRpbHMuaHRtbEluaXQoIExheW91dCwgbmFtZXNwYWNlICk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0galF1ZXJ5IGJyaWRnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4gIC8vIG1ha2UgaW50byBqUXVlcnkgcGx1Z2luXG4gIGlmICggalF1ZXJ5ICYmIGpRdWVyeS5icmlkZ2V0ICkge1xuICAgIGpRdWVyeS5icmlkZ2V0KCBuYW1lc3BhY2UsIExheW91dCApO1xuICB9XG5cbiAgcmV0dXJuIExheW91dDtcbn07XG5cbmZ1bmN0aW9uIHN1YmNsYXNzKCBQYXJlbnQgKSB7XG4gIGZ1bmN0aW9uIFN1YkNsYXNzKCkge1xuICAgIFBhcmVudC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG4gIH1cblxuICBTdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQYXJlbnQucHJvdG90eXBlICk7XG4gIFN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFN1YkNsYXNzO1xuXG4gIHJldHVybiBTdWJDbGFzcztcbn1cblxuLy8gLS0tLS0gaGVscGVycyAtLS0tLSAvL1xuXG4vLyBob3cgbWFueSBtaWxsaXNlY29uZHMgYXJlIGluIGVhY2ggdW5pdFxudmFyIG1zVW5pdHMgPSB7XG4gIG1zOiAxLFxuICBzOiAxMDAwXG59O1xuXG4vLyBtdW5nZSB0aW1lLWxpa2UgcGFyYW1ldGVyIGludG8gbWlsbGlzZWNvbmQgbnVtYmVyXG4vLyAnMC40cycgLT4gNDBcbmZ1bmN0aW9uIGdldE1pbGxpc2Vjb25kcyggdGltZSApIHtcbiAgaWYgKCB0eXBlb2YgdGltZSA9PSAnbnVtYmVyJyApIHtcbiAgICByZXR1cm4gdGltZTtcbiAgfVxuICB2YXIgbWF0Y2hlcyA9IHRpbWUubWF0Y2goIC8oXlxcZCpcXC4/XFxkKikoXFx3KikvICk7XG4gIHZhciBudW0gPSBtYXRjaGVzICYmIG1hdGNoZXNbMV07XG4gIHZhciB1bml0ID0gbWF0Y2hlcyAmJiBtYXRjaGVzWzJdO1xuICBpZiAoICFudW0ubGVuZ3RoICkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIG51bSA9IHBhcnNlRmxvYXQoIG51bSApO1xuICB2YXIgbXVsdCA9IG1zVW5pdHNbIHVuaXQgXSB8fCAxO1xuICByZXR1cm4gbnVtICogbXVsdDtcbn1cblxuLy8gLS0tLS0gZmluIC0tLS0tIC8vXG5cbi8vIGJhY2sgaW4gZ2xvYmFsXG5PdXRsYXllci5JdGVtID0gSXRlbTtcblxucmV0dXJuIE91dGxheWVyO1xuXG59KSk7XG4iLCIhZnVuY3Rpb24ocm9vdCwgZmFjdG9yeSkge1xuICAgIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQgPyAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUgdW5sZXNzIGFtZE1vZHVsZUlkIGlzIHNldFxuICAgIGRlZmluZShbXSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByb290LnN2ZzRldmVyeWJvZHkgPSBmYWN0b3J5KCk7XG4gICAgfSkgOiBcIm9iamVjdFwiID09IHR5cGVvZiBtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMgPyAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXRcbiAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAvLyBsaWtlIE5vZGUuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOiByb290LnN2ZzRldmVyeWJvZHkgPSBmYWN0b3J5KCk7XG59KHRoaXMsIGZ1bmN0aW9uKCkge1xuICAgIC8qISBzdmc0ZXZlcnlib2R5IHYyLjEuOSB8IGdpdGh1Yi5jb20vam9uYXRoYW50bmVhbC9zdmc0ZXZlcnlib2R5ICovXG4gICAgZnVuY3Rpb24gZW1iZWQocGFyZW50LCBzdmcsIHRhcmdldCkge1xuICAgICAgICAvLyBpZiB0aGUgdGFyZ2V0IGV4aXN0c1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgYSBkb2N1bWVudCBmcmFnbWVudCB0byBob2xkIHRoZSBjb250ZW50cyBvZiB0aGUgdGFyZ2V0XG4gICAgICAgICAgICB2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksIHZpZXdCb3ggPSAhc3ZnLmhhc0F0dHJpYnV0ZShcInZpZXdCb3hcIikgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShcInZpZXdCb3hcIik7XG4gICAgICAgICAgICAvLyBjb25kaXRpb25hbGx5IHNldCB0aGUgdmlld0JveCBvbiB0aGUgc3ZnXG4gICAgICAgICAgICB2aWV3Qm94ICYmIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIHZpZXdCb3gpO1xuICAgICAgICAgICAgLy8gY29weSB0aGUgY29udGVudHMgb2YgdGhlIGNsb25lIGludG8gdGhlIGZyYWdtZW50XG4gICAgICAgICAgICBmb3IgKC8vIGNsb25lIHRoZSB0YXJnZXRcbiAgICAgICAgICAgIHZhciBjbG9uZSA9IHRhcmdldC5jbG9uZU5vZGUoITApOyBjbG9uZS5jaGlsZE5vZGVzLmxlbmd0aDsgKSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY2xvbmUuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhcHBlbmQgdGhlIGZyYWdtZW50IGludG8gdGhlIHN2Z1xuICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBsb2FkcmVhZHlzdGF0ZWNoYW5nZSh4aHIpIHtcbiAgICAgICAgLy8gbGlzdGVuIHRvIGNoYW5nZXMgaW4gdGhlIHJlcXVlc3RcbiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHJlcXVlc3QgaXMgcmVhZHlcbiAgICAgICAgICAgIGlmICg0ID09PSB4aHIucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY2FjaGVkIGh0bWwgZG9jdW1lbnRcbiAgICAgICAgICAgICAgICB2YXIgY2FjaGVkRG9jdW1lbnQgPSB4aHIuX2NhY2hlZERvY3VtZW50O1xuICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGUgY2FjaGVkIGh0bWwgZG9jdW1lbnQgYmFzZWQgb24gdGhlIHhociByZXNwb25zZVxuICAgICAgICAgICAgICAgIGNhY2hlZERvY3VtZW50IHx8IChjYWNoZWREb2N1bWVudCA9IHhoci5fY2FjaGVkRG9jdW1lbnQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoXCJcIiksIFxuICAgICAgICAgICAgICAgIGNhY2hlZERvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0geGhyLnJlc3BvbnNlVGV4dCwgeGhyLl9jYWNoZWRUYXJnZXQgPSB7fSksIC8vIGNsZWFyIHRoZSB4aHIgZW1iZWRzIGxpc3QgYW5kIGVtYmVkIGVhY2ggaXRlbVxuICAgICAgICAgICAgICAgIHhoci5fZW1iZWRzLnNwbGljZSgwKS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNhY2hlZCB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHhoci5fY2FjaGVkVGFyZ2V0W2l0ZW0uaWRdO1xuICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhlIGNhY2hlZCB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0IHx8ICh0YXJnZXQgPSB4aHIuX2NhY2hlZFRhcmdldFtpdGVtLmlkXSA9IGNhY2hlZERvY3VtZW50LmdldEVsZW1lbnRCeUlkKGl0ZW0uaWQpKSwgXG4gICAgICAgICAgICAgICAgICAgIC8vIGVtYmVkIHRoZSB0YXJnZXQgaW50byB0aGUgc3ZnXG4gICAgICAgICAgICAgICAgICAgIGVtYmVkKGl0ZW0ucGFyZW50LCBpdGVtLnN2ZywgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgLy8gdGVzdCB0aGUgcmVhZHkgc3RhdGUgY2hhbmdlIGltbWVkaWF0ZWx5XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3ZnNGV2ZXJ5Ym9keShyYXdvcHRzKSB7XG4gICAgICAgIGZ1bmN0aW9uIG9uaW50ZXJ2YWwoKSB7XG4gICAgICAgICAgICAvLyB3aGlsZSB0aGUgaW5kZXggZXhpc3RzIGluIHRoZSBsaXZlIDx1c2U+IGNvbGxlY3Rpb25cbiAgICAgICAgICAgIGZvciAoLy8gZ2V0IHRoZSBjYWNoZWQgPHVzZT4gaW5kZXhcbiAgICAgICAgICAgIHZhciBpbmRleCA9IDA7IGluZGV4IDwgdXNlcy5sZW5ndGg7ICkge1xuICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY3VycmVudCA8dXNlPlxuICAgICAgICAgICAgICAgIHZhciB1c2UgPSB1c2VzW2luZGV4XSwgcGFyZW50ID0gdXNlLnBhcmVudE5vZGUsIHN2ZyA9IGdldFNWR0FuY2VzdG9yKHBhcmVudCksIHNyYyA9IHVzZS5nZXRBdHRyaWJ1dGUoXCJ4bGluazpocmVmXCIpIHx8IHVzZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgICAgIGlmICghc3JjICYmIG9wdHMuYXR0cmlidXRlTmFtZSAmJiAoc3JjID0gdXNlLmdldEF0dHJpYnV0ZShvcHRzLmF0dHJpYnV0ZU5hbWUpKSwgXG4gICAgICAgICAgICAgICAgc3ZnICYmIHNyYykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9seWZpbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0cy52YWxpZGF0ZSB8fCBvcHRzLnZhbGlkYXRlKHNyYywgc3ZnLCB1c2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSA8dXNlPiBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHVzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHNyYyBhbmQgZ2V0IHRoZSB1cmwgYW5kIGlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNyY1NwbGl0ID0gc3JjLnNwbGl0KFwiI1wiKSwgdXJsID0gc3JjU3BsaXQuc2hpZnQoKSwgaWQgPSBzcmNTcGxpdC5qb2luKFwiI1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbGluayBpcyBleHRlcm5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmwubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY2FjaGVkIHhociByZXF1ZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSByZXF1ZXN0c1t1cmxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhlIHhociByZXF1ZXN0IGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIgfHwgKHhociA9IHJlcXVlc3RzW3VybF0gPSBuZXcgWE1MSHR0cFJlcXVlc3QoKSwgeGhyLm9wZW4oXCJHRVRcIiwgdXJsKSwgeGhyLnNlbmQoKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5fZW1iZWRzID0gW10pLCAvLyBhZGQgdGhlIHN2ZyBhbmQgaWQgYXMgYW4gaXRlbSB0byB0aGUgeGhyIGVtYmVkcyBsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5fZW1iZWRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmc6IHN2ZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgLy8gcHJlcGFyZSB0aGUgeGhyIHJlYWR5IHN0YXRlIGNoYW5nZSBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkcmVhZHlzdGF0ZWNoYW5nZSh4aHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtYmVkIHRoZSBsb2NhbCBpZCBpbnRvIHRoZSBzdmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWQocGFyZW50LCBzdmcsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZSB0aGUgaW5kZXggd2hlbiB0aGUgcHJldmlvdXMgdmFsdWUgd2FzIG5vdCBcInZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2luZGV4LCArK251bWJlck9mU3ZnVXNlRWxlbWVudHNUb0J5cGFzcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlIHRoZSBpbmRleCB3aGVuIHRoZSBwcmV2aW91cyB2YWx1ZSB3YXMgbm90IFwidmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICArK2luZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRoZSBpbnRlcnZhbFxuICAgICAgICAgICAgKCF1c2VzLmxlbmd0aCB8fCB1c2VzLmxlbmd0aCAtIG51bWJlck9mU3ZnVXNlRWxlbWVudHNUb0J5cGFzcyA+IDApICYmIHJlcXVlc3RBbmltYXRpb25GcmFtZShvbmludGVydmFsLCA2Nyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvbHlmaWxsLCBvcHRzID0gT2JqZWN0KHJhd29wdHMpLCBuZXdlcklFVUEgPSAvXFxiVHJpZGVudFxcL1s1NjddXFxifFxcYk1TSUUgKD86OXwxMClcXC4wXFxiLywgd2Via2l0VUEgPSAvXFxiQXBwbGVXZWJLaXRcXC8oXFxkKylcXGIvLCBvbGRlckVkZ2VVQSA9IC9cXGJFZGdlXFwvMTJcXC4oXFxkKylcXGIvLCBlZGdlVUEgPSAvXFxiRWRnZVxcLy4oXFxkKylcXGIvLCBpbklmcmFtZSA9IHdpbmRvdy50b3AgIT09IHdpbmRvdy5zZWxmO1xuICAgICAgICBwb2x5ZmlsbCA9IFwicG9seWZpbGxcIiBpbiBvcHRzID8gb3B0cy5wb2x5ZmlsbCA6IG5ld2VySUVVQS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKG9sZGVyRWRnZVVBKSB8fCBbXSlbMV0gPCAxMDU0NyB8fCAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCh3ZWJraXRVQSkgfHwgW10pWzFdIDwgNTM3IHx8IGVkZ2VVQS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmIGluSWZyYW1lO1xuICAgICAgICAvLyBjcmVhdGUgeGhyIHJlcXVlc3RzIG9iamVjdFxuICAgICAgICB2YXIgcmVxdWVzdHMgPSB7fSwgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzZXRUaW1lb3V0LCB1c2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ1c2VcIiksIG51bWJlck9mU3ZnVXNlRWxlbWVudHNUb0J5cGFzcyA9IDA7XG4gICAgICAgIC8vIGNvbmRpdGlvbmFsbHkgc3RhcnQgdGhlIGludGVydmFsIGlmIHRoZSBwb2x5ZmlsbCBpcyBhY3RpdmVcbiAgICAgICAgcG9seWZpbGwgJiYgb25pbnRlcnZhbCgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTVkdBbmNlc3Rvcihub2RlKSB7XG4gICAgICAgIGZvciAodmFyIHN2ZyA9IG5vZGU7IFwic3ZnXCIgIT09IHN2Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICYmIChzdmcgPSBzdmcucGFyZW50Tm9kZSk7ICkge31cbiAgICAgICAgcmV0dXJuIHN2ZztcbiAgICB9XG4gICAgcmV0dXJuIHN2ZzRldmVyeWJvZHk7XG59KTsiLCIvKiEgVUlraXQgMi4yNy40IHwgaHR0cDovL3d3dy5nZXR1aWtpdC5jb20gfCAoYykgMjAxNCBZT090aGVtZSB8IE1JVCBMaWNlbnNlICovXG4oZnVuY3Rpb24oY29yZSkge1xuXG4gICAgdmFyIHVpa2l0O1xuXG4gICAgaWYgKCF3aW5kb3cualF1ZXJ5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVUlraXQgMi54IHJlcXVpcmVzIGpRdWVyeScpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHVpa2l0ID0gY29yZSh3aW5kb3cualF1ZXJ5KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsgLy8gQU1EXG5cbiAgICAgICAgZGVmaW5lKCd1aWtpdCcsIGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgIHVpa2l0LmxvYWQgPSBmdW5jdGlvbihyZXMsIHJlcSwgb25sb2FkLCBjb25maWcpIHtcblxuICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSByZXMuc3BsaXQoJywnKSwgbG9hZCA9IFtdLCBpLCBiYXNlID0gKGNvbmZpZy5jb25maWcgJiYgY29uZmlnLmNvbmZpZy51aWtpdCAmJiBjb25maWcuY29uZmlnLnVpa2l0LmJhc2UgPyBjb25maWcuY29uZmlnLnVpa2l0LmJhc2UgOiAnJykucmVwbGFjZSgvXFwvKyQvZywgJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFiYXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIGRlZmluZSBiYXNlIHBhdGggdG8gVUlraXQgaW4gdGhlIHJlcXVpcmVqcyBjb25maWcuJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV0ucmVwbGFjZSgvXFwuL2csICcvJyk7XG4gICAgICAgICAgICAgICAgICAgIGxvYWQucHVzaChiYXNlKycvY29tcG9uZW50cy8nK3Jlc291cmNlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXEobG9hZCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ubG9hZCh1aWtpdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gdWlraXQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxufSkoZnVuY3Rpb24oJCkge1xuXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAod2luZG93LlVJa2l0Mikge1xuICAgICAgICByZXR1cm4gd2luZG93LlVJa2l0MjtcbiAgICB9XG5cbiAgICB2YXIgVUkgPSB7fSwgX1VJID0gd2luZG93LlVJa2l0IHx8IHVuZGVmaW5lZDtcblxuICAgIFVJLnZlcnNpb24gPSAnMi4yNy40JztcblxuICAgIFVJLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gcmVzdG9yZSBVSWtpdCB2ZXJzaW9uXG4gICAgICAgIGlmIChfVUkpIHtcbiAgICAgICAgICAgIHdpbmRvdy5VSWtpdCA9IF9VSTtcbiAgICAgICAgICAgICQuVUlraXQgICAgICA9IF9VSTtcbiAgICAgICAgICAgICQuZm4udWsgICAgICA9IF9VSS5mbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBVSTtcbiAgICB9O1xuXG4gICAgd2luZG93LlVJa2l0MiA9IFVJO1xuXG4gICAgaWYgKCFfVUkpIHtcbiAgICAgICAgd2luZG93LlVJa2l0ID0gVUk7XG4gICAgfVxuXG4gICAgLy8gY2FjaGUgalF1ZXJ5XG4gICAgVUkuJCA9ICQ7XG5cbiAgICBVSS4kZG9jICA9IFVJLiQoZG9jdW1lbnQpO1xuICAgIFVJLiR3aW4gID0gVUkuJCh3aW5kb3cpO1xuICAgIFVJLiRodG1sID0gVUkuJCgnaHRtbCcpO1xuXG4gICAgVUkuc3VwcG9ydCA9IHt9O1xuICAgIFVJLnN1cHBvcnQudHJhbnNpdGlvbiA9IChmdW5jdGlvbigpIHtcblxuICAgICAgICB2YXIgdHJhbnNpdGlvbkVuZCA9IChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5ib2R5IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgICAgICAgICAgICB0cmFuc0VuZEV2ZW50TmFtZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIFdlYmtpdFRyYW5zaXRpb24gOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXG4gICAgICAgICAgICAgICAgICAgIE1velRyYW5zaXRpb24gICAgOiAndHJhbnNpdGlvbmVuZCcsXG4gICAgICAgICAgICAgICAgICAgIE9UcmFuc2l0aW9uICAgICAgOiAnb1RyYW5zaXRpb25FbmQgb3RyYW5zaXRpb25lbmQnLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uICAgICAgIDogJ3RyYW5zaXRpb25lbmQnXG4gICAgICAgICAgICAgICAgfSwgbmFtZTtcblxuICAgICAgICAgICAgZm9yIChuYW1lIGluIHRyYW5zRW5kRXZlbnROYW1lcykge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnN0eWxlW25hbWVdICE9PSB1bmRlZmluZWQpIHJldHVybiB0cmFuc0VuZEV2ZW50TmFtZXNbbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0oKSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYW5zaXRpb25FbmQgJiYgeyBlbmQ6IHRyYW5zaXRpb25FbmQgfTtcbiAgICB9KSgpO1xuXG4gICAgVUkuc3VwcG9ydC5hbmltYXRpb24gPSAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgdmFyIGFuaW1hdGlvbkVuZCA9IChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5ib2R5IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgICAgICAgICAgICBhbmltRW5kRXZlbnROYW1lcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgV2Via2l0QW5pbWF0aW9uIDogJ3dlYmtpdEFuaW1hdGlvbkVuZCcsXG4gICAgICAgICAgICAgICAgICAgIE1vekFuaW1hdGlvbiAgICA6ICdhbmltYXRpb25lbmQnLFxuICAgICAgICAgICAgICAgICAgICBPQW5pbWF0aW9uICAgICAgOiAnb0FuaW1hdGlvbkVuZCBvYW5pbWF0aW9uZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uICAgICAgIDogJ2FuaW1hdGlvbmVuZCdcbiAgICAgICAgICAgICAgICB9LCBuYW1lO1xuXG4gICAgICAgICAgICBmb3IgKG5hbWUgaW4gYW5pbUVuZEV2ZW50TmFtZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zdHlsZVtuYW1lXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYW5pbUVuZEV2ZW50TmFtZXNbbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0oKSk7XG5cbiAgICAgICAgcmV0dXJuIGFuaW1hdGlvbkVuZCAmJiB7IGVuZDogYW5pbWF0aW9uRW5kIH07XG4gICAgfSkoKTtcblxuICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZSBwb2x5ZmlsbFxuICAgIC8vaHR0cHM6Ly9naXRodWIuY29tL2Rhcml1cy9yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgRGF0ZS5ub3cgPSBEYXRlLm5vdyB8fCBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOyB9O1xuXG4gICAgICAgIHZhciB2ZW5kb3JzID0gWyd3ZWJraXQnLCAnbW96J107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9ycy5sZW5ndGggJiYgIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7ICsraSkge1xuICAgICAgICAgICAgdmFyIHZwID0gdmVuZG9yc1tpXTtcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB3aW5kb3dbdnArJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gKHdpbmRvd1t2cCsnQ2FuY2VsQW5pbWF0aW9uRnJhbWUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgd2luZG93W3ZwKydDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKC9pUChhZHxob25lfG9kKS4qT1MgNi8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgLy8gaU9TNiBpcyBidWdneVxuICAgICAgICAgICAgfHwgIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgIXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSkge1xuICAgICAgICAgICAgdmFyIGxhc3RUaW1lID0gMDtcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIHZhciBuZXh0VGltZSA9IE1hdGgubWF4KGxhc3RUaW1lICsgMTYsIG5vdyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGNhbGxiYWNrKGxhc3RUaW1lID0gbmV4dFRpbWUpOyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUaW1lIC0gbm93KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9KCkpO1xuXG4gICAgVUkuc3VwcG9ydC50b3VjaCA9IChcbiAgICAgICAgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50KSB8fFxuICAgICAgICAod2luZG93LkRvY3VtZW50VG91Y2ggJiYgZG9jdW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuRG9jdW1lbnRUb3VjaCkgIHx8XG4gICAgICAgICh3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQgJiYgd2luZG93Lm5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzID4gMCkgfHwgLy9JRSAxMFxuICAgICAgICAod2luZG93Lm5hdmlnYXRvci5wb2ludGVyRW5hYmxlZCAmJiB3aW5kb3cubmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMCkgfHwgLy9JRSA+PTExXG4gICAgICAgIGZhbHNlXG4gICAgKTtcblxuICAgIFVJLnN1cHBvcnQubXV0YXRpb25vYnNlcnZlciA9ICh3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlciB8fCBudWxsKTtcblxuICAgIFVJLlV0aWxzID0ge307XG5cbiAgICBVSS5VdGlscy5pc0Z1bGxzY3JlZW4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgZmFsc2U7XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLnN0cjJqc29uID0gZnVuY3Rpb24oc3RyLCBub3RldmlsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAobm90ZXZpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0clxuICAgICAgICAgICAgICAgICAgICAvLyB3cmFwIGtleXMgd2l0aG91dCBxdW90ZSB3aXRoIHZhbGlkIGRvdWJsZSBxdW90ZVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKFtcXCRcXHddKylcXHMqOi9nLCBmdW5jdGlvbihfLCAkMSl7cmV0dXJuICdcIicrJDErJ1wiOic7fSlcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjaW5nIHNpbmdsZSBxdW90ZSB3cmFwcGVkIG9uZXMgdG8gZG91YmxlIHF1b3RlXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nKFteJ10rKScvZywgZnVuY3Rpb24oXywgJDEpe3JldHVybiAnXCInKyQxKydcIic7fSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBGdW5jdGlvbignJywgJ3ZhciBqc29uID0gJyArIHN0ciArICc7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGpzb24pKTsnKSkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChlKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIH07XG5cbiAgICBVSS5VdGlscy5kZWJvdW5jZSA9IGZ1bmN0aW9uKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkge1xuICAgICAgICB2YXIgdGltZW91dDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKCFpbW1lZGlhdGUpIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgICAgICAgICBpZiAoY2FsbE5vdykgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgVUkuVXRpbHMudGhyb3R0bGUgPSBmdW5jdGlvbiAoZnVuYywgbGltaXQpIHtcbiAgICAgICAgdmFyIHdhaXQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghd2FpdCkge1xuICAgICAgICAgICAgICAgIGZ1bmMuY2FsbCgpO1xuICAgICAgICAgICAgICAgIHdhaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB3YWl0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSwgbGltaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLnJlbW92ZUNzc1J1bGVzID0gZnVuY3Rpb24oc2VsZWN0b3JSZWdFeCkge1xuICAgICAgICB2YXIgaWR4LCBpZHhzLCBzdHlsZXNoZWV0LCBfaSwgX2osIF9rLCBfbGVuLCBfbGVuMSwgX2xlbjIsIF9yZWY7XG5cbiAgICAgICAgaWYoIXNlbGVjdG9yUmVnRXgpIHJldHVybjtcblxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBfcmVmID0gZG9jdW1lbnQuc3R5bGVTaGVldHM7XG4gICAgICAgICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQgPSBfcmVmW19pXTtcbiAgICAgICAgICAgICAgICBpZHhzID0gW107XG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldC5jc3NSdWxlcyA9IHN0eWxlc2hlZXQuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgZm9yIChpZHggPSBfaiA9IDAsIF9sZW4xID0gc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGg7IF9qIDwgX2xlbjE7IGlkeCA9ICsrX2opIHtcbiAgICAgICAgICAgICAgICAgIGlmIChzdHlsZXNoZWV0LmNzc1J1bGVzW2lkeF0udHlwZSA9PT0gQ1NTUnVsZS5TVFlMRV9SVUxFICYmIHNlbGVjdG9yUmVnRXgudGVzdChzdHlsZXNoZWV0LmNzc1J1bGVzW2lkeF0uc2VsZWN0b3JUZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZHhzLnVuc2hpZnQoaWR4KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChfayA9IDAsIF9sZW4yID0gaWR4cy5sZW5ndGg7IF9rIDwgX2xlbjI7IF9rKyspIHtcbiAgICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShpZHhzW19rXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChfZXJyb3IpIHt9XG4gICAgICAgIH0sIDApO1xuICAgIH07XG5cbiAgICBVSS5VdGlscy5pc0luVmlldyA9IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMpIHtcblxuICAgICAgICB2YXIgJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmICghJGVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3aW5kb3dfbGVmdCA9IFVJLiR3aW4uc2Nyb2xsTGVmdCgpLCB3aW5kb3dfdG9wID0gVUkuJHdpbi5zY3JvbGxUb3AoKSwgb2Zmc2V0ID0gJGVsZW1lbnQub2Zmc2V0KCksIGxlZnQgPSBvZmZzZXQubGVmdCwgdG9wID0gb2Zmc2V0LnRvcDtcblxuICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe3RvcG9mZnNldDowLCBsZWZ0b2Zmc2V0OjB9LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodG9wICsgJGVsZW1lbnQuaGVpZ2h0KCkgPj0gd2luZG93X3RvcCAmJiB0b3AgLSBvcHRpb25zLnRvcG9mZnNldCA8PSB3aW5kb3dfdG9wICsgVUkuJHdpbi5oZWlnaHQoKSAmJlxuICAgICAgICAgICAgbGVmdCArICRlbGVtZW50LndpZHRoKCkgPj0gd2luZG93X2xlZnQgJiYgbGVmdCAtIG9wdGlvbnMubGVmdG9mZnNldCA8PSB3aW5kb3dfbGVmdCArIFVJLiR3aW4ud2lkdGgoKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBVSS5VdGlscy5jaGVja0Rpc3BsYXkgPSBmdW5jdGlvbihjb250ZXh0LCBpbml0YW5pbWF0aW9uKSB7XG5cbiAgICAgICAgdmFyIGVsZW1lbnRzID0gVUkuJCgnW2RhdGEtdWstbWFyZ2luXSwgW2RhdGEtdWstZ3JpZC1tYXRjaF0sIFtkYXRhLXVrLWdyaWQtbWFyZ2luXSwgW2RhdGEtdWstY2hlY2stZGlzcGxheV0nLCBjb250ZXh0IHx8IGRvY3VtZW50KSwgYW5pbWF0ZWQ7XG5cbiAgICAgICAgaWYgKGNvbnRleHQgJiYgIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudHMgPSAkKGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudHMudHJpZ2dlcignZGlzcGxheS51ay5jaGVjaycpO1xuXG4gICAgICAgIC8vIGZpeCBmaXJlZm94IC8gSUUgYW5pbWF0aW9uc1xuICAgICAgICBpZiAoaW5pdGFuaW1hdGlvbikge1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mKGluaXRhbmltYXRpb24pIT0nc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGluaXRhbmltYXRpb24gPSAnW2NsYXNzKj1cInVrLWFuaW1hdGlvbi1cIl0nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbGVtZW50cy5maW5kKGluaXRhbmltYXRpb24pLmVhY2goZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgIHZhciBlbGUgID0gVUkuJCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgY2xzICA9IGVsZS5hdHRyKCdjbGFzcycpLFxuICAgICAgICAgICAgICAgICAgICBhbmltID0gY2xzLm1hdGNoKC91ay1hbmltYXRpb24tKC4rKS8pO1xuXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZUNsYXNzKGFuaW1bMF0pLndpZHRoKCk7XG5cbiAgICAgICAgICAgICAgICBlbGUuYWRkQ2xhc3MoYW5pbVswXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICB9O1xuXG4gICAgVUkuVXRpbHMub3B0aW9ucyA9IGZ1bmN0aW9uKHN0cmluZykge1xuXG4gICAgICAgIGlmICgkLnR5cGUoc3RyaW5nKSE9J3N0cmluZycpIHJldHVybiBzdHJpbmc7XG5cbiAgICAgICAgaWYgKHN0cmluZy5pbmRleE9mKCc6JykgIT0gLTEgJiYgc3RyaW5nLnRyaW0oKS5zdWJzdHIoLTEpICE9ICd9Jykge1xuICAgICAgICAgICAgc3RyaW5nID0gJ3snK3N0cmluZysnfSc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RhcnQgPSAoc3RyaW5nID8gc3RyaW5nLmluZGV4T2YoXCJ7XCIpIDogLTEpLCBvcHRpb25zID0ge307XG5cbiAgICAgICAgaWYgKHN0YXJ0ICE9IC0xKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBVSS5VdGlscy5zdHIyanNvbihzdHJpbmcuc3Vic3RyKHN0YXJ0KSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLmFuaW1hdGUgPSBmdW5jdGlvbihlbGVtZW50LCBjbHMpIHtcblxuICAgICAgICB2YXIgZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICBlbGVtZW50ID0gVUkuJChlbGVtZW50KTtcblxuICAgICAgICBlbGVtZW50LmNzcygnZGlzcGxheScsICdub25lJykuYWRkQ2xhc3MoY2xzKS5vbmUoVUkuc3VwcG9ydC5hbmltYXRpb24uZW5kLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoY2xzKTtcbiAgICAgICAgICAgIGQucmVzb2x2ZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBlbGVtZW50LmNzcygnZGlzcGxheScsICcnKTtcblxuICAgICAgICByZXR1cm4gZC5wcm9taXNlKCk7XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLnVpZCA9IGZ1bmN0aW9uKHByZWZpeCkge1xuICAgICAgICByZXR1cm4gKHByZWZpeCB8fCAnaWQnKSArIChuZXcgRGF0ZSgpLmdldFRpbWUoKSkrXCJSQU5EXCIrKE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogMTAwMDAwKSk7XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLnRlbXBsYXRlID0gZnVuY3Rpb24oc3RyLCBkYXRhKSB7XG5cbiAgICAgICAgdmFyIHRva2VucyA9IHN0ci5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJykucmVwbGFjZSgvXFx7XFx7XFx7XFxzKiguKz8pXFxzKlxcfVxcfVxcfS9nLCBcInt7ISQxfX1cIikuc3BsaXQoLyhcXHtcXHtcXHMqKC4rPylcXHMqXFx9XFx9KS9nKSxcbiAgICAgICAgICAgIGk9MCwgdG9jLCBjbWQsIHByb3AsIHZhbCwgZm4sIG91dHB1dCA9IFtdLCBvcGVuYmxvY2tzID0gMDtcblxuICAgICAgICB3aGlsZShpIDwgdG9rZW5zLmxlbmd0aCkge1xuXG4gICAgICAgICAgICB0b2MgPSB0b2tlbnNbaV07XG5cbiAgICAgICAgICAgIGlmKHRvYy5tYXRjaCgvXFx7XFx7XFxzKiguKz8pXFxzKlxcfVxcfS8pKSB7XG4gICAgICAgICAgICAgICAgaSA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIHRvYyAgPSB0b2tlbnNbaV07XG4gICAgICAgICAgICAgICAgY21kICA9IHRvY1swXTtcbiAgICAgICAgICAgICAgICBwcm9wID0gdG9jLnN1YnN0cmluZyh0b2MubWF0Y2goL14oXFxefFxcI3xcXCF8XFx+fFxcOikvKSA/IDE6MCk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2goY21kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ34nOlxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goJ2Zvcih2YXIgJGk9MDskaTwnK3Byb3ArJy5sZW5ndGg7JGkrKykgeyB2YXIgJGl0ZW0gPSAnK3Byb3ArJ1skaV07Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuYmxvY2tzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnOic6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgnZm9yKHZhciAka2V5IGluICcrcHJvcCsnKSB7IHZhciAkdmFsID0gJytwcm9wKydbJGtleV07Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuYmxvY2tzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnIyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgnaWYoJytwcm9wKycpIHsnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5ibG9ja3MrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdeJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCdpZighJytwcm9wKycpIHsnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5ibG9ja3MrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCd9Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuYmxvY2tzLS07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnISc6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgnX19yZXQucHVzaCgnK3Byb3ArJyk7Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCdfX3JldC5wdXNoKGVzY2FwZSgnK3Byb3ArJykpOycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChcIl9fcmV0LnB1c2goJ1wiK3RvYy5yZXBsYWNlKC9cXCcvZywgXCJcXFxcJ1wiKStcIicpO1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkgPSBpICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuICA9IG5ldyBGdW5jdGlvbignJGRhdGEnLCBbXG4gICAgICAgICAgICAndmFyIF9fcmV0ID0gW107JyxcbiAgICAgICAgICAgICd0cnkgeycsXG4gICAgICAgICAgICAnd2l0aCgkZGF0YSl7JywgKCFvcGVuYmxvY2tzID8gb3V0cHV0LmpvaW4oJycpIDogJ19fcmV0ID0gW1wiTm90IGFsbCBibG9ja3MgYXJlIGNsb3NlZCBjb3JyZWN0bHkuXCJdJyksICd9OycsXG4gICAgICAgICAgICAnfWNhdGNoKGUpe19fcmV0ID0gW2UubWVzc2FnZV07fScsXG4gICAgICAgICAgICAncmV0dXJuIF9fcmV0LmpvaW4oXCJcIikucmVwbGFjZSgvXFxcXG5cXFxcbi9nLCBcIlxcXFxuXCIpOycsXG4gICAgICAgICAgICBcImZ1bmN0aW9uIGVzY2FwZShodG1sKSB7IHJldHVybiBTdHJpbmcoaHRtbCkucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC9cXFwiL2csICcmcXVvdDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpO31cIlxuICAgICAgICBdLmpvaW4oXCJcXG5cIikpO1xuXG4gICAgICAgIHJldHVybiBkYXRhID8gZm4oZGF0YSkgOiBmbjtcbiAgICB9O1xuXG4gICAgVUkuVXRpbHMuZm9jdXMgPSBmdW5jdGlvbihlbGVtZW50LCBleHRyYSkge1xuXG4gICAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmICghZWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGF1dG9mb2N1cyA9IGVsZW1lbnQuZmluZCgnW2F1dG9mb2N1c106Zmlyc3QnKSwgdGFiaWR4O1xuXG4gICAgICAgIGlmIChhdXRvZm9jdXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXV0b2ZvY3VzLmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRvZm9jdXMgPSBlbGVtZW50LmZpbmQoJzppbnB1dCcrKGV4dHJhICYmICgnLCcrZXh0cmEpIHx8ICcnKSkuZmlyc3QoKTtcblxuICAgICAgICBpZiAoYXV0b2ZvY3VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGF1dG9mb2N1cy5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFlbGVtZW50LmF0dHIoJ3RhYmluZGV4JykpIHtcbiAgICAgICAgICAgIHRhYmlkeCA9IDEwMDA7XG4gICAgICAgICAgICBlbGVtZW50LmF0dHIoJ3RhYmluZGV4JywgdGFiaWR4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnRbMF0uZm9jdXMoKTtcblxuICAgICAgICBpZiAodGFiaWR4KSB7XG4gICAgICAgICAgICBlbGVtZW50LmF0dHIoJ3RhYmluZGV4JywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgVUkuVXRpbHMuZXZlbnRzICAgICAgID0ge307XG4gICAgVUkuVXRpbHMuZXZlbnRzLmNsaWNrID0gVUkuc3VwcG9ydC50b3VjaCA/ICd0YXAnIDogJ2NsaWNrJztcblxuICAgIC8vIGRlcHJlY2F0ZWRcblxuICAgIFVJLmZuID0gZnVuY3Rpb24oY29tbWFuZCwgb3B0aW9ucykge1xuXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLCBjbWQgPSBjb21tYW5kLm1hdGNoKC9eKFthLXpcXC1dKykoPzpcXC4oW2Etel0rKSk/L2kpLCBjb21wb25lbnQgPSBjbWRbMV0sIG1ldGhvZCA9IGNtZFsyXTtcblxuICAgICAgICBpZiAoIVVJW2NvbXBvbmVudF0pIHtcbiAgICAgICAgICAgICQuZXJyb3IoJ1VJa2l0IGNvbXBvbmVudCBbJyArIGNvbXBvbmVudCArICddIGRvZXMgbm90IGV4aXN0LicpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKSwgZGF0YSA9ICR0aGlzLmRhdGEoY29tcG9uZW50KTtcbiAgICAgICAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YShjb21wb25lbnQsIChkYXRhID0gVUlbY29tcG9uZW50XSh0aGlzLCBtZXRob2QgPyB1bmRlZmluZWQgOiBvcHRpb25zKSkpO1xuICAgICAgICAgICAgaWYgKG1ldGhvZCkgZGF0YVttZXRob2RdLmFwcGx5KGRhdGEsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MsIDEpKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgICQuVUlraXQgICAgICAgICAgPSBVSTtcbiAgICAkLmZuLnVrICAgICAgICAgID0gVUkuZm47XG5cbiAgICBVSS5sYW5nZGlyZWN0aW9uID0gVUkuJGh0bWwuYXR0cihcImRpclwiKSA9PSBcInJ0bFwiID8gXCJyaWdodFwiIDogXCJsZWZ0XCI7XG5cbiAgICBVSS5jb21wb25lbnRzICAgID0ge307XG5cbiAgICBVSS5jb21wb25lbnQgPSBmdW5jdGlvbihuYW1lLCBkZWYsIG92ZXJyaWRlKSB7XG5cbiAgICAgICAgaWYgKFVJLmNvbXBvbmVudHNbbmFtZV0gJiYgIW92ZXJyaWRlKSB7XG4gICAgICAgICAgICByZXR1cm4gVUkuY29tcG9uZW50c1tuYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5VSWtpdCAgID0gVUk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50ID8gVUkuJChlbGVtZW50KSA6IG51bGw7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdGhpcy5kZWZhdWx0cywgb3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMgPSB7fTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kYXRhKG5hbWUsIHRoaXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmluaXQoKTtcblxuICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5wbHVnaW5zLmxlbmd0aCA/IHRoaXMub3B0aW9ucy5wbHVnaW5zIDogT2JqZWN0LmtleXMoZm4ucGx1Z2lucykpLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoZm4ucGx1Z2luc1twbHVnaW5dLmluaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm4ucGx1Z2luc1twbHVnaW5dLmluaXQoJHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAkdGhpcy5wbHVnaW5zW3BsdWdpbl0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignaW5pdC51ay5jb21wb25lbnQnLCBbbmFtZSwgdGhpc10pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcblxuICAgICAgICBmbi5wbHVnaW5zID0ge307XG5cbiAgICAgICAgJC5leHRlbmQodHJ1ZSwgZm4ucHJvdG90eXBlLCB7XG5cbiAgICAgICAgICAgIGRlZmF1bHRzIDoge3BsdWdpbnM6IFtdfSxcblxuICAgICAgICAgICAgYm9vdDogZnVuY3Rpb24oKXt9LFxuICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24oKXt9LFxuXG4gICAgICAgICAgICBvbjogZnVuY3Rpb24oYTEsYTIsYTMpe1xuICAgICAgICAgICAgICAgIHJldHVybiBVSS4kKHRoaXMuZWxlbWVudCB8fCB0aGlzKS5vbihhMSxhMixhMyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvbmU6IGZ1bmN0aW9uKGExLGEyLGEzKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gVUkuJCh0aGlzLmVsZW1lbnQgfHwgdGhpcykub25lKGExLGEyLGEzKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9mZjogZnVuY3Rpb24oZXZ0KXtcbiAgICAgICAgICAgICAgICByZXR1cm4gVUkuJCh0aGlzLmVsZW1lbnQgfHwgdGhpcykub2ZmKGV2dCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbihldnQsIHBhcmFtcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBVSS4kKHRoaXMuZWxlbWVudCB8fCB0aGlzKS50cmlnZ2VyKGV2dCwgcGFyYW1zKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVJLiQodGhpcy5lbGVtZW50ID8gdGhpcy5lbGVtZW50OiBbXSkuZmluZChzZWxlY3Rvcik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBwcm94eTogZnVuY3Rpb24ob2JqLCBtZXRob2RzKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgbWV0aG9kcy5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXNbbWV0aG9kXSkgJHRoaXNbbWV0aG9kXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gb2JqW21ldGhvZF0uYXBwbHkob2JqLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbWl4aW46IGZ1bmN0aW9uKG9iaiwgbWV0aG9kcykge1xuXG4gICAgICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgICAgIG1ldGhvZHMuc3BsaXQoJyAnKS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzW21ldGhvZF0pICR0aGlzW21ldGhvZF0gPSBvYmpbbWV0aG9kXS5iaW5kKCR0aGlzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9wdGlvbjogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbYXJndW1lbnRzWzBdXSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zW2FyZ3VtZW50c1swXV0gPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sIGRlZik7XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzW25hbWVdID0gZm47XG5cbiAgICAgICAgdGhpc1tuYW1lXSA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgZWxlbWVudCwgb3B0aW9ucztcblxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblxuICAgICAgICAgICAgICAgIHN3aXRjaChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdzdHJpbmcnIHx8IGFyZ3VtZW50c1swXS5ub2RlVHlwZSB8fCBhcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBqUXVlcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gJChhcmd1bWVudHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gJChhcmd1bWVudHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5kYXRhKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZGF0YShuYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIChuZXcgVUkuY29tcG9uZW50c1tuYW1lXShlbGVtZW50LCBvcHRpb25zKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKFVJLmRvbXJlYWR5KSB7XG4gICAgICAgICAgICBVSS5jb21wb25lbnQuYm9vdChuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbjtcbiAgICB9O1xuXG4gICAgVUkucGx1Z2luID0gZnVuY3Rpb24oY29tcG9uZW50LCBuYW1lLCBkZWYpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzW2NvbXBvbmVudF0ucGx1Z2luc1tuYW1lXSA9IGRlZjtcbiAgICB9O1xuXG4gICAgVUkuY29tcG9uZW50LmJvb3QgPSBmdW5jdGlvbihuYW1lKSB7XG5cbiAgICAgICAgaWYgKFVJLmNvbXBvbmVudHNbbmFtZV0ucHJvdG90eXBlICYmIFVJLmNvbXBvbmVudHNbbmFtZV0ucHJvdG90eXBlLmJvb3QgJiYgIVVJLmNvbXBvbmVudHNbbmFtZV0uYm9vdGVkKSB7XG4gICAgICAgICAgICBVSS5jb21wb25lbnRzW25hbWVdLnByb3RvdHlwZS5ib290LmFwcGx5KFVJLCBbXSk7XG4gICAgICAgICAgICBVSS5jb21wb25lbnRzW25hbWVdLmJvb3RlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVUkuY29tcG9uZW50LmJvb3RDb21wb25lbnRzID0gZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgZm9yICh2YXIgY29tcG9uZW50IGluIFVJLmNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIFVJLmNvbXBvbmVudC5ib290KGNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICAvLyBET00gbXV0YXRpb24gc2F2ZSByZWFkeSBoZWxwZXIgZnVuY3Rpb25cblxuICAgIFVJLmRvbU9ic2VydmVycyA9IFtdO1xuICAgIFVJLmRvbXJlYWR5ICAgICA9IGZhbHNlO1xuXG4gICAgVUkucmVhZHkgPSBmdW5jdGlvbihmbikge1xuXG4gICAgICAgIFVJLmRvbU9ic2VydmVycy5wdXNoKGZuKTtcblxuICAgICAgICBpZiAoVUkuZG9tcmVhZHkpIHtcbiAgICAgICAgICAgIGZuKGRvY3VtZW50KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBVSS5vbiA9IGZ1bmN0aW9uKGExLGEyLGEzKXtcblxuICAgICAgICBpZiAoYTEgJiYgYTEuaW5kZXhPZigncmVhZHkudWsuZG9tJykgPiAtMSAmJiBVSS5kb21yZWFkeSkge1xuICAgICAgICAgICAgYTIuYXBwbHkoVUkuJGRvYyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gVUkuJGRvYy5vbihhMSxhMixhMyk7XG4gICAgfTtcblxuICAgIFVJLm9uZSA9IGZ1bmN0aW9uKGExLGEyLGEzKXtcblxuICAgICAgICBpZiAoYTEgJiYgYTEuaW5kZXhPZigncmVhZHkudWsuZG9tJykgPiAtMSAmJiBVSS5kb21yZWFkeSkge1xuICAgICAgICAgICAgYTIuYXBwbHkoVUkuJGRvYyk7XG4gICAgICAgICAgICByZXR1cm4gVUkuJGRvYztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBVSS4kZG9jLm9uZShhMSxhMixhMyk7XG4gICAgfTtcblxuICAgIFVJLnRyaWdnZXIgPSBmdW5jdGlvbihldnQsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gVUkuJGRvYy50cmlnZ2VyKGV2dCwgcGFyYW1zKTtcbiAgICB9O1xuXG4gICAgVUkuZG9tT2JzZXJ2ZSA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBmbikge1xuXG4gICAgICAgIGlmKCFVSS5zdXBwb3J0Lm11dGF0aW9ub2JzZXJ2ZXIpIHJldHVybjtcblxuICAgICAgICBmbiA9IGZuIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICAgICAgVUkuJChzZWxlY3RvcikuZWFjaChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgID0gdGhpcyxcbiAgICAgICAgICAgICAgICAkZWxlbWVudCA9IFVJLiQoZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmICgkZWxlbWVudC5kYXRhKCdvYnNlcnZlcicpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuXG4gICAgICAgICAgICAgICAgdmFyIG9ic2VydmVyID0gbmV3IFVJLnN1cHBvcnQubXV0YXRpb25vYnNlcnZlcihVSS5VdGlscy5kZWJvdW5jZShmdW5jdGlvbihtdXRhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm4uYXBwbHkoZWxlbWVudCwgWyRlbGVtZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICRlbGVtZW50LnRyaWdnZXIoJ2NoYW5nZWQudWsuZG9tJyk7XG4gICAgICAgICAgICAgICAgfSwgNTApLCB7Y2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBwYXNzIGluIHRoZSB0YXJnZXQgbm9kZSwgYXMgd2VsbCBhcyB0aGUgb2JzZXJ2ZXIgb3B0aW9uc1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG5cbiAgICAgICAgICAgICAgICAkZWxlbWVudC5kYXRhKCdvYnNlcnZlcicsIG9ic2VydmVyKTtcblxuICAgICAgICAgICAgfSBjYXRjaChlKSB7fVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgVUkuaW5pdCA9IGZ1bmN0aW9uKHJvb3QpIHtcblxuICAgICAgICByb290ID0gcm9vdCB8fCBkb2N1bWVudDtcblxuICAgICAgICBVSS5kb21PYnNlcnZlcnMuZm9yRWFjaChmdW5jdGlvbihmbil7XG4gICAgICAgICAgICBmbihyb290KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIFVJLm9uKCdkb21yZWFkeS51ay5kb20nLCBmdW5jdGlvbigpe1xuXG4gICAgICAgIFVJLmluaXQoKTtcblxuICAgICAgICBpZiAoVUkuZG9tcmVhZHkpIFVJLlV0aWxzLmNoZWNrRGlzcGxheSgpO1xuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgdmFyIGRvbVJlYWR5ID0gZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIFVJLiRib2R5ID0gVUkuJCgnYm9keScpO1xuXG4gICAgICAgICAgICBVSS50cmlnZ2VyKCdiZWZvcmVyZWFkeS51ay5kb20nKTtcblxuICAgICAgICAgICAgVUkuY29tcG9uZW50LmJvb3RDb21wb25lbnRzKCk7XG5cbiAgICAgICAgICAgIC8vIGN1c3RvbSBzY3JvbGwgb2JzZXJ2ZXJcbiAgICAgICAgICAgIHZhciByYWZUb2tlbiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgIHZhciBtZW1vcnkgPSB7ZGlyOiB7eDowLCB5OjB9LCB4OiB3aW5kb3cucGFnZVhPZmZzZXQsIHk6d2luZG93LnBhZ2VZT2Zmc2V0fTtcblxuICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWRpbmcgdGhpcyAod2luZG93LnBhZ2VbWHxZXU9mZnNldCkgY2F1c2VzIGEgZnVsbCBwYWdlIHJlY2FsYyBvZiB0aGUgbGF5b3V0IGluIENocm9tZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb25jZVxuICAgICAgICAgICAgICAgICAgICB2YXIgd3B4byA9IHdpbmRvdy5wYWdlWE9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdweW8gPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRGlkIHRoZSBzY3JvbGwgcG9zaXRpb24gY2hhbmdlIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2Ugd2VyZSBoZXJlP1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVtb3J5LnggIT0gd3B4byB8fCBtZW1vcnkueSAhPSB3cHlvKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzY3JvbGwgYW5kIHN0b3JlIHRoZSBuZXcgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cHhvICE9IG1lbW9yeS54KSB7bWVtb3J5LmRpci54ID0gd3B4byA+IG1lbW9yeS54ID8gMTotMTsgfSBlbHNlIHsgbWVtb3J5LmRpci54ID0gMDsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdweW8gIT0gbWVtb3J5LnkpIHttZW1vcnkuZGlyLnkgPSB3cHlvID4gbWVtb3J5LnkgPyAxOi0xOyB9IGVsc2UgeyBtZW1vcnkuZGlyLnkgPSAwOyB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeS54ID0gd3B4bztcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeS55ID0gd3B5bztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciB0aGUgc2Nyb2xsIGV2ZW50LCB0aGlzIGNvdWxkIHByb2JhYmx5IGJlIHNlbnQgdXNpbmcgbWVtb3J5LmNsb25lKCkgYnV0IHRoaXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgZXhwbGljaXQgYW5kIGVhc2llciB0byBzZWUgZXhhY3RseSB3aGF0IGlzIGJlaW5nIHNlbnQgaW4gdGhlIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgVUkuJGRvYy50cmlnZ2VyKCdzY3JvbGxpbmcudWsuZG9jdW1lbnQnLCBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcjoge3g6IG1lbW9yeS5kaXIueCwgeTogbWVtb3J5LmRpci55fSwgeDogd3B4bywgeTogd3B5b1xuICAgICAgICAgICAgICAgICAgICAgICAgfV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICByYWZUb2tlbiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChVSS5zdXBwb3J0LnRvdWNoKSB7XG4gICAgICAgICAgICAgICAgICAgIFVJLiRodG1sLm9uKCd0b3VjaG1vdmUgdG91Y2hlbmQgTVNQb2ludGVyTW92ZSBNU1BvaW50ZXJVcCBwb2ludGVybW92ZSBwb2ludGVydXAnLCBmbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lbW9yeS54IHx8IG1lbW9yeS55KSBmbigpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZuO1xuXG4gICAgICAgICAgICB9KSgpKTtcblxuICAgICAgICAgICAgLy8gcnVuIGNvbXBvbmVudCBpbml0IGZ1bmN0aW9ucyBvbiBkb21cbiAgICAgICAgICAgIFVJLnRyaWdnZXIoJ2RvbXJlYWR5LnVrLmRvbScpO1xuXG4gICAgICAgICAgICBpZiAoVUkuc3VwcG9ydC50b3VjaCkge1xuXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGNzcyBob3ZlciBydWxlcyBmb3IgdG91Y2ggZGV2aWNlc1xuICAgICAgICAgICAgICAgIC8vIFVJLlV0aWxzLnJlbW92ZUNzc1J1bGVzKC9cXC51ay0oPyFuYXZiYXIpLio6aG92ZXIvKTtcblxuICAgICAgICAgICAgICAgIC8vIHZpZXdwb3J0IHVuaXQgZml4IGZvciB1ay1oZWlnaHQtdmlld3BvcnQgLSBzaG91bGQgYmUgZml4ZWQgaW4gaU9TIDhcbiAgICAgICAgICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvKGlQYWR8aVBob25lfGlQb2QpL2cpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgVUkuJHdpbi5vbignbG9hZCBvcmllbnRhdGlvbmNoYW5nZSByZXNpemUnLCBVSS5VdGlscy5kZWJvdW5jZSgoZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLnVrLWhlaWdodC12aWV3cG9ydCcpLmNzcygnaGVpZ2h0Jywgd2luZG93LmlubmVySGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4oKTtcblxuICAgICAgICAgICAgICAgICAgICB9KSgpLCAxMDApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFVJLnRyaWdnZXIoJ2FmdGVycmVhZHkudWsuZG9tJyk7XG5cbiAgICAgICAgICAgIC8vIG1hcmsgdGhhdCBkb21yZWFkeSBpcyBsZWZ0IGJlaGluZFxuICAgICAgICAgICAgVUkuZG9tcmVhZHkgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBhdXRvIGluaXQganMgY29tcG9uZW50c1xuICAgICAgICAgICAgaWYgKFVJLnN1cHBvcnQubXV0YXRpb25vYnNlcnZlcikge1xuXG4gICAgICAgICAgICAgICAgdmFyIGluaXRGbiA9IFVJLlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpeyBVSS5pbml0KGRvY3VtZW50LmJvZHkpO30pO1xuICAgICAgICAgICAgICAgIH0sIDEwKTtcblxuICAgICAgICAgICAgICAgIChuZXcgVUkuc3VwcG9ydC5tdXRhdGlvbm9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9ucykge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbml0ID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb25zLmV2ZXJ5KGZ1bmN0aW9uKG11dGF0aW9uKXtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgIT0gJ2NoaWxkTGlzdCcpIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgaSA8IG11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoOyArK2kpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBtdXRhdGlvbi5hZGRlZE5vZGVzW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUub3V0ZXJIVE1MICYmIG5vZGUub3V0ZXJIVE1MLmluZGV4T2YoJ2RhdGEtdWstJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5pdCA9IHRydWUpICYmIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdCkgaW5pdEZuKCk7XG5cbiAgICAgICAgICAgICAgICB9KSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7Y2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09ICdpbnRlcmFjdGl2ZScpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZG9tUmVhZHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRvbVJlYWR5O1xuXG4gICAgfSgpKTtcblxuICAgIC8vIGFkZCB0b3VjaCBpZGVudGlmaWVyIGNsYXNzXG4gICAgVUkuJGh0bWwuYWRkQ2xhc3MoVUkuc3VwcG9ydC50b3VjaCA/ICd1ay10b3VjaCcgOiAndWstbm90b3VjaCcpO1xuXG4gICAgLy8gYWRkIHVrLWhvdmVyIGNsYXNzIG9uIHRhcCB0byBzdXBwb3J0IG92ZXJsYXlzIG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoVUkuc3VwcG9ydC50b3VjaCkge1xuXG4gICAgICAgIHZhciBob3ZlcnNldCA9IGZhbHNlLFxuICAgICAgICAgICAgZXhjbHVkZSxcbiAgICAgICAgICAgIGhvdmVyY2xzID0gJ3VrLWhvdmVyJyxcbiAgICAgICAgICAgIHNlbGVjdG9yID0gJy51ay1vdmVybGF5LCAudWstb3ZlcmxheS1ob3ZlciwgLnVrLW92ZXJsYXktdG9nZ2xlLCAudWstYW5pbWF0aW9uLWhvdmVyLCAudWstaGFzLWhvdmVyJztcblxuICAgICAgICBVSS4kaHRtbC5vbignbW91c2VlbnRlciB0b3VjaHN0YXJ0IE1TUG9pbnRlckRvd24gcG9pbnRlcmRvd24nLCBzZWxlY3RvciwgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIGlmIChob3ZlcnNldCkgJCgnLicraG92ZXJjbHMpLnJlbW92ZUNsYXNzKGhvdmVyY2xzKTtcblxuICAgICAgICAgICAgaG92ZXJzZXQgPSAkKHRoaXMpLmFkZENsYXNzKGhvdmVyY2xzKTtcblxuICAgICAgICB9KS5vbignbW91c2VsZWF2ZSB0b3VjaGVuZCBNU1BvaW50ZXJVcCBwb2ludGVydXAnLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgIGV4Y2x1ZGUgPSAkKGUudGFyZ2V0KS5wYXJlbnRzKHNlbGVjdG9yKTtcblxuICAgICAgICAgICAgaWYgKGhvdmVyc2V0KSB7XG4gICAgICAgICAgICAgICAgaG92ZXJzZXQubm90KGV4Y2x1ZGUpLnJlbW92ZUNsYXNzKGhvdmVyY2xzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFVJO1xufSk7XG5cbi8vICBCYXNlZCBvbiBaZXB0b3MgdG91Y2guanNcbi8vICBodHRwczovL3Jhdy5naXRodWIuY29tL21hZHJvYmJ5L3plcHRvL21hc3Rlci9zcmMvdG91Y2guanNcbi8vICBaZXB0by5qcyBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cblxuOyhmdW5jdGlvbigkKXtcblxuICBpZiAoJC5mbi5zd2lwZUxlZnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuXG4gIHZhciB0b3VjaCA9IHt9LCB0b3VjaFRpbWVvdXQsIHRhcFRpbWVvdXQsIHN3aXBlVGltZW91dCwgbG9uZ1RhcFRpbWVvdXQsIGxvbmdUYXBEZWxheSA9IDc1MCwgZ2VzdHVyZTtcbiAgdmFyIGhhc1RvdWNoRXZlbnRzID0gJ29udG91Y2hzdGFydCcgaW4gd2luZG93LFxuICAgICAgaGFzUG9pbnRlckV2ZW50cyA9IHdpbmRvdy5Qb2ludGVyRXZlbnQsXG4gICAgICBoYXNUb3VjaCA9IGhhc1RvdWNoRXZlbnRzXG4gICAgICB8fCB3aW5kb3cuRG9jdW1lbnRUb3VjaCAmJiBkb2N1bWVudCBpbnN0YW5jZW9mIERvY3VtZW50VG91Y2hcbiAgICAgIHx8IG5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkICYmIG5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzID4gMCAvLyBJRSAxMFxuICAgICAgfHwgbmF2aWdhdG9yLnBvaW50ZXJFbmFibGVkICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDA7IC8vIElFID49MTFcblxuICBmdW5jdGlvbiBzd2lwZURpcmVjdGlvbih4MSwgeDIsIHkxLCB5Mikge1xuICAgIHJldHVybiBNYXRoLmFicyh4MSAtIHgyKSA+PSBNYXRoLmFicyh5MSAtIHkyKSA/ICh4MSAtIHgyID4gMCA/ICdMZWZ0JyA6ICdSaWdodCcpIDogKHkxIC0geTIgPiAwID8gJ1VwJyA6ICdEb3duJyk7XG4gIH1cblxuICBmdW5jdGlvbiBsb25nVGFwKCkge1xuICAgIGxvbmdUYXBUaW1lb3V0ID0gbnVsbDtcbiAgICBpZiAodG91Y2gubGFzdCkge1xuICAgICAgaWYgKCB0b3VjaC5lbCAhPT0gdW5kZWZpbmVkICkgdG91Y2guZWwudHJpZ2dlcignbG9uZ1RhcCcpO1xuICAgICAgdG91Y2ggPSB7fTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWxMb25nVGFwKCkge1xuICAgIGlmIChsb25nVGFwVGltZW91dCkgY2xlYXJUaW1lb3V0KGxvbmdUYXBUaW1lb3V0KTtcbiAgICBsb25nVGFwVGltZW91dCA9IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWxBbGwoKSB7XG4gICAgaWYgKHRvdWNoVGltZW91dCkgICBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICBpZiAodGFwVGltZW91dCkgICAgIGNsZWFyVGltZW91dCh0YXBUaW1lb3V0KTtcbiAgICBpZiAoc3dpcGVUaW1lb3V0KSAgIGNsZWFyVGltZW91dChzd2lwZVRpbWVvdXQpO1xuICAgIGlmIChsb25nVGFwVGltZW91dCkgY2xlYXJUaW1lb3V0KGxvbmdUYXBUaW1lb3V0KTtcbiAgICB0b3VjaFRpbWVvdXQgPSB0YXBUaW1lb3V0ID0gc3dpcGVUaW1lb3V0ID0gbG9uZ1RhcFRpbWVvdXQgPSBudWxsO1xuICAgIHRvdWNoID0ge307XG4gIH1cblxuICBmdW5jdGlvbiBpc1ByaW1hcnlUb3VjaChldmVudCl7XG4gICAgcmV0dXJuIGV2ZW50LnBvaW50ZXJUeXBlID09IGV2ZW50Lk1TUE9JTlRFUl9UWVBFX1RPVUNIICYmIGV2ZW50LmlzUHJpbWFyeTtcbiAgfVxuXG4gICQoZnVuY3Rpb24oKXtcbiAgICB2YXIgbm93LCBkZWx0YSwgZGVsdGFYID0gMCwgZGVsdGFZID0gMCwgZmlyc3RUb3VjaDtcblxuICAgIGlmICgnTVNHZXN0dXJlJyBpbiB3aW5kb3cpIHtcbiAgICAgIGdlc3R1cmUgPSBuZXcgTVNHZXN0dXJlKCk7XG4gICAgICBnZXN0dXJlLnRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgJChkb2N1bWVudClcbiAgICAgIC5vbignTVNHZXN0dXJlRW5kIGdlc3R1cmVlbmQnLCBmdW5jdGlvbihlKXtcblxuICAgICAgICB2YXIgc3dpcGVEaXJlY3Rpb25Gcm9tVmVsb2NpdHkgPSBlLm9yaWdpbmFsRXZlbnQudmVsb2NpdHlYID4gMSA/ICdSaWdodCcgOiBlLm9yaWdpbmFsRXZlbnQudmVsb2NpdHlYIDwgLTEgPyAnTGVmdCcgOiBlLm9yaWdpbmFsRXZlbnQudmVsb2NpdHlZID4gMSA/ICdEb3duJyA6IGUub3JpZ2luYWxFdmVudC52ZWxvY2l0eVkgPCAtMSA/ICdVcCcgOiBudWxsO1xuXG4gICAgICAgIGlmIChzd2lwZURpcmVjdGlvbkZyb21WZWxvY2l0eSAmJiB0b3VjaC5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdG91Y2guZWwudHJpZ2dlcignc3dpcGUnKTtcbiAgICAgICAgICB0b3VjaC5lbC50cmlnZ2VyKCdzd2lwZScrIHN3aXBlRGlyZWN0aW9uRnJvbVZlbG9jaXR5KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC8vIE1TUG9pbnRlckRvd246IGZvciBJRTEwXG4gICAgICAvLyBwb2ludGVyZG93bjogZm9yIElFMTFcbiAgICAgIC5vbigndG91Y2hzdGFydCBNU1BvaW50ZXJEb3duIHBvaW50ZXJkb3duJywgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgaWYoZS50eXBlID09ICdNU1BvaW50ZXJEb3duJyAmJiAhaXNQcmltYXJ5VG91Y2goZS5vcmlnaW5hbEV2ZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIGZpcnN0VG91Y2ggPSAoZS50eXBlID09ICdNU1BvaW50ZXJEb3duJyB8fCBlLnR5cGUgPT0gJ3BvaW50ZXJkb3duJykgPyBlIDogZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF07XG5cbiAgICAgICAgbm93ICAgICAgPSBEYXRlLm5vdygpO1xuICAgICAgICBkZWx0YSAgICA9IG5vdyAtICh0b3VjaC5sYXN0IHx8IG5vdyk7XG4gICAgICAgIHRvdWNoLmVsID0gJCgndGFnTmFtZScgaW4gZmlyc3RUb3VjaC50YXJnZXQgPyBmaXJzdFRvdWNoLnRhcmdldCA6IGZpcnN0VG91Y2gudGFyZ2V0LnBhcmVudE5vZGUpO1xuXG4gICAgICAgIGlmKHRvdWNoVGltZW91dCkgY2xlYXJUaW1lb3V0KHRvdWNoVGltZW91dCk7XG5cbiAgICAgICAgdG91Y2gueDEgPSBmaXJzdFRvdWNoLnBhZ2VYO1xuICAgICAgICB0b3VjaC55MSA9IGZpcnN0VG91Y2gucGFnZVk7XG5cbiAgICAgICAgaWYgKGRlbHRhID4gMCAmJiBkZWx0YSA8PSAyNTApIHRvdWNoLmlzRG91YmxlVGFwID0gdHJ1ZTtcblxuICAgICAgICB0b3VjaC5sYXN0ID0gbm93O1xuICAgICAgICBsb25nVGFwVGltZW91dCA9IHNldFRpbWVvdXQobG9uZ1RhcCwgbG9uZ1RhcERlbGF5KTtcblxuICAgICAgICAvLyBhZGRzIHRoZSBjdXJyZW50IHRvdWNoIGNvbnRhY3QgZm9yIElFIGdlc3R1cmUgcmVjb2duaXRpb25cbiAgICAgICAgaWYgKGUub3JpZ2luYWxFdmVudCAmJiBlLm9yaWdpbmFsRXZlbnQucG9pbnRlcklkICYmIGdlc3R1cmUgJiYgKCBlLnR5cGUgPT0gJ01TUG9pbnRlckRvd24nIHx8IGUudHlwZSA9PSAncG9pbnRlcmRvd24nIHx8IGUudHlwZSA9PSAndG91Y2hzdGFydCcgKSApIHtcbiAgICAgICAgICBnZXN0dXJlLmFkZFBvaW50ZXIoZS5vcmlnaW5hbEV2ZW50LnBvaW50ZXJJZCk7XG4gICAgICAgIH1cblxuICAgICAgfSlcbiAgICAgIC8vIE1TUG9pbnRlck1vdmU6IGZvciBJRTEwXG4gICAgICAvLyBwb2ludGVybW92ZTogZm9yIElFMTFcbiAgICAgIC5vbigndG91Y2htb3ZlIE1TUG9pbnRlck1vdmUgcG9pbnRlcm1vdmUnLCBmdW5jdGlvbihlKXtcblxuICAgICAgICBpZiAoZS50eXBlID09ICdNU1BvaW50ZXJNb3ZlJyAmJiAhaXNQcmltYXJ5VG91Y2goZS5vcmlnaW5hbEV2ZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIGZpcnN0VG91Y2ggPSAoZS50eXBlID09ICdNU1BvaW50ZXJNb3ZlJyB8fCBlLnR5cGUgPT0gJ3BvaW50ZXJtb3ZlJykgPyBlIDogZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF07XG5cbiAgICAgICAgY2FuY2VsTG9uZ1RhcCgpO1xuICAgICAgICB0b3VjaC54MiA9IGZpcnN0VG91Y2gucGFnZVg7XG4gICAgICAgIHRvdWNoLnkyID0gZmlyc3RUb3VjaC5wYWdlWTtcblxuICAgICAgICBkZWx0YVggKz0gTWF0aC5hYnModG91Y2gueDEgLSB0b3VjaC54Mik7XG4gICAgICAgIGRlbHRhWSArPSBNYXRoLmFicyh0b3VjaC55MSAtIHRvdWNoLnkyKTtcbiAgICAgIH0pXG4gICAgICAvLyBNU1BvaW50ZXJVcDogZm9yIElFMTBcbiAgICAgIC8vIHBvaW50ZXJ1cDogZm9yIElFMTFcbiAgICAgIC5vbigndG91Y2hlbmQgTVNQb2ludGVyVXAgcG9pbnRlcnVwJywgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgaWYgKGUudHlwZSA9PSAnTVNQb2ludGVyVXAnICYmICFpc1ByaW1hcnlUb3VjaChlLm9yaWdpbmFsRXZlbnQpKSByZXR1cm47XG5cbiAgICAgICAgY2FuY2VsTG9uZ1RhcCgpO1xuXG4gICAgICAgIC8vIHN3aXBlXG4gICAgICAgIGlmICgodG91Y2gueDIgJiYgTWF0aC5hYnModG91Y2gueDEgLSB0b3VjaC54MikgPiAzMCkgfHwgKHRvdWNoLnkyICYmIE1hdGguYWJzKHRvdWNoLnkxIC0gdG91Y2gueTIpID4gMzApKXtcblxuICAgICAgICAgIHN3aXBlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoIHRvdWNoLmVsICE9PSB1bmRlZmluZWQgKSB7XG4gICAgICAgICAgICAgIHRvdWNoLmVsLnRyaWdnZXIoJ3N3aXBlJyk7XG4gICAgICAgICAgICAgIHRvdWNoLmVsLnRyaWdnZXIoJ3N3aXBlJyArIChzd2lwZURpcmVjdGlvbih0b3VjaC54MSwgdG91Y2gueDIsIHRvdWNoLnkxLCB0b3VjaC55MikpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRvdWNoID0ge307XG4gICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgLy8gbm9ybWFsIHRhcFxuICAgICAgICB9IGVsc2UgaWYgKCdsYXN0JyBpbiB0b3VjaCkge1xuXG4gICAgICAgICAgLy8gZG9uJ3QgZmlyZSB0YXAgd2hlbiBkZWx0YSBwb3NpdGlvbiBjaGFuZ2VkIGJ5IG1vcmUgdGhhbiAzMCBwaXhlbHMsXG4gICAgICAgICAgLy8gZm9yIGluc3RhbmNlIHdoZW4gbW92aW5nIHRvIGEgcG9pbnQgYW5kIGJhY2sgdG8gb3JpZ2luXG4gICAgICAgICAgaWYgKGlzTmFOKGRlbHRhWCkgfHwgKGRlbHRhWCA8IDMwICYmIGRlbHRhWSA8IDMwKSkge1xuICAgICAgICAgICAgLy8gZGVsYXkgYnkgb25lIHRpY2sgc28gd2UgY2FuIGNhbmNlbCB0aGUgJ3RhcCcgZXZlbnQgaWYgJ3Njcm9sbCcgZmlyZXNcbiAgICAgICAgICAgIC8vICgndGFwJyBmaXJlcyBiZWZvcmUgJ3Njcm9sbCcpXG4gICAgICAgICAgICB0YXBUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVuaXZlcnNhbCAndGFwJyB3aXRoIHRoZSBvcHRpb24gdG8gY2FuY2VsVG91Y2goKVxuICAgICAgICAgICAgICAvLyAoY2FuY2VsVG91Y2ggY2FuY2VscyBwcm9jZXNzaW5nIG9mIHNpbmdsZSB2cyBkb3VibGUgdGFwcyBmb3IgZmFzdGVyICd0YXAnIHJlc3BvbnNlKVxuICAgICAgICAgICAgICB2YXIgZXZlbnQgPSAkLkV2ZW50KCd0YXAnKTtcbiAgICAgICAgICAgICAgZXZlbnQuY2FuY2VsVG91Y2ggPSBjYW5jZWxBbGw7XG4gICAgICAgICAgICAgIGlmICggdG91Y2guZWwgIT09IHVuZGVmaW5lZCApIHRvdWNoLmVsLnRyaWdnZXIoZXZlbnQpO1xuXG4gICAgICAgICAgICAgIC8vIHRyaWdnZXIgZG91YmxlIHRhcCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICBpZiAodG91Y2guaXNEb3VibGVUYXApIHtcbiAgICAgICAgICAgICAgICBpZiAoIHRvdWNoLmVsICE9PSB1bmRlZmluZWQgKSB0b3VjaC5lbC50cmlnZ2VyKCdkb3VibGVUYXAnKTtcbiAgICAgICAgICAgICAgICB0b3VjaCA9IHt9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gdHJpZ2dlciBzaW5nbGUgdGFwIGFmdGVyIDI1MG1zIG9mIGluYWN0aXZpdHlcbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdG91Y2hUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgdG91Y2hUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIGlmICggdG91Y2guZWwgIT09IHVuZGVmaW5lZCApIHRvdWNoLmVsLnRyaWdnZXIoJ3NpbmdsZVRhcCcpO1xuICAgICAgICAgICAgICAgICAgdG91Y2ggPSB7fTtcbiAgICAgICAgICAgICAgICB9LCAyNTApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG91Y2ggPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsdGFYID0gZGVsdGFZID0gMDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC8vIHdoZW4gdGhlIGJyb3dzZXIgd2luZG93IGxvc2VzIGZvY3VzLFxuICAgICAgLy8gZm9yIGV4YW1wbGUgd2hlbiBhIG1vZGFsIGRpYWxvZyBpcyBzaG93bixcbiAgICAgIC8vIGNhbmNlbCBhbGwgb25nb2luZyBldmVudHNcbiAgICAgIC5vbigndG91Y2hjYW5jZWwgTVNQb2ludGVyQ2FuY2VsIHBvaW50ZXJjYW5jZWwnLCBmdW5jdGlvbihlKXtcblxuICAgICAgICAvLyBJZ25vcmUgcG9pbnRlcmNhbmNlbCBpZiB0aGUgZXZlbnQgc3VwcG9ydHMgdG91Y2ggZXZlbnRzLCB0byBwcmV2ZW50IHBvaW50ZXJjYW5jZWwgaW4gc3dpcGUgZ2VzdHVyZVxuICAgICAgICBpZiAoKGUudHlwZSA9PSAndG91Y2hjYW5jZWwnICYmIGhhc1RvdWNoRXZlbnRzICYmIGhhc1RvdWNoKSB8fCAoIWhhc1RvdWNoRXZlbnRzICYmIGUudHlwZSA9PSAncG9pbnRlcmNhbmNlbCcgJiYgaGFzUG9pbnRlckV2ZW50cykpIHtcbiAgICAgICAgICBjYW5jZWxBbGwoKTtcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbiAgICAvLyBzY3JvbGxpbmcgdGhlIHdpbmRvdyBpbmRpY2F0ZXMgaW50ZW50aW9uIG9mIHRoZSB1c2VyXG4gICAgLy8gdG8gc2Nyb2xsLCBub3QgdGFwIG9yIHN3aXBlLCBzbyBjYW5jZWwgYWxsIG9uZ29pbmcgZXZlbnRzXG4gICAgJCh3aW5kb3cpLm9uKCdzY3JvbGwnLCBjYW5jZWxBbGwpO1xuICB9KTtcblxuICBbJ3N3aXBlJywgJ3N3aXBlTGVmdCcsICdzd2lwZVJpZ2h0JywgJ3N3aXBlVXAnLCAnc3dpcGVEb3duJywgJ2RvdWJsZVRhcCcsICd0YXAnLCAnc2luZ2xlVGFwJywgJ2xvbmdUYXAnXS5mb3JFYWNoKGZ1bmN0aW9uKGV2ZW50TmFtZSl7XG4gICAgJC5mbltldmVudE5hbWVdID0gZnVuY3Rpb24oY2FsbGJhY2speyByZXR1cm4gJCh0aGlzKS5vbihldmVudE5hbWUsIGNhbGxiYWNrKTsgfTtcbiAgfSk7XG59KShqUXVlcnkpO1xuXG4oZnVuY3Rpb24oVUkpIHtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgdmFyIHN0YWNrcyA9IFtdO1xuXG4gICAgVUkuY29tcG9uZW50KCdzdGFja01hcmdpbicsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgY2xzOiAndWstbWFyZ2luLXNtYWxsLXRvcCcsXG4gICAgICAgICAgICByb3dmaXJzdDogZmFsc2UsXG4gICAgICAgICAgICBvYnNlcnZlOiBmYWxzZVxuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIFVJLiQoJ1tkYXRhLXVrLW1hcmdpbl0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ3N0YWNrTWFyZ2luJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFVJLnN0YWNrTWFyZ2luKGVsZSwgVUkuVXRpbHMub3B0aW9ucyhlbGUuYXR0cignZGF0YS11ay1tYXJnaW4nKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgVUkuJHdpbi5vbigncmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnByb2Nlc3MoKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgVUkuJChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICAgICAgVUkuJHdpbi5vbignbG9hZCcsIGZuKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBVSS5VdGlscy5kZWJvdW5jZShmbiwgMjApO1xuICAgICAgICAgICAgfSkoKSk7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2Rpc3BsYXkudWsuY2hlY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5pcygnOnZpc2libGUnKSkgdGhpcy5wcm9jZXNzKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm9ic2VydmUpIHtcblxuICAgICAgICAgICAgICAgIFVJLmRvbU9ic2VydmUodGhpcy5lbGVtZW50LCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy5lbGVtZW50LmlzKCc6dmlzaWJsZScpKSAkdGhpcy5wcm9jZXNzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0YWNrcy5wdXNoKHRoaXMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzLCBjb2x1bW5zID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuKCk7XG5cbiAgICAgICAgICAgIFVJLlV0aWxzLnN0YWNrTWFyZ2luKGNvbHVtbnMsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnJvd2ZpcnN0IHx8ICFjb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBNYXJrIGZpcnN0IGNvbHVtbiBlbGVtZW50c1xuICAgICAgICAgICAgdmFyIGdyb3VwID0ge30sIG1pbmxlZnQgPSBmYWxzZTtcblxuICAgICAgICAgICAgY29sdW1ucy5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMucm93Zmlyc3QpLmVhY2goZnVuY3Rpb24ob2Zmc2V0LCAkZWxlKXtcblxuICAgICAgICAgICAgICAgICRlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGUuZGlzcGxheSAhPSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gJGVsZS5vZmZzZXQoKS5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICAoKGdyb3VwW29mZnNldF0gPSBncm91cFtvZmZzZXRdIHx8IFtdKSAmJiBncm91cFtvZmZzZXRdKS5wdXNoKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBtaW5sZWZ0ID0gbWlubGVmdCA9PT0gZmFsc2UgPyBvZmZzZXQgOiBNYXRoLm1pbihtaW5sZWZ0LCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBVSS4kKGdyb3VwW21pbmxlZnRdKS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMucm93Zmlyc3QpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cblxuICAgIC8vIHJlc3BvbnNpdmUgZWxlbWVudCBlLmcuIGlmcmFtZXNcblxuICAgIChmdW5jdGlvbigpe1xuXG4gICAgICAgIHZhciBlbGVtZW50cyA9IFtdLCBjaGVjayA9IGZ1bmN0aW9uKGVsZSkge1xuXG4gICAgICAgICAgICBpZiAoIWVsZS5pcygnOnZpc2libGUnKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICB2YXIgd2lkdGggID0gZWxlLnBhcmVudCgpLndpZHRoKCksXG4gICAgICAgICAgICAgICAgaXdpZHRoID0gZWxlLmRhdGEoJ3dpZHRoJyksXG4gICAgICAgICAgICAgICAgcmF0aW8gID0gKHdpZHRoIC8gaXdpZHRoKSxcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBNYXRoLmZsb29yKHJhdGlvICogZWxlLmRhdGEoJ2hlaWdodCcpKTtcblxuICAgICAgICAgICAgZWxlLmNzcyh7aGVpZ2h0OiAod2lkdGggPCBpd2lkdGgpID8gaGVpZ2h0IDogZWxlLmRhdGEoJ2hlaWdodCcpfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgVUkuY29tcG9uZW50KCdyZXNwb25zaXZlRWxlbWVudCcsIHtcblxuICAgICAgICAgICAgZGVmYXVsdHM6IHt9LFxuXG4gICAgICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgICAgICBVSS4kKCdpZnJhbWUudWstcmVzcG9uc2l2ZS13aWR0aCwgW2RhdGEtdWstcmVzcG9uc2l2ZV0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKSwgb2JqO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZS5kYXRhKCdyZXNwb25zaXZlRWxlbWVudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gVUkucmVzcG9uc2l2ZUVsZW1lbnQoZWxlLCB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgZWxlID0gdGhpcy5lbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZS5hdHRyKCd3aWR0aCcpICYmIGVsZS5hdHRyKCdoZWlnaHQnKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGVsZS5kYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIDogZWxlLmF0dHIoJ3dpZHRoJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGVsZS5hdHRyKCdoZWlnaHQnKVxuICAgICAgICAgICAgICAgICAgICB9KS5vbignZGlzcGxheS51ay5jaGVjaycsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVjayhlbGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjaGVjayhlbGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFVJLiR3aW4ub24oJ3Jlc2l6ZSBsb2FkJywgVUkuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGUpe1xuICAgICAgICAgICAgICAgIGNoZWNrKGVsZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9LCAxNSkpO1xuXG4gICAgfSkoKTtcblxuXG4gICAgLy8gaGVscGVyXG5cbiAgICBVSS5VdGlscy5zdGFja01hcmdpbiA9IGZ1bmN0aW9uKGVsZW1lbnRzLCBvcHRpb25zKSB7XG5cbiAgICAgICAgb3B0aW9ucyA9IFVJLiQuZXh0ZW5kKHtcbiAgICAgICAgICAgIGNsczogJ3VrLW1hcmdpbi1zbWFsbC10b3AnXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGVsZW1lbnRzID0gVUkuJChlbGVtZW50cykucmVtb3ZlQ2xhc3Mob3B0aW9ucy5jbHMpO1xuXG4gICAgICAgIHZhciBtaW4gPSBmYWxzZTtcblxuICAgICAgICBlbGVtZW50cy5lYWNoKGZ1bmN0aW9uKG9mZnNldCwgaGVpZ2h0LCBwb3MsICRlbGUpe1xuXG4gICAgICAgICAgICAkZWxlICAgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAoJGVsZS5jc3MoJ2Rpc3BsYXknKSAhPSAnbm9uZScpIHtcblxuICAgICAgICAgICAgICAgIG9mZnNldCA9ICRlbGUub2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gJGVsZS5vdXRlckhlaWdodCgpO1xuICAgICAgICAgICAgICAgIHBvcyAgICA9IG9mZnNldC50b3AgKyBoZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICAkZWxlLmRhdGEoe1xuICAgICAgICAgICAgICAgICAgICB1a01hcmdpblBvczogcG9zLFxuICAgICAgICAgICAgICAgICAgICB1a01hcmdpblRvcDogb2Zmc2V0LnRvcFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gZmFsc2UgfHwgKG9mZnNldC50b3AgPCBtaW4udG9wKSApIHtcblxuICAgICAgICAgICAgICAgICAgICBtaW4gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AgIDogb2Zmc2V0LnRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgOiBvZmZzZXQubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcyAgOiBwb3NcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSkuZWFjaChmdW5jdGlvbigkZWxlKSB7XG5cbiAgICAgICAgICAgICRlbGUgICA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgIGlmICgkZWxlLmNzcygnZGlzcGxheScpICE9ICdub25lJyAmJiAkZWxlLmRhdGEoJ3VrTWFyZ2luVG9wJykgPiBtaW4udG9wICYmICRlbGUuZGF0YSgndWtNYXJnaW5Qb3MnKSA+IG1pbi5wb3MpIHtcbiAgICAgICAgICAgICAgICAkZWxlLmFkZENsYXNzKG9wdGlvbnMuY2xzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLm1hdGNoSGVpZ2h0cyA9IGZ1bmN0aW9uKGVsZW1lbnRzLCBvcHRpb25zKSB7XG5cbiAgICAgICAgZWxlbWVudHMgPSBVSS4kKGVsZW1lbnRzKS5jc3MoJ21pbi1oZWlnaHQnLCAnJyk7XG4gICAgICAgIG9wdGlvbnMgID0gVUkuJC5leHRlbmQoeyByb3cgOiB0cnVlIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHZhciBtYXRjaEhlaWdodHMgPSBmdW5jdGlvbihncm91cCl7XG5cbiAgICAgICAgICAgIGlmIChncm91cC5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICAgICAgICAgIHZhciBtYXggPSAwO1xuXG4gICAgICAgICAgICBncm91cC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgVUkuJCh0aGlzKS5vdXRlckhlaWdodCgpKTtcbiAgICAgICAgICAgIH0pLmVhY2goZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IFVJLiQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCAgPSBtYXggLSAoZWxlbWVudC5jc3MoJ2JveC1zaXppbmcnKSA9PSAnYm9yZGVyLWJveCcgPyAwIDogKGVsZW1lbnQub3V0ZXJIZWlnaHQoKSAtIGVsZW1lbnQuaGVpZ2h0KCkpKTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY3NzKCdtaW4taGVpZ2h0JywgaGVpZ2h0ICsgJ3B4Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAob3B0aW9ucy5yb3cpIHtcblxuICAgICAgICAgICAgZWxlbWVudHMuZmlyc3QoKS53aWR0aCgpOyAvLyBmb3JjZSByZWRyYXdcblxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICAgICAgdmFyIGxhc3RvZmZzZXQgPSBmYWxzZSwgZ3JvdXAgPSBbXTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnRzLmVhY2goZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyksIG9mZnNldCA9IGVsZS5vZmZzZXQoKS50b3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBsYXN0b2Zmc2V0ICYmIGdyb3VwLmxlbmd0aCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEhlaWdodHMoVUkuJChncm91cCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBlbGUub2Zmc2V0KCkudG9wO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAucHVzaChlbGUpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0b2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaEhlaWdodHMoVUkuJChncm91cCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1hdGNoSGVpZ2h0cyhlbGVtZW50cyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgKGZ1bmN0aW9uKGNhY2hlU3Zncyl7XG5cbiAgICAgICAgVUkuVXRpbHMuaW5saW5lU3ZnID0gZnVuY3Rpb24oc2VsZWN0b3IsIHJvb3QpIHtcblxuICAgICAgICAgICAgdmFyIGltYWdlcyA9IFVJLiQoc2VsZWN0b3IgfHwgJ2ltZ1tzcmMkPVwiLnN2Z1wiXScsIHJvb3QgfHwgZG9jdW1lbnQpLmVhY2goZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgIHZhciBpbWcgPSBVSS4kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICBzcmMgPSBpbWcuYXR0cignc3JjJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWNhY2hlU3Znc1tzcmNdKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBVSS4kLkRlZmVycmVkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgVUkuJC5nZXQoc3JjLCB7bmM6IE1hdGgucmFuZG9tKCl9LCBmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQucmVzb2x2ZShVSS4kKGRhdGEpLmZpbmQoJ3N2ZycpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FjaGVTdmdzW3NyY10gPSBkLnByb21pc2UoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYWNoZVN2Z3Nbc3JjXS50aGVuKGZ1bmN0aW9uKHN2Zykge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciAkc3ZnID0gVUkuJChzdmcpLmNsb25lKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGltZy5hdHRyKCdpZCcpKSAkc3ZnLmF0dHIoJ2lkJywgaW1nLmF0dHIoJ2lkJykpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW1nLmF0dHIoJ2NsYXNzJykpICRzdmcuYXR0cignY2xhc3MnLCBpbWcuYXR0cignY2xhc3MnKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbWcuYXR0cignc3R5bGUnKSkgJHN2Zy5hdHRyKCdzdHlsZScsIGltZy5hdHRyKCdzdHlsZScpKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1nLmF0dHIoJ3dpZHRoJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRzdmcuYXR0cignd2lkdGgnLCBpbWcuYXR0cignd2lkdGgnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWltZy5hdHRyKCdoZWlnaHQnKSkgICRzdmcucmVtb3ZlQXR0cignaGVpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1nLmF0dHIoJ2hlaWdodCcpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICRzdmcuYXR0cignaGVpZ2h0JywgaW1nLmF0dHIoJ2hlaWdodCcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW1nLmF0dHIoJ3dpZHRoJykpICRzdmcucmVtb3ZlQXR0cignd2lkdGgnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGltZy5yZXBsYWNlV2l0aCgkc3ZnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICBVSS5yZWFkeShmdW5jdGlvbihjb250ZXh0KSB7XG4gICAgICAgICAgICBVSS5VdGlscy5pbmxpbmVTdmcoJ1tkYXRhLXVrLXN2Z10nLCBjb250ZXh0KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KSh7fSk7XG5cbiAgICBVSS5VdGlscy5nZXRDc3NWYXIgPSBmdW5jdGlvbihuYW1lKSB7XG5cbiAgICAgICAgLyogdXNhZ2UgaW4gY3NzOiAgLnZhci1uYW1lOmJlZm9yZSB7IGNvbnRlbnQ6XCJ4eXpcIiB9ICovXG5cbiAgICAgICAgdmFyIHZhbCwgZG9jID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBlbGVtZW50ID0gZG9jLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcblxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Zhci0nK25hbWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWwgPSBKU09OLnBhcnNlKHZhbCA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgJzpiZWZvcmUnKS5jb250ZW50LnJlcGxhY2UoL15bXCInXSguKilbXCInXSQvLCAnJDEnKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHZhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvYy5yZW1vdmVDaGlsZChlbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIFVJLmNvbXBvbmVudCgnc21vb3RoU2Nyb2xsJywge1xuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLiRodG1sLm9uKCdjbGljay5zbW9vdGgtc2Nyb2xsLnVpa2l0JywgJ1tkYXRhLXVrLXNtb290aC1zY3JvbGxdJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFlbGUuZGF0YSgnc21vb3RoU2Nyb2xsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IFVJLnNtb290aFNjcm9sbChlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstc21vb3RoLXNjcm9sbCcpKSk7XG4gICAgICAgICAgICAgICAgICAgIGVsZS50cmlnZ2VyKCdjbGljaycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgc2Nyb2xsVG9FbGVtZW50KFVJLiQodGhpcy5oYXNoKS5sZW5ndGggPyBVSS4kKHRoaXMuaGFzaCkgOiBVSS4kKCdib2R5JyksICR0aGlzLm9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHNjcm9sbFRvRWxlbWVudChlbGUsIG9wdGlvbnMpIHtcblxuICAgICAgICBvcHRpb25zID0gVUkuJC5leHRlbmQoe1xuICAgICAgICAgICAgZHVyYXRpb246IDEwMDAsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiAnZWFzZU91dEV4cG8nLFxuICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCl7fVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICAvLyBnZXQgLyBzZXQgcGFyYW1ldGVyc1xuICAgICAgICB2YXIgdGFyZ2V0ICAgID0gZWxlLm9mZnNldCgpLnRvcCAtIG9wdGlvbnMub2Zmc2V0LFxuICAgICAgICAgICAgZG9jaGVpZ2h0ID0gVUkuJGRvYy5oZWlnaHQoKSxcbiAgICAgICAgICAgIHdpbmhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgICAgICBpZiAoKHRhcmdldCArIHdpbmhlaWdodCkgPiBkb2NoZWlnaHQpIHtcbiAgICAgICAgICAgIHRhcmdldCA9IGRvY2hlaWdodCAtIHdpbmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFuaW1hdGUgdG8gdGFyZ2V0LCBmaXJlIGNhbGxiYWNrIHdoZW4gZG9uZVxuICAgICAgICBVSS4kKCdodG1sLGJvZHknKS5zdG9wKCkuYW5pbWF0ZSh7c2Nyb2xsVG9wOiB0YXJnZXR9LCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLnRyYW5zaXRpb24pLnByb21pc2UoKS5kb25lKG9wdGlvbnMuY29tcGxldGUpO1xuICAgIH1cblxuICAgIFVJLlV0aWxzLnNjcm9sbFRvRWxlbWVudCA9IHNjcm9sbFRvRWxlbWVudDtcblxuICAgIGlmICghVUkuJC5lYXNpbmcuZWFzZU91dEV4cG8pIHtcbiAgICAgICAgVUkuJC5lYXNpbmcuZWFzZU91dEV4cG8gPSBmdW5jdGlvbih4LCB0LCBiLCBjLCBkKSB7IHJldHVybiAodCA9PSBkKSA/IGIgKyBjIDogYyAqICgtTWF0aC5wb3coMiwgLTEwICogdCAvIGQpICsgMSkgKyBiOyB9O1xuICAgIH1cblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciAkd2luICAgICAgICAgICA9IFVJLiR3aW4sXG4gICAgICAgICRkb2MgICAgICAgICAgID0gVUkuJGRvYyxcbiAgICAgICAgc2Nyb2xsc3BpZXMgICAgPSBbXSxcbiAgICAgICAgY2hlY2tTY3JvbGxTcHkgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpIDwgc2Nyb2xsc3BpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmFwcGx5KHdpbmRvdywgW3Njcm9sbHNwaWVzW2ldLmNoZWNrXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICBVSS5jb21wb25lbnQoJ3Njcm9sbHNweScsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgdGFyZ2V0ICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgY2xzICAgICAgICA6ICd1ay1zY3JvbGxzcHktaW52aWV3JyxcbiAgICAgICAgICAgIGluaXRjbHMgICAgOiAndWstc2Nyb2xsc3B5LWluaXQtaW52aWV3JyxcbiAgICAgICAgICAgIHRvcG9mZnNldCAgOiAwLFxuICAgICAgICAgICAgbGVmdG9mZnNldCA6IDAsXG4gICAgICAgICAgICByZXBlYXQgICAgIDogZmFsc2UsXG4gICAgICAgICAgICBkZWxheSAgICAgIDogMFxuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBsaXN0ZW4gdG8gc2Nyb2xsIGFuZCByZXNpemVcbiAgICAgICAgICAgICRkb2Mub24oJ3Njcm9sbGluZy51ay5kb2N1bWVudCcsIGNoZWNrU2Nyb2xsU3B5KTtcbiAgICAgICAgICAgICR3aW4ub24oJ2xvYWQgcmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgVUkuVXRpbHMuZGVib3VuY2UoY2hlY2tTY3JvbGxTcHksIDUwKSk7XG5cbiAgICAgICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICAgICAgVUkucmVhZHkoZnVuY3Rpb24oY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgVUkuJCgnW2RhdGEtdWstc2Nyb2xsc3B5XScsIGNvbnRleHQpLmVhY2goZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5kYXRhKCdzY3JvbGxzcHknKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IFVJLnNjcm9sbHNweShlbGVtZW50LCBVSS5VdGlscy5vcHRpb25zKGVsZW1lbnQuYXR0cignZGF0YS11ay1zY3JvbGxzcHknKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcywgaW52aWV3c3RhdGUsIGluaXRpbnZpZXcsIHRvZ2dsZWNscyA9IHRoaXMub3B0aW9ucy5jbHMuc3BsaXQoLywvKSwgZm4gPSBmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRzICAgICA9ICR0aGlzLm9wdGlvbnMudGFyZ2V0ID8gJHRoaXMuZWxlbWVudC5maW5kKCR0aGlzLm9wdGlvbnMudGFyZ2V0KSA6ICR0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGRlbGF5SWR4ICAgICA9IGVsZW1lbnRzLmxlbmd0aCA9PT0gMSA/IDEgOiAwLFxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVjbHNJZHggPSAwO1xuXG4gICAgICAgICAgICAgICAgZWxlbWVudHMuZWFjaChmdW5jdGlvbihpZHgpe1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ICAgICA9IFVJLiQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZpZXdzdGF0ZSA9IGVsZW1lbnQuZGF0YSgnaW52aWV3c3RhdGUnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGludmlldyAgICAgID0gVUkuVXRpbHMuaXNJblZpZXcoZWxlbWVudCwgJHRoaXMub3B0aW9ucyksXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGUgICAgICA9IGVsZW1lbnQuYXR0cignZGF0YS11ay1zY3JvbGxzcHktY2xzJykgfHwgdG9nZ2xlY2xzW3RvZ2dsZWNsc0lkeF0udHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnZpZXcgJiYgIWludmlld3N0YXRlICYmICFlbGVtZW50LmRhdGEoJ3Njcm9sbHNweS1pZGxlJykpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0aW52aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hZGRDbGFzcygkdGhpcy5vcHRpb25zLmluaXRjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLm9mZnNldCA9IGVsZW1lbnQub2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGludmlldyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnRyaWdnZXIoJ2luaXQudWsuc2Nyb2xsc3B5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnc2Nyb2xsc3B5LWlkbGUnLCBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKCd1ay1zY3JvbGxzcHktaW52aWV3JykudG9nZ2xlQ2xhc3ModG9nZ2xlKS53aWR0aCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudHJpZ2dlcignaW52aWV3LnVrLnNjcm9sbHNweScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhKCdzY3JvbGxzcHktaWRsZScsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRhdGEoJ2ludmlld3N0YXRlJywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sICR0aGlzLm9wdGlvbnMuZGVsYXkgKiBkZWxheUlkeCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxheUlkeCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnZpZXcgJiYgaW52aWV3c3RhdGUgJiYgJHRoaXMub3B0aW9ucy5yZXBlYXQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGF0YSgnc2Nyb2xsc3B5LWlkbGUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50LmRhdGEoJ3Njcm9sbHNweS1pZGxlJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnc2Nyb2xsc3B5LWlkbGUnLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3VrLXNjcm9sbHNweS1pbnZpZXcnKS50b2dnbGVDbGFzcyh0b2dnbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhKCdpbnZpZXdzdGF0ZScsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC50cmlnZ2VyKCdvdXR2aWV3LnVrLnNjcm9sbHNweScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlY2xzSWR4ID0gdG9nZ2xlY2xzW3RvZ2dsZWNsc0lkeCArIDFdID8gKHRvZ2dsZWNsc0lkeCArIDEpIDogMDtcblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm4oKTtcblxuICAgICAgICAgICAgdGhpcy5jaGVjayA9IGZuO1xuXG4gICAgICAgICAgICBzY3JvbGxzcGllcy5wdXNoKHRoaXMpO1xuICAgICAgICB9XG4gICAgfSk7XG5cblxuICAgIHZhciBzY3JvbGxzcHluYXZzID0gW10sXG4gICAgICAgIGNoZWNrU2Nyb2xsU3B5TmF2cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZm9yKHZhciBpPTA7IGkgPCBzY3JvbGxzcHluYXZzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5hcHBseSh3aW5kb3csIFtzY3JvbGxzcHluYXZzW2ldLmNoZWNrXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICBVSS5jb21wb25lbnQoJ3Njcm9sbHNweW5hdicsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgY2xzICAgICAgICAgIDogJ3VrLWFjdGl2ZScsXG4gICAgICAgICAgICBjbG9zZXN0ICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHRvcG9mZnNldCAgICA6IDAsXG4gICAgICAgICAgICBsZWZ0b2Zmc2V0ICAgOiAwLFxuICAgICAgICAgICAgc21vb3Roc2Nyb2xsIDogZmFsc2VcbiAgICAgICAgfSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gbGlzdGVuIHRvIHNjcm9sbCBhbmQgcmVzaXplXG4gICAgICAgICAgICAkZG9jLm9uKCdzY3JvbGxpbmcudWsuZG9jdW1lbnQnLCBjaGVja1Njcm9sbFNweU5hdnMpO1xuICAgICAgICAgICAgJHdpbi5vbigncmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgVUkuVXRpbHMuZGVib3VuY2UoY2hlY2tTY3JvbGxTcHlOYXZzLCA1MCkpO1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIFVJLiQoJ1tkYXRhLXVrLXNjcm9sbHNweS1uYXZdJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LmRhdGEoJ3Njcm9sbHNweW5hdicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gVUkuc2Nyb2xsc3B5bmF2KGVsZW1lbnQsIFVJLlV0aWxzLm9wdGlvbnMoZWxlbWVudC5hdHRyKCdkYXRhLXVrLXNjcm9sbHNweS1uYXYnKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGlkcyAgICAgPSBbXSxcbiAgICAgICAgICAgICAgICBsaW5rcyAgID0gdGhpcy5maW5kKFwiYVtocmVmXj0nIyddXCIpLmVhY2goZnVuY3Rpb24oKXsgaWYodGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS50cmltKCkhPT0nIycpIGlkcy5wdXNoKHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJykpOyB9KSxcbiAgICAgICAgICAgICAgICB0YXJnZXRzID0gVUkuJChpZHMuam9pbihcIixcIikpLFxuXG4gICAgICAgICAgICAgICAgY2xzQWN0aXZlICA9IHRoaXMub3B0aW9ucy5jbHMsXG4gICAgICAgICAgICAgICAgY2xzQ2xvc2VzdCA9IHRoaXMub3B0aW9ucy5jbG9zZXN0IHx8IHRoaXMub3B0aW9ucy5jbG9zZXN0O1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzLCBpbnZpZXdzLCBmbiA9IGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICBpbnZpZXdzID0gW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTAgOyBpIDwgdGFyZ2V0cy5sZW5ndGggOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFVJLlV0aWxzLmlzSW5WaWV3KHRhcmdldHMuZXEoaSksICR0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZpZXdzLnB1c2godGFyZ2V0cy5lcShpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW52aWV3cy5sZW5ndGgpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgbmF2aXRlbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgPSAkd2luLnNjcm9sbFRvcCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpPTA7IGk8IGludmlld3MubGVuZ3RoO2krKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnZpZXdzW2ldLm9mZnNldCgpLnRvcCAtICR0aGlzLm9wdGlvbnMudG9wb2Zmc2V0ID49IHNjcm9sbFRvcCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW52aWV3c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMub3B0aW9ucy5jbG9zZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rcy5ibHVyKCkuY2xvc2VzdChjbHNDbG9zZXN0KS5yZW1vdmVDbGFzcyhjbHNBY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aXRlbXMgPSBsaW5rcy5maWx0ZXIoXCJhW2hyZWY9JyNcIit0YXJnZXQuYXR0cignaWQnKStcIiddXCIpLmNsb3Nlc3QoY2xzQ2xvc2VzdCkuYWRkQ2xhc3MoY2xzQWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdml0ZW1zID0gbGlua3MucmVtb3ZlQ2xhc3MoY2xzQWN0aXZlKS5maWx0ZXIoXCJhW2hyZWY9JyNcIit0YXJnZXQuYXR0cihcImlkXCIpK1wiJ11cIikuYWRkQ2xhc3MoY2xzQWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICR0aGlzLmVsZW1lbnQudHJpZ2dlcignaW52aWV3LnVrLnNjcm9sbHNweW5hdicsIFt0YXJnZXQsIG5hdml0ZW1zXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zbW9vdGhzY3JvbGwgJiYgVUkuc21vb3RoU2Nyb2xsKSB7XG4gICAgICAgICAgICAgICAgbGlua3MuZWFjaChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICBVSS5zbW9vdGhTY3JvbGwodGhpcywgJHRoaXMub3B0aW9ucy5zbW9vdGhzY3JvbGwpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbigpO1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGF0YSgnc2Nyb2xsc3B5bmF2JywgdGhpcyk7XG5cbiAgICAgICAgICAgIHRoaXMuY2hlY2sgPSBmbjtcbiAgICAgICAgICAgIHNjcm9sbHNweW5hdnMucHVzaCh0aGlzKTtcblxuICAgICAgICB9XG4gICAgfSk7XG5cbn0pKFVJa2l0Mik7XG5cbihmdW5jdGlvbihVSSl7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciB0b2dnbGVzID0gW107XG5cbiAgICBVSS5jb21wb25lbnQoJ3RvZ2dsZScsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgdGFyZ2V0ICAgIDogZmFsc2UsXG4gICAgICAgICAgICBjbHMgICAgICAgOiAndWstaGlkZGVuJyxcbiAgICAgICAgICAgIGFuaW1hdGlvbiA6IGZhbHNlLFxuICAgICAgICAgICAgZHVyYXRpb24gIDogMjAwXG4gICAgICAgIH0sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS5yZWFkeShmdW5jdGlvbihjb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICBVSS4kKCdbZGF0YS11ay10b2dnbGVdJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGUuZGF0YSgndG9nZ2xlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBVSS50b2dnbGUoZWxlLCBVSS5VdGlscy5vcHRpb25zKGVsZS5hdHRyKCdkYXRhLXVrLXRvZ2dsZScpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVzLmZvckVhY2goZnVuY3Rpb24odG9nZ2xlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZS5nZXRUb2dnbGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5hcmlhID0gKHRoaXMub3B0aW9ucy5jbHMuaW5kZXhPZigndWstaGlkZGVuJykgIT09IC0xKTtcblxuICAgICAgICAgICAgdGhpcy5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoJHRoaXMuZWxlbWVudC5pcygnYVtocmVmPVwiI1wiXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAkdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0b2dnbGVzLnB1c2godGhpcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9nZ2xlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdGhpcy5nZXRUb2dnbGVzKCk7XG5cbiAgICAgICAgICAgIGlmKCF0aGlzLnRvdG9nZ2xlLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFuaW1hdGlvbiAmJiBVSS5zdXBwb3J0LmFuaW1hdGlvbikge1xuXG4gICAgICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcywgYW5pbWF0aW9ucyA9IHRoaXMub3B0aW9ucy5hbmltYXRpb24uc3BsaXQoJywnKTtcblxuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25zLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbnNbMV0gPSBhbmltYXRpb25zWzBdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGFuaW1hdGlvbnNbMF0gPSBhbmltYXRpb25zWzBdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBhbmltYXRpb25zWzFdID0gYW5pbWF0aW9uc1sxXS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRvdG9nZ2xlLmNzcygnYW5pbWF0aW9uLWR1cmF0aW9uJywgdGhpcy5vcHRpb25zLmR1cmF0aW9uKydtcycpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50b3RvZ2dsZS5lYWNoKGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZS5oYXNDbGFzcygkdGhpcy5vcHRpb25zLmNscykpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlLnRvZ2dsZUNsYXNzKCR0aGlzLm9wdGlvbnMuY2xzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgVUkuVXRpbHMuYW5pbWF0ZShlbGUsIGFuaW1hdGlvbnNbMF0pLnRoZW4oZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGUuY3NzKCdhbmltYXRpb24tZHVyYXRpb24nLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUkuVXRpbHMuY2hlY2tEaXNwbGF5KGVsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBVSS5VdGlscy5hbmltYXRlKHRoaXMsIGFuaW1hdGlvbnNbMV0rJyB1ay1hbmltYXRpb24tcmV2ZXJzZScpLnRoZW4oZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGUudG9nZ2xlQ2xhc3MoJHRoaXMub3B0aW9ucy5jbHMpLmNzcygnYW5pbWF0aW9uLWR1cmF0aW9uJywgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJLlV0aWxzLmNoZWNrRGlzcGxheShlbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RvZ2dsZS50b2dnbGVDbGFzcyh0aGlzLm9wdGlvbnMuY2xzKTtcbiAgICAgICAgICAgICAgICBVSS5VdGlscy5jaGVja0Rpc3BsYXkodGhpcy50b3RvZ2dsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlQXJpYSgpO1xuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0VG9nZ2xlczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnRvdG9nZ2xlID0gdGhpcy5vcHRpb25zLnRhcmdldCA/IFVJLiQodGhpcy5vcHRpb25zLnRhcmdldCk6W107XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFyaWEoKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGVBcmlhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFyaWEgJiYgdGhpcy50b3RvZ2dsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdG9nZ2xlLm5vdCgnW2FyaWEtaGlkZGVuXScpLmVhY2goZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgVUkuJCh0aGlzKS5hdHRyKCdhcmlhLWhpZGRlbicsIFVJLiQodGhpcykuaGFzQ2xhc3MoJ3VrLWhpZGRlbicpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG59KShVSWtpdDIpO1xuXG4oZnVuY3Rpb24oVUkpIHtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgVUkuY29tcG9uZW50KCdhbGVydCcsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgZmFkZTogdHJ1ZSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXG4gICAgICAgICAgICB0cmlnZ2VyOiAnLnVrLWFsZXJ0LWNsb3NlJ1xuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLiRodG1sLm9uKCdjbGljay5hbGVydC51aWtpdCcsICdbZGF0YS11ay1hbGVydF0nLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ2FsZXJ0JykpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgYWxlcnQgPSBVSS5hbGVydChlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstYWxlcnQnKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChVSS4kKGUudGFyZ2V0KS5pcyhhbGVydC5vcHRpb25zLnRyaWdnZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGVydC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrJywgdGhpcy5vcHRpb25zLnRyaWdnZXIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgJHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNsb3NlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgICAgICAgPSB0aGlzLnRyaWdnZXIoJ2Nsb3NlLnVrLmFsZXJ0JyksXG4gICAgICAgICAgICAgICAgcmVtb3ZlRWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdjbG9zZWQudWsuYWxlcnQnKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFkZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY3NzKCdvdmVyZmxvdycsICdoaWRkZW4nKS5jc3MoXCJtYXgtaGVpZ2h0XCIsIGVsZW1lbnQuaGVpZ2h0KCkpLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgICAgICAgICA6IDAsXG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgICAgICAgIDogMCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1RvcCAgICA6IDAsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdCb3R0b20gOiAwLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3AgICAgIDogMCxcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tICA6IDBcbiAgICAgICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24sIHJlbW92ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZW1vdmVFbGVtZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG59KShVSWtpdDIpO1xuXG4oZnVuY3Rpb24oVUkpIHtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgVUkuY29tcG9uZW50KCdidXR0b25SYWRpbycsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgYWN0aXZlQ2xhc3M6ICd1ay1hY3RpdmUnLFxuICAgICAgICAgICAgdGFyZ2V0OiAnLnVrLWJ1dHRvbidcbiAgICAgICAgfSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS4kaHRtbC5vbignY2xpY2suYnV0dG9ucmFkaW8udWlraXQnLCAnW2RhdGEtdWstYnV0dG9uLXJhZGlvXScsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFlbGUuZGF0YSgnYnV0dG9uUmFkaW8nKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBvYmogICAgPSBVSS5idXR0b25SYWRpbyhlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstYnV0dG9uLXJhZGlvJykpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IFVJLiQoZS50YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaXMob2JqLm9wdGlvbnMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgLy8gSW5pdCBBUklBXG4gICAgICAgICAgICB0aGlzLmZpbmQoJHRoaXMub3B0aW9ucy50YXJnZXQpLmF0dHIoJ2FyaWEtY2hlY2tlZCcsICdmYWxzZScpLmZpbHRlcignLicgKyAkdGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKS5hdHRyKCdhcmlhLWNoZWNrZWQnLCAndHJ1ZScpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdjbGljaycsIHRoaXMub3B0aW9ucy50YXJnZXQsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZS5pcygnYVtocmVmPVwiI1wiXScpKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICAkdGhpcy5maW5kKCR0aGlzLm9wdGlvbnMudGFyZ2V0KS5ub3QoZWxlKS5yZW1vdmVDbGFzcygkdGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKS5ibHVyKCk7XG4gICAgICAgICAgICAgICAgZWxlLmFkZENsYXNzKCR0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpO1xuXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgICAgICAkdGhpcy5maW5kKCR0aGlzLm9wdGlvbnMudGFyZ2V0KS5ub3QoZWxlKS5hdHRyKCdhcmlhLWNoZWNrZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAgICAgICBlbGUuYXR0cignYXJpYS1jaGVja2VkJywgJ3RydWUnKTtcblxuICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoJ2NoYW5nZS51ay5idXR0b24nLCBbZWxlXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIGdldFNlbGVjdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmQoJy4nICsgdGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgVUkuY29tcG9uZW50KCdidXR0b25DaGVja2JveCcsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgYWN0aXZlQ2xhc3M6ICd1ay1hY3RpdmUnLFxuICAgICAgICAgICAgdGFyZ2V0OiAnLnVrLWJ1dHRvbidcbiAgICAgICAgfSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgVUkuJGh0bWwub24oJ2NsaWNrLmJ1dHRvbmNoZWNrYm94LnVpa2l0JywgJ1tkYXRhLXVrLWJ1dHRvbi1jaGVja2JveF0nLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWVsZS5kYXRhKCdidXR0b25DaGVja2JveCcpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiAgICA9IFVJLmJ1dHRvbkNoZWNrYm94KGVsZSwgVUkuVXRpbHMub3B0aW9ucyhlbGUuYXR0cignZGF0YS11ay1idXR0b24tY2hlY2tib3gnKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gVUkuJChlLnRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pcyhvYmoub3B0aW9ucy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQudHJpZ2dlcignY2xpY2snKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyBJbml0IEFSSUFcbiAgICAgICAgICAgIHRoaXMuZmluZCgkdGhpcy5vcHRpb25zLnRhcmdldCkuYXR0cignYXJpYS1jaGVja2VkJywgJ2ZhbHNlJykuZmlsdGVyKCcuJyArICR0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLmF0dHIoJ2FyaWEtY2hlY2tlZCcsICd0cnVlJyk7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrJywgdGhpcy5vcHRpb25zLnRhcmdldCwgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZS5pcygnYVtocmVmPVwiI1wiXScpKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICBlbGUudG9nZ2xlQ2xhc3MoJHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcykuYmx1cigpO1xuXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgICAgICBlbGUuYXR0cignYXJpYS1jaGVja2VkJywgZWxlLmhhc0NsYXNzKCR0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpKTtcblxuICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoJ2NoYW5nZS51ay5idXR0b24nLCBbZWxlXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIGdldFNlbGVjdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmQoJy4nICsgdGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG5cbiAgICBVSS5jb21wb25lbnQoJ2J1dHRvbicsIHtcblxuICAgICAgICBkZWZhdWx0czoge30sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIFVJLiRodG1sLm9uKCdjbGljay5idXR0b24udWlraXQnLCAnW2RhdGEtdWstYnV0dG9uXScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ2J1dHRvbicpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IFVJLmJ1dHRvbihlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstYnV0dG9uJykpKTtcbiAgICAgICAgICAgICAgICAgICAgZWxlLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIEluaXQgQVJJQVxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmF0dHIoJ2FyaWEtcHJlc3NlZCcsIHRoaXMuZWxlbWVudC5oYXNDbGFzcyhcInVrLWFjdGl2ZVwiKSk7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKCR0aGlzLmVsZW1lbnQuaXMoJ2FbaHJlZj1cIiNcIl0nKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgJHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgJHRoaXMudHJpZ2dlcignY2hhbmdlLnVrLmJ1dHRvbicsIFskdGhpcy5lbGVtZW50LmJsdXIoKS5oYXNDbGFzcygndWstYWN0aXZlJyldKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9nZ2xlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygndWstYWN0aXZlJyk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXR0cignYXJpYS1wcmVzc2VkJywgdGhpcy5lbGVtZW50Lmhhc0NsYXNzKCd1ay1hY3RpdmUnKSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBhY3RpdmUgPSBmYWxzZSwgaG92ZXJJZGxlLCBmbGlwcyA9IHtcbiAgICAgICAgeDoge1xuICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JyAgIDogJ2JvdHRvbS1yaWdodCcsXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JyAgOiAnYm90dG9tLWxlZnQnLFxuICAgICAgICAgICAgJ2JvdHRvbS1jZW50ZXInIDogJ2JvdHRvbS1jZW50ZXInLFxuICAgICAgICAgICAgJ3RvcC1sZWZ0JyAgICAgIDogJ3RvcC1yaWdodCcsXG4gICAgICAgICAgICAndG9wLXJpZ2h0JyAgICAgOiAndG9wLWxlZnQnLFxuICAgICAgICAgICAgJ3RvcC1jZW50ZXInICAgIDogJ3RvcC1jZW50ZXInLFxuICAgICAgICAgICAgJ2xlZnQtdG9wJyAgICAgIDogJ3JpZ2h0LXRvcCcsXG4gICAgICAgICAgICAnbGVmdC1ib3R0b20nICAgOiAncmlnaHQtYm90dG9tJyxcbiAgICAgICAgICAgICdsZWZ0LWNlbnRlcicgICA6ICdyaWdodC1jZW50ZXInLFxuICAgICAgICAgICAgJ3JpZ2h0LXRvcCcgICAgIDogJ2xlZnQtdG9wJyxcbiAgICAgICAgICAgICdyaWdodC1ib3R0b20nICA6ICdsZWZ0LWJvdHRvbScsXG4gICAgICAgICAgICAncmlnaHQtY2VudGVyJyAgOiAnbGVmdC1jZW50ZXInXG4gICAgICAgIH0sXG4gICAgICAgIHk6IHtcbiAgICAgICAgICAgICdib3R0b20tbGVmdCcgICA6ICd0b3AtbGVmdCcsXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JyAgOiAndG9wLXJpZ2h0JyxcbiAgICAgICAgICAgICdib3R0b20tY2VudGVyJyA6ICd0b3AtY2VudGVyJyxcbiAgICAgICAgICAgICd0b3AtbGVmdCcgICAgICA6ICdib3R0b20tbGVmdCcsXG4gICAgICAgICAgICAndG9wLXJpZ2h0JyAgICAgOiAnYm90dG9tLXJpZ2h0JyxcbiAgICAgICAgICAgICd0b3AtY2VudGVyJyAgICA6ICdib3R0b20tY2VudGVyJyxcbiAgICAgICAgICAgICdsZWZ0LXRvcCcgICAgICA6ICdsZWZ0LWJvdHRvbScsXG4gICAgICAgICAgICAnbGVmdC1ib3R0b20nICAgOiAnbGVmdC10b3AnLFxuICAgICAgICAgICAgJ2xlZnQtY2VudGVyJyAgIDogJ2xlZnQtY2VudGVyJyxcbiAgICAgICAgICAgICdyaWdodC10b3AnICAgICA6ICdyaWdodC1ib3R0b20nLFxuICAgICAgICAgICAgJ3JpZ2h0LWJvdHRvbScgIDogJ3JpZ2h0LXRvcCcsXG4gICAgICAgICAgICAncmlnaHQtY2VudGVyJyAgOiAncmlnaHQtY2VudGVyJ1xuICAgICAgICB9LFxuICAgICAgICB4eToge1xuICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JyAgIDogJ3RvcC1yaWdodCcsXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JyAgOiAndG9wLWxlZnQnLFxuICAgICAgICAgICAgJ2JvdHRvbS1jZW50ZXInIDogJ3RvcC1jZW50ZXInLFxuICAgICAgICAgICAgJ3RvcC1sZWZ0JyAgICAgIDogJ2JvdHRvbS1yaWdodCcsXG4gICAgICAgICAgICAndG9wLXJpZ2h0JyAgICAgOiAnYm90dG9tLWxlZnQnLFxuICAgICAgICAgICAgJ3RvcC1jZW50ZXInICAgIDogJ2JvdHRvbS1jZW50ZXInLFxuICAgICAgICAgICAgJ2xlZnQtdG9wJyAgICAgIDogJ3JpZ2h0LWJvdHRvbScsXG4gICAgICAgICAgICAnbGVmdC1ib3R0b20nICAgOiAncmlnaHQtdG9wJyxcbiAgICAgICAgICAgICdsZWZ0LWNlbnRlcicgICA6ICdyaWdodC1jZW50ZXInLFxuICAgICAgICAgICAgJ3JpZ2h0LXRvcCcgICAgIDogJ2xlZnQtYm90dG9tJyxcbiAgICAgICAgICAgICdyaWdodC1ib3R0b20nICA6ICdsZWZ0LXRvcCcsXG4gICAgICAgICAgICAncmlnaHQtY2VudGVyJyAgOiAnbGVmdC1jZW50ZXInXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVUkuY29tcG9uZW50KCdkcm9wZG93bicsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICBtb2RlICAgICAgICAgICAgOiAnaG92ZXInLFxuICAgICAgICAgICBwb3MgICAgICAgICAgICAgOiAnYm90dG9tLWxlZnQnLFxuICAgICAgICAgICBvZmZzZXQgICAgICAgICAgOiAwLFxuICAgICAgICAgICByZW1haW50aW1lICAgICAgOiA4MDAsXG4gICAgICAgICAgIGp1c3RpZnkgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICBib3VuZGFyeSAgICAgICAgOiBVSS4kd2luLFxuICAgICAgICAgICBkZWxheSAgICAgICAgICAgOiAwLFxuICAgICAgICAgICBkcm9wZG93blNlbGVjdG9yOiAnLnVrLWRyb3Bkb3duLC51ay1kcm9wZG93bi1ibGFuaycsXG4gICAgICAgICAgIGhvdmVyRGVsYXlJZGxlICA6IDI1MCxcbiAgICAgICAgICAgcHJldmVudGZsaXAgICAgIDogZmFsc2VcbiAgICAgICAgfSxcblxuICAgICAgICByZW1haW5JZGxlOiBmYWxzZSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIHRyaWdnZXJldmVudCA9IFVJLnN1cHBvcnQudG91Y2ggPyAnY2xpY2snIDogJ21vdXNlZW50ZXInO1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLiRodG1sLm9uKHRyaWdnZXJldmVudCsnLmRyb3Bkb3duLnVpa2l0IGZvY3VzIHBvaW50ZXJkb3duJywgJ1tkYXRhLXVrLWRyb3Bkb3duXScsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFlbGUuZGF0YSgnZHJvcGRvd24nKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBkcm9wZG93biA9IFVJLmRyb3Bkb3duKGVsZSwgVUkuVXRpbHMub3B0aW9ucyhlbGUuYXR0cignZGF0YS11ay1kcm9wZG93bicpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudHlwZT09J2NsaWNrJyB8fCAoZS50eXBlPT0nbW91c2VlbnRlcicgJiYgZHJvcGRvd24ub3B0aW9ucy5tb2RlPT0naG92ZXInKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24uZWxlbWVudC50cmlnZ2VyKHRyaWdnZXJldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcGRvd24uZHJvcGRvd24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5kcm9wZG93biAgICAgPSB0aGlzLmZpbmQodGhpcy5vcHRpb25zLmRyb3Bkb3duU2VsZWN0b3IpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXRQYXJlbnQgPSB0aGlzLmRyb3Bkb3duLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVJLiQuaW5BcnJheShVSS4kKHRoaXMpLmNzcygncG9zaXRpb24nKSwgWydyZWxhdGl2ZScsICdmaXhlZCcsICdhYnNvbHV0ZSddKSAhPT0gLTE7XG4gICAgICAgICAgICB9KS5zbGljZSgwLDEpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMub2Zmc2V0UGFyZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0UGFyZW50ID0gdGhpcy5lbGVtZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNlbnRlcmVkICA9IHRoaXMuZHJvcGRvd24uaGFzQ2xhc3MoJ3VrLWRyb3Bkb3duLWNlbnRlcicpO1xuICAgICAgICAgICAgdGhpcy5qdXN0aWZpZWQgPSB0aGlzLm9wdGlvbnMuanVzdGlmeSA/IFVJLiQodGhpcy5vcHRpb25zLmp1c3RpZnkpIDogZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMuYm91bmRhcnkgID0gVUkuJCh0aGlzLm9wdGlvbnMuYm91bmRhcnkpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuYm91bmRhcnkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ib3VuZGFyeSA9IFVJLiR3aW47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGxlZ2FjeSBERVBSRUNBVEVEIVxuICAgICAgICAgICAgaWYgKHRoaXMuZHJvcGRvd24uaGFzQ2xhc3MoJ3VrLWRyb3Bkb3duLXVwJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zID0gJ3RvcC1sZWZ0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bkb3duLmhhc0NsYXNzKCd1ay1kcm9wZG93bi1mbGlwJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zID0gdGhpcy5vcHRpb25zLnBvcy5yZXBsYWNlKCdsZWZ0JywncmlnaHQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bkb3duLmhhc0NsYXNzKCd1ay1kcm9wZG93bi1jZW50ZXInKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3MgPSB0aGlzLm9wdGlvbnMucG9zLnJlcGxhY2UoLyhsZWZ0fHJpZ2h0KS8sJ2NlbnRlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8tLSBlbmQgbGVnYWN5XG5cbiAgICAgICAgICAgIC8vIEluaXQgQVJJQVxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmF0dHIoJ2FyaWEtaGFzcG9wdXAnLCAndHJ1ZScpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0aGlzLmVsZW1lbnQuaGFzQ2xhc3MoJ3VrLW9wZW4nKSk7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tb2RlID09ICdjbGljaycgfHwgVUkuc3VwcG9ydC50b3VjaCkge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vbignY2xpY2sudWsuZHJvcGRvd24nLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyICR0YXJnZXQgPSBVSS4kKGUudGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISR0YXJnZXQucGFyZW50cygkdGhpcy5vcHRpb25zLmRyb3Bkb3duU2VsZWN0b3IpLmxlbmd0aCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRhcmdldC5pcyhcImFbaHJlZj0nIyddXCIpIHx8ICR0YXJnZXQucGFyZW50KCkuaXMoXCJhW2hyZWY9JyMnXVwiKSB8fCAoJHRoaXMuZHJvcGRvd24ubGVuZ3RoICYmICEkdGhpcy5kcm9wZG93bi5pcygnOnZpc2libGUnKSkgKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQuYmx1cigpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy5lbGVtZW50Lmhhc0NsYXNzKCd1ay1vcGVuJykpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMuZHJvcGRvd24uZmluZChlLnRhcmdldCkubGVuZ3RoIHx8ICR0YXJnZXQuaXMoJy51ay1kcm9wZG93bi1jbG9zZScpIHx8ICR0YXJnZXQucGFyZW50cygnLnVrLWRyb3Bkb3duLWNsb3NlJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9uKCdtb3VzZWVudGVyJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoJ3BvaW50ZXJlbnRlci51ay5kcm9wZG93bicsIFskdGhpc10pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy5yZW1haW5JZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoJHRoaXMucmVtYWluSWRsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaG92ZXJJZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaG92ZXJJZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmUgJiYgYWN0aXZlID09ICR0aGlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBwc2V1ZG8gbWFudUFpbVxuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlICYmIGFjdGl2ZSAhPSAkdGhpcykge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBob3ZlcklkbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVySWRsZSA9IHNldFRpbWVvdXQoJHRoaXMuc2hvdy5iaW5kKCR0aGlzKSwgJHRoaXMub3B0aW9ucy5kZWxheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAkdGhpcy5vcHRpb25zLmhvdmVyRGVsYXlJZGxlKTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBob3ZlcklkbGUgPSBzZXRUaW1lb3V0KCR0aGlzLnNob3cuYmluZCgkdGhpcyksICR0aGlzLm9wdGlvbnMuZGVsYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9KS5vbignbW91c2VsZWF2ZScsIGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChob3ZlcklkbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChob3ZlcklkbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgJHRoaXMucmVtYWluSWRsZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlICYmIGFjdGl2ZSA9PSAkdGhpcykgJHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LCAkdGhpcy5vcHRpb25zLnJlbWFpbnRpbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoJ3BvaW50ZXJsZWF2ZS51ay5kcm9wZG93bicsIFskdGhpc10pO1xuXG4gICAgICAgICAgICAgICAgfSkub24oJ2NsaWNrJywgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyICR0YXJnZXQgPSBVSS4kKGUudGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMucmVtYWluSWRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KCR0aGlzLnJlbWFpbklkbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmUgPT0gJHRoaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMuZHJvcGRvd24uZmluZChlLnRhcmdldCkubGVuZ3RoIHx8ICR0YXJnZXQuaXMoJy51ay1kcm9wZG93bi1jbG9zZScpIHx8ICR0YXJnZXQucGFyZW50cygnLnVrLWRyb3Bkb3duLWNsb3NlJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCR0YXJnZXQuaXMoXCJhW2hyZWY9JyMnXVwiKSB8fCAkdGFyZ2V0LnBhcmVudCgpLmlzKFwiYVtocmVmPScjJ11cIikpe1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgJHRoaXMuc2hvdygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHNob3c6IGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgIFVJLiRodG1sLm9mZignY2xpY2sub3V0ZXIuZHJvcGRvd24nKTtcblxuICAgICAgICAgICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmUgIT0gdGhpcykge1xuICAgICAgICAgICAgICAgIGFjdGl2ZS5oaWRlKHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaG92ZXJJZGxlKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhvdmVySWRsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignYmVmb3Jlc2hvdy51ay5kcm9wZG93bicsIFt0aGlzXSk7XG5cbiAgICAgICAgICAgIHRoaXMuY2hlY2tEaW1lbnNpb25zKCk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoJ3VrLW9wZW4nKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcblxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdzaG93LnVrLmRyb3Bkb3duJywgW3RoaXNdKTtcblxuICAgICAgICAgICAgVUkuVXRpbHMuY2hlY2tEaXNwbGF5KHRoaXMuZHJvcGRvd24sIHRydWUpO1xuICAgICAgICAgICAgVUkuVXRpbHMuZm9jdXModGhpcy5kcm9wZG93bik7XG4gICAgICAgICAgICBhY3RpdmUgPSB0aGlzO1xuXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyT3V0ZXJDbGljaygpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGhpZGU6IGZ1bmN0aW9uKGZvcmNlKSB7XG5cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignYmVmb3JlaGlkZS51ay5kcm9wZG93bicsIFt0aGlzLCBmb3JjZV0pO1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3VrLW9wZW4nKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucmVtYWluSWRsZSkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbWFpbklkbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJlbWFpbklkbGUgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcblxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdoaWRlLnVrLmRyb3Bkb3duJywgW3RoaXMsIGZvcmNlXSk7XG5cbiAgICAgICAgICAgIGlmIChhY3RpdmUgPT0gdGhpcykgYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVnaXN0ZXJPdXRlckNsaWNrOiBmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICBVSS4kaHRtbC5vZmYoJ2NsaWNrLm91dGVyLmRyb3Bkb3duJyk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICBVSS4kaHRtbC5vbignY2xpY2sub3V0ZXIuZHJvcGRvd24nLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVySWRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhvdmVySWRsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgJHRhcmdldCA9IFVJLiQoZS50YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmUgPT0gJHRoaXMgJiYgISR0aGlzLmVsZW1lbnQuZmluZChlLnRhcmdldCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy5oaWRlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgVUkuJGh0bWwub2ZmKCdjbGljay5vdXRlci5kcm9wZG93bicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCAxMCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2hlY2tEaW1lbnNpb25zOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmRyb3Bkb3duLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyByZXNldFxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5yZW1vdmVDbGFzcygndWstZHJvcGRvd24tdG9wIHVrLWRyb3Bkb3duLWJvdHRvbSB1ay1kcm9wZG93bi1sZWZ0IHVrLWRyb3Bkb3duLXJpZ2h0IHVrLWRyb3Bkb3duLXN0YWNrIHVrLWRyb3Bkb3duLWF1dG9mbGlwJykuY3NzKHtcbiAgICAgICAgICAgICAgICB0b3BMZWZ0IDonJyxcbiAgICAgICAgICAgICAgICBsZWZ0IDonJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0IDonJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5SaWdodCA6JydcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5qdXN0aWZpZWQgJiYgdGhpcy5qdXN0aWZpZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5jc3MoJ21pbi13aWR0aCcsICcnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyICR0aGlzICAgICAgICAgID0gdGhpcyxcbiAgICAgICAgICAgICAgICBwb3MgICAgICAgICAgICA9IFVJLiQuZXh0ZW5kKHt9LCB0aGlzLm9mZnNldFBhcmVudC5vZmZzZXQoKSwge3dpZHRoOiB0aGlzLm9mZnNldFBhcmVudFswXS5vZmZzZXRXaWR0aCwgaGVpZ2h0OiB0aGlzLm9mZnNldFBhcmVudFswXS5vZmZzZXRIZWlnaHR9KSxcbiAgICAgICAgICAgICAgICBwb3NvZmZzZXQgICAgICA9IHRoaXMub3B0aW9ucy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgZHJvcGRvd24gICAgICAgPSB0aGlzLmRyb3Bkb3duLFxuICAgICAgICAgICAgICAgIG9mZnNldCAgICAgICAgID0gZHJvcGRvd24uc2hvdygpLm9mZnNldCgpIHx8IHtsZWZ0OiAwLCB0b3A6IDB9LFxuICAgICAgICAgICAgICAgIHdpZHRoICAgICAgICAgID0gZHJvcGRvd24ub3V0ZXJXaWR0aCgpLFxuICAgICAgICAgICAgICAgIGhlaWdodCAgICAgICAgID0gZHJvcGRvd24ub3V0ZXJIZWlnaHQoKSxcbiAgICAgICAgICAgICAgICBib3VuZGFyeXdpZHRoICA9IHRoaXMuYm91bmRhcnkud2lkdGgoKSxcbiAgICAgICAgICAgICAgICBib3VuZGFyeW9mZnNldCA9IHRoaXMuYm91bmRhcnlbMF0gIT09IHdpbmRvdyAmJiB0aGlzLmJvdW5kYXJ5Lm9mZnNldCgpID8gdGhpcy5ib3VuZGFyeS5vZmZzZXQoKToge3RvcDowLCBsZWZ0OjB9LFxuICAgICAgICAgICAgICAgIGRwb3MgICAgICAgICAgID0gdGhpcy5vcHRpb25zLnBvcztcblxuICAgICAgICAgICAgdmFyIHZhcmlhbnRzID0gIHtcbiAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JyAgIDoge3RvcDogMCArIHBvcy5oZWlnaHQgKyBwb3NvZmZzZXQsIGxlZnQ6IDB9LFxuICAgICAgICAgICAgICAgICAgICAnYm90dG9tLXJpZ2h0JyAgOiB7dG9wOiAwICsgcG9zLmhlaWdodCArIHBvc29mZnNldCwgbGVmdDogMCArIHBvcy53aWR0aCAtIHdpZHRofSxcbiAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbS1jZW50ZXInIDoge3RvcDogMCArIHBvcy5oZWlnaHQgKyBwb3NvZmZzZXQsIGxlZnQ6IDAgKyBwb3Mud2lkdGggLyAyIC0gd2lkdGggLyAyfSxcbiAgICAgICAgICAgICAgICAgICAgJ3RvcC1sZWZ0JyAgICAgIDoge3RvcDogMCAtIGhlaWdodCAtIHBvc29mZnNldCwgbGVmdDogMH0sXG4gICAgICAgICAgICAgICAgICAgICd0b3AtcmlnaHQnICAgICA6IHt0b3A6IDAgLSBoZWlnaHQgLSBwb3NvZmZzZXQsIGxlZnQ6IDAgKyBwb3Mud2lkdGggLSB3aWR0aH0sXG4gICAgICAgICAgICAgICAgICAgICd0b3AtY2VudGVyJyAgICA6IHt0b3A6IDAgLSBoZWlnaHQgLSBwb3NvZmZzZXQsIGxlZnQ6IDAgKyBwb3Mud2lkdGggLyAyIC0gd2lkdGggLyAyfSxcbiAgICAgICAgICAgICAgICAgICAgJ2xlZnQtdG9wJyAgICAgIDoge3RvcDogMCwgbGVmdDogMCAtIHdpZHRoIC0gcG9zb2Zmc2V0fSxcbiAgICAgICAgICAgICAgICAgICAgJ2xlZnQtYm90dG9tJyAgIDoge3RvcDogMCArIHBvcy5oZWlnaHQgLSBoZWlnaHQsIGxlZnQ6IDAgLSB3aWR0aCAtIHBvc29mZnNldH0sXG4gICAgICAgICAgICAgICAgICAgICdsZWZ0LWNlbnRlcicgICA6IHt0b3A6IDAgKyBwb3MuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDIsIGxlZnQ6IDAgLSB3aWR0aCAtIHBvc29mZnNldH0sXG4gICAgICAgICAgICAgICAgICAgICdyaWdodC10b3AnICAgICA6IHt0b3A6IDAsIGxlZnQ6IDAgKyBwb3Mud2lkdGggKyBwb3NvZmZzZXR9LFxuICAgICAgICAgICAgICAgICAgICAncmlnaHQtYm90dG9tJyAgOiB7dG9wOiAwICsgcG9zLmhlaWdodCAtIGhlaWdodCwgbGVmdDogMCArIHBvcy53aWR0aCArIHBvc29mZnNldH0sXG4gICAgICAgICAgICAgICAgICAgICdyaWdodC1jZW50ZXInICA6IHt0b3A6IDAgKyBwb3MuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDIsIGxlZnQ6IDAgKyBwb3Mud2lkdGggKyBwb3NvZmZzZXR9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjc3MgPSB7fSxcbiAgICAgICAgICAgICAgICBwcDtcblxuICAgICAgICAgICAgcHAgPSBkcG9zLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBjc3MgPSB2YXJpYW50c1tkcG9zXSA/IHZhcmlhbnRzW2Rwb3NdIDogdmFyaWFudHNbJ2JvdHRvbS1sZWZ0J107XG5cbiAgICAgICAgICAgIC8vIGp1c3RpZnkgZHJvcGRvd25cbiAgICAgICAgICAgIGlmICh0aGlzLmp1c3RpZmllZCAmJiB0aGlzLmp1c3RpZmllZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBqdXN0aWZ5KGRyb3Bkb3duLmNzcyh7bGVmdDowfSksIHRoaXMuanVzdGlmaWVkLCBib3VuZGFyeXdpZHRoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByZXZlbnRmbGlwICE9PSB0cnVlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGZkcG9zO1xuXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0aGlzLmNoZWNrQm91bmRhcnkocG9zLmxlZnQgKyBjc3MubGVmdCwgcG9zLnRvcCArIGNzcy50b3AsIHdpZHRoLCBoZWlnaHQsIGJvdW5kYXJ5d2lkdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwieFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5wcmV2ZW50ZmxpcCAhPT0neCcpIGZkcG9zID0gZmxpcHNbJ3gnXVtkcG9zXSB8fCAncmlnaHQtdG9wJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLnByZXZlbnRmbGlwICE9PSd5JykgZmRwb3MgPSBmbGlwc1sneSddW2Rwb3NdIHx8ICd0b3AtbGVmdCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwieHlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5vcHRpb25zLnByZXZlbnRmbGlwKSBmZHBvcyA9IGZsaXBzWyd4eSddW2Rwb3NdIHx8ICdyaWdodC1ib3R0b20nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZkcG9zKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHBwICA9IGZkcG9zLnNwbGl0KCctJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjc3MgPSB2YXJpYW50c1tmZHBvc10gPyB2YXJpYW50c1tmZHBvc10gOiB2YXJpYW50c1snYm90dG9tLWxlZnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLmFkZENsYXNzKCd1ay1kcm9wZG93bi1hdXRvZmxpcCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmbGlwcGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja0JvdW5kYXJ5KHBvcy5sZWZ0ICsgY3NzLmxlZnQsIHBvcy50b3AgKyBjc3MudG9wLCB3aWR0aCwgaGVpZ2h0LCBib3VuZGFyeXdpZHRoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwICA9IGRwb3Muc3BsaXQoJy0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3MgPSB2YXJpYW50c1tkcG9zXSA/IHZhcmlhbnRzW2Rwb3NdIDogdmFyaWFudHNbJ2JvdHRvbS1sZWZ0J107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh3aWR0aCA+IGJvdW5kYXJ5d2lkdGgpIHtcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5hZGRDbGFzcygndWstZHJvcGRvd24tc3RhY2snKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3N0YWNrLnVrLmRyb3Bkb3duJywgW3RoaXNdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZHJvcGRvd24uY3NzKGNzcykuY3NzKCdkaXNwbGF5JywgJycpLmFkZENsYXNzKCd1ay1kcm9wZG93bi0nK3BwWzBdKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjaGVja0JvdW5kYXJ5OiBmdW5jdGlvbihsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsIGJvdW5kYXJ5d2lkdGgpIHtcblxuICAgICAgICAgICAgdmFyIGF4aXMgPSBcIlwiO1xuXG4gICAgICAgICAgICBpZiAobGVmdCA8IDAgfHwgKChsZWZ0IC0gVUkuJHdpbi5zY3JvbGxMZWZ0KCkpK3dpZHRoKSA+IGJvdW5kYXJ5d2lkdGgpIHtcbiAgICAgICAgICAgICAgIGF4aXMgKz0gXCJ4XCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgodG9wIC0gVUkuJHdpbi5zY3JvbGxUb3AoKSkgPCAwIHx8ICgodG9wIC0gVUkuJHdpbi5zY3JvbGxUb3AoKSkraGVpZ2h0KSA+IHdpbmRvdy5pbm5lckhlaWdodCkge1xuICAgICAgICAgICAgICAgYXhpcyArPSBcInlcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGF4aXM7XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgVUkuY29tcG9uZW50KCdkcm9wZG93bk92ZXJsYXknLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAganVzdGlmeSA6IGZhbHNlLFxuICAgICAgICAgICBjbHMgICAgIDogJycsXG4gICAgICAgICAgIGR1cmF0aW9uOiAyMDBcbiAgICAgICAgfSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS5yZWFkeShmdW5jdGlvbihjb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICBVSS4kKCdbZGF0YS11ay1kcm9wZG93bi1vdmVybGF5XScsIGNvbnRleHQpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ2Ryb3Bkb3duT3ZlcmxheScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBVSS5kcm9wZG93bk92ZXJsYXkoZWxlLCBVSS5VdGlscy5vcHRpb25zKGVsZS5hdHRyKCdkYXRhLXVrLWRyb3Bkb3duLW92ZXJsYXknKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5qdXN0aWZpZWQgPSB0aGlzLm9wdGlvbnMuanVzdGlmeSA/IFVJLiQodGhpcy5vcHRpb25zLmp1c3RpZnkpIDogZmFsc2U7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXkgICA9IHRoaXMuZWxlbWVudC5maW5kKCd1ay1kcm9wZG93bi1vdmVybGF5Jyk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5vdmVybGF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheSA9IFVJLiQoJzxkaXYgY2xhc3M9XCJ1ay1kcm9wZG93bi1vdmVybGF5XCI+PC9kaXY+JykuYXBwZW5kVG8odGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5vdmVybGF5LmFkZENsYXNzKHRoaXMub3B0aW9ucy5jbHMpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKHtcblxuICAgICAgICAgICAgICAgICdiZWZvcmVzaG93LnVrLmRyb3Bkb3duJzogZnVuY3Rpb24oZSwgZHJvcGRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMuZHJvcGRvd24gPSBkcm9wZG93bjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMuanVzdGlmaWVkICYmICR0aGlzLmp1c3RpZmllZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnkoJHRoaXMub3ZlcmxheS5jc3Moe2Rpc3BsYXk6J2Jsb2NrJywgbWFyZ2luTGVmdDonJywgbWFyZ2luUmlnaHQ6Jyd9KSwgJHRoaXMuanVzdGlmaWVkLCAkdGhpcy5qdXN0aWZpZWQub3V0ZXJXaWR0aCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAnc2hvdy51ay5kcm9wZG93bic6IGZ1bmN0aW9uKGUsIGRyb3Bkb3duKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGggPSAkdGhpcy5kcm9wZG93bi5kcm9wZG93bi5vdXRlckhlaWdodCh0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAkdGhpcy5kcm9wZG93bi5lbGVtZW50LnJlbW92ZUNsYXNzKCd1ay1vcGVuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgJHRoaXMub3ZlcmxheS5zdG9wKCkuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJykuYW5pbWF0ZSh7aGVpZ2h0OiBofSwgJHRoaXMub3B0aW9ucy5kdXJhdGlvbiwgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuZHJvcGRvd24uZHJvcGRvd24uY3NzKCd2aXNpYmlsaXR5JywgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy5kcm9wZG93bi5lbGVtZW50LmFkZENsYXNzKCd1ay1vcGVuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgVUkuVXRpbHMuY2hlY2tEaXNwbGF5KCR0aGlzLmRyb3Bkb3duLmRyb3Bkb3duLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgJHRoaXMucG9pbnRlcmxlYXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICdoaWRlLnVrLmRyb3Bkb3duJzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICR0aGlzLm92ZXJsYXkuc3RvcCgpLmFuaW1hdGUoe2hlaWdodDogMH0sICR0aGlzLm9wdGlvbnMuZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAncG9pbnRlcmVudGVyLnVrLmRyb3Bkb3duJzogZnVuY3Rpb24oZSwgZHJvcGRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KCR0aGlzLnJlbWFpbklkbGUpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAncG9pbnRlcmxlYXZlLnVrLmRyb3Bkb3duJzogZnVuY3Rpb24oZSwgZHJvcGRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMucG9pbnRlcmxlYXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICB0aGlzLm92ZXJsYXkub24oe1xuXG4gICAgICAgICAgICAgICAgJ21vdXNlZW50ZXInOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLnJlbWFpbklkbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCgkdGhpcy5kcm9wZG93bi5yZW1haW5JZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCgkdGhpcy5yZW1haW5JZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAnbW91c2VsZWF2ZSc6IGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLnBvaW50ZXJsZWF2ZSAmJiBhY3RpdmUpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMucmVtYWluSWRsZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhY3RpdmUpIGFjdGl2ZS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBhY3RpdmUub3B0aW9ucy5yZW1haW50aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgIH0pO1xuXG5cbiAgICBmdW5jdGlvbiBqdXN0aWZ5KGVsZSwganVzdGlmeVRvLCBib3VuZGFyeXdpZHRoLCBvZmZzZXQpIHtcblxuICAgICAgICBlbGUgICAgICAgICAgID0gVUkuJChlbGUpO1xuICAgICAgICBqdXN0aWZ5VG8gICAgID0gVUkuJChqdXN0aWZ5VG8pO1xuICAgICAgICBib3VuZGFyeXdpZHRoID0gYm91bmRhcnl3aWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgb2Zmc2V0ICAgICAgICA9IG9mZnNldCB8fCBlbGUub2Zmc2V0KCk7XG5cbiAgICAgICAgaWYgKGp1c3RpZnlUby5sZW5ndGgpIHtcblxuICAgICAgICAgICAgdmFyIGp3aWR0aCA9IGp1c3RpZnlUby5vdXRlcldpZHRoKCk7XG5cbiAgICAgICAgICAgIGVsZS5jc3MoJ21pbi13aWR0aCcsIGp3aWR0aCk7XG5cbiAgICAgICAgICAgIGlmIChVSS5sYW5nZGlyZWN0aW9uID09ICdyaWdodCcpIHtcblxuICAgICAgICAgICAgICAgIHZhciByaWdodDEgICA9IGJvdW5kYXJ5d2lkdGggLSAoanVzdGlmeVRvLm9mZnNldCgpLmxlZnQgKyBqd2lkdGgpLFxuICAgICAgICAgICAgICAgICAgICByaWdodDIgICA9IGJvdW5kYXJ5d2lkdGggLSAoZWxlLm9mZnNldCgpLmxlZnQgKyBlbGUub3V0ZXJXaWR0aCgpKTtcblxuICAgICAgICAgICAgICAgIGVsZS5jc3MoJ21hcmdpbi1yaWdodCcsIHJpZ2h0MSAtIHJpZ2h0Mik7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlLmNzcygnbWFyZ2luLWxlZnQnLCBqdXN0aWZ5VG8ub2Zmc2V0KCkubGVmdCAtIG9mZnNldC5sZWZ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBncmlkcyA9IFtdO1xuXG4gICAgVUkuY29tcG9uZW50KCdncmlkTWF0Y2hIZWlnaHQnLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHRhcmdldCAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHJvdyAgICAgICAgICAgOiB0cnVlLFxuICAgICAgICAgICAgaWdub3Jlc3RhY2tlZCA6IGZhbHNlLFxuICAgICAgICAgICAgb2JzZXJ2ZSAgICAgICA6IGZhbHNlXG4gICAgICAgIH0sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICAgICAgVUkucmVhZHkoZnVuY3Rpb24oY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgVUkuJCgnW2RhdGEtdWstZ3JpZC1tYXRjaF0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZ3JpZCA9IFVJLiQodGhpcyksIG9iajtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWdyaWQuZGF0YSgnZ3JpZE1hdGNoSGVpZ2h0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IFVJLmdyaWRNYXRjaEhlaWdodChncmlkLCBVSS5VdGlscy5vcHRpb25zKGdyaWQuYXR0cignZGF0YS11ay1ncmlkLW1hdGNoJykpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyAgPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW4oKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMgPSB0aGlzLm9wdGlvbnMudGFyZ2V0ID8gdGhpcy5maW5kKHRoaXMub3B0aW9ucy50YXJnZXQpIDogdGhpcy5jb2x1bW5zO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29sdW1ucy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgICAgVUkuJHdpbi5vbignbG9hZCByZXNpemUgb3JpZW50YXRpb25jaGFuZ2UnLCAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLmVsZW1lbnQuaXMoJzp2aXNpYmxlJykpICR0aGlzLm1hdGNoKCk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIFVJLiQoZnVuY3Rpb24oKSB7IGZuKCk7IH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFVJLlV0aWxzLmRlYm91bmNlKGZuLCA1MCk7XG4gICAgICAgICAgICB9KSgpKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vYnNlcnZlKSB7XG5cbiAgICAgICAgICAgICAgICBVSS5kb21PYnNlcnZlKHRoaXMuZWxlbWVudCwgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMuZWxlbWVudC5pcygnOnZpc2libGUnKSkgJHRoaXMubWF0Y2goKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5vbignZGlzcGxheS51ay5jaGVjaycsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHRoaXMubWF0Y2goKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgICAgIGdyaWRzLnB1c2godGhpcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbWF0Y2g6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgZmlyc3R2aXNpYmxlID0gdGhpcy5jb2x1bW5zLmZpbHRlcignOnZpc2libGU6Zmlyc3QnKTtcblxuICAgICAgICAgICAgaWYgKCFmaXJzdHZpc2libGUubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgICAgIHZhciBzdGFja2VkID0gTWF0aC5jZWlsKDEwMCAqIHBhcnNlRmxvYXQoZmlyc3R2aXNpYmxlLmNzcygnd2lkdGgnKSkgLyBwYXJzZUZsb2F0KGZpcnN0dmlzaWJsZS5wYXJlbnQoKS5jc3MoJ3dpZHRoJykpKSA+PSAxMDA7XG5cbiAgICAgICAgICAgIGlmIChzdGFja2VkICYmICF0aGlzLm9wdGlvbnMuaWdub3Jlc3RhY2tlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJ0KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIFVJLlV0aWxzLm1hdGNoSGVpZ2h0cyh0aGlzLmVsZW1lbnRzLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICByZXZlcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5jc3MoJ21pbi1oZWlnaHQnLCAnJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgVUkuY29tcG9uZW50KCdncmlkTWFyZ2luJywge1xuXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBjbHMgICAgICA6ICd1ay1ncmlkLW1hcmdpbicsXG4gICAgICAgICAgICByb3dmaXJzdCA6ICd1ay1yb3ctZmlyc3QnXG4gICAgICAgIH0sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICAgICAgVUkucmVhZHkoZnVuY3Rpb24oY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgVUkuJCgnW2RhdGEtdWstZ3JpZC1tYXJnaW5dJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdyaWQgPSBVSS4kKHRoaXMpLCBvYmo7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFncmlkLmRhdGEoJ2dyaWRNYXJnaW4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gVUkuZ3JpZE1hcmdpbihncmlkLCBVSS5VdGlscy5vcHRpb25zKGdyaWQuYXR0cignZGF0YS11ay1ncmlkLW1hcmdpbicpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgc3RhY2tNYXJnaW4gPSBVSS5zdGFja01hcmdpbih0aGlzLmVsZW1lbnQsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBhY3RpdmUgPSBmYWxzZSwgYWN0aXZlQ291bnQgPSAwLCAkaHRtbCA9IFVJLiRodG1sLCBib2R5O1xuXG4gICAgVUkuJHdpbi5vbigncmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgVUkuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24oKXtcbiAgICAgICAgVUkuJCgnLnVrLW1vZGFsLnVrLW9wZW4nKS5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICByZXR1cm4gVUkuJCh0aGlzKS5kYXRhKCdtb2RhbCcpICYmIFVJLiQodGhpcykuZGF0YSgnbW9kYWwnKS5yZXNpemUoKTtcbiAgICAgICAgfSk7XG4gICAgfSwgMTUwKSk7XG5cbiAgICBVSS5jb21wb25lbnQoJ21vZGFsJywge1xuXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICAgICAgICAgIGJnY2xvc2U6IHRydWUsXG4gICAgICAgICAgICBtaW5TY3JvbGxIZWlnaHQ6IDE1MCxcbiAgICAgICAgICAgIGNlbnRlcjogZmFsc2UsXG4gICAgICAgICAgICBtb2RhbDogdHJ1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIHNjcm9sbGFibGU6IGZhbHNlLFxuICAgICAgICB0cmFuc2l0aW9uOiBmYWxzZSxcbiAgICAgICAgaGFzVHJhbnNpdGlvbmVkOiB0cnVlLFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICBpZiAoIWJvZHkpIGJvZHkgPSBVSS4kKCdib2R5Jyk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5lbGVtZW50Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICB0aGlzLnBhZGRpbmdkaXIgPSAncGFkZGluZy0nICsgKFVJLmxhbmdkaXJlY3Rpb24gPT0gJ2xlZnQnID8gJ3JpZ2h0JzonbGVmdCcpO1xuICAgICAgICAgICAgdGhpcy5kaWFsb2cgICAgID0gdGhpcy5maW5kKCcudWstbW9kYWwtZGlhbG9nJyk7XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlICAgICA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgQVJJQVxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmF0dHIoJ2FyaWEtaGlkZGVuJywgdGhpcy5lbGVtZW50Lmhhc0NsYXNzKCd1ay1vcGVuJykpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdjbGljaycsICcudWstbW9kYWwtY2xvc2UnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICR0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgIH0pLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBVSS4kKGUudGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRbMF0gPT0gJHRoaXMuZWxlbWVudFswXSAmJiAkdGhpcy5vcHRpb25zLmJnY2xvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBVSS5kb21PYnNlcnZlKHRoaXMuZWxlbWVudCwgZnVuY3Rpb24oZSkgeyAkdGhpcy5yZXNpemUoKTsgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9nZ2xlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW3RoaXMuaXNBY3RpdmUoKSA/ICdoaWRlJyA6ICdzaG93J10oKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzaG93OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tb2RhbCAmJiBhY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmUuaGlkZSh0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCd1ay1vcGVuJykuc2hvdygpO1xuICAgICAgICAgICAgdGhpcy5yZXNpemUodHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubW9kYWwpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmUgPSB0aGlzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgICAgIGFjdGl2ZUNvdW50Kys7XG5cbiAgICAgICAgICAgIGlmIChVSS5zdXBwb3J0LnRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc1RyYW5zaXRpb25lZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5vbmUoVUkuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMuaGFzVHJhbnNpdGlvbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgVUkuVXRpbHMuZm9jdXMoJHRoaXMuZGlhbG9nLCAnYVtocmVmXScpO1xuICAgICAgICAgICAgICAgIH0pLmFkZENsYXNzKCd1ay1vcGVuJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcygndWstb3BlbicpO1xuICAgICAgICAgICAgICAgIFVJLlV0aWxzLmZvY3VzKHRoaXMuZGlhbG9nLCAnYVtocmVmXScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkaHRtbC5hZGRDbGFzcygndWstbW9kYWwtcGFnZScpLmhlaWdodCgpOyAvLyBmb3JjZSBicm93c2VyIGVuZ2luZSByZWRyYXdcblxuICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQudHJpZ2dlcignc2hvdy51ay5tb2RhbCcpO1xuXG4gICAgICAgICAgICBVSS5VdGlscy5jaGVja0Rpc3BsYXkodGhpcy5kaWFsb2csIHRydWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICBoaWRlOiBmdW5jdGlvbihmb3JjZSkge1xuXG4gICAgICAgICAgICBpZiAoIWZvcmNlICYmIFVJLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLmhhc1RyYW5zaXRpb25lZCkge1xuXG4gICAgICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgICAgIHRoaXMub25lKFVJLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAkdGhpcy5faGlkZSgpO1xuICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCd1ay1vcGVuJyk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9oaWRlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZm9yY2UpIHtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKCkgJiYgIWZvcmNlKSByZXR1cm47XG5cbiAgICAgICAgICAgIHZhciBib2R5d2lkdGggID0gYm9keS53aWR0aCgpO1xuXG4gICAgICAgICAgICB0aGlzLnNjcm9sbGJhcndpZHRoID0gd2luZG93LmlubmVyV2lkdGggLSBib2R5d2lkdGg7XG5cbiAgICAgICAgICAgIGJvZHkuY3NzKHRoaXMucGFkZGluZ2RpciwgdGhpcy5zY3JvbGxiYXJ3aWR0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jc3MoJ292ZXJmbG93LXknLCB0aGlzLnNjcm9sbGJhcndpZHRoID8gJ3Njcm9sbCcgOiAnYXV0bycpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMudXBkYXRlU2Nyb2xsYWJsZSgpICYmIHRoaXMub3B0aW9ucy5jZW50ZXIpIHtcblxuICAgICAgICAgICAgICAgIHZhciBkaCAgPSB0aGlzLmRpYWxvZy5vdXRlckhlaWdodCgpLFxuICAgICAgICAgICAgICAgIHBhZCA9IHBhcnNlSW50KHRoaXMuZGlhbG9nLmNzcygnbWFyZ2luLXRvcCcpLCAxMCkgKyBwYXJzZUludCh0aGlzLmRpYWxvZy5jc3MoJ21hcmdpbi1ib3R0b20nKSwgMTApO1xuXG4gICAgICAgICAgICAgICAgaWYgKChkaCArIHBhZCkgPCB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2cuY3NzKHt0b3A6ICh3aW5kb3cuaW5uZXJIZWlnaHQvMiAtIGRoLzIpIC0gcGFkIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nLmNzcyh7dG9wOiAnJ30pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGVTY3JvbGxhYmxlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaGFzIHNjcm9sbGFibGU/XG4gICAgICAgICAgICB2YXIgc2Nyb2xsYWJsZSA9IHRoaXMuZGlhbG9nLmZpbmQoJy51ay1vdmVyZmxvdy1jb250YWluZXI6dmlzaWJsZTpmaXJzdCcpO1xuXG4gICAgICAgICAgICBpZiAoc2Nyb2xsYWJsZS5sZW5ndGgpIHtcblxuICAgICAgICAgICAgICAgIHNjcm9sbGFibGUuY3NzKCdoZWlnaHQnLCAwKTtcblxuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBNYXRoLmFicyhwYXJzZUludCh0aGlzLmRpYWxvZy5jc3MoJ21hcmdpbi10b3AnKSwgMTApKSxcbiAgICAgICAgICAgICAgICBkaCAgICAgPSB0aGlzLmRpYWxvZy5vdXRlckhlaWdodCgpLFxuICAgICAgICAgICAgICAgIHdoICAgICA9IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgICAgICAgICAgICBoICAgICAgPSB3aCAtIDIqKG9mZnNldCA8IDIwID8gMjA6b2Zmc2V0KSAtIGRoO1xuXG4gICAgICAgICAgICAgICAgc2Nyb2xsYWJsZS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IChoIDwgdGhpcy5vcHRpb25zLm1pblNjcm9sbEhlaWdodCA/ICcnOmgpLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6JydcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2hpZGU6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGFjdGl2ZUNvdW50ID4gMCkgYWN0aXZlQ291bnQtLTtcbiAgICAgICAgICAgIGVsc2UgYWN0aXZlQ291bnQgPSAwO1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuaGlkZSgpLnJlbW92ZUNsYXNzKCd1ay1vcGVuJyk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXG4gICAgICAgICAgICBpZiAoIWFjdGl2ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgJGh0bWwucmVtb3ZlQ2xhc3MoJ3VrLW1vZGFsLXBhZ2UnKTtcbiAgICAgICAgICAgICAgICBib2R5LmNzcyh0aGlzLnBhZGRpbmdkaXIsIFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWN0aXZlPT09dGhpcykgYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignaGlkZS51ay5tb2RhbCcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzQWN0aXZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuaGFzQ2xhc3MoJ3VrLW9wZW4nKTtcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbiAgICBVSS5jb21wb25lbnQoJ21vZGFsVHJpZ2dlcicsIHtcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS4kaHRtbC5vbignY2xpY2subW9kYWwudWlraXQnLCAnW2RhdGEtdWstbW9kYWxdJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWxlLmlzKCdhJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ21vZGFsVHJpZ2dlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2RhbCA9IFVJLm1vZGFsVHJpZ2dlcihlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstbW9kYWwnKSkpO1xuICAgICAgICAgICAgICAgICAgICBtb2RhbC5zaG93KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gY2xvc2UgbW9kYWwgb24gZXNjIGJ1dHRvblxuICAgICAgICAgICAgVUkuJGh0bWwub24oJ2tleWRvd24ubW9kYWwudWlraXQnLCBmdW5jdGlvbiAoZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSAmJiBlLmtleUNvZGUgPT09IDI3ICYmIGFjdGl2ZS5vcHRpb25zLmtleWJvYXJkKSB7IC8vIEVTQ1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IFVJLiQuZXh0ZW5kKHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6ICR0aGlzLmVsZW1lbnQuaXMoJ2EnKSA/ICR0aGlzLmVsZW1lbnQuYXR0cignaHJlZicpIDogZmFsc2VcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgICAgIHRoaXMubW9kYWwgPSBVSS5tb2RhbCh0aGlzLm9wdGlvbnMudGFyZ2V0LCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAkdGhpcy5zaG93KCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy9tZXRob2RzXG4gICAgICAgICAgICB0aGlzLnByb3h5KHRoaXMubW9kYWwsICdzaG93IGhpZGUgaXNBY3RpdmUnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgVUkubW9kYWwuZGlhbG9nID0gZnVuY3Rpb24oY29udGVudCwgb3B0aW9ucykge1xuXG4gICAgICAgIHZhciBtb2RhbCA9IFVJLm1vZGFsKFVJLiQoVUkubW9kYWwuZGlhbG9nLnRlbXBsYXRlKS5hcHBlbmRUbygnYm9keScpLCBvcHRpb25zKTtcblxuICAgICAgICBtb2RhbC5vbignaGlkZS51ay5tb2RhbCcsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBpZiAobW9kYWwucGVyc2lzdCkge1xuICAgICAgICAgICAgICAgIG1vZGFsLnBlcnNpc3QuYXBwZW5kVG8obW9kYWwucGVyc2lzdC5kYXRhKCdtb2RhbFBlcnNpc3RQYXJlbnQnKSk7XG4gICAgICAgICAgICAgICAgbW9kYWwucGVyc2lzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbW9kYWwuZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2V0Q29udGVudChjb250ZW50LCBtb2RhbCk7XG5cbiAgICAgICAgcmV0dXJuIG1vZGFsO1xuICAgIH07XG5cbiAgICBVSS5tb2RhbC5kaWFsb2cudGVtcGxhdGUgPSAnPGRpdiBjbGFzcz1cInVrLW1vZGFsXCI+PGRpdiBjbGFzcz1cInVrLW1vZGFsLWRpYWxvZ1wiIHN0eWxlPVwibWluLWhlaWdodDowO1wiPjwvZGl2PjwvZGl2Pic7XG5cbiAgICBVSS5tb2RhbC5hbGVydCA9IGZ1bmN0aW9uKGNvbnRlbnQsIG9wdGlvbnMpIHtcblxuICAgICAgICBvcHRpb25zID0gVUkuJC5leHRlbmQodHJ1ZSwge2JnY2xvc2U6ZmFsc2UsIGtleWJvYXJkOmZhbHNlLCBtb2RhbDpmYWxzZSwgbGFiZWxzOlVJLm1vZGFsLmxhYmVsc30sIG9wdGlvbnMpO1xuXG4gICAgICAgIHZhciBtb2RhbCA9IFVJLm1vZGFsLmRpYWxvZygoW1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ1ay1tYXJnaW4gdWstbW9kYWwtY29udGVudFwiPicrU3RyaW5nKGNvbnRlbnQpKyc8L2Rpdj4nLFxuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ1ay1tb2RhbC1mb290ZXIgdWstdGV4dC1yaWdodFwiPjxidXR0b24gY2xhc3M9XCJ1ay1idXR0b24gdWstYnV0dG9uLXByaW1hcnkgdWstbW9kYWwtY2xvc2VcIj4nK29wdGlvbnMubGFiZWxzLk9rKyc8L2J1dHRvbj48L2Rpdj4nXG4gICAgICAgIF0pLmpvaW4oXCJcIiksIG9wdGlvbnMpO1xuXG4gICAgICAgIG1vZGFsLm9uKCdzaG93LnVrLm1vZGFsJywgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBtb2RhbC5lbGVtZW50LmZpbmQoJ2J1dHRvbjpmaXJzdCcpLmZvY3VzKCk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtb2RhbC5zaG93KCk7XG4gICAgfTtcblxuICAgIFVJLm1vZGFsLmNvbmZpcm0gPSBmdW5jdGlvbihjb250ZW50LCBvbmNvbmZpcm0sIG9uY2FuY2VsKSB7XG5cbiAgICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXSA/IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdIDoge307XG5cbiAgICAgICAgb25jb25maXJtID0gVUkuJC5pc0Z1bmN0aW9uKG9uY29uZmlybSkgPyBvbmNvbmZpcm0gOiBmdW5jdGlvbigpe307XG4gICAgICAgIG9uY2FuY2VsICA9IFVJLiQuaXNGdW5jdGlvbihvbmNhbmNlbCkgPyBvbmNhbmNlbCA6IGZ1bmN0aW9uKCl7fTtcbiAgICAgICAgb3B0aW9ucyAgID0gVUkuJC5leHRlbmQodHJ1ZSwge2JnY2xvc2U6ZmFsc2UsIGtleWJvYXJkOmZhbHNlLCBtb2RhbDpmYWxzZSwgbGFiZWxzOlVJLm1vZGFsLmxhYmVsc30sIFVJLiQuaXNGdW5jdGlvbihvcHRpb25zKSA/IHt9Om9wdGlvbnMpO1xuXG4gICAgICAgIHZhciBtb2RhbCA9IFVJLm1vZGFsLmRpYWxvZygoW1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ1ay1tYXJnaW4gdWstbW9kYWwtY29udGVudFwiPicrU3RyaW5nKGNvbnRlbnQpKyc8L2Rpdj4nLFxuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ1ay1tb2RhbC1mb290ZXIgdWstdGV4dC1yaWdodFwiPjxidXR0b24gY2xhc3M9XCJ1ay1idXR0b24ganMtbW9kYWwtY29uZmlybS1jYW5jZWxcIj4nK29wdGlvbnMubGFiZWxzLkNhbmNlbCsnPC9idXR0b24+IDxidXR0b24gY2xhc3M9XCJ1ay1idXR0b24gdWstYnV0dG9uLXByaW1hcnkganMtbW9kYWwtY29uZmlybVwiPicrb3B0aW9ucy5sYWJlbHMuT2srJzwvYnV0dG9uPjwvZGl2PidcbiAgICAgICAgXSkuam9pbihcIlwiKSwgb3B0aW9ucyk7XG5cbiAgICAgICAgbW9kYWwuZWxlbWVudC5maW5kKFwiLmpzLW1vZGFsLWNvbmZpcm0sIC5qcy1tb2RhbC1jb25maXJtLWNhbmNlbFwiKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBVSS4kKHRoaXMpLmlzKCcuanMtbW9kYWwtY29uZmlybScpID8gb25jb25maXJtKCkgOiBvbmNhbmNlbCgpO1xuICAgICAgICAgICAgbW9kYWwuaGlkZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBtb2RhbC5vbignc2hvdy51ay5tb2RhbCcsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgbW9kYWwuZWxlbWVudC5maW5kKCcuanMtbW9kYWwtY29uZmlybScpLmZvY3VzKCk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtb2RhbC5zaG93KCk7XG4gICAgfTtcblxuICAgIFVJLm1vZGFsLnByb21wdCA9IGZ1bmN0aW9uKHRleHQsIHZhbHVlLCBvbnN1Ym1pdCwgb3B0aW9ucykge1xuXG4gICAgICAgIG9uc3VibWl0ID0gVUkuJC5pc0Z1bmN0aW9uKG9uc3VibWl0KSA/IG9uc3VibWl0IDogZnVuY3Rpb24odmFsdWUpe307XG4gICAgICAgIG9wdGlvbnMgID0gVUkuJC5leHRlbmQodHJ1ZSwge2JnY2xvc2U6ZmFsc2UsIGtleWJvYXJkOmZhbHNlLCBtb2RhbDpmYWxzZSwgbGFiZWxzOlVJLm1vZGFsLmxhYmVsc30sIG9wdGlvbnMpO1xuXG4gICAgICAgIHZhciBtb2RhbCA9IFVJLm1vZGFsLmRpYWxvZygoW1xuICAgICAgICAgICAgdGV4dCA/ICc8ZGl2IGNsYXNzPVwidWstbW9kYWwtY29udGVudCB1ay1mb3JtXCI+JytTdHJpbmcodGV4dCkrJzwvZGl2Pic6JycsXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInVrLW1hcmdpbi1zbWFsbC10b3AgdWstbW9kYWwtY29udGVudCB1ay1mb3JtXCI+PHA+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJ1ay13aWR0aC0xLTFcIj48L3A+PC9kaXY+JyxcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidWstbW9kYWwtZm9vdGVyIHVrLXRleHQtcmlnaHRcIj48YnV0dG9uIGNsYXNzPVwidWstYnV0dG9uIHVrLW1vZGFsLWNsb3NlXCI+JytvcHRpb25zLmxhYmVscy5DYW5jZWwrJzwvYnV0dG9uPiA8YnV0dG9uIGNsYXNzPVwidWstYnV0dG9uIHVrLWJ1dHRvbi1wcmltYXJ5IGpzLW1vZGFsLW9rXCI+JytvcHRpb25zLmxhYmVscy5PaysnPC9idXR0b24+PC9kaXY+J1xuICAgICAgICBdKS5qb2luKFwiXCIpLCBvcHRpb25zKSxcblxuICAgICAgICBpbnB1dCA9IG1vZGFsLmVsZW1lbnQuZmluZChcImlucHV0W3R5cGU9J3RleHQnXVwiKS52YWwodmFsdWUgfHwgJycpLm9uKCdrZXl1cCcsIGZ1bmN0aW9uKGUpe1xuICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMykge1xuICAgICAgICAgICAgICAgIG1vZGFsLmVsZW1lbnQuZmluZCgnLmpzLW1vZGFsLW9rJykudHJpZ2dlcignY2xpY2snKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbW9kYWwuZWxlbWVudC5maW5kKCcuanMtbW9kYWwtb2snKS5vbignY2xpY2snLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYgKG9uc3VibWl0KGlucHV0LnZhbCgpKSE9PWZhbHNlKXtcbiAgICAgICAgICAgICAgICBtb2RhbC5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtb2RhbC5zaG93KCk7XG4gICAgfTtcblxuICAgIFVJLm1vZGFsLmJsb2NrVUkgPSBmdW5jdGlvbihjb250ZW50LCBvcHRpb25zKSB7XG5cbiAgICAgICAgdmFyIG1vZGFsID0gVUkubW9kYWwuZGlhbG9nKChbXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInVrLW1hcmdpbiB1ay1tb2RhbC1jb250ZW50XCI+JytTdHJpbmcoY29udGVudCB8fCAnPGRpdiBjbGFzcz1cInVrLXRleHQtY2VudGVyXCI+Li4uPC9kaXY+JykrJzwvZGl2PidcbiAgICAgICAgXSkuam9pbihcIlwiKSwgVUkuJC5leHRlbmQoe2JnY2xvc2U6ZmFsc2UsIGtleWJvYXJkOmZhbHNlLCBtb2RhbDpmYWxzZX0sIG9wdGlvbnMpKTtcblxuICAgICAgICBtb2RhbC5jb250ZW50ID0gbW9kYWwuZWxlbWVudC5maW5kKCcudWstbW9kYWwtY29udGVudDpmaXJzdCcpO1xuXG4gICAgICAgIHJldHVybiBtb2RhbC5zaG93KCk7XG4gICAgfTtcblxuICAgIFVJLm1vZGFsLmxhYmVscyA9IHtcbiAgICAgICAgT2s6ICdPaycsXG4gICAgICAgIENhbmNlbDogJ0NhbmNlbCdcbiAgICB9O1xuXG4gICAgLy8gaGVscGVyIGZ1bmN0aW9uc1xuICAgIGZ1bmN0aW9uIHNldENvbnRlbnQoY29udGVudCwgbW9kYWwpe1xuXG4gICAgICAgIGlmKCFtb2RhbCkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ29iamVjdCcpIHtcblxuICAgICAgICAgICAgLy8gY29udmVydCBET00gb2JqZWN0IHRvIGEgalF1ZXJ5IG9iamVjdFxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZW50IDogVUkuJChjb250ZW50KTtcblxuICAgICAgICAgICAgaWYoY29udGVudC5wYXJlbnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBtb2RhbC5wZXJzaXN0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBtb2RhbC5wZXJzaXN0LmRhdGEoJ21vZGFsUGVyc2lzdFBhcmVudCcsIGNvbnRlbnQucGFyZW50KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZSBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjb250ZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIC8vIGp1c3QgaW5zZXJ0IHRoZSBkYXRhIGFzIGlubmVySFRNTFxuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBVSS4kKCc8ZGl2PjwvZGl2PicpLmh0bWwoY29udGVudCk7XG4gICAgICAgIH1lbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBkYXRhIHR5cGUhXG4gICAgICAgICAgICAgICAgY29udGVudCA9IFVJLiQoJzxkaXY+PC9kaXY+JykuaHRtbCgnVUlraXQyLm1vZGFsIEVycm9yOiBVbnN1cHBvcnRlZCBkYXRhIHR5cGU6ICcgKyB0eXBlb2YgY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZW50LmFwcGVuZFRvKG1vZGFsLmVsZW1lbnQuZmluZCgnLnVrLW1vZGFsLWRpYWxvZycpKTtcblxuICAgICAgICByZXR1cm4gbW9kYWw7XG4gICAgfVxuXG59KShVSWtpdDIpO1xuXG4oZnVuY3Rpb24oVUkpIHtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgVUkuY29tcG9uZW50KCduYXYnLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHRvZ2dsZTogJz5saS51ay1wYXJlbnQgPiBhW2hyZWY9XCIjXCJdJyxcbiAgICAgICAgICAgIGxpc3RzOiAnPmxpLnVrLXBhcmVudCA+IHVsJyxcbiAgICAgICAgICAgIG11bHRpcGxlOiBmYWxzZVxuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIFVJLiQoJ1tkYXRhLXVrLW5hdl0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmF2ID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5hdi5kYXRhKCduYXYnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IFVJLm5hdihuYXYsIFVJLlV0aWxzLm9wdGlvbnMobmF2LmF0dHIoJ2RhdGEtdWstbmF2JykpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrLnVrLm5hdicsIHRoaXMub3B0aW9ucy50b2dnbGUsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG4gICAgICAgICAgICAgICAgJHRoaXMub3BlbihlbGUucGFyZW50KClbMF0gPT0gJHRoaXMuZWxlbWVudFswXSA/IGVsZSA6IGVsZS5wYXJlbnQoXCJsaVwiKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcblxuICAgICAgICAgICAgVUkuZG9tT2JzZXJ2ZSh0aGlzLmVsZW1lbnQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoJHRoaXMuZWxlbWVudC5maW5kKCR0aGlzLm9wdGlvbnMubGlzdHMpLm5vdCgnW3JvbGVdJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMuZmluZCh0aGlzLm9wdGlvbnMubGlzdHMpLmVhY2goZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgJGVsZSAgID0gVUkuJCh0aGlzKS5hdHRyKCdyb2xlJywgJ21lbnUnKSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gJGVsZS5jbG9zZXN0KCdsaScpLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmUgPSBwYXJlbnQuaGFzQ2xhc3MoXCJ1ay1hY3RpdmVcIik7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudC5kYXRhKCdsaXN0LWNvbnRhaW5lcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICRlbGUud3JhcCgnPGRpdiBzdHlsZT1cIm92ZXJmbG93OmhpZGRlbjtoZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZTtcIj48L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmRhdGEoJ2xpc3QtY29udGFpbmVyJywgJGVsZS5wYXJlbnQoKVthY3RpdmUgPyAncmVtb3ZlQ2xhc3MnOidhZGRDbGFzcyddKCd1ay1oaWRkZW4nKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSW5pdCBBUklBXG4gICAgICAgICAgICAgICAgcGFyZW50LmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBwYXJlbnQuaGFzQ2xhc3MoXCJ1ay1vcGVuXCIpKTtcblxuICAgICAgICAgICAgICAgIGlmIChhY3RpdmUpICR0aGlzLm9wZW4ocGFyZW50LCB0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIG9wZW46IGZ1bmN0aW9uKGxpLCBub2FuaW1hdGlvbikge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzLCBlbGVtZW50ID0gdGhpcy5lbGVtZW50LCAkbGkgPSBVSS4kKGxpKSwgJGNvbnRhaW5lciA9ICRsaS5kYXRhKCdsaXN0LWNvbnRhaW5lcicpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5tdWx0aXBsZSkge1xuXG4gICAgICAgICAgICAgICAgZWxlbWVudC5jaGlsZHJlbignLnVrLW9wZW4nKS5ub3QobGkpLmVhY2goZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZS5kYXRhKCdsaXN0LWNvbnRhaW5lcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGUuZGF0YSgnbGlzdC1jb250YWluZXInKS5zdG9wKCkuYW5pbWF0ZSh7aGVpZ2h0OiAwfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUkuJCh0aGlzKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygndWstb3BlbicpLmVuZCgpLmFkZENsYXNzKCd1ay1oaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICRsaS50b2dnbGVDbGFzcygndWstb3BlbicpO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgQVJJQVxuICAgICAgICAgICAgJGxpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAkbGkuaGFzQ2xhc3MoJ3VrLW9wZW4nKSk7XG5cbiAgICAgICAgICAgIGlmICgkY29udGFpbmVyKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoJGxpLmhhc0NsYXNzKCd1ay1vcGVuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci5yZW1vdmVDbGFzcygndWstaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5vYW5pbWF0aW9uKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci5zdG9wKCkuaGVpZ2h0KCRsaS5oYXNDbGFzcygndWstb3BlbicpID8gJ2F1dG8nIDogMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkbGkuaGFzQ2xhc3MoJ3VrLW9wZW4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci5hZGRDbGFzcygndWstaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Rpc3BsYXkudWsuY2hlY2snKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci5zdG9wKCkuYW5pbWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICgkbGkuaGFzQ2xhc3MoJ3VrLW9wZW4nKSA/IGdldEhlaWdodCgkY29udGFpbmVyLmZpbmQoJ3VsOmZpcnN0JykpIDogMClcbiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJGxpLmhhc0NsYXNzKCd1ay1vcGVuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29udGFpbmVyLmFkZENsYXNzKCd1ay1oaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci5jc3MoJ2hlaWdodCcsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMudHJpZ2dlcignZGlzcGxheS51ay5jaGVjaycpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgLy8gaGVscGVyXG5cbiAgICBmdW5jdGlvbiBnZXRIZWlnaHQoZWxlKSB7XG5cbiAgICAgICAgdmFyICRlbGUgPSBVSS4kKGVsZSksIGhlaWdodCA9ICdhdXRvJztcblxuICAgICAgICBpZiAoJGVsZS5pcygnOnZpc2libGUnKSkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gJGVsZS5vdXRlckhlaWdodCgpO1xuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICB2YXIgdG1wID0ge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAkZWxlLmNzcygncG9zaXRpb24nKSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiAkZWxlLmNzcygndmlzaWJpbGl0eScpLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICRlbGUuY3NzKCdkaXNwbGF5JylcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGhlaWdodCA9ICRlbGUuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJywgdmlzaWJpbGl0eTogJ2hpZGRlbicsIGRpc3BsYXk6ICdibG9jayd9KS5vdXRlckhlaWdodCgpO1xuXG4gICAgICAgICAgICAkZWxlLmNzcyh0bXApOyAvLyByZXNldCBlbGVtZW50XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBzY3JvbGxwb3MgPSB7eDogd2luZG93LnNjcm9sbFgsIHk6IHdpbmRvdy5zY3JvbGxZfSxcbiAgICAgICAgJHdpbiAgICAgID0gVUkuJHdpbixcbiAgICAgICAgJGRvYyAgICAgID0gVUkuJGRvYyxcbiAgICAgICAgJGh0bWwgICAgID0gVUkuJGh0bWwsXG4gICAgICAgIE9mZmNhbnZhcyA9IHtcblxuICAgICAgICBzaG93OiBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG5cbiAgICAgICAgICAgIGVsZW1lbnQgPSBVSS4kKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgICAgIG9wdGlvbnMgPSBVSS4kLmV4dGVuZCh7bW9kZTogJ3B1c2gnfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIHZhciAkYm9keSAgICAgPSBVSS4kKCdib2R5JyksXG4gICAgICAgICAgICAgICAgYmFyICAgICAgID0gZWxlbWVudC5maW5kKCcudWstb2ZmY2FudmFzLWJhcjpmaXJzdCcpLFxuICAgICAgICAgICAgICAgIHJ0bCAgICAgICA9IChVSS5sYW5nZGlyZWN0aW9uID09ICdyaWdodCcpLFxuICAgICAgICAgICAgICAgIGZsaXAgICAgICA9IGJhci5oYXNDbGFzcygndWstb2ZmY2FudmFzLWJhci1mbGlwJykgPyAtMToxLFxuICAgICAgICAgICAgICAgIGRpciAgICAgICA9IGZsaXAgKiAocnRsID8gLTEgOiAxKSxcblxuICAgICAgICAgICAgICAgIHNjcm9sbGJhcndpZHRoID0gIHdpbmRvdy5pbm5lcldpZHRoIC0gJGJvZHkud2lkdGgoKTtcblxuICAgICAgICAgICAgc2Nyb2xscG9zID0ge3g6IHdpbmRvdy5wYWdlWE9mZnNldCwgeTogd2luZG93LnBhZ2VZT2Zmc2V0fTtcblxuICAgICAgICAgICAgYmFyLmF0dHIoJ21vZGUnLCBvcHRpb25zLm1vZGUpO1xuICAgICAgICAgICAgZWxlbWVudC5hZGRDbGFzcygndWstYWN0aXZlJyk7XG5cbiAgICAgICAgICAgICRib2R5LmNzcyh7d2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoIC0gc2Nyb2xsYmFyd2lkdGgsIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0fSkuYWRkQ2xhc3MoJ3VrLW9mZmNhbnZhcy1wYWdlJyk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLm1vZGUgPT0gJ3B1c2gnIHx8IG9wdGlvbnMubW9kZSA9PSAncmV2ZWFsJykge1xuICAgICAgICAgICAgICAgICRib2R5LmNzcygocnRsID8gJ21hcmdpbi1yaWdodCcgOiAnbWFyZ2luLWxlZnQnKSwgKHJ0bCA/IC0xIDogMSkgKiAoYmFyLm91dGVyV2lkdGgoKSAqIGRpcikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tb2RlID09ICdyZXZlYWwnKSB7XG4gICAgICAgICAgICAgICAgYmFyLmNzcygnY2xpcCcsICdyZWN0KDAsICcrYmFyLm91dGVyV2lkdGgoKSsncHgsIDEwMHZoLCAwKScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkaHRtbC5jc3MoJ21hcmdpbi10b3AnLCBzY3JvbGxwb3MueSAqIC0xKS53aWR0aCgpOyAvLyAud2lkdGgoKSAtIGZvcmNlIHJlZHJhd1xuXG5cbiAgICAgICAgICAgIGJhci5hZGRDbGFzcygndWstb2ZmY2FudmFzLWJhci1zaG93Jyk7XG5cbiAgICAgICAgICAgIHRoaXMuX2luaXRFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBiYXIudHJpZ2dlcignc2hvdy51ay5vZmZjYW52YXMnLCBbZWxlbWVudCwgYmFyXSk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBXG4gICAgICAgICAgICBlbGVtZW50LmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaGlkZTogZnVuY3Rpb24oZm9yY2UpIHtcblxuICAgICAgICAgICAgdmFyICRib2R5ID0gVUkuJCgnYm9keScpLFxuICAgICAgICAgICAgICAgIHBhbmVsID0gVUkuJCgnLnVrLW9mZmNhbnZhcy51ay1hY3RpdmUnKSxcbiAgICAgICAgICAgICAgICBydGwgICA9IChVSS5sYW5nZGlyZWN0aW9uID09ICdyaWdodCcpLFxuICAgICAgICAgICAgICAgIGJhciAgID0gcGFuZWwuZmluZCgnLnVrLW9mZmNhbnZhcy1iYXI6Zmlyc3QnKSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAkYm9keS5yZW1vdmVDbGFzcygndWstb2ZmY2FudmFzLXBhZ2UnKS5jc3Moe3dpZHRoOiAnJywgaGVpZ2h0OiAnJywgbWFyZ2luTGVmdDogJycsIG1hcmdpblJpZ2h0OiAnJ30pO1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5yZW1vdmVDbGFzcygndWstYWN0aXZlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgYmFyLnJlbW92ZUNsYXNzKCd1ay1vZmZjYW52YXMtYmFyLXNob3cnKTtcbiAgICAgICAgICAgICAgICAgICAgJGh0bWwuY3NzKCdtYXJnaW4tdG9wJywgJycpO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oc2Nyb2xscG9zLngsIHNjcm9sbHBvcy55KTtcbiAgICAgICAgICAgICAgICAgICAgYmFyLnRyaWdnZXIoJ2hpZGUudWsub2ZmY2FudmFzJywgW3BhbmVsLCBiYXJdKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgQVJJQVxuICAgICAgICAgICAgICAgICAgICBwYW5lbC5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKCFwYW5lbC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChiYXIuYXR0cignbW9kZScpID09ICdub25lJykgZm9yY2UgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAoVUkuc3VwcG9ydC50cmFuc2l0aW9uICYmICFmb3JjZSkge1xuXG4gICAgICAgICAgICAgICAgJGJvZHkub25lKFVJLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNzcygocnRsID8gJ21hcmdpbi1yaWdodCcgOiAnbWFyZ2luLWxlZnQnKSwgJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJhci5hdHRyKCdtb2RlJykgPT0gJ3JldmVhbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFyLmNzcygnY2xpcCcsICcnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIGJhci5yZW1vdmVDbGFzcygndWstb2ZmY2FudmFzLWJhci1zaG93Jyk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmluYWxpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfaW5pdEVsZW1lbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGF0YSgnT2ZmY2FudmFzSW5pdCcpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGVsZW1lbnQub24oJ2NsaWNrLnVrLm9mZmNhbnZhcyBzd2lwZVJpZ2h0LnVrLm9mZmNhbnZhcyBzd2lwZUxlZnQudWsub2ZmY2FudmFzJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IFVJLiQoZS50YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFlLnR5cGUubWF0Y2goL3N3aXBlLykpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5oYXNDbGFzcygndWstb2ZmY2FudmFzLWNsb3NlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzQ2xhc3MoJ3VrLW9mZmNhbnZhcy1iYXInKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5wYXJlbnRzKCcudWstb2ZmY2FudmFzLWJhcjpmaXJzdCcpLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBPZmZjYW52YXMuaGlkZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGVsZW1lbnQub24oJ2NsaWNrJywgJ2FbaHJlZio9XCIjXCJdJywgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgICAgICAgICB2YXIgbGluayA9IFVJLiQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgIGhyZWYgPSBsaW5rLmF0dHIoJ2hyZWYnKTtcblxuICAgICAgICAgICAgICAgIGlmIChocmVmID09ICcjJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgVUkuJGRvYy5vbmUoJ2hpZGUudWsub2ZmY2FudmFzJywgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldDtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gVUkuJChsaW5rWzBdLmhhc2gpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBVSS4kKCdbbmFtZT1cIicrbGlua1swXS5oYXNoLnJlcGxhY2UoJyMnLCcnKSsnXCJdJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lmxlbmd0aCAmJiBVSS5VdGlscy5zY3JvbGxUb0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFVJLlV0aWxzLnNjcm9sbFRvRWxlbWVudCh0YXJnZXQsIFVJLlV0aWxzLm9wdGlvbnMobGluay5hdHRyKCdkYXRhLXVrLXNtb290aC1zY3JvbGwnKSB8fCAne30nKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGhyZWY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIE9mZmNhbnZhcy5oaWRlKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZWxlbWVudC5kYXRhKCdPZmZjYW52YXNJbml0JywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVUkuY29tcG9uZW50KCdvZmZjYW52YXNUcmlnZ2VyJywge1xuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgICRodG1sLm9uKCdjbGljay5vZmZjYW52YXMudWlraXQnLCAnW2RhdGEtdWstb2ZmY2FudmFzXScsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFlbGUuZGF0YSgnb2ZmY2FudmFzVHJpZ2dlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBVSS5vZmZjYW52YXNUcmlnZ2VyKGVsZSwgVUkuVXRpbHMub3B0aW9ucyhlbGUuYXR0cignZGF0YS11ay1vZmZjYW52YXMnKSkpO1xuICAgICAgICAgICAgICAgICAgICBlbGUudHJpZ2dlcihcImNsaWNrXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkaHRtbC5vbigna2V5ZG93bi51ay5vZmZjYW52YXMnLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykgeyAvLyBFU0NcbiAgICAgICAgICAgICAgICAgICAgT2ZmY2FudmFzLmhpZGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gVUkuJC5leHRlbmQoe1xuICAgICAgICAgICAgICAgIHRhcmdldDogJHRoaXMuZWxlbWVudC5pcygnYScpID8gJHRoaXMuZWxlbWVudC5hdHRyKCdocmVmJykgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtb2RlOiAncHVzaCdcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBPZmZjYW52YXMuc2hvdygkdGhpcy5vcHRpb25zLnRhcmdldCwgJHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgVUkub2ZmY2FudmFzID0gT2ZmY2FudmFzO1xuXG59KShVSWtpdDIpO1xuXG4oZnVuY3Rpb24oVUkpIHtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgdmFyIEFuaW1hdGlvbnM7XG5cbiAgICBVSS5jb21wb25lbnQoJ3N3aXRjaGVyJywge1xuXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBjb25uZWN0ICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHRvZ2dsZSAgICA6ICc+KicsXG4gICAgICAgICAgICBhY3RpdmUgICAgOiAwLFxuICAgICAgICAgICAgYW5pbWF0aW9uIDogZmFsc2UsXG4gICAgICAgICAgICBkdXJhdGlvbiAgOiAyMDAsXG4gICAgICAgICAgICBzd2lwaW5nICAgOiB0cnVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgYW5pbWF0aW5nOiBmYWxzZSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS5yZWFkeShmdW5jdGlvbihjb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICBVSS4kKCdbZGF0YS11ay1zd2l0Y2hlcl0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3dpdGNoZXIgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghc3dpdGNoZXIuZGF0YSgnc3dpdGNoZXInKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IFVJLnN3aXRjaGVyKHN3aXRjaGVyLCBVSS5VdGlscy5vcHRpb25zKHN3aXRjaGVyLmF0dHIoJ2RhdGEtdWstc3dpdGNoZXInKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5vbignY2xpY2sudWsuc3dpdGNoZXInLCB0aGlzLm9wdGlvbnMudG9nZ2xlLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICR0aGlzLnNob3codGhpcyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY29ubmVjdCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb25uZWN0ID0gVUkuJCh0aGlzLm9wdGlvbnMuY29ubmVjdCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5jb25uZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb25uZWN0Lm9uKCdjbGljay51ay5zd2l0Y2hlcicsICdbZGF0YS11ay1zd2l0Y2hlci1pdGVtXScsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gVUkuJCh0aGlzKS5hdHRyKCdkYXRhLXVrLXN3aXRjaGVyLWl0ZW0nKTtcblxuICAgICAgICAgICAgICAgIGlmICgkdGhpcy5pbmRleCA9PSBpdGVtKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2goaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICduZXh0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJldmlvdXMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuc2hvdygkdGhpcy5pbmRleCArIChpdGVtPT0nbmV4dCcgPyAxOi0xKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLnNob3cocGFyc2VJbnQoaXRlbSwgMTApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zd2lwaW5nKSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Qub24oJ3N3aXBlUmlnaHQgc3dpcGVMZWZ0JywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLnNob3coJHRoaXMuaW5kZXggKyAoZS50eXBlID09ICdzd2lwZUxlZnQnID8gMSA6IC0xKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3QuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygndWstYWN0aXZlJykuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXG4gICAgICAgICAgICB2YXIgdG9nZ2xlcyA9IHRoaXMuZmluZCh0aGlzLm9wdGlvbnMudG9nZ2xlKSxcbiAgICAgICAgICAgICAgICBhY3RpdmUgID0gdG9nZ2xlcy5maWx0ZXIoJy51ay1hY3RpdmUnKTtcblxuICAgICAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3coYWN0aXZlLCBmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hY3RpdmU9PT1mYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgYWN0aXZlID0gdG9nZ2xlcy5lcSh0aGlzLm9wdGlvbnMuYWN0aXZlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3coYWN0aXZlLmxlbmd0aCA/IGFjdGl2ZSA6IHRvZ2dsZXMuZXEoMCksIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5pdCBBUklBIGZvciB0b2dnbGVzXG4gICAgICAgICAgICB0b2dnbGVzLm5vdChhY3RpdmUpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAgIGFjdGl2ZS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzaG93OiBmdW5jdGlvbih0YWIsIGFuaW1hdGUpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdG9nZ2xlcyA9IHRoaXMuZmluZCh0aGlzLm9wdGlvbnMudG9nZ2xlKTtcblxuICAgICAgICAgICAgaWYgKGlzTmFOKHRhYikpIHtcbiAgICAgICAgICAgICAgICB0YWIgPSBVSS4kKHRhYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhYiA9IHRhYiA8IDAgPyB0b2dnbGVzLmxlbmd0aC0xIDogdGFiO1xuICAgICAgICAgICAgICAgIHRhYiA9IHRvZ2dsZXMuZXEodG9nZ2xlc1t0YWJdID8gdGFiIDogMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyAgICAgPSB0aGlzLFxuICAgICAgICAgICAgICAgIGFjdGl2ZSAgICA9IFVJLiQodGFiKSxcbiAgICAgICAgICAgICAgICBhbmltYXRpb24gPSBBbmltYXRpb25zW3RoaXMub3B0aW9ucy5hbmltYXRpb25dIHx8IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQW5pbWF0aW9ucy5ub25lLmFwcGx5KCR0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBhbmltID0gJHRoaXMub3B0aW9ucy5hbmltYXRpb24uc3BsaXQoJywnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbS5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5pbVsxXSA9IGFuaW1bMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBhbmltWzBdID0gYW5pbVswXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGFuaW1bMV0gPSBhbmltWzFdLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29yZUFuaW1hdGlvbi5hcHBseSgkdGhpcywgW2FuaW0sIGN1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoYW5pbWF0ZT09PWZhbHNlIHx8ICFVSS5zdXBwb3J0LmFuaW1hdGlvbikge1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbiA9IEFuaW1hdGlvbnMubm9uZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFjdGl2ZS5oYXNDbGFzcyhcInVrLWRpc2FibGVkXCIpKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBIGZvciBUb2dnbGVzXG4gICAgICAgICAgICB0b2dnbGVzLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAgIGFjdGl2ZS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcblxuICAgICAgICAgICAgdG9nZ2xlcy5maWx0ZXIoXCIudWstYWN0aXZlXCIpLnJlbW92ZUNsYXNzKFwidWstYWN0aXZlXCIpO1xuICAgICAgICAgICAgYWN0aXZlLmFkZENsYXNzKFwidWstYWN0aXZlXCIpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbm5lY3QgJiYgdGhpcy5jb25uZWN0Lmxlbmd0aCkge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMuZmluZCh0aGlzLm9wdGlvbnMudG9nZ2xlKS5pbmRleChhY3RpdmUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPT0gLTEgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdC5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBVSS4kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gID0gVUkuJChjb250YWluZXIuY2hpbGRyZW4oKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ICAgPSBVSS4kKGNoaWxkcmVuLmZpbHRlcignLnVrLWFjdGl2ZScpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgICAgICA9IFVJLiQoY2hpbGRyZW4uZXEoJHRoaXMuaW5kZXgpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuYW5pbWF0aW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLmFwcGx5KCR0aGlzLCBbY3VycmVudCwgbmV4dF0pLnRoZW4oZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQucmVtb3ZlQ2xhc3MoXCJ1ay1hY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5hZGRDbGFzcyhcInVrLWFjdGl2ZVwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBIGZvciBjb25uZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUkuVXRpbHMuY2hlY2tEaXNwbGF5KG5leHQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuYW5pbWF0aW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoXCJzaG93LnVrLnN3aXRjaGVyXCIsIFthY3RpdmVdKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgQW5pbWF0aW9ucyA9IHtcblxuICAgICAgICAnbm9uZSc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGQgPSBVSS4kLkRlZmVycmVkKCk7XG4gICAgICAgICAgICBkLnJlc29sdmUoKTtcbiAgICAgICAgICAgIHJldHVybiBkLnByb21pc2UoKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnZmFkZSc6IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JlQW5pbWF0aW9uLmFwcGx5KHRoaXMsIFsndWstYW5pbWF0aW9uLWZhZGUnLCBjdXJyZW50LCBuZXh0XSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ3NsaWRlLWJvdHRvbSc6IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JlQW5pbWF0aW9uLmFwcGx5KHRoaXMsIFsndWstYW5pbWF0aW9uLXNsaWRlLWJvdHRvbScsIGN1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnc2xpZGUtdG9wJzogZnVuY3Rpb24oY3VycmVudCwgbmV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcmVBbmltYXRpb24uYXBwbHkodGhpcywgWyd1ay1hbmltYXRpb24tc2xpZGUtdG9wJywgY3VycmVudCwgbmV4dF0pO1xuICAgICAgICB9LFxuXG4gICAgICAgICdzbGlkZS12ZXJ0aWNhbCc6IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQsIGRpcikge1xuXG4gICAgICAgICAgICB2YXIgYW5pbSA9IFsndWstYW5pbWF0aW9uLXNsaWRlLXRvcCcsICd1ay1hbmltYXRpb24tc2xpZGUtYm90dG9tJ107XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQuaW5kZXgoKSA+IG5leHQuaW5kZXgoKSkge1xuICAgICAgICAgICAgICAgIGFuaW0ucmV2ZXJzZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29yZUFuaW1hdGlvbi5hcHBseSh0aGlzLCBbYW5pbSwgY3VycmVudCwgbmV4dF0pO1xuICAgICAgICB9LFxuXG4gICAgICAgICdzbGlkZS1sZWZ0JzogZnVuY3Rpb24oY3VycmVudCwgbmV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcmVBbmltYXRpb24uYXBwbHkodGhpcywgWyd1ay1hbmltYXRpb24tc2xpZGUtbGVmdCcsIGN1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnc2xpZGUtcmlnaHQnOiBmdW5jdGlvbihjdXJyZW50LCBuZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gY29yZUFuaW1hdGlvbi5hcHBseSh0aGlzLCBbJ3VrLWFuaW1hdGlvbi1zbGlkZS1yaWdodCcsIGN1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnc2xpZGUtaG9yaXpvbnRhbCc6IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQsIGRpcikge1xuXG4gICAgICAgICAgICB2YXIgYW5pbSA9IFsndWstYW5pbWF0aW9uLXNsaWRlLXJpZ2h0JywgJ3VrLWFuaW1hdGlvbi1zbGlkZS1sZWZ0J107XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQuaW5kZXgoKSA+IG5leHQuaW5kZXgoKSkge1xuICAgICAgICAgICAgICAgIGFuaW0ucmV2ZXJzZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29yZUFuaW1hdGlvbi5hcHBseSh0aGlzLCBbYW5pbSwgY3VycmVudCwgbmV4dF0pO1xuICAgICAgICB9LFxuXG4gICAgICAgICdzY2FsZSc6IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JlQW5pbWF0aW9uLmFwcGx5KHRoaXMsIFsndWstYW5pbWF0aW9uLXNjYWxlLXVwJywgY3VycmVudCwgbmV4dF0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIFVJLnN3aXRjaGVyLmFuaW1hdGlvbnMgPSBBbmltYXRpb25zO1xuXG5cbiAgICAvLyBoZWxwZXJzXG5cbiAgICBmdW5jdGlvbiBjb3JlQW5pbWF0aW9uKGNscywgY3VycmVudCwgbmV4dCkge1xuXG4gICAgICAgIHZhciBkID0gVUkuJC5EZWZlcnJlZCgpLCBjbHNJbiA9IGNscywgY2xzT3V0ID0gY2xzLCByZWxlYXNlO1xuXG4gICAgICAgIGlmIChuZXh0WzBdPT09Y3VycmVudFswXSkge1xuICAgICAgICAgICAgZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm4gZC5wcm9taXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mKGNscykgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNsc0luICA9IGNsc1swXTtcbiAgICAgICAgICAgIGNsc091dCA9IGNsc1sxXSB8fCBjbHNbMF07XG4gICAgICAgIH1cblxuICAgICAgICBVSS4kYm9keS5jc3MoJ292ZXJmbG93LXgnLCAnaGlkZGVuJyk7IC8vIGZpeCBzY3JvbGwganVtcGluZyBpbiBpT1NcblxuICAgICAgICByZWxlYXNlID0gZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50KSBjdXJyZW50LmhpZGUoKS5yZW1vdmVDbGFzcygndWstYWN0aXZlICcrY2xzT3V0KycgdWstYW5pbWF0aW9uLXJldmVyc2UnKTtcblxuICAgICAgICAgICAgbmV4dC5hZGRDbGFzcyhjbHNJbikub25lKFVJLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCwgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZW1vdmVDbGFzcygnJytjbHNJbisnJykuY3NzKHtvcGFjaXR5OicnLCBkaXNwbGF5OicnfSk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgICAgICAgICBkLnJlc29sdmUoKTtcblxuICAgICAgICAgICAgICAgIFVJLiRib2R5LmNzcygnb3ZlcmZsb3cteCcsICcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSBjdXJyZW50LmNzcyh7b3BhY2l0eTonJywgZGlzcGxheTonJ30pO1xuXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpLnNob3coKTtcbiAgICAgICAgfTtcblxuICAgICAgICBuZXh0LmNzcygnYW5pbWF0aW9uLWR1cmF0aW9uJywgdGhpcy5vcHRpb25zLmR1cmF0aW9uKydtcycpO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQubGVuZ3RoKSB7XG5cbiAgICAgICAgICAgIGN1cnJlbnQuY3NzKCdhbmltYXRpb24tZHVyYXRpb24nLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24rJ21zJyk7XG5cbiAgICAgICAgICAgIGN1cnJlbnQuY3NzKCdkaXNwbGF5JywgJ25vbmUnKS5hZGRDbGFzcyhjbHNPdXQrJyB1ay1hbmltYXRpb24tcmV2ZXJzZScpLm9uZShVSS5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSkuY3NzKCdkaXNwbGF5JywgJycpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0LmFkZENsYXNzKCd1ay1hY3RpdmUnKTtcbiAgICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkLnByb21pc2UoKTtcbiAgICB9XG5cbn0pKFVJa2l0Mik7XG5cbihmdW5jdGlvbihVSSkge1xuXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBVSS5jb21wb25lbnQoJ3RhYicsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgdGFyZ2V0ICAgIDogJz5saTpub3QoLnVrLXRhYi1yZXNwb25zaXZlLCAudWstZGlzYWJsZWQpJyxcbiAgICAgICAgICAgIGNvbm5lY3QgICA6IGZhbHNlLFxuICAgICAgICAgICAgYWN0aXZlICAgIDogMCxcbiAgICAgICAgICAgIGFuaW1hdGlvbiA6IGZhbHNlLFxuICAgICAgICAgICAgZHVyYXRpb24gIDogMjAwLFxuICAgICAgICAgICAgc3dpcGluZyAgIDogdHJ1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIFVJLiQoJ1tkYXRhLXVrLXRhYl0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWIgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFiLmRhdGEoJ3RhYicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gVUkudGFiKHRhYiwgVUkuVXRpbHMub3B0aW9ucyh0YWIuYXR0cignZGF0YS11ay10YWInKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrLnVrLnRhYicsIHRoaXMub3B0aW9ucy50YXJnZXQsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIGlmICgkdGhpcy5zd2l0Y2hlciAmJiAkdGhpcy5zd2l0Y2hlci5hbmltYXRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50ID0gJHRoaXMuZmluZCgkdGhpcy5vcHRpb25zLnRhcmdldCkubm90KHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgY3VycmVudC5yZW1vdmVDbGFzcygndWstYWN0aXZlJykuYmx1cigpO1xuXG4gICAgICAgICAgICAgICAgJHRoaXMudHJpZ2dlcignY2hhbmdlLnVrLnRhYicsIFtVSS4kKHRoaXMpLmFkZENsYXNzKCd1ay1hY3RpdmUnKSwgJHRoaXMuY3VycmVudF0pO1xuXG4gICAgICAgICAgICAgICAgJHRoaXMuY3VycmVudCA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgQVJJQVxuICAgICAgICAgICAgICAgIGlmICghJHRoaXMub3B0aW9ucy5jb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgICAgICAgICAgICAgICAgICBVSS4kKHRoaXMpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QgPSBVSS4kKHRoaXMub3B0aW9ucy5jb25uZWN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW5pdCByZXNwb25zaXZlIHRhYlxuICAgICAgICAgICAgdGhpcy5yZXNwb25zaXZldGFiID0gVUkuJCgnPGxpIGNsYXNzPVwidWstdGFiLXJlc3BvbnNpdmUgdWstYWN0aXZlXCI+PGE+PC9hPjwvbGk+JykuYXBwZW5kKCc8ZGl2IGNsYXNzPVwidWstZHJvcGRvd24gdWstZHJvcGRvd24tc21hbGxcIj48dWwgY2xhc3M9XCJ1ay1uYXYgdWstbmF2LWRyb3Bkb3duXCI+PC91bD48ZGl2PicpO1xuXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNpdmV0YWIuZHJvcGRvd24gPSB0aGlzLnJlc3BvbnNpdmV0YWIuZmluZCgnLnVrLWRyb3Bkb3duJyk7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNpdmV0YWIubHN0ICAgICAgPSB0aGlzLnJlc3BvbnNpdmV0YWIuZHJvcGRvd24uZmluZCgndWwnKTtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2l2ZXRhYi5jYXB0aW9uICA9IHRoaXMucmVzcG9uc2l2ZXRhYi5maW5kKCdhOmZpcnN0Jyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuaGFzQ2xhc3MoJ3VrLXRhYi1ib3R0b20nKSkgdGhpcy5yZXNwb25zaXZldGFiLmRyb3Bkb3duLmFkZENsYXNzKCd1ay1kcm9wZG93bi11cCcpO1xuXG4gICAgICAgICAgICAvLyBoYW5kbGUgY2xpY2tcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2l2ZXRhYi5sc3Qub24oJ2NsaWNrLnVrLnRhYicsICdhJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgbGluayA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICAkdGhpcy5lbGVtZW50LmNoaWxkcmVuKCdsaTpub3QoLnVrLXRhYi1yZXNwb25zaXZlKScpLmVxKGxpbmsuZGF0YSgnaW5kZXgnKSkudHJpZ2dlcignY2xpY2snKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdzaG93LnVrLnN3aXRjaGVyIGNoYW5nZS51ay50YWInLCBmdW5jdGlvbihlLCB0YWIpIHtcbiAgICAgICAgICAgICAgICAkdGhpcy5yZXNwb25zaXZldGFiLmNhcHRpb24uaHRtbCh0YWIudGV4dCgpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kKHRoaXMucmVzcG9uc2l2ZXRhYik7XG5cbiAgICAgICAgICAgIC8vIGluaXQgVUlraXQgY29tcG9uZW50c1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb25uZWN0KSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaGVyID0gVUkuc3dpdGNoZXIodGhpcy5lbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZSAgICA6ICc+bGk6bm90KC51ay10YWItcmVzcG9uc2l2ZSknLFxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0ICAgOiB0aGlzLm9wdGlvbnMuY29ubmVjdCxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlICAgIDogdGhpcy5vcHRpb25zLmFjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uIDogdGhpcy5vcHRpb25zLmFuaW1hdGlvbixcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gIDogdGhpcy5vcHRpb25zLmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBzd2lwaW5nICAgOiB0aGlzLm9wdGlvbnMuc3dpcGluZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBVSS5kcm9wZG93bih0aGlzLnJlc3BvbnNpdmV0YWIsIHttb2RlOiAnY2xpY2snLCBwcmV2ZW50ZmxpcDogJ3knfSk7XG5cbiAgICAgICAgICAgIC8vIGluaXRcbiAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoJ2NoYW5nZS51ay50YWInLCBbdGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLnRhcmdldCkubm90KCcudWstdGFiLXJlc3BvbnNpdmUnKS5maWx0ZXIoJy51ay1hY3RpdmUnKV0pO1xuXG4gICAgICAgICAgICB0aGlzLmNoZWNrKCk7XG5cbiAgICAgICAgICAgIFVJLiR3aW4ub24oJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsIFVJLlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgaWYgKCR0aGlzLmVsZW1lbnQuaXMoJzp2aXNpYmxlJykpICAkdGhpcy5jaGVjaygpO1xuICAgICAgICAgICAgfSwgMTAwKSk7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2Rpc3BsYXkudWsuY2hlY2snLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGlmICgkdGhpcy5lbGVtZW50LmlzKCc6dmlzaWJsZScpKSAgJHRoaXMuY2hlY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNoZWNrOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuKCdsaTpub3QoLnVrLXRhYi1yZXNwb25zaXZlKScpLnJlbW92ZUNsYXNzKCd1ay1oaWRkZW4nKTtcblxuICAgICAgICAgICAgaWYgKCFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNpdmV0YWIuYWRkQ2xhc3MoJ3VrLWhpZGRlbicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRvcCAgICAgICAgICA9IChjaGlsZHJlbi5lcSgwKS5vZmZzZXQoKS50b3AgKyBNYXRoLmNlaWwoY2hpbGRyZW4uZXEoMCkuaGVpZ2h0KCkvMikpLFxuICAgICAgICAgICAgICAgIGRvcmVzcG9uc2l2ZSA9IGZhbHNlLFxuICAgICAgICAgICAgICAgIGl0ZW0sIGxpbmssIGNsb25lO1xuXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNpdmV0YWIubHN0LmVtcHR5KCk7XG5cbiAgICAgICAgICAgIGNoaWxkcmVuLmVhY2goZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgIGlmIChVSS4kKHRoaXMpLm9mZnNldCgpLnRvcCA+IHRvcCkge1xuICAgICAgICAgICAgICAgICAgICBkb3Jlc3BvbnNpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoZG9yZXNwb25zaXZlKSB7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaXRlbSAgPSBVSS4kKGNoaWxkcmVuLmVxKGkpKTtcbiAgICAgICAgICAgICAgICAgICAgbGluayAgPSBpdGVtLmZpbmQoJ2EnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5jc3MoJ2Zsb2F0JykgIT0gJ25vbmUnICYmICFpdGVtLmF0dHIoJ3VrLWRyb3Bkb3duJykpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmhhc0NsYXNzKCd1ay1kaXNhYmxlZCcpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZSA9IFVJLiQoaXRlbVswXS5vdXRlckhUTUwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lLmZpbmQoJ2EnKS5kYXRhKCdpbmRleCcsIGkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zaXZldGFiLmxzdC5hcHBlbmQoY2xvbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZENsYXNzKCd1ay1oaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZXNwb25zaXZldGFiW3RoaXMucmVzcG9uc2l2ZXRhYi5sc3QuY2hpbGRyZW4oJ2xpJykubGVuZ3RoID8gJ3JlbW92ZUNsYXNzJzonYWRkQ2xhc3MnXSgndWstaGlkZGVuJyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKXtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgVUkuY29tcG9uZW50KCdjb3ZlcicsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgYXV0b211dGUgOiB0cnVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIGF1dG8gaW5pdFxuICAgICAgICAgICAgVUkucmVhZHkoZnVuY3Rpb24oY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgVUkuJCgnW2RhdGEtdWstY292ZXJdJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmKCFlbGUuZGF0YSgnY292ZXInKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBsdWdpbiA9IFVJLmNvdmVyKGVsZSwgVUkuVXRpbHMub3B0aW9ucyhlbGUuYXR0cignZGF0YS11ay1jb3ZlcicpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHRoaXMuZWxlbWVudC5wYXJlbnQoKTtcblxuICAgICAgICAgICAgVUkuJHdpbi5vbignbG9hZCByZXNpemUgb3JpZW50YXRpb25jaGFuZ2UnLCBVSS5VdGlscy5kZWJvdW5jZShmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2soKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgMTAwKSk7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2Rpc3BsYXkudWsuY2hlY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5pcygnOnZpc2libGUnKSkgdGhpcy5jaGVjaygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAgICAgdGhpcy5jaGVjaygpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50LmlzKCdpZnJhbWUnKSAmJiB0aGlzLm9wdGlvbnMuYXV0b211dGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciBzcmMgPSB0aGlzLmVsZW1lbnQuYXR0cignc3JjJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXR0cignc3JjJywgJycpLm9uKCdsb2FkJywgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCd7IFwiZXZlbnRcIjogXCJjb21tYW5kXCIsIFwiZnVuY1wiOiBcIm11dGVcIiwgXCJtZXRob2RcIjpcInNldFZvbHVtZVwiLCBcInZhbHVlXCI6MH0nLCAnKicpO1xuICAgICAgICAgICAgICAgIH0pLmF0dHIoJ3NyYycsIFtzcmMsIChzcmMuaW5kZXhPZignPycpID4gLTEgPyAnJic6Jz8nKSwgJ2VuYWJsZWpzYXBpPTEmYXBpPTEnXS5qb2luKCcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2hlY2s6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY3NzKHsgd2lkdGggIDogJycsIGhlaWdodCA6ICcnIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IHt3OiB0aGlzLmVsZW1lbnQud2lkdGgoKSwgaDogdGhpcy5lbGVtZW50LmhlaWdodCgpfTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5hdHRyKCd3aWR0aCcpICYmICFpc05hTih0aGlzLmVsZW1lbnQuYXR0cignd2lkdGgnKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpbWVuc2lvbi53ID0gdGhpcy5lbGVtZW50LmF0dHIoJ3dpZHRoJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuYXR0cignaGVpZ2h0JykgJiYgIWlzTmFOKHRoaXMuZWxlbWVudC5hdHRyKCdoZWlnaHQnKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpbWVuc2lvbi5oID0gdGhpcy5lbGVtZW50LmF0dHIoJ2hlaWdodCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJhdGlvID0gdGhpcy5kaW1lbnNpb24udyAvIHRoaXMuZGltZW5zaW9uLmg7XG5cbiAgICAgICAgICAgIHZhciB3ID0gdGhpcy5wYXJlbnQud2lkdGgoKSwgaCA9IHRoaXMucGFyZW50LmhlaWdodCgpLCB3aWR0aCwgaGVpZ2h0O1xuXG4gICAgICAgICAgICAvLyBpZiBlbGVtZW50IGhlaWdodCA8IHBhcmVudCBoZWlnaHQgKGdhcCB1bmRlcm5lYXRoKVxuICAgICAgICAgICAgaWYgKCh3IC8gdGhpcy5yYXRpbykgPCBoKSB7XG5cbiAgICAgICAgICAgICAgICB3aWR0aCAgPSBNYXRoLmNlaWwoaCAqIHRoaXMucmF0aW8pO1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IGg7XG5cbiAgICAgICAgICAgIC8vIGVsZW1lbnQgd2lkdGggPCBwYXJlbnQgd2lkdGggKGdhcCB0byByaWdodClcbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICB3aWR0aCAgPSB3O1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGguY2VpbCh3IC8gdGhpcy5yYXRpbyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jc3MoeyB3aWR0aCAgOiB3aWR0aCwgaGVpZ2h0IDogaGVpZ2h0IH0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbn0pKFVJa2l0Mik7XG4iLCJ3aW5kb3cuJCA9IHdpbmRvdy5qUXVlcnkgPSByZXF1aXJlKCcuL3ZlbmRvci9qcXVlcnknKTtcblxuLy8gdmVuZG9yXG5yZXF1aXJlKCdzdmc0ZXZlcnlib2R5JykoKTtcbnJlcXVpcmUoJ3Vpa2l0Jyk7XG5cbi8vIHJlcXVpcmUoJy4vdmVuZG9yL3Vpa2l0L3Vpa2l0Lm1pbicpO1xucmVxdWlyZSgnLi92ZW5kb3IvdWlraXQvbW9kYWwubWluJyk7XG5yZXF1aXJlKCcuL3ZlbmRvci91aWtpdC9saWdodGJveC5taW4nKTtcbnJlcXVpcmUoJy4vdmVuZG9yL3Vpa2l0L2FjY29yZGlvbi5taW4nKTtcbnJlcXVpcmUoJy4vdmVuZG9yL3Vpa2l0L3NsaWRlci5taW4nKTtcbnJlcXVpcmUoJy4vdmVuZG9yL3Vpa2l0L3NsaWRlc2V0Lm1pbicpO1xucmVxdWlyZSgnLi92ZW5kb3IvdWlraXQvc2xpZGVzaG93Lm1pbicpO1xucmVxdWlyZSgnLi92ZW5kb3IvdWlraXQvc3RpY2t5Lm1pbicpO1xucmVxdWlyZSgnLi92ZW5kb3IvdWlraXQvdG9vbHRpcC5taW4nKTtcblxucmVxdWlyZSgnLi92ZW5kb3Ivb3dsLmNhcm91c2VsJyk7XG4vLyByZXF1aXJlKCdzZWxlY3QyJyk7XG5yZXF1aXJlKCcuL3ZlbmRvci9waWN0dXJlZmlsbC5taW4nKTtcblxuLy8gbW9kdWxlc1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NoYW5nZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9zbGlkZXNob3cnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy92aWRlbycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2ZpbHRlci1hY2NvcmRpb24nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9zdGlja3ktaGVhZGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvc3RpY2t5LXN1Ym1lbnUnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9vbmVwYWdlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3Ntb290aC1zY3JvbGwnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jbGVhcmFibGUtaW5wdXQnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9Pd2xDb250cm9sJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvZXZlbnRzJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvZm9ybWhhbmRsZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9zaGFyZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy90YWJsZScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3RvZ2dsZS1kb3dubG9hZC1idXR0b24nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9tYXNvbnJ5LWxheW91dCcpO1xuXG4vLyBkb24ndCB1cGxvYWQhXG4vLyByZXF1aXJlKCcuL3ZlbmRvci9jb25maWd1cmF0b3InKTtcblxuXG4vLyBuZWVkcyByZWZhY3RvclxucmVxdWlyZSgnLi9zaGFtZScpO1xuIiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICAvKlxuICAgICAqIENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgdmFyIE93bENvbnRyb2wgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG5cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgICB0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIHRoaXMubWV0YU9wdGlvbnMgPSB0aGlzLiRlbGVtZW50LmRhdGEoJ293bGNvbnRyb2wnKTtcblxuICAgICAgICB0aGlzLnNldHRpbmdzID0gJC5leHRlbmQoe30sIE93bENvbnRyb2wuRGVmYXVsdHMsIHRoaXMub3B0aW9ucywgdGhpcy5tZXRhT3B0aW9ucyk7XG5cbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBEZWZhdWx0c1xuICAgICAqL1xuICAgIE93bENvbnRyb2wuRGVmYXVsdHMgPSB7fTtcblxuICAgIC8qXG4gICAgICogSW5pdGlhbGl6ZVxuICAgICAqL1xuICAgIE93bENvbnRyb2wucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2luaXRpYWxpemluZyBPd2xDb250cm9sJyk7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5zZXR0aW5ncyk7XG5cbiAgICAgICAgdGhpcy4kZWxlbWVudC5vd2xDYXJvdXNlbCh0aGlzLnNldHRpbmdzKTtcbiAgICB9O1xuXG5cbiAgICAvKlxuICAgICAqIGpRdWVyeSBQbHVnaW4gUmVnaXN0ZXJcbiAgICAgKi9cbiAgICAkLmZuLm93bENvbnRyb2wgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBuZXcgT3dsQ29udHJvbCh0aGlzLCBvcHRpb25zKS5pbml0aWFsaXplKCk7XG4gICAgICAgIH0pXG4gICAgfTtcblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7IiwiKGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBDaGFuZ2VyID0gZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLFxuICAgICAgICAgICAgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmVsZW1lbnQub24oJ21vdXNlZW50ZXInLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBfdGhpcy5jaGFuZ2VNZWRpYSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJC5leHRlbmQoQ2hhbmdlci5wcm90b3R5cGUsIHtcblxuICAgICAgICBkZWZhdWx0czoge30sXG5cbiAgICAgICAgY2hhbmdlTWVkaWE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnBhcmVudHMoJy5qcy1wYW5lbC1zdG9yeScpLmZpbmQoJ3BpY3R1cmUgc291cmNlOmZpcnN0LWNoaWxkJykuYXR0cignc3Jjc2V0JywgdGhpcy5vcHRpb25zLnNyYyk7XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgLy8gaW5pdFxuICAgICQoZnVuY3Rpb24oKSB7XG4gICAgICAgICQoJ1tkYXRhLWNoYW5nZXJdJykuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBjaGFuZ2VyID0gJCh0aGlzKTtcbiAgICAgICAgICAgIG5ldyBDaGFuZ2VyKGNoYW5nZXIsIHRyYW5zZm9ybU9wdGlvbnMoY2hhbmdlci5kYXRhKCdjaGFuZ2VyJykpKTtcbiAgICAgICAgfSlcbiAgICB9KTtcblxuICAgIC8vIGhlbHBlclxuICAgIHZhciB0cmFuc2Zvcm1PcHRpb25zID0gZnVuY3Rpb24oc3RyaW5nKSB7XG5cbiAgICAgICAgaWYgKCQuaXNQbGFpbk9iamVjdChzdHJpbmcpKSByZXR1cm4gc3RyaW5nO1xuXG4gICAgICAgIHZhciBzdGFydCA9IHN0cmluZy5pbmRleE9mKFwie1wiKSwgb3B0aW9ucyA9IHt9O1xuXG4gICAgICAgIGlmIChzdGFydCAhPSAtMSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gKG5ldyBGdW5jdGlvbihcIlwiLCBcInZhciBqc29uID0gXCIgKyBzdHJpbmcuc3Vic3RyKHN0YXJ0KSArIFwiOyByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShqc29uKSk7XCIpKSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH07XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuIiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgJGVsZW1lbnQgPSAkKCcuanMtY2xlYXJhYmxlLWlucHV0JyksXG4gICAgICAgIGRlZmF1bHRzID0ge1xuICAgICAgICAgICAgXCJzdWJtaXRvbmNsaWNrXCI6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAkZWxlbWVudC5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKSxcbiAgICAgICAgICAgIG9wdGlvbnMgPSAkdGhpcy5hdHRyKCdkYXRhLWNsZWFyYWJsZScpID8gSlNPTi5wYXJzZSgkdGhpcy5hdHRyKCdkYXRhLWNsZWFyYWJsZScpKSA6IHt9LFxuICAgICAgICAgICAgc2V0dGluZ3MgPSAkLmV4dGVuZCh0cnVlLCB7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICR0aGlzLndyYXAoJzxzcGFuIGNsYXNzPVwidG0taW5wdXQgdG0taW5wdXQtLXdpdGgtY2xlYXItaWNvblwiIC8+JykuYWZ0ZXIoJCgnPHNwYW4gLz4nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKHRoaXMpLnByZXYoJ2lucHV0JykudmFsKCcnKS5mb2N1cygpO1xuXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3Muc3VibWl0b25jbGljaykge1xuICAgICAgICAgICAgICAgIHZhciAkZm9ybSA9ICR0aGlzLmNsb3Nlc3QoJ2Zvcm0nKTtcblxuICAgICAgICAgICAgICAgIGlmICgkZm9ybS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgJGZvcm0uc3VibWl0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfSk7XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpOyIsIihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyICRldmVudHNDb250YWluZXIgPSAkKCcuanMtZXZlbnQtbGlzdC1jb250YWluZXInKTtcbiAgICB2YXIgJGZpbHRlckJ1dHRvbiA9ICQoJy5qcy1maWx0ZXItZXZlbnQtbGlzdCcpO1xuICAgIHZhciBidXR0b25BY3RpdmUgPSAndG0tYnV0dG9uLWJhc2ljLS1hY3RpdmUnO1xuXG4gICAgdmFyICRldmVudHNDYXRlZ29yeSA9ICQoJ1tkYXRhLWZpbHRlci10eXBlPVwiY2F0ZWdvcnlcIl0nKTtcbiAgICB2YXIgJGV2ZW50c0xvY2F0aW9uID0gJCgnW2RhdGEtZmlsdGVyLXR5cGU9XCJsb2NhdGlvblwiXScpO1xuXG4gICAgLy92YXIgZmlsdGVyVXJsID0gJ2h0dHA6Ly9raXNrLW1lbm5la2VzLXd3dy0yMDE1MTAxOS1yZWxhdW5jaC4xMC42LjAuMTA5LnhpcC5pbzo4ODg4L3NjaHVsdW5nZW4vZmlsdGVyLyc7XG4gICAgdmFyIGZpbHRlclVybENvbnRyb2xsZXIgPSAnP3R4X3NmZXZlbnRtZ3RfcGlldmVudFthY3Rpb25dPWxpc3QmdHhfc2ZldmVudG1ndF9waWV2ZW50W2NvbnRyb2xsZXJdPUV2ZW50JztcbiAgICB2YXIgZmlsdGVyVXJsRGVtYW5kQ2F0ZWdvcnkgPSAnJnR4X3NmZXZlbnRtZ3RfcGlldmVudFtvdmVyd3JpdGVEZW1hbmRdW2NhdGVnb3J5XT0nO1xuICAgIHZhciBmaWx0ZXJVcmxEZW1hbmRMb2NhdGlvbiA9ICcmdHhfc2ZldmVudG1ndF9waWV2ZW50W292ZXJ3cml0ZURlbWFuZF1bbG9jYXRpb25dPSc7XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVFdmVudHMoKSB7XG5cbiAgICAgICAgJCgnLmpzLXRtLWZvcm0tc2V0LWxhYmVsJykub24oJ2JsdXInLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYoJCh0aGlzKS52YWwoKSkge1xuICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2lzLWVtcHR5Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2lzLWVtcHR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJy5qcy1maWx0ZXItZXZlbnQtbGlzdC1tb2JpbGUnKS5vbignc2VsZWN0MjpzZWxlY3QnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdmFyIHVybCA9IGZpbHRlclVybCArIGZpbHRlclVybENvbnRyb2xsZXI7XG5cbiAgICAgICAgICAgIHZhciBkZW1hbmRDYXRlZ29yeSA9ICQoJy5qcy1maWx0ZXItZXZlbnQtbGlzdC1tb2JpbGVbZGF0YS1maWx0ZXItdHlwZT1cImNhdGVnb3J5XCJdJykuc2VsZWN0MigpLmZpbmQoXCI6c2VsZWN0ZWRcIikuZGF0YShcInVpZFwiKTtcbiAgICAgICAgICAgIGlmKGRlbWFuZENhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGZpbHRlclVybERlbWFuZENhdGVnb3J5ICsgZGVtYW5kQ2F0ZWdvcnk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBkZW1hbmRMb2NhdGlvbiA9ICQoJy5qcy1maWx0ZXItZXZlbnQtbGlzdC1tb2JpbGVbZGF0YS1maWx0ZXItdHlwZT1cImNhdGVnb3J5XCJdJykuc2VsZWN0MigpLmZpbmQoXCI6c2VsZWN0ZWRcIikuZGF0YShcInVpZFwiKTtcbiAgICAgICAgICAgIGlmKGRlbWFuZExvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGZpbHRlclVybERlbWFuZExvY2F0aW9uICsgZGVtYW5kTG9jYXRpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldERhdGEodXJsKTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICAkKCcuanMtZmlsdGVyLWV2ZW50LWxpc3QnKS5vbignY2xpY2snLCBmdW5jdGlvbiBmaWx0ZXJCdXR0b24oZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQodGhpcyk7XG4gICAgICAgICAgICB2YXIgdXJsID0gZmlsdGVyVXJsICsgZmlsdGVyVXJsQ29udHJvbGxlcjtcbiAgICAgICAgICAgIHZhciBhcnJEZW1hbmRDYXRlZ29yeSA9IFtdO1xuICAgICAgICAgICAgdmFyIGFyckRlbWFuZExvY2F0aW9uID0gW107XG5cbiAgICAgICAgICAgIGlmKGJ1dHRvbi5wYXJlbnRzKCdbZGF0YS1maWx0ZXItdHlwZV0nKS5kYXRhKCdmaWx0ZXJUeXBlJykgPT0gJ2NhdGVnb3J5Jykge1xuICAgICAgICAgICAgICAgICRldmVudHNDYXRlZ29yeS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgICAgICBidXR0b24uYWRkQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYoYnV0dG9uLnBhcmVudHMoJ1tkYXRhLWZpbHRlci10eXBlXScpLmRhdGEoJ2ZpbHRlclR5cGUnKSA9PSAnbG9jYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgJGV2ZW50c0xvY2F0aW9uLmZpbmQoJ2EnKS5ub3QoJCh0aGlzKSkucmVtb3ZlQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgICAgICBidXR0b24udG9nZ2xlQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJGV2ZW50c0NhdGVnb3J5LmZpbmQoJy4nICsgYnV0dG9uQWN0aXZlKS5lYWNoKGZ1bmN0aW9uKGksIGUpIHtcbiAgICAgICAgICAgICAgICBpZigkKGUpLmRhdGEoJ2lkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyRGVtYW5kQ2F0ZWdvcnlbaV0gPSAkKGUpLmRhdGEoJ2lkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICRldmVudHNMb2NhdGlvbi5maW5kKCcuJyArIGJ1dHRvbkFjdGl2ZSkuZWFjaChmdW5jdGlvbihpLCBlKSB7XG4gICAgICAgICAgICAgICAgaWYoJChlKS5kYXRhKCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyckRlbWFuZExvY2F0aW9uW2ldID0gJChlKS5kYXRhKCdpZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZihhcnJEZW1hbmRDYXRlZ29yeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGZpbHRlclVybERlbWFuZENhdGVnb3J5ICsgYXJyRGVtYW5kQ2F0ZWdvcnkuam9pbignLCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihhcnJEZW1hbmRMb2NhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGZpbHRlclVybERlbWFuZExvY2F0aW9uICsgYXJyRGVtYW5kTG9jYXRpb24uam9pbignLCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihhcnJEZW1hbmRDYXRlZ29yeS5sZW5ndGggPT0gMCAmJiBhcnJEZW1hbmRMb2NhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJCgnLmpzLWZpbHRlci1ldmVudC1saXN0LWFsbCcpLnJlbW92ZUNsYXNzKGJ1dHRvbkFjdGl2ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKGFyckRlbWFuZENhdGVnb3J5Lmxlbmd0aCA9PSAwICYmIGFyckRlbWFuZExvY2F0aW9uLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgJCgnLmpzLWZpbHRlci1ldmVudC1saXN0LWFsbCcpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnZXREYXRhKHVybCk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnLmpzLWZpbHRlci1ldmVudC1saXN0LWFsbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uIGZpbHRlckJ1dHRvbihlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB2YXIgdXJsID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7XG5cbiAgICAgICAgICAgICRmaWx0ZXJCdXR0b24ucmVtb3ZlQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoYnV0dG9uQWN0aXZlKTtcblxuICAgICAgICAgICAgZ2V0RGF0YSh1cmwpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZigkKCcudG0tYmxvY2stLW1vYmlsZS1zdGlja3knKS5sZW5ndGgpIHtcblxuICAgICAgICAgICAgdmFyIHNjcm9sbFRpbWVvdXQ7XG4gICAgICAgICAgICB2YXIgdGhyb3R0bGUgPSAxMDA7XG4gICAgICAgICAgICAkKHdpbmRvdykub24oJ3Njcm9sbCByZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzY3JvbGxUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA8IDc2OCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW5WaWV3cG9ydCgkKCcuanMtZXZlbnRzLXN0aWNreS10cmlnZ2VyJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy50bS1ibG9jay0tbW9iaWxlLXN0aWNreScpLmFkZENsYXNzKCd0bS1ibG9jay0tbW9iaWxlLXN0aWNreS0tdW5zZXQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcudG0tYmxvY2stLW1vYmlsZS1zdGlja3knKS5yZW1vdmVDbGFzcygndG0tYmxvY2stLW1vYmlsZS1zdGlja3ktLXVuc2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhyb3R0bGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCgnLnRtLWJsb2NrLS1tb2JpbGUtc3RpY2t5JykuYWRkQ2xhc3MoJ3RtLWJsb2NrLS1tb2JpbGUtc3RpY2t5LS11bnNldCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZigkKCcuanMtc2Nyb2xsLXRvLWVycm9yJykuZmluZCgnLmYzLWZvcm0tZXJyb3InKS5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gc2Nyb2xsVG9FcnJvcigpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9FcnJvclBvc2l0aW9uID0gJCgnLmpzLXNjcm9sbC10by1lcnJvcicpLmZpcnN0KCcuZjMtZm9ybS1lcnJvcicpLm9mZnNldCgpLnRvcDtcbiAgICAgICAgICAgICAgICAkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9FcnJvclBvc2l0aW9uXG4gICAgICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgICB9LCA3NTApO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREYXRhKHVybCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIGFqYXhEYXRhKHVybCkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICB2YXIgZmlyc3RSdW4gPSAxO1xuXG4gICAgICAgICAgICAkZXZlbnRzQ29udGFpbmVyLmFkZENsYXNzKCd0bS1ldmVudHMtb3ZlcnZpZXdfX2NvbnRhaW5lci0tZmFkZS1vdXQnKTtcbiAgICAgICAgICAgICRldmVudHNDb250YWluZXIub25lKCd3ZWJraXRUcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kIG9UcmFuc2l0aW9uRW5kIG1zVHJhbnNpdGlvbkVuZCB0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZpcnN0UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgZXZlbnRzID0gJChkYXRhKS5maW5kKCcuanMtZXZlbnQtbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZpcnN0UnVuID0gMDtcblxuICAgICAgICAgICAgICAgICQoJy5qcy1ldmVudC1saXN0JykucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgJGV2ZW50c0NvbnRhaW5lci5hcHBlbmQoZXZlbnRzKTtcblxuICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ3RtLWV2ZW50cy1vdmVydmlld19fY29udGFpbmVyLS1mYWRlLW91dCcpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBudWxsLCAkKF90aGlzKS5hdHRyKCdocmVmJykpO1xuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7fSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWpheERhdGEodXJsKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICByZXEub3BlbignR0VUJywgdXJsKTtcbiAgICAgICAgICAgIHJlcS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcS5zdGF0dXMgPT09IDIwMCA/IHJlc29sdmUocmVxLnJlc3BvbnNlKSA6IHJlamVjdChFcnJvcihyZXEuc3RhdHVzVGV4dCkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KEVycm9yKCdOZXR3b3JrIEVycm9yOiAnICsgZSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcS5zZW5kKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEJ1dHRvblN0YXRlKGJ1dHRvbikge1xuICAgICAgJGZpbHRlckJ1dHRvbi5yZW1vdmVDbGFzcyhidXR0b25BY3RpdmUpO1xuICAgICAgYnV0dG9uLmFkZENsYXNzKGJ1dHRvbkFjdGl2ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJblZpZXdwb3J0KGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUb3AgPSAkKGVsZW1lbnQpLm9mZnNldCgpLnRvcDtcbiAgICAgICAgdmFyIGVsZW1lbnRCb3R0b20gPSBlbGVtZW50VG9wICsgJChlbGVtZW50KS5vdXRlckhlaWdodCgpO1xuICAgICAgICB2YXIgdmlld3BvcnRUb3AgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XG4gICAgICAgIHZhciB2aWV3cG9ydEJvdHRvbSA9IHZpZXdwb3J0VG9wICsgJCh3aW5kb3cpLmhlaWdodCgpO1xuICAgICAgICByZXR1cm4gZWxlbWVudEJvdHRvbSA+IHZpZXdwb3J0VG9wICYmIGVsZW1lbnRUb3AgPCB2aWV3cG9ydEJvdHRvbTtcbiAgICB9XG5cbiAgICBoYW5kbGVFdmVudHMoKTtcblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7XG4iLCIoZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBhY2NvcmRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgdmFyIGFjY29yZGlvbiA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBjaGVja01lZGlhUXVlcnkoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cubWF0Y2hNZWRpYShcIihtaW4td2lkdGg6IDc2OHB4KVwiKS5tYXRjaGVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrQWNjb3JkaW9uKCkge1xuICAgICAgICBpZiAoY2hlY2tNZWRpYVF1ZXJ5KCkpIHtcbiAgICAgICAgICAgIGRpc2FibGVBY2NvcmRpb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuYWJsZUFjY29yZGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlzYWJsZUFjY29yZGlvbigpIHtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZygnZGlzYWJsZUFjY29yZGlvbiBiZWNhdXNlIG1pbi13aWR0aCBpcyA3NjhweCcpO1xuXG4gICAgICAgIGlmIChhY2NvcmRpb25FbmFibGVkKSB7XG4gICAgICAgICAgICAkKCcuanMtZmlsdGVyLWFjY29yZGlvbicpLm9mZignY2xpY2sudWsuYWNjb3JkaW9uJyk7XG4gICAgICAgICAgICAkKCcuanMtZmlsdGVyLWFjY29yZGlvbiAudWstYWNjb3JkaW9uLXRpdGxlJykucmVtb3ZlQ2xhc3MoJ3VrLWFjdGl2ZScpO1xuICAgICAgICAgICAgJCgnLmpzLWZpbHRlci1hY2NvcmRpb24gLnVrLWFjY29yZGlvbi1jb250ZW50JykudW53cmFwKCkucmVtb3ZlQ2xhc3MoJ3VrLWFjdGl2ZScpO1xuXG4gICAgICAgICAgICBhY2NvcmRpb24gPSBudWxsO1xuICAgICAgICAgICAgYWNjb3JkaW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBlbmFibGVBY2NvcmRpb24oKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdlbmFibGVBY2NvcmRpb24gYmVjYXVzZSBtYXgtd2lkdGggaXMgNzY3cHgnKTtcblxuICAgICAgICBpZiAoIWFjY29yZGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGFjY29yZGlvbiA9IFVJa2l0LmFjY29yZGlvbigkKCcuanMtZmlsdGVyLWFjY29yZGlvbicpLCB7Y29sbGFwc2U6IGZhbHNlfSk7XG4gICAgICAgICAgICBhY2NvcmRpb25FbmFibGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYWNjb3JkaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgICQoJy5qcy1maWx0ZXItYWNjb3JkaW9uJykuZmluZCgnLnRtLXRvb2x0aXAtaWNvbicpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuXG4gICAgVUlraXQub24oJ2FmdGVycmVhZHkudWsuZG9tJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoJCgnLmpzLWZpbHRlci1hY2NvcmRpb24nKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNoZWNrQWNjb3JkaW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsIFVJa2l0LlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKCQoJy5qcy1maWx0ZXItYWNjb3JkaW9uJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tBY2NvcmRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKSk7XG5cbiAgICAgICAgJCgnaHRtbCcpLm9uKCd1cGRhdGUuZmlsdGVyLmFjY29yZGlvbicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3VwZGF0ZS5maWx0ZXIuYWNjb3JkaW9uJyk7XG5cbiAgICAgICAgICAgIGlmICgkKCcuanMtZmlsdGVyLWFjY29yZGlvbicpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGFjY29yZGlvbkVuYWJsZWQgPSBmYWxzZTsgLy8gcmVpbml0IGFmdGVyIGFqYXhcbiAgICAgICAgICAgICAgICBjaGVja0FjY29yZGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pO1xuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTsiLCIoZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBzY3JvbGxUb0Zvcm1FcnJvciA9IChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIGNvbnRhaW5lciA9ICQoJy5qcy1zY3JvbGwtdG8tZXJyb3InKTtcbiAgICAgICAgdmFyIGFuY2hvciA9ICQoJy5qcy1zY3JvbGwtdG8tYW5jaG9yJyk7XG4gICAgICAgIHZhciBlcnJvciA9ICcuaW52YWxpZCc7XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgICAgIGlmIChjb250YWluZXIuZmluZChlcnJvcikubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAkKCdib2R5LCBodG1sJykuYW5pbWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IGFuY2hvci5vZmZzZXQoKS50b3BcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluaXQ6IGluaXRcbiAgICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgdmFyIHZhbGlkYXRlQ29udGFjdEZvcm0gPSAoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHZhciBjb250YWluZXIgPSAkKCcjY29udGFjdC1mb3JtJyk7XG4gICAgICAgIHZhciBlcnJvckNsYXNzID0gJ2ludmFsaWQnO1xuXG4gICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG5cbiAgICAgICAgICAgIGNvbnRhaW5lci5maW5kKCcuanMtc3VibWl0LWZvcm0nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5maW5kKCcudmFsaWRhdGlvbldyYXBwZXInKS5yZW1vdmVDbGFzcyhlcnJvckNsYXNzKTtcblxuICAgICAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IGNvbnRhaW5lci5maW5kKCcucmVxdWlyZWQnKTtcbiAgICAgICAgICAgICAgICAkLmVhY2gocmVxdWlyZWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkKHRoaXMpLnZhbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnBhcmVudHMoJy52YWxpZGF0aW9uV3JhcHBlcicpLmFkZENsYXNzKGVycm9yQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLmZpbmQoJy4nICsgZXJyb3JDbGFzcykubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICBncmVjYXB0Y2hhLmV4ZWN1dGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluaXQ6IGluaXRcbiAgICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgc2Nyb2xsVG9Gb3JtRXJyb3IuaW5pdCgpO1xuICAgIHZhbGlkYXRlQ29udGFjdEZvcm0uaW5pdCgpO1xufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7XG4iLCIoZnVuY3Rpb24oJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGltYWdlc0xvYWRlZCA9IHJlcXVpcmUoJ2ltYWdlc2xvYWRlZCcpO1xuICAgIHZhciBNYXNvbnJ5ID0gcmVxdWlyZSgnbWFzb25yeS1sYXlvdXQnKTtcbiAgICB2YXIgZ3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1tc25yeS1ncmlkJyk7XG4gICAgdmFyIG1zbnJ5O1xuXG4gICAgaWYgKCFncmlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbWFnZXNMb2FkZWQoIGdyaWQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBtc25yeSA9IG5ldyBNYXNvbnJ5KGdyaWQsIHtcbiAgICAgICAgICAgIGd1dHRlcjogMTAsXG4gICAgICAgICAgICBpdGVtU2VsZWN0b3I6ICcubXNucnktZ3JpZF9faXRlbScsXG4gICAgICAgICAgICBjb2x1bW5XaWR0aDogJy5tc25yeS1ncmlkX19zaXplcicsXG4gICAgICAgICAgICBwZXJjZW50UG9zaXRpb246IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuIiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgaW5pdCA9IG51bGw7XG4gICAgdmFyICRlbGVtZW50ID0gJCgnLmpzLXN0aWNreS1jdGEnKTtcblxuICAgIGZ1bmN0aW9uIHN0aWNreUNUQSgpIHtcblxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICAgICAgcmV0dXJuIFVJa2l0LnN0aWNreSgkZWxlbWVudCwge3RvcDogMjAwfSk7XG4gICAgICAgIH1cblxuICAgICAgICAkZWxlbWVudC5vbih7XG4gICAgICAgICAgICAnYWN0aXZlLnVrLnN0aWNreScgOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkZWxlbWVudC5jc3Moe3RvcDogJ2luaGVyaXQnLCBib3R0b206IDB9KTtcbiAgICAgICAgICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ3N0aWNreS1jdGEnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnaW5hY3RpdmUudWsuc3RpY2t5JyA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICRlbGVtZW50LmNzcyh7dG9wOiAnJywgYm90dG9tOiAnJ30pO1xuICAgICAgICAgICAgICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygnc3RpY2t5LWN0YScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkKHdpbmRvdykub24oJ3Njcm9sbCBsb2FkJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cbiAgICAgICAgICAgIHZhciB0b3AgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSArICQod2luZG93KS5oZWlnaHQoKTtcbiAgICAgICAgICAgIHZhciBmb290ZXIgPSAkKGRvY3VtZW50KS5vdXRlckhlaWdodCgpIC0gJCgnLnRtLWZvb3RlcicpLm91dGVySGVpZ2h0KCk7XG5cbiAgICAgICAgICAgIGlmICghJGVsZW1lbnQuaGFzQ2xhc3MoJ3VrLWFjdGl2ZScpICkge1xuICAgICAgICAgICAgICAgICRlbGVtZW50LmNzcyh7IHRvcDogJycsIHBvc2l0aW9uOiAnJyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0b3AgPj0gZm9vdGVyKSB7XG4gICAgICAgICAgICAgICAgJGVsZW1lbnQuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBmb290ZXIgLSAkZWxlbWVudC5vdXRlckhlaWdodCgpIC0gJCgnLmpzLXN0aWNreS1oZWFkZXInKS5vdXRlckhlaWdodCgpLFxuICAgICAgICAgICAgICAgICAgICBib3R0b206ICcnLFxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkZWxlbWVudC5jc3Moe1xuICAgICAgICAgICAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogJ2luaGVyaXQnLFxuICAgICAgICAgICAgICAgICAgICAvLyB0b3A6ICQod2luZG93KS5oZWlnaHQoKSAtICRlbGVtZW50Lm91dGVySGVpZ2h0KCksXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaW5pdCA9IGluaXQoKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFRhYnMgc2l6ZXJcbiAgICAqKi9cbiAgICBmdW5jdGlvbiB0bVRhYnMoKSB7XG4gICAgICAgIHZhciBjb250YWluZXIgPSAkKCcuanMtdG0tdGFicy1pbm5lcicpO1xuICAgICAgICB2YXIgZWxlbXMgPSBjb250YWluZXIuZmluZCgnLnRtLXRhYnMtY2FyZCcpO1xuICAgICAgICB2YXIgY29udGFpbmVyVyA9IDA7XG5cbiAgICAgICAgZWxlbXMuZWFjaChmdW5jdGlvbihpLCBlKXtcbiAgICAgICAgICAgIGNvbnRhaW5lclcgKz0gJChlKS5vdXRlcldpZHRoKHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29udGFpbmVyLmNzcyh7IHdpZHRoOiBjb250YWluZXJXIH0pO1xuICAgICAgICBjb250YWluZXIucGFyZW50cygnLnVrLXN0aWNreS1wbGFjZWhvbGRlcicpLmNzcyh7IGhlaWdodDogY29udGFpbmVyLmZpbmQoJy50bS10YWJzLWNhcmQnKS5maXJzdCgpLm91dGVySGVpZ2h0KHRydWUpIH0pO1xuICAgIH1cblxuICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gJCgnLmpzLXRtLXRhYnMtaW5uZXInKTtcbiAgICAgICAgdmFyIGVsZW1zID0gY29udGFpbmVyLmZpbmQoJy50bS10YWJzLWNhcmQnKTtcbiAgICAgICAgdmFyIGNvbnRhaW5lclcgPSAwO1xuICAgICAgICBjb250YWluZXIuY3NzKHsgd2lkdGg6IDE0MDAgfSk7XG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGVsZW1zLmVhY2goZnVuY3Rpb24oaSwgZSl7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyVyArPSAkKGUpLm91dGVyV2lkdGgodHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5jc3MoeyB3aWR0aDogY29udGFpbmVyVyB9KTtcbiAgICAgICAgfSwgMjUwKTtcbiAgICB9KTtcblxuICAgIHZhciBzdGlja3lDVEEgPSBzdGlja3lDVEEoKTtcbiAgICB2YXIgdG1UYWJzID0gdG1UYWJzKCk7XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuIiwiLypcblBvc3NpYmxlIEZpZWxkczpcblx0dXJpICAgICBBbGlhczogdXJsLCBGYWxsYmFjazogbG9jYXRpb24uaHJlZlxuXHR0aXRsZSAgIEZhbGxiYWNrOiBvZzp0aXRsZSwgPHRpdGxlPlxuXHRtZXNzYWdlIEZhbGxiYWNrOiBmaWVsZCB0aXRsZVxuXHRpbWFnZSAgIEZhbGxiYWNrOiBvZzppbWFnZVxuXG5BbGwgZmllbGRzIGNhbiBiZSBkZWZpbmVkIGF0IGEgc3BlY2lmaWMgc2hhcmVyIG9yIGF0IHRoZSBwYXJlbnQgZWxlbWVudCBhcyBkYXRhIHRhZzpcbjx1bCBjbGFzcz1cInNoYXJlclwiIGRhdGEtdGl0bGU9XCJTaGFyZXIgdGl0bGVcIiBkYXRhLW1lc3NhZ2U9XCJGdWxsIHNoYXJpbmcgbWVzc2FnZVwiPlxuXHQ8bGkgY2xhc3M9XCJ0d2l0dGVyXCIgZGF0YS1tZXNzYWdlPVwiU2hvcnQgdHdpdHRlciBtZXNzYWdlXCI+PC9saT5cblx0PGxpIGNsYXNzPVwiZmFjZWJvb2tcIj48L2xpPlxuPC91bD5cblxuU2hhcmVycyB3aXRoIHVzZWQgZmllbGRzOlxuXHRmYWNlYm9vazogICB0aXRsZSwgdXJpXG5cdHR3aXR0ZXI6ICAgIG1lc3NhZ2UsIHVyaVxuXHRnb29nbGVwbHVzOiB1cmlcblx0cGludGVyZXN0OiAgdXJpLCBpbWFnZSwgbWVzc2FnZVxuXHRtYWlsOiAgICAgICB0aXRsZSwgbWVzc2FnZSwgdXJpXHQtIHVzZSAmIzEwOyBmw7xyIGxpbmUgYnJlYWtzIGluIG1lc3NhZ2VcblxuKi9cbihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBnZXR0ZXIgPSB7fTtcblxuICBnZXR0ZXIudXJpID0gZnVuY3Rpb24gZ2V0VXJpKGVsKSB7XG4gICAgdmFyIHVyaTtcblxuICAgIHVyaSA9IHVyaSB8fCBlbC5kYXRhKCd1cmknKTtcbiAgICB1cmkgPSB1cmkgfHwgZWwuZGF0YSgndXJsJyk7XG4gICAgdXJpID0gdXJpIHx8IGVsLmNsb3Nlc3QoJy5zaGFyZXInKS5kYXRhKCd1cmknKTtcbiAgICB1cmkgPSB1cmkgfHwgZWwuY2xvc2VzdCgnLnNoYXJlcicpLmRhdGEoJ3VybCcpO1xuICAgIHVyaSA9IHVyaSB8fCBsb2NhdGlvbi5ocmVmO1xuXG4gICAgcmV0dXJuIHVyaTtcbiAgfTtcblxuICBnZXR0ZXIudGl0bGUgPSBmdW5jdGlvbiBnZXRUaXRsZShlbCkge1xuICAgIHZhciB0aXRsZTtcblxuICAgIHRpdGxlID0gdGl0bGUgfHwgZWwuZGF0YSgndGl0bGUnKTtcbiAgICB0aXRsZSA9IHRpdGxlIHx8IGVsLmNsb3Nlc3QoJy5zaGFyZXInKS5kYXRhKCd0aXRsZScpO1xuICAgIHRpdGxlID0gdGl0bGUgfHwgJCgnbWV0YVtwcm9wZXJ0eT1cIm9nOnRpdGxlXCJdJykucHJvcCgnY29udGVudCcpO1xuICAgIHRpdGxlID0gdGl0bGUgfHwgJCgndGl0bGUnKS50ZXh0KCk7XG5cbiAgICByZXR1cm4gdGl0bGU7XG4gIH07XG5cbiAgZ2V0dGVyLm1lc3NhZ2UgPSBmdW5jdGlvbiBnZXRNZXNzYWdlKGVsKSB7XG4gICAgdmFyIG1lc3NhZ2U7XG5cbiAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCBlbC5kYXRhKCdtZXNzYWdlJyk7XG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgZWwuY2xvc2VzdCgnLnNoYXJlcicpLmRhdGEoJ21lc3NhZ2UnKTtcbiAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCBnZXR0ZXIudGl0bGUoZWwpO1xuXG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH07XG5cbiAgZ2V0dGVyLmltYWdlID0gZnVuY3Rpb24gZ2V0TWVzc2FnZShlbCkge1xuICAgIHZhciBpbWFnZTtcblxuICAgIGltYWdlID0gaW1hZ2UgfHwgZWwuZGF0YSgnaW1hZ2UnKTtcbiAgICBpbWFnZSA9IGltYWdlIHx8IGVsLmNsb3Nlc3QoJy5zaGFyZXInKS5kYXRhKCdpbWFnZScpO1xuICAgIGltYWdlID0gaW1hZ2UgfHwgJCgnbWV0YVtwcm9wZXJ0eT1cIm9nOmltYWdlXCJdJykucHJvcCgnY29udGVudCcpO1xuXG4gICAgcmV0dXJuIGltYWdlO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHBvcHVwKHVyaSwgd2lkdGgsIGhlaWdodCkge1xuICAgIG9wZW4odXJpLCAnc2hhcmVyJywgJ3dpZHRoPScgKyB3aWR0aCArICcsaGVpZ2h0PScgKyBoZWlnaHQpO1xuICB9XG5cbiAgdmFyIHNoYXJlSGFuZGxlcnMgPSB7XG4gICAgZmFjZWJvb2s6IHtcbiAgICAgIHVyaTogJ2h0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9zaGFyZXIvc2hhcmVyLnBocD91PSV1cmklJnBbdGl0bGVdPSV0aXRsZSUmZGlzcGxheT1wb3B1cCcsXG4gICAgICByZXBsYWNlbWVudHM6IFsndGl0bGUnLCAndXJpJ10sXG4gICAgICB3aWR0aDogNjUwLFxuICAgICAgaGVpZ2h0OiAzMjBcbiAgICB9LFxuICAgIHR3aXR0ZXI6IHtcbiAgICAgIHVyaTogJ2h0dHBzOi8vdHdpdHRlci5jb20vaW50ZW50L3R3ZWV0P3RleHQ9JW1lc3NhZ2UlJnVybD0ldXJpJScsXG4gICAgICByZXBsYWNlbWVudHM6IFsnbWVzc2FnZScsICd1cmknXSxcbiAgICAgIHdpZHRoOiA1MjAsXG4gICAgICBoZWlnaHQ6IDI2MFxuICAgIH0sXG4gICAgZ29vZ2xlcGx1czoge1xuICAgICAgdXJpOiAnaHR0cHM6Ly9wbHVzLmdvb2dsZS5jb20vc2hhcmU/dXJsPSV1cmklJyxcbiAgICAgIHJlcGxhY2VtZW50czogWyd1cmknXSxcbiAgICAgIHdpZHRoOiA1MTAsXG4gICAgICBoZWlnaHQ6IDM5MFxuICAgIH0sXG4gICAgcGludGVyZXN0OiB7XG4gICAgICB1cmk6ICdodHRwOi8vcGludGVyZXN0LmNvbS9waW4vY3JlYXRlL2J1dHRvbi8/dXJsPSV1cmklJm1lZGlhPSVpbWFnZSUmZGVzY3JpcHRpb249JW1lc3NhZ2UlJyxcbiAgICAgIHJlcGxhY2VtZW50czogWyd1cmknLCAnaW1hZ2UnLCAnbWVzc2FnZSddLFxuICAgICAgd2lkdGg6IDUxMCxcbiAgICAgIGhlaWdodDogMzkwXG4gICAgfSxcbiAgICBtYWlsOiB7XG4gICAgICB1cmk6ICdtYWlsdG86P3N1YmplY3Q9JXRpdGxlJSZib2R5PSVtZXNzYWdlJSAldXJpJScsXG4gICAgICByZXBsYWNlbWVudHM6IFsndGl0bGUnLCAnbWVzc2FnZScsICd1cmknXSxcbiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uICh1cmkpIHtcbiAgICAgICAgbG9jYXRpb24uaHJlZiA9IHVyaTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIGluaXQgPSBmdW5jdGlvbiBpbml0U2hhcmVyKCkge1xuICAgICQuZWFjaChzaGFyZUhhbmRsZXJzLCBmdW5jdGlvbiAobmFtZSwgdmFsdWVzKSB7XG4gICAgICAkKCdib2R5Jykub24oJ2NsaWNrIHRvdWNoZW5kJywgJy5zaGFyZXIgLicgKyBuYW1lLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHZhciBlbCA9ICQodGhpcyk7XG4gICAgICAgIHZhciB1cmkgPSB2YWx1ZXMudXJpO1xuICAgICAgICAkLmVhY2godmFsdWVzLnJlcGxhY2VtZW50cywgZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgICAgICB1cmkgPSB1cmkucmVwbGFjZShuZXcgUmVnRXhwKCclJyArIHYgKyAnJScpLCBlbmNvZGVVUklDb21wb25lbnQoZ2V0dGVyW3ZdKGVsKSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSB2YWx1ZXMuaGFuZGxlciB8fCBwb3B1cDtcbiAgICAgICAgaGFuZGxlcih1cmksIHZhbHVlcy53aWR0aCwgdmFsdWVzLmhlaWdodCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgc2VsZiA9IHtcbiAgICBpbml0OiBpbml0LFxuICAgIGdldHRlcjogZ2V0dGVyLFxuICAgIHBvcHVwOiBwb3B1cCxcbiAgICBoYW5kbGVyczogc2hhcmVIYW5kbGVyc1xuICB9O1xuXG4gIHNlbGYuaW5pdCgpO1xuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTtcbiIsIihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8gb24gc2xpZGUgY2hhbmdlIHJlc2V0IHZpZGVvIGluc2lkZSBsYXN0IHNsaWRlXG4gICAgJCgnW2RhdGEtdWstc2xpZGVzaG93XScpLm9uKCdzaG93LnVrLnNsaWRlc2hvdycsIGZ1bmN0aW9uIChldmVudCwgbmV4dFNsaWRlLCBjdXJyZW50U2xpZGUpIHtcbiAgICAgICAgdmFyICRzbGlkZSA9ICQoY3VycmVudFNsaWRlKSxcbiAgICAgICAgICAgICR2aWRlbyA9ICRzbGlkZS5maW5kKCd2aWRlbycpLFxuICAgICAgICAgICAgJHZpZGVvQ29udGFpbmVyID0gJHNsaWRlLmZpbmQoJy5qcy12aWRlbycpLFxuICAgICAgICAgICAgJHBsYXlDb250cm9sID0gJHNsaWRlLmZpbmQoJy5qcy12aWRlby1wbGF5JyksXG4gICAgICAgICAgICAkcGF1c2VDb250cm9sID0gJHNsaWRlLmZpbmQoJy5qcy12aWRlby1wYXVzZScpLFxuICAgICAgICAgICAgJG11dGVDb250cm9sID0gJHNsaWRlLmZpbmQoJy5qcy12aWRlby1tdXRlJyk7XG5cbiAgICAgICAgaWYgKCR2aWRlby5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAkdmlkZW8uY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICR2aWRlb1swXS5wYXVzZSgpO1xuICAgICAgICAgICAgJHZpZGVvQ29udGFpbmVyLnJlbW92ZUNsYXNzKCd0bS12aWRlby0taXMtcGxheWluZycpO1xuXG4gICAgICAgICAgICAkcGF1c2VDb250cm9sLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAkbXV0ZUNvbnRyb2wuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICRwbGF5Q29udHJvbC5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWJsb2NrJyk7XG5cbiAgICAgICAgICAgICR2aWRlb1swXS5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGNhcGl0YWxpemVIZWFkbGluZXMoKSB7XG4gICAgICAgIHZhciBoZWFkbGluZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmFuY3ktaGVhZGxpbmUnKTtcblxuICAgICAgICBoZWFkbGluZXMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7XG5cbiAgICAgICAgICAgIHZhciBzdHIgPSBlbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgICAgIHZhciBsZXR0ZXJzID0gc3RyLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIHZhciAgIG91dHB1dCA9ICcnO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaTxsZXR0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNVcHBlckNhc2UobGV0dGVyc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9ICc8c3BhbiBjbGFzcz1cImNhcFwiPicgKyBsZXR0ZXJzW2ldICsgJzwvc3Bhbj4nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBsZXR0ZXJzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBvdXRwdXQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXBwZXJDYXNlKGNoYXIpe1xuICAgICAgICByZXR1cm4gY2hhciA9PSBjaGFyLnRvVXBwZXJDYXNlKCkgJiYgY2hhciAhPSBjaGFyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgY2FwaXRhbGl6ZUhlYWRsaW5lcygpO1xuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTtcbiIsIihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHNtb290aFNjcm9sbGVyID0gbnVsbCxcbiAgICAgICAgJGVsZW1lbnQgPSAkKCcuanMtc21vb3RoLXNjcm9sbCcpO1xuXG4gICAgJGVsZW1lbnQuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XG5cbiAgICAgICAgJHRoaXMub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9mZnNldEFkZCA9IDA7XG5cbiAgICAgICAgICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA8IDk2MCkge1xuICAgICAgICAgICAgICAgIG9mZnNldEFkZCA9ICQoJyN0bS1oZWFkZXInKS5vdXRlckhlaWdodCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvZmZzZXRBZGQgPSAkKCcjdG0taGVhZGVyJykub3V0ZXJIZWlnaHQoKSAvIDI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSAkdGhpcy5wYXJlbnRzKCcudG0tYmxvY2snKS5vdXRlckhlaWdodCgpICsgb2Zmc2V0QWRkO1xuXG4gICAgICAgICAgICAkKFwiaHRtbCxib2R5XCIpLnN0b3AoKS5hbmltYXRlKHtzY3JvbGxUb3A6IG9mZnNldH0sIDEwMDAsICdlYXNlT3V0RXhwbycpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7IiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgc3RpY2t5SGVhZGVyID0gbnVsbCxcbiAgICAgICAgJGVsZW1lbnQgPSAkKCcuanMtc3RpY2t5LWhlYWRlcicpLFxuICAgICAgICAkaGVhZGVyID0gJGVsZW1lbnQuZmluZCgnLnRtLWhlYWRlcicpLFxuICAgICAgICAkbW9iaWxlTWVudSA9ICQoJyN0bS1tZW51LW1vYmlsZScpLFxuICAgICAgICAkbW9iaWxlTWVudUhvb2sgPSAkKCcuanMtc3RpY2t5LW1vYmlsZS1tZW51JyksXG4gICAgICAgIG1vYmlsZU1lbnVJc0Nsb3NlZCA9ICRtb2JpbGVNZW51Lmhhc0NsYXNzKCd0bS1tZW51LW1vYmlsZS0taXMtY2xvc2VkJyksXG4gICAgICAgIHNocmlua1RyaWdnZXJPZmZzZXQgPSAxMDgsXG4gICAgICAgIHBsYWNlaG9sZGVyTWluSGVpZ2h0ID0gNjI7XG5cbiAgICBmdW5jdGlvbiBpc01vYmlsZSgpIHtcbiAgICAgICAgcmV0dXJuICF3aW5kb3cubWF0Y2hNZWRpYSgnKG1pbi13aWR0aDogOTYwcHgpJykubWF0Y2hlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblNjcm9sbFNocmluaygpIHtcbiAgICAgICAgdmFyIHNjcm9sbFRvcCA9ICQod2luZG93KS5zY3JvbGxUb3AoKSxcbiAgICAgICAgICAgIHNocmlua09uID0gc2hyaW5rVHJpZ2dlck9mZnNldCxcbiAgICAgICAgICAgIGNsc2FjdGl2ZSA9ICd0bS1oZWFkZXItLXNtYWxsJztcblxuICAgICAgICBpZiAoc2Nyb2xsVG9wID4gc2hyaW5rT24pIHtcbiAgICAgICAgICAgICRoZWFkZXIuYWRkQ2xhc3MoY2xzYWN0aXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRoZWFkZXIucmVtb3ZlQ2xhc3MoY2xzYWN0aXZlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW9iaWxlTWVudUNsaWNrKCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnb25Nb2JpbGVNZW51Q2xpY2snKTtcbiAgICAgICAgbW9iaWxlTWVudUlzQ2xvc2VkID0gIW1vYmlsZU1lbnVJc0Nsb3NlZDtcblxuICAgICAgICAkZWxlbWVudC5jc3Moe1xuICAgICAgICAgICAgJ3Bvc2l0aW9uJzogJ2ZpeGVkJyxcbiAgICAgICAgICAgICd0b3AnOiAwLFxuICAgICAgICAgICAgJ3dpZHRoJzogJCh3aW5kb3cpLndpZHRoKClcbiAgICAgICAgfSkuYWRkQ2xhc3MoJ3VrLWFjdGl2ZScpO1xuXG4gICAgICAgIGlmIChtb2JpbGVNZW51SXNDbG9zZWQpIHtcbiAgICAgICAgICAgICRlbGVtZW50LmNzcyh7XG4gICAgICAgICAgICAgICAgJ2hlaWdodCc6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICAnb3ZlcmZsb3cteSc6ICd2aXNpYmxlJ1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICQoJ2JvZHksIGh0bWwnKS5yZW1vdmVDbGFzcygnanMtZGlzYWJsZWQtc2Nyb2xsaW5nJyk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRlbGVtZW50LmNzcyh7XG4gICAgICAgICAgICAgICAgJ2hlaWdodCc6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICAnb3ZlcmZsb3cteSc6ICdzY3JvbGwnXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJCgnYm9keSwgaHRtbCcpLmFkZENsYXNzKCdqcy1kaXNhYmxlZC1zY3JvbGxpbmcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0aWNreUhlYWRlci5zdGlja3kub3B0aW9ucy5zaG93dXAgPSBtb2JpbGVNZW51SXNDbG9zZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVjYWxjV3JhcHBlckhlaWdodCgpIHtcbiAgICAgICAgdmFyIHBsYWNlaG9sZGVySGVpZ2h0ID0gJGVsZW1lbnQub3V0ZXJIZWlnaHQoKSA+IHBsYWNlaG9sZGVyTWluSGVpZ2h0ID8gJGVsZW1lbnQub3V0ZXJIZWlnaHQoKSA6IHBsYWNlaG9sZGVyTWluSGVpZ2h0O1xuICAgICAgICAkZWxlbWVudC5wYXJlbnQoKS5oZWlnaHQocGxhY2Vob2xkZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluaXRTdGlja3koKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgYW5pbWF0aW9uOiAndWstYW5pbWF0aW9uLXNsaWRlLXRvcCdcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIWlzTW9iaWxlKCkpIHtcbiAgICAgICAgICAgICQod2luZG93KS5vbignc2Nyb2xsJywgb25TY3JvbGxTaHJpbmspO1xuICAgICAgICB9XG5cbiAgICAgICAgJG1vYmlsZU1lbnVIb29rLm9uKCdjbGljaycsIG9uTW9iaWxlTWVudUNsaWNrKTtcblxuICAgICAgICByZXR1cm4gVUlraXQuc3RpY2t5KCRlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZScsIFVJa2l0LlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uIChldmVudCkge1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzdGF0ZUlzTW9iaWxlJywgaXNNb2JpbGUoKSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzdGlja3lIZWFkZXIub3B0aW9ucy5zaG93dXAnLCBzdGlja3lIZWFkZXIub3B0aW9ucy5zaG93dXApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnc3RpY2t5SGVhZGVyLm9wdGlvbnMuc2hvd3VwICE9PSBzdGF0ZUlzTW9iaWxlJywgc3RpY2t5SGVhZGVyLm9wdGlvbnMuc2hvd3VwICE9PSBpc01vYmlsZSgpKTtcblxuICAgICAgICAvLyBpZiBtb2JpbGUgKDwgOTYwcHgpLCByZW1vdmUgbGlzdGVuZXIgZm9yIGhlYWRlciBzaHJpbmtpbmcgYW5kIGFjdGl2YXRlIHNob3d1cCBmZWF0dXJlXG4gICAgICAgIGlmIChpc01vYmlsZSgpKSB7XG4gICAgICAgICAgICAkKHdpbmRvdykub2ZmKCdzY3JvbGwnLCBvblNjcm9sbFNocmluayk7XG5cbiAgICAgICAgICAgIGlmICgkaGVhZGVyLmhhc0NsYXNzKCd0bS1oZWFkZXItLXNtYWxsJykpIHtcbiAgICAgICAgICAgICAgICAkaGVhZGVyLnJlbW92ZUNsYXNzKCd0bS1oZWFkZXItLXNtYWxsJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQod2luZG93KS5vbignc2Nyb2xsJywgb25TY3JvbGxTaHJpbmspO1xuICAgICAgICAgICAgb25TY3JvbGxTaHJpbmsoKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgcmVjYWxjV3JhcHBlckhlaWdodCgpO1xuXG4gICAgfSwgMjAwKSk7XG5cbiAgICBzdGlja3lIZWFkZXIgPSBpbml0U3RpY2t5KCk7XG5cbiAgICAkKGRvY3VtZW50KS5vbigndG91Y2htb3ZlJywgJy5qcy1kaXNhYmxlZC1zY3JvbGxpbmcnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICB2YXIgbWVudUhlaWdodCA9ICRtb2JpbGVNZW51Lm91dGVySGVpZ2h0KCkgKyAkKCcjdG0taGVhZGVyJykub3V0ZXJIZWlnaHQoKSxcbiAgICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0ID0gJCh3aW5kb3cpLm91dGVySGVpZ2h0KCk7XG5cbiAgICAgICAgaWYgKG1lbnVIZWlnaHQgPCB2aWV3cG9ydEhlaWdodCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTtcbiIsIihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGluaXQgPSBudWxsO1xuICAgIHZhciBvZmZzZXRUb3AgPSBudWxsO1xuICAgIHZhciAkc3VibWVudSA9ICQoJy5qcy1zdGlja3ktc3VibWVudScpO1xuICAgIHZhciAkdGFibWVudSA9ICQoJy5qcy1zdGlja3ktdGFibWVudScpO1xuICAgIHZhciAkaGVhZGVyID0gJCgnLmpzLXN0aWNreS1oZWFkZXIgLnRtLWhlYWRlcicpO1xuICAgIHZhciBvZmZzZXRUb3BNZWRpdW0gPSAxMDI7XG4gICAgdmFyIG9mZnNldFRvcFNtYWxsID0gNjI7XG5cbiAgICAvLyBTbGlkZSB0byBhbmNob3JcbiAgICAkKCcuanMtc2VjdGlvbi1tZW51IGEnKS5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB2YXIgaHJlZiA9ICQodGhpcykuYXR0cignaHJlZicpO1xuXG4gICAgICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdqcy1saW5rJykgfHwgaHJlZi5pbmRleE9mKCcjJykgPT0gJy0xJykge1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgYVRhZyA9ICQoJCh0aGlzKS5hdHRyKCdocmVmJykpO1xuXG4gICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ3VsJykuZmluZCgnLmFjdGl2ZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnbGknKS5hZGRDbGFzcygnYWN0aXZlJyk7XG5cbiAgICAgICAgICAgIHNjcm9sbFRvcChhVGFnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgJCgnLmpzLXNlY3Rpb24tbWVudS1tb2JpbGUnKS5vbignc2VsZWN0MjpzZWxlY3RpbmcnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIHZhciBhVGFnID0gJCgkKCcuanMtc2VjdGlvbi1tZW51LW1vYmlsZScpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmF0dHIoJ2RhdGEtaHJlZicpKTtcblxuICAgICAgICBpZiAoJCh0aGlzKS5maW5kKFwiOnNlbGVjdGVkXCIpLmhhc0NsYXNzKCdqcy1saW5rJykpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICQodGhpcykuZmluZChcIjpzZWxlY3RlZFwiKS5kYXRhKCdocmVmJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY3JvbGxUb3AoYVRhZyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHNjcm9sbFRvcChhVGFnKSB7XG4gICAgICAgIGlmICghYVRhZy5vZmZzZXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9mZnNldCA9IHNldE9mZnNldFRvcCgpICsgJHN1Ym1lbnUub3V0ZXJIZWlnaHQodHJ1ZSk7XG4gICAgICAgICQoJ2h0bWwsYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDogYVRhZy5vZmZzZXQoKS50b3AsIGVhc2U6ICdlYXNlaW5vdXQnfSwgNTAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vYmlsZSgpIHtcbiAgICAgICAgcmV0dXJuICF3aW5kb3cubWF0Y2hNZWRpYSgnKG1pbi13aWR0aDogMTIyMHB4KScpLm1hdGNoZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9wKCkge1xuXG4gICAgICAgIHZhciBvZmZzZXRUb3AgPSBvZmZzZXRUb3BTbWFsbDtcblxuICAgICAgICBpZighaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgb2Zmc2V0VG9wID0gb2Zmc2V0VG9wTWVkaXVtO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9mZnNldFRvcDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb3BUYWJzKCkge1xuXG4gICAgICAgIHZhciBvZmZzZXRUb3AgPSBvZmZzZXRUb3BTbWFsbDtcblxuICAgICAgICBpZighaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgb2Zmc2V0VG9wID0gb2Zmc2V0VG9wTWVkaXVtO1xuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gb2Zmc2V0VG9wO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0aWNreVN1Ym1lbnUoKSB7XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHRvcDogc2V0T2Zmc2V0VG9wKCksXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uOiAndWstYW5pbWF0aW9uLXNsaWRlLXRvcCdcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBVSWtpdC5zdGlja3koJHN1Ym1lbnUsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgJHN1Ym1lbnUub24oe1xuICAgICAgICAgICAgJ2FjdGl2ZS51ay5zdGlja3knIDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCgnYm9keScpLmFkZENsYXNzKCdzdGlja3ktc3VibWVudScpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdpbmFjdGl2ZS51ay5zdGlja3knIDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdzdGlja3ktc3VibWVudScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZScsIFVJa2l0LlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uIChldmVudCkge1xuXG4gICAgICAgICAgICBVSWtpdC5zdGlja3koJHN1Ym1lbnUpLm9wdGlvbnMudG9wID0gc2V0T2Zmc2V0VG9wKCk7XG5cbiAgICAgICAgfSwgMjAwKSk7XG5cbiAgICAgICAgaW5pdCA9IGluaXQoKTtcbiAgICB9XG5cbiAgICB2YXIgc3RpY2t5U3VibWVudSA9IHN0aWNreVN1Ym1lbnUoKTtcblxuXG4gICAgZnVuY3Rpb24gc3RpY2t5VGFibWVudSgpIHtcbiAgICAgICAgdmFyIGVsZW0gPSAkKCcuanMtc3RpY2t5LXRhYm1lbnUnKTtcblxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiBzZXRPZmZzZXRUb3BUYWJzKCksXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uOiAndWstYW5pbWF0aW9uLXNsaWRlLXRvcCcsXG4gICAgICAgICAgICAgICAgYm91bmRhcnk6ICcjYm91bmRhcnknXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gVUlraXQuc3RpY2t5KGVsZW0sIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbS5vbih7XG4gICAgICAgICAgICAnYWN0aXZlLnVrLnN0aWNreScgOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ3N0aWNreS10YWJtZW51Jyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2luYWN0aXZlLnVrLnN0aWNreScgOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3N0aWNreS10YWJtZW51Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQod2luZG93KS5vbigncmVzaXplJywgVUlraXQuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24gKGV2ZW50KSB7XG5cbiAgICAgICAgICAgIFVJa2l0LnN0aWNreShlbGVtKS5vcHRpb25zLnRvcCA9IHNldE9mZnNldFRvcFRhYnMoKTtcblxuICAgICAgICB9LCAyMDApKTtcblxuICAgICAgICBpbml0ID0gaW5pdCgpO1xuICAgIH1cblxuICAgIHZhciBzdGlja3lUYWJtZW51ID0gc3RpY2t5VGFibWVudSgpO1xuXG4gICAgJCgnLmpzLXN0aWNreS10YWJtZW51Jykub24oJ3Nob3cudWsuc3dpdGNoZXInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCQoJy5qcy10YWJzLWNvbnRlbnQnKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9ICQoJy5qcy10YWJzLWNvbnRlbnQnKS5vZmZzZXQoKS50b3AgLSAkKCcuanMtc3RpY2t5LXRhYm1lbnUnKS5vdXRlckhlaWdodCh0cnVlKSAtIHNldE9mZnNldFRvcCgpO1xuICAgICAgICAgICAgICAgICQoJ2h0bWwsYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDogb2Zmc2V0LCBlYXNlOiAnZWFzZWlub3V0J30sIDApO1xuXG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTtcbiIsIihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8gRmlsbCBUYWJsZSB3aXRoIGVtcHR5IGl0ZW1zIGlmIG5lZWRlZFxuICAgIGZ1bmN0aW9uIGZpbGxUYWJsZSgpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9ICQoJy5qcy10bS10YWJsZScpO1xuICAgICAgICB2YXIgZW1wdHkgPSAnPGRpdiBjbGFzcz1cInRtLXRhYmxlX19ncmlkIHRtLXRhYmxlX19ncmlkX19pdGVtIHRtLXRhYmxlX19ncmlkLS1lbXB0eVwiPjwvZGl2PidcbiAgICAgICAgdmFyIGl0ZW1zQXJyYXkgPSBbXTtcbiAgICAgICAgdmFyIG1heFJvd3MgPSBbXTtcbiAgICAgICAgdmFyIGZpbGwgPSAwO1xuXG4gICAgICAgICQuZWFjaChjb250YWluZXIsIGZ1bmN0aW9uIGdldEl0ZW1zKGkpIHtcbiAgICAgICAgICAgIGl0ZW1zQXJyYXlbaV0gPSBbXTtcbiAgICAgICAgICAgICQodGhpcykuZmluZCgnLnRtLXRhYmxlLWl0ZW0nKS5lYWNoKGZ1bmN0aW9uIGdldEl0ZW1zSW5uZXIgKGYpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSAkKHRoaXMpLmRhdGEoJ2l0ZW1zJyk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbHMgPSAkKHRoaXMpLmRhdGEoJ2NvbHMnKTtcbiAgICAgICAgICAgICAgICB2YXIgcm93cyA9IE1hdGguY2VpbChpdGVtcyAvIGNvbHMpO1xuXG4gICAgICAgICAgICAgICAgaXRlbXNBcnJheVtpXVtmXSA9IFtpdGVtcywgY29scywgcm93c107XG5cbiAgICAgICAgICAgICAgICBpZihtYXhSb3dzW2ldIDwgcm93cyB8fCBtYXhSb3dzW2ldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4Um93c1tpXSA9IHJvd3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQuZWFjaChpdGVtc0FycmF5LCBmdW5jdGlvbiBzZXRJdGVtcyhpLCBlKSB7XG5cbiAgICAgICAgICAgICQuZWFjaChlLCBmdW5jdGlvbiBzZXRJdGVtc0lubmVyIChmLCBnKSB7XG5cbiAgICAgICAgICAgICAgICBpZihnWzFdID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoZ1szXSAhPSBtYXhSb3dzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gbWF4Um93c1tpXSAtIGdbMF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgbSA9IDA7IG0gPCBmaWxsOyBtKysgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmpzLXRtLXRhYmxlOmVxKCcgKyBpICsgJyknKS5maW5kKCcudG0tdGFibGUtaXRlbTplcSgnICsgZiArICcpJykuYXBwZW5kKCQoZW1wdHkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKGdbMV0gPT0gMykge1xuICAgICAgICAgICAgICAgICAgICBpZihnWzNdICE9IG1heFJvd3NbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBtYXhSb3dzW2ldICogZ1sxXSAtIGdbMF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgbSA9IDA7IG0gPCBmaWxsOyBtKysgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmpzLXRtLXRhYmxlOmVxKCcgKyBpICsgJyknKS5maW5kKCcudG0tdGFibGUtaXRlbTplcSgnICsgZiArICcpJykuZmluZCgnLnRtLXRhYmxlX19ncmlkX19jb250YWluZXInKS5hcHBlbmQoJChlbXB0eSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZpbGxUYWJsZSgpO1xuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTtcbiIsIihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHNlbGVjdG9yID0gJCgnLmpzLWRvd25sb2FkLXRvZ2dsZSBpbnB1dFt0eXBlPWNoZWNrYm94XScpO1xuICAgIHZhciB0YXJnZXQgPSAkKCcuanMtZG93bmxvYWQtYnV0dG9uJyk7XG5cbiAgICBzZWxlY3Rvci5vbignY2hhbmdlJywgZnVuY3Rpb24gdG9nZ2xlRG93bmxvYWRCdXR0b24oKSB7XG5cbiAgICAgICAgaWYodGFyZ2V0Lmhhc0NsYXNzKCdwYW5lbC1kb3dubG9hZC0taGlkZGVuJykpIHtcbiAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnZGl2JykuZmFkZU91dChmdW5jdGlvbiBidXR0b25GYWRlSW4oKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LmZhZGVJbigpLnJlbW92ZUNsYXNzKCdwYW5lbC1kb3dubG9hZC0taGlkZGVuJyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9XG4gICAgfSk7XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuIiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgdmlkZW9Ib3ZlciA9IChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgICAgICQoJy5qcy12aWRlby1ob3ZlcicpLmhvdmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ3ZpZGVvJylbMF0ucGxheSgpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgndmlkZW8nKVswXS5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgndmlkZW8nKVswXS5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbml0OiBpbml0XG4gICAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIHZhciB2aWRlb0xpbmtzID0gKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICAgICAgJCgnLmpzLXZpZGVvLWxpbmtzJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyICRsaW5rcyA9ICQodGhpcykuZmluZCgnLnRtLXBhbmVsLXN0b3J5X19saW5rcyBsaScpO1xuICAgICAgICAgICAgICAgIHZhciBudW1iZXJPZkxpbmtzID0gJGxpbmtzLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIC8vIGJyZWFrIGlmIGxlc3MgdGhhbiAyIGxpbmtzXG4gICAgICAgICAgICAgICAgaWYgKG51bWJlck9mTGlua3MgPD0gMSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgJGxpbmtzLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciAkbGluayA9ICQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciAkcGFyZW50UGFuZWwgPSAkbGluay5wYXJlbnRzKCcuanMtcGFuZWwtc3RvcnknKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyICR2aWRlb0VsZW1lbnQgPSAkcGFyZW50UGFuZWwuZmluZCgndmlkZW8nKS5lcShpbmRleCk7XG5cbiAgICAgICAgICAgICAgICAgICAgJGxpbmsuaG92ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBhbGwgdmlkZW9zXG4gICAgICAgICAgICAgICAgICAgICAgICAkcGFyZW50UGFuZWwuZmluZCgndmlkZW8nKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGUgY29ycmVjdCB2aWRlb1xuICAgICAgICAgICAgICAgICAgICAgICAgJHZpZGVvRWxlbWVudC5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBwbGF5aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAkdmlkZW9FbGVtZW50WzBdLnBsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBwbGF5aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAkdmlkZW9FbGVtZW50WzBdLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCB2aWRlb1xuICAgICAgICAgICAgICAgICAgICAgICAgJHZpZGVvRWxlbWVudFswXS5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5pdDogaW5pdFxuICAgICAgICB9O1xuICAgIH0pKCk7XG5cbiAgICB2YXIgdmlkZW9Td2l0Y2hQb3N0ZXIgPSAoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG5cbiAgICAgICAgICAgIC8vJCh3aW5kb3cpLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgLy8gICAgY2hlY2tXaW5kb3dXaWR0aCgpO1xuICAgICAgICAgICAgLy99KTtcblxuICAgICAgICAgICAgY2hlY2tXaW5kb3dXaWR0aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tXaW5kb3dXaWR0aCgpIHtcbiAgICAgICAgICAgIHZhciB3V2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTtcblxuICAgICAgICAgICAgaWYgKHdXaWR0aCA+IDc2Nykge1xuICAgICAgICAgICAgICAgIGNoYW5nZVZpZGVvUG9zdGVyKCdsYXJnZScpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3V2lkdGggPiAzMjApIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VWaWRlb1Bvc3RlcignbWVkaXVtJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNoYW5nZVZpZGVvUG9zdGVyKCdzbWFsbCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjaGFuZ2VWaWRlb1Bvc3Rlcihwb3N0ZXJTaXplKSB7XG5cbiAgICAgICAgICAgICQoJ3ZpZGVvJykuZWFjaChmdW5jdGlvbiAoaSwgZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHZhciBwb3N0ZXJVcmwgPSAkKGVsZW1lbnQpLmRhdGEoJ3Bvc3Rlci0nICsgcG9zdGVyU2l6ZSk7XG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5hdHRyKCdwb3N0ZXInLCBwb3N0ZXJVcmwpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbml0OiBpbml0XG4gICAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIHZhciB2aWRlb0NvbnRyb2xzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICR2aWRlb0NvbnRhaW5lciA9ICQoJy5qcy12aWRlbycpLFxuICAgICAgICAgICAgJHZpZGVvID0gJHZpZGVvQ29udGFpbmVyLmZpbmQoJ3ZpZGVvJyksXG4gICAgICAgICAgICAkcGxheUNvbnRyb2wgPSAkKCcuanMtdmlkZW8tcGxheScpLFxuICAgICAgICAgICAgJHBhdXNlQ29udHJvbCA9ICQoJy5qcy12aWRlby1wYXVzZScpLFxuICAgICAgICAgICAgJG11dGVDb250cm9sID0gJCgnLmpzLXZpZGVvLW11dGUnKTtcblxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xuXG4gICAgICAgICAgICAkcGxheUNvbnRyb2wub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvID0gJHRoaXMucGFyZW50cygnLmpzLXZpZGVvJykuZmluZCgndmlkZW8nKVswXTtcblxuICAgICAgICAgICAgICAgICQodmlkZW8pLmNzcygnZGlzcGxheScsICdibG9jaycpO1xuXG4gICAgICAgICAgICAgICAgdmlkZW8ucGxheSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCQoJ2h0bWwnKS5oYXNDbGFzcygndWstdG91Y2gnKSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogMTAyNHB4KScpLm1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlRnVsbFNjcmVlbih2aWRlbyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby5yZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLnJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8ubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW8ud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlby53ZWJraXRFbnRlckZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby53ZWJraXRFbnRlckZ1bGxTY3JlZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkdGhpcy5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgICAgICAgICAgICAkcGF1c2VDb250cm9sLmNzcygnZGlzcGxheScsICdpbmxpbmUtYmxvY2snKTtcbiAgICAgICAgICAgICAgICAgICAgJG11dGVDb250cm9sLmNzcygnZGlzcGxheScsICdpbmxpbmUtYmxvY2snKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISR2aWRlb0NvbnRhaW5lci5oYXNDbGFzcygndG0tdmlkZW8tLS1pcy1wbGF5aW5nJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICR2aWRlb0NvbnRhaW5lci5hZGRDbGFzcygndG0tdmlkZW8tLWlzLXBsYXlpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGlmIHZpZGVvIGVuZGVkIGhpZGUgaXQgYW5kIHNob3cgaW1hZ2VcbiAgICAgICAgICAgICAgICAkKHZpZGVvKS5vbignZW5kZWQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAkKHZpZGVvKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICR2aWRlb0NvbnRhaW5lci5yZW1vdmVDbGFzcygndG0tdmlkZW8tLWlzLXBsYXlpbmcnKTtcblxuICAgICAgICAgICAgICAgICAgICAkcGF1c2VDb250cm9sLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAgICAgICAgICRtdXRlQ29udHJvbC5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgICAgICAgICAgICAkcGxheUNvbnRyb2wuY3NzKCdkaXNwbGF5JywgJ2lubGluZS1ibG9jaycpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJHBhdXNlQ29udHJvbC5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzO1xuICAgICAgICAgICAgICAgIGhhbmRsZVBhdXNlKGVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICRtdXRlQ29udHJvbC5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW8gPSAkdGhpcy5wYXJlbnRzKCcuanMtdmlkZW8nKS5maW5kKCd2aWRlbycpWzBdO1xuXG4gICAgICAgICAgICAgICAgKHZpZGVvLm11dGVkKSA/IHZpZGVvLm11dGVkID0gZmFsc2UgOiB2aWRlby5tdXRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAkdGhpcy50b2dnbGVDbGFzcygndG0tdmlkZW8tY29udHJvbHNfX211dGUtLWlzLW11dGVkJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVBhdXNlKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciAkdGhpcyA9ICQoZWxlbWVudCkgfHwgJCh0aGlzKSxcbiAgICAgICAgICAgICAgICB2aWRlbyA9ICR0aGlzLnBhcmVudHMoJy5qcy12aWRlbycpLmZpbmQoJ3ZpZGVvJylbMF07XG5cbiAgICAgICAgICAgICR0aGlzLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAkbXV0ZUNvbnRyb2wuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICRwbGF5Q29udHJvbC5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWJsb2NrJyk7XG5cbiAgICAgICAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgICAgICAgICAkdmlkZW9Db250YWluZXIucmVtb3ZlQ2xhc3MoJ3RtLXZpZGVvLS1pcy1wbGF5aW5nJyk7XG5cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiJCgnaHRtbCcpLmhhc0NsYXNzKCd1ay10b3VjaCcpIHx8IHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA3NjhweCknKS5tYXRjaGVzXCIsICQoJ2h0bWwnKS5oYXNDbGFzcygndWstdG91Y2gnKSB8fCB3aW5kb3cubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogNzY4cHgpJykubWF0Y2hlcyk7XG5cbiAgICAgICAgICAgIGlmICgkKCdodG1sJykuaGFzQ2xhc3MoJ3VrLXRvdWNoJykgfHwgd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6IDc2OHB4KScpLm1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICAkKHZpZGVvKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlRnVsbFNjcmVlbih2aWRlbykge1xuICAgICAgICAgICAgdmFyIGlzRnVsbFNjcmVlbjtcblxuICAgICAgICAgICAgLy8gZGVza3RvcCBjaHJvbWUvc2FmYXJpL29wZXJhL2ZpcmVmb3ggLyBtb2JpbGUgY2hyb21lXG4gICAgICAgICAgICAkKGRvY3VtZW50KS5vbignd2Via2l0ZnVsbHNjcmVlbmNoYW5nZSBtb3pmdWxsc2NyZWVuY2hhbmdlIGZ1bGxzY3JlZW5jaGFuZ2UgJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaXNGdWxsU2NyZWVuID0gY2hlY2tGdWxsU2NyZWVuKHZpZGVvKTtcblxuICAgICAgICAgICAgICAgIGlmICghaXNGdWxsU2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhdXNlKHZpZGVvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gaW9zIHNhZmFyaVxuICAgICAgICAgICAgJCh2aWRlbykub24oJ3dlYmtpdGJlZ2luZnVsbHNjcmVlbiB3ZWJraXRlbmRmdWxsc2NyZWVuJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpc0Z1bGxTY3JlZW4gPSBjaGVja0Z1bGxTY3JlZW4odmlkZW8pO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFpc0Z1bGxTY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGF1c2UodmlkZW8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tGdWxsU2NyZWVuKHZpZGVvKSB7XG4gICAgICAgICAgICB2YXIgaXNGdWxsU2NyZWVuO1xuXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuZnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIGlzRnVsbFNjcmVlbiA9IGRvY3VtZW50LmZ1bGxzY3JlZW47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50Lm1vekZ1bGxTY3JlZW4pIHtcbiAgICAgICAgICAgICAgICBpc0Z1bGxTY3JlZW4gPSBkb2N1bWVudC5tb3pGdWxsU2NyZWVuO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC53ZWJraXRJc0Z1bGxTY3JlZW4pIHtcbiAgICAgICAgICAgICAgICBpc0Z1bGxTY3JlZW4gPSBkb2N1bWVudC53ZWJraXRJc0Z1bGxTY3JlZW47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvLndlYmtpdERpc3BsYXlpbmdGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgaXNGdWxsU2NyZWVuID0gdmlkZW8ud2Via2l0RGlzcGxheWluZ0Z1bGxzY3JlZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlzRnVsbFNjcmVlbiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpc0Z1bGxTY3JlZW4pO1xuXG4gICAgICAgICAgICByZXR1cm4gaXNGdWxsU2NyZWVuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluaXQ6IGluaXRcbiAgICAgICAgfTtcblxuICAgIH0pKCk7XG5cbiAgICB2aWRlb0hvdmVyLmluaXQoKTtcbiAgICB2aWRlb0xpbmtzLmluaXQoKTtcbiAgICB2aWRlb1N3aXRjaFBvc3Rlci5pbml0KCk7XG4gICAgdmlkZW9Db250cm9scy5pbml0KCk7XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuIiwiJChmdW5jdGlvbigpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgVXRpbHNNYXRjaEhlaWdodHMgPSAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgZnVuY3Rpb24gbWF0Y2hIZWlnaHRzKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICBVSWtpdC5VdGlscy5tYXRjaEhlaWdodHMoc2VsZWN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1hdGNoOiBtYXRjaEhlaWdodHNcbiAgICAgICAgfTtcbiAgICB9KSgpO1xuXG5cbiAgICBpZiAoJCgnLmpzLXBhbmVsLXN0b3J5ID4gLnRtLXBhbmVsLXN0b3J5X19ib3R0b20nKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICQod2luZG93KS5vbignbG9hZCByZXNpemUgb3JpZW50YXRpb25jaGFuZ2UnLCAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBVSWtpdC5VdGlscy5kZWJvdW5jZShVdGlsc01hdGNoSGVpZ2h0cy5tYXRjaCgnLmpzLXBhbmVsLXN0b3J5ID4gLnRtLXBhbmVsLXN0b3J5X19ib3R0b20nKSwgNTApO1xuICAgICAgICB9KSgpKTtcbiAgICB9XG5cbiAgICAkKCcudG0taGVhZGVyIFtkYXRhLXVrLWRyb3Bkb3duXScpLm9uKCdzaG93LnVrLmRyb3Bkb3duJywgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgdmFyICRzbGlkZXJFbGVtZW50ID0gJCh0aGlzKS5maW5kKCcuanMtbWVudS1kZXNrdG9wJyk7XG4gICAgICAgIHZhciAkc2xpZGVyRWxlbWVudHMgPSAkc2xpZGVyRWxlbWVudC5maW5kKCdsaScpO1xuICAgICAgICB2YXIgc2xpZGVyQ29uZiA9IHsgaW5maW5pdGU6IGZhbHNlIH07XG5cbiAgICAgICAgaWYgKCRzbGlkZXJFbGVtZW50Lmxlbmd0aCkge1xuXG4gICAgICAgICAgICBpZiAoJHNsaWRlckVsZW1lbnRzLmxlbmd0aCA+PSA0KSB7XG4gICAgICAgICAgICAgICAgc2xpZGVyQ29uZiA9IHsgaW5maW5pdGU6IHRydWUgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgVUlraXQuc2xpZGVyKCRzbGlkZXJFbGVtZW50LCBzbGlkZXJDb25mKTtcblxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAvLyAkKHdpbmRvdykudHJpZ2dlcigncmVzaXplJyk7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygndHJpZ2dlciB3aW5kb3cgcmVzaXplJyk7XG4gICAgICAgICAgICB9LCAyMDApO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIFV0aWxzTWF0Y2hIZWlnaHRzLm1hdGNoKCcuanMtcGFuZWwtc3RvcnkgPiAudG0tcGFuZWwtc3RvcnlfX2JvdHRvbScpO1xuICAgICAgICAgICAgVXRpbHNNYXRjaEhlaWdodHMubWF0Y2goJy5qcy1tZW51LWRlc2t0b3AtZHJvcGRvd24tbmF2X19pdGVtJyk7XG5cbiAgICAgICAgICAgIC8vICQod2luZG93KS50cmlnZ2VyKCdyZXNpemUnKTtcbiAgICAgICAgfSwgMTAwKVxuXG4gICAgfSk7XG5cbiAgICAkKCdzZWxlY3QnKS5zZWxlY3QyKHtcbiAgICAgICAgcGxhY2Vob2xkZXI6ICcnLFxuICAgICAgICBtaW5pbXVtUmVzdWx0c0ZvclNlYXJjaDogSW5maW5pdHlcbiAgICB9KTtcblxuICAgICQoJ1tkYXRhLW93bGNvbnRyb2xdJykuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgJCh0aGlzKS5vd2xDb250cm9sKCk7XG4gICAgfSk7XG5cbn0pO1xuIiwiLyohXG4gKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYyLjIuNFxuICogaHR0cDovL2pxdWVyeS5jb20vXG4gKlxuICogSW5jbHVkZXMgU2l6emxlLmpzXG4gKiBodHRwOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE2LTA1LTIwVDE3OjIzWlxuICovXG5cbihmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Ly8gRm9yIENvbW1vbkpTIGFuZCBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB3aGVyZSBhIHByb3BlciBgd2luZG93YFxuXHRcdC8vIGlzIHByZXNlbnQsIGV4ZWN1dGUgdGhlIGZhY3RvcnkgYW5kIGdldCBqUXVlcnkuXG5cdFx0Ly8gRm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBoYXZlIGEgYHdpbmRvd2Agd2l0aCBhIGBkb2N1bWVudGBcblx0XHQvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3NlIGEgZmFjdG9yeSBhcyBtb2R1bGUuZXhwb3J0cy5cblx0XHQvLyBUaGlzIGFjY2VudHVhdGVzIHRoZSBuZWVkIGZvciB0aGUgY3JlYXRpb24gb2YgYSByZWFsIGB3aW5kb3dgLlxuXHRcdC8vIGUuZy4gdmFyIGpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIikod2luZG93KTtcblx0XHQvLyBTZWUgdGlja2V0ICMxNDU0OSBmb3IgbW9yZSBpbmZvLlxuXHRcdG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cblx0XHRcdGZhY3RvcnkoIGdsb2JhbCwgdHJ1ZSApIDpcblx0XHRcdGZ1bmN0aW9uKCB3ICkge1xuXHRcdFx0XHRpZiAoICF3LmRvY3VtZW50ICkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggXCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50XCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeSggdyApO1xuXHRcdFx0fTtcblx0fSBlbHNlIHtcblx0XHRmYWN0b3J5KCBnbG9iYWwgKTtcblx0fVxuXG4vLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldFxufSh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7XG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3ggMTgrXG4vLyBDYW4ndCBiZSBpbiBzdHJpY3QgbW9kZSwgc2V2ZXJhbCBsaWJzIGluY2x1ZGluZyBBU1AuTkVUIHRyYWNlXG4vLyB0aGUgc3RhY2sgdmlhIGFyZ3VtZW50cy5jYWxsZXIuY2FsbGVlIGFuZCBGaXJlZm94IGRpZXMgaWZcbi8vIHlvdSB0cnkgdG8gdHJhY2UgdGhyb3VnaCBcInVzZSBzdHJpY3RcIiBjYWxsIGNoYWlucy4gKCMxMzMzNSlcbi8vXCJ1c2Ugc3RyaWN0XCI7XG52YXIgYXJyID0gW107XG5cbnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcblxudmFyIHNsaWNlID0gYXJyLnNsaWNlO1xuXG52YXIgY29uY2F0ID0gYXJyLmNvbmNhdDtcblxudmFyIHB1c2ggPSBhcnIucHVzaDtcblxudmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjtcblxudmFyIGNsYXNzMnR5cGUgPSB7fTtcblxudmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZztcblxudmFyIGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBzdXBwb3J0ID0ge307XG5cblxuXG52YXJcblx0dmVyc2lvbiA9IFwiMi4yLjRcIixcblxuXHQvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IG9mIGpRdWVyeVxuXHRqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cblx0XHQvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCdcblx0XHQvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKVxuXHRcdHJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjFcblx0Ly8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG5cdHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLFxuXG5cdC8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xuXHRybXNQcmVmaXggPSAvXi1tcy0vLFxuXHRyZGFzaEFscGhhID0gLy0oW1xcZGEtel0pL2dpLFxuXG5cdC8vIFVzZWQgYnkgalF1ZXJ5LmNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKClcblx0ZmNhbWVsQ2FzZSA9IGZ1bmN0aW9uKCBhbGwsIGxldHRlciApIHtcblx0XHRyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG5cdH07XG5cbmpRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7XG5cblx0Ly8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNlZFxuXHRqcXVlcnk6IHZlcnNpb24sXG5cblx0Y29uc3RydWN0b3I6IGpRdWVyeSxcblxuXHQvLyBTdGFydCB3aXRoIGFuIGVtcHR5IHNlbGVjdG9yXG5cdHNlbGVjdG9yOiBcIlwiLFxuXG5cdC8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMFxuXHRsZW5ndGg6IDAsXG5cblx0dG9BcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SXG5cdC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5XG5cdGdldDogZnVuY3Rpb24oIG51bSApIHtcblx0XHRyZXR1cm4gbnVtICE9IG51bGwgP1xuXG5cdFx0XHQvLyBSZXR1cm4ganVzdCB0aGUgb25lIGVsZW1lbnQgZnJvbSB0aGUgc2V0XG5cdFx0XHQoIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0aCBdIDogdGhpc1sgbnVtIF0gKSA6XG5cblx0XHRcdC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXlcblx0XHRcdHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cdFx0cmV0LmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIHRhcmdldCApICkge1xuXHRcdHRhcmdldCA9IHt9O1xuXHR9XG5cblx0Ly8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkXG5cdGlmICggaSA9PT0gbGVuZ3RoICkge1xuXHRcdHRhcmdldCA9IHRoaXM7XG5cdFx0aS0tO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAoIG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSApICE9IG51bGwgKSB7XG5cblx0XHRcdC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3Rcblx0XHRcdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRcdFx0c3JjID0gdGFyZ2V0WyBuYW1lIF07XG5cdFx0XHRcdGNvcHkgPSBvcHRpb25zWyBuYW1lIF07XG5cblx0XHRcdFx0Ly8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxuXHRcdFx0XHRpZiAoIHRhcmdldCA9PT0gY29weSApIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5c1xuXHRcdFx0XHRpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHxcblx0XHRcdFx0XHQoIGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoIGNvcHkgKSApICkgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGNvcHlJc0FycmF5ICkge1xuXHRcdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc0FycmF5KCBzcmMgKSA/IHNyYyA6IFtdO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gXCJmdW5jdGlvblwiO1xuXHR9LFxuXG5cdGlzQXJyYXk6IEFycmF5LmlzQXJyYXksXG5cblx0aXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdztcblx0fSxcblxuXHRpc051bWVyaWM6IGZ1bmN0aW9uKCBvYmogKSB7XG5cblx0XHQvLyBwYXJzZUZsb2F0IE5hTnMgbnVtZXJpYy1jYXN0IGZhbHNlIHBvc2l0aXZlcyAobnVsbHx0cnVlfGZhbHNlfFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdC8vIGFkZGluZyAxIGNvcnJlY3RzIGxvc3Mgb2YgcHJlY2lzaW9uIGZyb20gcGFyc2VGbG9hdCAoIzE1MTAwKVxuXHRcdHZhciByZWFsU3RyaW5nT2JqID0gb2JqICYmIG9iai50b1N0cmluZygpO1xuXHRcdHJldHVybiAhalF1ZXJ5LmlzQXJyYXkoIG9iaiApICYmICggcmVhbFN0cmluZ09iaiAtIHBhcnNlRmxvYXQoIHJlYWxTdHJpbmdPYmogKSArIDEgKSA+PSAwO1xuXHR9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIGtleTtcblxuXHRcdC8vIE5vdCBwbGFpbiBvYmplY3RzOlxuXHRcdC8vIC0gQW55IG9iamVjdCBvciB2YWx1ZSB3aG9zZSBpbnRlcm5hbCBbW0NsYXNzXV0gcHJvcGVydHkgaXMgbm90IFwiW29iamVjdCBPYmplY3RdXCJcblx0XHQvLyAtIERPTSBub2Rlc1xuXHRcdC8vIC0gd2luZG93XG5cdFx0aWYgKCBqUXVlcnkudHlwZSggb2JqICkgIT09IFwib2JqZWN0XCIgfHwgb2JqLm5vZGVUeXBlIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdFxuXHRcdGlmICggb2JqLmNvbnN0cnVjdG9yICYmXG5cdFx0XHRcdCFoYXNPd24uY2FsbCggb2JqLCBcImNvbnN0cnVjdG9yXCIgKSAmJlxuXHRcdFx0XHQhaGFzT3duLmNhbGwoIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgfHwge30sIFwiaXNQcm90b3R5cGVPZlwiICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gT3duIHByb3BlcnRpZXMgYXJlIGVudW1lcmF0ZWQgZmlyc3RseSwgc28gdG8gc3BlZWQgdXAsXG5cdFx0Ly8gaWYgbGFzdCBvbmUgaXMgb3duLCB0aGVuIGFsbCBwcm9wZXJ0aWVzIGFyZSBvd25cblx0XHRmb3IgKCBrZXkgaW4gb2JqICkge31cblxuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCB8fCBoYXNPd24uY2FsbCggb2JqLCBrZXkgKTtcblx0fSxcblxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBuYW1lO1xuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHR0eXBlOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gb2JqICsgXCJcIjtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMCwgaU9TPDYgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0XHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgP1xuXHRcdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCBcIm9iamVjdFwiIDpcblx0XHRcdHR5cGVvZiBvYmo7XG5cdH0sXG5cblx0Ly8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHRcblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUgKSB7XG5cdFx0dmFyIHNjcmlwdCxcblx0XHRcdGluZGlyZWN0ID0gZXZhbDtcblxuXHRcdGNvZGUgPSBqUXVlcnkudHJpbSggY29kZSApO1xuXG5cdFx0aWYgKCBjb2RlICkge1xuXG5cdFx0XHQvLyBJZiB0aGUgY29kZSBpbmNsdWRlcyBhIHZhbGlkLCBwcm9sb2d1ZSBwb3NpdGlvblxuXHRcdFx0Ly8gc3RyaWN0IG1vZGUgcHJhZ21hLCBleGVjdXRlIGNvZGUgYnkgaW5qZWN0aW5nIGFcblx0XHRcdC8vIHNjcmlwdCB0YWcgaW50byB0aGUgZG9jdW1lbnQuXG5cdFx0XHRpZiAoIGNvZGUuaW5kZXhPZiggXCJ1c2Ugc3RyaWN0XCIgKSA9PT0gMSApIHtcblx0XHRcdFx0c2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXHRcdFx0XHRzY3JpcHQudGV4dCA9IGNvZGU7XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApO1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIGF2b2lkIHRoZSBET00gbm9kZSBjcmVhdGlvbiwgaW5zZXJ0aW9uXG5cdFx0XHRcdC8vIGFuZCByZW1vdmFsIGJ5IHVzaW5nIGFuIGluZGlyZWN0IGdsb2JhbCBldmFsXG5cblx0XHRcdFx0aW5kaXJlY3QoIGNvZGUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuXHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdC8vIE1pY3Jvc29mdCBmb3Jnb3QgdG8gaHVtcCB0aGVpciB2ZW5kb3IgcHJlZml4ICgjOTU3Milcblx0Y2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkge1xuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCBcIm1zLVwiICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApO1xuXHR9LFxuXG5cdG5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0fSxcblxuXHRlYWNoOiBmdW5jdGlvbiggb2JqLCBjYWxsYmFjayApIHtcblx0XHR2YXIgbGVuZ3RoLCBpID0gMDtcblxuXHRcdGlmICggaXNBcnJheUxpa2UoIG9iaiApICkge1xuXHRcdFx0bGVuZ3RoID0gb2JqLmxlbmd0aDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIG9iaiApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xXG5cdHRyaW06IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFx0XCJcIiA6XG5cdFx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFsgYXJyIF0gOiBhcnJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guY2FsbCggcmV0LCBhcnIgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7XG5cdFx0cmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApO1xuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHtcblx0XHR2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsXG5cdFx0XHRqID0gMCxcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdO1xuXHRcdH1cblxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XG5cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH0sXG5cblx0Z3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkge1xuXHRcdHZhciBjYWxsYmFja0ludmVyc2UsXG5cdFx0XHRtYXRjaGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aCxcblx0XHRcdGNhbGxiYWNrRXhwZWN0ID0gIWludmVydDtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXNcblx0XHQvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvblxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0Y2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XG5cdFx0XHRpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVzO1xuXHR9LFxuXG5cdC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHtcblx0XHR2YXIgbGVuZ3RoLCB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7XG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIGVsZW1zICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0cmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApO1xuXHR9LFxuXG5cdC8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0c1xuXHRndWlkOiAxLFxuXG5cdC8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuXHQvLyBhcmd1bWVudHMuXG5cdHByb3h5OiBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdFx0dmFyIHRtcCwgYXJncywgcHJveHk7XG5cblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRcdGNvbnRleHQgPSBmbjtcblx0XHRcdGZuID0gdG1wO1xuXHRcdH1cblxuXHRcdC8vIFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjXG5cdFx0Ly8gdGhpcyB0aHJvd3MgYSBUeXBlRXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC5cblx0XHRpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gU2ltdWxhdGVkIGJpbmRcblx0XHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdFx0cHJveHkgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdzLmNvbmNhdCggc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKSApO1xuXHRcdH07XG5cblx0XHQvLyBTZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhhbmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3JpZ2luYWwgaGFuZGxlciwgc28gaXQgY2FuIGJlIHJlbW92ZWRcblx0XHRwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKztcblxuXHRcdHJldHVybiBwcm94eTtcblx0fSxcblxuXHRub3c6IERhdGUubm93LFxuXG5cdC8vIGpRdWVyeS5zdXBwb3J0IGlzIG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpclxuXHQvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LlxuXHRzdXBwb3J0OiBzdXBwb3J0XG59ICk7XG5cbi8vIEpTSGludCB3b3VsZCBlcnJvciBvbiB0aGlzIGNvZGUgZHVlIHRvIHRoZSBTeW1ib2wgbm90IGJlaW5nIGRlZmluZWQgaW4gRVM1LlxuLy8gRGVmaW5pbmcgdGhpcyBnbG9iYWwgaW4gLmpzaGludHJjIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsXG4vLyB1bmd1YXJkZWQgaW4gYW5vdGhlciBwbGFjZSwgaXQgc2VlbXMgc2FmZXIgdG8ganVzdCBkaXNhYmxlIEpTSGludCBmb3IgdGhlc2Vcbi8vIHRocmVlIGxpbmVzLlxuLyoganNoaW50IGlnbm9yZTogc3RhcnQgKi9cbmlmICggdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTtcbn1cbi8qIGpzaGludCBpZ25vcmU6IGVuZCAqL1xuXG4vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXBcbmpRdWVyeS5lYWNoKCBcIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sXCIuc3BsaXQoIFwiIFwiICksXG5mdW5jdGlvbiggaSwgbmFtZSApIHtcblx0Y2xhc3MydHlwZVsgXCJbb2JqZWN0IFwiICsgbmFtZSArIFwiXVwiIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG59ICk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogaU9TIDguMiAobm90IHJlcHJvZHVjaWJsZSBpbiBzaW11bGF0b3IpXG5cdC8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSlcblx0Ly8gaGFzT3duIGlzbid0IHVzZWQgaGVyZSBkdWUgdG8gZmFsc2UgbmVnYXRpdmVzXG5cdC8vIHJlZ2FyZGluZyBOb2RlbGlzdCBsZW5ndGggaW4gSUVcblx0dmFyIGxlbmd0aCA9ICEhb2JqICYmIFwibGVuZ3RoXCIgaW4gb2JqICYmIG9iai5sZW5ndGgsXG5cdFx0dHlwZSA9IGpRdWVyeS50eXBlKCBvYmogKTtcblxuXHRpZiAoIHR5cGUgPT09IFwiZnVuY3Rpb25cIiB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0eXBlID09PSBcImFycmF5XCIgfHwgbGVuZ3RoID09PSAwIHx8XG5cdFx0dHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajtcbn1cbnZhciBTaXp6bGUgPVxuLyohXG4gKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4yLjFcbiAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMTUtMTAtMTdcbiAqL1xuKGZ1bmN0aW9uKCB3aW5kb3cgKSB7XG5cbnZhciBpLFxuXHRzdXBwb3J0LFxuXHRFeHByLFxuXHRnZXRUZXh0LFxuXHRpc1hNTCxcblx0dG9rZW5pemUsXG5cdGNvbXBpbGUsXG5cdHNlbGVjdCxcblx0b3V0ZXJtb3N0Q29udGV4dCxcblx0c29ydElucHV0LFxuXHRoYXNEdXBsaWNhdGUsXG5cblx0Ly8gTG9jYWwgZG9jdW1lbnQgdmFyc1xuXHRzZXREb2N1bWVudCxcblx0ZG9jdW1lbnQsXG5cdGRvY0VsZW0sXG5cdGRvY3VtZW50SXNIVE1MLFxuXHRyYnVnZ3lRU0EsXG5cdHJidWdneU1hdGNoZXMsXG5cdG1hdGNoZXMsXG5cdGNvbnRhaW5zLFxuXG5cdC8vIEluc3RhbmNlLXNwZWNpZmljIGRhdGFcblx0ZXhwYW5kbyA9IFwic2l6emxlXCIgKyAxICogbmV3IERhdGUoKSxcblx0cHJlZmVycmVkRG9jID0gd2luZG93LmRvY3VtZW50LFxuXHRkaXJydW5zID0gMCxcblx0ZG9uZSA9IDAsXG5cdGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHR0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0Y29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdC8vIEdlbmVyYWwtcHVycG9zZSBjb25zdGFudHNcblx0TUFYX05FR0FUSVZFID0gMSA8PCAzMSxcblxuXHQvLyBJbnN0YW5jZSBtZXRob2RzXG5cdGhhc093biA9ICh7fSkuaGFzT3duUHJvcGVydHksXG5cdGFyciA9IFtdLFxuXHRwb3AgPSBhcnIucG9wLFxuXHRwdXNoX25hdGl2ZSA9IGFyci5wdXNoLFxuXHRwdXNoID0gYXJyLnB1c2gsXG5cdHNsaWNlID0gYXJyLnNsaWNlLFxuXHQvLyBVc2UgYSBzdHJpcHBlZC1kb3duIGluZGV4T2YgYXMgaXQncyBmYXN0ZXIgdGhhbiBuYXRpdmVcblx0Ly8gaHR0cDovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81XG5cdGluZGV4T2YgPSBmdW5jdGlvbiggbGlzdCwgZWxlbSApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRsZW4gPSBsaXN0Lmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGlmICggbGlzdFtpXSA9PT0gZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fSxcblxuXHRib29sZWFucyA9IFwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIixcblxuXHQvLyBSZWd1bGFyIGV4cHJlc3Npb25zXG5cblx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI3doaXRlc3BhY2Vcblx0d2hpdGVzcGFjZSA9IFwiW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZl1cIixcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXJcblx0aWRlbnRpZmllciA9IFwiKD86XFxcXFxcXFwufFtcXFxcdy1dfFteXFxcXHgwMC1cXFxceGEwXSkrXCIsXG5cblx0Ly8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzXG5cdGF0dHJpYnV0ZXMgPSBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFwiICsgaWRlbnRpZmllciArIFwiKSg/OlwiICsgd2hpdGVzcGFjZSArXG5cdFx0Ly8gT3BlcmF0b3IgKGNhcHR1cmUgMilcblx0XHRcIiooWypeJHwhfl0/PSlcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIFwiQXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIENTUyBpZGVudGlmaWVycyBbY2FwdHVyZSA1XSBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XVwiXG5cdFx0XCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIiArIGlkZW50aWZpZXIgKyBcIikpfClcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFwiKlxcXFxdXCIsXG5cblx0cHNldWRvcyA9IFwiOihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcXFxcKChcIiArXG5cdFx0Ly8gVG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzIG5lZWRpbmcgdG9rZW5pemUgaW4gdGhlIHByZUZpbHRlciwgcHJlZmVyIGFyZ3VtZW50czpcblx0XHQvLyAxLiBxdW90ZWQgKGNhcHR1cmUgMzsgY2FwdHVyZSA0IG9yIGNhcHR1cmUgNSlcblx0XHRcIignKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcJ10pKiknfFxcXCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFxcXFwiXSkqKVxcXCIpfFwiICtcblx0XHQvLyAyLiBzaW1wbGUgKGNhcHR1cmUgNilcblx0XHRcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXCgpW1xcXFxdXXxcIiArIGF0dHJpYnV0ZXMgKyBcIikqKXxcIiArXG5cdFx0Ly8gMy4gYW55dGhpbmcgZWxzZSAoY2FwdHVyZSAyKVxuXHRcdFwiLipcIiArXG5cdFx0XCIpXFxcXCl8KVwiLFxuXG5cdC8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXJcblx0cndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgXCIrXCIsIFwiZ1wiICksXG5cdHJ0cmltID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIrfCgoPzpefFteXFxcXFxcXFxdKSg/OlxcXFxcXFxcLikqKVwiICsgd2hpdGVzcGFjZSArIFwiKyRcIiwgXCJnXCIgKSxcblxuXHRyY29tbWEgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiosXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcblx0cmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFs+K35dfFwiICsgd2hpdGVzcGFjZSArIFwiKVwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cblx0cmF0dHJpYnV0ZVF1b3RlcyA9IG5ldyBSZWdFeHAoIFwiPVwiICsgd2hpdGVzcGFjZSArIFwiKihbXlxcXFxdJ1xcXCJdKj8pXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXF1cIiwgXCJnXCIgKSxcblxuXHRycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLFxuXHRyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoIFwiXlwiICsgaWRlbnRpZmllciArIFwiJFwiICksXG5cblx0bWF0Y2hFeHByID0ge1xuXHRcdFwiSURcIjogbmV3IFJlZ0V4cCggXCJeIyhcIiArIGlkZW50aWZpZXIgKyBcIilcIiApLFxuXHRcdFwiQ0xBU1NcIjogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIlRBR1wiOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBpZGVudGlmaWVyICsgXCJ8WypdKVwiICksXG5cdFx0XCJBVFRSXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgYXR0cmlidXRlcyApLFxuXHRcdFwiUFNFVURPXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgcHNldWRvcyApLFxuXHRcdFwiQ0hJTERcIjogbmV3IFJlZ0V4cCggXCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXFxcKFwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooZXZlbnxvZGR8KChbKy1dfCkoXFxcXGQqKW58KVwiICsgd2hpdGVzcGFjZSArIFwiKig/OihbKy1dfClcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKFxcXFxkKyl8KSlcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpXCIsIFwiaVwiICksXG5cdFx0XCJib29sXCI6IG5ldyBSZWdFeHAoIFwiXig/OlwiICsgYm9vbGVhbnMgKyBcIikkXCIsIFwiaVwiICksXG5cdFx0Ly8gRm9yIHVzZSBpbiBsaWJyYXJpZXMgaW1wbGVtZW50aW5nIC5pcygpXG5cdFx0Ly8gV2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRjaGluZyBpbiBgc2VsZWN0YFxuXHRcdFwibmVlZHNDb250ZXh0XCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFxcXChcIiArXG5cdFx0XHR3aGl0ZXNwYWNlICsgXCIqKCg/Oi1cXFxcZCk/XFxcXGQqKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfCkoPz1bXi1dfCQpXCIsIFwiaVwiIClcblx0fSxcblxuXHRyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmhlYWRlciA9IC9eaFxcZCQvaSxcblxuXHRybmF0aXZlID0gL15bXntdK1xce1xccypcXFtuYXRpdmUgXFx3LyxcblxuXHQvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnNcblx0cnF1aWNrRXhwciA9IC9eKD86IyhbXFx3LV0rKXwoXFx3Kyl8XFwuKFtcXHctXSspKSQvLFxuXG5cdHJzaWJsaW5nID0gL1srfl0vLFxuXHRyZXNjYXBlID0gLyd8XFxcXC9nLFxuXG5cdC8vIENTUyBlc2NhcGVzIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnNcblx0cnVuZXNjYXBlID0gbmV3IFJlZ0V4cCggXCJcXFxcXFxcXChbXFxcXGRhLWZdezEsNn1cIiArIHdoaXRlc3BhY2UgKyBcIj98KFwiICsgd2hpdGVzcGFjZSArIFwiKXwuKVwiLCBcImlnXCIgKSxcblx0ZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkge1xuXHRcdHZhciBoaWdoID0gXCIweFwiICsgZXNjYXBlZCAtIDB4MTAwMDA7XG5cdFx0Ly8gTmFOIG1lYW5zIG5vbi1jb2RlcG9pbnRcblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94PDI0XG5cdFx0Ly8gV29ya2Fyb3VuZCBlcnJvbmVvdXMgbnVtZXJpYyBpbnRlcnByZXRhdGlvbiBvZiArXCIweFwiXG5cdFx0cmV0dXJuIGhpZ2ggIT09IGhpZ2ggfHwgZXNjYXBlZFdoaXRlc3BhY2UgP1xuXHRcdFx0ZXNjYXBlZCA6XG5cdFx0XHRoaWdoIDwgMCA/XG5cdFx0XHRcdC8vIEJNUCBjb2RlcG9pbnRcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCArIDB4MTAwMDAgKSA6XG5cdFx0XHRcdC8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKVxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERDMDAgKTtcblx0fSxcblxuXHQvLyBVc2VkIGZvciBpZnJhbWVzXG5cdC8vIFNlZSBzZXREb2N1bWVudCgpXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRVxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fTtcblxuLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0IClcbnRyeSB7XG5cdHB1c2guYXBwbHkoXG5cdFx0KGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLFxuXHRcdHByZWZlcnJlZERvYy5jaGlsZE5vZGVzXG5cdCk7XG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wXG5cdC8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHlcblx0YXJyWyBwcmVmZXJyZWREb2MuY2hpbGROb2Rlcy5sZW5ndGggXS5ub2RlVHlwZTtcbn0gY2F0Y2ggKCBlICkge1xuXHRwdXNoID0geyBhcHBseTogYXJyLmxlbmd0aCA/XG5cblx0XHQvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHB1c2hfbmF0aXZlLmFwcGx5KCB0YXJnZXQsIHNsaWNlLmNhbGwoZWxzKSApO1xuXHRcdH0gOlxuXG5cdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdC8vIE90aGVyd2lzZSBhcHBlbmQgZGlyZWN0bHlcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHR2YXIgaiA9IHRhcmdldC5sZW5ndGgsXG5cdFx0XHRcdGkgPSAwO1xuXHRcdFx0Ly8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoXG5cdFx0XHR3aGlsZSAoICh0YXJnZXRbaisrXSA9IGVsc1tpKytdKSApIHt9XG5cdFx0XHR0YXJnZXQubGVuZ3RoID0gaiAtIDE7XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkge1xuXHR2YXIgbSwgaSwgZWxlbSwgbmlkLCBuaWRzZWxlY3QsIG1hdGNoLCBncm91cHMsIG5ld1NlbGVjdG9yLFxuXHRcdG5ld0NvbnRleHQgPSBjb250ZXh0ICYmIGNvbnRleHQub3duZXJEb2N1bWVudCxcblxuXHRcdC8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnRcblx0XHRub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dFxuXHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiB8fCAhc2VsZWN0b3IgfHxcblx0XHRub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSAmJiBub2RlVHlwZSAhPT0gMTEgKSB7XG5cblx0XHRyZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdC8vIFRyeSB0byBzaG9ydGN1dCBmaW5kIG9wZXJhdGlvbnMgKGFzIG9wcG9zZWQgdG8gZmlsdGVycykgaW4gSFRNTCBkb2N1bWVudHNcblx0aWYgKCAhc2VlZCApIHtcblxuXHRcdGlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBwcmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0XHRzZXREb2N1bWVudCggY29udGV4dCApO1xuXHRcdH1cblx0XHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcblxuXHRcdGlmICggZG9jdW1lbnRJc0hUTUwgKSB7XG5cblx0XHRcdC8vIElmIHRoZSBzZWxlY3RvciBpcyBzdWZmaWNpZW50bHkgc2ltcGxlLCB0cnkgdXNpbmcgYSBcImdldCpCeSpcIiBET00gbWV0aG9kXG5cdFx0XHQvLyAoZXhjZXB0aW5nIERvY3VtZW50RnJhZ21lbnQgY29udGV4dCwgd2hlcmUgdGhlIG1ldGhvZHMgZG9uJ3QgZXhpc3QpXG5cdFx0XHRpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkge1xuXG5cdFx0XHRcdC8vIElEIHNlbGVjdG9yXG5cdFx0XHRcdGlmICggKG0gPSBtYXRjaFsxXSkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb2N1bWVudCBjb250ZXh0XG5cdFx0XHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkID09PSBtICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEVsZW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBpZGVudGlmeSB2ZXJzaW9uc1xuXHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0aWYgKCBuZXdDb250ZXh0ICYmIChlbGVtID0gbmV3Q29udGV4dC5nZXRFbGVtZW50QnlJZCggbSApKSAmJlxuXHRcdFx0XHRcdFx0XHRjb250YWlucyggY29udGV4dCwgZWxlbSApICYmXG5cdFx0XHRcdFx0XHRcdGVsZW0uaWQgPT09IG0gKSB7XG5cblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUeXBlIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzJdICkge1xuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHNlbGVjdG9yICkgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0XHQvLyBDbGFzcyBzZWxlY3RvclxuXHRcdFx0XHR9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiZcblx0XHRcdFx0XHRjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGxcblx0XHRcdGlmICggc3VwcG9ydC5xc2EgJiZcblx0XHRcdFx0IWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXSAmJlxuXHRcdFx0XHQoIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkpICkge1xuXG5cdFx0XHRcdGlmICggbm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IGNvbnRleHQ7XG5cdFx0XHRcdFx0bmV3U2VsZWN0b3IgPSBzZWxlY3RvcjtcblxuXHRcdFx0XHQvLyBxU0EgbG9va3Mgb3V0c2lkZSBFbGVtZW50IGNvbnRleHQsIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnRcblx0XHRcdFx0Ly8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWVcblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04XG5cdFx0XHRcdC8vIEV4Y2x1ZGUgb2JqZWN0IGVsZW1lbnRzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0aWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApKSApIHtcblx0XHRcdFx0XHRcdG5pZCA9IG5pZC5yZXBsYWNlKCByZXNjYXBlLCBcIlxcXFwkJlwiICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnRleHQuc2V0QXR0cmlidXRlKCBcImlkXCIsIChuaWQgPSBleHBhbmRvKSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZWZpeCBldmVyeSBzZWxlY3RvciBpbiB0aGUgbGlzdFxuXHRcdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdFx0XHRcdGkgPSBncm91cHMubGVuZ3RoO1xuXHRcdFx0XHRcdG5pZHNlbGVjdCA9IHJpZGVudGlmaWVyLnRlc3QoIG5pZCApID8gXCIjXCIgKyBuaWQgOiBcIltpZD0nXCIgKyBuaWQgKyBcIiddXCI7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRncm91cHNbaV0gPSBuaWRzZWxlY3QgKyBcIiBcIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCBcIixcIiApO1xuXG5cdFx0XHRcdFx0Ly8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzXG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8XG5cdFx0XHRcdFx0XHRjb250ZXh0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBuZXdTZWxlY3RvciApIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cyxcblx0XHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fSBjYXRjaCAoIHFzYUVycm9yICkge1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoIFwiaWRcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEFsbCBvdGhlcnNcblx0cmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oc3RyaW5nLCBvYmplY3QpfSBSZXR1cm5zIHRoZSBPYmplY3QgZGF0YSBhZnRlciBzdG9yaW5nIGl0IG9uIGl0c2VsZiB3aXRoXG4gKlx0cHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aClcbiAqXHRkZWxldGluZyB0aGUgb2xkZXN0IGVudHJ5XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlKCkge1xuXHR2YXIga2V5cyA9IFtdO1xuXG5cdGZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkge1xuXHRcdC8vIFVzZSAoa2V5ICsgXCIgXCIpIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIG5hdGl2ZSBwcm90b3R5cGUgcHJvcGVydGllcyAoc2VlIElzc3VlICMxNTcpXG5cdFx0aWYgKCBrZXlzLnB1c2goIGtleSArIFwiIFwiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkge1xuXHRcdFx0Ly8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzXG5cdFx0XHRkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdO1xuXHRcdH1cblx0XHRyZXR1cm4gKGNhY2hlWyBrZXkgKyBcIiBcIiBdID0gdmFsdWUpO1xuXHR9XG5cdHJldHVybiBjYWNoZTtcbn1cblxuLyoqXG4gKiBNYXJrIGEgZnVuY3Rpb24gZm9yIHNwZWNpYWwgdXNlIGJ5IFNpenpsZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIG1hcmtcbiAqL1xuZnVuY3Rpb24gbWFya0Z1bmN0aW9uKCBmbiApIHtcblx0Zm5bIGV4cGFuZG8gXSA9IHRydWU7XG5cdHJldHVybiBmbjtcbn1cblxuLyoqXG4gKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gUGFzc2VkIHRoZSBjcmVhdGVkIGRpdiBhbmQgZXhwZWN0cyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG5cdHRyeSB7XG5cdFx0cmV0dXJuICEhZm4oIGRpdiApO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGZpbmFsbHkge1xuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZGl2LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZGl2ICk7XG5cdFx0fVxuXHRcdC8vIHJlbGVhc2UgbWVtb3J5IGluIElFXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxufVxuXG4vKipcbiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBhdHRycyBQaXBlLXNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIgVGhlIG1ldGhvZCB0aGF0IHdpbGwgYmUgYXBwbGllZFxuICovXG5mdW5jdGlvbiBhZGRIYW5kbGUoIGF0dHJzLCBoYW5kbGVyICkge1xuXHR2YXIgYXJyID0gYXR0cnMuc3BsaXQoXCJ8XCIpLFxuXHRcdGkgPSBhcnIubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdEV4cHIuYXR0ckhhbmRsZVsgYXJyW2ldIF0gPSBoYW5kbGVyO1xuXHR9XG59XG5cbi8qKlxuICogQ2hlY2tzIGRvY3VtZW50IG9yZGVyIG9mIHR3byBzaWJsaW5nc1xuICogQHBhcmFtIHtFbGVtZW50fSBhXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFJldHVybnMgbGVzcyB0aGFuIDAgaWYgYSBwcmVjZWRlcyBiLCBncmVhdGVyIHRoYW4gMCBpZiBhIGZvbGxvd3MgYlxuICovXG5mdW5jdGlvbiBzaWJsaW5nQ2hlY2soIGEsIGIgKSB7XG5cdHZhciBjdXIgPSBiICYmIGEsXG5cdFx0ZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdCggfmIuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICkgLVxuXHRcdFx0KCB+YS5zb3VyY2VJbmRleCB8fCBNQVhfTkVHQVRJVkUgKTtcblxuXHQvLyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXNcblx0aWYgKCBkaWZmICkge1xuXHRcdHJldHVybiBkaWZmO1xuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgYiBmb2xsb3dzIGFcblx0aWYgKCBjdXIgKSB7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLm5leHRTaWJsaW5nKSApIHtcblx0XHRcdGlmICggY3VyID09PSBiICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGEgPyAxIDogLTE7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiAobmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCIpICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgcGFyZW50LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdlXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0aWYgKCAocGFyZW50ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpICYmIHBhcmVudC50b3AgIT09IHBhcmVudCApIHtcblx0XHQvLyBTdXBwb3J0OiBJRSAxMVxuXHRcdGlmICggcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggcGFyZW50LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0cGFyZW50LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0ZGl2LmNsYXNzTmFtZSA9IFwiaVwiO1xuXHRcdHJldHVybiAhZGl2LmdldEF0dHJpYnV0ZShcImNsYXNzTmFtZVwiKTtcblx0fSk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0ZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KFwiXCIpICk7XG5cdFx0cmV0dXJuICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbWF0aWNhbGx5LXNldCBuYW1lcyxcblx0Ly8gc28gdXNlIGEgcm91bmRhYm91dCBnZXRFbGVtZW50c0J5TmFtZSB0ZXN0XG5cdHN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlkID0gZXhwYW5kbztcblx0XHRyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gSUQgZmluZCBhbmQgZmlsdGVyXG5cdGlmICggc3VwcG9ydC5nZXRCeUlkICkge1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gbSA/IFsgbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0dmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0Ly8gU3VwcG9ydDogSUU2Lzdcblx0XHQvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0XG5cdFx0ZGVsZXRlIEV4cHIuZmluZFtcIklEXCJdO1xuXG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9ICBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0fVxuXG5cdC8vIFRhZ1xuXHRFeHByLmZpbmRbXCJUQUdcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID9cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE5cblx0XHRcdH0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgKTtcblx0XHRcdH1cblx0XHR9IDpcblxuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0dG1wID0gW10sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHQvLyBCeSBoYXBweSBjb2luY2lkZW5jZSwgYSAoYnJva2VuKSBnRUJUTiBhcHBlYXJzIG9uIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgdG9vXG5cdFx0XHRcdHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50c1xuXHRcdFx0aWYgKCB0YWcgPT09IFwiKlwiICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHR0bXAucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0bXA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9O1xuXG5cdC8vIENsYXNzXG5cdEV4cHIuZmluZFtcIkNMQVNTXCJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7XG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qIFFTQS9tYXRjaGVzU2VsZWN0b3Jcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnRcblxuXHQvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KVxuXHRyYnVnZ3lNYXRjaGVzID0gW107XG5cblx0Ly8gcVNhKDpmb2N1cykgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKENocm9tZSAyMSlcblx0Ly8gV2UgYWxsb3cgdGhpcyBiZWNhdXNlIG9mIGEgYnVnIGluIElFOC85IHRoYXQgdGhyb3dzIGFuIGVycm9yXG5cdC8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWVcblx0Ly8gU28sIHdlIGFsbG93IDpmb2N1cyB0byBwYXNzIHRocm91Z2ggUVNBIGFsbCB0aGUgdGltZSB0byBhdm9pZCB0aGUgSUUgZXJyb3Jcblx0Ly8gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2Vcblx0XHRcdC8vIFRoaXMgaXMgdG8gdGVzdCBJRSdzIHRyZWF0bWVudCBvZiBub3QgZXhwbGljaXRseVxuXHRcdFx0Ly8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsXG5cdFx0XHQvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaFxuXHRcdFx0Ly8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlubmVySFRNTCA9IFwiPGEgaWQ9J1wiICsgZXhwYW5kbyArIFwiJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgaWQ9J1wiICsgZXhwYW5kbyArIFwiLVxcclxcXFwnIG1zYWxsb3djYXB0dXJlPScnPlwiICtcblx0XHRcdFx0XCI8b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTgsIE9wZXJhIDExLTEyLjE2XG5cdFx0XHQvLyBOb3RoaW5nIHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmluZ3MgZm9sbG93IF49IG9yICQ9IG9yICo9XG5cdFx0XHQvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCBcInNhZmVcIiBmb3IgV2luUlRcblx0XHRcdC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW21zYWxsb3djYXB0dXJlXj0nJ11cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbKl4kXT1cIiArIHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBhbmQgXCJ2YWx1ZVwiIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHlcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW3NlbGVjdGVkXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86dmFsdWV8XCIgKyBib29sZWFucyArIFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44K1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiOmNoZWNrZWRcIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIjpjaGVja2VkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCssIGlPUyA4K1xuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MVxuXHRcdFx0Ly8gSW4tcGFnZSBgc2VsZWN0b3IjaWQgc2liaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCggXCJhI1wiICsgZXhwYW5kbyArIFwiKypcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIuIy4rWyt+XVwiKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzXG5cdFx0XHQvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnRcblx0XHRcdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcblx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwiaGlkZGVuXCIgKTtcblx0XHRcdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKS5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcIkRcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZVxuXHRcdFx0aWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiOmVuYWJsZWRcIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCI6ZW5hYmxlZFwiLCBcIjpkaXNhYmxlZFwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zXG5cdFx0XHRkaXYucXVlcnlTZWxlY3RvckFsbChcIiosOnhcIik7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaChcIiwuKjpcIik7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvclxuXHRcdFx0Ly8gb24gYSBkaXNjb25uZWN0ZWQgbm9kZSAoSUUgOSlcblx0XHRcdHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwoIGRpdiwgXCJkaXZcIiApO1xuXG5cdFx0XHQvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uXG5cdFx0XHQvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFkXG5cdFx0XHRtYXRjaGVzLmNhbGwoIGRpdiwgXCJbcyE9JyddOnhcIiApO1xuXHRcdFx0cmJ1Z2d5TWF0Y2hlcy5wdXNoKCBcIiE9XCIsIHBzZXVkb3MgKTtcblx0XHR9KTtcblx0fVxuXG5cdHJidWdneVFTQSA9IHJidWdneVFTQS5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5UVNBLmpvaW4oXCJ8XCIpICk7XG5cdHJidWdneU1hdGNoZXMgPSByYnVnZ3lNYXRjaGVzLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lNYXRjaGVzLmpvaW4oXCJ8XCIpICk7XG5cblx0LyogQ29udGFpbnNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXHRoYXNDb21wYXJlID0gcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICk7XG5cblx0Ly8gRWxlbWVudCBjb250YWlucyBhbm90aGVyXG5cdC8vIFB1cnBvc2VmdWxseSBzZWxmLWV4Y2x1c2l2ZVxuXHQvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZlxuXHRjb250YWlucyA9IGhhc0NvbXBhcmUgfHwgcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbnRhaW5zICkgP1xuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0dmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSxcblx0XHRcdFx0YnVwID0gYiAmJiBiLnBhcmVudE5vZGU7XG5cdFx0XHRyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmIChcblx0XHRcdFx0YWRvd24uY29udGFpbnMgP1xuXHRcdFx0XHRcdGFkb3duLmNvbnRhaW5zKCBidXAgKSA6XG5cdFx0XHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBidXAgKSAmIDE2XG5cdFx0XHQpKTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdGlmICggYiApIHtcblx0XHRcdFx0d2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7XG5cdFx0XHRcdFx0aWYgKCBiID09PSBhICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHQvKiBTb3J0aW5nXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nXG5cdHNvcnRPcmRlciA9IGhhc0NvbXBhcmUgP1xuXHRmdW5jdGlvbiggYSwgYiApIHtcblxuXHRcdC8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb25cblx0XHR2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247XG5cdFx0aWYgKCBjb21wYXJlICkge1xuXHRcdFx0cmV0dXJuIGNvbXBhcmU7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUgc2FtZSBkb2N1bWVudFxuXHRcdGNvbXBhcmUgPSAoIGEub3duZXJEb2N1bWVudCB8fCBhICkgPT09ICggYi5vd25lckRvY3VtZW50IHx8IGIgKSA/XG5cdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugd2Uga25vdyB0aGV5IGFyZSBkaXNjb25uZWN0ZWRcblx0XHRcdDE7XG5cblx0XHQvLyBEaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRpZiAoIGNvbXBhcmUgJiAxIHx8XG5cdFx0XHQoIXN1cHBvcnQuc29ydERldGFjaGVkICYmIGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGEgKSA9PT0gY29tcGFyZSkgKSB7XG5cblx0XHRcdC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudFxuXHRcdFx0aWYgKCBhID09PSBkb2N1bWVudCB8fCBhLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGEpICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGIgPT09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWludGFpbiBvcmlnaW5hbCBvcmRlclxuXHRcdFx0cmV0dXJuIHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29tcGFyZSAmIDQgPyAtMSA6IDE7XG5cdH0gOlxuXHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHQvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGF1cCA9IGEucGFyZW50Tm9kZSxcblx0XHRcdGJ1cCA9IGIucGFyZW50Tm9kZSxcblx0XHRcdGFwID0gWyBhIF0sXG5cdFx0XHRicCA9IFsgYiBdO1xuXG5cdFx0Ly8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWRcblx0XHRpZiAoICFhdXAgfHwgIWJ1cCApIHtcblx0XHRcdHJldHVybiBhID09PSBkb2N1bWVudCA/IC0xIDpcblx0XHRcdFx0YiA9PT0gZG9jdW1lbnQgPyAxIDpcblx0XHRcdFx0YXVwID8gLTEgOlxuXHRcdFx0XHRidXAgPyAxIDpcblx0XHRcdFx0c29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXG5cdFx0Ly8gSWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncywgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2tcblx0XHR9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCApIHtcblx0XHRcdHJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2Ugd2UgbmVlZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNvblxuXHRcdGN1ciA9IGE7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkge1xuXHRcdFx0YXAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXHRcdGN1ciA9IGI7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkge1xuXHRcdFx0YnAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2FsayBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3lcblx0XHR3aGlsZSAoIGFwW2ldID09PSBicFtpXSApIHtcblx0XHRcdGkrKztcblx0XHR9XG5cblx0XHRyZXR1cm4gaSA/XG5cdFx0XHQvLyBEbyBhIHNpYmxpbmcgY2hlY2sgaWYgdGhlIG5vZGVzIGhhdmUgYSBjb21tb24gYW5jZXN0b3Jcblx0XHRcdHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50IHNvcnQgZmlyc3Rcblx0XHRcdGFwW2ldID09PSBwcmVmZXJyZWREb2MgPyAtMSA6XG5cdFx0XHRicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6XG5cdFx0XHQwO1xuXHR9O1xuXG5cdHJldHVybiBkb2N1bWVudDtcbn07XG5cblNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkge1xuXHRyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBlbGVtZW50cyApO1xufTtcblxuU2l6emxlLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBlbGVtLCBleHByICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdH1cblxuXHQvLyBNYWtlIHN1cmUgdGhhdCBhdHRyaWJ1dGUgc2VsZWN0b3JzIGFyZSBxdW90ZWRcblx0ZXhwciA9IGV4cHIucmVwbGFjZSggcmF0dHJpYnV0ZVF1b3RlcywgXCI9JyQxJ11cIiApO1xuXG5cdGlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiZcblx0XHQhY29tcGlsZXJDYWNoZVsgZXhwciArIFwiIFwiIF0gJiZcblx0XHQoICFyYnVnZ3lNYXRjaGVzIHx8ICFyYnVnZ3lNYXRjaGVzLnRlc3QoIGV4cHIgKSApICYmXG5cdFx0KCAhcmJ1Z2d5UVNBICAgICB8fCAhcmJ1Z2d5UVNBLnRlc3QoIGV4cHIgKSApICkge1xuXG5cdFx0dHJ5IHtcblx0XHRcdHZhciByZXQgPSBtYXRjaGVzLmNhbGwoIGVsZW0sIGV4cHIgKTtcblxuXHRcdFx0Ly8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdFx0aWYgKCByZXQgfHwgc3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCB8fFxuXHRcdFx0XHRcdC8vIEFzIHdlbGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0byBiZSBpbiBhIGRvY3VtZW50XG5cdFx0XHRcdFx0Ly8gZnJhZ21lbnQgaW4gSUUgOVxuXHRcdFx0XHRcdGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge31cblx0fVxuXG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7XG59O1xuXG5TaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggY29udGV4dCApO1xuXHR9XG5cdHJldHVybiBjb250YWlucyggY29udGV4dCwgZWxlbSApO1xufTtcblxuU2l6emxlLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0dmFyIGZuID0gRXhwci5hdHRySGFuZGxlWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSxcblx0XHQvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoalF1ZXJ5ICMxMzgwNylcblx0XHR2YWwgPSBmbiAmJiBoYXNPd24uY2FsbCggRXhwci5hdHRySGFuZGxlLCBuYW1lLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOlxuXHRcdFx0dW5kZWZpbmVkO1xuXG5cdHJldHVybiB2YWwgIT09IHVuZGVmaW5lZCA/XG5cdFx0dmFsIDpcblx0XHRzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWRvY3VtZW50SXNIVE1MID9cblx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICkgOlxuXHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/XG5cdFx0XHRcdHZhbC52YWx1ZSA6XG5cdFx0XHRcdG51bGw7XG59O1xuXG5TaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkge1xuXHR0aHJvdyBuZXcgRXJyb3IoIFwiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogXCIgKyBtc2cgKTtcbn07XG5cbi8qKlxuICogRG9jdW1lbnQgc29ydGluZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlc1xuICogQHBhcmFtIHtBcnJheUxpa2V9IHJlc3VsdHNcbiAqL1xuU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHtcblx0dmFyIGVsZW0sXG5cdFx0ZHVwbGljYXRlcyA9IFtdLFxuXHRcdGogPSAwLFxuXHRcdGkgPSAwO1xuXG5cdC8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2Vcblx0aGFzRHVwbGljYXRlID0gIXN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcztcblx0c29ydElucHV0ID0gIXN1cHBvcnQuc29ydFN0YWJsZSAmJiByZXN1bHRzLnNsaWNlKCAwICk7XG5cdHJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7XG5cblx0aWYgKCBoYXNEdXBsaWNhdGUgKSB7XG5cdFx0d2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7XG5cdFx0XHRpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHtcblx0XHRcdFx0aiA9IGR1cGxpY2F0ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdHJlc3VsdHMuc3BsaWNlKCBkdXBsaWNhdGVzWyBqIF0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDbGVhciBpbnB1dCBhZnRlciBzb3J0aW5nIHRvIHJlbGVhc2Ugb2JqZWN0c1xuXHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjVcblx0c29ydElucHV0ID0gbnVsbDtcblxuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXNcbiAqIEBwYXJhbSB7QXJyYXl8RWxlbWVudH0gZWxlbVxuICovXG5nZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0dmFyIG5vZGUsXG5cdFx0cmV0ID0gXCJcIixcblx0XHRpID0gMCxcblx0XHRub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0aWYgKCAhbm9kZVR5cGUgKSB7XG5cdFx0Ly8gSWYgbm8gbm9kZVR5cGUsIHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXlcblx0XHR3aGlsZSAoIChub2RlID0gZWxlbVtpKytdKSApIHtcblx0XHRcdC8vIERvIG5vdCB0cmF2ZXJzZSBjb21tZW50IG5vZGVzXG5cdFx0XHRyZXQgKz0gZ2V0VGV4dCggbm9kZSApO1xuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDEgfHwgbm9kZVR5cGUgPT09IDkgfHwgbm9kZVR5cGUgPT09IDExICkge1xuXHRcdC8vIFVzZSB0ZXh0Q29udGVudCBmb3IgZWxlbWVudHNcblx0XHQvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3ZlZCBmb3IgY29uc2lzdGVuY3kgb2YgbmV3IGxpbmVzIChqUXVlcnkgIzExMTUzKVxuXHRcdGlmICggdHlwZW9mIGVsZW0udGV4dENvbnRlbnQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS50ZXh0Q29udGVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0cmV0ICs9IGdldFRleHQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVWYWx1ZTtcblx0fVxuXHQvLyBEbyBub3QgaW5jbHVkZSBjb21tZW50IG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9kZXNcblxuXHRyZXR1cm4gcmV0O1xufTtcblxuRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7XG5cblx0Ly8gQ2FuIGJlIGFkanVzdGVkIGJ5IHRoZSB1c2VyXG5cdGNhY2hlTGVuZ3RoOiA1MCxcblxuXHRjcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbixcblxuXHRtYXRjaDogbWF0Y2hFeHByLFxuXG5cdGF0dHJIYW5kbGU6IHt9LFxuXG5cdGZpbmQ6IHt9LFxuXG5cdHJlbGF0aXZlOiB7XG5cdFx0XCI+XCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIiBcIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiIH0sXG5cdFx0XCIrXCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiflwiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiB9XG5cdH0sXG5cblx0cHJlRmlsdGVyOiB7XG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdG1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblxuXHRcdFx0Ly8gTW92ZSB0aGUgZ2l2ZW4gdmFsdWUgdG8gbWF0Y2hbM10gd2hldGhlciBxdW90ZWQgb3IgdW5xdW90ZWRcblx0XHRcdG1hdGNoWzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBcIlwiICkucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblxuXHRcdFx0aWYgKCBtYXRjaFsyXSA9PT0gXCJ+PVwiICkge1xuXHRcdFx0XHRtYXRjaFszXSA9IFwiIFwiICsgbWF0Y2hbM10gKyBcIiBcIjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0LyogbWF0Y2hlcyBmcm9tIG1hdGNoRXhwcltcIkNISUxEXCJdXG5cdFx0XHRcdDEgdHlwZSAob25seXxudGh8Li4uKVxuXHRcdFx0XHQyIHdoYXQgKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdDMgYXJndW1lbnQgKGV2ZW58b2RkfFxcZCp8XFxkKm4oWystXVxcZCspP3wuLi4pXG5cdFx0XHRcdDQgeG4tY29tcG9uZW50IG9mIHhuK3kgYXJndW1lbnQgKFsrLV0/XFxkKm58KVxuXHRcdFx0XHQ1IHNpZ24gb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDYgeCBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NyBzaWduIG9mIHktY29tcG9uZW50XG5cdFx0XHRcdDggeSBvZiB5LWNvbXBvbmVudFxuXHRcdFx0Ki9cblx0XHRcdG1hdGNoWzFdID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0aWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSBcIm50aFwiICkge1xuXHRcdFx0XHQvLyBudGgtKiByZXF1aXJlcyBhcmd1bWVudFxuXHRcdFx0XHRpZiAoICFtYXRjaFszXSApIHtcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3IgRXhwci5maWx0ZXIuQ0hJTERcblx0XHRcdFx0Ly8gcmVtZW1iZXIgdGhhdCBmYWxzZS90cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMVxuXHRcdFx0XHRtYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gXCJldmVuXCIgfHwgbWF0Y2hbM10gPT09IFwib2RkXCIgKSApO1xuXHRcdFx0XHRtYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICk7XG5cblx0XHRcdC8vIG90aGVyIHR5cGVzIHByb2hpYml0IGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdH0sXG5cblx0XHRcIlBTRVVET1wiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHR2YXIgZXhjZXNzLFxuXHRcdFx0XHR1bnF1b3RlZCA9ICFtYXRjaFs2XSAmJiBtYXRjaFsyXTtcblxuXHRcdFx0aWYgKCBtYXRjaEV4cHJbXCJDSElMRFwiXS50ZXN0KCBtYXRjaFswXSApICkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWNjZXB0IHF1b3RlZCBhcmd1bWVudHMgYXMtaXNcblx0XHRcdGlmICggbWF0Y2hbM10gKSB7XG5cdFx0XHRcdG1hdGNoWzJdID0gbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIjtcblxuXHRcdFx0Ly8gU3RyaXAgZXhjZXNzIGNoYXJhY3RlcnMgZnJvbSB1bnF1b3RlZCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJlxuXHRcdFx0XHQvLyBHZXQgZXhjZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KVxuXHRcdFx0XHQoZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCB0cnVlICkpICYmXG5cdFx0XHRcdC8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpc1xuXHRcdFx0XHQoZXhjZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggXCIpXCIsIHVucXVvdGVkLmxlbmd0aCAtIGV4Y2VzcyApIC0gdW5xdW90ZWQubGVuZ3RoKSApIHtcblxuXHRcdFx0XHQvLyBleGNlc3MgaXMgYSBuZWdhdGl2ZSBpbmRleFxuXHRcdFx0XHRtYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdFx0bWF0Y2hbMl0gPSB1bnF1b3RlZC5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldHVybiBvbmx5IGNhcHR1cmVzIG5lZWRlZCBieSB0aGUgcHNldWRvIGZpbHRlciBtZXRob2QgKHR5cGUgYW5kIGFyZ3VtZW50KVxuXHRcdFx0cmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7XG5cdFx0fVxuXHR9LFxuXG5cdGZpbHRlcjoge1xuXG5cdFx0XCJUQUdcIjogZnVuY3Rpb24oIG5vZGVOYW1lU2VsZWN0b3IgKSB7XG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBub2RlTmFtZVNlbGVjdG9yID09PSBcIipcIiA/XG5cdFx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbm9kZU5hbWU7XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0xBU1NcIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHtcblx0XHRcdHZhciBwYXR0ZXJuID0gY2xhc3NDYWNoZVsgY2xhc3NOYW1lICsgXCIgXCIgXTtcblxuXHRcdFx0cmV0dXJuIHBhdHRlcm4gfHxcblx0XHRcdFx0KHBhdHRlcm4gPSBuZXcgUmVnRXhwKCBcIihefFwiICsgd2hpdGVzcGFjZSArIFwiKVwiICsgY2xhc3NOYW1lICsgXCIoXCIgKyB3aGl0ZXNwYWNlICsgXCJ8JClcIiApKSAmJlxuXHRcdFx0XHRjbGFzc0NhY2hlKCBjbGFzc05hbWUsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXR0ZXJuLnRlc3QoIHR5cGVvZiBlbGVtLmNsYXNzTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBlbGVtLmNsYXNzTmFtZSB8fCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSB8fCBcIlwiICk7XG5cdFx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHRcdFx0aWYgKCByZXN1bHQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiIT1cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoICFvcGVyYXRvciApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlc3VsdCArPSBcIlwiO1xuXG5cdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCI9XCIgPyByZXN1bHQgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIhPVwiID8gcmVzdWx0ICE9PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiXj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID09PSAwIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIqPVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiJD1cIiA/IGNoZWNrICYmIHJlc3VsdC5zbGljZSggLWNoZWNrLmxlbmd0aCApID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwifj1cIiA/ICggXCIgXCIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsIFwiIFwiICkgKyBcIiBcIiApLmluZGV4T2YoIGNoZWNrICkgPiAtMSA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwifD1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgXCItXCIgOlxuXHRcdFx0XHRcdGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkge1xuXHRcdFx0dmFyIHNpbXBsZSA9IHR5cGUuc2xpY2UoIDAsIDMgKSAhPT0gXCJudGhcIixcblx0XHRcdFx0Zm9yd2FyZCA9IHR5cGUuc2xpY2UoIC00ICkgIT09IFwibGFzdFwiLFxuXHRcdFx0XHRvZlR5cGUgPSB3aGF0ID09PSBcIm9mLXR5cGVcIjtcblxuXHRcdFx0cmV0dXJuIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgP1xuXG5cdFx0XHRcdC8vIFNob3J0Y3V0IGZvciA6bnRoLSoobilcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEhZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHR9IDpcblxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBjYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIG5vZGVJbmRleCwgc3RhcnQsXG5cdFx0XHRcdFx0XHRkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyBcIm5leHRTaWJsaW5nXCIgOiBcInByZXZpb3VzU2libGluZ1wiLFxuXHRcdFx0XHRcdFx0cGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdFx0bmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdFx0XHR1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZSxcblx0XHRcdFx0XHRcdGRpZmYgPSBmYWxzZTtcblxuXHRcdFx0XHRcdGlmICggcGFyZW50ICkge1xuXG5cdFx0XHRcdFx0XHQvLyA6KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdFx0XHRpZiAoIHNpbXBsZSApIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCBkaXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9IG5vZGVbIGRpciBdKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggb2ZUeXBlID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdC8vIFJldmVyc2UgZGlyZWN0aW9uIGZvciA6b25seS0qIChpZiB3ZSBoYXZlbid0IHlldCBkb25lIHNvKVxuXHRcdFx0XHRcdFx0XHRcdHN0YXJ0ID0gZGlyID0gdHlwZSA9PT0gXCJvbmx5XCIgJiYgIXN0YXJ0ICYmIFwibmV4dFNpYmxpbmdcIjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0c3RhcnQgPSBbIGZvcndhcmQgPyBwYXJlbnQuZmlyc3RDaGlsZCA6IHBhcmVudC5sYXN0Q2hpbGQgXTtcblxuXHRcdFx0XHRcdFx0Ly8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGBcblx0XHRcdFx0XHRcdGlmICggZm9yd2FyZCAmJiB1c2VDYWNoZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBTZWVrIGBlbGVtYCBmcm9tIGEgcHJldmlvdXNseS1jYWNoZWQgaW5kZXhcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBwYXJlbnQ7XG5cdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXggJiYgY2FjaGVbIDIgXTtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEZhbGxiYWNrIHRvIHNlZWtpbmcgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBXaGVuIGZvdW5kLCBjYWNoZSBpbmRleGVzIG9uIGBwYXJlbnRgIGFuZCBicmVha1xuXHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiArK2RpZmYgJiYgbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFVzZSBwcmV2aW91c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIHVzZUNhY2hlICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXlcblx0XHRcdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcblx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRjYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXg7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB4bWwgOm50aC1jaGlsZCguLi4pXG5cdFx0XHRcdFx0XHRcdC8vIG9yIDpudGgtbGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLilcblx0XHRcdFx0XHRcdFx0aWYgKCBkaWZmID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQrK2RpZmYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHVzZUNhY2hlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZVxuXHRcdFx0XHRcdFx0ZGlmZiAtPSBsYXN0O1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRpZmYgPT09IGZpcnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIlBTRVVET1wiOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHtcblx0XHRcdC8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZVxuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3Nlc1xuXHRcdFx0Ly8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnNcblx0XHRcdC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3Ncblx0XHRcdHZhciBhcmdzLFxuXHRcdFx0XHRmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIHBzZXVkbzogXCIgKyBwc2V1ZG8gKTtcblxuXHRcdFx0Ly8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdFxuXHRcdFx0Ly8gYXJndW1lbnRzIGFyZSBuZWVkZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb25cblx0XHRcdC8vIGp1c3QgYXMgU2l6emxlIGRvZXNcblx0XHRcdGlmICggZm5bIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0cmV0dXJuIGZuKCBhcmd1bWVudCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXNcblx0XHRcdGlmICggZm4ubGVuZ3RoID4gMSApIHtcblx0XHRcdFx0YXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sIFwiXCIsIGFyZ3VtZW50IF07XG5cdFx0XHRcdHJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0XHRcdG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdFx0XHRcdHZhciBpZHgsXG5cdFx0XHRcdFx0XHRcdG1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSxcblx0XHRcdFx0XHRcdFx0aSA9IG1hdGNoZWQubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlkeCA9IGluZGV4T2YoIHNlZWQsIG1hdGNoZWRbaV0gKTtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSA6XG5cdFx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm47XG5cdFx0fVxuXHR9LFxuXG5cdHBzZXVkb3M6IHtcblx0XHQvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3Ncblx0XHRcIm5vdFwiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0Ly8gVHJpbSB0aGUgc2VsZWN0b3IgcGFzc2VkIHRvIGNvbXBpbGVcblx0XHRcdC8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG5cdFx0XHQvLyBzcGFjZXMgYXMgY29tYmluYXRvcnNcblx0XHRcdHZhciBpbnB1dCA9IFtdLFxuXHRcdFx0XHRyZXN1bHRzID0gW10sXG5cdFx0XHRcdG1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICkgKTtcblxuXHRcdFx0cmV0dXJuIG1hdGNoZXJbIGV4cGFuZG8gXSA/XG5cdFx0XHRcdG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHRcdFx0dW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLFxuXHRcdFx0XHRcdFx0aSA9IHNlZWQubGVuZ3RoO1xuXG5cdFx0XHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYFxuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdHNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pIDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHRpbnB1dFswXSA9IGVsZW07XG5cdFx0XHRcdFx0bWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApO1xuXHRcdFx0XHRcdC8vIERvbid0IGtlZXAgdGhlIGVsZW1lbnQgKGlzc3VlICMyOTkpXG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBudWxsO1xuXHRcdFx0XHRcdHJldHVybiAhcmVzdWx0cy5wb3AoKTtcblx0XHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdFwiaGFzXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImNvbnRhaW5zXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0Ly8gXCJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yXG5cdFx0Ly8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWVcblx0XHQvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLFxuXHRcdC8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgXCItXCIuXG5cdFx0Ly8gVGhlIG1hdGNoaW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1lZCBjYXNlLWluc2Vuc2l0aXZlbHkuXG5cdFx0Ly8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS5cIlxuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG9cblx0XHRcImxhbmdcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHtcblx0XHRcdC8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXJcblx0XHRcdGlmICggIXJpZGVudGlmaWVyLnRlc3QobGFuZyB8fCBcIlwiKSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIGxhbmc6IFwiICsgbGFuZyApO1xuXHRcdFx0fVxuXHRcdFx0bGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgZWxlbUxhbmc7XG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtTGFuZyA9IGRvY3VtZW50SXNIVE1MID9cblx0XHRcdFx0XHRcdGVsZW0ubGFuZyA6XG5cdFx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSkgKSB7XG5cblx0XHRcdFx0XHRcdGVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtTGFuZyA9PT0gbGFuZyB8fCBlbGVtTGFuZy5pbmRleE9mKCBsYW5nICsgXCItXCIgKSA9PT0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0Ly8gTWlzY2VsbGFuZW91c1xuXHRcdFwidGFyZ2V0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0XHRyZXR1cm4gaGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7XG5cdFx0fSxcblxuXHRcdFwicm9vdFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2NFbGVtO1xuXHRcdH0sXG5cblx0XHRcImZvY3VzXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgKCFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpKSAmJiAhIShlbGVtLnR5cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4KTtcblx0XHR9LFxuXG5cdFx0Ly8gQm9vbGVhbiBwcm9wZXJ0aWVzXG5cdFx0XCJlbmFibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlO1xuXHRcdH0sXG5cblx0XHRcImRpc2FibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdFwiY2hlY2tlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxlY3RlZCBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSBcIm9wdGlvblwiICYmICEhZWxlbS5zZWxlY3RlZCk7XG5cdFx0fSxcblxuXHRcdFwic2VsZWN0ZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0XG5cdFx0XHQvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5XG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlO1xuXHRcdH0sXG5cblx0XHQvLyBDb250ZW50c1xuXHRcdFwiZW1wdHlcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2VtcHR5LXBzZXVkb1xuXHRcdFx0Ly8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLFxuXHRcdFx0Ly8gICBidXQgbm90IGJ5IG90aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjogNzsgZXRjLilcblx0XHRcdC8vIG5vZGVUeXBlIDwgNiB3b3JrcyBiZWNhdXNlIGF0dHJpYnV0ZXMgKDIpIGRvIG5vdCBhcHBlYXIgYXMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPCA2ICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdFwicGFyZW50XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICFFeHByLnBzZXVkb3NbXCJlbXB0eVwiXSggZWxlbSApO1xuXHRcdH0sXG5cblx0XHQvLyBFbGVtZW50L2lucHV0IHR5cGVzXG5cdFx0XCJoZWFkZXJcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiaW5wdXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiYnV0dG9uXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gXCJidXR0b25cIiB8fCBuYW1lID09PSBcImJ1dHRvblwiO1xuXHRcdH0sXG5cblx0XHRcInRleHRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgYXR0cjtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJlxuXHRcdFx0XHRlbGVtLnR5cGUgPT09IFwidGV4dFwiICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUU8OFxuXHRcdFx0XHQvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgXCJzZWFyY2hcIikgYXBwZWFyIHdpdGggZWxlbS50eXBlID09PSBcInRleHRcIlxuXHRcdFx0XHQoIChhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIgKTtcblx0XHR9LFxuXG5cdFx0Ly8gUG9zaXRpb24taW4tY29sbGVjdGlvblxuXHRcdFwiZmlyc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBbIDAgXTtcblx0XHR9KSxcblxuXHRcdFwibGFzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHJldHVybiBbIGxlbmd0aCAtIDEgXTtcblx0XHR9KSxcblxuXHRcdFwiZXFcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0cmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdO1xuXHRcdH0pLFxuXG5cdFx0XCJldmVuXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJvZGRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDE7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImx0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgLS1pID49IDA7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwiZ3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyArK2kgPCBsZW5ndGg7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KVxuXHR9XG59O1xuXG5FeHByLnBzZXVkb3NbXCJudGhcIl0gPSBFeHByLnBzZXVkb3NbXCJlcVwiXTtcblxuLy8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBlIHBzZXVkb3NcbmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUlucHV0UHNldWRvKCBpICk7XG59XG5mb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCByZXNldDogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApO1xufVxuXG4vLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnNcbmZ1bmN0aW9uIHNldEZpbHRlcnMoKSB7fVxuc2V0RmlsdGVycy5wcm90b3R5cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7XG5FeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpO1xuXG50b2tlbml6ZSA9IFNpenpsZS50b2tlbml6ZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkge1xuXHR2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSxcblx0XHRzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLFxuXHRcdGNhY2hlZCA9IHRva2VuQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoIGNhY2hlZCApIHtcblx0XHRyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApO1xuXHR9XG5cblx0c29GYXIgPSBzZWxlY3Rvcjtcblx0Z3JvdXBzID0gW107XG5cdHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjtcblxuXHR3aGlsZSAoIHNvRmFyICkge1xuXG5cdFx0Ly8gQ29tbWEgYW5kIGZpcnN0IHJ1blxuXHRcdGlmICggIW1hdGNoZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0aWYgKCBtYXRjaCApIHtcblx0XHRcdFx0Ly8gRG9uJ3QgY29uc3VtZSB0cmFpbGluZyBjb21tYXMgYXMgdmFsaWRcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7XG5cdFx0XHR9XG5cdFx0XHRncm91cHMucHVzaCggKHRva2VucyA9IFtdKSApO1xuXHRcdH1cblxuXHRcdG1hdGNoZWQgPSBmYWxzZTtcblxuXHRcdC8vIENvbWJpbmF0b3JzXG5cdFx0aWYgKCAobWF0Y2ggPSByY29tYmluYXRvcnMuZXhlYyggc29GYXIgKSkgKSB7XG5cdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdC8vIENhc3QgZGVzY2VuZGFudCBjb21iaW5hdG9ycyB0byBzcGFjZVxuXHRcdFx0XHR0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgXCIgXCIgKVxuXHRcdFx0fSk7XG5cdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZpbHRlcnNcblx0XHRmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkge1xuXHRcdFx0aWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fFxuXHRcdFx0XHQobWF0Y2ggPSBwcmVGaWx0ZXJzWyB0eXBlIF0oIG1hdGNoICkpKSApIHtcblx0XHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRcdG1hdGNoZXM6IG1hdGNoXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggIW1hdGNoZWQgKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3Ncblx0Ly8gaWYgd2UncmUganVzdCBwYXJzaW5nXG5cdC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vuc1xuXHRyZXR1cm4gcGFyc2VPbmx5ID9cblx0XHRzb0Zhci5sZW5ndGggOlxuXHRcdHNvRmFyID9cblx0XHRcdFNpenpsZS5lcnJvciggc2VsZWN0b3IgKSA6XG5cdFx0XHQvLyBDYWNoZSB0aGUgdG9rZW5zXG5cdFx0XHR0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTtcbn07XG5cbmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0c2VsZWN0b3IgPSBcIlwiO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7XG5cdH1cblx0cmV0dXJuIHNlbGVjdG9yO1xufVxuXG5mdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBiYXNlICkge1xuXHR2YXIgZGlyID0gY29tYmluYXRvci5kaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYgZGlyID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdGlmICggKG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGRpciBdKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgZGlyIF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50ICkge1xuXHRcdFx0XHRcdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0XHRcdFx0XHRcdHhtbCA9ICFkb2N1bWVudElzSFRNTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGBpYCBpcyBub3cgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHZpc2l0ZWQgYWJvdmUsIGFuZCBhZGRpbmcgaXQgdG8gYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIG1ha2VzIHRoZSBsYXR0ZXIgbm9ubmVnYXRpdmUuXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBlcXVhbHMgYGlgKSwgdW5sZXNzIHdlIGRpZG4ndCB2aXNpdCBfYW55XyBlbGVtZW50cyBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhhdmVcblx0XHRcdC8vIG5vIGVsZW1lbnQgbWF0Y2hlcnMgYW5kIG5vIHNlZWQuXG5cdFx0XHQvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyBcIjBcIiBgaWAgYWxsb3dzIGBpYCB0byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0XG5cdFx0XHQvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIFwiMDBcIiBgbWF0Y2hlZENvdW50YCB0aGF0IGRpZmZlcnMgZnJvbSBgaWAgYnV0IGlzIGFsc29cblx0XHRcdC8vIG51bWVyaWNhbGx5IHplcm8uXG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0c3VwcG9ydC5nZXRCeUlkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiZcblx0XHRcdFx0RXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHtcblxuXHRcdFx0Y29udGV4dCA9ICggRXhwci5maW5kW1wiSURcIl0oIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5lc2NhcGUsIGZ1bmVzY2FwZSksIGNvbnRleHQgKSB8fCBbXSApWzBdO1xuXHRcdFx0aWYgKCAhY29udGV4dCApIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdC8vIFByZWNvbXBpbGVkIG1hdGNoZXJzIHdpbGwgc3RpbGwgdmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWxcblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBpbGVkICkge1xuXHRcdFx0XHRjb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5nXG5cdFx0aSA9IG1hdGNoRXhwcltcIm5lZWRzQ29udGV4dFwiXS50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0b2tlbiA9IHRva2Vuc1tpXTtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvclxuXHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHtcblx0XHRcdFx0Ly8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzXG5cdFx0XHRcdGlmICggKHNlZWQgPSBmaW5kKFxuXHRcdFx0XHRcdHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSxcblx0XHRcdFx0XHRyc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdFx0XHRcdCkpICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5XG5cdFx0XHRcdFx0dG9rZW5zLnNwbGljZSggaSwgMSApO1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7XG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuXHQvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlXG5cdCggY29tcGlsZWQgfHwgY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkgKShcblx0XHRzZWVkLFxuXHRcdGNvbnRleHQsXG5cdFx0IWRvY3VtZW50SXNIVE1MLFxuXHRcdHJlc3VsdHMsXG5cdFx0IWNvbnRleHQgfHwgcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHQpO1xuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIE9uZS10aW1lIGFzc2lnbm1lbnRzXG5cbi8vIFNvcnQgc3RhYmlsaXR5XG5zdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0KFwiXCIpLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oXCJcIikgPT09IGV4cGFuZG87XG5cbi8vIFN1cHBvcnQ6IENocm9tZSAxNC0zNStcbi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25cbnN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlO1xuXG4vLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnRcbnNldERvY3VtZW50KCk7XG5cbi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpXG4vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBvdGhlcipcbnN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYxICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGRpdjEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUyOFZTLjg1JTI5LmFzcHhcbmlmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRkaXYuaW5uZXJIVE1MID0gXCI8YSBocmVmPScjJz48L2E+XCI7XG5cdHJldHVybiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpID09PSBcIiNcIiA7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInR5cGV8aHJlZnxoZWlnaHR8d2lkdGhcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwidHlwZVwiID8gMSA6IDIgKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZGVmYXVsdFZhbHVlIGluIHBsYWNlIG9mIGdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG5pZiAoICFzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRkaXYuaW5uZXJIVE1MID0gXCI8aW5wdXQvPlwiO1xuXHRkaXYuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiwgXCJcIiApO1xuXHRyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRyZXR1cm4gZGl2LmdldEF0dHJpYnV0ZShcImRpc2FibGVkXCIpID09IG51bGw7XG59KSApIHtcblx0YWRkSGFuZGxlKCBib29sZWFucywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciB2YWw7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgpIDpcblx0XHRcdFx0XHQodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHRcdHZhbC52YWx1ZSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0fVxuXHR9KTtcbn1cblxucmV0dXJuIFNpenpsZTtcblxufSkoIHdpbmRvdyApO1xuXG5cblxualF1ZXJ5LmZpbmQgPSBTaXp6bGU7XG5qUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7XG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5cblxuXG52YXIgZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XG5cdHZhciBtYXRjaGVkID0gW10sXG5cdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0dmFyIG1hdGNoZWQgPSBbXTtcblxuXHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0bWF0Y2hlZC5wdXNoKCBuICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG52YXIgcnNpbmdsZVRhZyA9ICggL148KFtcXHctXSspXFxzKlxcLz8+KD86PFxcL1xcMT58KSQvICk7XG5cblxuXG52YXIgcmlzU2ltcGxlID0gL14uW146I1xcW1xcLixdKiQvO1xuXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxuZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7XG5cdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHF1YWxpZmllciApICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0LyoganNoaW50IC1XMDE4ICovXG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXG5cdH1cblxuXHRpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7XG5cdFx0fSApO1xuXG5cdH1cblxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0aWYgKCByaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG5cdFx0fVxuXG5cdFx0cXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cyApO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDtcblx0fSApO1xufVxuXG5qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7XG5cdHZhciBlbGVtID0gZWxlbXNbIDAgXTtcblxuXHRpZiAoIG5vdCApIHtcblx0XHRleHByID0gXCI6bm90KFwiICsgZXhwciArIFwiKVwiO1xuXHR9XG5cblx0cmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0gMSAmJiBlbGVtLm5vZGVUeXBlID09PSAxID9cblx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsgZWxlbSBdIDogW10gOlxuXHRcdGpRdWVyeS5maW5kLm1hdGNoZXMoIGV4cHIsIGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTtcblx0XHR9ICkgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBpLFxuXHRcdFx0bGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdHNlbGYgPSB0aGlzO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSApICk7XG5cdFx0fVxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHQvLyBOZWVkZWQgYmVjYXVzZSAkKCBzZWxlY3RvciwgY29udGV4dCApIGJlY29tZXMgJCggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yIClcblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggbGVuID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0ICk7XG5cdFx0cmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciA/IHRoaXMuc2VsZWN0b3IgKyBcIiBcIiArIHNlbGVjdG9yIDogc2VsZWN0b3I7XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSApICk7XG5cdH0sXG5cdGlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuICEhd2lubm93KFxuXHRcdFx0dGhpcyxcblxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldFxuXHRcdFx0Ly8gc28gJChcInA6Zmlyc3RcIikuaXMoXCJwOmxhc3RcIikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvIFwicFwiLlxuXHRcdFx0dHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3IgKSA6XG5cdFx0XHRcdHNlbGVjdG9yIHx8IFtdLFxuXHRcdFx0ZmFsc2Vcblx0XHQpLmxlbmd0aDtcblx0fVxufSApO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHRycXVpY2tFeHByID0gL14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKikpJC8sXG5cblx0aW5pdCA9IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290ICkge1xuXHRcdHZhciBtYXRjaCwgZWxlbTtcblxuXHRcdC8vIEhBTkRMRTogJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxuXHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5XG5cdFx0Ly8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKVxuXHRcdHJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7XG5cblx0XHQvLyBIYW5kbGUgSFRNTCBzdHJpbmdzXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRpZiAoIHNlbGVjdG9yWyAwIF0gPT09IFwiPFwiICYmXG5cdFx0XHRcdHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGggLSAxIF0gPT09IFwiPlwiICYmXG5cdFx0XHRcdHNlbGVjdG9yLmxlbmd0aCA+PSAzICkge1xuXG5cdFx0XHRcdC8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrXG5cdFx0XHRcdG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZFxuXHRcdFx0aWYgKCBtYXRjaCAmJiAoIG1hdGNoWyAxIF0gfHwgIWNvbnRleHQgKSApIHtcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSlcblx0XHRcdFx0aWYgKCBtYXRjaFsgMSBdICkge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDtcblxuXHRcdFx0XHRcdC8vIE9wdGlvbiB0byBydW4gc2NyaXB0cyBpcyB0cnVlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsbHkgbGV0IHRoZSBlcnJvciBiZSB0aHJvd24gaWYgcGFyc2VIVE1MIGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLCBqUXVlcnkucGFyc2VIVE1MKFxuXHRcdFx0XHRcdFx0bWF0Y2hbIDEgXSxcblx0XHRcdFx0XHRcdGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwsIHByb3BzKVxuXHRcdFx0XHRcdGlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsgMSBdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcblx0XHRcdFx0XHRcdGZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXNcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmF0dHIoIG1hdGNoLCBjb250ZXh0WyBtYXRjaCBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoI2lkKVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbIDIgXSApO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQmxhY2tiZXJyeSA0LjZcblx0XHRcdFx0XHQvLyBnRUJJRCByZXR1cm5zIG5vZGVzIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgKCM2OTYzKVxuXHRcdFx0XHRcdGlmICggZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0XHR0aGlzWyAwIF0gPSBlbGVtO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuY29udGV4dCA9IGRvY3VtZW50O1xuXHRcdFx0XHRcdHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKVxuXHRcdFx0fSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGNvbnRleHQgfHwgcm9vdCApLmZpbmQoIHNlbGVjdG9yICk7XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KVxuXHRcdFx0Ly8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZXh0KS5maW5kKGV4cHIpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvciggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHQvLyBIQU5ETEU6ICQoRE9NRWxlbWVudClcblx0XHR9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHtcblx0XHRcdHRoaXMuY29udGV4dCA9IHRoaXNbIDAgXSA9IHNlbGVjdG9yO1xuXHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHQvLyBIQU5ETEU6ICQoZnVuY3Rpb24pXG5cdFx0Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5XG5cdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7XG5cdFx0XHRyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0cm9vdC5yZWFkeSggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSBpbW1lZGlhdGVseSBpZiByZWFkeSBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRzZWxlY3RvciggalF1ZXJ5ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yLnNlbGVjdG9yO1xuXHRcdFx0dGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTtcblx0fTtcblxuLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvblxuaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47XG5cbi8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2VcbnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7XG5cblxudmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxuXG5cdC8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0XG5cdGd1YXJhbnRlZWRVbmlxdWUgPSB7XG5cdFx0Y2hpbGRyZW46IHRydWUsXG5cdFx0Y29udGVudHM6IHRydWUsXG5cdFx0bmV4dDogdHJ1ZSxcblx0XHRwcmV2OiB0cnVlXG5cdH07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0aGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkge1xuXHRcdHZhciB0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSxcblx0XHRcdGwgPSB0YXJnZXRzLmxlbmd0aDtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzWyBpIF0gKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHBvcyA9IHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3JzLCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCApIDpcblx0XHRcdFx0MDtcblxuXHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdGZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cblx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCBwb3MgP1xuXHRcdFx0XHRcdHBvcy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGVcblx0XHRcdFx0XHRjdXIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggY3VyLCBzZWxlY3RvcnMgKSApICkge1xuXG5cdFx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKSA6IG1hdGNoZWQgKTtcblx0fSxcblxuXHQvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXRcblx0aW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnRcblx0XHRpZiAoICFlbGVtICkge1xuXHRcdFx0cmV0dXJuICggdGhpc1sgMCBdICYmIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgPyB0aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aCA6IC0xO1xuXHRcdH1cblxuXHRcdC8vIEluZGV4IGluIHNlbGVjdG9yXG5cdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBpbmRleE9mLmNhbGwoIGpRdWVyeSggZWxlbSApLCB0aGlzWyAwIF0gKTtcblx0XHR9XG5cblx0XHQvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRcblx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLFxuXG5cdFx0XHQvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWRcblx0XHRcdGVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKFxuXHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIClcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xuXHRcdFx0dGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKVxuXHRcdCk7XG5cdH1cbn0gKTtcblxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XG5cdHdoaWxlICggKCBjdXIgPSBjdXJbIGRpciBdICkgJiYgY3VyLm5vZGVUeXBlICE9PSAxICkge31cblx0cmV0dXJuIGN1cjtcbn1cblxualF1ZXJ5LmVhY2goIHtcblx0cGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVudCA6IG51bGw7XG5cdH0sXG5cdHBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiICk7XG5cdH0sXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xuXHR9LFxuXHRuZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXY6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0cHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0c2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7XG5cdH0sXG5cdGNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoIGVsZW0uZmlyc3RDaGlsZCApO1xuXHR9LFxuXHRjb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50IHx8IGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApO1xuXHR9XG59LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApO1xuXG5cdFx0aWYgKCBuYW1lLnNsaWNlKCAtNSApICE9PSBcIlVudGlsXCIgKSB7XG5cdFx0XHRzZWxlY3RvciA9IHVudGlsO1xuXHRcdH1cblxuXHRcdGlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0bWF0Y2hlZCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBtYXRjaGVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGVzXG5cdFx0XHRpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldmVyc2Ugb3JkZXIgZm9yIHBhcmVudHMqIGFuZCBwcmV2LWRlcml2YXRpdmVzXG5cdFx0XHRpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7XG5cdFx0XHRcdG1hdGNoZWQucmV2ZXJzZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZCApO1xuXHR9O1xufSApO1xudmFyIHJub3R3aGl0ZSA9ICggL1xcUysvZyApO1xuXG5cblxuLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXNcbmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cdHZhciBvYmplY3QgPSB7fTtcblx0alF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHtcblx0XHRvYmplY3RbIGZsYWcgXSA9IHRydWU7XG5cdH0gKTtcblx0cmV0dXJuIG9iamVjdDtcbn1cblxuLypcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICpcbiAqXHRvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93XG4gKlx0XHRcdHRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZVxuICogXCJmaXJlZFwiIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFBvc3NpYmxlIG9wdGlvbnM6XG4gKlxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHRtZW1vcnk6XHRcdFx0d2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZFxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxuICpcdFx0XHRcdFx0dmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcbiAqXG4gKlx0c3RvcE9uRmFsc2U6XHRpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2VcbiAqXG4gKi9cbmpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHQvLyBDb252ZXJ0IG9wdGlvbnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0ZWQgaWYgbmVlZGVkXG5cdC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdClcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cblx0XHRjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgOlxuXHRcdGpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7XG5cblx0dmFyIC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmdcblx0XHRmaXJpbmcsXG5cblx0XHQvLyBMYXN0IGZpcmUgdmFsdWUgZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0c1xuXHRcdG1lbW9yeSxcblxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXG5cdFx0ZmlyZWQsXG5cblx0XHQvLyBGbGFnIHRvIHByZXZlbnQgZmlyaW5nXG5cdFx0bG9ja2VkLFxuXG5cdFx0Ly8gQWN0dWFsIGNhbGxiYWNrIGxpc3Rcblx0XHRsaXN0ID0gW10sXG5cblx0XHQvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0c1xuXHRcdHF1ZXVlID0gW10sXG5cblx0XHQvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSBhZGQvcmVtb3ZlIGFzIG5lZWRlZClcblx0XHRmaXJpbmdJbmRleCA9IC0xLFxuXG5cdFx0Ly8gRmlyZSBjYWxsYmFja3Ncblx0XHRmaXJlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuZm9yY2Ugc2luZ2xlLWZpcmluZ1xuXHRcdFx0bG9ja2VkID0gb3B0aW9ucy5vbmNlO1xuXG5cdFx0XHQvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucyxcblx0XHRcdC8vIHJlc3BlY3RpbmcgZmlyaW5nSW5kZXggb3ZlcnJpZGVzIGFuZCBydW50aW1lIGNoYW5nZXNcblx0XHRcdGZpcmVkID0gZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkge1xuXHRcdFx0XHRtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHR3aGlsZSAoICsrZmlyaW5nSW5kZXggPCBsaXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFJ1biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBtZW1vcnlbIDAgXSwgbWVtb3J5WyAxIF0gKSA9PT0gZmFsc2UgJiZcblx0XHRcdFx0XHRcdG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEp1bXAgdG8gZW5kIGFuZCBmb3JnZXQgdGhlIGRhdGEgc28gLmFkZCBkb2Vzbid0IHJlLWZpcmVcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdFxuXHRcdFx0aWYgKCAhb3B0aW9ucy5tZW1vcnkgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaXJpbmcgPSBmYWxzZTtcblxuXHRcdFx0Ly8gQ2xlYW4gdXAgaWYgd2UncmUgZG9uZSBmaXJpbmcgZm9yIGdvb2Rcblx0XHRcdGlmICggbG9ja2VkICkge1xuXG5cdFx0XHRcdC8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHNcblx0XHRcdFx0aWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgdGhpcyBvYmplY3QgaXMgc3BlbnRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsaXN0ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cblx0XHRcdC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3Rcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblxuXHRcdFx0XHRcdC8vIElmIHdlIGhhdmUgbWVtb3J5IGZyb20gYSBwYXN0IHJ1biwgd2Ugc2hvdWxkIGZpcmUgYWZ0ZXIgYWRkaW5nXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0cXVldWUucHVzaCggbWVtb3J5ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0KCBmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiBqUXVlcnkudHlwZSggYXJnICkgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH0gKSggYXJndW1lbnRzICk7XG5cblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Rcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0dmFyIGluZGV4O1xuXHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcblx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID9cblx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDpcblx0XHRcdFx0XHRsaXN0Lmxlbmd0aCA+IDA7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlIGFuZCAuYWRkXG5cdFx0XHQvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdC8vIENsZWFyIGFsbCBjYWxsYmFja3MgYW5kIHZhbHVlc1xuXHRcdFx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhbGlzdDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmVcblx0XHRcdC8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpXG5cdFx0XHQvLyBBYm9ydCBhbnkgcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHRsb2NrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWxvY2tlZDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHNcblx0XHRcdGZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHtcblx0XHRcdFx0aWYgKCAhbG9ja2VkICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0cXVldWUucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdGlmICggIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0RGVmZXJyZWQ6IGZ1bmN0aW9uKCBmdW5jICkge1xuXHRcdHZhciB0dXBsZXMgPSBbXG5cblx0XHRcdFx0Ly8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGxpc3RlbmVyIGxpc3QsIGZpbmFsIHN0YXRlXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCBcInJlamVjdGVkXCIgXSxcblx0XHRcdFx0WyBcIm5vdGlmeVwiLCBcInByb2dyZXNzXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSBdXG5cdFx0XHRdLFxuXHRcdFx0c3RhdGUgPSBcInBlbmRpbmdcIixcblx0XHRcdHByb21pc2UgPSB7XG5cdFx0XHRcdHN0YXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFsd2F5czogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoZW46IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHtcblx0XHRcdFx0XHR2YXIgZm5zID0gYXJndW1lbnRzO1xuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblx0XHRcdFx0XHRcdFx0dmFyIGZuID0galF1ZXJ5LmlzRnVuY3Rpb24oIGZuc1sgaSBdICkgJiYgZm5zWyBpIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWRbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSBmb3IgZm9yd2FyZGluZyBhY3Rpb25zIHRvIG5ld0RlZmVyXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMSBdIF0oIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzID09PSBwcm9taXNlID8gbmV3RGVmZXIucHJvbWlzZSgpIDogdGhpcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHNcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRmbnMgPSBudWxsO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRwcm9taXNlLnBpcGUgPSBwcm9taXNlLnRoZW47XG5cblx0XHQvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzXG5cdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0dmFyIGxpc3QgPSB0dXBsZVsgMiBdLFxuXHRcdFx0XHRzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07XG5cblx0XHRcdC8vIHByb21pc2VbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRkXG5cdFx0XHRwcm9taXNlWyB0dXBsZVsgMSBdIF0gPSBsaXN0LmFkZDtcblxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlXG5cdFx0XHRpZiAoIHN0YXRlU3RyaW5nICkge1xuXHRcdFx0XHRsaXN0LmFkZCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHQvLyBzdGF0ZSA9IFsgcmVzb2x2ZWQgfCByZWplY3RlZCBdXG5cdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblxuXHRcdFx0XHQvLyBbIHJlamVjdF9saXN0IHwgcmVzb2x2ZV9saXN0IF0uZGlzYWJsZTsgcHJvZ3Jlc3NfbGlzdC5sb2NrXG5cdFx0XHRcdH0sIHR1cGxlc1sgaSBeIDEgXVsgMiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0ubG9jayApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyBwcm9taXNlIDogdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fTtcblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSA9IGxpc3QuZmlyZVdpdGg7XG5cdFx0fSApO1xuXG5cdFx0Ly8gTWFrZSB0aGUgZGVmZXJyZWQgYSBwcm9taXNlXG5cdFx0cHJvbWlzZS5wcm9taXNlKCBkZWZlcnJlZCApO1xuXG5cdFx0Ly8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueVxuXHRcdGlmICggZnVuYyApIHtcblx0XHRcdGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGRvbmUhXG5cdFx0cmV0dXJuIGRlZmVycmVkO1xuXHR9LFxuXG5cdC8vIERlZmVycmVkIGhlbHBlclxuXHR3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAuLi4sIHN1Ym9yZGluYXRlTiAqLyApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cdFx0XHRsZW5ndGggPSByZXNvbHZlVmFsdWVzLmxlbmd0aCxcblxuXHRcdFx0Ly8gdGhlIGNvdW50IG9mIHVuY29tcGxldGVkIHN1Ym9yZGluYXRlc1xuXHRcdFx0cmVtYWluaW5nID0gbGVuZ3RoICE9PSAxIHx8XG5cdFx0XHRcdCggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCxcblxuXHRcdFx0Ly8gdGhlIG1hc3RlciBEZWZlcnJlZC5cblx0XHRcdC8vIElmIHJlc29sdmVWYWx1ZXMgY29uc2lzdCBvZiBvbmx5IGEgc2luZ2xlIERlZmVycmVkLCBqdXN0IHVzZSB0aGF0LlxuXHRcdFx0ZGVmZXJyZWQgPSByZW1haW5pbmcgPT09IDEgPyBzdWJvcmRpbmF0ZSA6IGpRdWVyeS5EZWZlcnJlZCgpLFxuXG5cdFx0XHQvLyBVcGRhdGUgZnVuY3Rpb24gZm9yIGJvdGggcmVzb2x2ZSBhbmQgcHJvZ3Jlc3MgdmFsdWVzXG5cdFx0XHR1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGksIGNvbnRleHRzLCB2YWx1ZXMgKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0Y29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0dmFsdWVzWyBpIF0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIDogdmFsdWU7XG5cdFx0XHRcdFx0aWYgKCB2YWx1ZXMgPT09IHByb2dyZXNzVmFsdWVzICkge1xuXHRcdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggY29udGV4dHMsIHZhbHVlcyApO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoICEoIC0tcmVtYWluaW5nICkgKSB7XG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY29udGV4dHMsIHZhbHVlcyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH0sXG5cblx0XHRcdHByb2dyZXNzVmFsdWVzLCBwcm9ncmVzc0NvbnRleHRzLCByZXNvbHZlQ29udGV4dHM7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXJzIHRvIERlZmVycmVkIHN1Ym9yZGluYXRlczsgdHJlYXQgb3RoZXJzIGFzIHJlc29sdmVkXG5cdFx0aWYgKCBsZW5ndGggPiAxICkge1xuXHRcdFx0cHJvZ3Jlc3NWYWx1ZXMgPSBuZXcgQXJyYXkoIGxlbmd0aCApO1xuXHRcdFx0cHJvZ3Jlc3NDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7XG5cdFx0XHRyZXNvbHZlQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSApICkge1xuXHRcdFx0XHRcdHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlKClcblx0XHRcdFx0XHRcdC5wcm9ncmVzcyggdXBkYXRlRnVuYyggaSwgcHJvZ3Jlc3NDb250ZXh0cywgcHJvZ3Jlc3NWYWx1ZXMgKSApXG5cdFx0XHRcdFx0XHQuZG9uZSggdXBkYXRlRnVuYyggaSwgcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICkgKVxuXHRcdFx0XHRcdFx0LmZhaWwoIGRlZmVycmVkLnJlamVjdCApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC0tcmVtYWluaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UncmUgbm90IHdhaXRpbmcgb24gYW55dGhpbmcsIHJlc29sdmUgdGhlIG1hc3RlclxuXHRcdGlmICggIXJlbWFpbmluZyApIHtcblx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9XG59ICk7XG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0O1xuXG5qUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7XG5cblx0Ly8gQWRkIHRoZSBjYWxsYmFja1xuXHRqUXVlcnkucmVhZHkucHJvbWlzZSgpLmRvbmUoIGZuICk7XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy5cblx0aXNSZWFkeTogZmFsc2UsXG5cblx0Ly8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZVxuXHQvLyB0aGUgcmVhZHkgZXZlbnQgZmlyZXMuIFNlZSAjNjc4MVxuXHRyZWFkeVdhaXQ6IDEsXG5cblx0Ly8gSG9sZCAob3IgcmVsZWFzZSkgdGhlIHJlYWR5IGV2ZW50XG5cdGhvbGRSZWFkeTogZnVuY3Rpb24oIGhvbGQgKSB7XG5cdFx0aWYgKCBob2xkICkge1xuXHRcdFx0alF1ZXJ5LnJlYWR5V2FpdCsrO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeVxuXHRyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7XG5cblx0XHQvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5XG5cdFx0aWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmVtZW1iZXIgdGhhdCB0aGUgRE9NIGlzIHJlYWR5XG5cdFx0alF1ZXJ5LmlzUmVhZHkgPSB0cnVlO1xuXG5cdFx0Ly8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmVcblx0XHRpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlXG5cdFx0cmVhZHlMaXN0LnJlc29sdmVXaXRoKCBkb2N1bWVudCwgWyBqUXVlcnkgXSApO1xuXG5cdFx0Ly8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzXG5cdFx0aWYgKCBqUXVlcnkuZm4udHJpZ2dlckhhbmRsZXIgKSB7XG5cdFx0XHRqUXVlcnkoIGRvY3VtZW50ICkudHJpZ2dlckhhbmRsZXIoIFwicmVhZHlcIiApO1xuXHRcdFx0alF1ZXJ5KCBkb2N1bWVudCApLm9mZiggXCJyZWFkeVwiICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8qKlxuICogVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbiAqL1xuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG5cdGpRdWVyeS5yZWFkeSgpO1xufVxuXG5qUXVlcnkucmVhZHkucHJvbWlzZSA9IGZ1bmN0aW9uKCBvYmogKSB7XG5cdGlmICggIXJlYWR5TGlzdCApIHtcblxuXHRcdHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Ly8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcblx0XHQvLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC5cblx0XHQvLyBTdXBwb3J0OiBJRTktMTAgb25seVxuXHRcdC8vIE9sZGVyIElFIHNvbWV0aW1lcyBzaWduYWxzIFwiaW50ZXJhY3RpdmVcIiB0b28gc29vblxuXHRcdGlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiIHx8XG5cdFx0XHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHRcdFx0Ly8gSGFuZGxlIGl0IGFzeW5jaHJvbm91c2x5IHRvIGFsbG93IHNjcmlwdHMgdGhlIG9wcG9ydHVuaXR5IHRvIGRlbGF5IHJlYWR5XG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrXG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cblx0XHRcdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVhZHlMaXN0LnByb21pc2UoIG9iaiApO1xufTtcblxuLy8gS2ljayBvZmYgdGhlIERPTSByZWFkeSBjaGVjayBldmVuIGlmIHRoZSB1c2VyIGRvZXMgbm90XG5qUXVlcnkucmVhZHkucHJvbWlzZSgpO1xuXG5cblxuXG4vLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBvZiBhIGNvbGxlY3Rpb25cbi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvblxudmFyIGFjY2VzcyA9IGZ1bmN0aW9uKCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHJhdyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGVsZW1zLmxlbmd0aCxcblx0XHRidWxrID0ga2V5ID09IG51bGw7XG5cblx0Ly8gU2V0cyBtYW55IHZhbHVlc1xuXHRpZiAoIGpRdWVyeS50eXBlKCBrZXkgKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXHRcdGZvciAoIGkgaW4ga2V5ICkge1xuXHRcdFx0YWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVsgaSBdLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmF3ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGJ1bGsgKSB7XG5cblx0XHRcdC8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldFxuXHRcdFx0aWYgKCByYXcgKSB7XG5cdFx0XHRcdGZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApO1xuXHRcdFx0XHRmbiA9IG51bGw7XG5cblx0XHRcdC8vIC4uLmV4Y2VwdCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvbiB2YWx1ZXNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ1bGsgPSBmbjtcblx0XHRcdFx0Zm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdGZuKFxuXHRcdFx0XHRcdGVsZW1zWyBpIF0sIGtleSwgcmF3ID9cblx0XHRcdFx0XHR2YWx1ZSA6XG5cdFx0XHRcdFx0dmFsdWUuY2FsbCggZWxlbXNbIGkgXSwgaSwgZm4oIGVsZW1zWyBpIF0sIGtleSApIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY2hhaW5hYmxlID9cblx0XHRlbGVtcyA6XG5cblx0XHQvLyBHZXRzXG5cdFx0YnVsayA/XG5cdFx0XHRmbi5jYWxsKCBlbGVtcyApIDpcblx0XHRcdGxlbiA/IGZuKCBlbGVtc1sgMCBdLCBrZXkgKSA6IGVtcHR5R2V0O1xufTtcbnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdC8vIEFjY2VwdHMgb25seTpcblx0Ly8gIC0gTm9kZVxuXHQvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFXG5cdC8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFXG5cdC8vICAtIE9iamVjdFxuXHQvLyAgICAtIEFueVxuXHQvKiBqc2hpbnQgLVcwMTggKi9cblx0cmV0dXJuIG93bmVyLm5vZGVUeXBlID09PSAxIHx8IG93bmVyLm5vZGVUeXBlID09PSA5IHx8ICEoICtvd25lci5ub2RlVHlwZSApO1xufTtcblxuXG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0dGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrO1xufVxuXG5EYXRhLnVpZCA9IDE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXG5cdHJlZ2lzdGVyOiBmdW5jdGlvbiggb3duZXIsIGluaXRpYWwgKSB7XG5cdFx0dmFyIHZhbHVlID0gaW5pdGlhbCB8fCB7fTtcblxuXHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHQvLyB1c2UgcGxhaW4gYXNzaWdubWVudFxuXHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdC8vIE90aGVyd2lzZSBzZWN1cmUgaXQgaW4gYSBub24tZW51bWVyYWJsZSwgbm9uLXdyaXRhYmxlIHByb3BlcnR5XG5cdFx0Ly8gY29uZmlndXJhYmlsaXR5IG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHQvLyBkZWxldGVkIHdpdGggdGhlIGRlbGV0ZSBvcGVyYXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHtcblx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHR9ICk7XG5cdFx0fVxuXHRcdHJldHVybiBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdH0sXG5cdGNhY2hlOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0XHQvLyBXZSBjYW4gYWNjZXB0IGRhdGEgZm9yIG5vbi1lbGVtZW50IG5vZGVzIGluIG1vZGVybiBicm93c2Vycyxcblx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlICM4MzM1LlxuXHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdGlmICggIWFjY2VwdERhdGEoIG93bmVyICkgKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIG93bmVyIG9iamVjdCBhbHJlYWR5IGhhcyBhIGNhY2hlXG5cdFx0dmFyIHZhbHVlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0Ly8gSWYgbm90LCBjcmVhdGUgb25lXG5cdFx0aWYgKCAhdmFsdWUgKSB7XG5cdFx0XHR2YWx1ZSA9IHt9O1xuXG5cdFx0XHQvLyBXZSBjYW4gYWNjZXB0IGRhdGEgZm9yIG5vbi1lbGVtZW50IG5vZGVzIGluIG1vZGVybiBicm93c2Vycyxcblx0XHRcdC8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuXG5cdFx0XHQvLyBBbHdheXMgcmV0dXJuIGFuIGVtcHR5IG9iamVjdC5cblx0XHRcdGlmICggYWNjZXB0RGF0YSggb3duZXIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiBpdCBpcyBhIG5vZGUgdW5saWtlbHkgdG8gYmUgc3RyaW5naWZ5LWVkIG9yIGxvb3BlZCBvdmVyXG5cdFx0XHRcdC8vIHVzZSBwbGFpbiBhc3NpZ25tZW50XG5cdFx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5XG5cdFx0XHRcdC8vIGNvbmZpZ3VyYWJsZSBtdXN0IGJlIHRydWUgdG8gYWxsb3cgdGhlIHByb3BlcnR5IHRvIGJlXG5cdFx0XHRcdC8vIGRlbGV0ZWQgd2hlbiBkYXRhIGlzIHJlbW92ZWRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHtcblx0XHRcdFx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fSxcblx0c2V0OiBmdW5jdGlvbiggb3duZXIsIGRhdGEsIHZhbHVlICkge1xuXHRcdHZhciBwcm9wLFxuXHRcdFx0Y2FjaGUgPSB0aGlzLmNhY2hlKCBvd25lciApO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJnc1xuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgZGF0YSBdID0gdmFsdWU7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIHsgcHJvcGVydGllcyB9IF0gYXJnc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvcHkgdGhlIHByb3BlcnRpZXMgb25lLWJ5LW9uZSB0byB0aGUgY2FjaGUgb2JqZWN0XG5cdFx0XHRmb3IgKCBwcm9wIGluIGRhdGEgKSB7XG5cdFx0XHRcdGNhY2hlWyBwcm9wIF0gPSBkYXRhWyBwcm9wIF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjYWNoZTtcblx0fSxcblx0Z2V0OiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcy5jYWNoZSggb3duZXIgKSA6XG5cdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gJiYgb3duZXJbIHRoaXMuZXhwYW5kbyBdWyBrZXkgXTtcblx0fSxcblx0YWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIHN0b3JlZDtcblxuXHRcdC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWRcblx0XHQvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHQvL1xuXHRcdC8vIFRha2UgdGhlIFwicmVhZFwiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZVxuXHRcdC8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3Rcblx0XHQvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5XG5cdFx0Ly9cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdCggKCBrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiApICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0c3RvcmVkID0gdGhpcy5nZXQoIG93bmVyLCBrZXkgKTtcblxuXHRcdFx0cmV0dXJuIHN0b3JlZCAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0c3RvcmVkIDogdGhpcy5nZXQoIG93bmVyLCBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKSApO1xuXHRcdH1cblxuXHRcdC8vIFdoZW4gdGhlIGtleSBpcyBub3QgYSBzdHJpbmcsIG9yIGJvdGggYSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly8gYXJlIHNwZWNpZmllZCwgc2V0IG9yIGV4dGVuZCAoZXhpc3Rpbmcgb2JqZWN0cykgd2l0aCBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzXG5cdFx0Ly8gICAyLiBBIGtleSBhbmQgdmFsdWVcblx0XHQvL1xuXHRcdHRoaXMuc2V0KCBvd25lciwga2V5LCB2YWx1ZSApO1xuXG5cdFx0Ly8gU2luY2UgdGhlIFwic2V0XCIgcGF0aCBjYW4gaGF2ZSB0d28gcG9zc2libGUgZW50cnkgcG9pbnRzXG5cdFx0Ly8gcmV0dXJuIHRoZSBleHBlY3RlZCBkYXRhIGJhc2VkIG9uIHdoaWNoIHBhdGggd2FzIHRha2VuWypdXG5cdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGtleTtcblx0fSxcblx0cmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHR2YXIgaSwgbmFtZSwgY2FtZWwsXG5cdFx0XHRjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdGlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dGhpcy5yZWdpc3Rlciggb3duZXIgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzXG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCBrZXkgKSApIHtcblxuXHRcdFx0XHQvLyBJZiBcIm5hbWVcIiBpcyBhbiBhcnJheSBvZiBrZXlzLi4uXG5cdFx0XHRcdC8vIFdoZW4gZGF0YSBpcyBpbml0aWFsbHkgY3JlYXRlZCwgdmlhIChcImtleVwiLCBcInZhbFwiKSBzaWduYXR1cmUsXG5cdFx0XHRcdC8vIGtleXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlLlxuXHRcdFx0XHQvLyBTaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCBfaG93XyBhIGtleSB3YXMgYWRkZWQsIHJlbW92ZVxuXHRcdFx0XHQvLyBib3RoIHBsYWluIGtleSBhbmQgY2FtZWxDYXNlIGtleS4gIzEyNzg2XG5cdFx0XHRcdC8vIFRoaXMgd2lsbCBvbmx5IHBlbmFsaXplIHRoZSBhcnJheSBhcmd1bWVudCBwYXRoLlxuXHRcdFx0XHRuYW1lID0ga2V5LmNvbmNhdCgga2V5Lm1hcCggalF1ZXJ5LmNhbWVsQ2FzZSApICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjYW1lbCA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApO1xuXG5cdFx0XHRcdC8vIFRyeSB0aGUgc3RyaW5nIGFzIGEga2V5IGJlZm9yZSBhbnkgbWFuaXB1bGF0aW9uXG5cdFx0XHRcdGlmICgga2V5IGluIGNhY2hlICkge1xuXHRcdFx0XHRcdG5hbWUgPSBbIGtleSwgY2FtZWwgXTtcblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC5cblx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGNyZWF0ZSBhbiBhcnJheSBieSBtYXRjaGluZyBub24td2hpdGVzcGFjZVxuXHRcdFx0XHRcdG5hbWUgPSBjYW1lbDtcblx0XHRcdFx0XHRuYW1lID0gbmFtZSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0XHRbIG5hbWUgXSA6ICggbmFtZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW10gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpID0gbmFtZS5sZW5ndGg7XG5cblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRkZWxldGUgY2FjaGVbIG5hbWVbIGkgXSBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSB0aGUgZXhwYW5kbyBpZiB0aGVyZSdzIG5vIG1vcmUgZGF0YVxuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHwgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICkgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PSAzNS00NStcblx0XHRcdC8vIFdlYmtpdCAmIEJsaW5rIHBlcmZvcm1hbmNlIHN1ZmZlcnMgd2hlbiBkZWxldGluZyBwcm9wZXJ0aWVzXG5cdFx0XHQvLyBmcm9tIERPTSBub2Rlcywgc28gc2V0IHRvIHVuZGVmaW5lZCBpbnN0ZWFkXG5cdFx0XHQvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3XG5cdFx0XHRpZiAoIG93bmVyLm5vZGVUeXBlICkge1xuXHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aGFzRGF0YTogZnVuY3Rpb24oIG93bmVyICkge1xuXHRcdHZhciBjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblx0XHRyZXR1cm4gY2FjaGUgIT09IHVuZGVmaW5lZCAmJiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICk7XG5cdH1cbn07XG52YXIgZGF0YVByaXYgPSBuZXcgRGF0YSgpO1xuXG52YXIgZGF0YVVzZXIgPSBuZXcgRGF0YSgpO1xuXG5cblxuLy9cdEltcGxlbWVudGF0aW9uIFN1bW1hcnlcbi8vXG4vL1x0MS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaFxuLy9cdDIuIEltcHJvdmUgdGhlIG1vZHVsZSdzIG1haW50YWluYWJpbGl0eSBieSByZWR1Y2luZyB0aGUgc3RvcmFnZVxuLy9cdFx0cGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLlxuLy9cdDMuIFVzZSB0aGUgc2FtZSBzaW5nbGUgbWVjaGFuaXNtIHRvIHN1cHBvcnQgXCJwcml2YXRlXCIgYW5kIFwidXNlclwiIGRhdGEuXG4vL1x0NC4gX05ldmVyXyBleHBvc2UgXCJwcml2YXRlXCIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKVxuLy9cdDUuIEF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5kbyBwcm9wZXJ0aWVzKVxuLy9cdDYuIFByb3ZpZGUgYSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRhdGlvbiB1cGdyYWRlIHRvIFdlYWtNYXAgaW4gMjAxNFxuXG52YXIgcmJyYWNlID0gL14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvLFxuXHRybXVsdGlEYXNoID0gL1tBLVpdL2c7XG5cbmZ1bmN0aW9uIGRhdGFBdHRyKCBlbGVtLCBrZXksIGRhdGEgKSB7XG5cdHZhciBuYW1lO1xuXG5cdC8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnlcblx0Ly8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlXG5cdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0bmFtZSA9IFwiZGF0YS1cIiArIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCBcIi0kJlwiICkudG9Mb3dlckNhc2UoKTtcblx0XHRkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTtcblxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRkYXRhID0gZGF0YSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDpcblx0XHRcdFx0XHRkYXRhID09PSBcImZhbHNlXCIgPyBmYWxzZSA6XG5cdFx0XHRcdFx0ZGF0YSA9PT0gXCJudWxsXCIgPyBudWxsIDpcblxuXHRcdFx0XHRcdC8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nXG5cdFx0XHRcdFx0K2RhdGEgKyBcIlwiID09PSBkYXRhID8gK2RhdGEgOlxuXHRcdFx0XHRcdHJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBkYXRhICkgOlxuXHRcdFx0XHRcdGRhdGE7XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRlclxuXHRcdFx0ZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmhhc0RhdGEoIGVsZW0gKSB8fCBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICk7XG5cdH0sXG5cblx0ZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFVc2VyLnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9LFxuXG5cdC8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkXG5cdC8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLlxuXHRfZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdF9yZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBpLCBuYW1lLCBkYXRhLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGF0dHJzID0gZWxlbSAmJiBlbGVtLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBHZXRzIGFsbCB2YWx1ZXNcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB0aGlzLmxlbmd0aCApIHtcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSApO1xuXG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhZGF0YVByaXYuZ2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiICkgKSB7XG5cdFx0XHRcdFx0aSA9IGF0dHJzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUxMStcblx0XHRcdFx0XHRcdC8vIFRoZSBhdHRycyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0KVxuXHRcdFx0XHRcdFx0aWYgKCBhdHRyc1sgaSBdICkge1xuXHRcdFx0XHRcdFx0XHRuYW1lID0gYXR0cnNbIGkgXS5uYW1lO1xuXHRcdFx0XHRcdFx0XHRpZiAoIG5hbWUuaW5kZXhPZiggXCJkYXRhLVwiICkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoIDUgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xuXHRcdGlmICggdHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhLCBjYW1lbEtleTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gd2l0aCB0aGUga2V5IGFzLWlzXG5cdFx0XHRcdGRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApIHx8XG5cblx0XHRcdFx0XHQvLyBUcnkgdG8gZmluZCBkYXNoZWQga2V5IGlmIGl0IGV4aXN0cyAoZ2gtMjc3OSlcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGZvciAyLjIueCBvbmx5XG5cdFx0XHRcdFx0ZGF0YVVzZXIuZ2V0KCBlbGVtLCBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCkgKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhbWVsS2V5ID0galF1ZXJ5LmNhbWVsQ2FzZSgga2V5ICk7XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyB3aXRoIHRoZSBrZXkgY2FtZWxpemVkXG5cdFx0XHRcdGRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGNhbWVsS2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGNhbWVsS2V5LCB1bmRlZmluZWQgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSB0cmllZCByZWFsbHkgaGFyZCwgYnV0IHRoZSBkYXRhIGRvZXNuJ3QgZXhpc3QuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IHRoZSBkYXRhLi4uXG5cdFx0XHRjYW1lbEtleSA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApO1xuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBGaXJzdCwgYXR0ZW1wdCB0byBzdG9yZSBhIGNvcHkgb3IgcmVmZXJlbmNlIG9mIGFueVxuXHRcdFx0XHQvLyBkYXRhIHRoYXQgbWlnaHQndmUgYmVlbiBzdG9yZSB3aXRoIGEgY2FtZWxDYXNlZCBrZXkuXG5cdFx0XHRcdHZhciBkYXRhID0gZGF0YVVzZXIuZ2V0KCB0aGlzLCBjYW1lbEtleSApO1xuXG5cdFx0XHRcdC8vIEZvciBIVE1MNSBkYXRhLSogYXR0cmlidXRlIGludGVyb3AsIHdlIGhhdmUgdG9cblx0XHRcdFx0Ly8gc3RvcmUgcHJvcGVydHkgbmFtZXMgd2l0aCBkYXNoZXMgaW4gYSBjYW1lbENhc2UgZm9ybS5cblx0XHRcdFx0Ly8gVGhpcyBtaWdodCBub3QgYXBwbHkgdG8gYWxsIHByb3BlcnRpZXMuLi4qXG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywgY2FtZWxLZXksIHZhbHVlICk7XG5cblx0XHRcdFx0Ly8gKi4uLiBJbiB0aGUgY2FzZSBvZiBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgX2FjdHVhbGx5X1xuXHRcdFx0XHQvLyBoYXZlIGRhc2hlcywgd2UgbmVlZCB0byBhbHNvIHN0b3JlIGEgY29weSBvZiB0aGF0XG5cdFx0XHRcdC8vIHVuY2hhbmdlZCBwcm9wZXJ0eS5cblx0XHRcdFx0aWYgKCBrZXkuaW5kZXhPZiggXCItXCIgKSA+IC0xICYmIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBxdWV1ZTtcblxuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHR5cGUgPSAoIHR5cGUgfHwgXCJmeFwiICkgKyBcInF1ZXVlXCI7XG5cdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5vdCBwdWJsaWMgLSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFQcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyBcInF1ZXVlXCIsIGtleSBdICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YVByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG52YXIgcG51bSA9ICggL1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8gKS5zb3VyY2U7XG5cbnZhciByY3NzTnVtID0gbmV3IFJlZ0V4cCggXCJeKD86KFsrLV0pPXwpKFwiICsgcG51bSArIFwiKShbYS16JV0qKSRcIiwgXCJpXCIgKTtcblxuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBpc0hpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtLCBlbCApIHtcblxuXHRcdC8vIGlzSGlkZGVuIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGpRdWVyeSNmaWx0ZXIgZnVuY3Rpb247XG5cdFx0Ly8gaW4gdGhhdCBjYXNlLCBlbGVtZW50IHdpbGwgYmUgc2Vjb25kIGFyZ3VtZW50XG5cdFx0ZWxlbSA9IGVsIHx8IGVsZW07XG5cdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgPT09IFwibm9uZVwiIHx8XG5cdFx0XHQhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblx0fTtcblxuXG5cbmZ1bmN0aW9uIGFkanVzdENTUyggZWxlbSwgcHJvcCwgdmFsdWVQYXJ0cywgdHdlZW4gKSB7XG5cdHZhciBhZGp1c3RlZCxcblx0XHRzY2FsZSA9IDEsXG5cdFx0bWF4SXRlcmF0aW9ucyA9IDIwLFxuXHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuID9cblx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gdHdlZW4uY3VyKCk7IH0gOlxuXHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wLCBcIlwiICk7IH0sXG5cdFx0aW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLFxuXHRcdHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdC8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzXG5cdFx0aW5pdGlhbEluVW5pdCA9ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiAraW5pdGlhbCApICYmXG5cdFx0XHRyY3NzTnVtLmV4ZWMoIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AgKSApO1xuXG5cdGlmICggaW5pdGlhbEluVW5pdCAmJiBpbml0aWFsSW5Vbml0WyAzIF0gIT09IHVuaXQgKSB7XG5cblx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0dW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdHZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdO1xuXG5cdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWwgfHwgMTtcblxuXHRcdGRvIHtcblxuXHRcdFx0Ly8gSWYgcHJldmlvdXMgaXRlcmF0aW9uIHplcm9lZCBvdXQsIGRvdWJsZSB1bnRpbCB3ZSBnZXQgKnNvbWV0aGluZyouXG5cdFx0XHQvLyBVc2Ugc3RyaW5nIGZvciBkb3VibGluZyBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvd1xuXHRcdFx0c2NhbGUgPSBzY2FsZSB8fCBcIi41XCI7XG5cblx0XHRcdC8vIEFkanVzdCBhbmQgYXBwbHlcblx0XHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7XG5cdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cblx0XHQvLyBVcGRhdGUgc2NhbGUsIHRvbGVyYXRpbmcgemVybyBvciBOYU4gZnJvbSB0d2Vlbi5jdXIoKVxuXHRcdC8vIEJyZWFrIHRoZSBsb29wIGlmIHNjYWxlIGlzIHVuY2hhbmdlZCBvciBwZXJmZWN0LCBvciBpZiB3ZSd2ZSBqdXN0IGhhZCBlbm91Z2guXG5cdFx0fSB3aGlsZSAoXG5cdFx0XHRzY2FsZSAhPT0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCApICYmIHNjYWxlICE9PSAxICYmIC0tbWF4SXRlcmF0aW9uc1xuXHRcdCk7XG5cdH1cblxuXHRpZiAoIHZhbHVlUGFydHMgKSB7XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFsIHx8IDA7XG5cblx0XHQvLyBBcHBseSByZWxhdGl2ZSBvZmZzZXQgKCs9Ly09KSBpZiBzcGVjaWZpZWRcblx0XHRhZGp1c3RlZCA9IHZhbHVlUGFydHNbIDEgXSA/XG5cdFx0XHRpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOlxuXHRcdFx0K3ZhbHVlUGFydHNbIDIgXTtcblx0XHRpZiAoIHR3ZWVuICkge1xuXHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHR0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7XG5cdFx0XHR0d2Vlbi5lbmQgPSBhZGp1c3RlZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkanVzdGVkO1xufVxudmFyIHJjaGVja2FibGVUeXBlID0gKCAvXig/OmNoZWNrYm94fHJhZGlvKSQvaSApO1xuXG52YXIgcnRhZ05hbWUgPSAoIC88KFtcXHc6LV0rKS8gKTtcblxudmFyIHJzY3JpcHRUeXBlID0gKCAvXiR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pICk7XG5cblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gU3VwcG9ydDogSUU5XG5cdG9wdGlvbjogWyAxLCBcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIiwgXCI8L3NlbGVjdD5cIiBdLFxuXG5cdC8vIFhIVE1MIHBhcnNlcnMgZG8gbm90IG1hZ2ljYWxseSBpbnNlcnQgZWxlbWVudHMgaW4gdGhlXG5cdC8vIHNhbWUgd2F5IHRoYXQgdGFnIHNvdXAgcGFyc2VycyBkby4gU28gd2UgY2Fubm90IHNob3J0ZW5cblx0Ly8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLlxuXHR0aGVhZDogWyAxLCBcIjx0YWJsZT5cIiwgXCI8L3RhYmxlPlwiIF0sXG5cdGNvbDogWyAyLCBcIjx0YWJsZT48Y29sZ3JvdXA+XCIsIFwiPC9jb2xncm91cD48L3RhYmxlPlwiIF0sXG5cdHRyOiBbIDIsIFwiPHRhYmxlPjx0Ym9keT5cIiwgXCI8L3Rib2R5PjwvdGFibGU+XCIgXSxcblx0dGQ6IFsgMywgXCI8dGFibGU+PHRib2R5Pjx0cj5cIiwgXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXG5cdF9kZWZhdWx0OiBbIDAsIFwiXCIsIFwiXCIgXVxufTtcblxuLy8gU3VwcG9ydDogSUU5XG53cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247XG5cbndyYXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7XG53cmFwTWFwLnRoID0gd3JhcE1hcC50ZDtcblxuXG5mdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHtcblxuXHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdC8vIFVzZSB0eXBlb2YgdG8gYXZvaWQgemVyby1hcmd1bWVudCBtZXRob2QgaW52b2NhdGlvbiBvbiBob3N0IG9iamVjdHMgKCMxNTE1MSlcblx0dmFyIHJldCA9IHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiID9cblx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCBcIipcIiApIDpcblx0XHRcdHR5cGVvZiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwgIT09IFwidW5kZWZpbmVkXCIgP1xuXHRcdFx0XHRjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCBcIipcIiApIDpcblx0XHRcdFtdO1xuXG5cdHJldHVybiB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSA/XG5cdFx0alF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICkgOlxuXHRcdHJldDtcbn1cblxuXG4vLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWRcbmZ1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGRhdGFQcml2LnNldChcblx0XHRcdGVsZW1zWyBpIF0sXG5cdFx0XHRcImdsb2JhbEV2YWxcIixcblx0XHRcdCFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sIFwiZ2xvYmFsRXZhbFwiIClcblx0XHQpO1xuXHR9XG59XG5cblxudmFyIHJodG1sID0gLzx8JiM/XFx3KzsvO1xuXG5mdW5jdGlvbiBidWlsZEZyYWdtZW50KCBlbGVtcywgY29udGV4dCwgc2NyaXB0cywgc2VsZWN0aW9uLCBpZ25vcmVkICkge1xuXHR2YXIgZWxlbSwgdG1wLCB0YWcsIHdyYXAsIGNvbnRhaW5zLCBqLFxuXHRcdGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0bm9kZXMgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRlbGVtID0gZWxlbXNbIGkgXTtcblxuXHRcdGlmICggZWxlbSB8fCBlbGVtID09PSAwICkge1xuXG5cdFx0XHQvLyBBZGQgbm9kZXMgZGlyZWN0bHlcblx0XHRcdGlmICggalF1ZXJ5LnR5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMSwgUGhhbnRvbUpTPDJcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O1xuXHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHQvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnRcblx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wLmxhc3RDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xLCBQaGFudG9tSlM8MlxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMgYXJlIG9ycGhhbmVkICgjMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50O1xufVxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMC00LjMsIFNhZmFyaTw9NS4xXG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBTYWZhcmk8PTUuMSwgQW5kcm9pZDw0LjJcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRTw9MTErXG5cdC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkgY2xvbmVkXG5cdGRpdi5pbm5lckhUTUwgPSBcIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIjtcblx0c3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9ICEhZGl2LmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7XG59ICkoKTtcblxuXG52YXJcblx0cmtleUV2ZW50ID0gL15rZXkvLFxuXHRybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxcblx0cnR5cGVuYW1lc3BhY2UgPSAvXihbXi5dKikoPzpcXC4oLispfCkvO1xuXG5mdW5jdGlvbiByZXR1cm5UcnVlKCkge1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLy8gU3VwcG9ydDogSUU5XG4vLyBTZWUgIzEzMzkzIGZvciBtb3JlIGluZm9cbmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXHR9IGNhdGNoICggZXJyICkgeyB9XG59XG5cbmZ1bmN0aW9uIG9uKCBlbGVtLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCBvbmUgKSB7XG5cdHZhciBvcmlnRm4sIHR5cGU7XG5cblx0Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzXG5cdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhIClcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKVxuXHRcdFx0ZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdG9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7XG5cdFx0fVxuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHtcblxuXHRcdC8vICggdHlwZXMsIGZuIClcblx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdGRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgZGF0YSwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdH0gZWxzZSBpZiAoICFmbiApIHtcblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggb25lID09PSAxICkge1xuXHRcdG9yaWdGbiA9IGZuO1xuXHRcdGZuID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHQvLyBDYW4gdXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm9cblx0XHRcdGpRdWVyeSgpLm9mZiggZXZlbnQgKTtcblx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH07XG5cblx0XHQvLyBVc2Ugc2FtZSBndWlkIHNvIGNhbGxlciBjYW4gcmVtb3ZlIHVzaW5nIG9yaWdGblxuXHRcdGZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApO1xuXHR9XG5cdHJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTtcblx0fSApO1xufVxuXG4vKlxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxuICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy5cbiAqL1xualF1ZXJ5LmV2ZW50ID0ge1xuXG5cdGdsb2JhbDoge30sXG5cblx0YWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkge1xuXG5cdFx0dmFyIGhhbmRsZU9iakluLCBldmVudEhhbmRsZSwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2LmdldCggZWxlbSApO1xuXG5cdFx0Ly8gRG9uJ3QgYXR0YWNoIGV2ZW50cyB0byBub0RhdGEgb3IgdGV4dC9jb21tZW50IG5vZGVzIChidXQgYWxsb3cgcGxhaW4gb2JqZWN0cylcblx0XHRpZiAoICFlbGVtRGF0YSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXJcblx0XHRpZiAoIGhhbmRsZXIuaGFuZGxlciApIHtcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcblx0XHRcdGhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyO1xuXHRcdFx0c2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3Rvcjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWyAxIF07XG5cdFx0XHRuYW1lc3BhY2VzID0gKCB0bXBbIDIgXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBUaGVyZSAqbXVzdCogYmUgYSB0eXBlLCBubyBhdHRhY2hpbmcgbmFtZXNwYWNlLW9ubHkgaGFuZGxlcnNcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBJZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3RoZXJ3aXNlIGdpdmVuIHR5cGVcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblxuXHRcdFx0Ly8gVXBkYXRlIHNwZWNpYWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzXG5cdFx0XHRoYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdG9yaWdUeXBlOiBvcmlnVHlwZSxcblx0XHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdFx0aGFuZGxlcjogaGFuZGxlcixcblx0XHRcdFx0Z3VpZDogaGFuZGxlci5ndWlkLFxuXHRcdFx0XHRzZWxlY3Rvcjogc2VsZWN0b3IsXG5cdFx0XHRcdG5lZWRzQ29udGV4dDogc2VsZWN0b3IgJiYgalF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICksXG5cdFx0XHRcdG5hbWVzcGFjZTogbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApXG5cdFx0XHR9LCBoYW5kbGVPYmpJbiApO1xuXG5cdFx0XHQvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdFxuXHRcdFx0aWYgKCAhKCBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdICkgKSB7XG5cdFx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTtcblx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudCA9IDA7XG5cblx0XHRcdFx0Ly8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lciBpZiB0aGUgc3BlY2lhbCBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlXG5cdFx0XHRcdGlmICggIXNwZWNpYWwuc2V0dXAgfHxcblx0XHRcdFx0XHRzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0aWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3BlY2lhbC5hZGQgKSB7XG5cdFx0XHRcdHNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXG5cdFx0XHRcdGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udFxuXHRcdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb25cblx0XHRcdGpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7XG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50XG5cdHJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7XG5cblx0XHR2YXIgaiwgb3JpZ0NvdW50LCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YVByaXYuaGFzRGF0YSggZWxlbSApICYmIGRhdGFQcml2LmdldCggZWxlbSApO1xuXG5cdFx0aWYgKCAhZWxlbURhdGEgfHwgISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUgb21pdHRlZFxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudFxuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSB8fCBbXTtcblx0XHRcdHRtcCA9IHRtcFsgMiBdICYmXG5cdFx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApO1xuXG5cdFx0XHQvLyBSZW1vdmUgbWF0Y2hpbmcgZXZlbnRzXG5cdFx0XHRvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07XG5cblx0XHRcdFx0aWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJlxuXHRcdFx0XHRcdCggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmXG5cdFx0XHRcdFx0KCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJlxuXHRcdFx0XHRcdCggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHxcblx0XHRcdFx0XHRcdHNlbGVjdG9yID09PSBcIioqXCIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7XG5cdFx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7XG5cblx0XHRcdFx0XHRpZiAoIGhhbmRsZU9iai5zZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBzcGVjaWFsLnJlbW92ZSApIHtcblx0XHRcdFx0XHRcdHNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIHdlIHJlbW92ZWQgc29tZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4aXN0XG5cdFx0XHQvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycylcblx0XHRcdGlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRcdGlmICggIXNwZWNpYWwudGVhcmRvd24gfHxcblx0XHRcdFx0XHRzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZWxldGUgZXZlbnRzWyB0eXBlIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIGRhdGEgYW5kIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWRcblx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHtcblx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJoYW5kbGUgZXZlbnRzXCIgKTtcblx0XHR9XG5cdH0sXG5cblx0ZGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxuXHRcdGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaixcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGRhdGFQcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWyAwIF0gPSBldmVudDtcblx0XHRldmVudC5kZWxlZ2F0ZVRhcmdldCA9IHRoaXM7XG5cblx0XHQvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkXG5cdFx0aWYgKCBzcGVjaWFsLnByZURpc3BhdGNoICYmIHNwZWNpYWwucHJlRGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGhhbmRsZXJzXG5cdFx0aGFuZGxlclF1ZXVlID0galF1ZXJ5LmV2ZW50LmhhbmRsZXJzLmNhbGwoIHRoaXMsIGV2ZW50LCBoYW5kbGVycyApO1xuXG5cdFx0Ly8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkgd2FudCB0byBzdG9wIHByb3BhZ2F0aW9uIGJlbmVhdGggdXNcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggbWF0Y2hlZCA9IGhhbmRsZXJRdWV1ZVsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07XG5cblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiZcblx0XHRcdFx0IWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdFx0Ly8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGhhdmUgbm8gbmFtZXNwYWNlLCBvciAyKSBoYXZlIG5hbWVzcGFjZShzKVxuXHRcdFx0XHQvLyBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQgKGJvdGggY2FuIGhhdmUgbm8gbmFtZXNwYWNlKS5cblx0XHRcdFx0aWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHtcblxuXHRcdFx0XHRcdGV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajtcblx0XHRcdFx0XHRldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cblx0XHRcdFx0XHRyZXQgPSAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9ICkuaGFuZGxlIHx8XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZXZlbnQucmVzdWx0ID0gcmV0ICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXG5cdFx0aWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHtcblx0XHRcdHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgaSwgbWF0Y2hlcywgc2VsLCBoYW5kbGVPYmosXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gU3VwcG9ydCAoYXQgbGVhc3QpOiBDaHJvbWUsIElFOVxuXHRcdC8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnNcblx0XHQvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAoIzEzMTgwKVxuXHRcdC8vXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDw9NDIrXG5cdFx0Ly8gQXZvaWQgbm9uLWxlZnQtY2xpY2sgaW4gRkYgYnV0IGRvbid0IGJsb2NrIElFIHJhZGlvIGV2ZW50cyAoIzM4NjEsIGdoLTIzNDMpXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmIGN1ci5ub2RlVHlwZSAmJlxuXHRcdFx0KCBldmVudC50eXBlICE9PSBcImNsaWNrXCIgfHwgaXNOYU4oIGV2ZW50LmJ1dHRvbiApIHx8IGV2ZW50LmJ1dHRvbiA8IDEgKSApIHtcblxuXHRcdFx0Zm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpXG5cdFx0XHRcdC8vIERvbid0IHByb2Nlc3MgY2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzExNzY0KVxuXHRcdFx0XHRpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiAoIGN1ci5kaXNhYmxlZCAhPT0gdHJ1ZSB8fCBldmVudC50eXBlICE9PSBcImNsaWNrXCIgKSApIHtcblx0XHRcdFx0XHRtYXRjaGVzID0gW107XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoIzEzMjAzKVxuXHRcdFx0XHRcdFx0c2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgXCIgXCI7XG5cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlc1sgc2VsIF0gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID9cblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDpcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVzWyBzZWwgXSApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZXMgfSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnNcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiB0aGlzLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhhbmRsZXJRdWV1ZTtcblx0fSxcblxuXHQvLyBJbmNsdWRlcyBzb21lIGV2ZW50IHByb3BzIHNoYXJlZCBieSBLZXlFdmVudCBhbmQgTW91c2VFdmVudFxuXHRwcm9wczogKCBcImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRldGFpbCBldmVudFBoYXNlIFwiICtcblx0XHRcIm1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2hcIiApLnNwbGl0KCBcIiBcIiApLFxuXG5cdGZpeEhvb2tzOiB7fSxcblxuXHRrZXlIb29rczoge1xuXHRcdHByb3BzOiBcImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGVcIi5zcGxpdCggXCIgXCIgKSxcblx0XHRmaWx0ZXI6IGZ1bmN0aW9uKCBldmVudCwgb3JpZ2luYWwgKSB7XG5cblx0XHRcdC8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50c1xuXHRcdFx0aWYgKCBldmVudC53aGljaCA9PSBudWxsICkge1xuXHRcdFx0XHRldmVudC53aGljaCA9IG9yaWdpbmFsLmNoYXJDb2RlICE9IG51bGwgPyBvcmlnaW5hbC5jaGFyQ29kZSA6IG9yaWdpbmFsLmtleUNvZGU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cdH0sXG5cblx0bW91c2VIb29rczoge1xuXHRcdHByb3BzOiAoIFwiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBcIiArXG5cdFx0XHRcInNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnRcIiApLnNwbGl0KCBcIiBcIiApLFxuXHRcdGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHtcblx0XHRcdHZhciBldmVudERvYywgZG9jLCBib2R5LFxuXHRcdFx0XHRidXR0b24gPSBvcmlnaW5hbC5idXR0b247XG5cblx0XHRcdC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGVcblx0XHRcdGlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7XG5cdFx0XHRcdGV2ZW50RG9jID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG5cdFx0XHRcdGRvYyA9IGV2ZW50RG9jLmRvY3VtZW50RWxlbWVudDtcblx0XHRcdFx0Ym9keSA9IGV2ZW50RG9jLmJvZHk7XG5cblx0XHRcdFx0ZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICtcblx0XHRcdFx0XHQoIGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwICkgLVxuXHRcdFx0XHRcdCggZG9jICYmIGRvYy5jbGllbnRMZWZ0IHx8IGJvZHkgJiYgYm9keS5jbGllbnRMZWZ0IHx8IDAgKTtcblx0XHRcdFx0ZXZlbnQucGFnZVkgPSBvcmlnaW5hbC5jbGllbnRZICtcblx0XHRcdFx0XHQoIGRvYyAmJiBkb2Muc2Nyb2xsVG9wICB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wICB8fCAwICkgLVxuXHRcdFx0XHRcdCggZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDAgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodFxuXHRcdFx0Ly8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXRcblx0XHRcdGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRldmVudC53aGljaCA9ICggYnV0dG9uICYgMSA/IDEgOiAoIGJ1dHRvbiAmIDIgPyAzIDogKCBidXR0b24gJiA0ID8gMiA6IDAgKSApICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cdH0sXG5cblx0Zml4OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0aWYgKCBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSApIHtcblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYSB3cml0YWJsZSBjb3B5IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXNcblx0XHR2YXIgaSwgcHJvcCwgY29weSxcblx0XHRcdHR5cGUgPSBldmVudC50eXBlLFxuXHRcdFx0b3JpZ2luYWxFdmVudCA9IGV2ZW50LFxuXHRcdFx0Zml4SG9vayA9IHRoaXMuZml4SG9va3NbIHR5cGUgXTtcblxuXHRcdGlmICggIWZpeEhvb2sgKSB7XG5cdFx0XHR0aGlzLmZpeEhvb2tzWyB0eXBlIF0gPSBmaXhIb29rID1cblx0XHRcdFx0cm1vdXNlRXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5tb3VzZUhvb2tzIDpcblx0XHRcdFx0cmtleUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMua2V5SG9va3MgOlxuXHRcdFx0XHR7fTtcblx0XHR9XG5cdFx0Y29weSA9IGZpeEhvb2sucHJvcHMgPyB0aGlzLnByb3BzLmNvbmNhdCggZml4SG9vay5wcm9wcyApIDogdGhpcy5wcm9wcztcblxuXHRcdGV2ZW50ID0gbmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXG5cdFx0aSA9IGNvcHkubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0cHJvcCA9IGNvcHlbIGkgXTtcblx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogQ29yZG92YSAyLjUgKFdlYktpdCkgKCMxMzI1NSlcblx0XHQvLyBBbGwgZXZlbnRzIHNob3VsZCBoYXZlIGEgdGFyZ2V0OyBDb3Jkb3ZhIGRldmljZXJlYWR5IGRvZXNuJ3Rcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBkb2N1bWVudDtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgNi4wKywgQ2hyb21lPDI4XG5cdFx0Ly8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKCM1MDQsICMxMzE0Mylcblx0XHRpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmaXhIb29rLmZpbHRlciA/IGZpeEhvb2suZmlsdGVyKCBldmVudCwgb3JpZ2luYWxFdmVudCApIDogZXZlbnQ7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblxuXHRcdFx0Ly8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZFxuXHRcdFx0bm9CdWJibGU6IHRydWVcblx0XHR9LFxuXHRcdGZvY3VzOiB7XG5cblx0XHRcdC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkge1xuXHRcdFx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNpblwiXG5cdFx0fSxcblx0XHRibHVyOiB7XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHtcblx0XHRcdFx0XHR0aGlzLmJsdXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNvdXRcIlxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHRcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHRoaXMuY2xpY2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR0aGlzLmNsaWNrKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBGb3IgY3Jvc3MtYnJvd3NlciBjb25zaXN0ZW5jeSwgZG9uJ3QgZmlyZSBuYXRpdmUgLmNsaWNrKCkgb24gbGlua3Ncblx0XHRcdF9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgXCJhXCIgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0YmVmb3JldW5sb2FkOiB7XG5cdFx0XHRwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDIwK1xuXHRcdFx0XHQvLyBGaXJlZm94IGRvZXNuJ3QgYWxlcnQgaWYgdGhlIHJldHVyblZhbHVlIGZpZWxkIGlzIG5vdCBzZXQuXG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkge1xuXG5cdC8vIFRoaXMgXCJpZlwiIGlzIG5lZWRlZCBmb3IgcGxhaW4gb2JqZWN0c1xuXHRpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHtcblx0XHRlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApO1xuXHR9XG59O1xuXG5qUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjLCBwcm9wcyApIHtcblxuXHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmRcblx0aWYgKCAhKCB0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50ICkgKSB7XG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIEV2ZW50IG9iamVjdFxuXHRpZiAoIHNyYyAmJiBzcmMudHlwZSApIHtcblx0XHR0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7XG5cdFx0dGhpcy50eXBlID0gc3JjLnR5cGU7XG5cblx0XHQvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZFxuXHRcdC8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLlxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHxcblx0XHRcdFx0c3JjLmRlZmF1bHRQcmV2ZW50ZWQgPT09IHVuZGVmaW5lZCAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wXG5cdFx0XHRcdHNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0cmV0dXJuVHJ1ZSA6XG5cdFx0XHRyZXR1cm5GYWxzZTtcblxuXHQvLyBFdmVudCB0eXBlXG5cdH0gZWxzZSB7XG5cdFx0dGhpcy50eXBlID0gc3JjO1xuXHR9XG5cblx0Ly8gUHV0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcHJvcGVydGllcyBvbnRvIHRoZSBldmVudCBvYmplY3Rcblx0aWYgKCBwcm9wcyApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aGlzLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcblx0dGhpcy50aW1lU3RhbXAgPSBzcmMgJiYgc3JjLnRpbWVTdGFtcCB8fCBqUXVlcnkubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LFxuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNTaW11bGF0ZWQ6IGZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gc28gdGhhdCBldmVudCBkZWxlZ2F0aW9uIHdvcmtzIGluIGpRdWVyeS5cbi8vIERvIHRoZSBzYW1lIGZvciBwb2ludGVyZW50ZXIvcG9pbnRlcmxlYXZlIGFuZCBwb2ludGVyb3Zlci9wb2ludGVyb3V0XG4vL1xuLy8gU3VwcG9ydDogU2FmYXJpIDcgb25seVxuLy8gU2FmYXJpIHNlbmRzIG1vdXNlZW50ZXIgdG9vIG9mdGVuOyBzZWU6XG4vLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDcwMjU4XG4vLyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBidWcgKGl0IGV4aXN0ZWQgaW4gb2xkZXIgQ2hyb21lIHZlcnNpb25zIGFzIHdlbGwpLlxualF1ZXJ5LmVhY2goIHtcblx0bW91c2VlbnRlcjogXCJtb3VzZW92ZXJcIixcblx0bW91c2VsZWF2ZTogXCJtb3VzZW91dFwiLFxuXHRwb2ludGVyZW50ZXI6IFwicG9pbnRlcm92ZXJcIixcblx0cG9pbnRlcmxlYXZlOiBcInBvaW50ZXJvdXRcIlxufSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHtcblx0XHRkZWxlZ2F0ZVR5cGU6IGZpeCxcblx0XHRiaW5kVHlwZTogZml4LFxuXG5cdFx0aGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHR0YXJnZXQgPSB0aGlzLFxuXHRcdFx0XHRyZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCxcblx0XHRcdFx0aGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqO1xuXG5cdFx0XHQvLyBGb3IgbW91c2VlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LlxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcblx0XHRcdGlmICggIXJlbGF0ZWQgfHwgKCByZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkgKSApIHtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTtcblx0XHRcdFx0cmV0ID0gaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRldmVudC50eXBlID0gZml4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0b246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHRvbmU6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xuXHR9LFxuXHRvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkge1xuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XG5cdFx0aWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7XG5cblx0XHRcdC8vICggZXZlbnQgKSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnRcblx0XHRcdGhhbmRsZU9iaiA9IHR5cGVzLmhhbmRsZU9iajtcblx0XHRcdGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoXG5cdFx0XHRcdGhhbmRsZU9iai5uYW1lc3BhY2UgP1xuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlLFxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXG5cdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLW9iamVjdCBbLCBzZWxlY3Rvcl0gKVxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdFx0dGhpcy5vZmYoIHR5cGUsIHNlbGVjdG9yLCB0eXBlc1sgdHlwZSBdICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMgWywgZm5dIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1xcdzotXSspW14+XSopXFwvPi9naSxcblxuXHQvLyBTdXBwb3J0OiBJRSAxMC0xMSwgRWRnZSAxMDI0MCtcblx0Ly8gSW4gSUUvRWRnZSB1c2luZyByZWdleCBncm91cHMgaGVyZSBjYXVzZXMgc2V2ZXJlIHNsb3dkb3ducy5cblx0Ly8gU2VlIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvMTczNjUxMi9cblx0cm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksXG5cblx0Ly8gY2hlY2tlZD1cImNoZWNrZWRcIiBvciBjaGVja2VkXG5cdHJjaGVja2VkID0gL2NoZWNrZWRcXHMqKD86W149XXw9XFxzKi5jaGVja2VkLikvaSxcblx0cnNjcmlwdFR5cGVNYXNrZWQgPSAvXnRydWVcXC8oLiopLyxcblx0cmNsZWFuU2NyaXB0ID0gL15cXHMqPCEoPzpcXFtDREFUQVxcW3wtLSl8KD86XFxdXFxdfC0tKT5cXHMqJC9nO1xuXG4vLyBNYW5pcHVsYXRpbmcgdGFibGVzIHJlcXVpcmVzIGEgdGJvZHlcbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0cmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJ0YWJsZVwiICkgJiZcblx0XHRqUXVlcnkubm9kZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUgIT09IDExID8gY29udGVudCA6IGNvbnRlbnQuZmlyc3RDaGlsZCwgXCJ0clwiICkgP1xuXG5cdFx0ZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJ0Ym9keVwiIClbIDAgXSB8fFxuXHRcdFx0ZWxlbS5hcHBlbmRDaGlsZCggZWxlbS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwidGJvZHlcIiApICkgOlxuXHRcdGVsZW07XG59XG5cbi8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb25cbmZ1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7XG5cdGVsZW0udHlwZSA9ICggZWxlbS5nZXRBdHRyaWJ1dGUoIFwidHlwZVwiICkgIT09IG51bGwgKSArIFwiL1wiICsgZWxlbS50eXBlO1xuXHRyZXR1cm4gZWxlbTtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7XG5cdHZhciBtYXRjaCA9IHJzY3JpcHRUeXBlTWFza2VkLmV4ZWMoIGVsZW0udHlwZSApO1xuXG5cdGlmICggbWF0Y2ggKSB7XG5cdFx0ZWxlbS50eXBlID0gbWF0Y2hbIDEgXTtcblx0fSBlbHNlIHtcblx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggXCJ0eXBlXCIgKTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5mdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkge1xuXHR2YXIgaSwgbCwgdHlwZSwgcGRhdGFPbGQsIHBkYXRhQ3VyLCB1ZGF0YU9sZCwgdWRhdGFDdXIsIGV2ZW50cztcblxuXHRpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gMS4gQ29weSBwcml2YXRlIGRhdGE6IGV2ZW50cywgaGFuZGxlcnMsIGV0Yy5cblx0aWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHRwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7XG5cdFx0cGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7XG5cdFx0ZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzO1xuXG5cdFx0aWYgKCBldmVudHMgKSB7XG5cdFx0XHRkZWxldGUgcGRhdGFDdXIuaGFuZGxlO1xuXHRcdFx0cGRhdGFDdXIuZXZlbnRzID0ge307XG5cblx0XHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBkZXN0LCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyAyLiBDb3B5IHVzZXIgZGF0YVxuXHRpZiAoIGRhdGFVc2VyLmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHVkYXRhT2xkID0gZGF0YVVzZXIuYWNjZXNzKCBzcmMgKTtcblx0XHR1ZGF0YUN1ciA9IGpRdWVyeS5leHRlbmQoIHt9LCB1ZGF0YU9sZCApO1xuXG5cdFx0ZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApO1xuXHR9XG59XG5cbi8vIEZpeCBJRSBidWdzLCBzZWUgc3VwcG9ydCB0ZXN0c1xuZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHtcblx0dmFyIG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdC8vIEZhaWxzIHRvIHBlcnNpc3QgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYSBjbG9uZWQgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uLlxuXHRpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHtcblx0XHRkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDtcblxuXHQvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9uc1xuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgKSB7XG5cdFx0ZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGRvbU1hbmlwKCBjb2xsZWN0aW9uLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApIHtcblxuXHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdGFyZ3MgPSBjb25jYXQuYXBwbHkoIFtdLCBhcmdzICk7XG5cblx0dmFyIGZyYWdtZW50LCBmaXJzdCwgc2NyaXB0cywgaGFzU2NyaXB0cywgbm9kZSwgZG9jLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBjb2xsZWN0aW9uLmxlbmd0aCxcblx0XHRpTm9DbG9uZSA9IGwgLSAxLFxuXHRcdHZhbHVlID0gYXJnc1sgMCBdLFxuXHRcdGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCBpc0Z1bmN0aW9uIHx8XG5cdFx0XHQoIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQhc3VwcG9ydC5jaGVja0Nsb25lICYmIHJjaGVja2VkLnRlc3QoIHZhbHVlICkgKSApIHtcblx0XHRyZXR1cm4gY29sbGVjdGlvbi5lYWNoKCBmdW5jdGlvbiggaW5kZXggKSB7XG5cdFx0XHR2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdGFyZ3NbIDAgXSA9IHZhbHVlLmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApO1xuXHRcdFx0fVxuXHRcdFx0ZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7XG5cdFx0fSApO1xuXHR9XG5cblx0aWYgKCBsICkge1xuXHRcdGZyYWdtZW50ID0gYnVpbGRGcmFnbWVudCggYXJncywgY29sbGVjdGlvblsgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNlLCBjb2xsZWN0aW9uLCBpZ25vcmVkICk7XG5cdFx0Zmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0aWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdGZyYWdtZW50ID0gZmlyc3Q7XG5cdFx0fVxuXG5cdFx0Ly8gUmVxdWlyZSBlaXRoZXIgbmV3IGNvbnRlbnQgb3IgYW4gaW50ZXJlc3QgaW4gaWdub3JlZCBlbGVtZW50cyB0byBpbnZva2UgdGhlIGNhbGxiYWNrXG5cdFx0aWYgKCBmaXJzdCB8fCBpZ25vcmVkICkge1xuXHRcdFx0c2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsIFwic2NyaXB0XCIgKSwgZGlzYWJsZVNjcmlwdCApO1xuXHRcdFx0aGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoO1xuXG5cdFx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVtXG5cdFx0XHQvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXBcblx0XHRcdC8vIGJlaW5nIGVtcHRpZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuXG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdG5vZGUgPSBmcmFnbWVudDtcblxuXHRcdFx0XHRpZiAoIGkgIT09IGlOb0Nsb25lICkge1xuXHRcdFx0XHRcdG5vZGUgPSBqUXVlcnkuY2xvbmUoIG5vZGUsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdC8vIEtlZXAgcmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVzdG9yYXRpb25cblx0XHRcdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xLCBQaGFudG9tSlM8MlxuXHRcdFx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhbGxiYWNrLmNhbGwoIGNvbGxlY3Rpb25bIGkgXSwgbm9kZSwgaSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cdFx0XHRcdGRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7XG5cblx0XHRcdFx0Ly8gUmVlbmFibGUgc2NyaXB0c1xuXHRcdFx0XHRqUXVlcnkubWFwKCBzY3JpcHRzLCByZXN0b3JlU2NyaXB0ICk7XG5cblx0XHRcdFx0Ly8gRXZhbHVhdGUgZXhlY3V0YWJsZSBzY3JpcHRzIG9uIGZpcnN0IGRvY3VtZW50IGluc2VydGlvblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHtcblx0XHRcdFx0XHRub2RlID0gc2NyaXB0c1sgaSBdO1xuXHRcdFx0XHRcdGlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8IFwiXCIgKSAmJlxuXHRcdFx0XHRcdFx0IWRhdGFQcml2LmFjY2Vzcyggbm9kZSwgXCJnbG9iYWxFdmFsXCIgKSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBub2RlLnNyYyApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudFxuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5fZXZhbFVybCApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuX2V2YWxVcmwoIG5vZGUuc3JjICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIG5vZGUub3duZXJEb2N1bWVudCwgbm9kZSApICkge1xuXHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0fVxuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aHRtbFByZWZpbHRlcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0cmV0dXJuIGh0bWwucmVwbGFjZSggcnhodG1sVGFnLCBcIjwkMT48LyQyPlwiICk7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHR2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cyxcblx0XHRcdGNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKSxcblx0XHRcdGluUGFnZSA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBodHRwOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzJcblx0XHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUgKTtcblx0XHRcdHNyY0VsZW1lbnRzID0gZ2V0QWxsKCBlbGVtICk7XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lXG5cdFx0aWYgKCBkYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0aWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdFx0c3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRBbGwoIGVsZW0gKTtcblx0XHRcdFx0ZGVzdEVsZW1lbnRzID0gZGVzdEVsZW1lbnRzIHx8IGdldEFsbCggY2xvbmUgKTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRjbG9uZUNvcHlFdmVudCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUsIFwic2NyaXB0XCIgKTtcblx0XHRpZiAoIGRlc3RFbGVtZW50cy5sZW5ndGggPiAwICkge1xuXHRcdFx0c2V0R2xvYmFsRXZhbCggZGVzdEVsZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgXCJzY3JpcHRcIiApICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0XG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9LFxuXG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBkYXRhLCBlbGVtLCB0eXBlLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPT0gdW5kZWZpbmVkOyBpKysgKSB7XG5cdFx0XHRpZiAoIGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdFx0aWYgKCAoIGRhdGEgPSBlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0Zm9yICggdHlwZSBpbiBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWRcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0gMzUtNDUrXG5cdFx0XHRcdFx0Ly8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlXG5cdFx0XHRcdFx0ZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdICkge1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9IDM1LTQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0Ly8gS2VlcCBkb21NYW5pcCBleHBvc2VkIHVudGlsIDMuMCAoZ2gtMjIyNSlcblx0ZG9tTWFuaXA6IGRvbU1hbmlwLFxuXG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFF0V2ViS2l0XG5cdFx0XHQvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzXG5cdFx0XHRwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTtcblx0fTtcbn0gKTtcblxuXG52YXIgaWZyYW1lLFxuXHRlbGVtZGlzcGxheSA9IHtcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3hcblx0XHQvLyBXZSBoYXZlIHRvIHByZS1kZWZpbmUgdGhlc2UgdmFsdWVzIGZvciBGRiAoIzEwMjI3KVxuXHRcdEhUTUw6IFwiYmxvY2tcIixcblx0XHRCT0RZOiBcImJsb2NrXCJcblx0fTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgYWN0dWFsIGRpc3BsYXkgb2YgYSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBub2RlTmFtZSBvZiB0aGUgZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IGRvYyBEb2N1bWVudCBvYmplY3RcbiAqL1xuXG4vLyBDYWxsZWQgb25seSBmcm9tIHdpdGhpbiBkZWZhdWx0RGlzcGxheVxuZnVuY3Rpb24gYWN0dWFsRGlzcGxheSggbmFtZSwgZG9jICkge1xuXHR2YXIgZWxlbSA9IGpRdWVyeSggZG9jLmNyZWF0ZUVsZW1lbnQoIG5hbWUgKSApLmFwcGVuZFRvKCBkb2MuYm9keSApLFxuXG5cdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW1bIDAgXSwgXCJkaXNwbGF5XCIgKTtcblxuXHQvLyBXZSBkb24ndCBoYXZlIGFueSBkYXRhIHN0b3JlZCBvbiB0aGUgZWxlbWVudCxcblx0Ly8gc28gdXNlIFwiZGV0YWNoXCIgbWV0aG9kIGFzIGZhc3Qgd2F5IHRvIGdldCByaWQgb2YgdGhlIGVsZW1lbnRcblx0ZWxlbS5kZXRhY2goKTtcblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cblxuLyoqXG4gKiBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IG5vZGVOYW1lXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHREaXNwbGF5KCBub2RlTmFtZSApIHtcblx0dmFyIGRvYyA9IGRvY3VtZW50LFxuXHRcdGRpc3BsYXkgPSBlbGVtZGlzcGxheVsgbm9kZU5hbWUgXTtcblxuXHRpZiAoICFkaXNwbGF5ICkge1xuXHRcdGRpc3BsYXkgPSBhY3R1YWxEaXNwbGF5KCBub2RlTmFtZSwgZG9jICk7XG5cblx0XHQvLyBJZiB0aGUgc2ltcGxlIHdheSBmYWlscywgcmVhZCBmcm9tIGluc2lkZSBhbiBpZnJhbWVcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiIHx8ICFkaXNwbGF5ICkge1xuXG5cdFx0XHQvLyBVc2UgdGhlIGFscmVhZHktY3JlYXRlZCBpZnJhbWUgaWYgcG9zc2libGVcblx0XHRcdGlmcmFtZSA9ICggaWZyYW1lIHx8IGpRdWVyeSggXCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+XCIgKSApXG5cdFx0XHRcdC5hcHBlbmRUbyggZG9jLmRvY3VtZW50RWxlbWVudCApO1xuXG5cdFx0XHQvLyBBbHdheXMgd3JpdGUgYSBuZXcgSFRNTCBza2VsZXRvbiBzbyBXZWJraXQgYW5kIEZpcmVmb3ggZG9uJ3QgY2hva2Ugb24gcmV1c2Vcblx0XHRcdGRvYyA9IGlmcmFtZVsgMCBdLmNvbnRlbnREb2N1bWVudDtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUVcblx0XHRcdGRvYy53cml0ZSgpO1xuXHRcdFx0ZG9jLmNsb3NlKCk7XG5cblx0XHRcdGRpc3BsYXkgPSBhY3R1YWxEaXNwbGF5KCBub2RlTmFtZSwgZG9jICk7XG5cdFx0XHRpZnJhbWUuZGV0YWNoKCk7XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcmUgdGhlIGNvcnJlY3QgZGVmYXVsdCBkaXNwbGF5XG5cdFx0ZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXHR9XG5cblx0cmV0dXJuIGRpc3BsYXk7XG59XG52YXIgcm1hcmdpbiA9ICggL15tYXJnaW4vICk7XG5cbnZhciBybnVtbm9ucHggPSBuZXcgUmVnRXhwKCBcIl4oXCIgKyBwbnVtICsgXCIpKD8hcHgpW2EteiVdKyRcIiwgXCJpXCIgKTtcblxudmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUU8PTExKywgRmlyZWZveDw9MzArICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHR2YXIgdmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkge1xuXHRcdFx0dmlldyA9IHdpbmRvdztcblx0XHR9XG5cblx0XHRyZXR1cm4gdmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrLCBhcmdzICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTtcblxuXHQvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn07XG5cblxudmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBwaXhlbFBvc2l0aW9uVmFsLCBib3hTaXppbmdSZWxpYWJsZVZhbCwgcGl4ZWxNYXJnaW5SaWdodFZhbCwgcmVsaWFibGVNYXJnaW5MZWZ0VmFsLFxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0Ly8gRmluaXNoIGVhcmx5IGluIGxpbWl0ZWQgKG5vbi1icm93c2VyKSBlbnZpcm9ubWVudHNcblx0aWYgKCAhZGl2LnN0eWxlICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0Ly8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKCM4OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7XCIgK1xuXHRcdFwicGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlXCI7XG5cdGNvbnRhaW5lci5hcHBlbmRDaGlsZCggZGl2ICk7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyOSwgQW5kcm9pZCAyLjNcblx0XHRcdC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZ1xuXHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCIgK1xuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO1wiICtcblx0XHRcdFwibWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDtcIiArXG5cdFx0XHRcInRvcDoxJTt3aWR0aDo1MCVcIjtcblx0XHRkaXYuaW5uZXJIVE1MID0gXCJcIjtcblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSBkaXZTdHlsZS5tYXJnaW5MZWZ0ID09PSBcIjJweFwiO1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gZGl2U3R5bGUud2lkdGggPT09IFwiNHB4XCI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdFx0Ly8gU29tZSBzdHlsZXMgY29tZSBiYWNrIHdpdGggcGVyY2VudGFnZSB2YWx1ZXMsIGV2ZW4gdGhvdWdoIHRoZXkgc2hvdWxkbid0XG5cdFx0ZGl2LnN0eWxlLm1hcmdpblJpZ2h0ID0gXCI1MCVcIjtcblx0XHRwaXhlbE1hcmdpblJpZ2h0VmFsID0gZGl2U3R5bGUubWFyZ2luUmlnaHQgPT09IFwiNHB4XCI7XG5cblx0XHRkb2N1bWVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApO1xuXHR9XG5cblx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBUaGlzIHRlc3QgaXMgZXhlY3V0ZWQgb25seSBvbmNlIGJ1dCB3ZSBzdGlsbCBkbyBtZW1vaXppbmdcblx0XHRcdC8vIHNpbmNlIHdlIGNhbiB1c2UgdGhlIGJveFNpemluZ1JlbGlhYmxlIHByZS1jb21wdXRpbmcuXG5cdFx0XHQvLyBObyBuZWVkIHRvIGNoZWNrIGlmIHRoZSB0ZXN0IHdhcyBhbHJlYWR5IHBlcmZvcm1lZCwgdGhvdWdoLlxuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBib3hTaXppbmdSZWxpYWJsZVZhbCA9PSBudWxsICkge1xuXHRcdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxNYXJnaW5SaWdodDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wLTQuM1xuXHRcdFx0Ly8gV2UncmUgY2hlY2tpbmcgZm9yIGJveFNpemluZ1JlbGlhYmxlVmFsIGhlcmUgaW5zdGVhZCBvZiBwaXhlbE1hcmdpblJpZ2h0VmFsXG5cdFx0XHQvLyBzaW5jZSB0aGF0IGNvbXByZXNzZXMgYmV0dGVyIGFuZCB0aGV5J3JlIGNvbXB1dGVkIHRvZ2V0aGVyIGFueXdheS5cblx0XHRcdGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwaXhlbE1hcmdpblJpZ2h0VmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IG9ubHksIEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gMzdcblx0XHRcdGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZWxpYWJsZU1hcmdpbkxlZnRWYWw7XG5cdFx0fSxcblx0XHRyZWxpYWJsZU1hcmdpblJpZ2h0OiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjNcblx0XHRcdC8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHlcblx0XHRcdC8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRoIG9mIGNvbnRhaW5lci4gKCMzMzMzKVxuXHRcdFx0Ly8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0XG5cdFx0XHQvLyBUaGlzIHN1cHBvcnQgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBvbmNlIHNvIG5vIG1lbW9pemluZyBpcyBuZWVkZWQuXG5cdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHRtYXJnaW5EaXYgPSBkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHQvLyBSZXNldCBDU1M6IGJveC1zaXppbmc7IGRpc3BsYXk7IG1hcmdpbjsgYm9yZGVyOyBwYWRkaW5nXG5cdFx0XHRtYXJnaW5EaXYuc3R5bGUuY3NzVGV4dCA9IGRpdi5zdHlsZS5jc3NUZXh0ID1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuXHRcdFx0XHQvLyBWZW5kb3ItcHJlZml4IGJveC1zaXppbmdcblx0XHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtcIiArXG5cdFx0XHRcdFwiZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjBcIjtcblx0XHRcdG1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdpbkRpdi5zdHlsZS53aWR0aCA9IFwiMFwiO1xuXHRcdFx0ZGl2LnN0eWxlLndpZHRoID0gXCIxcHhcIjtcblx0XHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICk7XG5cblx0XHRcdHJldCA9ICFwYXJzZUZsb2F0KCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2ICkubWFyZ2luUmlnaHQgKTtcblxuXHRcdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblx0XHRcdGRpdi5yZW1vdmVDaGlsZCggbWFyZ2luRGl2ICk7XG5cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHR9ICk7XG59ICkoKTtcblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApO1xuXHRyZXQgPSBjb21wdXRlZCA/IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdIDogdW5kZWZpbmVkO1xuXG5cdC8vIFN1cHBvcnQ6IE9wZXJhIDEyLjF4IG9ubHlcblx0Ly8gRmFsbCBiYWNrIHRvIHN0eWxlIGV2ZW4gd2l0aG91dCBjb21wdXRlZFxuXHQvLyBjb21wdXRlZCBpcyB1bmRlZmluZWQgZm9yIGVsZW1zIG9uIGRvY3VtZW50IGZyYWdtZW50c1xuXHRpZiAoICggcmV0ID09PSBcIlwiIHx8IHJldCA9PT0gdW5kZWZpbmVkICkgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7XG5cdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRTlcblx0Ly8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBvbmx5IG5lZWRlZCBmb3IgLmNzcygnZmlsdGVyJykgKCMxMjUzNylcblx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBBbmRyb2lkIEJyb3dzZXIgcmV0dXJucyBwZXJjZW50YWdlIGZvciBzb21lIHZhbHVlcyxcblx0XHQvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzLlxuXHRcdC8vIFRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzpcblx0XHQvLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5waXhlbE1hcmdpblJpZ2h0KCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJtYXJnaW4udGVzdCggbmFtZSApICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG5cdFx0XHR3aWR0aCA9IHN0eWxlLndpZHRoO1xuXHRcdFx0bWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDtcblx0XHRcdG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7XG5cblx0XHRcdC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXRcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDtcblx0XHRcdHJldCA9IGNvbXB1dGVkLndpZHRoO1xuXG5cdFx0XHQvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXG5cdFx0XHRzdHlsZS53aWR0aCA9IHdpZHRoO1xuXHRcdFx0c3R5bGUubWluV2lkdGggPSBtaW5XaWR0aDtcblx0XHRcdHN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJldCAhPT0gdW5kZWZpbmVkID9cblxuXHRcdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0XHQvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuXHRcdHJldCArIFwiXCIgOlxuXHRcdHJldDtcbn1cblxuXG5mdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7XG5cblx0Ly8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBjb25kaXRpb25GbigpICkge1xuXG5cdFx0XHRcdC8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZVxuXHRcdFx0XHQvLyB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLCByZW1vdmUgaXQuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmdldDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi5cblx0XHRcdHJldHVybiAoIHRoaXMuZ2V0ID0gaG9va0ZuICkuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fTtcbn1cblxuXG52YXJcblxuXHQvLyBTd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlXG5cdC8vIGV4Y2VwdCBcInRhYmxlXCIsIFwidGFibGUtY2VsbFwiLCBvciBcInRhYmxlLWNhcHRpb25cIlxuXHQvLyBTZWUgaGVyZSBmb3IgZGlzcGxheSB2YWx1ZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3BsYXlcblx0cmRpc3BsYXlzd2FwID0gL14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFxuXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9LFxuXG5cdGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk9cIiwgXCJNb3pcIiwgXCJtc1wiIF0sXG5cdGVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkuc3R5bGU7XG5cbi8vIFJldHVybiBhIGNzcyBwcm9wZXJ0eSBtYXBwZWQgdG8gYSBwb3RlbnRpYWxseSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHlcbmZ1bmN0aW9uIHZlbmRvclByb3BOYW1lKCBuYW1lICkge1xuXG5cdC8vIFNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkXG5cdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdHJldHVybiBuYW1lO1xuXHR9XG5cblx0Ly8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lc1xuXHR2YXIgY2FwTmFtZSA9IG5hbWVbIDAgXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSggMSApLFxuXHRcdGkgPSBjc3NQcmVmaXhlcy5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0bmFtZSA9IGNzc1ByZWZpeGVzWyBpIF0gKyBjYXBOYW1lO1xuXHRcdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdFx0cmV0dXJuIG5hbWU7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7XG5cblx0Ly8gQW55IHJlbGF0aXZlICgrLy0pIHZhbHVlcyBoYXZlIGFscmVhZHkgYmVlblxuXHQvLyBub3JtYWxpemVkIGF0IHRoaXMgcG9pbnRcblx0dmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7XG5cdHJldHVybiBtYXRjaGVzID9cblxuXHRcdC8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkIFwic3VidHJhY3RcIiwgZS5nLiwgd2hlbiB1c2VkIGFzIGluIGNzc0hvb2tzXG5cdFx0TWF0aC5tYXgoIDAsIG1hdGNoZXNbIDIgXSAtICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSA6XG5cdFx0dmFsdWU7XG59XG5cbmZ1bmN0aW9uIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSwgaXNCb3JkZXJCb3gsIHN0eWxlcyApIHtcblx0dmFyIGkgPSBleHRyYSA9PT0gKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApID9cblxuXHRcdC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvblxuXHRcdDQgOlxuXG5cdFx0Ly8gT3RoZXJ3aXNlIGluaXRpYWxpemUgZm9yIGhvcml6b250YWwgb3IgdmVydGljYWwgcHJvcGVydGllc1xuXHRcdG5hbWUgPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXG5cdFx0dmFsID0gMDtcblxuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgKSB7XG5cblx0XHQvLyBCb3RoIGJveCBtb2RlbHMgZXhjbHVkZSBtYXJnaW4sIHNvIGFkZCBpdCBpZiB3ZSB3YW50IGl0XG5cdFx0aWYgKCBleHRyYSA9PT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBleHRyYSArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGlzQm9yZGVyQm94ICkge1xuXG5cdFx0XHQvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnRcblx0XHRcdGlmICggZXh0cmEgPT09IFwiY29udGVudFwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGJvcmRlciBub3IgbWFyZ2luLCBzbyByZW1vdmUgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcIm1hcmdpblwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50LCBzbyBhZGQgcGFkZGluZ1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50IG5vciBwYWRkaW5nLCBzbyBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBvZmZzZXQgcHJvcGVydHksIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJvcmRlci1ib3ggdmFsdWVcblx0dmFyIHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlLFxuXHRcdHZhbCA9IG5hbWUgPT09IFwid2lkdGhcIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCxcblx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCI7XG5cblx0Ly8gU29tZSBub24taHRtbCBlbGVtZW50cyByZXR1cm4gdW5kZWZpbmVkIGZvciBvZmZzZXRXaWR0aCwgc28gY2hlY2sgZm9yIG51bGwvdW5kZWZpbmVkXG5cdC8vIHN2ZyAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTI4NVxuXHQvLyBNYXRoTUwgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00OTE2Njhcblx0aWYgKCB2YWwgPD0gMCB8fCB2YWwgPT0gbnVsbCApIHtcblxuXHRcdC8vIEZhbGwgYmFjayB0byBjb21wdXRlZCB0aGVuIHVuY29tcHV0ZWQgY3NzIGlmIG5lY2Vzc2FyeVxuXHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7XG5cdFx0aWYgKCB2YWwgPCAwIHx8IHZhbCA9PSBudWxsICkge1xuXHRcdFx0dmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIENvbXB1dGVkIHVuaXQgaXMgbm90IHBpeGVscy4gU3RvcCBoZXJlIGFuZCByZXR1cm4uXG5cdFx0aWYgKCBybnVtbm9ucHgudGVzdCggdmFsICkgKSB7XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBzdHlsZSBpbiBjYXNlIGEgYnJvd3NlciB3aGljaCByZXR1cm5zIHVucmVsaWFibGUgdmFsdWVzXG5cdFx0Ly8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZVxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJlxuXHRcdFx0KCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBuYW1lIF0gKTtcblxuXHRcdC8vIE5vcm1hbGl6ZSBcIlwiLCBhdXRvLCBhbmQgcHJlcGFyZSBmb3IgZXh0cmFcblx0XHR2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwO1xuXHR9XG5cblx0Ly8gVXNlIHRoZSBhY3RpdmUgYm94LXNpemluZyBtb2RlbCB0byBhZGQvc3VidHJhY3QgaXJyZWxldmFudCBzdHlsZXNcblx0cmV0dXJuICggdmFsICtcblx0XHRhdWdtZW50V2lkdGhPckhlaWdodChcblx0XHRcdGVsZW0sXG5cdFx0XHRuYW1lLFxuXHRcdFx0ZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApLFxuXHRcdFx0dmFsdWVJc0JvcmRlckJveCxcblx0XHRcdHN0eWxlc1xuXHRcdClcblx0KSArIFwicHhcIjtcbn1cblxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xuXHR2YXIgZGlzcGxheSwgZWxlbSwgaGlkZGVuLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XG5cdFx0aWYgKCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdHZhbHVlc1sgaW5kZXggXSA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJvbGRkaXNwbGF5XCIgKTtcblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblxuXHRcdFx0Ly8gUmVzZXQgdGhlIGlubGluZSBkaXNwbGF5IG9mIHRoaXMgZWxlbWVudCB0byBsZWFybiBpZiBpdCBpc1xuXHRcdFx0Ly8gYmVpbmcgaGlkZGVuIGJ5IGNhc2NhZGVkIHJ1bGVzIG9yIG5vdFxuXHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICYmIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92ZXJyaWRkZW4gd2l0aCBkaXNwbGF5OiBub25lXG5cdFx0XHQvLyBpbiBhIHN0eWxlc2hlZXQgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQgYnJvd3NlciBzdHlsZSBpc1xuXHRcdFx0Ly8gZm9yIHN1Y2ggYW4gZWxlbWVudFxuXHRcdFx0aWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwiXCIgJiYgaXNIaWRkZW4oIGVsZW0gKSApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZGF0YVByaXYuYWNjZXNzKFxuXHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0XCJvbGRkaXNwbGF5XCIsXG5cdFx0XHRcdFx0ZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRoaWRkZW4gPSBpc0hpZGRlbiggZWxlbSApO1xuXG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiIHx8ICFoaWRkZW4gKSB7XG5cdFx0XHRcdGRhdGFQcml2LnNldChcblx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdFwib2xkZGlzcGxheVwiLFxuXHRcdFx0XHRcdGhpZGRlbiA/IGRpc3BsYXkgOiBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3Bcblx0Ly8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvd1xuXHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGlmICggIXNob3cgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwiXCIgKSB7XG5cdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPSBzaG93ID8gdmFsdWVzWyBpbmRleCBdIHx8IFwiXCIgOiBcIm5vbmVcIjtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudHM7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdHJ1ZSxcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImxpbmVIZWlnaHRcIjogdHJ1ZSxcblx0XHRcIm9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcIm9yZGVyXCI6IHRydWUsXG5cdFx0XCJvcnBoYW5zXCI6IHRydWUsXG5cdFx0XCJ3aWRvd3NcIjogdHJ1ZSxcblx0XHRcInpJbmRleFwiOiB0cnVlLFxuXHRcdFwiem9vbVwiOiB0cnVlXG5cdH0sXG5cblx0Ly8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZVxuXHQvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlXG5cdGNzc1Byb3BzOiB7XG5cdFx0XCJmbG9hdFwiOiBcImNzc0Zsb2F0XCJcblx0fSxcblxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxuXHRzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHtcblxuXHRcdC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdHZhciByZXQsIHR5cGUsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8XG5cdFx0XHQoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBvcmlnTmFtZSApIHx8IG9yaWdOYW1lICk7XG5cblx0XHQvLyBHZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLCB0aGVuIHVucHJlZml4ZWQgdmVyc2lvblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdFx0Ly8gQ29udmVydCBcIis9XCIgb3IgXCItPVwiIHRvIHJlbGF0aXZlIG51bWJlcnMgKCM3MzQ1KVxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICYmICggcmV0ID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiYgcmV0WyAxIF0gKSB7XG5cdFx0XHRcdHZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTtcblxuXHRcdFx0XHQvLyBGaXhlcyBidWcgIzkyMzdcblx0XHRcdFx0dHlwZSA9IFwibnVtYmVyXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IG51bGwgYW5kIE5hTiB2YWx1ZXMgYXJlbid0IHNldCAoIzcxMTYpXG5cdFx0XHRpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCB0aGUgdW5pdCAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxuXHRcdFx0aWYgKCB0eXBlID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gXCJcIiA6IFwicHhcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0XHQvLyBiYWNrZ3JvdW5kLSogcHJvcHMgYWZmZWN0IG9yaWdpbmFsIGNsb25lJ3MgdmFsdWVzXG5cdFx0XHRpZiAoICFzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSAmJiB2YWx1ZSA9PT0gXCJcIiAmJiBuYW1lLmluZGV4T2YoIFwiYmFja2dyb3VuZFwiICkgPT09IDAgKSB7XG5cdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSBcImluaGVyaXRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHxcblx0XHRcdFx0KCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3Rcblx0XHRcdHJldHVybiBzdHlsZVsgbmFtZSBdO1xuXHRcdH1cblx0fSxcblxuXHRjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkge1xuXHRcdHZhciB2YWwsIG51bSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdG5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHxcblx0XHRcdCggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIG9yaWdOYW1lICkgfHwgb3JpZ05hbWUgKTtcblxuXHRcdC8vIFRyeSBwcmVmaXhlZCBuYW1lIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIG5hbWVcblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICkge1xuXHRcdFx0dmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0XG5cdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBcIm5vcm1hbFwiIHRvIGNvbXB1dGVkIHZhbHVlXG5cdFx0aWYgKCB2YWwgPT09IFwibm9ybWFsXCIgJiYgbmFtZSBpbiBjc3NOb3JtYWxUcmFuc2Zvcm0gKSB7XG5cdFx0XHR2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWNcblx0XHRpZiAoIGV4dHJhID09PSBcIlwiIHx8IGV4dHJhICkge1xuXHRcdFx0bnVtID0gcGFyc2VGbG9hdCggdmFsICk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPT09IHRydWUgfHwgaXNGaW5pdGUoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdC8vIENlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbVxuXHRcdFx0XHQvLyBidXQgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdFxuXHRcdFx0XHRyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKSAmJlxuXHRcdFx0XHRcdGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgP1xuXHRcdFx0XHRcdFx0c3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApO1xuXHRcdFx0XHRcdFx0fSApIDpcblx0XHRcdFx0XHRcdGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHtcblx0XHRcdHZhciBtYXRjaGVzLFxuXHRcdFx0XHRzdHlsZXMgPSBleHRyYSAmJiBnZXRTdHlsZXMoIGVsZW0gKSxcblx0XHRcdFx0c3VidHJhY3QgPSBleHRyYSAmJiBhdWdtZW50V2lkdGhPckhlaWdodChcblx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0XHRzdHlsZXNcblx0XHRcdFx0KTtcblxuXHRcdFx0Ly8gQ29udmVydCB0byBwaXhlbHMgaWYgdmFsdWUgYWRqdXN0bWVudCBpcyBuZWVkZWRcblx0XHRcdGlmICggc3VidHJhY3QgJiYgKCBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiZcblx0XHRcdFx0KCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgIT09IFwicHhcIiApIHtcblxuXHRcdFx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7XG5cdFx0fVxuXHR9O1xufSApO1xuXG5qUXVlcnkuY3NzSG9va3MubWFyZ2luTGVmdCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxpYWJsZU1hcmdpbkxlZnQsXG5cdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0cmV0dXJuICggcGFyc2VGbG9hdCggY3VyQ1NTKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiApICkgfHxcblx0XHRcdFx0ZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC1cblx0XHRcdFx0XHRzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXHRcdFx0XHRcdH0gKVxuXHRcdFx0XHQpICsgXCJweFwiO1xuXHRcdH1cblx0fVxuKTtcblxuLy8gU3VwcG9ydDogQW5kcm9pZCAyLjNcbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5SaWdodCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0LFxuXHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdHJldHVybiBzd2FwKCBlbGVtLCB7IFwiZGlzcGxheVwiOiBcImlubGluZS1ibG9ja1wiIH0sXG5cdFx0XHRcdGN1ckNTUywgWyBlbGVtLCBcIm1hcmdpblJpZ2h0XCIgXSApO1xuXHRcdH1cblx0fVxuKTtcblxuLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllc1xualF1ZXJ5LmVhY2goIHtcblx0bWFyZ2luOiBcIlwiLFxuXHRwYWRkaW5nOiBcIlwiLFxuXHRib3JkZXI6IFwiV2lkdGhcIlxufSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdID0ge1xuXHRcdGV4cGFuZDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGkgPSAwLFxuXHRcdFx0XHRleHBhbmRlZCA9IHt9LFxuXG5cdFx0XHRcdC8vIEFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZ1xuXHRcdFx0XHRwYXJ0cyA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnNwbGl0KCBcIiBcIiApIDogWyB2YWx1ZSBdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCA0OyBpKysgKSB7XG5cdFx0XHRcdGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID1cblx0XHRcdFx0XHRwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBleHBhbmRlZDtcblx0XHR9XG5cdH07XG5cblx0aWYgKCAhcm1hcmdpbi50ZXN0KCBwcmVmaXggKSApIHtcblx0XHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0Y3NzOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0dmFyIHN0eWxlcywgbGVuLFxuXHRcdFx0XHRtYXAgPSB7fSxcblx0XHRcdFx0aSA9IDA7XG5cblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHtcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7XG5cdFx0XHRcdGxlbiA9IG5hbWUubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdG1hcFsgbmFtZVsgaSBdIF0gPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lWyBpIF0sIGZhbHNlLCBzdHlsZXMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBtYXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDpcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xuXHRcdH0sIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzICk7XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkge1xuXHRcdGlmICggdHlwZW9mIHN0YXRlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGlzSGlkZGVuKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5mdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7XG5cdHJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7XG59XG5qUXVlcnkuVHdlZW4gPSBUd2VlbjtcblxuVHdlZW4ucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogVHdlZW4sXG5cdGluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHtcblx0XHR0aGlzLmVsZW0gPSBlbGVtO1xuXHRcdHRoaXMucHJvcCA9IHByb3A7XG5cdFx0dGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgalF1ZXJ5LmVhc2luZy5fZGVmYXVsdDtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7XG5cdFx0dGhpcy5lbmQgPSBlbmQ7XG5cdFx0dGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0fSxcblx0Y3VyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0cmV0dXJuIGhvb2tzICYmIGhvb2tzLmdldCA/XG5cdFx0XHRob29rcy5nZXQoIHRoaXMgKSA6XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7XG5cdH0sXG5cdHJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7XG5cdFx0dmFyIGVhc2VkLFxuXHRcdFx0aG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXShcblx0XHRcdFx0cGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0gcGVyY2VudDtcblx0XHR9XG5cdFx0dGhpcy5ub3cgPSAoIHRoaXMuZW5kIC0gdGhpcy5zdGFydCApICogZWFzZWQgKyB0aGlzLnN0YXJ0O1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHtcblx0XHRcdHRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnNldCApIHtcblx0XHRcdGhvb2tzLnNldCggdGhpcyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlzICk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59O1xuXG5Ud2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7XG5cblR3ZWVuLnByb3BIb29rcyA9IHtcblx0X2RlZmF1bHQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRcdHZhciByZXN1bHQ7XG5cblx0XHRcdC8vIFVzZSBhIHByb3BlcnR5IG9uIHRoZSBlbGVtZW50IGRpcmVjdGx5IHdoZW4gaXQgaXMgbm90IGEgRE9NIGVsZW1lbnQsXG5cdFx0XHQvLyBvciB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHN0eWxlIHByb3BlcnR5IHRoYXQgZXhpc3RzLlxuXHRcdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8XG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYmIHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsICkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQYXNzaW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHlcblx0XHRcdC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMuXG5cdFx0XHQvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgXCIxMHB4XCIgYXJlIHBhcnNlZCB0byBGbG9hdDtcblx0XHRcdC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgXCJyb3RhdGUoMXJhZClcIiBhcmUgcmV0dXJuZWQgYXMtaXMuXG5cdFx0XHRyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCBcIlwiICk7XG5cblx0XHRcdC8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgXCJhdXRvXCIgYXJlIGNvbnZlcnRlZCB0byAwLlxuXHRcdFx0cmV0dXJuICFyZXN1bHQgfHwgcmVzdWx0ID09PSBcImF1dG9cIiA/IDAgOiByZXN1bHQ7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblxuXHRcdFx0Ly8gVXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQuXG5cdFx0XHQvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuXG5cdFx0XHQvLyBVc2UgLnN0eWxlIGlmIGF2YWlsYWJsZSBhbmQgdXNlIHBsYWluIHByb3BlcnRpZXMgd2hlcmUgYXZhaWxhYmxlLlxuXHRcdFx0aWYgKCBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdICkge1xuXHRcdFx0XHRqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApO1xuXHRcdFx0fSBlbHNlIGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fFxuXHRcdFx0XHRcdGpRdWVyeS5jc3NIb29rc1sgdHdlZW4ucHJvcCBdICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gU3VwcG9ydDogSUU5XG4vLyBQYW5pYyBiYXNlZCBhcHByb2FjaCB0byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHtcblx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICYmIHR3ZWVuLmVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5lYXNpbmcgPSB7XG5cdGxpbmVhcjogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIHA7XG5cdH0sXG5cdHN3aW5nOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gMC41IC0gTWF0aC5jb3MoIHAgKiBNYXRoLlBJICkgLyAyO1xuXHR9LFxuXHRfZGVmYXVsdDogXCJzd2luZ1wiXG59O1xuXG5qUXVlcnkuZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDtcblxuLy8gQmFjayBDb21wYXQgPDEuOCBleHRlbnNpb24gcG9pbnRcbmpRdWVyeS5meC5zdGVwID0ge307XG5cblxuXG5cbnZhclxuXHRmeE5vdywgdGltZXJJZCxcblx0cmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sXG5cdHJydW4gPSAvcXVldWVIb29rcyQvO1xuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0galF1ZXJ5Lm5vdygpICk7XG59XG5cbi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uXG5mdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkge1xuXHR2YXIgd2hpY2gsXG5cdFx0aSA9IDAsXG5cdFx0YXR0cnMgPSB7IGhlaWdodDogdHlwZSB9O1xuXG5cdC8vIElmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3NzRXhwYW5kIHZhbHVlcyxcblx0Ly8gb3RoZXJ3aXNlIHN0ZXAgdmFsdWUgaXMgMiB0byBza2lwIG92ZXIgTGVmdCBhbmQgUmlnaHRcblx0aW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7XG5cdGZvciAoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0LyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuXHR2YXIgcHJvcCwgdmFsdWUsIHRvZ2dsZSwgdHdlZW4sIGhvb2tzLCBvbGRmaXJlLCBkaXNwbGF5LCBjaGVja0Rpc3BsYXksXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVtICksXG5cdFx0ZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZnhzaG93XCIgKTtcblxuXHQvLyBIYW5kbGUgcXVldWU6IGZhbHNlIHByb21pc2VzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEhlaWdodC93aWR0aCBvdmVyZmxvdyBwYXNzXG5cdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiaGVpZ2h0XCIgaW4gcHJvcHMgfHwgXCJ3aWR0aFwiIGluIHByb3BzICkgKSB7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXRcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFOS0xMCBkbyBub3Rcblx0XHQvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmRcblx0XHQvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZVxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gU2V0IGRpc3BsYXkgcHJvcGVydHkgdG8gaW5saW5lLWJsb2NrIGZvciBoZWlnaHQvd2lkdGhcblx0XHQvLyBhbmltYXRpb25zIG9uIGlubGluZSBlbGVtZW50cyB0aGF0IGFyZSBoYXZpbmcgd2lkdGgvaGVpZ2h0IGFuaW1hdGVkXG5cdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cblx0XHQvLyBUZXN0IGRlZmF1bHQgZGlzcGxheSBpZiBkaXNwbGF5IGlzIGN1cnJlbnRseSBcIm5vbmVcIlxuXHRcdGNoZWNrRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID9cblx0XHRcdGRhdGFQcml2LmdldCggZWxlbSwgXCJvbGRkaXNwbGF5XCIgKSB8fCBkZWZhdWx0RGlzcGxheSggZWxlbS5ub2RlTmFtZSApIDogZGlzcGxheTtcblxuXHRcdGlmICggY2hlY2tEaXNwbGF5ID09PSBcImlubGluZVwiICYmIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gc2hvdy9oaWRlIHBhc3Ncblx0Zm9yICggcHJvcCBpbiBwcm9wcyApIHtcblx0XHR2YWx1ZSA9IHByb3BzWyBwcm9wIF07XG5cdFx0aWYgKCByZnh0eXBlcy5leGVjKCB2YWx1ZSApICkge1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBwcm9wIF07XG5cdFx0XHR0b2dnbGUgPSB0b2dnbGUgfHwgdmFsdWUgPT09IFwidG9nZ2xlXCI7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAoIGhpZGRlbiA/IFwiaGlkZVwiIDogXCJzaG93XCIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBkYXRhU2hvdyBsZWZ0IG92ZXIgZnJvbSBhIHN0b3BwZWQgaGlkZSBvciBzaG93XG5cdFx0XHRcdC8vIGFuZCB3ZSBhcmUgZ29pbmcgdG8gcHJvY2VlZCB3aXRoIHNob3csIHdlIHNob3VsZCBwcmV0ZW5kIHRvIGJlIGhpZGRlblxuXHRcdFx0XHRpZiAoIHZhbHVlID09PSBcInNob3dcIiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aGlkZGVuID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTtcblxuXHRcdC8vIEFueSBub24tZnggdmFsdWUgc3RvcHMgdXMgZnJvbSByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWVcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGlzcGxheSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRpZiAoICFqUXVlcnkuaXNFbXB0eU9iamVjdCggb3JpZyApICkge1xuXHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRpZiAoIFwiaGlkZGVuXCIgaW4gZGF0YVNob3cgKSB7XG5cdFx0XHRcdGhpZGRlbiA9IGRhdGFTaG93LmhpZGRlbjtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YVNob3cgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIFwiZnhzaG93XCIsIHt9ICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcmUgc3RhdGUgaWYgaXRzIHRvZ2dsZSAtIGVuYWJsZXMgLnN0b3AoKS50b2dnbGUoKSB0byBcInJldmVyc2VcIlxuXHRcdGlmICggdG9nZ2xlICkge1xuXHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHR9XG5cdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRqUXVlcnkoIGVsZW0gKS5zaG93KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeSggZWxlbSApLmhpZGUoKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBwcm9wO1xuXG5cdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdGZvciAoIHByb3AgaW4gb3JpZyApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0dHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblxuXHRcdFx0aWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7XG5cdFx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDtcblx0XHRcdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRcdFx0dHdlZW4uZW5kID0gdHdlZW4uc3RhcnQ7XG5cdFx0XHRcdFx0dHdlZW4uc3RhcnQgPSBwcm9wID09PSBcIndpZHRoXCIgfHwgcHJvcCA9PT0gXCJoZWlnaHRcIiA/IDEgOiAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdC8vIElmIHRoaXMgaXMgYSBub29wIGxpa2UgLmhpZGUoKS5oaWRlKCksIHJlc3RvcmUgYW4gb3ZlcndyaXR0ZW4gZGlzcGxheSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCAoIGRpc3BsYXkgPT09IFwibm9uZVwiID8gZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA6IGRpc3BsYXkgKSA9PT0gXCJpbmxpbmVcIiApIHtcblx0XHRzdHlsZS5kaXNwbGF5ID0gZGlzcGxheTtcblx0fVxufVxuXG5mdW5jdGlvbiBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHtcblx0dmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rcztcblxuXHQvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3Ncblx0Zm9yICggaW5kZXggaW4gcHJvcHMgKSB7XG5cdFx0bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBqUXVlcnkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdGVhc2luZyA9IHZhbHVlWyAxIF07XG5cdFx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTtcblx0XHR9XG5cblx0XHRpZiAoIGluZGV4ICE9PSBuYW1lICkge1xuXHRcdFx0cHJvcHNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBpbmRleCBdO1xuXHRcdH1cblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07XG5cdFx0aWYgKCBob29rcyAmJiBcImV4cGFuZFwiIGluIGhvb2tzICkge1xuXHRcdFx0dmFsdWUgPSBob29rcy5leHBhbmQoIHZhbHVlICk7XG5cdFx0XHRkZWxldGUgcHJvcHNbIG5hbWUgXTtcblxuXHRcdFx0Ly8gTm90IHF1aXRlICQuZXh0ZW5kLCB0aGlzIHdvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBrZXlzLlxuXHRcdFx0Ly8gUmV1c2luZyAnaW5kZXgnIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgY29ycmVjdCBcIm5hbWVcIlxuXHRcdFx0Zm9yICggaW5kZXggaW4gdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggISggaW5kZXggaW4gcHJvcHMgKSApIHtcblx0XHRcdFx0XHRwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyBpbmRleCBdO1xuXHRcdFx0XHRcdHNwZWNpYWxFYXNpbmdbIGluZGV4IF0gPSBlYXNpbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c3BlY2lhbEVhc2luZ1sgbmFtZSBdID0gZWFzaW5nO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBBbmltYXRpb24oIGVsZW0sIHByb3BlcnRpZXMsIG9wdGlvbnMgKSB7XG5cdHZhciByZXN1bHQsXG5cdFx0c3RvcHBlZCxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLFxuXHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRG9uJ3QgbWF0Y2ggZWxlbSBpbiB0aGUgOmFuaW1hdGVkIHNlbGVjdG9yXG5cdFx0XHRkZWxldGUgdGljay5lbGVtO1xuXHRcdH0gKSxcblx0XHR0aWNrID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHZhciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRcdHJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSxcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuXHRcdFx0XHQvLyBBcmNoYWljIGNyYXNoIGJ1ZyB3b24ndCBhbGxvdyB1cyB0byB1c2UgYDEgLSAoIDAuNSB8fCAwIClgICgjMTI0OTcpXG5cdFx0XHRcdHRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCxcblx0XHRcdFx0cGVyY2VudCA9IDEgLSB0ZW1wLFxuXHRcdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRcdGxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0YW5pbWF0aW9uID0gZGVmZXJyZWQucHJvbWlzZSgge1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdHByb3BzOiBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcGVydGllcyApLFxuXHRcdFx0b3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1ZSwge1xuXHRcdFx0XHRzcGVjaWFsRWFzaW5nOiB7fSxcblx0XHRcdFx0ZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0XG5cdFx0XHR9LCBvcHRpb25zICksXG5cdFx0XHRvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsXG5cdFx0XHRvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsXG5cdFx0XHRzdGFydFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbixcblx0XHRcdHR3ZWVuczogW10sXG5cdFx0XHRjcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3AsIGVuZCApIHtcblx0XHRcdFx0dmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLFxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApO1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7XG5cdFx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHRcdH0sXG5cdFx0XHRzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHtcblx0XHRcdFx0dmFyIGluZGV4ID0gMCxcblxuXHRcdFx0XHRcdC8vIElmIHdlIGFyZSBnb2luZyB0byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVuc1xuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3ZSBza2lwIHRoaXMgcGFydFxuXHRcdFx0XHRcdGxlbmd0aCA9IGdvdG9FbmQgPyBhbmltYXRpb24udHdlZW5zLmxlbmd0aCA6IDA7XG5cdFx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0XHRzdG9wcGVkID0gdHJ1ZTtcblx0XHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSApLFxuXHRcdHByb3BzID0gYW5pbWF0aW9uLnByb3BzO1xuXG5cdHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0cmVzdWx0ID0gQW5pbWF0aW9uLnByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggYW5pbWF0aW9uLmVsZW0sIGFuaW1hdGlvbi5vcHRzLnF1ZXVlICkuc3RvcCA9XG5cdFx0XHRcdFx0alF1ZXJ5LnByb3h5KCByZXN1bHQuc3RvcCwgcmVzdWx0ICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdGpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7XG5cblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0Ly8gYXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnNcblx0cmV0dXJuIGFuaW1hdGlvbi5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xufVxuXG5qUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7XG5cdHR3ZWVuZXJzOiB7XG5cdFx0XCIqXCI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdFx0dmFyIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKTtcblx0XHRcdGFkanVzdENTUyggdHdlZW4uZWxlbSwgcHJvcCwgcmNzc051bS5leGVjKCB2YWx1ZSApLCB0d2VlbiApO1xuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9LFxuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcHJvcHMgKSApIHtcblx0XHRcdGNhbGxiYWNrID0gcHJvcHM7XG5cdFx0XHRwcm9wcyA9IFsgXCIqXCIgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcHMgPSBwcm9wcy5tYXRjaCggcm5vdHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRcdHByb3AgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdID0gQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW107XG5cdFx0XHRBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH1cblx0fSxcblxuXHRwcmVmaWx0ZXJzOiBbIGRlZmF1bHRQcmVmaWx0ZXIgXSxcblxuXHRwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHtcblx0XHRpZiAoIHByZXBlbmQgKSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy5wdXNoKCBjYWxsYmFjayApO1xuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7XG5cdHZhciBvcHQgPSBzcGVlZCAmJiB0eXBlb2Ygc3BlZWQgPT09IFwib2JqZWN0XCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHtcblx0XHRjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fFxuXHRcdFx0alF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsXG5cdFx0ZHVyYXRpb246IHNwZWVkLFxuXHRcdGVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gXCJudW1iZXJcIiA/XG5cdFx0b3B0LmR1cmF0aW9uIDogb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgP1xuXHRcdFx0alF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF0gOiBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O1xuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHtcblx0XHRcdG9wdC5vbGQuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0LnF1ZXVlICkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gb3B0O1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cblx0XHQvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDBcblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuICkuY3NzKCBcIm9wYWNpdHlcIiwgMCApLnNob3coKVxuXG5cdFx0XHQvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWRcblx0XHRcdC5lbmQoKS5hbmltYXRlKCB7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdFxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XG5cblx0XHRcdFx0Ly8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5XG5cdFx0XHRcdGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkZXF1ZXVlID0gdHJ1ZSxcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJlxuXHRcdFx0XHRcdCggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkge1xuXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXHRmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdGlmICggdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksXG5cdFx0XHRcdHF1ZXVlID0gZGF0YVsgdHlwZSArIFwicXVldWVcIiBdLFxuXHRcdFx0XHRob29rcyA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlSG9va3NcIiBdLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7XG5cblx0XHRcdC8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGFcblx0XHRcdGRhdGEuZmluaXNoID0gdHJ1ZTtcblxuXHRcdFx0Ly8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0XG5cdFx0XHRqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7XG5cblx0XHRcdGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHtcblx0XHRcdFx0aG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9ucywgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9ucyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7XG5cdFx0XHRcdFx0cXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZ1xuXHRcdFx0ZGVsZXRlIGRhdGEuZmluaXNoO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcInRvZ2dsZVwiLCBcInNob3dcIiwgXCJoaWRlXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHRpID0gMCxcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzO1xuXG5cdGZ4Tm93ID0galF1ZXJ5Lm5vdygpO1xuXG5cdGZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHtcblx0XHR0aW1lciA9IHRpbWVyc1sgaSBdO1xuXG5cdFx0Ly8gQ2hlY2tzIHRoZSB0aW1lciBoYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkXG5cdFx0aWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7XG5cdFx0XHR0aW1lcnMuc3BsaWNlKCBpLS0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoICF0aW1lcnMubGVuZ3RoICkge1xuXHRcdGpRdWVyeS5meC5zdG9wKCk7XG5cdH1cblx0ZnhOb3cgPSB1bmRlZmluZWQ7XG59O1xuXG5qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7XG5cdGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTtcblx0aWYgKCB0aW1lcigpICkge1xuXHRcdGpRdWVyeS5meC5zdGFydCgpO1xuXHR9IGVsc2Uge1xuXHRcdGpRdWVyeS50aW1lcnMucG9wKCk7XG5cdH1cbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xualF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cdGlmICggIXRpbWVySWQgKSB7XG5cdFx0dGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCggalF1ZXJ5LmZ4LnRpY2ssIGpRdWVyeS5meC5pbnRlcnZhbCApO1xuXHR9XG59O1xuXG5qUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHR3aW5kb3cuY2xlYXJJbnRlcnZhbCggdGltZXJJZCApO1xuXG5cdHRpbWVySWQgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbi8vIGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTAwMzI0MDE0NzQ3L2h0dHA6Ly9ibGluZHNpZ25hbHMuY29tL2luZGV4LnBocC8yMDA5LzA3L2pxdWVyeS1kZWxheS9cbmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkge1xuXHR0aW1lID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4LnNwZWVkc1sgdGltZSBdIHx8IHRpbWUgOiB0aW1lO1xuXHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHtcblx0XHR2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7XG5cdFx0aG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dCApO1xuXHRcdH07XG5cdH0gKTtcbn07XG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICksXG5cdFx0c2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzZWxlY3RcIiApLFxuXHRcdG9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvcHRpb25cIiApICk7XG5cblx0aW5wdXQudHlwZSA9IFwiY2hlY2tib3hcIjtcblxuXHQvLyBTdXBwb3J0OiBpT1M8PTUuMSwgQW5kcm9pZDw9NC4yK1xuXHQvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSBcIm9uXCJcblx0c3VwcG9ydC5jaGVja09uID0gaW5wdXQudmFsdWUgIT09IFwiXCI7XG5cblx0Ly8gU3VwcG9ydDogSUU8PTExK1xuXHQvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdFxuXHRzdXBwb3J0Lm9wdFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8PTIuM1xuXHQvLyBPcHRpb25zIGluc2lkZSBkaXNhYmxlZCBzZWxlY3RzIGFyZSBpbmNvcnJlY3RseSBtYXJrZWQgYXMgZGlzYWJsZWRcblx0c2VsZWN0LmRpc2FibGVkID0gdHJ1ZTtcblx0c3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlzYWJsZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUU8PTExK1xuXHQvLyBBbiBpbnB1dCBsb3NlcyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpb1xuXHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRpbnB1dC52YWx1ZSA9IFwidFwiO1xuXHRpbnB1dC50eXBlID0gXCJyYWRpb1wiO1xuXHRzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gXCJ0XCI7XG59ICkoKTtcblxuXG52YXIgYm9vbEhvb2ssXG5cdGF0dHJIYW5kbGUgPSBqUXVlcnkuZXhwci5hdHRySGFuZGxlO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHR2YXIgcmV0LCBob29rcyxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGF0dHJpYnV0ZXMgYXJlIGxvd2VyY2FzZVxuXHRcdC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWRcblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblx0XHRcdG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSB8fFxuXHRcdFx0XHQoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiB1bmRlZmluZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHZhbHVlID09PSBudWxsICkge1xuXHRcdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArIFwiXCIgKTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXQgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxuXHRcdHJldHVybiByZXQgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDtcblx0fSxcblxuXHRhdHRySG9va3M6IHtcblx0XHR0eXBlOiB7XG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhc3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSBcInJhZGlvXCIgJiZcblx0XHRcdFx0XHRqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBlbGVtLnZhbHVlO1xuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgdmFsdWUgKTtcblx0XHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRcdGVsZW0udmFsdWUgPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0dmFyIG5hbWUsIHByb3BOYW1lLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdHRyTmFtZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAoIG5hbWUgPSBhdHRyTmFtZXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdHByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xuXG5cdFx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgKCMxMDg3MClcblx0XHRcdFx0aWYgKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0XHRcdC8vIFNldCBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHRvIGZhbHNlXG5cdFx0XHRcdFx0ZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZTtcblx0fVxufTtcbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRyO1xuXG5cdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgcmV0LCBoYW5kbGU7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cblx0XHRcdC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3AgYnkgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBnZXR0ZXJcblx0XHRcdGhhbmRsZSA9IGF0dHJIYW5kbGVbIG5hbWUgXTtcblx0XHRcdGF0dHJIYW5kbGVbIG5hbWUgXSA9IHJldDtcblx0XHRcdHJldCA9IGdldHRlciggZWxlbSwgbmFtZSwgaXNYTUwgKSAhPSBudWxsID9cblx0XHRcdFx0bmFtZS50b0xvd2VyQ2FzZSgpIDpcblx0XHRcdFx0bnVsbDtcblx0XHRcdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGhhbmRsZTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn0gKTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF07XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlXG5cdFx0XHRcdC8vIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldFxuXHRcdFx0XHQvLyBodHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0L1xuXHRcdFx0XHQvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2YWwoIzEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRyZXR1cm4gdGFiaW5kZXggP1xuXHRcdFx0XHRcdHBhcnNlSW50KCB0YWJpbmRleCwgMTAgKSA6XG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRcdHJjbGlja2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0uaHJlZiA/XG5cdFx0XHRcdFx0XHRcdDAgOlxuXHRcdFx0XHRcdFx0XHQtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuaWYgKCAhc3VwcG9ydC5vcHRTZWxlY3RlZCApIHtcblx0alF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG52YXIgcmNsYXNzID0gL1tcXHRcXHJcXG5cXGZdL2c7XG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlICkge1xuXHRcdFx0Y2xhc3NlcyA9IHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHQoIFwiIFwiICsgY3VyVmFsdWUgKyBcIiBcIiApLnJlcGxhY2UoIHJjbGFzcywgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBqUXVlcnkudHJpbSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBjdXJWYWx1ZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsIGZpbmFsVmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRyZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGN1clZhbHVlLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB0aGlzLmF0dHIoIFwiY2xhc3NcIiwgXCJcIiApO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlICkge1xuXHRcdFx0Y2xhc3NlcyA9IHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdCggXCIgXCIgKyBjdXJWYWx1ZSArIFwiIFwiICkucmVwbGFjZSggcmNsYXNzLCBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXNcblx0XHRcdFx0XHRcdHdoaWxlICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApID4gLTEgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciA9IGN1ci5yZXBsYWNlKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIsIFwiIFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0galF1ZXJ5LnRyaW0oIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0dG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7XG5cdFx0dmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0gXCJib29sZWFuXCIgJiYgdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoXG5cdFx0XHRcdFx0dmFsdWUuY2FsbCggdGhpcywgaSwgZ2V0Q2xhc3MoIHRoaXMgKSwgc3RhdGVWYWwgKSxcblx0XHRcdFx0XHRzdGF0ZVZhbFxuXHRcdFx0XHQpO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lcztcblxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdC8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzXG5cdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRzZWxmID0galF1ZXJ5KCB0aGlzICk7XG5cdFx0XHRcdGNsYXNzTmFtZXMgPSB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRcdFx0d2hpbGUgKCAoIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XCJcIiA6XG5cdFx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0aGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgY2xhc3NOYW1lLCBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCI7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggXCIgXCIgKyBnZXRDbGFzcyggZWxlbSApICsgXCIgXCIgKS5yZXBsYWNlKCByY2xhc3MsIFwiIFwiIClcblx0XHRcdFx0XHQuaW5kZXhPZiggY2xhc3NOYW1lICkgPiAtMVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgcnJldHVybiA9IC9cXHIvZyxcblx0cnNwYWNlcyA9IC9bXFx4MjBcXHRcXHJcXG5cXGZdKy9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCBpc0Z1bmN0aW9uLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fFxuXHRcdFx0XHRcdGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdFx0aWYgKCBob29rcyAmJlxuXHRcdFx0XHRcdFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0XHQoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgXCJ2YWx1ZVwiICkgKSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXQgPSBlbGVtLnZhbHVlO1xuXG5cdFx0XHRcdHJldHVybiB0eXBlb2YgcmV0ID09PSBcInN0cmluZ1wiID9cblxuXHRcdFx0XHRcdC8vIEhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXNcblx0XHRcdFx0XHRyZXQucmVwbGFjZSggcnJldHVybiwgXCJcIiApIDpcblxuXHRcdFx0XHRcdC8vIEhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlclxuXHRcdFx0XHRcdHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0dmFyIHZhbDtcblxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHR2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCI7XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsIFwidmFsdWVcIiApID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0dmFsSG9va3M6IHtcblx0XHRvcHRpb246IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0dmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIFwidmFsdWVcIiApO1xuXHRcdFx0XHRyZXR1cm4gdmFsICE9IG51bGwgP1xuXHRcdFx0XHRcdHZhbCA6XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTEwLTExK1xuXHRcdFx0XHRcdC8vIG9wdGlvbi50ZXh0IHRocm93cyBleGNlcHRpb25zICgjMTQ2ODYsICMxNDg1OClcblx0XHRcdFx0XHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS13aGl0ZXNwYWNlXG5cdFx0XHRcdFx0alF1ZXJ5LnRyaW0oIGpRdWVyeS50ZXh0KCBlbGVtICkgKS5yZXBsYWNlKCByc3BhY2VzLCBcIiBcIiApO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2VsZWN0OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsdWUsIG9wdGlvbixcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LFxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCIgfHwgaW5kZXggPCAwLFxuXHRcdFx0XHRcdHZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSxcblx0XHRcdFx0XHRtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aCxcblx0XHRcdFx0XHRpID0gaW5kZXggPCAwID9cblx0XHRcdFx0XHRcdG1heCA6XG5cdFx0XHRcdFx0XHRvbmUgPyBpbmRleCA6IDA7XG5cblx0XHRcdFx0Ly8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuXHRcdFx0XHRmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvLyBJRTgtOSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICgjMjU1MSlcblx0XHRcdFx0XHRpZiAoICggb3B0aW9uLnNlbGVjdGVkIHx8IGkgPT09IGluZGV4ICkgJiZcblxuXHRcdFx0XHRcdFx0XHQvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHRcdFx0XHRcdCggc3VwcG9ydC5vcHREaXNhYmxlZCA/XG5cdFx0XHRcdFx0XHRcdFx0IW9wdGlvbi5kaXNhYmxlZCA6IG9wdGlvbi5nZXRBdHRyaWJ1dGUoIFwiZGlzYWJsZWRcIiApID09PSBudWxsICkgJiZcblx0XHRcdFx0XHRcdFx0KCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHxcblx0XHRcdFx0XHRcdFx0XHQhalF1ZXJ5Lm5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkID1cblx0XHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvblNldCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KCBlbGVtICkudmFsKCksIHZhbHVlICkgPiAtMSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKCAhc3VwcG9ydC5jaGVja09uICkge1xuXHRcdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gbnVsbCA/IFwib25cIiA6IGVsZW0udmFsdWU7XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG4vLyBSZXR1cm4galF1ZXJ5IGZvciBhdHRyaWJ1dGVzLW9ubHkgaW5jbHVzaW9uXG5cblxudmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvO1xuXG5qUXVlcnkuZXh0ZW5kKCBqUXVlcnkuZXZlbnQsIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHtcblxuXHRcdHZhciBpLCBjdXIsIHRtcCwgYnViYmxlVHlwZSwgb250eXBlLCBoYW5kbGUsIHNwZWNpYWwsXG5cdFx0XHRldmVudFBhdGggPSBbIGVsZW0gfHwgZG9jdW1lbnQgXSxcblx0XHRcdHR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwidHlwZVwiICkgPyBldmVudC50eXBlIDogZXZlbnQsXG5cdFx0XHRuYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcIm5hbWVzcGFjZVwiICkgPyBldmVudC5uYW1lc3BhY2Uuc3BsaXQoIFwiLlwiICkgOiBbXTtcblxuXHRcdGN1ciA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50O1xuXG5cdFx0Ly8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3dcblx0XHRpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlLmluZGV4T2YoIFwiLlwiICkgPiAtMSApIHtcblxuXHRcdFx0Ly8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKVxuXHRcdFx0bmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIFwiLlwiICk7XG5cdFx0XHR0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpO1xuXHRcdFx0bmFtZXNwYWNlcy5zb3J0KCk7XG5cdFx0fVxuXHRcdG9udHlwZSA9IHR5cGUuaW5kZXhPZiggXCI6XCIgKSA8IDAgJiYgXCJvblwiICsgdHlwZTtcblxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhIGpRdWVyeS5FdmVudCBvYmplY3QsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBlIHN0cmluZ1xuXHRcdGV2ZW50ID0gZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0ZXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSBcIm9iamVjdFwiICYmIGV2ZW50ICk7XG5cblx0XHQvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpXG5cdFx0ZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7XG5cdFx0ZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApO1xuXHRcdGV2ZW50LnJuYW1lc3BhY2UgPSBldmVudC5uYW1lc3BhY2UgP1xuXHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICkgOlxuXHRcdFx0bnVsbDtcblxuXHRcdC8vIENsZWFuIHVwIHRoZSBldmVudCBpbiBjYXNlIGl0IGlzIGJlaW5nIHJldXNlZFxuXHRcdGV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDtcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBlbGVtO1xuXHRcdH1cblxuXHRcdC8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3Rcblx0XHRkYXRhID0gZGF0YSA9PSBudWxsID9cblx0XHRcdFsgZXZlbnQgXSA6XG5cdFx0XHRqUXVlcnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0gKTtcblxuXHRcdC8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXNcblx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICgjOTk1MSlcblx0XHQvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KVxuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhc3BlY2lhbC5ub0J1YmJsZSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xuXHRcdFx0aWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHtcblx0XHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0dG1wID0gY3VyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSlcblx0XHRcdGlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aFxuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBjdXIgPSBldmVudFBhdGhbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdGV2ZW50LnR5cGUgPSBpID4gMSA/XG5cdFx0XHRcdGJ1YmJsZVR5cGUgOlxuXHRcdFx0XHRzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7XG5cblx0XHRcdC8vIGpRdWVyeSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSAoIGRhdGFQcml2LmdldCggY3VyLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmXG5cdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImhhbmRsZVwiICk7XG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0c3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0YWNjZXB0RGF0YSggZWxlbSApICkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBuYW1lIGFzIHRoZSBldmVudC5cblx0XHRcdFx0Ly8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKVxuXHRcdFx0XHRpZiAoIG9udHlwZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9uJ3QgcmUtdHJpZ2dlciBhbiBvbkZPTyBldmVudCB3aGVuIHdlIGNhbGwgaXRzIEZPTygpIG1ldGhvZFxuXHRcdFx0XHRcdHRtcCA9IGVsZW1bIG9udHlwZSBdO1xuXG5cdFx0XHRcdFx0aWYgKCB0bXAgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBvbnR5cGUgXSA9IG51bGw7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJldmVudCByZS10cmlnZ2VyaW5nIG9mIHRoZSBzYW1lIGV2ZW50LCBzaW5jZSB3ZSBhbHJlYWR5IGJ1YmJsZWQgaXQgYWJvdmVcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTtcblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdFx0aWYgKCB0bXAgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBvbnR5cGUgXSA9IHRtcDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQucmVzdWx0O1xuXHR9LFxuXG5cdC8vIFBpZ2d5YmFjayBvbiBhIGRvbm9yIGV2ZW50IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9uZVxuXHQvLyBVc2VkIG9ubHkgZm9yIGBmb2N1cyhpbiB8IG91dClgIGV2ZW50c1xuXHRzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkge1xuXHRcdHZhciBlID0galF1ZXJ5LmV4dGVuZChcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoKSxcblx0XHRcdGV2ZW50LFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRpc1NpbXVsYXRlZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdCk7XG5cblx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApO1xuXHR9XG5cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMgKTtcblx0XHR9ICk7XG5cdH0sXG5cdHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXTtcblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTtcblx0XHR9XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZWFjaCggKCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHtcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5cblxuXG5zdXBwb3J0LmZvY3VzaW4gPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG4vLyBTdXBwb3J0OiBGaXJlZm94XG4vLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4N1xuLy9cbi8vIFN1cHBvcnQ6IENocm9tZSwgU2FmYXJpXG4vLyBmb2N1cyhpbiB8IG91dCkgZXZlbnRzIGZpcmUgYWZ0ZXIgZm9jdXMgJiBibHVyIGV2ZW50cyxcbi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlclxuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5pZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7XG5cdGpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cblx0XHQvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxuXHRcdHZhciBoYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSApO1xuXHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSxcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFjaGVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9ICk7XG59XG52YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG5cbnZhciBub25jZSA9IGpRdWVyeS5ub3coKTtcblxudmFyIHJxdWVyeSA9ICggL1xcPy8gKTtcblxuXG5cbi8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG4vLyBXb3JrYXJvdW5kIGZhaWx1cmUgdG8gc3RyaW5nLWNhc3QgbnVsbCBpbnB1dFxualF1ZXJ5LnBhcnNlSlNPTiA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHRyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSArIFwiXCIgKTtcbn07XG5cblxuLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZ1xualF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rpb24oIGRhdGEgKSB7XG5cdHZhciB4bWw7XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRTlcblx0dHJ5IHtcblx0XHR4bWwgPSAoIG5ldyB3aW5kb3cuRE9NUGFyc2VyKCkgKS5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIFwidGV4dC94bWxcIiApO1xuXHR9IGNhdGNoICggZSApIHtcblx0XHR4bWwgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoICF4bWwgfHwgeG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcInBhcnNlcmVycm9yXCIgKS5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmVycm9yKCBcIkludmFsaWQgWE1MOiBcIiArIGRhdGEgKTtcblx0fVxuXHRyZXR1cm4geG1sO1xufTtcblxuXG52YXJcblx0cmhhc2ggPSAvIy4qJC8sXG5cdHJ0cyA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cdG9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBrZXksIGRlZXAsXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdO1xuXHRcdH1cblx0fVxuXHRpZiAoIGRlZXAgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6XG4gKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKVxuICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7XG5cblx0dmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBlLFxuXHRcdGNvbnRlbnRzID0gcy5jb250ZW50cyxcblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcztcblxuXHQvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2Vzc1xuXHR3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSBcIipcIiApIHtcblx0XHRkYXRhVHlwZXMuc2hpZnQoKTtcblx0XHRpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblxuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWyAwIF0gXSApIHtcblx0XHRcdFx0ZmluYWxEYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhZmlyc3REYXRhVHlwZSApIHtcblx0XHRcdFx0Zmlyc3REYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVyc1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY29udiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50ID0gdG1wWyAwIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdG1wWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcblx0XHRcdFx0aWYgKCBjb252ICE9PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxuXHRcdFx0XHRcdGlmICggY29udiAmJiBzLnRocm93cyApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGU6IFwicGFyc2VyZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRlcnJvcjogY29udiA/IGUgOiBcIk5vIGNvbnZlcnNpb24gZnJvbSBcIiArIHByZXYgKyBcIiB0byBcIiArIGN1cnJlbnRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4geyBzdGF0ZTogXCJzdWNjZXNzXCIsIGRhdGE6IHJlc3BvbnNlIH07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBsb2NhdGlvbi5ocmVmLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggbG9jYXRpb24ucHJvdG9jb2wgKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cdFx0Lypcblx0XHR0aW1lb3V0OiAwLFxuXHRcdGRhdGE6IG51bGwsXG5cdFx0ZGF0YVR5cGU6IG51bGwsXG5cdFx0dXNlcm5hbWU6IG51bGwsXG5cdFx0cGFzc3dvcmQ6IG51bGwsXG5cdFx0Y2FjaGU6IG51bGwsXG5cdFx0dGhyb3dzOiBmYWxzZSxcblx0XHR0cmFkaXRpb25hbDogZmFsc2UsXG5cdFx0aGVhZGVyczoge30sXG5cdFx0Ki9cblxuXHRcdGFjY2VwdHM6IHtcblx0XHRcdFwiKlwiOiBhbGxUeXBlcyxcblx0XHRcdHRleHQ6IFwidGV4dC9wbGFpblwiLFxuXHRcdFx0aHRtbDogXCJ0ZXh0L2h0bWxcIixcblx0XHRcdHhtbDogXCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsXG5cdFx0XHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwiXG5cdFx0fSxcblxuXHRcdGNvbnRlbnRzOiB7XG5cdFx0XHR4bWw6IC9cXGJ4bWxcXGIvLFxuXHRcdFx0aHRtbDogL1xcYmh0bWwvLFxuXHRcdFx0anNvbjogL1xcYmpzb25cXGIvXG5cdFx0fSxcblxuXHRcdHJlc3BvbnNlRmllbGRzOiB7XG5cdFx0XHR4bWw6IFwicmVzcG9uc2VYTUxcIixcblx0XHRcdHRleHQ6IFwicmVzcG9uc2VUZXh0XCIsXG5cdFx0XHRqc29uOiBcInJlc3BvbnNlSlNPTlwiXG5cdFx0fSxcblxuXHRcdC8vIERhdGEgY29udmVydGVyc1xuXHRcdC8vIEtleXMgc2VwYXJhdGUgc291cmNlIChvciBjYXRjaGFsbCBcIipcIikgYW5kIGRlc3RpbmF0aW9uIHR5cGVzIHdpdGggYSBzaW5nbGUgc3BhY2Vcblx0XHRjb252ZXJ0ZXJzOiB7XG5cblx0XHRcdC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dFxuXHRcdFx0XCIqIHRleHRcIjogU3RyaW5nLFxuXG5cdFx0XHQvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbilcblx0XHRcdFwidGV4dCBodG1sXCI6IHRydWUsXG5cblx0XHRcdC8vIEV2YWx1YXRlIHRleHQgYXMgYSBqc29uIGV4cHJlc3Npb25cblx0XHRcdFwidGV4dCBqc29uXCI6IGpRdWVyeS5wYXJzZUpTT04sXG5cblx0XHRcdC8vIFBhcnNlIHRleHQgYXMgeG1sXG5cdFx0XHRcInRleHQgeG1sXCI6IGpRdWVyeS5wYXJzZVhNTFxuXHRcdH0sXG5cblx0XHQvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOlxuXHRcdC8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWZcblx0XHQvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZVxuXHRcdC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKVxuXHRcdGZsYXRPcHRpb25zOiB7XG5cdFx0XHR1cmw6IHRydWUsXG5cdFx0XHRjb250ZXh0OiB0cnVlXG5cdFx0fVxuXHR9LFxuXG5cdC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0XG5cdC8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy5cblx0Ly8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy5cblx0YWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MgP1xuXG5cdFx0XHQvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdFxuXHRcdFx0YWpheEV4dGVuZCggYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOlxuXG5cdFx0XHQvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzXG5cdFx0XHRhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0YXJnZXQgKTtcblx0fSxcblxuXHRhamF4UHJlZmlsdGVyOiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMgKSxcblx0YWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksXG5cblx0Ly8gTWFpbiBtZXRob2Rcblx0YWpheDogZnVuY3Rpb24oIHVybCwgb3B0aW9ucyApIHtcblxuXHRcdC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlXG5cdFx0aWYgKCB0eXBlb2YgdXJsID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0b3B0aW9ucyA9IHVybDtcblx0XHRcdHVybCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdFxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dmFyIHRyYW5zcG9ydCxcblxuXHRcdFx0Ly8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbVxuXHRcdFx0Y2FjaGVVUkwsXG5cblx0XHRcdC8vIFJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyxcblx0XHRcdHJlc3BvbnNlSGVhZGVycyxcblxuXHRcdFx0Ly8gdGltZW91dCBoYW5kbGVcblx0XHRcdHRpbWVvdXRUaW1lcixcblxuXHRcdFx0Ly8gVXJsIGNsZWFudXAgdmFyXG5cdFx0XHR1cmxBbmNob3IsXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZFxuXHRcdFx0ZmlyZUdsb2JhbHMsXG5cblx0XHRcdC8vIExvb3AgdmFyaWFibGVcblx0XHRcdGksXG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cblx0XHRcdC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb25cblx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dCA9IHMuY29udGV4dCAmJlxuXHRcdFx0XHQoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRleHQuanF1ZXJ5ICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIFRoZSBqcVhIUiBzdGF0ZVxuXHRcdFx0c3RhdGUgPSAwLFxuXG5cdFx0XHQvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2Vcblx0XHRcdHN0ckFib3J0ID0gXCJjYW5jZWxlZFwiLFxuXG5cdFx0XHQvLyBGYWtlIHhoclxuXHRcdFx0anFYSFIgPSB7XG5cdFx0XHRcdHJlYWR5U3RhdGU6IDAsXG5cblx0XHRcdFx0Ly8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZFxuXHRcdFx0XHRnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHtcblx0XHRcdFx0XHR2YXIgbWF0Y2g7XG5cdFx0XHRcdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYWNoZXMgdGhlIGhlYWRlclxuXHRcdFx0XHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0dmFyIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xuXHRcdFx0XHRcdFx0bmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyXG5cdFx0XHRcdG92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHN0YXRlIDwgMiApIHtcblx0XHRcdFx0XHRcdFx0Zm9yICggY29kZSBpbiBtYXAgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBMYXp5LWFkZCB0aGUgbmV3IGNhbGxiYWNrIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdFx0c3RhdHVzQ29kZVsgY29kZSBdID0gWyBzdGF0dXNDb2RlWyBjb2RlIF0sIG1hcFsgY29kZSBdIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzXG5cdFx0XHRcdFx0XHRcdGpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHJlcXVlc3Rcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0O1xuXHRcdFx0XHRcdGlmICggdHJhbnNwb3J0ICkge1xuXHRcdFx0XHRcdFx0dHJhbnNwb3J0LmFib3J0KCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9uZSggMCwgZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHQvLyBBdHRhY2ggZGVmZXJyZWRzXG5cdFx0ZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKS5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkO1xuXHRcdGpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lO1xuXHRcdGpxWEhSLmVycm9yID0ganFYSFIuZmFpbDtcblxuXHRcdC8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKVxuXHRcdC8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKHByZWZpbHRlcnMgbWlnaHQgZXhwZWN0IGl0KVxuXHRcdC8vIEhhbmRsZSBmYWxzeSB1cmwgaW4gdGhlIHNldHRpbmdzIG9iamVjdCAoIzEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXG5cdFx0cy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGxvY2F0aW9uLmhyZWYgKSArIFwiXCIgKS5yZXBsYWNlKCByaGFzaCwgXCJcIiApXG5cdFx0XHQucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiApO1xuXG5cdFx0Ly8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0XG5cdFx0cy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTtcblxuXHRcdC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3Rcblx0XHRzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8IFwiKlwiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgWyBcIlwiIF07XG5cblx0XHQvLyBBIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gdGhlIG9yaWdpbiBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IG9yaWdpbi5cblx0XHRpZiAoIHMuY3Jvc3NEb21haW4gPT0gbnVsbCApIHtcblx0XHRcdHVybEFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOC0xMStcblx0XHRcdC8vIElFIHRocm93cyBleGNlcHRpb24gaWYgdXJsIGlzIG1hbGZvcm1lZCwgZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4L1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSBzLnVybDtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTgtMTErXG5cdFx0XHRcdC8vIEFuY2hvcidzIGhvc3QgcHJvcGVydHkgaXNuJ3QgY29ycmVjdGx5IHNldCB3aGVuIHMudXJsIGlzIHJlbGF0aXZlXG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gdXJsQW5jaG9yLmhyZWY7XG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyBvcmlnaW5BbmNob3IuaG9zdCAhPT1cblx0XHRcdFx0XHR1cmxBbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmxBbmNob3IuaG9zdDtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIHBhcnNpbmcgdGhlIFVSTCwgYXNzdW1lIGl0IGlzIGNyb3NzRG9tYWluLFxuXHRcdFx0XHQvLyBpdCBjYW4gYmUgcmVqZWN0ZWQgYnkgdGhlIHRyYW5zcG9ydCBpZiBpdCBpcyBpbnZhbGlkXG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZ1xuXHRcdGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcHJlZmlsdGVyc1xuXHRcdGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmVcblx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0cmV0dXJuIGpxWEhSO1xuXHRcdH1cblxuXHRcdC8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvXG5cdFx0Ly8gRG9uJ3QgZmlyZSBldmVudHMgaWYgalF1ZXJ5LmV2ZW50IGlzIHVuZGVmaW5lZCBpbiBhbiBBTUQtdXNhZ2Ugc2NlbmFyaW8gKCMxNTExOClcblx0XHRmaXJlR2xvYmFscyA9IGpRdWVyeS5ldmVudCAmJiBzLmdsb2JhbDtcblxuXHRcdC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHNcblx0XHRpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdGFydFwiICk7XG5cdFx0fVxuXG5cdFx0Ly8gVXBwZXJjYXNlIHRoZSB0eXBlXG5cdFx0cy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudFxuXHRcdHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlXG5cdFx0Ly8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybDtcblxuXHRcdC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50XG5cdFx0aWYgKCAhcy5oYXNDb250ZW50ICkge1xuXG5cdFx0XHQvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsXG5cdFx0XHRpZiAoIHMuZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgPSAoIHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGEgKTtcblxuXHRcdFx0XHQvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5XG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBhbnRpLWNhY2hlIGluIHVybCBpZiBuZWVkZWRcblx0XHRcdGlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdHMudXJsID0gcnRzLnRlc3QoIGNhY2hlVVJMICkgP1xuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhICdfJyBwYXJhbWV0ZXIsIHNldCBpdHMgdmFsdWVcblx0XHRcdFx0XHRjYWNoZVVSTC5yZXBsYWNlKCBydHMsIFwiJDFfPVwiICsgbm9uY2UrKyApIDpcblxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSBhZGQgb25lIHRvIHRoZSBlbmRcblx0XHRcdFx0XHRjYWNoZVVSTCArICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyBub25jZSsrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/XG5cdFx0XHRcdHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdICtcblx0XHRcdFx0XHQoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJlxuXHRcdFx0KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBzdGF0ZSA9PT0gMiApICkge1xuXG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Zm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkge1xuXHRcdFx0anFYSFJbIGkgXSggc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYWpheFNlbmQsIHN0b3AgdGhlcmVcblx0XHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRcdHJldHVybiBqcVhIUjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGltZW91dFxuXHRcdFx0aWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7XG5cdFx0XHRcdHRpbWVvdXRUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydCggXCJ0aW1lb3V0XCIgKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHN0YXRlID0gMTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lXG5cdFx0XHRcdGlmICggc3RhdGUgPCAyICkge1xuXHRcdFx0XHRcdGRvbmUoIC0xLCBlICk7XG5cblx0XHRcdFx0Ly8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIENhbGxlZCBvbmNlXG5cdFx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXRlIGlzIFwiZG9uZVwiIG5vd1xuXHRcdFx0c3RhdGUgPSAyO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxuXHRcdFx0Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZClcblx0XHRcdHRyYW5zcG9ydCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTZXQgcmVhZHlTdGF0ZVxuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWxcblx0XHRcdGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxuXHRcdFx0aWYgKCByZXNwb25zZXMgKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25zZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpXG5cdFx0XHRyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApO1xuXG5cdFx0XHQvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZ1xuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRcdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJMYXN0LU1vZGlmaWVkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcImV0YWdcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBFeHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dCBhbmQgbm9ybWFsaXplIGZvciBub24tYWJvcnRzXG5cdFx0XHRcdGVycm9yID0gc3RhdHVzVGV4dDtcblx0XHRcdFx0aWYgKCBzdGF0dXMgfHwgIXN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiZXJyb3JcIjtcblx0XHRcdFx0XHRpZiAoIHN0YXR1cyA8IDAgKSB7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdFxuXHRcdFx0anFYSFIuc3RhdHVzID0gc3RhdHVzO1xuXHRcdFx0anFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyBcIlwiO1xuXG5cdFx0XHQvLyBTdWNjZXNzL0Vycm9yXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTtcblx0XHRcdHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyBcImFqYXhTdWNjZXNzXCIgOiBcImFqYXhFcnJvclwiLFxuXHRcdFx0XHRcdFsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbXBsZXRlXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4Q29tcGxldGVcIiwgWyBqcVhIUiwgcyBdICk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0b3BcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblxuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7XG5cdFx0XHRjYWxsYmFjayA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKVxuXHRcdHJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cdFx0XHR0eXBlOiBtZXRob2QsXG5cdFx0XHRkYXRhVHlwZTogdHlwZSxcblx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRzdWNjZXNzOiBjYWxsYmFja1xuXHRcdH0sIGpRdWVyeS5pc1BsYWluT2JqZWN0KCB1cmwgKSAmJiB1cmwgKSApO1xuXHR9O1xufSApO1xuXG5cbmpRdWVyeS5fZXZhbFVybCA9IGZ1bmN0aW9uKCB1cmwgKSB7XG5cdHJldHVybiBqUXVlcnkuYWpheCgge1xuXHRcdHVybDogdXJsLFxuXG5cdFx0Ly8gTWFrZSB0aGlzIGV4cGxpY2l0LCBzaW5jZSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIHRocm91Z2ggYWpheFNldHVwICgjMTEyNjQpXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRkYXRhVHlwZTogXCJzY3JpcHRcIixcblx0XHRhc3luYzogZmFsc2UsXG5cdFx0Z2xvYmFsOiBmYWxzZSxcblx0XHRcInRocm93c1wiOiB0cnVlXG5cdH0gKTtcbn07XG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgd3JhcDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sLmNhbGwoIHRoaXMsIGkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpc1sgMCBdICkge1xuXG5cdFx0XHQvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZFxuXHRcdFx0d3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7XG5cblx0XHRcdGlmICggdGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0d3JhcC5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IHRoaXM7XG5cblx0XHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkge1xuXHRcdFx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVsZW07XG5cdFx0XHR9ICkuYXBwZW5kKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcElubmVyKCBodG1sLmNhbGwoIHRoaXMsIGkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSxcblx0XHRcdFx0Y29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7XG5cblx0XHRcdGlmICggY29udGVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250ZW50cy53cmFwQWxsKCBodG1sICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuYXBwZW5kKCBodG1sICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdHdyYXA6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApO1xuXHRcdH0gKTtcblx0fSxcblxuXHR1bndyYXA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnBhcmVudCgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImJvZHlcIiApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7XG5cdFx0XHR9XG5cdFx0fSApLmVuZCgpO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICFqUXVlcnkuZXhwci5maWx0ZXJzLnZpc2libGUoIGVsZW0gKTtcbn07XG5qUXVlcnkuZXhwci5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHQvLyBTdXBwb3J0OiBPcGVyYSA8PSAxMi4xMlxuXHQvLyBPcGVyYSByZXBvcnRzIG9mZnNldFdpZHRocyBhbmQgb2Zmc2V0SGVpZ2h0cyBsZXNzIHRoYW4gemVybyBvbiBzb21lIGVsZW1lbnRzXG5cdC8vIFVzZSBPUiBpbnN0ZWFkIG9mIEFORCBhcyB0aGUgZWxlbWVudCBpcyBub3QgdmlzaWJsZSBpZiBlaXRoZXIgaXMgdHJ1ZVxuXHQvLyBTZWUgdGlja2V0cyAjMTA0MDYgYW5kICMxMzEzMlxuXHRyZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA+IDAgfHwgZWxlbS5vZmZzZXRIZWlnaHQgPiAwIHx8IGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPiAwO1xufTtcblxuXG5cblxudmFyIHIyMCA9IC8lMjAvZyxcblx0cmJyYWNrZXQgPSAvXFxbXFxdJC8sXG5cdHJDUkxGID0gL1xccj9cXG4vZyxcblx0cnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFxuXHRyc3VibWl0dGFibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7XG5cbmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHtcblx0dmFyIG5hbWU7XG5cblx0aWYgKCBqUXVlcnkuaXNBcnJheSggb2JqICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS5cblx0XHRqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHtcblx0XHRcdGlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7XG5cblx0XHRcdFx0Ly8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLlxuXHRcdFx0XHRhZGQoIHByZWZpeCwgdiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJyYXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LlxuXHRcdFx0XHRidWlsZFBhcmFtcyhcblx0XHRcdFx0XHRwcmVmaXggKyBcIltcIiArICggdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPSBudWxsID8gaSA6IFwiXCIgKSArIFwiXVwiLFxuXHRcdFx0XHRcdHYsXG5cdFx0XHRcdFx0dHJhZGl0aW9uYWwsXG5cdFx0XHRcdFx0YWRkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlwZSggb2JqICkgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgb2JqZWN0IGl0ZW0uXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4ICsgXCJbXCIgKyBuYW1lICsgXCJdXCIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBTZXJpYWxpemUgc2NhbGFyIGl0ZW0uXG5cdFx0YWRkKCBwcmVmaXgsIG9iaiApO1xuXHR9XG59XG5cbi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mXG4vLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmdcbmpRdWVyeS5wYXJhbSA9IGZ1bmN0aW9uKCBhLCB0cmFkaXRpb25hbCApIHtcblx0dmFyIHByZWZpeCxcblx0XHRzID0gW10sXG5cdFx0YWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZVxuXHRcdFx0dmFsdWUgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSA/IHZhbHVlKCkgOiAoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcblx0XHRcdHNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlICk7XG5cdFx0fTtcblxuXHQvLyBTZXQgdHJhZGl0aW9uYWwgdG8gdHJ1ZSBmb3IgalF1ZXJ5IDw9IDEuMy4yIGJlaGF2aW9yLlxuXHRpZiAoIHRyYWRpdGlvbmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0dHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNldHRpbmdzICYmIGpRdWVyeS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7XG5cdH1cblxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxuXHRpZiAoIGpRdWVyeS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGEgKSApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzXG5cdFx0alF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkge1xuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcblx0XHR9ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlIFwib2xkXCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyXG5cdFx0Ly8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb25cblx0cmV0dXJuIHMuam9pbiggXCImXCIgKS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7XG5cdH0sXG5cdHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDYW4gYWRkIHByb3BIb29rIGZvciBcImVsZW1lbnRzXCIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzXG5cdFx0XHR2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgXCJlbGVtZW50c1wiICk7XG5cdFx0XHRyZXR1cm4gZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpcztcblx0XHR9IClcblx0XHQuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKCBcIjpkaXNhYmxlZFwiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3Ncblx0XHRcdHJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCBcIjpkaXNhYmxlZFwiICkgJiZcblx0XHRcdFx0cnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJlxuXHRcdFx0XHQoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7XG5cdFx0fSApXG5cdFx0Lm1hcCggZnVuY3Rpb24oIGksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdHJldHVybiB2YWwgPT0gbnVsbCA/XG5cdFx0XHRcdG51bGwgOlxuXHRcdFx0XHRqUXVlcnkuaXNBcnJheSggdmFsICkgP1xuXHRcdFx0XHRcdGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdFx0fSApIDpcblx0XHRcdFx0XHR7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0fSApLmdldCgpO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUU5XG5cdFx0Ly8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydCggZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaztcblxuXHQvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0XG5cdGlmICggc3VwcG9ydC5jb3JzIHx8IHhoclN1cHBvcnRlZCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkge1xuXHRcdFx0XHR2YXIgaSxcblx0XHRcdFx0XHR4aHIgPSBvcHRpb25zLnhocigpO1xuXG5cdFx0XHRcdHhoci5vcGVuKFxuXHRcdFx0XHRcdG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLnVybCxcblx0XHRcdFx0XHRvcHRpb25zLmFzeW5jLFxuXHRcdFx0XHRcdG9wdGlvbnMudXNlcm5hbWUsXG5cdFx0XHRcdFx0b3B0aW9ucy5wYXNzd29yZFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBmaWVsZHMgaWYgcHJvdmlkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0eGhyWyBpIF0gPSBvcHRpb25zLnhockZpZWxkc1sgaSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkge1xuXHRcdFx0XHRcdHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHRcdFx0XHQvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlXG5cdFx0XHRcdC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuXG5cdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxuXHRcdFx0XHQvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC5cblx0XHRcdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrID0geGhyLm9ubG9hZCA9XG5cdFx0XHRcdFx0XHRcdFx0eGhyLm9uZXJyb3IgPSB4aHIub25hYm9ydCA9IHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJhYm9ydFwiICkge1xuXHRcdFx0XHRcdFx0XHRcdHhoci5hYm9ydCgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBcImVycm9yXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTlcblx0XHRcdFx0XHRcdFx0XHQvLyBPbiBhIG1hbnVhbCBuYXRpdmUgYWJvcnQsIElFOSB0aHJvd3Ncblx0XHRcdFx0XHRcdFx0XHQvLyBlcnJvcnMgb24gYW55IHByb3BlcnR5IGFjY2VzcyB0aGF0IGlzIG5vdCByZWFkeVN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlb2YgeGhyLnN0YXR1cyAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCAwLCBcImVycm9yXCIgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUU5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0gY2FsbGJhY2soIFwiZXJyb3JcIiApO1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFOVxuXHRcdFx0XHQvLyBVc2Ugb25yZWFkeXN0YXRlY2hhbmdlIHRvIHJlcGxhY2Ugb25hYm9ydFxuXHRcdFx0XHQvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzXG5cdFx0XHRcdGlmICggeGhyLm9uYWJvcnQgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR4aHIub25hYm9ydCA9IGVycm9yQ2FsbGJhY2s7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0XHQvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXNcblx0XHRcdFx0XHRcdGlmICggeGhyLnJlYWR5U3RhdGUgPT09IDQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQWxsb3cgb25lcnJvciB0byBiZSBjYWxsZWQgZmlyc3QsXG5cdFx0XHRcdFx0XHRcdC8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydFxuXHRcdFx0XHRcdFx0XHQvLyBBbHNvLCBzYXZlIGVycm9yQ2FsbGJhY2sgdG8gYSB2YXJpYWJsZVxuXHRcdFx0XHRcdFx0XHQvLyBhcyB4aHIub25lcnJvciBjYW5ub3QgYmUgYWNjZXNzZWRcblx0XHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlcnJvckNhbGxiYWNrKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSBjYWxsYmFjayggXCJhYm9ydFwiICk7XG5cblx0XHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRcdC8vIERvIHNlbmQgdGhlIHJlcXVlc3QgKHRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbilcblx0XHRcdFx0XHR4aHIuc2VuZCggb3B0aW9ucy5oYXNDb250ZW50ICYmIG9wdGlvbnMuZGF0YSB8fCBudWxsICk7XG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0Ly8gIzE0NjgzOiBPbmx5IHJldGhyb3cgaWYgdGhpcyBoYXNuJ3QgYmVlbiBub3RpZmllZCBhcyBhbiBlcnJvciB5ZXRcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG4vLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlwZVxualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRhY2NlcHRzOiB7XG5cdFx0c2NyaXB0OiBcInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgXCIgK1xuXHRcdFx0XCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHRcIlxuXHR9LFxuXHRjb250ZW50czoge1xuXHRcdHNjcmlwdDogL1xcYig/OmphdmF8ZWNtYSlzY3JpcHRcXGIvXG5cdH0sXG5cdGNvbnZlcnRlcnM6IHtcblx0XHRcInRleHQgc2NyaXB0XCI6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0alF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTtcblx0XHRcdHJldHVybiB0ZXh0O1xuXHRcdH1cblx0fVxufSApO1xuXG4vLyBIYW5kbGUgY2FjaGUncyBzcGVjaWFsIGNhc2UgYW5kIGNyb3NzRG9tYWluXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jYWNoZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdHMuY2FjaGUgPSBmYWxzZTtcblx0fVxuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cy50eXBlID0gXCJHRVRcIjtcblx0fVxufSApO1xuXG4vLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnRcbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblxuXHQvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzXG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHR2YXIgc2NyaXB0LCBjYWxsYmFjaztcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkge1xuXHRcdFx0XHRzY3JpcHQgPSBqUXVlcnkoIFwiPHNjcmlwdD5cIiApLnByb3AoIHtcblx0XHRcdFx0XHRjaGFyc2V0OiBzLnNjcmlwdENoYXJzZXQsXG5cdFx0XHRcdFx0c3JjOiBzLnVybFxuXHRcdFx0XHR9ICkub24oXG5cdFx0XHRcdFx0XCJsb2FkIGVycm9yXCIsXG5cdFx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggZXZ0ICkge1xuXHRcdFx0XHRcdFx0c2NyaXB0LnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBudWxsO1xuXHRcdFx0XHRcdFx0aWYgKCBldnQgKSB7XG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCBldnQudHlwZSA9PT0gXCJlcnJvclwiID8gNDA0IDogMjAwLCBldnQudHlwZSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnlcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0WyAwIF0gKTtcblx0XHRcdH0sXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxudmFyIG9sZENhbGxiYWNrcyA9IFtdLFxuXHRyanNvbnAgPSAvKD0pXFw/KD89JnwkKXxcXD9cXD8vO1xuXG4vLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGpzb25wOiBcImNhbGxiYWNrXCIsXG5cdGpzb25wQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjYWxsYmFjayA9IG9sZENhbGxiYWNrcy5wb3AoKSB8fCAoIGpRdWVyeS5leHBhbmRvICsgXCJfXCIgKyAoIG5vbmNlKysgKSApO1xuXHRcdHRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlO1xuXHRcdHJldHVybiBjYWxsYmFjaztcblx0fVxufSApO1xuXG4vLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHNcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xuXG5cdHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lcixcblx0XHRqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgP1xuXHRcdFx0XCJ1cmxcIiA6XG5cdFx0XHR0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCggcy5jb250ZW50VHlwZSB8fCBcIlwiIClcblx0XHRcdFx0XHQuaW5kZXhPZiggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiApID09PSAwICYmXG5cdFx0XHRcdHJqc29ucC50ZXN0KCBzLmRhdGEgKSAmJiBcImRhdGFcIlxuXHRcdCk7XG5cblx0Ly8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzIFwianNvbnBcIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldFxuXHRpZiAoIGpzb25Qcm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09IFwianNvbnBcIiApIHtcblxuXHRcdC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXRcblx0XHRjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBqUXVlcnkuaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzWyBcInNjcmlwdCBqc29uXCIgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIEZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXRcblx0XHRcdGlmICggb3ZlcndyaXR0ZW4gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTtcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBvdmVyd3JpdHRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2F2ZSBiYWNrIGFzIGZyZWVcblx0XHRcdGlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBTYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkge1xuXHRcdFx0XHRvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkO1xuXHRcdH0gKTtcblxuXHRcdC8vIERlbGVnYXRlIHRvIHNjcmlwdFxuXHRcdHJldHVybiBcInNjcmlwdFwiO1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIEFyZ3VtZW50IFwiZGF0YVwiIHNob3VsZCBiZSBzdHJpbmcgb2YgaHRtbFxuLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LFxuLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnRcbi8vIGtlZXBTY3JpcHRzIChvcHRpb25hbCk6IElmIHRydWUsIHdpbGwgaW5jbHVkZSBzY3JpcHRzIHBhc3NlZCBpbiB0aGUgaHRtbCBzdHJpbmdcbmpRdWVyeS5wYXJzZUhUTUwgPSBmdW5jdGlvbiggZGF0YSwgY29udGV4dCwga2VlcFNjcmlwdHMgKSB7XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcblxuXHR2YXIgcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICksXG5cdFx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZFxudmFyIF9sb2FkID0galF1ZXJ5LmZuLmxvYWQ7XG5cbi8qKlxuICogTG9hZCBhIHVybCBpbnRvIGEgcGFnZVxuICovXG5qUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7XG5cdGlmICggdHlwZW9mIHVybCAhPT0gXCJzdHJpbmdcIiAmJiBfbG9hZCApIHtcblx0XHRyZXR1cm4gX2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9XG5cblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0galF1ZXJ5LnRyaW0oIHVybC5zbGljZSggb2ZmICkgKTtcblx0XHR1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApO1xuXHR9XG5cblx0Ly8gSWYgaXQncyBhIGZ1bmN0aW9uXG5cdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkge1xuXG5cdFx0Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2tcblx0XHRjYWxsYmFjayA9IHBhcmFtcztcblx0XHRwYXJhbXMgPSB1bmRlZmluZWQ7XG5cblx0Ly8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZ1xuXHR9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHR0eXBlID0gXCJQT1NUXCI7XG5cdH1cblxuXHQvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdFxuXHRpZiAoIHNlbGYubGVuZ3RoID4gMCApIHtcblx0XHRqUXVlcnkuYWpheCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cblx0XHRcdC8vIElmIFwidHlwZVwiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiBcIkdFVFwiIG1ldGhvZCB3aWxsIGJlIHVzZWQuXG5cdFx0XHQvLyBNYWtlIHZhbHVlIG9mIHRoaXMgZmllbGQgZXhwbGljaXQgc2luY2Vcblx0XHRcdC8vIHVzZXIgY2FuIG92ZXJyaWRlIGl0IHRocm91Z2ggYWpheFNldHVwIG1ldGhvZFxuXHRcdFx0dHlwZTogdHlwZSB8fCBcIkdFVFwiLFxuXHRcdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxuXHRcdFx0ZGF0YTogcGFyYW1zXG5cdFx0fSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7XG5cblx0XHRcdC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFja1xuXHRcdFx0cmVzcG9uc2UgPSBhcmd1bWVudHM7XG5cblx0XHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xuXG5cdFx0XHRcdC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdlxuXHRcdFx0XHQvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnNcblx0XHRcdFx0alF1ZXJ5KCBcIjxkaXY+XCIgKS5hcHBlbmQoIGpRdWVyeS5wYXJzZUhUTUwoIHJlc3BvbnNlVGV4dCApICkuZmluZCggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHRcblx0XHRcdFx0cmVzcG9uc2VUZXh0ICk7XG5cblx0XHQvLyBJZiB0aGUgcmVxdWVzdCBzdWNjZWVkcywgdGhpcyBmdW5jdGlvbiBnZXRzIFwiZGF0YVwiLCBcInN0YXR1c1wiLCBcImpxWEhSXCJcblx0XHQvLyBidXQgdGhleSBhcmUgaWdub3JlZCBiZWNhdXNlIHJlc3BvbnNlIHdhcyBzZXQgYWJvdmUuXG5cdFx0Ly8gSWYgaXQgZmFpbHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImpxWEhSXCIsIFwic3RhdHVzXCIsIFwiZXJyb3JcIlxuXHRcdH0gKS5hbHdheXMoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xuXHRcdFx0c2VsZi5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y2FsbGJhY2suYXBwbHkoIHRoaXMsIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn07XG5cblxuXG5cbi8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzXG5qUXVlcnkuZWFjaCggW1xuXHRcImFqYXhTdGFydFwiLFxuXHRcImFqYXhTdG9wXCIsXG5cdFwiYWpheENvbXBsZXRlXCIsXG5cdFwiYWpheEVycm9yXCIsXG5cdFwiYWpheFN1Y2Nlc3NcIixcblx0XCJhamF4U2VuZFwiXG5dLCBmdW5jdGlvbiggaSwgdHlwZSApIHtcblx0alF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7XG5cdH07XG59ICk7XG5cblxuXG5cbmpRdWVyeS5leHByLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW0gPT09IGZuLmVsZW07XG5cdH0gKS5sZW5ndGg7XG59O1xuXG5cblxuXG4vKipcbiAqIEdldHMgYSB3aW5kb3cgZnJvbSBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvdyggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8gZWxlbSA6IGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kZWZhdWx0Vmlldztcbn1cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCBcImF1dG9cIiApID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0aW9ucyApICkge1xuXG5cdFx0XHQvLyBVc2UgalF1ZXJ5LmV4dGVuZCBoZXJlIHRvIGFsbG93IG1vZGlmaWNhdGlvbiBvZiBjb29yZGluYXRlcyBhcmd1bWVudCAoZ2gtMTg0OClcblx0XHRcdG9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGpRdWVyeS5leHRlbmQoIHt9LCBjdXJPZmZzZXQgKSApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLnRvcCA9ICggb3B0aW9ucy50b3AgLSBjdXJPZmZzZXQudG9wICkgKyBjdXJUb3A7XG5cdFx0fVxuXHRcdGlmICggb3B0aW9ucy5sZWZ0ICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3VyTGVmdDtcblx0XHR9XG5cblx0XHRpZiAoIFwidXNpbmdcIiBpbiBvcHRpb25zICkge1xuXHRcdFx0b3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1ckVsZW0uY3NzKCBwcm9wcyApO1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiBvcHRpb25zID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHR0aGlzIDpcblx0XHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0XHRqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApO1xuXHRcdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0dmFyIGRvY0VsZW0sIHdpbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LFxuXHRcdFx0ZG9jID0gZWxlbSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cblx0XHRpZiAoICFkb2MgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHQvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGVcblx0XHRpZiAoICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHtcblx0XHRcdHJldHVybiBib3g7XG5cdFx0fVxuXG5cdFx0Ym94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR3aW4gPSBnZXRXaW5kb3coIGRvYyApO1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IGJveC50b3AgKyB3aW4ucGFnZVlPZmZzZXQgLSBkb2NFbGVtLmNsaWVudFRvcCxcblx0XHRcdGxlZnQ6IGJveC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRMZWZ0XG5cdFx0fTtcblx0fSxcblxuXHRwb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhdGhpc1sgMCBdICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBvZmZzZXRQYXJlbnQsIG9mZnNldCxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuXG5cdFx0Ly8gRml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHdpbmRvdyAocGFyZW50T2Zmc2V0ID0ge3RvcDowLCBsZWZ0OiAwfSxcblx0XHQvLyBiZWNhdXNlIGl0IGlzIGl0cyBvbmx5IG9mZnNldCBwYXJlbnRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cblx0XHRcdC8vIEFzc3VtZSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaXMgdGhlcmUgd2hlbiBjb21wdXRlZCBwb3NpdGlvbiBpcyBmaXhlZFxuXHRcdFx0b2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50XG5cdFx0XHRvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpO1xuXG5cdFx0XHQvLyBHZXQgY29ycmVjdCBvZmZzZXRzXG5cdFx0XHRvZmZzZXQgPSB0aGlzLm9mZnNldCgpO1xuXHRcdFx0aWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCBvZmZzZXRQYXJlbnRbIDAgXSwgXCJodG1sXCIgKSApIHtcblx0XHRcdFx0cGFyZW50T2Zmc2V0ID0gb2Zmc2V0UGFyZW50Lm9mZnNldCgpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnNcblx0XHRcdHBhcmVudE9mZnNldC50b3AgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sIFwiYm9yZGVyVG9wV2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0cGFyZW50T2Zmc2V0LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sIFwiYm9yZGVyTGVmdFdpZHRoXCIsIHRydWUgKTtcblx0XHR9XG5cblx0XHQvLyBTdWJ0cmFjdCBwYXJlbnQgb2Zmc2V0cyBhbmQgZWxlbWVudCBtYXJnaW5zXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpblRvcFwiLCB0cnVlICksXG5cdFx0XHRsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIsIHRydWUgKVxuXHRcdH07XG5cdH0sXG5cblx0Ly8gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZG9jdW1lbnRFbGVtZW50IGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG5cdC8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm5cblx0Ly8gICAgZG9jdW1lbnRFbGVtZW50IG9mIHRoZSBwYXJlbnQgd2luZG93XG5cdC8vIDIpIEZvciB0aGUgaGlkZGVuIG9yIGRldGFjaGVkIGVsZW1lbnRcblx0Ly8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZlxuXHQvL1xuXHQvLyBidXQgdGhvc2UgZXhjZXB0aW9ucyB3ZXJlIG5ldmVyIHByZXNlbnRlZCBhcyBhIHJlYWwgbGlmZSB1c2UtY2FzZXNcblx0Ly8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuXG5cdC8vXG5cdC8vIFRoaXMgbG9naWMsIGhvd2V2ZXIsIGlzIG5vdCBndWFyYW50ZWVkIGFuZCBjYW4gY2hhbmdlIGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlXG5cdG9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudDtcblxuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcInBvc2l0aW9uXCIgKSA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogXCJwYWdlWE9mZnNldFwiLCBzY3JvbGxUb3A6IFwicGFnZVlPZmZzZXRcIiB9LCBmdW5jdGlvbiggbWV0aG9kLCBwcm9wICkge1xuXHR2YXIgdG9wID0gXCJwYWdlWU9mZnNldFwiID09PSBwcm9wO1xuXG5cdGpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHtcblx0XHRcdHZhciB3aW4gPSBnZXRXaW5kb3coIGVsZW0gKTtcblxuXHRcdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHdpbiA/IHdpblsgcHJvcCBdIDogZWxlbVsgbWV0aG9kIF07XG5cdFx0XHR9XG5cblx0XHRcdGlmICggd2luICkge1xuXHRcdFx0XHR3aW4uc2Nyb2xsVG8oXG5cdFx0XHRcdFx0IXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCxcblx0XHRcdFx0XHR0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXRcblx0XHRcdFx0KTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbVsgbWV0aG9kIF0gPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSwgbWV0aG9kLCB2YWwsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fTtcbn0gKTtcblxuLy8gU3VwcG9ydDogU2FmYXJpPDctOCssIENocm9tZTwzNy00NCtcbi8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uXG4vLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcbi8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTIyOTI4MFxuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sXG5cdFx0ZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBBcyBvZiA1LzgvMjAxMiB0aGlzIHdpbGwgeWllbGQgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIE1vYmlsZSBTYWZhcmksIGJ1dCB0aGVyZVxuXHRcdFx0XHRcdC8vIGlzbid0IGEgd2hvbGUgbG90IHdlIGNhbiBkby4gU2VlIHB1bGwgcmVxdWVzdCBhdCB0aGlzIFVSTCBmb3IgZGlzY3Vzc2lvbjpcblx0XHRcdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzc2NFxuXHRcdFx0XHRcdHJldHVybiBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSwgbnVsbCApO1xuXHRcdH07XG5cdH0gKTtcbn0gKTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblxuXHRcdC8vICggbmFtZXNwYWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dIClcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/XG5cdFx0XHR0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDpcblx0XHRcdHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9LFxuXHRzaXplOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5sZW5ndGg7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmFuZFNlbGYgPSBqUXVlcnkuZm4uYWRkQmFjaztcblxuXG5cblxuLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyXG4vLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0XG4vLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Rcbi8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmVcbi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZVxuLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzXG4vLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuXG5cbi8vIE5vdGUgdGhhdCBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBqUXVlcnkgc2hvdWxkXG4vLyBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgYW5vbnltb3VzIG1vZHVsZXMsIGFuZCBhdm9pZCBzZXR0aW5nIGEgZ2xvYmFsIGlmIGFuXG4vLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3RpbmctbGlicmFyaWVzI3dpa2ktYW5vblxuXG5pZiAoIHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kICkge1xuXHRkZWZpbmUoIFwianF1ZXJ5XCIsIFtdLCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5O1xuXHR9ICk7XG59XG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoICFub0dsb2JhbCApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5yZXR1cm4galF1ZXJ5O1xufSkpO1xuIiwiLyoqXG4gKiBPd2wgQ2Fyb3VzZWwgdjIuMS40XG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE2IERhdmlkIERldXRzY2hcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL093bENhcm91c2VsMi9Pd2xDYXJvdXNlbDIvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqL1xuLyoqXG4gKiBPd2wgY2Fyb3VzZWxcbiAqIEB2ZXJzaW9uIDIuMS4wXG4gKiBAYXV0aG9yIEJhcnRvc3ogV29qY2llY2hvd3NraVxuICogQGF1dGhvciBEYXZpZCBEZXV0c2NoXG4gKiBAbGljZW5zZSBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqIEB0b2RvIExhenkgTG9hZCBJY29uXG4gKiBAdG9kbyBwcmV2ZW50IGFuaW1hdGlvbmVuZCBidWJsaW5nXG4gKiBAdG9kbyBpdGVtc1NjYWxlVXBcbiAqIEB0b2RvIFRlc3QgWmVwdG9cbiAqIEB0b2RvIHN0YWdlUGFkZGluZyBjYWxjdWxhdGUgd3JvbmcgYWN0aXZlIGNsYXNzZXNcbiAqL1xuOyhmdW5jdGlvbigkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGNhcm91c2VsLlxuXHQgKiBAY2xhc3MgVGhlIE93bCBDYXJvdXNlbC5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fGpRdWVyeX0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGNyZWF0ZSB0aGUgY2Fyb3VzZWwgZm9yLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnNcblx0ICovXG5cdGZ1bmN0aW9uIE93bChlbGVtZW50LCBvcHRpb25zKSB7XG5cblx0XHQvKipcblx0XHQgKiBDdXJyZW50IHNldHRpbmdzIGZvciB0aGUgY2Fyb3VzZWwuXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqL1xuXHRcdHRoaXMuc2V0dGluZ3MgPSBudWxsO1xuXG5cdFx0LyoqXG5cdFx0ICogQ3VycmVudCBvcHRpb25zIHNldCBieSB0aGUgY2FsbGVyIGluY2x1ZGluZyBkZWZhdWx0cy5cblx0XHQgKiBAcHVibGljXG5cdFx0ICovXG5cdFx0dGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sIE93bC5EZWZhdWx0cywgb3B0aW9ucyk7XG5cblx0XHQvKipcblx0XHQgKiBQbHVnaW4gZWxlbWVudC5cblx0XHQgKiBAcHVibGljXG5cdFx0ICovXG5cdFx0dGhpcy4kZWxlbWVudCA9ICQoZWxlbWVudCk7XG5cblx0XHQvKipcblx0XHQgKiBQcm94aWVkIGV2ZW50IGhhbmRsZXJzLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9oYW5kbGVycyA9IHt9O1xuXG5cdFx0LyoqXG5cdFx0ICogUmVmZXJlbmNlcyB0byB0aGUgcnVubmluZyBwbHVnaW5zIG9mIHRoaXMgY2Fyb3VzZWwuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX3BsdWdpbnMgPSB7fTtcblxuXHRcdC8qKlxuXHRcdCAqIEN1cnJlbnRseSBzdXBwcmVzc2VkIGV2ZW50cyB0byBwcmV2ZW50IHRoZW0gZnJvbSBiZWVpbmcgcmV0cmlnZ2VyZWQuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX3N1cHJlc3MgPSB7fTtcblxuXHRcdC8qKlxuXHRcdCAqIEFic29sdXRlIGN1cnJlbnQgcG9zaXRpb24uXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX2N1cnJlbnQgPSBudWxsO1xuXG5cdFx0LyoqXG5cdFx0ICogQW5pbWF0aW9uIHNwZWVkIGluIG1pbGxpc2Vjb25kcy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5fc3BlZWQgPSBudWxsO1xuXG5cdFx0LyoqXG5cdFx0ICogQ29vcmRpbmF0ZXMgb2YgYWxsIGl0ZW1zIGluIHBpeGVsLlxuXHRcdCAqIEB0b2RvIFRoZSBuYW1lIG9mIHRoaXMgbWVtYmVyIGlzIG1pc3NsZWFkaW5nLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9jb29yZGluYXRlcyA9IFtdO1xuXG5cdFx0LyoqXG5cdFx0ICogQ3VycmVudCBicmVha3BvaW50LlxuXHRcdCAqIEB0b2RvIFJlYWwgbWVkaWEgcXVlcmllcyB3b3VsZCBiZSBuaWNlLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9icmVha3BvaW50ID0gbnVsbDtcblxuXHRcdC8qKlxuXHRcdCAqIEN1cnJlbnQgd2lkdGggb2YgdGhlIHBsdWdpbiBlbGVtZW50LlxuXHRcdCAqL1xuXHRcdHRoaXMuX3dpZHRoID0gbnVsbDtcblxuXHRcdC8qKlxuXHRcdCAqIEFsbCByZWFsIGl0ZW1zLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9pdGVtcyA9IFtdO1xuXG5cdFx0LyoqXG5cdFx0ICogQWxsIGNsb25lZCBpdGVtcy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5fY2xvbmVzID0gW107XG5cblx0XHQvKipcblx0XHQgKiBNZXJnZSB2YWx1ZXMgb2YgYWxsIGl0ZW1zLlxuXHRcdCAqIEB0b2RvIE1heWJlIHRoaXMgY291bGQgYmUgcGFydCBvZiBhIHBsdWdpbi5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5fbWVyZ2VycyA9IFtdO1xuXG5cdFx0LyoqXG5cdFx0ICogV2lkdGhzIG9mIGFsbCBpdGVtcy5cblx0XHQgKi9cblx0XHR0aGlzLl93aWR0aHMgPSBbXTtcblxuXHRcdC8qKlxuXHRcdCAqIEludmFsaWRhdGVkIHBhcnRzIHdpdGhpbiB0aGUgdXBkYXRlIHByb2Nlc3MuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX2ludmFsaWRhdGVkID0ge307XG5cblx0XHQvKipcblx0XHQgKiBPcmRlcmVkIGxpc3Qgb2Ygd29ya2VycyBmb3IgdGhlIHVwZGF0ZSBwcm9jZXNzLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9waXBlID0gW107XG5cblx0XHQvKipcblx0XHQgKiBDdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgZHJhZyBvcGVyYXRpb24uXG5cdFx0ICogQHRvZG8gIzI2MVxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9kcmFnID0ge1xuXHRcdFx0dGltZTogbnVsbCxcblx0XHRcdHRhcmdldDogbnVsbCxcblx0XHRcdHBvaW50ZXI6IG51bGwsXG5cdFx0XHRzdGFnZToge1xuXHRcdFx0XHRzdGFydDogbnVsbCxcblx0XHRcdFx0Y3VycmVudDogbnVsbFxuXHRcdFx0fSxcblx0XHRcdGRpcmVjdGlvbjogbnVsbFxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBDdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uIGFuZCB0aGVpciB0YWdzLlxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX3N0YXRlcyA9IHtcblx0XHRcdGN1cnJlbnQ6IHt9LFxuXHRcdFx0dGFnczoge1xuXHRcdFx0XHQnaW5pdGlhbGl6aW5nJzogWyAnYnVzeScgXSxcblx0XHRcdFx0J2FuaW1hdGluZyc6IFsgJ2J1c3knIF0sXG5cdFx0XHRcdCdkcmFnZ2luZyc6IFsgJ2ludGVyYWN0aW5nJyBdXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdCQuZWFjaChbICdvblJlc2l6ZScsICdvblRocm90dGxlZFJlc2l6ZScgXSwgJC5wcm94eShmdW5jdGlvbihpLCBoYW5kbGVyKSB7XG5cdFx0XHR0aGlzLl9oYW5kbGVyc1toYW5kbGVyXSA9ICQucHJveHkodGhpc1toYW5kbGVyXSwgdGhpcyk7XG5cdFx0fSwgdGhpcykpO1xuXG5cdFx0JC5lYWNoKE93bC5QbHVnaW5zLCAkLnByb3h5KGZ1bmN0aW9uKGtleSwgcGx1Z2luKSB7XG5cdFx0XHR0aGlzLl9wbHVnaW5zW2tleS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGtleS5zbGljZSgxKV1cblx0XHRcdFx0PSBuZXcgcGx1Z2luKHRoaXMpO1xuXHRcdH0sIHRoaXMpKTtcblxuXHRcdCQuZWFjaChPd2wuV29ya2VycywgJC5wcm94eShmdW5jdGlvbihwcmlvcml0eSwgd29ya2VyKSB7XG5cdFx0XHR0aGlzLl9waXBlLnB1c2goe1xuXHRcdFx0XHQnZmlsdGVyJzogd29ya2VyLmZpbHRlcixcblx0XHRcdFx0J3J1bic6ICQucHJveHkod29ya2VyLnJ1biwgdGhpcylcblx0XHRcdH0pO1xuXHRcdH0sIHRoaXMpKTtcblxuXHRcdHRoaXMuc2V0dXAoKTtcblx0XHR0aGlzLmluaXRpYWxpemUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBjYXJvdXNlbC5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0T3dsLkRlZmF1bHRzID0ge1xuXHRcdGl0ZW1zOiAzLFxuXHRcdGxvb3A6IGZhbHNlLFxuXHRcdGNlbnRlcjogZmFsc2UsXG5cdFx0cmV3aW5kOiBmYWxzZSxcblxuXHRcdG1vdXNlRHJhZzogdHJ1ZSxcblx0XHR0b3VjaERyYWc6IHRydWUsXG5cdFx0cHVsbERyYWc6IHRydWUsXG5cdFx0ZnJlZURyYWc6IGZhbHNlLFxuXG5cdFx0bWFyZ2luOiAwLFxuXHRcdHN0YWdlUGFkZGluZzogMCxcblxuXHRcdG1lcmdlOiBmYWxzZSxcblx0XHRtZXJnZUZpdDogdHJ1ZSxcblx0XHRhdXRvV2lkdGg6IGZhbHNlLFxuXG5cdFx0c3RhcnRQb3NpdGlvbjogMCxcblx0XHRydGw6IGZhbHNlLFxuXG5cdFx0c21hcnRTcGVlZDogMjUwLFxuXHRcdGZsdWlkU3BlZWQ6IGZhbHNlLFxuXHRcdGRyYWdFbmRTcGVlZDogZmFsc2UsXG5cblx0XHRyZXNwb25zaXZlOiB7fSxcblx0XHRyZXNwb25zaXZlUmVmcmVzaFJhdGU6IDIwMCxcblx0XHRyZXNwb25zaXZlQmFzZUVsZW1lbnQ6IHdpbmRvdyxcblxuXHRcdGZhbGxiYWNrRWFzaW5nOiAnc3dpbmcnLFxuXG5cdFx0aW5mbzogZmFsc2UsXG5cblx0XHRuZXN0ZWRJdGVtU2VsZWN0b3I6IGZhbHNlLFxuXHRcdGl0ZW1FbGVtZW50OiAnZGl2Jyxcblx0XHRzdGFnZUVsZW1lbnQ6ICdkaXYnLFxuXG5cdFx0cmVmcmVzaENsYXNzOiAnb3dsLXJlZnJlc2gnLFxuXHRcdGxvYWRlZENsYXNzOiAnb3dsLWxvYWRlZCcsXG5cdFx0bG9hZGluZ0NsYXNzOiAnb3dsLWxvYWRpbmcnLFxuXHRcdHJ0bENsYXNzOiAnb3dsLXJ0bCcsXG5cdFx0cmVzcG9uc2l2ZUNsYXNzOiAnb3dsLXJlc3BvbnNpdmUnLFxuXHRcdGRyYWdDbGFzczogJ293bC1kcmFnJyxcblx0XHRpdGVtQ2xhc3M6ICdvd2wtaXRlbScsXG5cdFx0c3RhZ2VDbGFzczogJ293bC1zdGFnZScsXG5cdFx0c3RhZ2VPdXRlckNsYXNzOiAnb3dsLXN0YWdlLW91dGVyJyxcblx0XHRncmFiQ2xhc3M6ICdvd2wtZ3JhYidcblx0fTtcblxuXHQvKipcblx0ICogRW51bWVyYXRpb24gZm9yIHdpZHRoLlxuXHQgKiBAcHVibGljXG5cdCAqIEByZWFkb25seVxuXHQgKiBAZW51bSB7U3RyaW5nfVxuXHQgKi9cblx0T3dsLldpZHRoID0ge1xuXHRcdERlZmF1bHQ6ICdkZWZhdWx0Jyxcblx0XHRJbm5lcjogJ2lubmVyJyxcblx0XHRPdXRlcjogJ291dGVyJ1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBFbnVtZXJhdGlvbiBmb3IgdHlwZXMuXG5cdCAqIEBwdWJsaWNcblx0ICogQHJlYWRvbmx5XG5cdCAqIEBlbnVtIHtTdHJpbmd9XG5cdCAqL1xuXHRPd2wuVHlwZSA9IHtcblx0XHRFdmVudDogJ2V2ZW50Jyxcblx0XHRTdGF0ZTogJ3N0YXRlJ1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDb250YWlucyBhbGwgcmVnaXN0ZXJlZCBwbHVnaW5zLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRPd2wuUGx1Z2lucyA9IHt9O1xuXG5cdC8qKlxuXHQgKiBMaXN0IG9mIHdvcmtlcnMgaW52b2x2ZWQgaW4gdGhlIHVwZGF0ZSBwcm9jZXNzLlxuXHQgKi9cblx0T3dsLldvcmtlcnMgPSBbIHtcblx0XHRmaWx0ZXI6IFsgJ3dpZHRoJywgJ3NldHRpbmdzJyBdLFxuXHRcdHJ1bjogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLl93aWR0aCA9IHRoaXMuJGVsZW1lbnQud2lkdGgoKTtcblx0XHR9XG5cdH0sIHtcblx0XHRmaWx0ZXI6IFsgJ3dpZHRoJywgJ2l0ZW1zJywgJ3NldHRpbmdzJyBdLFxuXHRcdHJ1bjogZnVuY3Rpb24oY2FjaGUpIHtcblx0XHRcdGNhY2hlLmN1cnJlbnQgPSB0aGlzLl9pdGVtcyAmJiB0aGlzLl9pdGVtc1t0aGlzLnJlbGF0aXZlKHRoaXMuX2N1cnJlbnQpXTtcblx0XHR9XG5cdH0sIHtcblx0XHRmaWx0ZXI6IFsgJ2l0ZW1zJywgJ3NldHRpbmdzJyBdLFxuXHRcdHJ1bjogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLiRzdGFnZS5jaGlsZHJlbignLmNsb25lZCcpLnJlbW92ZSgpO1xuXHRcdH1cblx0fSwge1xuXHRcdGZpbHRlcjogWyAnd2lkdGgnLCAnaXRlbXMnLCAnc2V0dGluZ3MnIF0sXG5cdFx0cnVuOiBmdW5jdGlvbihjYWNoZSkge1xuXHRcdFx0dmFyIG1hcmdpbiA9IHRoaXMuc2V0dGluZ3MubWFyZ2luIHx8ICcnLFxuXHRcdFx0XHRncmlkID0gIXRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoLFxuXHRcdFx0XHRydGwgPSB0aGlzLnNldHRpbmdzLnJ0bCxcblx0XHRcdFx0Y3NzID0ge1xuXHRcdFx0XHRcdCd3aWR0aCc6ICdhdXRvJyxcblx0XHRcdFx0XHQnbWFyZ2luLWxlZnQnOiBydGwgPyBtYXJnaW4gOiAnJyxcblx0XHRcdFx0XHQnbWFyZ2luLXJpZ2h0JzogcnRsID8gJycgOiBtYXJnaW5cblx0XHRcdFx0fTtcblxuXHRcdFx0IWdyaWQgJiYgdGhpcy4kc3RhZ2UuY2hpbGRyZW4oKS5jc3MoY3NzKTtcblxuXHRcdFx0Y2FjaGUuY3NzID0gY3NzO1xuXHRcdH1cblx0fSwge1xuXHRcdGZpbHRlcjogWyAnd2lkdGgnLCAnaXRlbXMnLCAnc2V0dGluZ3MnIF0sXG5cdFx0cnVuOiBmdW5jdGlvbihjYWNoZSkge1xuXHRcdFx0dmFyIHdpZHRoID0gKHRoaXMud2lkdGgoKSAvIHRoaXMuc2V0dGluZ3MuaXRlbXMpLnRvRml4ZWQoMykgLSB0aGlzLnNldHRpbmdzLm1hcmdpbixcblx0XHRcdFx0bWVyZ2UgPSBudWxsLFxuXHRcdFx0XHRpdGVyYXRvciA9IHRoaXMuX2l0ZW1zLmxlbmd0aCxcblx0XHRcdFx0Z3JpZCA9ICF0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCxcblx0XHRcdFx0d2lkdGhzID0gW107XG5cblx0XHRcdGNhY2hlLml0ZW1zID0ge1xuXHRcdFx0XHRtZXJnZTogZmFsc2UsXG5cdFx0XHRcdHdpZHRoOiB3aWR0aFxuXHRcdFx0fTtcblxuXHRcdFx0d2hpbGUgKGl0ZXJhdG9yLS0pIHtcblx0XHRcdFx0bWVyZ2UgPSB0aGlzLl9tZXJnZXJzW2l0ZXJhdG9yXTtcblx0XHRcdFx0bWVyZ2UgPSB0aGlzLnNldHRpbmdzLm1lcmdlRml0ICYmIE1hdGgubWluKG1lcmdlLCB0aGlzLnNldHRpbmdzLml0ZW1zKSB8fCBtZXJnZTtcblxuXHRcdFx0XHRjYWNoZS5pdGVtcy5tZXJnZSA9IG1lcmdlID4gMSB8fCBjYWNoZS5pdGVtcy5tZXJnZTtcblxuXHRcdFx0XHR3aWR0aHNbaXRlcmF0b3JdID0gIWdyaWQgPyB0aGlzLl9pdGVtc1tpdGVyYXRvcl0ud2lkdGgoKSA6IHdpZHRoICogbWVyZ2U7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3dpZHRocyA9IHdpZHRocztcblx0XHR9XG5cdH0sIHtcblx0XHRmaWx0ZXI6IFsgJ2l0ZW1zJywgJ3NldHRpbmdzJyBdLFxuXHRcdHJ1bjogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY2xvbmVzID0gW10sXG5cdFx0XHRcdGl0ZW1zID0gdGhpcy5faXRlbXMsXG5cdFx0XHRcdHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncyxcblx0XHRcdFx0dmlldyA9IE1hdGgubWF4KHNldHRpbmdzLml0ZW1zICogMiwgNCksXG5cdFx0XHRcdHNpemUgPSBNYXRoLmNlaWwoaXRlbXMubGVuZ3RoIC8gMikgKiAyLFxuXHRcdFx0XHRyZXBlYXQgPSBzZXR0aW5ncy5sb29wICYmIGl0ZW1zLmxlbmd0aCA/IHNldHRpbmdzLnJld2luZCA/IHZpZXcgOiBNYXRoLm1heCh2aWV3LCBzaXplKSA6IDAsXG5cdFx0XHRcdGFwcGVuZCA9ICcnLFxuXHRcdFx0XHRwcmVwZW5kID0gJyc7XG5cblx0XHRcdHJlcGVhdCAvPSAyO1xuXG5cdFx0XHR3aGlsZSAocmVwZWF0LS0pIHtcblx0XHRcdFx0Y2xvbmVzLnB1c2godGhpcy5ub3JtYWxpemUoY2xvbmVzLmxlbmd0aCAvIDIsIHRydWUpKTtcblx0XHRcdFx0YXBwZW5kID0gYXBwZW5kICsgaXRlbXNbY2xvbmVzW2Nsb25lcy5sZW5ndGggLSAxXV1bMF0ub3V0ZXJIVE1MO1xuXHRcdFx0XHRjbG9uZXMucHVzaCh0aGlzLm5vcm1hbGl6ZShpdGVtcy5sZW5ndGggLSAxIC0gKGNsb25lcy5sZW5ndGggLSAxKSAvIDIsIHRydWUpKTtcblx0XHRcdFx0cHJlcGVuZCA9IGl0ZW1zW2Nsb25lc1tjbG9uZXMubGVuZ3RoIC0gMV1dWzBdLm91dGVySFRNTCArIHByZXBlbmQ7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2Nsb25lcyA9IGNsb25lcztcblxuXHRcdFx0JChhcHBlbmQpLmFkZENsYXNzKCdjbG9uZWQnKS5hcHBlbmRUbyh0aGlzLiRzdGFnZSk7XG5cdFx0XHQkKHByZXBlbmQpLmFkZENsYXNzKCdjbG9uZWQnKS5wcmVwZW5kVG8odGhpcy4kc3RhZ2UpO1xuXHRcdH1cblx0fSwge1xuXHRcdGZpbHRlcjogWyAnd2lkdGgnLCAnaXRlbXMnLCAnc2V0dGluZ3MnIF0sXG5cdFx0cnVuOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBydGwgPSB0aGlzLnNldHRpbmdzLnJ0bCA/IDEgOiAtMSxcblx0XHRcdFx0c2l6ZSA9IHRoaXMuX2Nsb25lcy5sZW5ndGggKyB0aGlzLl9pdGVtcy5sZW5ndGgsXG5cdFx0XHRcdGl0ZXJhdG9yID0gLTEsXG5cdFx0XHRcdHByZXZpb3VzID0gMCxcblx0XHRcdFx0Y3VycmVudCA9IDAsXG5cdFx0XHRcdGNvb3JkaW5hdGVzID0gW107XG5cblx0XHRcdHdoaWxlICgrK2l0ZXJhdG9yIDwgc2l6ZSkge1xuXHRcdFx0XHRwcmV2aW91cyA9IGNvb3JkaW5hdGVzW2l0ZXJhdG9yIC0gMV0gfHwgMDtcblx0XHRcdFx0Y3VycmVudCA9IHRoaXMuX3dpZHRoc1t0aGlzLnJlbGF0aXZlKGl0ZXJhdG9yKV0gKyB0aGlzLnNldHRpbmdzLm1hcmdpbjtcblx0XHRcdFx0Y29vcmRpbmF0ZXMucHVzaChwcmV2aW91cyArIGN1cnJlbnQgKiBydGwpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuXHRcdH1cblx0fSwge1xuXHRcdGZpbHRlcjogWyAnd2lkdGgnLCAnaXRlbXMnLCAnc2V0dGluZ3MnIF0sXG5cdFx0cnVuOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBwYWRkaW5nID0gdGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmcsXG5cdFx0XHRcdGNvb3JkaW5hdGVzID0gdGhpcy5fY29vcmRpbmF0ZXMsXG5cdFx0XHRcdGNzcyA9IHtcblx0XHRcdFx0XHQnd2lkdGgnOiBNYXRoLmNlaWwoTWF0aC5hYnMoY29vcmRpbmF0ZXNbY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV0pKSArIHBhZGRpbmcgKiAyLFxuXHRcdFx0XHRcdCdwYWRkaW5nLWxlZnQnOiBwYWRkaW5nIHx8ICcnLFxuXHRcdFx0XHRcdCdwYWRkaW5nLXJpZ2h0JzogcGFkZGluZyB8fCAnJ1xuXHRcdFx0XHR9O1xuXG5cdFx0XHR0aGlzLiRzdGFnZS5jc3MoY3NzKTtcblx0XHR9XG5cdH0sIHtcblx0XHRmaWx0ZXI6IFsgJ3dpZHRoJywgJ2l0ZW1zJywgJ3NldHRpbmdzJyBdLFxuXHRcdHJ1bjogZnVuY3Rpb24oY2FjaGUpIHtcblx0XHRcdHZhciBpdGVyYXRvciA9IHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aCxcblx0XHRcdFx0Z3JpZCA9ICF0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCxcblx0XHRcdFx0aXRlbXMgPSB0aGlzLiRzdGFnZS5jaGlsZHJlbigpO1xuXG5cdFx0XHRpZiAoZ3JpZCAmJiBjYWNoZS5pdGVtcy5tZXJnZSkge1xuXHRcdFx0XHR3aGlsZSAoaXRlcmF0b3ItLSkge1xuXHRcdFx0XHRcdGNhY2hlLmNzcy53aWR0aCA9IHRoaXMuX3dpZHRoc1t0aGlzLnJlbGF0aXZlKGl0ZXJhdG9yKV07XG5cdFx0XHRcdFx0aXRlbXMuZXEoaXRlcmF0b3IpLmNzcyhjYWNoZS5jc3MpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGdyaWQpIHtcblx0XHRcdFx0Y2FjaGUuY3NzLndpZHRoID0gY2FjaGUuaXRlbXMud2lkdGg7XG5cdFx0XHRcdGl0ZW1zLmNzcyhjYWNoZS5jc3MpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSwge1xuXHRcdGZpbHRlcjogWyAnaXRlbXMnIF0sXG5cdFx0cnVuOiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aCA8IDEgJiYgdGhpcy4kc3RhZ2UucmVtb3ZlQXR0cignc3R5bGUnKTtcblx0XHR9XG5cdH0sIHtcblx0XHRmaWx0ZXI6IFsgJ3dpZHRoJywgJ2l0ZW1zJywgJ3NldHRpbmdzJyBdLFxuXHRcdHJ1bjogZnVuY3Rpb24oY2FjaGUpIHtcblx0XHRcdGNhY2hlLmN1cnJlbnQgPSBjYWNoZS5jdXJyZW50ID8gdGhpcy4kc3RhZ2UuY2hpbGRyZW4oKS5pbmRleChjYWNoZS5jdXJyZW50KSA6IDA7XG5cdFx0XHRjYWNoZS5jdXJyZW50ID0gTWF0aC5tYXgodGhpcy5taW5pbXVtKCksIE1hdGgubWluKHRoaXMubWF4aW11bSgpLCBjYWNoZS5jdXJyZW50KSk7XG5cdFx0XHR0aGlzLnJlc2V0KGNhY2hlLmN1cnJlbnQpO1xuXHRcdH1cblx0fSwge1xuXHRcdGZpbHRlcjogWyAncG9zaXRpb24nIF0sXG5cdFx0cnVuOiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuYW5pbWF0ZSh0aGlzLmNvb3JkaW5hdGVzKHRoaXMuX2N1cnJlbnQpKTtcblx0XHR9XG5cdH0sIHtcblx0XHRmaWx0ZXI6IFsgJ3dpZHRoJywgJ3Bvc2l0aW9uJywgJ2l0ZW1zJywgJ3NldHRpbmdzJyBdLFxuXHRcdHJ1bjogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgcnRsID0gdGhpcy5zZXR0aW5ncy5ydGwgPyAxIDogLTEsXG5cdFx0XHRcdHBhZGRpbmcgPSB0aGlzLnNldHRpbmdzLnN0YWdlUGFkZGluZyAqIDIsXG5cdFx0XHRcdGJlZ2luID0gdGhpcy5jb29yZGluYXRlcyh0aGlzLmN1cnJlbnQoKSkgKyBwYWRkaW5nLFxuXHRcdFx0XHRlbmQgPSBiZWdpbiArIHRoaXMud2lkdGgoKSAqIHJ0bCxcblx0XHRcdFx0aW5uZXIsIG91dGVyLCBtYXRjaGVzID0gW10sIGksIG47XG5cblx0XHRcdGZvciAoaSA9IDAsIG4gPSB0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdFx0aW5uZXIgPSB0aGlzLl9jb29yZGluYXRlc1tpIC0gMV0gfHwgMDtcblx0XHRcdFx0b3V0ZXIgPSBNYXRoLmFicyh0aGlzLl9jb29yZGluYXRlc1tpXSkgKyBwYWRkaW5nICogcnRsO1xuXG5cdFx0XHRcdGlmICgodGhpcy5vcChpbm5lciwgJzw9JywgYmVnaW4pICYmICh0aGlzLm9wKGlubmVyLCAnPicsIGVuZCkpKVxuXHRcdFx0XHRcdHx8ICh0aGlzLm9wKG91dGVyLCAnPCcsIGJlZ2luKSAmJiB0aGlzLm9wKG91dGVyLCAnPicsIGVuZCkpKSB7XG5cdFx0XHRcdFx0bWF0Y2hlcy5wdXNoKGkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuJHN0YWdlLmNoaWxkcmVuKCcuYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuXHRcdFx0dGhpcy4kc3RhZ2UuY2hpbGRyZW4oJzplcSgnICsgbWF0Y2hlcy5qb2luKCcpLCA6ZXEoJykgKyAnKScpLmFkZENsYXNzKCdhY3RpdmUnKTtcblxuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuY2VudGVyKSB7XG5cdFx0XHRcdHRoaXMuJHN0YWdlLmNoaWxkcmVuKCcuY2VudGVyJykucmVtb3ZlQ2xhc3MoJ2NlbnRlcicpO1xuXHRcdFx0XHR0aGlzLiRzdGFnZS5jaGlsZHJlbigpLmVxKHRoaXMuY3VycmVudCgpKS5hZGRDbGFzcygnY2VudGVyJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IF07XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIHRoZSBjYXJvdXNlbC5cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5lbnRlcignaW5pdGlhbGl6aW5nJyk7XG5cdFx0dGhpcy50cmlnZ2VyKCdpbml0aWFsaXplJyk7XG5cblx0XHR0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKHRoaXMuc2V0dGluZ3MucnRsQ2xhc3MsIHRoaXMuc2V0dGluZ3MucnRsKTtcblxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCAmJiAhdGhpcy5pcygncHJlLWxvYWRpbmcnKSkge1xuXHRcdFx0dmFyIGltZ3MsIG5lc3RlZFNlbGVjdG9yLCB3aWR0aDtcblx0XHRcdGltZ3MgPSB0aGlzLiRlbGVtZW50LmZpbmQoJ2ltZycpO1xuXHRcdFx0bmVzdGVkU2VsZWN0b3IgPSB0aGlzLnNldHRpbmdzLm5lc3RlZEl0ZW1TZWxlY3RvciA/ICcuJyArIHRoaXMuc2V0dGluZ3MubmVzdGVkSXRlbVNlbGVjdG9yIDogdW5kZWZpbmVkO1xuXHRcdFx0d2lkdGggPSB0aGlzLiRlbGVtZW50LmNoaWxkcmVuKG5lc3RlZFNlbGVjdG9yKS53aWR0aCgpO1xuXG5cdFx0XHRpZiAoaW1ncy5sZW5ndGggJiYgd2lkdGggPD0gMCkge1xuXHRcdFx0XHR0aGlzLnByZWxvYWRBdXRvV2lkdGhJbWFnZXMoaW1ncyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy4kZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMubG9hZGluZ0NsYXNzKTtcblxuXHRcdC8vIGNyZWF0ZSBzdGFnZVxuXHRcdHRoaXMuJHN0YWdlID0gJCgnPCcgKyB0aGlzLnNldHRpbmdzLnN0YWdlRWxlbWVudCArICcgY2xhc3M9XCInICsgdGhpcy5zZXR0aW5ncy5zdGFnZUNsYXNzICsgJ1wiLz4nKVxuXHRcdFx0LndyYXAoJzxkaXYgY2xhc3M9XCInICsgdGhpcy5zZXR0aW5ncy5zdGFnZU91dGVyQ2xhc3MgKyAnXCIvPicpO1xuXG5cdFx0Ly8gYXBwZW5kIHN0YWdlXG5cdFx0dGhpcy4kZWxlbWVudC5hcHBlbmQodGhpcy4kc3RhZ2UucGFyZW50KCkpO1xuXG5cdFx0Ly8gYXBwZW5kIGNvbnRlbnRcblx0XHR0aGlzLnJlcGxhY2UodGhpcy4kZWxlbWVudC5jaGlsZHJlbigpLm5vdCh0aGlzLiRzdGFnZS5wYXJlbnQoKSkpO1xuXG5cdFx0Ly8gY2hlY2sgdmlzaWJpbGl0eVxuXHRcdGlmICh0aGlzLiRlbGVtZW50LmlzKCc6dmlzaWJsZScpKSB7XG5cdFx0XHQvLyB1cGRhdGUgdmlld1xuXHRcdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGludmFsaWRhdGUgd2lkdGhcblx0XHRcdHRoaXMuaW52YWxpZGF0ZSgnd2lkdGgnKTtcblx0XHR9XG5cblx0XHR0aGlzLiRlbGVtZW50XG5cdFx0XHQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmxvYWRpbmdDbGFzcylcblx0XHRcdC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMubG9hZGVkQ2xhc3MpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnNcblx0XHR0aGlzLnJlZ2lzdGVyRXZlbnRIYW5kbGVycygpO1xuXG5cdFx0dGhpcy5sZWF2ZSgnaW5pdGlhbGl6aW5nJyk7XG5cdFx0dGhpcy50cmlnZ2VyKCdpbml0aWFsaXplZCcpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTZXR1cHMgdGhlIGN1cnJlbnQgc2V0dGluZ3MuXG5cdCAqIEB0b2RvIFJlbW92ZSByZXNwb25zaXZlIGNsYXNzZXMuIFdoeSBzaG91bGQgYWRhcHRpdmUgZGVzaWducyBiZSBicm91Z2h0IGludG8gSUU4P1xuXHQgKiBAdG9kbyBTdXBwb3J0IGZvciBtZWRpYSBxdWVyaWVzIGJ5IHVzaW5nIGBtYXRjaE1lZGlhYCB3b3VsZCBiZSBuaWNlLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydCgpLFxuXHRcdFx0b3ZlcndyaXRlcyA9IHRoaXMub3B0aW9ucy5yZXNwb25zaXZlLFxuXHRcdFx0bWF0Y2ggPSAtMSxcblx0XHRcdHNldHRpbmdzID0gbnVsbDtcblxuXHRcdGlmICghb3ZlcndyaXRlcykge1xuXHRcdFx0c2V0dGluZ3MgPSAkLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JC5lYWNoKG92ZXJ3cml0ZXMsIGZ1bmN0aW9uKGJyZWFrcG9pbnQpIHtcblx0XHRcdFx0aWYgKGJyZWFrcG9pbnQgPD0gdmlld3BvcnQgJiYgYnJlYWtwb2ludCA+IG1hdGNoKSB7XG5cdFx0XHRcdFx0bWF0Y2ggPSBOdW1iZXIoYnJlYWtwb2ludCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRzZXR0aW5ncyA9ICQuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMsIG92ZXJ3cml0ZXNbbWF0Y2hdKTtcblx0XHRcdGRlbGV0ZSBzZXR0aW5ncy5yZXNwb25zaXZlO1xuXG5cdFx0XHQvLyByZXNwb25zaXZlIGNsYXNzXG5cdFx0XHRpZiAoc2V0dGluZ3MucmVzcG9uc2l2ZUNsYXNzKSB7XG5cdFx0XHRcdHRoaXMuJGVsZW1lbnQuYXR0cignY2xhc3MnLFxuXHRcdFx0XHRcdHRoaXMuJGVsZW1lbnQuYXR0cignY2xhc3MnKS5yZXBsYWNlKG5ldyBSZWdFeHAoJygnICsgdGhpcy5vcHRpb25zLnJlc3BvbnNpdmVDbGFzcyArICctKVxcXFxTK1xcXFxzJywgJ2cnKSwgJyQxJyArIG1hdGNoKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNldHRpbmdzID09PSBudWxsIHx8IHRoaXMuX2JyZWFrcG9pbnQgIT09IG1hdGNoKSB7XG5cdFx0XHR0aGlzLnRyaWdnZXIoJ2NoYW5nZScsIHsgcHJvcGVydHk6IHsgbmFtZTogJ3NldHRpbmdzJywgdmFsdWU6IHNldHRpbmdzIH0gfSk7XG5cdFx0XHR0aGlzLl9icmVha3BvaW50ID0gbWF0Y2g7XG5cdFx0XHR0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG5cdFx0XHR0aGlzLmludmFsaWRhdGUoJ3NldHRpbmdzJyk7XG5cdFx0XHR0aGlzLnRyaWdnZXIoJ2NoYW5nZWQnLCB7IHByb3BlcnR5OiB7IG5hbWU6ICdzZXR0aW5ncycsIHZhbHVlOiB0aGlzLnNldHRpbmdzIH0gfSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIG9wdGlvbiBsb2dpYyBpZiBuZWNlc3NlcnkuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdE93bC5wcm90b3R5cGUub3B0aW9uc0xvZ2ljID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoKSB7XG5cdFx0XHR0aGlzLnNldHRpbmdzLnN0YWdlUGFkZGluZyA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zZXR0aW5ncy5tZXJnZSA9IGZhbHNlO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogUHJlcGFyZXMgYW4gaXRlbSBiZWZvcmUgYWRkLlxuXHQgKiBAdG9kbyBSZW5hbWUgZXZlbnQgcGFyYW1ldGVyIGBjb250ZW50YCB0byBgaXRlbWAuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHJldHVybnMge2pRdWVyeXxIVE1MRWxlbWVudH0gLSBUaGUgaXRlbSBjb250YWluZXIuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnByZXBhcmUgPSBmdW5jdGlvbihpdGVtKSB7XG5cdFx0dmFyIGV2ZW50ID0gdGhpcy50cmlnZ2VyKCdwcmVwYXJlJywgeyBjb250ZW50OiBpdGVtIH0pO1xuXG5cdFx0aWYgKCFldmVudC5kYXRhKSB7XG5cdFx0XHRldmVudC5kYXRhID0gJCgnPCcgKyB0aGlzLnNldHRpbmdzLml0ZW1FbGVtZW50ICsgJy8+Jylcblx0XHRcdFx0LmFkZENsYXNzKHRoaXMub3B0aW9ucy5pdGVtQ2xhc3MpLmFwcGVuZChpdGVtKVxuXHRcdH1cblxuXHRcdHRoaXMudHJpZ2dlcigncHJlcGFyZWQnLCB7IGNvbnRlbnQ6IGV2ZW50LmRhdGEgfSk7XG5cblx0XHRyZXR1cm4gZXZlbnQuZGF0YTtcblx0fTtcblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgdmlldy5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0T3dsLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRuID0gdGhpcy5fcGlwZS5sZW5ndGgsXG5cdFx0XHRmaWx0ZXIgPSAkLnByb3h5KGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXNbcF0gfSwgdGhpcy5faW52YWxpZGF0ZWQpLFxuXHRcdFx0Y2FjaGUgPSB7fTtcblxuXHRcdHdoaWxlIChpIDwgbikge1xuXHRcdFx0aWYgKHRoaXMuX2ludmFsaWRhdGVkLmFsbCB8fCAkLmdyZXAodGhpcy5fcGlwZVtpXS5maWx0ZXIsIGZpbHRlcikubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR0aGlzLl9waXBlW2ldLnJ1bihjYWNoZSk7XG5cdFx0XHR9XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0dGhpcy5faW52YWxpZGF0ZWQgPSB7fTtcblxuXHRcdCF0aGlzLmlzKCd2YWxpZCcpICYmIHRoaXMuZW50ZXIoJ3ZhbGlkJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSB2aWV3LlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7T3dsLldpZHRofSBbZGltZW5zaW9uPU93bC5XaWR0aC5EZWZhdWx0XSAtIFRoZSBkaW1lbnNpb24gdG8gcmV0dXJuLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSAtIFRoZSB3aWR0aCBvZiB0aGUgdmlldyBpbiBwaXhlbC5cblx0ICovXG5cdE93bC5wcm90b3R5cGUud2lkdGggPSBmdW5jdGlvbihkaW1lbnNpb24pIHtcblx0XHRkaW1lbnNpb24gPSBkaW1lbnNpb24gfHwgT3dsLldpZHRoLkRlZmF1bHQ7XG5cdFx0c3dpdGNoIChkaW1lbnNpb24pIHtcblx0XHRcdGNhc2UgT3dsLldpZHRoLklubmVyOlxuXHRcdFx0Y2FzZSBPd2wuV2lkdGguT3V0ZXI6XG5cdFx0XHRcdHJldHVybiB0aGlzLl93aWR0aDtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB0aGlzLl93aWR0aCAtIHRoaXMuc2V0dGluZ3Muc3RhZ2VQYWRkaW5nICogMiArIHRoaXMuc2V0dGluZ3MubWFyZ2luO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogUmVmcmVzaGVzIHRoZSBjYXJvdXNlbCBwcmltYXJpbHkgZm9yIGFkYXB0aXZlIHB1cnBvc2VzLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnJlZnJlc2ggPSBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmVudGVyKCdyZWZyZXNoaW5nJyk7XG5cdFx0dGhpcy50cmlnZ2VyKCdyZWZyZXNoJyk7XG5cblx0XHR0aGlzLnNldHVwKCk7XG5cblx0XHR0aGlzLm9wdGlvbnNMb2dpYygpO1xuXG5cdFx0dGhpcy4kZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMucmVmcmVzaENsYXNzKTtcblxuXHRcdHRoaXMudXBkYXRlKCk7XG5cblx0XHR0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5yZWZyZXNoQ2xhc3MpO1xuXG5cdFx0dGhpcy5sZWF2ZSgncmVmcmVzaGluZycpO1xuXHRcdHRoaXMudHJpZ2dlcigncmVmcmVzaGVkJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIENoZWNrcyB3aW5kb3cgYHJlc2l6ZWAgZXZlbnQuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdE93bC5wcm90b3R5cGUub25UaHJvdHRsZWRSZXNpemUgPSBmdW5jdGlvbigpIHtcblx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZXIpO1xuXHRcdHRoaXMucmVzaXplVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLl9oYW5kbGVycy5vblJlc2l6ZSwgdGhpcy5zZXR0aW5ncy5yZXNwb25zaXZlUmVmcmVzaFJhdGUpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2luZG93IGByZXNpemVgIGV2ZW50LlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm9uUmVzaXplID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLl9pdGVtcy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fd2lkdGggPT09IHRoaXMuJGVsZW1lbnQud2lkdGgoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy4kZWxlbWVudC5pcygnOnZpc2libGUnKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuZW50ZXIoJ3Jlc2l6aW5nJyk7XG5cblx0XHRpZiAodGhpcy50cmlnZ2VyKCdyZXNpemUnKS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuXHRcdFx0dGhpcy5sZWF2ZSgncmVzaXppbmcnKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmludmFsaWRhdGUoJ3dpZHRoJyk7XG5cblx0XHR0aGlzLnJlZnJlc2goKTtcblxuXHRcdHRoaXMubGVhdmUoJ3Jlc2l6aW5nJyk7XG5cdFx0dGhpcy50cmlnZ2VyKCdyZXNpemVkJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVycyBldmVudCBoYW5kbGVycy5cblx0ICogQHRvZG8gQ2hlY2sgYG1zUG9pbnRlckVuYWJsZWRgXG5cdCAqIEB0b2RvICMyNjFcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5yZWdpc3RlckV2ZW50SGFuZGxlcnMgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoJC5zdXBwb3J0LnRyYW5zaXRpb24pIHtcblx0XHRcdHRoaXMuJHN0YWdlLm9uKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCArICcub3dsLmNvcmUnLCAkLnByb3h5KHRoaXMub25UcmFuc2l0aW9uRW5kLCB0aGlzKSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MucmVzcG9uc2l2ZSAhPT0gZmFsc2UpIHtcblx0XHRcdHRoaXMub24od2luZG93LCAncmVzaXplJywgdGhpcy5faGFuZGxlcnMub25UaHJvdHRsZWRSZXNpemUpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNldHRpbmdzLm1vdXNlRHJhZykge1xuXHRcdFx0dGhpcy4kZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuZHJhZ0NsYXNzKTtcblx0XHRcdHRoaXMuJHN0YWdlLm9uKCdtb3VzZWRvd24ub3dsLmNvcmUnLCAkLnByb3h5KHRoaXMub25EcmFnU3RhcnQsIHRoaXMpKTtcblx0XHRcdHRoaXMuJHN0YWdlLm9uKCdkcmFnc3RhcnQub3dsLmNvcmUgc2VsZWN0c3RhcnQub3dsLmNvcmUnLCBmdW5jdGlvbigpIHsgcmV0dXJuIGZhbHNlIH0pO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNldHRpbmdzLnRvdWNoRHJhZyl7XG5cdFx0XHR0aGlzLiRzdGFnZS5vbigndG91Y2hzdGFydC5vd2wuY29yZScsICQucHJveHkodGhpcy5vbkRyYWdTdGFydCwgdGhpcykpO1xuXHRcdFx0dGhpcy4kc3RhZ2Uub24oJ3RvdWNoY2FuY2VsLm93bC5jb3JlJywgJC5wcm94eSh0aGlzLm9uRHJhZ0VuZCwgdGhpcykpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogSGFuZGxlcyBgdG91Y2hzdGFydGAgYW5kIGBtb3VzZWRvd25gIGV2ZW50cy5cblx0ICogQHRvZG8gSG9yaXpvbnRhbCBzd2lwZSB0aHJlc2hvbGQgYXMgb3B0aW9uXG5cdCAqIEB0b2RvICMyNjFcblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIFRoZSBldmVudCBhcmd1bWVudHMuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm9uRHJhZ1N0YXJ0ID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHR2YXIgc3RhZ2UgPSBudWxsO1xuXG5cdFx0aWYgKGV2ZW50LndoaWNoID09PSAzKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCQuc3VwcG9ydC50cmFuc2Zvcm0pIHtcblx0XHRcdHN0YWdlID0gdGhpcy4kc3RhZ2UuY3NzKCd0cmFuc2Zvcm0nKS5yZXBsYWNlKC8uKlxcKHxcXCl8IC9nLCAnJykuc3BsaXQoJywnKTtcblx0XHRcdHN0YWdlID0ge1xuXHRcdFx0XHR4OiBzdGFnZVtzdGFnZS5sZW5ndGggPT09IDE2ID8gMTIgOiA0XSxcblx0XHRcdFx0eTogc3RhZ2Vbc3RhZ2UubGVuZ3RoID09PSAxNiA/IDEzIDogNV1cblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN0YWdlID0gdGhpcy4kc3RhZ2UucG9zaXRpb24oKTtcblx0XHRcdHN0YWdlID0ge1xuXHRcdFx0XHR4OiB0aGlzLnNldHRpbmdzLnJ0bCA/XG5cdFx0XHRcdFx0c3RhZ2UubGVmdCArIHRoaXMuJHN0YWdlLndpZHRoKCkgLSB0aGlzLndpZHRoKCkgKyB0aGlzLnNldHRpbmdzLm1hcmdpbiA6XG5cdFx0XHRcdFx0c3RhZ2UubGVmdCxcblx0XHRcdFx0eTogc3RhZ2UudG9wXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmlzKCdhbmltYXRpbmcnKSkge1xuXHRcdFx0JC5zdXBwb3J0LnRyYW5zZm9ybSA/IHRoaXMuYW5pbWF0ZShzdGFnZS54KSA6IHRoaXMuJHN0YWdlLnN0b3AoKVxuXHRcdFx0dGhpcy5pbnZhbGlkYXRlKCdwb3NpdGlvbicpO1xuXHRcdH1cblxuXHRcdHRoaXMuJGVsZW1lbnQudG9nZ2xlQ2xhc3ModGhpcy5vcHRpb25zLmdyYWJDbGFzcywgZXZlbnQudHlwZSA9PT0gJ21vdXNlZG93bicpO1xuXG5cdFx0dGhpcy5zcGVlZCgwKTtcblxuXHRcdHRoaXMuX2RyYWcudGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXHRcdHRoaXMuX2RyYWcudGFyZ2V0ID0gJChldmVudC50YXJnZXQpO1xuXHRcdHRoaXMuX2RyYWcuc3RhZ2Uuc3RhcnQgPSBzdGFnZTtcblx0XHR0aGlzLl9kcmFnLnN0YWdlLmN1cnJlbnQgPSBzdGFnZTtcblx0XHR0aGlzLl9kcmFnLnBvaW50ZXIgPSB0aGlzLnBvaW50ZXIoZXZlbnQpO1xuXG5cdFx0JChkb2N1bWVudCkub24oJ21vdXNldXAub3dsLmNvcmUgdG91Y2hlbmQub3dsLmNvcmUnLCAkLnByb3h5KHRoaXMub25EcmFnRW5kLCB0aGlzKSk7XG5cblx0XHQkKGRvY3VtZW50KS5vbmUoJ21vdXNlbW92ZS5vd2wuY29yZSB0b3VjaG1vdmUub3dsLmNvcmUnLCAkLnByb3h5KGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0XHR2YXIgZGVsdGEgPSB0aGlzLmRpZmZlcmVuY2UodGhpcy5fZHJhZy5wb2ludGVyLCB0aGlzLnBvaW50ZXIoZXZlbnQpKTtcblxuXHRcdFx0JChkb2N1bWVudCkub24oJ21vdXNlbW92ZS5vd2wuY29yZSB0b3VjaG1vdmUub3dsLmNvcmUnLCAkLnByb3h5KHRoaXMub25EcmFnTW92ZSwgdGhpcykpO1xuXG5cdFx0XHRpZiAoTWF0aC5hYnMoZGVsdGEueCkgPCBNYXRoLmFicyhkZWx0YS55KSAmJiB0aGlzLmlzKCd2YWxpZCcpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0dGhpcy5lbnRlcignZHJhZ2dpbmcnKTtcblx0XHRcdHRoaXMudHJpZ2dlcignZHJhZycpO1xuXHRcdH0sIHRoaXMpKTtcblx0fTtcblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgYHRvdWNobW92ZWAgYW5kIGBtb3VzZW1vdmVgIGV2ZW50cy5cblx0ICogQHRvZG8gIzI2MVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IGFyZ3VtZW50cy5cblx0ICovXG5cdE93bC5wcm90b3R5cGUub25EcmFnTW92ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0dmFyIG1pbmltdW0gPSBudWxsLFxuXHRcdFx0bWF4aW11bSA9IG51bGwsXG5cdFx0XHRwdWxsID0gbnVsbCxcblx0XHRcdGRlbHRhID0gdGhpcy5kaWZmZXJlbmNlKHRoaXMuX2RyYWcucG9pbnRlciwgdGhpcy5wb2ludGVyKGV2ZW50KSksXG5cdFx0XHRzdGFnZSA9IHRoaXMuZGlmZmVyZW5jZSh0aGlzLl9kcmFnLnN0YWdlLnN0YXJ0LCBkZWx0YSk7XG5cblx0XHRpZiAoIXRoaXMuaXMoJ2RyYWdnaW5nJykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MubG9vcCkge1xuXHRcdFx0bWluaW11bSA9IHRoaXMuY29vcmRpbmF0ZXModGhpcy5taW5pbXVtKCkpO1xuXHRcdFx0bWF4aW11bSA9IHRoaXMuY29vcmRpbmF0ZXModGhpcy5tYXhpbXVtKCkgKyAxKSAtIG1pbmltdW07XG5cdFx0XHRzdGFnZS54ID0gKCgoc3RhZ2UueCAtIG1pbmltdW0pICUgbWF4aW11bSArIG1heGltdW0pICUgbWF4aW11bSkgKyBtaW5pbXVtO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtaW5pbXVtID0gdGhpcy5zZXR0aW5ncy5ydGwgPyB0aGlzLmNvb3JkaW5hdGVzKHRoaXMubWF4aW11bSgpKSA6IHRoaXMuY29vcmRpbmF0ZXModGhpcy5taW5pbXVtKCkpO1xuXHRcdFx0bWF4aW11bSA9IHRoaXMuc2V0dGluZ3MucnRsID8gdGhpcy5jb29yZGluYXRlcyh0aGlzLm1pbmltdW0oKSkgOiB0aGlzLmNvb3JkaW5hdGVzKHRoaXMubWF4aW11bSgpKTtcblx0XHRcdHB1bGwgPSB0aGlzLnNldHRpbmdzLnB1bGxEcmFnID8gLTEgKiBkZWx0YS54IC8gNSA6IDA7XG5cdFx0XHRzdGFnZS54ID0gTWF0aC5tYXgoTWF0aC5taW4oc3RhZ2UueCwgbWluaW11bSArIHB1bGwpLCBtYXhpbXVtICsgcHVsbCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fZHJhZy5zdGFnZS5jdXJyZW50ID0gc3RhZ2U7XG5cblx0XHR0aGlzLmFuaW1hdGUoc3RhZ2UueCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGB0b3VjaGVuZGAgYW5kIGBtb3VzZXVwYCBldmVudHMuXG5cdCAqIEB0b2RvICMyNjFcblx0ICogQHRvZG8gVGhyZXNob2xkIGZvciBjbGljayBldmVudFxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IGFyZ3VtZW50cy5cblx0ICovXG5cdE93bC5wcm90b3R5cGUub25EcmFnRW5kID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHR2YXIgZGVsdGEgPSB0aGlzLmRpZmZlcmVuY2UodGhpcy5fZHJhZy5wb2ludGVyLCB0aGlzLnBvaW50ZXIoZXZlbnQpKSxcblx0XHRcdHN0YWdlID0gdGhpcy5fZHJhZy5zdGFnZS5jdXJyZW50LFxuXHRcdFx0ZGlyZWN0aW9uID0gZGVsdGEueCA+IDAgXiB0aGlzLnNldHRpbmdzLnJ0bCA/ICdsZWZ0JyA6ICdyaWdodCc7XG5cblx0XHQkKGRvY3VtZW50KS5vZmYoJy5vd2wuY29yZScpO1xuXG5cdFx0dGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZ3JhYkNsYXNzKTtcblxuXHRcdGlmIChkZWx0YS54ICE9PSAwICYmIHRoaXMuaXMoJ2RyYWdnaW5nJykgfHwgIXRoaXMuaXMoJ3ZhbGlkJykpIHtcblx0XHRcdHRoaXMuc3BlZWQodGhpcy5zZXR0aW5ncy5kcmFnRW5kU3BlZWQgfHwgdGhpcy5zZXR0aW5ncy5zbWFydFNwZWVkKTtcblx0XHRcdHRoaXMuY3VycmVudCh0aGlzLmNsb3Nlc3Qoc3RhZ2UueCwgZGVsdGEueCAhPT0gMCA/IGRpcmVjdGlvbiA6IHRoaXMuX2RyYWcuZGlyZWN0aW9uKSk7XG5cdFx0XHR0aGlzLmludmFsaWRhdGUoJ3Bvc2l0aW9uJyk7XG5cdFx0XHR0aGlzLnVwZGF0ZSgpO1xuXG5cdFx0XHR0aGlzLl9kcmFnLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcblxuXHRcdFx0aWYgKE1hdGguYWJzKGRlbHRhLngpID4gMyB8fCBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHRoaXMuX2RyYWcudGltZSA+IDMwMCkge1xuXHRcdFx0XHR0aGlzLl9kcmFnLnRhcmdldC5vbmUoJ2NsaWNrLm93bC5jb3JlJywgZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmlzKCdkcmFnZ2luZycpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5sZWF2ZSgnZHJhZ2dpbmcnKTtcblx0XHR0aGlzLnRyaWdnZXIoJ2RyYWdnZWQnKTtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgY2xvc2VzdCBpdGVtIGZvciBhIGNvb3JkaW5hdGUuXG5cdCAqIEB0b2RvIFNldHRpbmcgYGZyZWVEcmFnYCBtYWtlcyBgY2xvc2VzdGAgbm90IHJldXNhYmxlLiBTZWUgIzE2NS5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge051bWJlcn0gY29vcmRpbmF0ZSAtIFRoZSBjb29yZGluYXRlIGluIHBpeGVsLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZGlyZWN0aW9uIC0gVGhlIGRpcmVjdGlvbiB0byBjaGVjayBmb3IgdGhlIGNsb3Nlc3QgaXRlbS4gRXRoZXIgYGxlZnRgIG9yIGByaWdodGAuXG5cdCAqIEByZXR1cm4ge051bWJlcn0gLSBUaGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGNsb3Nlc3QgaXRlbS5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuY2xvc2VzdCA9IGZ1bmN0aW9uKGNvb3JkaW5hdGUsIGRpcmVjdGlvbikge1xuXHRcdHZhciBwb3NpdGlvbiA9IC0xLFxuXHRcdFx0cHVsbCA9IDMwLFxuXHRcdFx0d2lkdGggPSB0aGlzLndpZHRoKCksXG5cdFx0XHRjb29yZGluYXRlcyA9IHRoaXMuY29vcmRpbmF0ZXMoKTtcblxuXHRcdGlmICghdGhpcy5zZXR0aW5ncy5mcmVlRHJhZykge1xuXHRcdFx0Ly8gY2hlY2sgY2xvc2VzdCBpdGVtXG5cdFx0XHQkLmVhY2goY29vcmRpbmF0ZXMsICQucHJveHkoZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7XG5cdFx0XHRcdC8vIG9uIGEgbGVmdCBwdWxsLCBjaGVjayBvbiBjdXJyZW50IGluZGV4XG5cdFx0XHRcdGlmIChkaXJlY3Rpb24gPT09ICdsZWZ0JyAmJiBjb29yZGluYXRlID4gdmFsdWUgLSBwdWxsICYmIGNvb3JkaW5hdGUgPCB2YWx1ZSArIHB1bGwpIHtcblx0XHRcdFx0XHRwb3NpdGlvbiA9IGluZGV4O1xuXHRcdFx0XHQvLyBvbiBhIHJpZ2h0IHB1bGwsIGNoZWNrIG9uIHByZXZpb3VzIGluZGV4XG5cdFx0XHRcdC8vIHRvIGRvIHNvLCBzdWJ0cmFjdCB3aWR0aCBmcm9tIHZhbHVlIGFuZCBzZXQgcG9zaXRpb24gPSBpbmRleCArIDFcblx0XHRcdFx0fSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdyaWdodCcgJiYgY29vcmRpbmF0ZSA+IHZhbHVlIC0gd2lkdGggLSBwdWxsICYmIGNvb3JkaW5hdGUgPCB2YWx1ZSAtIHdpZHRoICsgcHVsbCkge1xuXHRcdFx0XHRcdHBvc2l0aW9uID0gaW5kZXggKyAxO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMub3AoY29vcmRpbmF0ZSwgJzwnLCB2YWx1ZSlcblx0XHRcdFx0XHQmJiB0aGlzLm9wKGNvb3JkaW5hdGUsICc+JywgY29vcmRpbmF0ZXNbaW5kZXggKyAxXSB8fCB2YWx1ZSAtIHdpZHRoKSkge1xuXHRcdFx0XHRcdHBvc2l0aW9uID0gZGlyZWN0aW9uID09PSAnbGVmdCcgPyBpbmRleCArIDEgOiBpbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcG9zaXRpb24gPT09IC0xO1xuXHRcdFx0fSwgdGhpcykpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5zZXR0aW5ncy5sb29wKSB7XG5cdFx0XHQvLyBub24gbG9vcCBib3VuZHJpZXNcblx0XHRcdGlmICh0aGlzLm9wKGNvb3JkaW5hdGUsICc+JywgY29vcmRpbmF0ZXNbdGhpcy5taW5pbXVtKCldKSkge1xuXHRcdFx0XHRwb3NpdGlvbiA9IGNvb3JkaW5hdGUgPSB0aGlzLm1pbmltdW0oKTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5vcChjb29yZGluYXRlLCAnPCcsIGNvb3JkaW5hdGVzW3RoaXMubWF4aW11bSgpXSkpIHtcblx0XHRcdFx0cG9zaXRpb24gPSBjb29yZGluYXRlID0gdGhpcy5tYXhpbXVtKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvc2l0aW9uO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBBbmltYXRlcyB0aGUgc3RhZ2UuXG5cdCAqIEB0b2RvICMyNzBcblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gY29vcmRpbmF0ZSAtIFRoZSBjb29yZGluYXRlIGluIHBpeGVscy5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuYW5pbWF0ZSA9IGZ1bmN0aW9uKGNvb3JkaW5hdGUpIHtcblx0XHR2YXIgYW5pbWF0ZSA9IHRoaXMuc3BlZWQoKSA+IDA7XG5cblx0XHR0aGlzLmlzKCdhbmltYXRpbmcnKSAmJiB0aGlzLm9uVHJhbnNpdGlvbkVuZCgpO1xuXG5cdFx0aWYgKGFuaW1hdGUpIHtcblx0XHRcdHRoaXMuZW50ZXIoJ2FuaW1hdGluZycpO1xuXHRcdFx0dGhpcy50cmlnZ2VyKCd0cmFuc2xhdGUnKTtcblx0XHR9XG5cblx0XHRpZiAoJC5zdXBwb3J0LnRyYW5zZm9ybTNkICYmICQuc3VwcG9ydC50cmFuc2l0aW9uKSB7XG5cdFx0XHR0aGlzLiRzdGFnZS5jc3Moe1xuXHRcdFx0XHR0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgnICsgY29vcmRpbmF0ZSArICdweCwwcHgsMHB4KScsXG5cdFx0XHRcdHRyYW5zaXRpb246ICh0aGlzLnNwZWVkKCkgLyAxMDAwKSArICdzJ1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmIChhbmltYXRlKSB7XG5cdFx0XHR0aGlzLiRzdGFnZS5hbmltYXRlKHtcblx0XHRcdFx0bGVmdDogY29vcmRpbmF0ZSArICdweCdcblx0XHRcdH0sIHRoaXMuc3BlZWQoKSwgdGhpcy5zZXR0aW5ncy5mYWxsYmFja0Vhc2luZywgJC5wcm94eSh0aGlzLm9uVHJhbnNpdGlvbkVuZCwgdGhpcykpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLiRzdGFnZS5jc3Moe1xuXHRcdFx0XHRsZWZ0OiBjb29yZGluYXRlICsgJ3B4J1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hldGhlciB0aGUgY2Fyb3VzZWwgaXMgaW4gYSBzcGVjaWZpYyBzdGF0ZSBvciBub3QuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZSAtIFRoZSBzdGF0ZSB0byBjaGVjay5cblx0ICogQHJldHVybnMge0Jvb2xlYW59IC0gVGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIHRoZSBjYXJvdXNlbCBpcyBidXN5LlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5pcyA9IGZ1bmN0aW9uKHN0YXRlKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3N0YXRlcy5jdXJyZW50W3N0YXRlXSAmJiB0aGlzLl9zdGF0ZXMuY3VycmVudFtzdGF0ZV0gPiAwO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBpdGVtLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb25dIC0gVGhlIG5ldyBhYnNvbHV0ZSBwb3NpdGlvbiBvciBub3RoaW5nIHRvIGxlYXZlIGl0IHVuY2hhbmdlZC5cblx0ICogQHJldHVybnMge051bWJlcn0gLSBUaGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgaXRlbS5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuY3VycmVudCA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG5cdFx0aWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jdXJyZW50O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9pdGVtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0cG9zaXRpb24gPSB0aGlzLm5vcm1hbGl6ZShwb3NpdGlvbik7XG5cblx0XHRpZiAodGhpcy5fY3VycmVudCAhPT0gcG9zaXRpb24pIHtcblx0XHRcdHZhciBldmVudCA9IHRoaXMudHJpZ2dlcignY2hhbmdlJywgeyBwcm9wZXJ0eTogeyBuYW1lOiAncG9zaXRpb24nLCB2YWx1ZTogcG9zaXRpb24gfSB9KTtcblxuXHRcdFx0aWYgKGV2ZW50LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRwb3NpdGlvbiA9IHRoaXMubm9ybWFsaXplKGV2ZW50LmRhdGEpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9jdXJyZW50ID0gcG9zaXRpb247XG5cblx0XHRcdHRoaXMuaW52YWxpZGF0ZSgncG9zaXRpb24nKTtcblxuXHRcdFx0dGhpcy50cmlnZ2VyKCdjaGFuZ2VkJywgeyBwcm9wZXJ0eTogeyBuYW1lOiAncG9zaXRpb24nLCB2YWx1ZTogdGhpcy5fY3VycmVudCB9IH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9jdXJyZW50O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBJbnZhbGlkYXRlcyB0aGUgZ2l2ZW4gcGFydCBvZiB0aGUgdXBkYXRlIHJvdXRpbmUuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBbcGFydF0gLSBUaGUgcGFydCB0byBpbnZhbGlkYXRlLlxuXHQgKiBAcmV0dXJucyB7QXJyYXkuPFN0cmluZz59IC0gVGhlIGludmFsaWRhdGVkIHBhcnRzLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5pbnZhbGlkYXRlID0gZnVuY3Rpb24ocGFydCkge1xuXHRcdGlmICgkLnR5cGUocGFydCkgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHR0aGlzLl9pbnZhbGlkYXRlZFtwYXJ0XSA9IHRydWU7XG5cdFx0XHR0aGlzLmlzKCd2YWxpZCcpICYmIHRoaXMubGVhdmUoJ3ZhbGlkJyk7XG5cdFx0fVxuXHRcdHJldHVybiAkLm1hcCh0aGlzLl9pbnZhbGlkYXRlZCwgZnVuY3Rpb24odiwgaSkgeyByZXR1cm4gaSB9KTtcblx0fTtcblxuXHQvKipcblx0ICogUmVzZXRzIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBpdGVtLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvbiAtIFRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgbmV3IGl0ZW0uXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24ocG9zaXRpb24pIHtcblx0XHRwb3NpdGlvbiA9IHRoaXMubm9ybWFsaXplKHBvc2l0aW9uKTtcblxuXHRcdGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fc3BlZWQgPSAwO1xuXHRcdHRoaXMuX2N1cnJlbnQgPSBwb3NpdGlvbjtcblxuXHRcdHRoaXMuc3VwcHJlc3MoWyAndHJhbnNsYXRlJywgJ3RyYW5zbGF0ZWQnIF0pO1xuXG5cdFx0dGhpcy5hbmltYXRlKHRoaXMuY29vcmRpbmF0ZXMocG9zaXRpb24pKTtcblxuXHRcdHRoaXMucmVsZWFzZShbICd0cmFuc2xhdGUnLCAndHJhbnNsYXRlZCcgXSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIE5vcm1hbGl6ZXMgYW4gYWJzb2x1dGUgb3IgYSByZWxhdGl2ZSBwb3NpdGlvbiBvZiBhbiBpdGVtLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvbiAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwb3NpdGlvbiB0byBub3JtYWxpemUuXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3JlbGF0aXZlPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIHJlbGF0aXZlIG9yIG5vdC5cblx0ICogQHJldHVybnMge051bWJlcn0gLSBUaGUgbm9ybWFsaXplZCBwb3NpdGlvbi5cblx0ICovXG5cdE93bC5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24ocG9zaXRpb24sIHJlbGF0aXZlKSB7XG5cdFx0dmFyIG4gPSB0aGlzLl9pdGVtcy5sZW5ndGgsXG5cdFx0XHRtID0gcmVsYXRpdmUgPyAwIDogdGhpcy5fY2xvbmVzLmxlbmd0aDtcblxuXHRcdGlmICghdGhpcy5pc051bWVyaWMocG9zaXRpb24pIHx8IG4gPCAxKSB7XG5cdFx0XHRwb3NpdGlvbiA9IHVuZGVmaW5lZDtcblx0XHR9IGVsc2UgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBuICsgbSkge1xuXHRcdFx0cG9zaXRpb24gPSAoKHBvc2l0aW9uIC0gbSAvIDIpICUgbiArIG4pICUgbiArIG0gLyAyO1xuXHRcdH1cblxuXHRcdHJldHVybiBwb3NpdGlvbjtcblx0fTtcblxuXHQvKipcblx0ICogQ29udmVydHMgYW4gYWJzb2x1dGUgcG9zaXRpb24gb2YgYW4gaXRlbSBpbnRvIGEgcmVsYXRpdmUgb25lLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvbiAtIFRoZSBhYnNvbHV0ZSBwb3NpdGlvbiB0byBjb252ZXJ0LlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSAtIFRoZSBjb252ZXJ0ZWQgcG9zaXRpb24uXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnJlbGF0aXZlID0gZnVuY3Rpb24ocG9zaXRpb24pIHtcblx0XHRwb3NpdGlvbiAtPSB0aGlzLl9jbG9uZXMubGVuZ3RoIC8gMjtcblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUocG9zaXRpb24sIHRydWUpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBtYXhpbXVtIHBvc2l0aW9uIGZvciB0aGUgY3VycmVudCBpdGVtLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3JlbGF0aXZlPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmV0dXJuIGFuIGFic29sdXRlIHBvc2l0aW9uIG9yIGEgcmVsYXRpdmUgcG9zaXRpb24uXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9XG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm1heGltdW0gPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuXHRcdHZhciBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MsXG5cdFx0XHRtYXhpbXVtID0gdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoLFxuXHRcdFx0Ym91bmRhcnkgPSBNYXRoLmFicyh0aGlzLl9jb29yZGluYXRlc1ttYXhpbXVtIC0gMV0pIC0gdGhpcy5fd2lkdGgsXG5cdFx0XHRpID0gLTEsIGo7XG5cblx0XHRpZiAoc2V0dGluZ3MubG9vcCkge1xuXHRcdFx0bWF4aW11bSA9IHRoaXMuX2Nsb25lcy5sZW5ndGggLyAyICsgdGhpcy5faXRlbXMubGVuZ3RoIC0gMTtcblx0XHR9IGVsc2UgaWYgKHNldHRpbmdzLmF1dG9XaWR0aCB8fCBzZXR0aW5ncy5tZXJnZSkge1xuXHRcdFx0Ly8gYmluYXJ5IHNlYXJjaFxuXHRcdFx0d2hpbGUgKG1heGltdW0gLSBpID4gMSkge1xuXHRcdFx0XHRNYXRoLmFicyh0aGlzLl9jb29yZGluYXRlc1tqID0gbWF4aW11bSArIGkgPj4gMV0pIDwgYm91bmRhcnlcblx0XHRcdFx0XHQ/IGkgPSBqIDogbWF4aW11bSA9IGo7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzZXR0aW5ncy5jZW50ZXIpIHtcblx0XHRcdG1heGltdW0gPSB0aGlzLl9pdGVtcy5sZW5ndGggLSAxO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXhpbXVtID0gdGhpcy5faXRlbXMubGVuZ3RoIC0gc2V0dGluZ3MuaXRlbXM7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGF0aXZlKSB7XG5cdFx0XHRtYXhpbXVtIC09IHRoaXMuX2Nsb25lcy5sZW5ndGggLyAyO1xuXHRcdH1cblxuXHRcdHJldHVybiBNYXRoLm1heChtYXhpbXVtLCAwKTtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgbWluaW11bSBwb3NpdGlvbiBmb3IgdGhlIGN1cnJlbnQgaXRlbS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtyZWxhdGl2ZT1mYWxzZV0gLSBXaGV0aGVyIHRvIHJldHVybiBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvciBhIHJlbGF0aXZlIHBvc2l0aW9uLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfVxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5taW5pbXVtID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcblx0XHRyZXR1cm4gcmVsYXRpdmUgPyAwIDogdGhpcy5fY2xvbmVzLmxlbmd0aCAvIDI7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgYW4gaXRlbSBhdCB0aGUgc3BlY2lmaWVkIHJlbGF0aXZlIHBvc2l0aW9uLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb25dIC0gVGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSBpdGVtLlxuXHQgKiBAcmV0dXJuIHtqUXVlcnl8QXJyYXkuPGpRdWVyeT59IC0gVGhlIGl0ZW0gYXQgdGhlIGdpdmVuIHBvc2l0aW9uIG9yIGFsbCBpdGVtcyBpZiBubyBwb3NpdGlvbiB3YXMgZ2l2ZW4uXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLml0ZW1zID0gZnVuY3Rpb24ocG9zaXRpb24pIHtcblx0XHRpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2l0ZW1zLnNsaWNlKCk7XG5cdFx0fVxuXG5cdFx0cG9zaXRpb24gPSB0aGlzLm5vcm1hbGl6ZShwb3NpdGlvbiwgdHJ1ZSk7XG5cdFx0cmV0dXJuIHRoaXMuX2l0ZW1zW3Bvc2l0aW9uXTtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyBhbiBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgcmVsYXRpdmUgcG9zaXRpb24uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtwb3NpdGlvbl0gLSBUaGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIGl0ZW0uXG5cdCAqIEByZXR1cm4ge2pRdWVyeXxBcnJheS48alF1ZXJ5Pn0gLSBUaGUgaXRlbSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gb3IgYWxsIGl0ZW1zIGlmIG5vIHBvc2l0aW9uIHdhcyBnaXZlbi5cblx0ICovXG5cdE93bC5wcm90b3R5cGUubWVyZ2VycyA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG5cdFx0aWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9tZXJnZXJzLnNsaWNlKCk7XG5cdFx0fVxuXG5cdFx0cG9zaXRpb24gPSB0aGlzLm5vcm1hbGl6ZShwb3NpdGlvbiwgdHJ1ZSk7XG5cdFx0cmV0dXJuIHRoaXMuX21lcmdlcnNbcG9zaXRpb25dO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbnMgb2YgY2xvbmVzIGZvciBhbiBpdGVtLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb25dIC0gVGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSBpdGVtLlxuXHQgKiBAcmV0dXJucyB7QXJyYXkuPE51bWJlcj59IC0gVGhlIGFic29sdXRlIHBvc2l0aW9ucyBvZiBjbG9uZXMgZm9yIHRoZSBpdGVtIG9yIGFsbCBpZiBubyBwb3NpdGlvbiB3YXMgZ2l2ZW4uXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmNsb25lcyA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG5cdFx0dmFyIG9kZCA9IHRoaXMuX2Nsb25lcy5sZW5ndGggLyAyLFxuXHRcdFx0ZXZlbiA9IG9kZCArIHRoaXMuX2l0ZW1zLmxlbmd0aCxcblx0XHRcdG1hcCA9IGZ1bmN0aW9uKGluZGV4KSB7IHJldHVybiBpbmRleCAlIDIgPT09IDAgPyBldmVuICsgaW5kZXggLyAyIDogb2RkIC0gKGluZGV4ICsgMSkgLyAyIH07XG5cblx0XHRpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuICQubWFwKHRoaXMuX2Nsb25lcywgZnVuY3Rpb24odiwgaSkgeyByZXR1cm4gbWFwKGkpIH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiAkLm1hcCh0aGlzLl9jbG9uZXMsIGZ1bmN0aW9uKHYsIGkpIHsgcmV0dXJuIHYgPT09IHBvc2l0aW9uID8gbWFwKGkpIDogbnVsbCB9KTtcblx0fTtcblxuXHQvKipcblx0ICogU2V0cyB0aGUgY3VycmVudCBhbmltYXRpb24gc3BlZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtzcGVlZF0gLSBUaGUgYW5pbWF0aW9uIHNwZWVkIGluIG1pbGxpc2Vjb25kcyBvciBub3RoaW5nIHRvIGxlYXZlIGl0IHVuY2hhbmdlZC5cblx0ICogQHJldHVybnMge051bWJlcn0gLSBUaGUgY3VycmVudCBhbmltYXRpb24gc3BlZWQgaW4gbWlsbGlzZWNvbmRzLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5zcGVlZCA9IGZ1bmN0aW9uKHNwZWVkKSB7XG5cdFx0aWYgKHNwZWVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuX3NwZWVkID0gc3BlZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX3NwZWVkO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBjb29yZGluYXRlIG9mIGFuIGl0ZW0uXG5cdCAqIEB0b2RvIFRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kIGlzIG1pc3NsZWFuZGluZy5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gLSBUaGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gd2l0aGluIGBtaW5pbXVtKClgIGFuZCBgbWF4aW11bSgpYC5cblx0ICogQHJldHVybnMge051bWJlcnxBcnJheS48TnVtYmVyPn0gLSBUaGUgY29vcmRpbmF0ZSBvZiB0aGUgaXRlbSBpbiBwaXhlbCBvciBhbGwgY29vcmRpbmF0ZXMuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmNvb3JkaW5hdGVzID0gZnVuY3Rpb24ocG9zaXRpb24pIHtcblx0XHR2YXIgbXVsdGlwbGllciA9IDEsXG5cdFx0XHRuZXdQb3NpdGlvbiA9IHBvc2l0aW9uIC0gMSxcblx0XHRcdGNvb3JkaW5hdGU7XG5cblx0XHRpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuICQubWFwKHRoaXMuX2Nvb3JkaW5hdGVzLCAkLnByb3h5KGZ1bmN0aW9uKGNvb3JkaW5hdGUsIGluZGV4KSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvb3JkaW5hdGVzKGluZGV4KTtcblx0XHRcdH0sIHRoaXMpKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncy5jZW50ZXIpIHtcblx0XHRcdGlmICh0aGlzLnNldHRpbmdzLnJ0bCkge1xuXHRcdFx0XHRtdWx0aXBsaWVyID0gLTE7XG5cdFx0XHRcdG5ld1Bvc2l0aW9uID0gcG9zaXRpb24gKyAxO1xuXHRcdFx0fVxuXG5cdFx0XHRjb29yZGluYXRlID0gdGhpcy5fY29vcmRpbmF0ZXNbcG9zaXRpb25dO1xuXHRcdFx0Y29vcmRpbmF0ZSArPSAodGhpcy53aWR0aCgpIC0gY29vcmRpbmF0ZSArICh0aGlzLl9jb29yZGluYXRlc1tuZXdQb3NpdGlvbl0gfHwgMCkpIC8gMiAqIG11bHRpcGxpZXI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvb3JkaW5hdGUgPSB0aGlzLl9jb29yZGluYXRlc1tuZXdQb3NpdGlvbl0gfHwgMDtcblx0XHR9XG5cblx0XHRjb29yZGluYXRlID0gTWF0aC5jZWlsKGNvb3JkaW5hdGUpO1xuXG5cdFx0cmV0dXJuIGNvb3JkaW5hdGU7XG5cdH07XG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIHNwZWVkIGZvciBhIHRyYW5zbGF0aW9uLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tIC0gVGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBpdGVtLlxuXHQgKiBAcGFyYW0ge051bWJlcn0gdG8gLSBUaGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHRhcmdldCBpdGVtLlxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2ZhY3Rvcj11bmRlZmluZWRdIC0gVGhlIHRpbWUgZmFjdG9yIGluIG1pbGxpc2Vjb25kcy5cblx0ICogQHJldHVybnMge051bWJlcn0gLSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSB0cmFuc2xhdGlvbi5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuZHVyYXRpb24gPSBmdW5jdGlvbihmcm9tLCB0bywgZmFjdG9yKSB7XG5cdFx0aWYgKGZhY3RvciA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KE1hdGguYWJzKHRvIC0gZnJvbSksIDEpLCA2KSAqIE1hdGguYWJzKChmYWN0b3IgfHwgdGhpcy5zZXR0aW5ncy5zbWFydFNwZWVkKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFNsaWRlcyB0byB0aGUgc3BlY2lmaWVkIGl0ZW0uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtLlxuXHQgKiBAcGFyYW0ge051bWJlcn0gW3NwZWVkXSAtIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHRyYW5zaXRpb24uXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnRvID0gZnVuY3Rpb24ocG9zaXRpb24sIHNwZWVkKSB7XG5cdFx0dmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQoKSxcblx0XHRcdHJldmVydCA9IG51bGwsXG5cdFx0XHRkaXN0YW5jZSA9IHBvc2l0aW9uIC0gdGhpcy5yZWxhdGl2ZShjdXJyZW50KSxcblx0XHRcdGRpcmVjdGlvbiA9IChkaXN0YW5jZSA+IDApIC0gKGRpc3RhbmNlIDwgMCksXG5cdFx0XHRpdGVtcyA9IHRoaXMuX2l0ZW1zLmxlbmd0aCxcblx0XHRcdG1pbmltdW0gPSB0aGlzLm1pbmltdW0oKSxcblx0XHRcdG1heGltdW0gPSB0aGlzLm1heGltdW0oKTtcblxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmxvb3ApIHtcblx0XHRcdGlmICghdGhpcy5zZXR0aW5ncy5yZXdpbmQgJiYgTWF0aC5hYnMoZGlzdGFuY2UpID4gaXRlbXMgLyAyKSB7XG5cdFx0XHRcdGRpc3RhbmNlICs9IGRpcmVjdGlvbiAqIC0xICogaXRlbXM7XG5cdFx0XHR9XG5cblx0XHRcdHBvc2l0aW9uID0gY3VycmVudCArIGRpc3RhbmNlO1xuXHRcdFx0cmV2ZXJ0ID0gKChwb3NpdGlvbiAtIG1pbmltdW0pICUgaXRlbXMgKyBpdGVtcykgJSBpdGVtcyArIG1pbmltdW07XG5cblx0XHRcdGlmIChyZXZlcnQgIT09IHBvc2l0aW9uICYmIHJldmVydCAtIGRpc3RhbmNlIDw9IG1heGltdW0gJiYgcmV2ZXJ0IC0gZGlzdGFuY2UgPiAwKSB7XG5cdFx0XHRcdGN1cnJlbnQgPSByZXZlcnQgLSBkaXN0YW5jZTtcblx0XHRcdFx0cG9zaXRpb24gPSByZXZlcnQ7XG5cdFx0XHRcdHRoaXMucmVzZXQoY3VycmVudCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0aGlzLnNldHRpbmdzLnJld2luZCkge1xuXHRcdFx0bWF4aW11bSArPSAxO1xuXHRcdFx0cG9zaXRpb24gPSAocG9zaXRpb24gJSBtYXhpbXVtICsgbWF4aW11bSkgJSBtYXhpbXVtO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwb3NpdGlvbiA9IE1hdGgubWF4KG1pbmltdW0sIE1hdGgubWluKG1heGltdW0sIHBvc2l0aW9uKSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zcGVlZCh0aGlzLmR1cmF0aW9uKGN1cnJlbnQsIHBvc2l0aW9uLCBzcGVlZCkpO1xuXHRcdHRoaXMuY3VycmVudChwb3NpdGlvbik7XG5cblx0XHRpZiAodGhpcy4kZWxlbWVudC5pcygnOnZpc2libGUnKSkge1xuXHRcdFx0dGhpcy51cGRhdGUoKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFNsaWRlcyB0byB0aGUgbmV4dCBpdGVtLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbc3BlZWRdIC0gVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgdHJhbnNpdGlvbi5cblx0ICovXG5cdE93bC5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHNwZWVkKSB7XG5cdFx0c3BlZWQgPSBzcGVlZCB8fCBmYWxzZTtcblx0XHR0aGlzLnRvKHRoaXMucmVsYXRpdmUodGhpcy5jdXJyZW50KCkpICsgMSwgc3BlZWQpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTbGlkZXMgdG8gdGhlIHByZXZpb3VzIGl0ZW0uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtzcGVlZF0gLSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSB0cmFuc2l0aW9uLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5wcmV2ID0gZnVuY3Rpb24oc3BlZWQpIHtcblx0XHRzcGVlZCA9IHNwZWVkIHx8IGZhbHNlO1xuXHRcdHRoaXMudG8odGhpcy5yZWxhdGl2ZSh0aGlzLmN1cnJlbnQoKSkgLSAxLCBzcGVlZCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGVuZCBvZiBhbiBhbmltYXRpb24uXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgYXJndW1lbnRzLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5vblRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbihldmVudCkge1xuXG5cdFx0Ly8gaWYgY3NzMiBhbmltYXRpb24gdGhlbiBldmVudCBvYmplY3QgaXMgdW5kZWZpbmVkXG5cdFx0aWYgKGV2ZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0XHQvLyBDYXRjaCBvbmx5IG93bC1zdGFnZSB0cmFuc2l0aW9uRW5kIGV2ZW50XG5cdFx0XHRpZiAoKGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50IHx8IGV2ZW50Lm9yaWdpbmFsVGFyZ2V0KSAhPT0gdGhpcy4kc3RhZ2UuZ2V0KDApKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmxlYXZlKCdhbmltYXRpbmcnKTtcblx0XHR0aGlzLnRyaWdnZXIoJ3RyYW5zbGF0ZWQnKTtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyB2aWV3cG9ydCB3aWR0aC5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcmV0dXJuIHtOdW1iZXJ9IC0gVGhlIHdpZHRoIGluIHBpeGVsLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS52aWV3cG9ydCA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB3aWR0aDtcblx0XHRpZiAodGhpcy5vcHRpb25zLnJlc3BvbnNpdmVCYXNlRWxlbWVudCAhPT0gd2luZG93KSB7XG5cdFx0XHR3aWR0aCA9ICQodGhpcy5vcHRpb25zLnJlc3BvbnNpdmVCYXNlRWxlbWVudCkud2lkdGgoKTtcblx0XHR9IGVsc2UgaWYgKHdpbmRvdy5pbm5lcldpZHRoKSB7XG5cdFx0XHR3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuXHRcdH0gZWxzZSBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkge1xuXHRcdFx0d2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93ICdDYW4gbm90IGRldGVjdCB2aWV3cG9ydCB3aWR0aC4nO1xuXHRcdH1cblx0XHRyZXR1cm4gd2lkdGg7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IGNvbnRlbnQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudHxqUXVlcnl8U3RyaW5nfSBjb250ZW50IC0gVGhlIG5ldyBjb250ZW50LlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24oY29udGVudCkge1xuXHRcdHRoaXMuJHN0YWdlLmVtcHR5KCk7XG5cdFx0dGhpcy5faXRlbXMgPSBbXTtcblxuXHRcdGlmIChjb250ZW50KSB7XG5cdFx0XHRjb250ZW50ID0gKGNvbnRlbnQgaW5zdGFuY2VvZiBqUXVlcnkpID8gY29udGVudCA6ICQoY29udGVudCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MubmVzdGVkSXRlbVNlbGVjdG9yKSB7XG5cdFx0XHRjb250ZW50ID0gY29udGVudC5maW5kKCcuJyArIHRoaXMuc2V0dGluZ3MubmVzdGVkSXRlbVNlbGVjdG9yKTtcblx0XHR9XG5cblx0XHRjb250ZW50LmZpbHRlcihmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLm5vZGVUeXBlID09PSAxO1xuXHRcdH0pLmVhY2goJC5wcm94eShmdW5jdGlvbihpbmRleCwgaXRlbSkge1xuXHRcdFx0aXRlbSA9IHRoaXMucHJlcGFyZShpdGVtKTtcblx0XHRcdHRoaXMuJHN0YWdlLmFwcGVuZChpdGVtKTtcblx0XHRcdHRoaXMuX2l0ZW1zLnB1c2goaXRlbSk7XG5cdFx0XHR0aGlzLl9tZXJnZXJzLnB1c2goaXRlbS5maW5kKCdbZGF0YS1tZXJnZV0nKS5hbmRTZWxmKCdbZGF0YS1tZXJnZV0nKS5hdHRyKCdkYXRhLW1lcmdlJykgKiAxIHx8IDEpO1xuXHRcdH0sIHRoaXMpKTtcblxuXHRcdHRoaXMucmVzZXQodGhpcy5pc051bWVyaWModGhpcy5zZXR0aW5ncy5zdGFydFBvc2l0aW9uKSA/IHRoaXMuc2V0dGluZ3Muc3RhcnRQb3NpdGlvbiA6IDApO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlKCdpdGVtcycpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBBZGRzIGFuIGl0ZW0uXG5cdCAqIEB0b2RvIFVzZSBgaXRlbWAgaW5zdGVhZCBvZiBgY29udGVudGAgZm9yIHRoZSBldmVudCBhcmd1bWVudHMuXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudHxqUXVlcnl8U3RyaW5nfSBjb250ZW50IC0gVGhlIGl0ZW0gY29udGVudCB0byBhZGQuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb25dIC0gVGhlIHJlbGF0aXZlIHBvc2l0aW9uIGF0IHdoaWNoIHRvIGluc2VydCB0aGUgaXRlbSBvdGhlcndpc2UgdGhlIGl0ZW0gd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihjb250ZW50LCBwb3NpdGlvbikge1xuXHRcdHZhciBjdXJyZW50ID0gdGhpcy5yZWxhdGl2ZSh0aGlzLl9jdXJyZW50KTtcblxuXHRcdHBvc2l0aW9uID0gcG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IHRoaXMuX2l0ZW1zLmxlbmd0aCA6IHRoaXMubm9ybWFsaXplKHBvc2l0aW9uLCB0cnVlKTtcblx0XHRjb250ZW50ID0gY29udGVudCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRlbnQgOiAkKGNvbnRlbnQpO1xuXG5cdFx0dGhpcy50cmlnZ2VyKCdhZGQnLCB7IGNvbnRlbnQ6IGNvbnRlbnQsIHBvc2l0aW9uOiBwb3NpdGlvbiB9KTtcblxuXHRcdGNvbnRlbnQgPSB0aGlzLnByZXBhcmUoY29udGVudCk7XG5cblx0XHRpZiAodGhpcy5faXRlbXMubGVuZ3RoID09PSAwIHx8IHBvc2l0aW9uID09PSB0aGlzLl9pdGVtcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuX2l0ZW1zLmxlbmd0aCA9PT0gMCAmJiB0aGlzLiRzdGFnZS5hcHBlbmQoY29udGVudCk7XG5cdFx0XHR0aGlzLl9pdGVtcy5sZW5ndGggIT09IDAgJiYgdGhpcy5faXRlbXNbcG9zaXRpb24gLSAxXS5hZnRlcihjb250ZW50KTtcblx0XHRcdHRoaXMuX2l0ZW1zLnB1c2goY29udGVudCk7XG5cdFx0XHR0aGlzLl9tZXJnZXJzLnB1c2goY29udGVudC5maW5kKCdbZGF0YS1tZXJnZV0nKS5hbmRTZWxmKCdbZGF0YS1tZXJnZV0nKS5hdHRyKCdkYXRhLW1lcmdlJykgKiAxIHx8IDEpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9pdGVtc1twb3NpdGlvbl0uYmVmb3JlKGNvbnRlbnQpO1xuXHRcdFx0dGhpcy5faXRlbXMuc3BsaWNlKHBvc2l0aW9uLCAwLCBjb250ZW50KTtcblx0XHRcdHRoaXMuX21lcmdlcnMuc3BsaWNlKHBvc2l0aW9uLCAwLCBjb250ZW50LmZpbmQoJ1tkYXRhLW1lcmdlXScpLmFuZFNlbGYoJ1tkYXRhLW1lcmdlXScpLmF0dHIoJ2RhdGEtbWVyZ2UnKSAqIDEgfHwgMSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5faXRlbXNbY3VycmVudF0gJiYgdGhpcy5yZXNldCh0aGlzLl9pdGVtc1tjdXJyZW50XS5pbmRleCgpKTtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZSgnaXRlbXMnKTtcblxuXHRcdHRoaXMudHJpZ2dlcignYWRkZWQnLCB7IGNvbnRlbnQ6IGNvbnRlbnQsIHBvc2l0aW9uOiBwb3NpdGlvbiB9KTtcblx0fTtcblxuXHQvKipcblx0ICogUmVtb3ZlcyBhbiBpdGVtIGJ5IGl0cyBwb3NpdGlvbi5cblx0ICogQHRvZG8gVXNlIGBpdGVtYCBpbnN0ZWFkIG9mIGBjb250ZW50YCBmb3IgdGhlIGV2ZW50IGFyZ3VtZW50cy5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gLSBUaGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbihwb3NpdGlvbikge1xuXHRcdHBvc2l0aW9uID0gdGhpcy5ub3JtYWxpemUocG9zaXRpb24sIHRydWUpO1xuXG5cdFx0aWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnRyaWdnZXIoJ3JlbW92ZScsIHsgY29udGVudDogdGhpcy5faXRlbXNbcG9zaXRpb25dLCBwb3NpdGlvbjogcG9zaXRpb24gfSk7XG5cblx0XHR0aGlzLl9pdGVtc1twb3NpdGlvbl0ucmVtb3ZlKCk7XG5cdFx0dGhpcy5faXRlbXMuc3BsaWNlKHBvc2l0aW9uLCAxKTtcblx0XHR0aGlzLl9tZXJnZXJzLnNwbGljZShwb3NpdGlvbiwgMSk7XG5cblx0XHR0aGlzLmludmFsaWRhdGUoJ2l0ZW1zJyk7XG5cblx0XHR0aGlzLnRyaWdnZXIoJ3JlbW92ZWQnLCB7IGNvbnRlbnQ6IG51bGwsIHBvc2l0aW9uOiBwb3NpdGlvbiB9KTtcblx0fTtcblxuXHQvKipcblx0ICogUHJlbG9hZHMgaW1hZ2VzIHdpdGggYXV0byB3aWR0aC5cblx0ICogQHRvZG8gUmVwbGFjZSBieSBhIG1vcmUgZ2VuZXJpYyBhcHByb2FjaFxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnByZWxvYWRBdXRvV2lkdGhJbWFnZXMgPSBmdW5jdGlvbihpbWFnZXMpIHtcblx0XHRpbWFnZXMuZWFjaCgkLnByb3h5KGZ1bmN0aW9uKGksIGVsZW1lbnQpIHtcblx0XHRcdHRoaXMuZW50ZXIoJ3ByZS1sb2FkaW5nJyk7XG5cdFx0XHRlbGVtZW50ID0gJChlbGVtZW50KTtcblx0XHRcdCQobmV3IEltYWdlKCkpLm9uZSgnbG9hZCcsICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRlbGVtZW50LmF0dHIoJ3NyYycsIGUudGFyZ2V0LnNyYyk7XG5cdFx0XHRcdGVsZW1lbnQuY3NzKCdvcGFjaXR5JywgMSk7XG5cdFx0XHRcdHRoaXMubGVhdmUoJ3ByZS1sb2FkaW5nJyk7XG5cdFx0XHRcdCF0aGlzLmlzKCdwcmUtbG9hZGluZycpICYmICF0aGlzLmlzKCdpbml0aWFsaXppbmcnKSAmJiB0aGlzLnJlZnJlc2goKTtcblx0XHRcdH0sIHRoaXMpKS5hdHRyKCdzcmMnLCBlbGVtZW50LmF0dHIoJ3NyYycpIHx8IGVsZW1lbnQuYXR0cignZGF0YS1zcmMnKSB8fCBlbGVtZW50LmF0dHIoJ2RhdGEtc3JjLXJldGluYScpKTtcblx0XHR9LCB0aGlzKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlc3Ryb3lzIHRoZSBjYXJvdXNlbC5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cblx0XHR0aGlzLiRlbGVtZW50Lm9mZignLm93bC5jb3JlJyk7XG5cdFx0dGhpcy4kc3RhZ2Uub2ZmKCcub3dsLmNvcmUnKTtcblx0XHQkKGRvY3VtZW50KS5vZmYoJy5vd2wuY29yZScpO1xuXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MucmVzcG9uc2l2ZSAhPT0gZmFsc2UpIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lcik7XG5cdFx0XHR0aGlzLm9mZih3aW5kb3csICdyZXNpemUnLCB0aGlzLl9oYW5kbGVycy5vblRocm90dGxlZFJlc2l6ZSk7XG5cdFx0fVxuXG5cdFx0Zm9yICh2YXIgaSBpbiB0aGlzLl9wbHVnaW5zKSB7XG5cdFx0XHR0aGlzLl9wbHVnaW5zW2ldLmRlc3Ryb3koKTtcblx0XHR9XG5cblx0XHR0aGlzLiRzdGFnZS5jaGlsZHJlbignLmNsb25lZCcpLnJlbW92ZSgpO1xuXG5cdFx0dGhpcy4kc3RhZ2UudW53cmFwKCk7XG5cdFx0dGhpcy4kc3RhZ2UuY2hpbGRyZW4oKS5jb250ZW50cygpLnVud3JhcCgpO1xuXHRcdHRoaXMuJHN0YWdlLmNoaWxkcmVuKCkudW53cmFwKCk7XG5cblx0XHR0aGlzLiRlbGVtZW50XG5cdFx0XHQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLnJlZnJlc2hDbGFzcylcblx0XHRcdC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMubG9hZGluZ0NsYXNzKVxuXHRcdFx0LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sb2FkZWRDbGFzcylcblx0XHRcdC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMucnRsQ2xhc3MpXG5cdFx0XHQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmRyYWdDbGFzcylcblx0XHRcdC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZ3JhYkNsYXNzKVxuXHRcdFx0LmF0dHIoJ2NsYXNzJywgdGhpcy4kZWxlbWVudC5hdHRyKCdjbGFzcycpLnJlcGxhY2UobmV3IFJlZ0V4cCh0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZUNsYXNzICsgJy1cXFxcUytcXFxccycsICdnJyksICcnKSlcblx0XHRcdC5yZW1vdmVEYXRhKCdvd2wuY2Fyb3VzZWwnKTtcblx0fTtcblxuXHQvKipcblx0ICogT3BlcmF0b3JzIHRvIGNhbGN1bGF0ZSByaWdodC10by1sZWZ0IGFuZCBsZWZ0LXRvLXJpZ2h0LlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbYV0gLSBUaGUgbGVmdCBzaWRlIG9wZXJhbmQuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBbb10gLSBUaGUgb3BlcmF0b3IuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbYl0gLSBUaGUgcmlnaHQgc2lkZSBvcGVyYW5kLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5vcCA9IGZ1bmN0aW9uKGEsIG8sIGIpIHtcblx0XHR2YXIgcnRsID0gdGhpcy5zZXR0aW5ncy5ydGw7XG5cdFx0c3dpdGNoIChvKSB7XG5cdFx0XHRjYXNlICc8Jzpcblx0XHRcdFx0cmV0dXJuIHJ0bCA/IGEgPiBiIDogYSA8IGI7XG5cdFx0XHRjYXNlICc+Jzpcblx0XHRcdFx0cmV0dXJuIHJ0bCA/IGEgPCBiIDogYSA+IGI7XG5cdFx0XHRjYXNlICc+PSc6XG5cdFx0XHRcdHJldHVybiBydGwgPyBhIDw9IGIgOiBhID49IGI7XG5cdFx0XHRjYXNlICc8PSc6XG5cdFx0XHRcdHJldHVybiBydGwgPyBhID49IGIgOiBhIDw9IGI7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEF0dGFjaGVzIHRvIGFuIGludGVybmFsIGV2ZW50LlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZXZlbnQgc291cmNlLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgZXZlbnQgaGFuZGxlciB0byBhdHRhY2guXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gY2FwdHVyZSAtIFdldGhlciB0aGUgZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQgYXQgdGhlIGNhcHR1cmluZyBwaGFzZSBvciBub3QuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZWxlbWVudCwgZXZlbnQsIGxpc3RlbmVyLCBjYXB0dXJlKSB7XG5cdFx0aWYgKGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikge1xuXHRcdFx0ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwgY2FwdHVyZSk7XG5cdFx0fSBlbHNlIGlmIChlbGVtZW50LmF0dGFjaEV2ZW50KSB7XG5cdFx0XHRlbGVtZW50LmF0dGFjaEV2ZW50KCdvbicgKyBldmVudCwgbGlzdGVuZXIpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogRGV0YWNoZXMgZnJvbSBhbiBpbnRlcm5hbCBldmVudC5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGV2ZW50IHNvdXJjZS5cblx0ICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IG5hbWUuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gVGhlIGF0dGFjaGVkIGV2ZW50IGhhbmRsZXIgdG8gZGV0YWNoLlxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGNhcHR1cmUgLSBXZXRoZXIgdGhlIGF0dGFjaGVkIGV2ZW50IGhhbmRsZXIgd2FzIHJlZ2lzdGVyZWQgYXMgYSBjYXB0dXJpbmcgbGlzdGVuZXIgb3Igbm90LlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbihlbGVtZW50LCBldmVudCwgbGlzdGVuZXIsIGNhcHR1cmUpIHtcblx0XHRpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG5cdFx0XHRlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBjYXB0dXJlKTtcblx0XHR9IGVsc2UgaWYgKGVsZW1lbnQuZGV0YWNoRXZlbnQpIHtcblx0XHRcdGVsZW1lbnQuZGV0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBsaXN0ZW5lcik7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBUcmlnZ2VycyBhIHB1YmxpYyBldmVudC5cblx0ICogQHRvZG8gUmVtb3ZlIGBzdGF0dXNgLCBgcmVsYXRlZFRhcmdldGAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSBldmVudCBuYW1lLlxuXHQgKiBAcGFyYW0geyp9IFtkYXRhPW51bGxdIC0gVGhlIGV2ZW50IGRhdGEuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZXNwYWNlPWNhcm91c2VsXSAtIFRoZSBldmVudCBuYW1lc3BhY2UuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBbc3RhdGVdIC0gVGhlIHN0YXRlIHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW2VudGVyPWZhbHNlXSAtIEluZGljYXRlcyBpZiB0aGUgY2FsbCBlbnRlcnMgdGhlIHNwZWNpZmllZCBzdGF0ZSBvciBub3QuXG5cdCAqIEByZXR1cm5zIHtFdmVudH0gLSBUaGUgZXZlbnQgYXJndW1lbnRzLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS50cmlnZ2VyID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgbmFtZXNwYWNlLCBzdGF0ZSwgZW50ZXIpIHtcblx0XHR2YXIgc3RhdHVzID0ge1xuXHRcdFx0aXRlbTogeyBjb3VudDogdGhpcy5faXRlbXMubGVuZ3RoLCBpbmRleDogdGhpcy5jdXJyZW50KCkgfVxuXHRcdH0sIGhhbmRsZXIgPSAkLmNhbWVsQ2FzZShcblx0XHRcdCQuZ3JlcChbICdvbicsIG5hbWUsIG5hbWVzcGFjZSBdLCBmdW5jdGlvbih2KSB7IHJldHVybiB2IH0pXG5cdFx0XHRcdC5qb2luKCctJykudG9Mb3dlckNhc2UoKVxuXHRcdCksIGV2ZW50ID0gJC5FdmVudChcblx0XHRcdFsgbmFtZSwgJ293bCcsIG5hbWVzcGFjZSB8fCAnY2Fyb3VzZWwnIF0uam9pbignLicpLnRvTG93ZXJDYXNlKCksXG5cdFx0XHQkLmV4dGVuZCh7IHJlbGF0ZWRUYXJnZXQ6IHRoaXMgfSwgc3RhdHVzLCBkYXRhKVxuXHRcdCk7XG5cblx0XHRpZiAoIXRoaXMuX3N1cHJlc3NbbmFtZV0pIHtcblx0XHRcdCQuZWFjaCh0aGlzLl9wbHVnaW5zLCBmdW5jdGlvbihuYW1lLCBwbHVnaW4pIHtcblx0XHRcdFx0aWYgKHBsdWdpbi5vblRyaWdnZXIpIHtcblx0XHRcdFx0XHRwbHVnaW4ub25UcmlnZ2VyKGV2ZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMucmVnaXN0ZXIoeyB0eXBlOiBPd2wuVHlwZS5FdmVudCwgbmFtZTogbmFtZSB9KTtcblx0XHRcdHRoaXMuJGVsZW1lbnQudHJpZ2dlcihldmVudCk7XG5cblx0XHRcdGlmICh0aGlzLnNldHRpbmdzICYmIHR5cGVvZiB0aGlzLnNldHRpbmdzW2hhbmRsZXJdID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3NbaGFuZGxlcl0uY2FsbCh0aGlzLCBldmVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBFbnRlcnMgYSBzdGF0ZS5cblx0ICogQHBhcmFtIG5hbWUgLSBUaGUgc3RhdGUgbmFtZS5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuZW50ZXIgPSBmdW5jdGlvbihuYW1lKSB7XG5cdFx0JC5lYWNoKFsgbmFtZSBdLmNvbmNhdCh0aGlzLl9zdGF0ZXMudGFnc1tuYW1lXSB8fCBbXSksICQucHJveHkoZnVuY3Rpb24oaSwgbmFtZSkge1xuXHRcdFx0aWYgKHRoaXMuX3N0YXRlcy5jdXJyZW50W25hbWVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5fc3RhdGVzLmN1cnJlbnRbbmFtZV0gPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zdGF0ZXMuY3VycmVudFtuYW1lXSsrO1xuXHRcdH0sIHRoaXMpKTtcblx0fTtcblxuXHQvKipcblx0ICogTGVhdmVzIGEgc3RhdGUuXG5cdCAqIEBwYXJhbSBuYW1lIC0gVGhlIHN0YXRlIG5hbWUuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmxlYXZlID0gZnVuY3Rpb24obmFtZSkge1xuXHRcdCQuZWFjaChbIG5hbWUgXS5jb25jYXQodGhpcy5fc3RhdGVzLnRhZ3NbbmFtZV0gfHwgW10pLCAkLnByb3h5KGZ1bmN0aW9uKGksIG5hbWUpIHtcblx0XHRcdHRoaXMuX3N0YXRlcy5jdXJyZW50W25hbWVdLS07XG5cdFx0fSwgdGhpcykpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZWdpc3RlcnMgYW4gZXZlbnQgb3Igc3RhdGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCAtIFRoZSBldmVudCBvciBzdGF0ZSB0byByZWdpc3Rlci5cblx0ICovXG5cdE93bC5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbihvYmplY3QpIHtcblx0XHRpZiAob2JqZWN0LnR5cGUgPT09IE93bC5UeXBlLkV2ZW50KSB7XG5cdFx0XHRpZiAoISQuZXZlbnQuc3BlY2lhbFtvYmplY3QubmFtZV0pIHtcblx0XHRcdFx0JC5ldmVudC5zcGVjaWFsW29iamVjdC5uYW1lXSA9IHt9O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoISQuZXZlbnQuc3BlY2lhbFtvYmplY3QubmFtZV0ub3dsKSB7XG5cdFx0XHRcdHZhciBfZGVmYXVsdCA9ICQuZXZlbnQuc3BlY2lhbFtvYmplY3QubmFtZV0uX2RlZmF1bHQ7XG5cdFx0XHRcdCQuZXZlbnQuc3BlY2lhbFtvYmplY3QubmFtZV0uX2RlZmF1bHQgPSBmdW5jdGlvbihlKSB7XG5cdFx0XHRcdFx0aWYgKF9kZWZhdWx0ICYmIF9kZWZhdWx0LmFwcGx5ICYmICghZS5uYW1lc3BhY2UgfHwgZS5uYW1lc3BhY2UuaW5kZXhPZignb3dsJykgPT09IC0xKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIF9kZWZhdWx0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBlLm5hbWVzcGFjZSAmJiBlLm5hbWVzcGFjZS5pbmRleE9mKCdvd2wnKSA+IC0xO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHQkLmV2ZW50LnNwZWNpYWxbb2JqZWN0Lm5hbWVdLm93bCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChvYmplY3QudHlwZSA9PT0gT3dsLlR5cGUuU3RhdGUpIHtcblx0XHRcdGlmICghdGhpcy5fc3RhdGVzLnRhZ3Nbb2JqZWN0Lm5hbWVdKSB7XG5cdFx0XHRcdHRoaXMuX3N0YXRlcy50YWdzW29iamVjdC5uYW1lXSA9IG9iamVjdC50YWdzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fc3RhdGVzLnRhZ3Nbb2JqZWN0Lm5hbWVdID0gdGhpcy5fc3RhdGVzLnRhZ3Nbb2JqZWN0Lm5hbWVdLmNvbmNhdChvYmplY3QudGFncyk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3N0YXRlcy50YWdzW29iamVjdC5uYW1lXSA9ICQuZ3JlcCh0aGlzLl9zdGF0ZXMudGFnc1tvYmplY3QubmFtZV0sICQucHJveHkoZnVuY3Rpb24odGFnLCBpKSB7XG5cdFx0XHRcdHJldHVybiAkLmluQXJyYXkodGFnLCB0aGlzLl9zdGF0ZXMudGFnc1tvYmplY3QubmFtZV0pID09PSBpO1xuXHRcdFx0fSwgdGhpcykpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogU3VwcHJlc3NlcyBldmVudHMuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gZXZlbnRzIC0gVGhlIGV2ZW50cyB0byBzdXBwcmVzcy5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuc3VwcHJlc3MgPSBmdW5jdGlvbihldmVudHMpIHtcblx0XHQkLmVhY2goZXZlbnRzLCAkLnByb3h5KGZ1bmN0aW9uKGluZGV4LCBldmVudCkge1xuXHRcdFx0dGhpcy5fc3VwcmVzc1tldmVudF0gPSB0cnVlO1xuXHRcdH0sIHRoaXMpKTtcblx0fTtcblxuXHQvKipcblx0ICogUmVsZWFzZXMgc3VwcHJlc3NlZCBldmVudHMuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gZXZlbnRzIC0gVGhlIGV2ZW50cyB0byByZWxlYXNlLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5yZWxlYXNlID0gZnVuY3Rpb24oZXZlbnRzKSB7XG5cdFx0JC5lYWNoKGV2ZW50cywgJC5wcm94eShmdW5jdGlvbihpbmRleCwgZXZlbnQpIHtcblx0XHRcdGRlbGV0ZSB0aGlzLl9zdXByZXNzW2V2ZW50XTtcblx0XHR9LCB0aGlzKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdW5pZmllZCBwb2ludGVyIGNvb3JkaW5hdGVzIGZyb20gZXZlbnQuXG5cdCAqIEB0b2RvICMyNjFcblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge0V2ZW50fSAtIFRoZSBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnQuXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IC0gQ29udGFpbnMgYHhgIGFuZCBgeWAgY29vcmRpbmF0ZXMgb2YgY3VycmVudCBwb2ludGVyIHBvc2l0aW9uLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5wb2ludGVyID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHR2YXIgcmVzdWx0ID0geyB4OiBudWxsLCB5OiBudWxsIH07XG5cblx0XHRldmVudCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQgfHwgZXZlbnQgfHwgd2luZG93LmV2ZW50O1xuXG5cdFx0ZXZlbnQgPSBldmVudC50b3VjaGVzICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoID9cblx0XHRcdGV2ZW50LnRvdWNoZXNbMF0gOiBldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggP1xuXHRcdFx0XHRldmVudC5jaGFuZ2VkVG91Y2hlc1swXSA6IGV2ZW50O1xuXG5cdFx0aWYgKGV2ZW50LnBhZ2VYKSB7XG5cdFx0XHRyZXN1bHQueCA9IGV2ZW50LnBhZ2VYO1xuXHRcdFx0cmVzdWx0LnkgPSBldmVudC5wYWdlWTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0LnggPSBldmVudC5jbGllbnRYO1xuXHRcdFx0cmVzdWx0LnkgPSBldmVudC5jbGllbnRZO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgaWYgdGhlIGlucHV0IGlzIGEgTnVtYmVyIG9yIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGEgTnVtYmVyXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfE9iamVjdHxBcnJheXxCb29sZWFufFJlZ0V4cHxGdW5jdGlvbnxTeW1ib2x9IC0gVGhlIGlucHV0IHRvIGJlIHRlc3RlZFxuXHQgKiBAcmV0dXJucyB7Qm9vbGVhbn0gLSBBbiBpbmRpY2F0aW9uIGlmIHRoZSBpbnB1dCBpcyBhIE51bWJlciBvciBjYW4gYmUgY29lcmNlZCB0byBhIE51bWJlclxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5pc051bWVyaWMgPSBmdW5jdGlvbihudW1iZXIpIHtcblx0XHRyZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQobnVtYmVyKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHZlY3RvcnMuXG5cdCAqIEB0b2RvICMyNjFcblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge09iamVjdH0gLSBUaGUgZmlyc3QgdmVjdG9yLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gLSBUaGUgc2Vjb25kIHZlY3Rvci5cblx0ICogQHJldHVybnMge09iamVjdH0gLSBUaGUgZGlmZmVyZW5jZS5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuZGlmZmVyZW5jZSA9IGZ1bmN0aW9uKGZpcnN0LCBzZWNvbmQpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0eDogZmlyc3QueCAtIHNlY29uZC54LFxuXHRcdFx0eTogZmlyc3QueSAtIHNlY29uZC55XG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogVGhlIGpRdWVyeSBQbHVnaW4gZm9yIHRoZSBPd2wgQ2Fyb3VzZWxcblx0ICogQHRvZG8gTmF2aWdhdGlvbiBwbHVnaW4gYG5leHRgIGFuZCBgcHJldmBcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0JC5mbi5vd2xDYXJvdXNlbCA9IGZ1bmN0aW9uKG9wdGlvbikge1xuXHRcdHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgJHRoaXMgPSAkKHRoaXMpLFxuXHRcdFx0XHRkYXRhID0gJHRoaXMuZGF0YSgnb3dsLmNhcm91c2VsJyk7XG5cblx0XHRcdGlmICghZGF0YSkge1xuXHRcdFx0XHRkYXRhID0gbmV3IE93bCh0aGlzLCB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvbik7XG5cdFx0XHRcdCR0aGlzLmRhdGEoJ293bC5jYXJvdXNlbCcsIGRhdGEpO1xuXG5cdFx0XHRcdCQuZWFjaChbXG5cdFx0XHRcdFx0J25leHQnLCAncHJldicsICd0bycsICdkZXN0cm95JywgJ3JlZnJlc2gnLCAncmVwbGFjZScsICdhZGQnLCAncmVtb3ZlJ1xuXHRcdFx0XHRdLCBmdW5jdGlvbihpLCBldmVudCkge1xuXHRcdFx0XHRcdGRhdGEucmVnaXN0ZXIoeyB0eXBlOiBPd2wuVHlwZS5FdmVudCwgbmFtZTogZXZlbnQgfSk7XG5cdFx0XHRcdFx0ZGF0YS4kZWxlbWVudC5vbihldmVudCArICcub3dsLmNhcm91c2VsLmNvcmUnLCAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiBlLnJlbGF0ZWRUYXJnZXQgIT09IHRoaXMpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5zdXBwcmVzcyhbIGV2ZW50IF0pO1xuXHRcdFx0XHRcdFx0XHRkYXRhW2V2ZW50XS5hcHBseSh0aGlzLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnJlbGVhc2UoWyBldmVudCBdKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LCBkYXRhKSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJyAmJiBvcHRpb24uY2hhckF0KDApICE9PSAnXycpIHtcblx0XHRcdFx0ZGF0YVtvcHRpb25dLmFwcGx5KGRhdGEsIGFyZ3MpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBqUXVlcnkgUGx1Z2luXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdCQuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IgPSBPd2w7XG5cbn0pKHdpbmRvdy5aZXB0byB8fCB3aW5kb3cualF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50KTtcblxuLyoqXG4gKiBBdXRvUmVmcmVzaCBQbHVnaW5cbiAqIEB2ZXJzaW9uIDIuMS4wXG4gKiBAYXV0aG9yIEFydHVzIEtvbGFub3dza2lcbiAqIEBhdXRob3IgRGF2aWQgRGV1dHNjaFxuICogQGxpY2Vuc2UgVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKi9cbjsoZnVuY3Rpb24oJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIGF1dG8gcmVmcmVzaCBwbHVnaW4uXG5cdCAqIEBjbGFzcyBUaGUgQXV0byBSZWZyZXNoIFBsdWdpblxuXHQgKiBAcGFyYW0ge093bH0gY2Fyb3VzZWwgLSBUaGUgT3dsIENhcm91c2VsXG5cdCAqL1xuXHR2YXIgQXV0b1JlZnJlc2ggPSBmdW5jdGlvbihjYXJvdXNlbCkge1xuXHRcdC8qKlxuXHRcdCAqIFJlZmVyZW5jZSB0byB0aGUgY29yZS5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge093bH1cblx0XHQgKi9cblx0XHR0aGlzLl9jb3JlID0gY2Fyb3VzZWw7XG5cblx0XHQvKipcblx0XHQgKiBSZWZyZXNoIGludGVydmFsLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxuXHRcdCAqL1xuXHRcdHRoaXMuX2ludGVydmFsID0gbnVsbDtcblxuXHRcdC8qKlxuXHRcdCAqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgY3VycmVudGx5IHZpc2libGUgb3Igbm90LlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR0aGlzLl92aXNpYmxlID0gbnVsbDtcblxuXHRcdC8qKlxuXHRcdCAqIEFsbCBldmVudCBoYW5kbGVycy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0XHR0aGlzLl9oYW5kbGVycyA9IHtcblx0XHRcdCdpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b1JlZnJlc2gpIHtcblx0XHRcdFx0XHR0aGlzLndhdGNoKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpXG5cdFx0fTtcblxuXHRcdC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcblx0XHR0aGlzLl9jb3JlLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgQXV0b1JlZnJlc2guRGVmYXVsdHMsIHRoaXMuX2NvcmUub3B0aW9ucyk7XG5cblx0XHQvLyByZWdpc3RlciBldmVudCBoYW5kbGVyc1xuXHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZWZhdWx0IG9wdGlvbnMuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEF1dG9SZWZyZXNoLkRlZmF1bHRzID0ge1xuXHRcdGF1dG9SZWZyZXNoOiB0cnVlLFxuXHRcdGF1dG9SZWZyZXNoSW50ZXJ2YWw6IDUwMFxuXHR9O1xuXG5cdC8qKlxuXHQgKiBXYXRjaGVzIHRoZSBlbGVtZW50LlxuXHQgKi9cblx0QXV0b1JlZnJlc2gucHJvdG90eXBlLndhdGNoID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuX2ludGVydmFsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fdmlzaWJsZSA9IHRoaXMuX2NvcmUuJGVsZW1lbnQuaXMoJzp2aXNpYmxlJyk7XG5cdFx0dGhpcy5faW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoJC5wcm94eSh0aGlzLnJlZnJlc2gsIHRoaXMpLCB0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9SZWZyZXNoSW50ZXJ2YWwpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZWZyZXNoZXMgdGhlIGVsZW1lbnQuXG5cdCAqL1xuXHRBdXRvUmVmcmVzaC5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLl9jb3JlLiRlbGVtZW50LmlzKCc6dmlzaWJsZScpID09PSB0aGlzLl92aXNpYmxlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fdmlzaWJsZSA9ICF0aGlzLl92aXNpYmxlO1xuXG5cdFx0dGhpcy5fY29yZS4kZWxlbWVudC50b2dnbGVDbGFzcygnb3dsLWhpZGRlbicsICF0aGlzLl92aXNpYmxlKTtcblxuXHRcdHRoaXMuX3Zpc2libGUgJiYgKHRoaXMuX2NvcmUuaW52YWxpZGF0ZSgnd2lkdGgnKSAmJiB0aGlzLl9jb3JlLnJlZnJlc2goKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlc3Ryb3lzIHRoZSBwbHVnaW4uXG5cdCAqL1xuXHRBdXRvUmVmcmVzaC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBoYW5kbGVyLCBwcm9wZXJ0eTtcblxuXHRcdHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKTtcblxuXHRcdGZvciAoaGFuZGxlciBpbiB0aGlzLl9oYW5kbGVycykge1xuXHRcdFx0dGhpcy5fY29yZS4kZWxlbWVudC5vZmYoaGFuZGxlciwgdGhpcy5faGFuZGxlcnNbaGFuZGxlcl0pO1xuXHRcdH1cblx0XHRmb3IgKHByb3BlcnR5IGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG5cdFx0XHR0eXBlb2YgdGhpc1twcm9wZXJ0eV0gIT0gJ2Z1bmN0aW9uJyAmJiAodGhpc1twcm9wZXJ0eV0gPSBudWxsKTtcblx0XHR9XG5cdH07XG5cblx0JC5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLkF1dG9SZWZyZXNoID0gQXV0b1JlZnJlc2g7XG5cbn0pKHdpbmRvdy5aZXB0byB8fCB3aW5kb3cualF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50KTtcblxuLyoqXG4gKiBMYXp5IFBsdWdpblxuICogQHZlcnNpb24gMi4xLjBcbiAqIEBhdXRob3IgQmFydG9zeiBXb2pjaWVjaG93c2tpXG4gKiBAYXV0aG9yIERhdmlkIERldXRzY2hcbiAqIEBsaWNlbnNlIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICovXG47KGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBsYXp5IHBsdWdpbi5cblx0ICogQGNsYXNzIFRoZSBMYXp5IFBsdWdpblxuXHQgKiBAcGFyYW0ge093bH0gY2Fyb3VzZWwgLSBUaGUgT3dsIENhcm91c2VsXG5cdCAqL1xuXHR2YXIgTGF6eSA9IGZ1bmN0aW9uKGNhcm91c2VsKSB7XG5cblx0XHQvKipcblx0XHQgKiBSZWZlcmVuY2UgdG8gdGhlIGNvcmUuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPd2x9XG5cdFx0ICovXG5cdFx0dGhpcy5fY29yZSA9IGNhcm91c2VsO1xuXG5cdFx0LyoqXG5cdFx0ICogQWxyZWFkeSBsb2FkZWQgaXRlbXMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtBcnJheS48alF1ZXJ5Pn1cblx0XHQgKi9cblx0XHR0aGlzLl9sb2FkZWQgPSBbXTtcblxuXHRcdC8qKlxuXHRcdCAqIEV2ZW50IGhhbmRsZXJzLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHRoaXMuX2hhbmRsZXJzID0ge1xuXHRcdFx0J2luaXRpYWxpemVkLm93bC5jYXJvdXNlbCBjaGFuZ2Uub3dsLmNhcm91c2VsIHJlc2l6ZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmICghZS5uYW1lc3BhY2UpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXRoaXMuX2NvcmUuc2V0dGluZ3MgfHwgIXRoaXMuX2NvcmUuc2V0dGluZ3MubGF6eUxvYWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoKGUucHJvcGVydHkgJiYgZS5wcm9wZXJ0eS5uYW1lID09ICdwb3NpdGlvbicpIHx8IGUudHlwZSA9PSAnaW5pdGlhbGl6ZWQnKSB7XG5cdFx0XHRcdFx0dmFyIHNldHRpbmdzID0gdGhpcy5fY29yZS5zZXR0aW5ncyxcblx0XHRcdFx0XHRcdG4gPSAoc2V0dGluZ3MuY2VudGVyICYmIE1hdGguY2VpbChzZXR0aW5ncy5pdGVtcyAvIDIpIHx8IHNldHRpbmdzLml0ZW1zKSxcblx0XHRcdFx0XHRcdGkgPSAoKHNldHRpbmdzLmNlbnRlciAmJiBuICogLTEpIHx8IDApLFxuXHRcdFx0XHRcdFx0cG9zaXRpb24gPSAoZS5wcm9wZXJ0eSAmJiBlLnByb3BlcnR5LnZhbHVlICE9PSB1bmRlZmluZWQgPyBlLnByb3BlcnR5LnZhbHVlIDogdGhpcy5fY29yZS5jdXJyZW50KCkpICsgaSxcblx0XHRcdFx0XHRcdGNsb25lcyA9IHRoaXMuX2NvcmUuY2xvbmVzKCkubGVuZ3RoLFxuXHRcdFx0XHRcdFx0bG9hZCA9ICQucHJveHkoZnVuY3Rpb24oaSwgdikgeyB0aGlzLmxvYWQodikgfSwgdGhpcyk7XG5cblx0XHRcdFx0XHR3aGlsZSAoaSsrIDwgbikge1xuXHRcdFx0XHRcdFx0dGhpcy5sb2FkKGNsb25lcyAvIDIgKyB0aGlzLl9jb3JlLnJlbGF0aXZlKHBvc2l0aW9uKSk7XG5cdFx0XHRcdFx0XHRjbG9uZXMgJiYgJC5lYWNoKHRoaXMuX2NvcmUuY2xvbmVzKHRoaXMuX2NvcmUucmVsYXRpdmUocG9zaXRpb24pKSwgbG9hZCk7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbisrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcylcblx0XHR9O1xuXG5cdFx0Ly8gc2V0IHRoZSBkZWZhdWx0IG9wdGlvbnNcblx0XHR0aGlzLl9jb3JlLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgTGF6eS5EZWZhdWx0cywgdGhpcy5fY29yZS5vcHRpb25zKTtcblxuXHRcdC8vIHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJcblx0XHR0aGlzLl9jb3JlLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKTtcblx0fTtcblxuXHQvKipcblx0ICogRGVmYXVsdCBvcHRpb25zLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRMYXp5LkRlZmF1bHRzID0ge1xuXHRcdGxhenlMb2FkOiBmYWxzZVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBMb2FkcyBhbGwgcmVzb3VyY2VzIG9mIGFuIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIC0gVGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBpdGVtLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRMYXp5LnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24ocG9zaXRpb24pIHtcblx0XHR2YXIgJGl0ZW0gPSB0aGlzLl9jb3JlLiRzdGFnZS5jaGlsZHJlbigpLmVxKHBvc2l0aW9uKSxcblx0XHRcdCRlbGVtZW50cyA9ICRpdGVtICYmICRpdGVtLmZpbmQoJy5vd2wtbGF6eScpO1xuXG5cdFx0aWYgKCEkZWxlbWVudHMgfHwgJC5pbkFycmF5KCRpdGVtLmdldCgwKSwgdGhpcy5fbG9hZGVkKSA+IC0xKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0JGVsZW1lbnRzLmVhY2goJC5wcm94eShmdW5jdGlvbihpbmRleCwgZWxlbWVudCkge1xuXHRcdFx0dmFyICRlbGVtZW50ID0gJChlbGVtZW50KSwgaW1hZ2UsXG5cdFx0XHRcdHVybCA9ICh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA+IDEgJiYgJGVsZW1lbnQuYXR0cignZGF0YS1zcmMtcmV0aW5hJykpIHx8ICRlbGVtZW50LmF0dHIoJ2RhdGEtc3JjJyk7XG5cblx0XHRcdHRoaXMuX2NvcmUudHJpZ2dlcignbG9hZCcsIHsgZWxlbWVudDogJGVsZW1lbnQsIHVybDogdXJsIH0sICdsYXp5Jyk7XG5cblx0XHRcdGlmICgkZWxlbWVudC5pcygnaW1nJykpIHtcblx0XHRcdFx0JGVsZW1lbnQub25lKCdsb2FkLm93bC5sYXp5JywgJC5wcm94eShmdW5jdGlvbigpIHtcblx0XHRcdFx0XHQkZWxlbWVudC5jc3MoJ29wYWNpdHknLCAxKTtcblx0XHRcdFx0XHR0aGlzLl9jb3JlLnRyaWdnZXIoJ2xvYWRlZCcsIHsgZWxlbWVudDogJGVsZW1lbnQsIHVybDogdXJsIH0sICdsYXp5Jyk7XG5cdFx0XHRcdH0sIHRoaXMpKS5hdHRyKCdzcmMnLCB1cmwpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW1hZ2UgPSBuZXcgSW1hZ2UoKTtcblx0XHRcdFx0aW1hZ2Uub25sb2FkID0gJC5wcm94eShmdW5jdGlvbigpIHtcblx0XHRcdFx0XHQkZWxlbWVudC5jc3Moe1xuXHRcdFx0XHRcdFx0J2JhY2tncm91bmQtaW1hZ2UnOiAndXJsKCcgKyB1cmwgKyAnKScsXG5cdFx0XHRcdFx0XHQnb3BhY2l0eSc6ICcxJ1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRoaXMuX2NvcmUudHJpZ2dlcignbG9hZGVkJywgeyBlbGVtZW50OiAkZWxlbWVudCwgdXJsOiB1cmwgfSwgJ2xhenknKTtcblx0XHRcdFx0fSwgdGhpcyk7XG5cdFx0XHRcdGltYWdlLnNyYyA9IHVybDtcblx0XHRcdH1cblx0XHR9LCB0aGlzKSk7XG5cblx0XHR0aGlzLl9sb2FkZWQucHVzaCgkaXRlbS5nZXQoMCkpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZXN0cm95cyB0aGUgcGx1Z2luLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRMYXp5LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhhbmRsZXIsIHByb3BlcnR5O1xuXG5cdFx0Zm9yIChoYW5kbGVyIGluIHRoaXMuaGFuZGxlcnMpIHtcblx0XHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQub2ZmKGhhbmRsZXIsIHRoaXMuaGFuZGxlcnNbaGFuZGxlcl0pO1xuXHRcdH1cblx0XHRmb3IgKHByb3BlcnR5IGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG5cdFx0XHR0eXBlb2YgdGhpc1twcm9wZXJ0eV0gIT0gJ2Z1bmN0aW9uJyAmJiAodGhpc1twcm9wZXJ0eV0gPSBudWxsKTtcblx0XHR9XG5cdH07XG5cblx0JC5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLkxhenkgPSBMYXp5O1xuXG59KSh3aW5kb3cuWmVwdG8gfHwgd2luZG93LmpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG5cbi8qKlxuICogQXV0b0hlaWdodCBQbHVnaW5cbiAqIEB2ZXJzaW9uIDIuMS4wXG4gKiBAYXV0aG9yIEJhcnRvc3ogV29qY2llY2hvd3NraVxuICogQGF1dGhvciBEYXZpZCBEZXV0c2NoXG4gKiBAbGljZW5zZSBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqL1xuOyhmdW5jdGlvbigkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgYXV0byBoZWlnaHQgcGx1Z2luLlxuXHQgKiBAY2xhc3MgVGhlIEF1dG8gSGVpZ2h0IFBsdWdpblxuXHQgKiBAcGFyYW0ge093bH0gY2Fyb3VzZWwgLSBUaGUgT3dsIENhcm91c2VsXG5cdCAqL1xuXHR2YXIgQXV0b0hlaWdodCA9IGZ1bmN0aW9uKGNhcm91c2VsKSB7XG5cdFx0LyoqXG5cdFx0ICogUmVmZXJlbmNlIHRvIHRoZSBjb3JlLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T3dsfVxuXHRcdCAqL1xuXHRcdHRoaXMuX2NvcmUgPSBjYXJvdXNlbDtcblxuXHRcdC8qKlxuXHRcdCAqIEFsbCBldmVudCBoYW5kbGVycy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0XHR0aGlzLl9oYW5kbGVycyA9IHtcblx0XHRcdCdpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWwgcmVmcmVzaGVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvSGVpZ2h0KSB7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQnY2hhbmdlZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodCAmJiBlLnByb3BlcnR5Lm5hbWUgPT0gJ3Bvc2l0aW9uJyl7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQnbG9hZGVkLm93bC5sYXp5JzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiB0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9IZWlnaHRcblx0XHRcdFx0XHQmJiBlLmVsZW1lbnQuY2xvc2VzdCgnLicgKyB0aGlzLl9jb3JlLnNldHRpbmdzLml0ZW1DbGFzcykuaW5kZXgoKSA9PT0gdGhpcy5fY29yZS5jdXJyZW50KCkpIHtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKVxuXHRcdH07XG5cblx0XHQvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG5cdFx0dGhpcy5fY29yZS5vcHRpb25zID0gJC5leHRlbmQoe30sIEF1dG9IZWlnaHQuRGVmYXVsdHMsIHRoaXMuX2NvcmUub3B0aW9ucyk7XG5cblx0XHQvLyByZWdpc3RlciBldmVudCBoYW5kbGVyc1xuXHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZWZhdWx0IG9wdGlvbnMuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEF1dG9IZWlnaHQuRGVmYXVsdHMgPSB7XG5cdFx0YXV0b0hlaWdodDogZmFsc2UsXG5cdFx0YXV0b0hlaWdodENsYXNzOiAnb3dsLWhlaWdodCdcblx0fTtcblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgdmlldy5cblx0ICovXG5cdEF1dG9IZWlnaHQucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzdGFydCA9IHRoaXMuX2NvcmUuX2N1cnJlbnQsXG5cdFx0XHRlbmQgPSBzdGFydCArIHRoaXMuX2NvcmUuc2V0dGluZ3MuaXRlbXMsXG5cdFx0XHR2aXNpYmxlID0gdGhpcy5fY29yZS4kc3RhZ2UuY2hpbGRyZW4oKS50b0FycmF5KCkuc2xpY2Uoc3RhcnQsIGVuZCksXG5cdFx0XHRoZWlnaHRzID0gW10sXG5cdFx0XHRtYXhoZWlnaHQgPSAwO1xuXG5cdFx0JC5lYWNoKHZpc2libGUsIGZ1bmN0aW9uKGluZGV4LCBpdGVtKSB7XG5cdFx0XHRoZWlnaHRzLnB1c2goJChpdGVtKS5oZWlnaHQoKSk7XG5cdFx0fSk7XG5cblx0XHRtYXhoZWlnaHQgPSBNYXRoLm1heC5hcHBseShudWxsLCBoZWlnaHRzKTtcblxuXHRcdHRoaXMuX2NvcmUuJHN0YWdlLnBhcmVudCgpXG5cdFx0XHQuaGVpZ2h0KG1heGhlaWdodClcblx0XHRcdC5hZGRDbGFzcyh0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9IZWlnaHRDbGFzcyk7XG5cdH07XG5cblx0QXV0b0hlaWdodC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBoYW5kbGVyLCBwcm9wZXJ0eTtcblxuXHRcdGZvciAoaGFuZGxlciBpbiB0aGlzLl9oYW5kbGVycykge1xuXHRcdFx0dGhpcy5fY29yZS4kZWxlbWVudC5vZmYoaGFuZGxlciwgdGhpcy5faGFuZGxlcnNbaGFuZGxlcl0pO1xuXHRcdH1cblx0XHRmb3IgKHByb3BlcnR5IGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG5cdFx0XHR0eXBlb2YgdGhpc1twcm9wZXJ0eV0gIT0gJ2Z1bmN0aW9uJyAmJiAodGhpc1twcm9wZXJ0eV0gPSBudWxsKTtcblx0XHR9XG5cdH07XG5cblx0JC5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLkF1dG9IZWlnaHQgPSBBdXRvSGVpZ2h0O1xuXG59KSh3aW5kb3cuWmVwdG8gfHwgd2luZG93LmpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG5cbi8qKlxuICogVmlkZW8gUGx1Z2luXG4gKiBAdmVyc2lvbiAyLjEuMFxuICogQGF1dGhvciBCYXJ0b3N6IFdvamNpZWNob3dza2lcbiAqIEBhdXRob3IgRGF2aWQgRGV1dHNjaFxuICogQGxpY2Vuc2UgVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKi9cbjsoZnVuY3Rpb24oJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIHZpZGVvIHBsdWdpbi5cblx0ICogQGNsYXNzIFRoZSBWaWRlbyBQbHVnaW5cblx0ICogQHBhcmFtIHtPd2x9IGNhcm91c2VsIC0gVGhlIE93bCBDYXJvdXNlbFxuXHQgKi9cblx0dmFyIFZpZGVvID0gZnVuY3Rpb24oY2Fyb3VzZWwpIHtcblx0XHQvKipcblx0XHQgKiBSZWZlcmVuY2UgdG8gdGhlIGNvcmUuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPd2x9XG5cdFx0ICovXG5cdFx0dGhpcy5fY29yZSA9IGNhcm91c2VsO1xuXG5cdFx0LyoqXG5cdFx0ICogQ2FjaGUgYWxsIHZpZGVvIFVSTHMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dGhpcy5fdmlkZW9zID0ge307XG5cblx0XHQvKipcblx0XHQgKiBDdXJyZW50IHBsYXlpbmcgaXRlbS5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge2pRdWVyeX1cblx0XHQgKi9cblx0XHR0aGlzLl9wbGF5aW5nID0gbnVsbDtcblxuXHRcdC8qKlxuXHRcdCAqIEFsbCBldmVudCBoYW5kbGVycy5cblx0XHQgKiBAdG9kbyBUaGUgY2xvbmVkIGNvbnRlbnQgcmVtb3ZhbGUgaXMgdG9vIGxhdGVcblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0XHR0aGlzLl9oYW5kbGVycyA9IHtcblx0XHRcdCdpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlKSB7XG5cdFx0XHRcdFx0dGhpcy5fY29yZS5yZWdpc3Rlcih7IHR5cGU6ICdzdGF0ZScsIG5hbWU6ICdwbGF5aW5nJywgdGFnczogWyAnaW50ZXJhY3RpbmcnIF0gfSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J3Jlc2l6ZS5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIHRoaXMuX2NvcmUuc2V0dGluZ3MudmlkZW8gJiYgdGhpcy5pc0luRnVsbFNjcmVlbigpKSB7XG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdyZWZyZXNoZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiB0aGlzLl9jb3JlLmlzKCdyZXNpemluZycpKSB7XG5cdFx0XHRcdFx0dGhpcy5fY29yZS4kc3RhZ2UuZmluZCgnLmNsb25lZCAub3dsLXZpZGVvLWZyYW1lJykucmVtb3ZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J2NoYW5nZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiBlLnByb3BlcnR5Lm5hbWUgPT09ICdwb3NpdGlvbicgJiYgdGhpcy5fcGxheWluZykge1xuXHRcdFx0XHRcdHRoaXMuc3RvcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdwcmVwYXJlZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKCFlLm5hbWVzcGFjZSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciAkZWxlbWVudCA9ICQoZS5jb250ZW50KS5maW5kKCcub3dsLXZpZGVvJyk7XG5cblx0XHRcdFx0aWYgKCRlbGVtZW50Lmxlbmd0aCkge1xuXHRcdFx0XHRcdCRlbGVtZW50LmNzcygnZGlzcGxheScsICdub25lJyk7XG5cdFx0XHRcdFx0dGhpcy5mZXRjaCgkZWxlbWVudCwgJChlLmNvbnRlbnQpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcylcblx0XHR9O1xuXG5cdFx0Ly8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuXHRcdHRoaXMuX2NvcmUub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBWaWRlby5EZWZhdWx0cywgdGhpcy5fY29yZS5vcHRpb25zKTtcblxuXHRcdC8vIHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzXG5cdFx0dGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyk7XG5cblx0XHR0aGlzLl9jb3JlLiRlbGVtZW50Lm9uKCdjbGljay5vd2wudmlkZW8nLCAnLm93bC12aWRlby1wbGF5LWljb24nLCAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdHRoaXMucGxheShlKTtcblx0XHR9LCB0aGlzKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlZmF1bHQgb3B0aW9ucy5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0VmlkZW8uRGVmYXVsdHMgPSB7XG5cdFx0dmlkZW86IGZhbHNlLFxuXHRcdHZpZGVvSGVpZ2h0OiBmYWxzZSxcblx0XHR2aWRlb1dpZHRoOiBmYWxzZVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSB2aWRlbyBJRCBhbmQgdGhlIHR5cGUgKFlvdVR1YmUvVmltZW8vdnphYXIgb25seSkuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtqUXVlcnl9IHRhcmdldCAtIFRoZSB0YXJnZXQgY29udGFpbmluZyB0aGUgdmlkZW8gZGF0YS5cblx0ICogQHBhcmFtIHtqUXVlcnl9IGl0ZW0gLSBUaGUgaXRlbSBjb250YWluaW5nIHRoZSB2aWRlby5cblx0ICovXG5cdFZpZGVvLnByb3RvdHlwZS5mZXRjaCA9IGZ1bmN0aW9uKHRhcmdldCwgaXRlbSkge1xuXHRcdFx0dmFyIHR5cGUgPSAoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKHRhcmdldC5hdHRyKCdkYXRhLXZpbWVvLWlkJykpIHtcblx0XHRcdFx0XHRcdHJldHVybiAndmltZW8nO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGFyZ2V0LmF0dHIoJ2RhdGEtdnphYXItaWQnKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuICd2emFhcidcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuICd5b3V0dWJlJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pKCksXG5cdFx0XHRcdGlkID0gdGFyZ2V0LmF0dHIoJ2RhdGEtdmltZW8taWQnKSB8fCB0YXJnZXQuYXR0cignZGF0YS15b3V0dWJlLWlkJykgfHwgdGFyZ2V0LmF0dHIoJ2RhdGEtdnphYXItaWQnKSxcblx0XHRcdFx0d2lkdGggPSB0YXJnZXQuYXR0cignZGF0YS13aWR0aCcpIHx8IHRoaXMuX2NvcmUuc2V0dGluZ3MudmlkZW9XaWR0aCxcblx0XHRcdFx0aGVpZ2h0ID0gdGFyZ2V0LmF0dHIoJ2RhdGEtaGVpZ2h0JykgfHwgdGhpcy5fY29yZS5zZXR0aW5ncy52aWRlb0hlaWdodCxcblx0XHRcdFx0dXJsID0gdGFyZ2V0LmF0dHIoJ2hyZWYnKTtcblxuXHRcdGlmICh1cmwpIHtcblxuXHRcdFx0Lypcblx0XHRcdFx0XHRQYXJzZXMgdGhlIGlkJ3Mgb3V0IG9mIHRoZSBmb2xsb3dpbmcgdXJscyAoYW5kIHByb2JhYmx5IG1vcmUpOlxuXHRcdFx0XHRcdGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9OmlkXG5cdFx0XHRcdFx0aHR0cHM6Ly95b3V0dS5iZS86aWRcblx0XHRcdFx0XHRodHRwczovL3ZpbWVvLmNvbS86aWRcblx0XHRcdFx0XHRodHRwczovL3ZpbWVvLmNvbS9jaGFubmVscy86Y2hhbm5lbC86aWRcblx0XHRcdFx0XHRodHRwczovL3ZpbWVvLmNvbS9ncm91cHMvOmdyb3VwL3ZpZGVvcy86aWRcblx0XHRcdFx0XHRodHRwczovL2FwcC52emFhci5jb20vdmlkZW9zLzppZFxuXG5cdFx0XHRcdFx0VmlzdWFsIGV4YW1wbGU6IGh0dHBzOi8vcmVnZXhwZXIuY29tLyMoaHR0cCUzQSU3Q2h0dHBzJTNBJTdDKSU1QyUyRiU1QyUyRihwbGF5ZXIuJTdDd3d3LiU3Q2FwcC4pJTNGKHZpbWVvJTVDLmNvbSU3Q3lvdXR1KGJlJTVDLmNvbSU3QyU1Qy5iZSU3Q2JlJTVDLmdvb2dsZWFwaXMlNUMuY29tKSU3Q3Z6YWFyJTVDLmNvbSklNUMlMkYodmlkZW8lNUMlMkYlN0N2aWRlb3MlNUMlMkYlN0NlbWJlZCU1QyUyRiU3Q2NoYW5uZWxzJTVDJTJGLiUyQiU1QyUyRiU3Q2dyb3VwcyU1QyUyRi4lMkIlNUMlMkYlN0N3YXRjaCU1QyUzRnYlM0QlN0N2JTVDJTJGKSUzRiglNUJBLVphLXowLTkuXyUyNS0lNUQqKSglNUMlMjYlNUNTJTJCKSUzRlxuXHRcdFx0Ki9cblxuXHRcdFx0aWQgPSB1cmwubWF0Y2goLyhodHRwOnxodHRwczp8KVxcL1xcLyhwbGF5ZXIufHd3dy58YXBwLik/KHZpbWVvXFwuY29tfHlvdXR1KGJlXFwuY29tfFxcLmJlfGJlXFwuZ29vZ2xlYXBpc1xcLmNvbSl8dnphYXJcXC5jb20pXFwvKHZpZGVvXFwvfHZpZGVvc1xcL3xlbWJlZFxcL3xjaGFubmVsc1xcLy4rXFwvfGdyb3Vwc1xcLy4rXFwvfHdhdGNoXFw/dj18dlxcLyk/KFtBLVphLXowLTkuXyUtXSopKFxcJlxcUyspPy8pO1xuXG5cdFx0XHRpZiAoaWRbM10uaW5kZXhPZigneW91dHUnKSA+IC0xKSB7XG5cdFx0XHRcdHR5cGUgPSAneW91dHViZSc7XG5cdFx0XHR9IGVsc2UgaWYgKGlkWzNdLmluZGV4T2YoJ3ZpbWVvJykgPiAtMSkge1xuXHRcdFx0XHR0eXBlID0gJ3ZpbWVvJztcblx0XHRcdH0gZWxzZSBpZiAoaWRbM10uaW5kZXhPZigndnphYXInKSA+IC0xKSB7XG5cdFx0XHRcdHR5cGUgPSAndnphYXInO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdWaWRlbyBVUkwgbm90IHN1cHBvcnRlZC4nKTtcblx0XHRcdH1cblx0XHRcdGlkID0gaWRbNl07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignTWlzc2luZyB2aWRlbyBVUkwuJyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fdmlkZW9zW3VybF0gPSB7XG5cdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0aWQ6IGlkLFxuXHRcdFx0d2lkdGg6IHdpZHRoLFxuXHRcdFx0aGVpZ2h0OiBoZWlnaHRcblx0XHR9O1xuXG5cdFx0aXRlbS5hdHRyKCdkYXRhLXZpZGVvJywgdXJsKTtcblxuXHRcdHRoaXMudGh1bWJuYWlsKHRhcmdldCwgdGhpcy5fdmlkZW9zW3VybF0pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHZpZGVvIHRodW1ibmFpbC5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge2pRdWVyeX0gdGFyZ2V0IC0gVGhlIHRhcmdldCBjb250YWluaW5nIHRoZSB2aWRlbyBkYXRhLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gaW5mbyAtIFRoZSB2aWRlbyBpbmZvIG9iamVjdC5cblx0ICogQHNlZSBgZmV0Y2hgXG5cdCAqL1xuXHRWaWRlby5wcm90b3R5cGUudGh1bWJuYWlsID0gZnVuY3Rpb24odGFyZ2V0LCB2aWRlbykge1xuXHRcdHZhciB0bkxpbmssXG5cdFx0XHRpY29uLFxuXHRcdFx0cGF0aCxcblx0XHRcdGRpbWVuc2lvbnMgPSB2aWRlby53aWR0aCAmJiB2aWRlby5oZWlnaHQgPyAnc3R5bGU9XCJ3aWR0aDonICsgdmlkZW8ud2lkdGggKyAncHg7aGVpZ2h0OicgKyB2aWRlby5oZWlnaHQgKyAncHg7XCInIDogJycsXG5cdFx0XHRjdXN0b21UbiA9IHRhcmdldC5maW5kKCdpbWcnKSxcblx0XHRcdHNyY1R5cGUgPSAnc3JjJyxcblx0XHRcdGxhenlDbGFzcyA9ICcnLFxuXHRcdFx0c2V0dGluZ3MgPSB0aGlzLl9jb3JlLnNldHRpbmdzLFxuXHRcdFx0Y3JlYXRlID0gZnVuY3Rpb24ocGF0aCkge1xuXHRcdFx0XHRpY29uID0gJzxkaXYgY2xhc3M9XCJvd2wtdmlkZW8tcGxheS1pY29uXCI+PC9kaXY+JztcblxuXHRcdFx0XHRpZiAoc2V0dGluZ3MubGF6eUxvYWQpIHtcblx0XHRcdFx0XHR0bkxpbmsgPSAnPGRpdiBjbGFzcz1cIm93bC12aWRlby10biAnICsgbGF6eUNsYXNzICsgJ1wiICcgKyBzcmNUeXBlICsgJz1cIicgKyBwYXRoICsgJ1wiPjwvZGl2Pic7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dG5MaW5rID0gJzxkaXYgY2xhc3M9XCJvd2wtdmlkZW8tdG5cIiBzdHlsZT1cIm9wYWNpdHk6MTtiYWNrZ3JvdW5kLWltYWdlOnVybCgnICsgcGF0aCArICcpXCI+PC9kaXY+Jztcblx0XHRcdFx0fVxuXHRcdFx0XHR0YXJnZXQuYWZ0ZXIodG5MaW5rKTtcblx0XHRcdFx0dGFyZ2V0LmFmdGVyKGljb24pO1xuXHRcdFx0fTtcblxuXHRcdC8vIHdyYXAgdmlkZW8gY29udGVudCBpbnRvIG93bC12aWRlby13cmFwcGVyIGRpdlxuXHRcdHRhcmdldC53cmFwKCc8ZGl2IGNsYXNzPVwib3dsLXZpZGVvLXdyYXBwZXJcIicgKyBkaW1lbnNpb25zICsgJz48L2Rpdj4nKTtcblxuXHRcdGlmICh0aGlzLl9jb3JlLnNldHRpbmdzLmxhenlMb2FkKSB7XG5cdFx0XHRzcmNUeXBlID0gJ2RhdGEtc3JjJztcblx0XHRcdGxhenlDbGFzcyA9ICdvd2wtbGF6eSc7XG5cdFx0fVxuXG5cdFx0Ly8gY3VzdG9tIHRodW1ibmFpbFxuXHRcdGlmIChjdXN0b21Ubi5sZW5ndGgpIHtcblx0XHRcdGNyZWF0ZShjdXN0b21Ubi5hdHRyKHNyY1R5cGUpKTtcblx0XHRcdGN1c3RvbVRuLnJlbW92ZSgpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICh2aWRlby50eXBlID09PSAneW91dHViZScpIHtcblx0XHRcdHBhdGggPSBcIi8vaW1nLnlvdXR1YmUuY29tL3ZpL1wiICsgdmlkZW8uaWQgKyBcIi9ocWRlZmF1bHQuanBnXCI7XG5cdFx0XHRjcmVhdGUocGF0aCk7XG5cdFx0fSBlbHNlIGlmICh2aWRlby50eXBlID09PSAndmltZW8nKSB7XG5cdFx0XHQkLmFqYXgoe1xuXHRcdFx0XHR0eXBlOiAnR0VUJyxcblx0XHRcdFx0dXJsOiAnLy92aW1lby5jb20vYXBpL3YyL3ZpZGVvLycgKyB2aWRlby5pZCArICcuanNvbicsXG5cdFx0XHRcdGpzb25wOiAnY2FsbGJhY2snLFxuXHRcdFx0XHRkYXRhVHlwZTogJ2pzb25wJyxcblx0XHRcdFx0c3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuXHRcdFx0XHRcdHBhdGggPSBkYXRhWzBdLnRodW1ibmFpbF9sYXJnZTtcblx0XHRcdFx0XHRjcmVhdGUocGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAodmlkZW8udHlwZSA9PT0gJ3Z6YWFyJykge1xuXHRcdFx0JC5hamF4KHtcblx0XHRcdFx0dHlwZTogJ0dFVCcsXG5cdFx0XHRcdHVybDogJy8vdnphYXIuY29tL2FwaS92aWRlb3MvJyArIHZpZGVvLmlkICsgJy5qc29uJyxcblx0XHRcdFx0anNvbnA6ICdjYWxsYmFjaycsXG5cdFx0XHRcdGRhdGFUeXBlOiAnanNvbnAnLFxuXHRcdFx0XHRzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG5cdFx0XHRcdFx0cGF0aCA9IGRhdGEuZnJhbWVncmFiX3VybDtcblx0XHRcdFx0XHRjcmVhdGUocGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogU3RvcHMgdGhlIGN1cnJlbnQgdmlkZW8uXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdFZpZGVvLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5fY29yZS50cmlnZ2VyKCdzdG9wJywgbnVsbCwgJ3ZpZGVvJyk7XG5cdFx0dGhpcy5fcGxheWluZy5maW5kKCcub3dsLXZpZGVvLWZyYW1lJykucmVtb3ZlKCk7XG5cdFx0dGhpcy5fcGxheWluZy5yZW1vdmVDbGFzcygnb3dsLXZpZGVvLXBsYXlpbmcnKTtcblx0XHR0aGlzLl9wbGF5aW5nID0gbnVsbDtcblx0XHR0aGlzLl9jb3JlLmxlYXZlKCdwbGF5aW5nJyk7XG5cdFx0dGhpcy5fY29yZS50cmlnZ2VyKCdzdG9wcGVkJywgbnVsbCwgJ3ZpZGVvJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFN0YXJ0cyB0aGUgY3VycmVudCB2aWRlby5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIFRoZSBldmVudCBhcmd1bWVudHMuXG5cdCAqL1xuXHRWaWRlby5wcm90b3R5cGUucGxheSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0dmFyIHRhcmdldCA9ICQoZXZlbnQudGFyZ2V0KSxcblx0XHRcdGl0ZW0gPSB0YXJnZXQuY2xvc2VzdCgnLicgKyB0aGlzLl9jb3JlLnNldHRpbmdzLml0ZW1DbGFzcyksXG5cdFx0XHR2aWRlbyA9IHRoaXMuX3ZpZGVvc1tpdGVtLmF0dHIoJ2RhdGEtdmlkZW8nKV0sXG5cdFx0XHR3aWR0aCA9IHZpZGVvLndpZHRoIHx8ICcxMDAlJyxcblx0XHRcdGhlaWdodCA9IHZpZGVvLmhlaWdodCB8fCB0aGlzLl9jb3JlLiRzdGFnZS5oZWlnaHQoKSxcblx0XHRcdGh0bWw7XG5cblx0XHRpZiAodGhpcy5fcGxheWluZykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX2NvcmUuZW50ZXIoJ3BsYXlpbmcnKTtcblx0XHR0aGlzLl9jb3JlLnRyaWdnZXIoJ3BsYXknLCBudWxsLCAndmlkZW8nKTtcblxuXHRcdGl0ZW0gPSB0aGlzLl9jb3JlLml0ZW1zKHRoaXMuX2NvcmUucmVsYXRpdmUoaXRlbS5pbmRleCgpKSk7XG5cblx0XHR0aGlzLl9jb3JlLnJlc2V0KGl0ZW0uaW5kZXgoKSk7XG5cblx0XHRpZiAodmlkZW8udHlwZSA9PT0gJ3lvdXR1YmUnKSB7XG5cdFx0XHRodG1sID0gJzxpZnJhbWUgd2lkdGg9XCInICsgd2lkdGggKyAnXCIgaGVpZ2h0PVwiJyArIGhlaWdodCArICdcIiBzcmM9XCIvL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8nICtcblx0XHRcdFx0dmlkZW8uaWQgKyAnP2F1dG9wbGF5PTEmdj0nICsgdmlkZW8uaWQgKyAnXCIgZnJhbWVib3JkZXI9XCIwXCIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPic7XG5cdFx0fSBlbHNlIGlmICh2aWRlby50eXBlID09PSAndmltZW8nKSB7XG5cdFx0XHRodG1sID0gJzxpZnJhbWUgc3JjPVwiLy9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLycgKyB2aWRlby5pZCArXG5cdFx0XHRcdCc/YXV0b3BsYXk9MVwiIHdpZHRoPVwiJyArIHdpZHRoICsgJ1wiIGhlaWdodD1cIicgKyBoZWlnaHQgK1xuXHRcdFx0XHQnXCIgZnJhbWVib3JkZXI9XCIwXCIgd2Via2l0YWxsb3dmdWxsc2NyZWVuIG1vemFsbG93ZnVsbHNjcmVlbiBhbGxvd2Z1bGxzY3JlZW4+PC9pZnJhbWU+Jztcblx0XHR9IGVsc2UgaWYgKHZpZGVvLnR5cGUgPT09ICd2emFhcicpIHtcblx0XHRcdGh0bWwgPSAnPGlmcmFtZSBmcmFtZWJvcmRlcj1cIjBcIicgKyAnaGVpZ2h0PVwiJyArIGhlaWdodCArICdcIicgKyAnd2lkdGg9XCInICsgd2lkdGggK1xuXHRcdFx0XHQnXCIgYWxsb3dmdWxsc2NyZWVuIG1vemFsbG93ZnVsbHNjcmVlbiB3ZWJraXRBbGxvd0Z1bGxTY3JlZW4gJyArXG5cdFx0XHRcdCdzcmM9XCIvL3ZpZXcudnphYXIuY29tLycgKyB2aWRlby5pZCArICcvcGxheWVyP2F1dG9wbGF5PXRydWVcIj48L2lmcmFtZT4nO1xuXHRcdH1cblxuXHRcdCQoJzxkaXYgY2xhc3M9XCJvd2wtdmlkZW8tZnJhbWVcIj4nICsgaHRtbCArICc8L2Rpdj4nKS5pbnNlcnRBZnRlcihpdGVtLmZpbmQoJy5vd2wtdmlkZW8nKSk7XG5cblx0XHR0aGlzLl9wbGF5aW5nID0gaXRlbS5hZGRDbGFzcygnb3dsLXZpZGVvLXBsYXlpbmcnKTtcblx0fTtcblxuXHQvKipcblx0ICogQ2hlY2tzIHdoZXRoZXIgYW4gdmlkZW8gaXMgY3VycmVudGx5IGluIGZ1bGwgc2NyZWVuIG1vZGUgb3Igbm90LlxuXHQgKiBAdG9kbyBCYWQgc3R5bGUgYmVjYXVzZSBsb29rcyBsaWtlIGEgcmVhZG9ubHkgbWV0aG9kIGJ1dCBjaGFuZ2VzIG1lbWJlcnMuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHJldHVybnMge0Jvb2xlYW59XG5cdCAqL1xuXHRWaWRlby5wcm90b3R5cGUuaXNJbkZ1bGxTY3JlZW4gPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgZWxlbWVudCA9IGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbGVtZW50IHx8XG5cdFx0XHRcdGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50O1xuXG5cdFx0cmV0dXJuIGVsZW1lbnQgJiYgJChlbGVtZW50KS5wYXJlbnQoKS5oYXNDbGFzcygnb3dsLXZpZGVvLWZyYW1lJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlc3Ryb3lzIHRoZSBwbHVnaW4uXG5cdCAqL1xuXHRWaWRlby5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBoYW5kbGVyLCBwcm9wZXJ0eTtcblxuXHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQub2ZmKCdjbGljay5vd2wudmlkZW8nKTtcblxuXHRcdGZvciAoaGFuZGxlciBpbiB0aGlzLl9oYW5kbGVycykge1xuXHRcdFx0dGhpcy5fY29yZS4kZWxlbWVudC5vZmYoaGFuZGxlciwgdGhpcy5faGFuZGxlcnNbaGFuZGxlcl0pO1xuXHRcdH1cblx0XHRmb3IgKHByb3BlcnR5IGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG5cdFx0XHR0eXBlb2YgdGhpc1twcm9wZXJ0eV0gIT0gJ2Z1bmN0aW9uJyAmJiAodGhpc1twcm9wZXJ0eV0gPSBudWxsKTtcblx0XHR9XG5cdH07XG5cblx0JC5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLlZpZGVvID0gVmlkZW87XG5cbn0pKHdpbmRvdy5aZXB0byB8fCB3aW5kb3cualF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50KTtcblxuLyoqXG4gKiBBbmltYXRlIFBsdWdpblxuICogQHZlcnNpb24gMi4xLjBcbiAqIEBhdXRob3IgQmFydG9zeiBXb2pjaWVjaG93c2tpXG4gKiBAYXV0aG9yIERhdmlkIERldXRzY2hcbiAqIEBsaWNlbnNlIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICovXG47KGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBhbmltYXRlIHBsdWdpbi5cblx0ICogQGNsYXNzIFRoZSBOYXZpZ2F0aW9uIFBsdWdpblxuXHQgKiBAcGFyYW0ge093bH0gc2NvcGUgLSBUaGUgT3dsIENhcm91c2VsXG5cdCAqL1xuXHR2YXIgQW5pbWF0ZSA9IGZ1bmN0aW9uKHNjb3BlKSB7XG5cdFx0dGhpcy5jb3JlID0gc2NvcGU7XG5cdFx0dGhpcy5jb3JlLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgQW5pbWF0ZS5EZWZhdWx0cywgdGhpcy5jb3JlLm9wdGlvbnMpO1xuXHRcdHRoaXMuc3dhcHBpbmcgPSB0cnVlO1xuXHRcdHRoaXMucHJldmlvdXMgPSB1bmRlZmluZWQ7XG5cdFx0dGhpcy5uZXh0ID0gdW5kZWZpbmVkO1xuXG5cdFx0dGhpcy5oYW5kbGVycyA9IHtcblx0XHRcdCdjaGFuZ2Uub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiBlLnByb3BlcnR5Lm5hbWUgPT0gJ3Bvc2l0aW9uJykge1xuXHRcdFx0XHRcdHRoaXMucHJldmlvdXMgPSB0aGlzLmNvcmUuY3VycmVudCgpO1xuXHRcdFx0XHRcdHRoaXMubmV4dCA9IGUucHJvcGVydHkudmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J2RyYWcub3dsLmNhcm91c2VsIGRyYWdnZWQub3dsLmNhcm91c2VsIHRyYW5zbGF0ZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSkge1xuXHRcdFx0XHRcdHRoaXMuc3dhcHBpbmcgPSBlLnR5cGUgPT0gJ3RyYW5zbGF0ZWQnO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCd0cmFuc2xhdGUub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiB0aGlzLnN3YXBwaW5nICYmICh0aGlzLmNvcmUub3B0aW9ucy5hbmltYXRlT3V0IHx8IHRoaXMuY29yZS5vcHRpb25zLmFuaW1hdGVJbikpIHtcblx0XHRcdFx0XHR0aGlzLnN3YXAoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcylcblx0XHR9O1xuXG5cdFx0dGhpcy5jb3JlLiRlbGVtZW50Lm9uKHRoaXMuaGFuZGxlcnMpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZWZhdWx0IG9wdGlvbnMuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEFuaW1hdGUuRGVmYXVsdHMgPSB7XG5cdFx0YW5pbWF0ZU91dDogZmFsc2UsXG5cdFx0YW5pbWF0ZUluOiBmYWxzZVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBUb2dnbGVzIHRoZSBhbmltYXRpb24gY2xhc3NlcyB3aGVuZXZlciBhbiB0cmFuc2xhdGlvbnMgc3RhcnRzLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufHVuZGVmaW5lZH1cblx0ICovXG5cdEFuaW1hdGUucHJvdG90eXBlLnN3YXAgPSBmdW5jdGlvbigpIHtcblxuXHRcdGlmICh0aGlzLmNvcmUuc2V0dGluZ3MuaXRlbXMgIT09IDEpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoISQuc3VwcG9ydC5hbmltYXRpb24gfHwgISQuc3VwcG9ydC50cmFuc2l0aW9uKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5jb3JlLnNwZWVkKDApO1xuXG5cdFx0dmFyIGxlZnQsXG5cdFx0XHRjbGVhciA9ICQucHJveHkodGhpcy5jbGVhciwgdGhpcyksXG5cdFx0XHRwcmV2aW91cyA9IHRoaXMuY29yZS4kc3RhZ2UuY2hpbGRyZW4oKS5lcSh0aGlzLnByZXZpb3VzKSxcblx0XHRcdG5leHQgPSB0aGlzLmNvcmUuJHN0YWdlLmNoaWxkcmVuKCkuZXEodGhpcy5uZXh0KSxcblx0XHRcdGluY29taW5nID0gdGhpcy5jb3JlLnNldHRpbmdzLmFuaW1hdGVJbixcblx0XHRcdG91dGdvaW5nID0gdGhpcy5jb3JlLnNldHRpbmdzLmFuaW1hdGVPdXQ7XG5cblx0XHRpZiAodGhpcy5jb3JlLmN1cnJlbnQoKSA9PT0gdGhpcy5wcmV2aW91cykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChvdXRnb2luZykge1xuXHRcdFx0bGVmdCA9IHRoaXMuY29yZS5jb29yZGluYXRlcyh0aGlzLnByZXZpb3VzKSAtIHRoaXMuY29yZS5jb29yZGluYXRlcyh0aGlzLm5leHQpO1xuXHRcdFx0cHJldmlvdXMub25lKCQuc3VwcG9ydC5hbmltYXRpb24uZW5kLCBjbGVhcilcblx0XHRcdFx0LmNzcyggeyAnbGVmdCc6IGxlZnQgKyAncHgnIH0gKVxuXHRcdFx0XHQuYWRkQ2xhc3MoJ2FuaW1hdGVkIG93bC1hbmltYXRlZC1vdXQnKVxuXHRcdFx0XHQuYWRkQ2xhc3Mob3V0Z29pbmcpO1xuXHRcdH1cblxuXHRcdGlmIChpbmNvbWluZykge1xuXHRcdFx0bmV4dC5vbmUoJC5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsIGNsZWFyKVxuXHRcdFx0XHQuYWRkQ2xhc3MoJ2FuaW1hdGVkIG93bC1hbmltYXRlZC1pbicpXG5cdFx0XHRcdC5hZGRDbGFzcyhpbmNvbWluZyk7XG5cdFx0fVxuXHR9O1xuXG5cdEFuaW1hdGUucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oZSkge1xuXHRcdCQoZS50YXJnZXQpLmNzcyggeyAnbGVmdCc6ICcnIH0gKVxuXHRcdFx0LnJlbW92ZUNsYXNzKCdhbmltYXRlZCBvd2wtYW5pbWF0ZWQtb3V0IG93bC1hbmltYXRlZC1pbicpXG5cdFx0XHQucmVtb3ZlQ2xhc3ModGhpcy5jb3JlLnNldHRpbmdzLmFuaW1hdGVJbilcblx0XHRcdC5yZW1vdmVDbGFzcyh0aGlzLmNvcmUuc2V0dGluZ3MuYW5pbWF0ZU91dCk7XG5cdFx0dGhpcy5jb3JlLm9uVHJhbnNpdGlvbkVuZCgpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZXN0cm95cyB0aGUgcGx1Z2luLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRBbmltYXRlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhhbmRsZXIsIHByb3BlcnR5O1xuXG5cdFx0Zm9yIChoYW5kbGVyIGluIHRoaXMuaGFuZGxlcnMpIHtcblx0XHRcdHRoaXMuY29yZS4kZWxlbWVudC5vZmYoaGFuZGxlciwgdGhpcy5oYW5kbGVyc1toYW5kbGVyXSk7XG5cdFx0fVxuXHRcdGZvciAocHJvcGVydHkgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcblx0XHRcdHR5cGVvZiB0aGlzW3Byb3BlcnR5XSAhPSAnZnVuY3Rpb24nICYmICh0aGlzW3Byb3BlcnR5XSA9IG51bGwpO1xuXHRcdH1cblx0fTtcblxuXHQkLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuQW5pbWF0ZSA9IEFuaW1hdGU7XG5cbn0pKHdpbmRvdy5aZXB0byB8fCB3aW5kb3cualF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50KTtcblxuLyoqXG4gKiBBdXRvcGxheSBQbHVnaW5cbiAqIEB2ZXJzaW9uIDIuMS4wXG4gKiBAYXV0aG9yIEJhcnRvc3ogV29qY2llY2hvd3NraVxuICogQGF1dGhvciBBcnR1cyBLb2xhbm93c2tpXG4gKiBAYXV0aG9yIERhdmlkIERldXRzY2hcbiAqIEBsaWNlbnNlIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICovXG47KGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBhdXRvcGxheSBwbHVnaW4uXG5cdCAqIEBjbGFzcyBUaGUgQXV0b3BsYXkgUGx1Z2luXG5cdCAqIEBwYXJhbSB7T3dsfSBzY29wZSAtIFRoZSBPd2wgQ2Fyb3VzZWxcblx0ICovXG5cdHZhciBBdXRvcGxheSA9IGZ1bmN0aW9uKGNhcm91c2VsKSB7XG5cdFx0LyoqXG5cdFx0ICogUmVmZXJlbmNlIHRvIHRoZSBjb3JlLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T3dsfVxuXHRcdCAqL1xuXHRcdHRoaXMuX2NvcmUgPSBjYXJvdXNlbDtcblxuXHRcdC8qKlxuXHRcdCAqIFRoZSBhdXRvcGxheSB0aW1lb3V0LlxuXHRcdCAqIEB0eXBlIHtUaW1lb3V0fVxuXHRcdCAqL1xuXHRcdHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuXG5cdFx0LyoqXG5cdFx0ICogSW5kaWNhdGVzIHdoZW5ldmVyIHRoZSBhdXRvcGxheSBpcyBwYXVzZWQuXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dGhpcy5fcGF1c2VkID0gZmFsc2U7XG5cblx0XHQvKipcblx0XHQgKiBBbGwgZXZlbnQgaGFuZGxlcnMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dGhpcy5faGFuZGxlcnMgPSB7XG5cdFx0XHQnY2hhbmdlZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIGUucHJvcGVydHkubmFtZSA9PT0gJ3NldHRpbmdzJykge1xuXHRcdFx0XHRcdGlmICh0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5KSB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsYXkoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy5zdG9wKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGUubmFtZXNwYWNlICYmIGUucHJvcGVydHkubmFtZSA9PT0gJ3Bvc2l0aW9uJykge1xuXHRcdFx0XHRcdC8vY29uc29sZS5sb2coJ3BsYXk/JywgZSk7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXkpIHtcblx0XHRcdFx0XHRcdHRoaXMuX3NldEF1dG9QbGF5SW50ZXJ2YWwoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J2luaXRpYWxpemVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheSkge1xuXHRcdFx0XHRcdHRoaXMucGxheSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdwbGF5Lm93bC5hdXRvcGxheSc6ICQucHJveHkoZnVuY3Rpb24oZSwgdCwgcykge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UpIHtcblx0XHRcdFx0XHR0aGlzLnBsYXkodCwgcyk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J3N0b3Aub3dsLmF1dG9wbGF5JzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSkge1xuXHRcdFx0XHRcdHRoaXMuc3RvcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdtb3VzZW92ZXIub3dsLmF1dG9wbGF5JzogJC5wcm94eShmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXlIb3ZlclBhdXNlICYmIHRoaXMuX2NvcmUuaXMoJ3JvdGF0aW5nJykpIHtcblx0XHRcdFx0XHR0aGlzLnBhdXNlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J21vdXNlbGVhdmUub3dsLmF1dG9wbGF5JzogJC5wcm94eShmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXlIb3ZlclBhdXNlICYmIHRoaXMuX2NvcmUuaXMoJ3JvdGF0aW5nJykpIHtcblx0XHRcdFx0XHR0aGlzLnBsYXkoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQndG91Y2hzdGFydC5vd2wuY29yZSc6ICQucHJveHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5SG92ZXJQYXVzZSAmJiB0aGlzLl9jb3JlLmlzKCdyb3RhdGluZycpKSB7XG5cdFx0XHRcdFx0dGhpcy5wYXVzZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCd0b3VjaGVuZC5vd2wuY29yZSc6ICQucHJveHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5SG92ZXJQYXVzZSkge1xuXHRcdFx0XHRcdHRoaXMucGxheSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKVxuXHRcdH07XG5cblx0XHQvLyByZWdpc3RlciBldmVudCBoYW5kbGVyc1xuXHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpO1xuXG5cdFx0Ly8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuXHRcdHRoaXMuX2NvcmUub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBBdXRvcGxheS5EZWZhdWx0cywgdGhpcy5fY29yZS5vcHRpb25zKTtcblx0fTtcblxuXHQvKipcblx0ICogRGVmYXVsdCBvcHRpb25zLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRBdXRvcGxheS5EZWZhdWx0cyA9IHtcblx0XHRhdXRvcGxheTogZmFsc2UsXG5cdFx0YXV0b3BsYXlUaW1lb3V0OiA1MDAwLFxuXHRcdGF1dG9wbGF5SG92ZXJQYXVzZTogZmFsc2UsXG5cdFx0YXV0b3BsYXlTcGVlZDogZmFsc2Vcblx0fTtcblxuXHQvKipcblx0ICogU3RhcnRzIHRoZSBhdXRvcGxheS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gW3RpbWVvdXRdIC0gVGhlIGludGVydmFsIGJlZm9yZSB0aGUgbmV4dCBhbmltYXRpb24gc3RhcnRzLlxuXHQgKiBAcGFyYW0ge051bWJlcn0gW3NwZWVkXSAtIFRoZSBhbmltYXRpb24gc3BlZWQgZm9yIHRoZSBhbmltYXRpb25zLlxuXHQgKi9cblx0QXV0b3BsYXkucHJvdG90eXBlLnBsYXkgPSBmdW5jdGlvbih0aW1lb3V0LCBzcGVlZCkge1xuXHRcdHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xuXG5cdFx0aWYgKHRoaXMuX2NvcmUuaXMoJ3JvdGF0aW5nJykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9jb3JlLmVudGVyKCdyb3RhdGluZycpO1xuXG5cdFx0dGhpcy5fc2V0QXV0b1BsYXlJbnRlcnZhbCgpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIGEgbmV3IHRpbWVvdXRcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFt0aW1lb3V0XSAtIFRoZSBpbnRlcnZhbCBiZWZvcmUgdGhlIG5leHQgYW5pbWF0aW9uIHN0YXJ0cy5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtzcGVlZF0gLSBUaGUgYW5pbWF0aW9uIHNwZWVkIGZvciB0aGUgYW5pbWF0aW9ucy5cblx0ICogQHJldHVybiB7VGltZW91dH1cblx0ICovXG5cdEF1dG9wbGF5LnByb3RvdHlwZS5fZ2V0TmV4dFRpbWVvdXQgPSBmdW5jdGlvbih0aW1lb3V0LCBzcGVlZCkge1xuXHRcdGlmICggdGhpcy5fdGltZW91dCApIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG5cdFx0fVxuXHRcdHJldHVybiB3aW5kb3cuc2V0VGltZW91dCgkLnByb3h5KGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKHRoaXMuX3BhdXNlZCB8fCB0aGlzLl9jb3JlLmlzKCdidXN5JykgfHwgdGhpcy5fY29yZS5pcygnaW50ZXJhY3RpbmcnKSB8fCBkb2N1bWVudC5oaWRkZW4pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fY29yZS5uZXh0KHNwZWVkIHx8IHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXlTcGVlZCk7XG5cdFx0fSwgdGhpcyksIHRpbWVvdXQgfHwgdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheVRpbWVvdXQpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTZXRzIGF1dG9wbGF5IGluIG1vdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdEF1dG9wbGF5LnByb3RvdHlwZS5fc2V0QXV0b1BsYXlJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuX3RpbWVvdXQgPSB0aGlzLl9nZXROZXh0VGltZW91dCgpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTdG9wcyB0aGUgYXV0b3BsYXkuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEF1dG9wbGF5LnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLl9jb3JlLmlzKCdyb3RhdGluZycpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0d2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcblx0XHR0aGlzLl9jb3JlLmxlYXZlKCdyb3RhdGluZycpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTdG9wcyB0aGUgYXV0b3BsYXkuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEF1dG9wbGF5LnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5fY29yZS5pcygncm90YXRpbmcnKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX3BhdXNlZCA9IHRydWU7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlc3Ryb3lzIHRoZSBwbHVnaW4uXG5cdCAqL1xuXHRBdXRvcGxheS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBoYW5kbGVyLCBwcm9wZXJ0eTtcblxuXHRcdHRoaXMuc3RvcCgpO1xuXG5cdFx0Zm9yIChoYW5kbGVyIGluIHRoaXMuX2hhbmRsZXJzKSB7XG5cdFx0XHR0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihoYW5kbGVyLCB0aGlzLl9oYW5kbGVyc1toYW5kbGVyXSk7XG5cdFx0fVxuXHRcdGZvciAocHJvcGVydHkgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcblx0XHRcdHR5cGVvZiB0aGlzW3Byb3BlcnR5XSAhPSAnZnVuY3Rpb24nICYmICh0aGlzW3Byb3BlcnR5XSA9IG51bGwpO1xuXHRcdH1cblx0fTtcblxuXHQkLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuYXV0b3BsYXkgPSBBdXRvcGxheTtcblxufSkod2luZG93LlplcHRvIHx8IHdpbmRvdy5qUXVlcnksIHdpbmRvdywgZG9jdW1lbnQpO1xuXG4vKipcbiAqIE5hdmlnYXRpb24gUGx1Z2luXG4gKiBAdmVyc2lvbiAyLjEuMFxuICogQGF1dGhvciBBcnR1cyBLb2xhbm93c2tpXG4gKiBAYXV0aG9yIERhdmlkIERldXRzY2hcbiAqIEBsaWNlbnNlIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICovXG47KGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIG5hdmlnYXRpb24gcGx1Z2luLlxuXHQgKiBAY2xhc3MgVGhlIE5hdmlnYXRpb24gUGx1Z2luXG5cdCAqIEBwYXJhbSB7T3dsfSBjYXJvdXNlbCAtIFRoZSBPd2wgQ2Fyb3VzZWwuXG5cdCAqL1xuXHR2YXIgTmF2aWdhdGlvbiA9IGZ1bmN0aW9uKGNhcm91c2VsKSB7XG5cdFx0LyoqXG5cdFx0ICogUmVmZXJlbmNlIHRvIHRoZSBjb3JlLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T3dsfVxuXHRcdCAqL1xuXHRcdHRoaXMuX2NvcmUgPSBjYXJvdXNlbDtcblxuXHRcdC8qKlxuXHRcdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQgb3Igbm90LlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR0aGlzLl9pbml0aWFsaXplZCA9IGZhbHNlO1xuXG5cdFx0LyoqXG5cdFx0ICogVGhlIGN1cnJlbnQgcGFnaW5nIGluZGV4ZXMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtBcnJheX1cblx0XHQgKi9cblx0XHR0aGlzLl9wYWdlcyA9IFtdO1xuXG5cdFx0LyoqXG5cdFx0ICogQWxsIERPTSBlbGVtZW50cyBvZiB0aGUgdXNlciBpbnRlcmZhY2UuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dGhpcy5fY29udHJvbHMgPSB7fTtcblxuXHRcdC8qKlxuXHRcdCAqIE1hcmt1cCBmb3IgYW4gaW5kaWNhdG9yLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7QXJyYXkuPFN0cmluZz59XG5cdFx0ICovXG5cdFx0dGhpcy5fdGVtcGxhdGVzID0gW107XG5cblx0XHQvKipcblx0XHQgKiBUaGUgY2Fyb3VzZWwgZWxlbWVudC5cblx0XHQgKiBAdHlwZSB7alF1ZXJ5fVxuXHRcdCAqL1xuXHRcdHRoaXMuJGVsZW1lbnQgPSB0aGlzLl9jb3JlLiRlbGVtZW50O1xuXG5cdFx0LyoqXG5cdFx0ICogT3ZlcnJpZGRlbiBtZXRob2RzIG9mIHRoZSBjYXJvdXNlbC5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0XHR0aGlzLl9vdmVycmlkZXMgPSB7XG5cdFx0XHRuZXh0OiB0aGlzLl9jb3JlLm5leHQsXG5cdFx0XHRwcmV2OiB0aGlzLl9jb3JlLnByZXYsXG5cdFx0XHR0bzogdGhpcy5fY29yZS50b1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBBbGwgZXZlbnQgaGFuZGxlcnMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dGhpcy5faGFuZGxlcnMgPSB7XG5cdFx0XHQncHJlcGFyZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiB0aGlzLl9jb3JlLnNldHRpbmdzLmRvdHNEYXRhKSB7XG5cdFx0XHRcdFx0dGhpcy5fdGVtcGxhdGVzLnB1c2goJzxkaXYgY2xhc3M9XCInICsgdGhpcy5fY29yZS5zZXR0aW5ncy5kb3RDbGFzcyArICdcIj4nICtcblx0XHRcdFx0XHRcdCQoZS5jb250ZW50KS5maW5kKCdbZGF0YS1kb3RdJykuYWRkQmFjaygnW2RhdGEtZG90XScpLmF0dHIoJ2RhdGEtZG90JykgKyAnPC9kaXY+Jyk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J2FkZGVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgdGhpcy5fY29yZS5zZXR0aW5ncy5kb3RzRGF0YSkge1xuXHRcdFx0XHRcdHRoaXMuX3RlbXBsYXRlcy5zcGxpY2UoZS5wb3NpdGlvbiwgMCwgdGhpcy5fdGVtcGxhdGVzLnBvcCgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQncmVtb3ZlLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgdGhpcy5fY29yZS5zZXR0aW5ncy5kb3RzRGF0YSkge1xuXHRcdFx0XHRcdHRoaXMuX3RlbXBsYXRlcy5zcGxpY2UoZS5wb3NpdGlvbiwgMSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J2NoYW5nZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiBlLnByb3BlcnR5Lm5hbWUgPT0gJ3Bvc2l0aW9uJykge1xuXHRcdFx0XHRcdHRoaXMuZHJhdygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmICF0aGlzLl9pbml0aWFsaXplZCkge1xuXHRcdFx0XHRcdHRoaXMuX2NvcmUudHJpZ2dlcignaW5pdGlhbGl6ZScsIG51bGwsICduYXZpZ2F0aW9uJyk7XG5cdFx0XHRcdFx0dGhpcy5pbml0aWFsaXplKCk7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGUoKTtcblx0XHRcdFx0XHR0aGlzLmRyYXcoKTtcblx0XHRcdFx0XHR0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG5cdFx0XHRcdFx0dGhpcy5fY29yZS50cmlnZ2VyKCdpbml0aWFsaXplZCcsIG51bGwsICduYXZpZ2F0aW9uJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J3JlZnJlc2hlZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIHRoaXMuX2luaXRpYWxpemVkKSB7XG5cdFx0XHRcdFx0dGhpcy5fY29yZS50cmlnZ2VyKCdyZWZyZXNoJywgbnVsbCwgJ25hdmlnYXRpb24nKTtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZSgpO1xuXHRcdFx0XHRcdHRoaXMuZHJhdygpO1xuXHRcdFx0XHRcdHRoaXMuX2NvcmUudHJpZ2dlcigncmVmcmVzaGVkJywgbnVsbCwgJ25hdmlnYXRpb24nKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcylcblx0XHR9O1xuXG5cdFx0Ly8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuXHRcdHRoaXMuX2NvcmUub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBOYXZpZ2F0aW9uLkRlZmF1bHRzLCB0aGlzLl9jb3JlLm9wdGlvbnMpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnNcblx0XHR0aGlzLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKTtcblx0fTtcblxuXHQvKipcblx0ICogRGVmYXVsdCBvcHRpb25zLlxuXHQgKiBAcHVibGljXG5cdCAqIEB0b2RvIFJlbmFtZSBgc2xpZGVCeWAgdG8gYG5hdkJ5YFxuXHQgKi9cblx0TmF2aWdhdGlvbi5EZWZhdWx0cyA9IHtcblx0XHRuYXY6IGZhbHNlLFxuXHRcdG5hdlRleHQ6IFsgJ3ByZXYnLCAnbmV4dCcgXSxcblx0XHRuYXZTcGVlZDogZmFsc2UsXG5cdFx0bmF2RWxlbWVudDogJ2RpdicsXG5cdFx0bmF2Q29udGFpbmVyOiBmYWxzZSxcblx0XHRuYXZDb250YWluZXJDbGFzczogJ293bC1uYXYnLFxuXHRcdG5hdkNsYXNzOiBbICdvd2wtcHJldicsICdvd2wtbmV4dCcgXSxcblx0XHRzbGlkZUJ5OiAxLFxuXHRcdGRvdENsYXNzOiAnb3dsLWRvdCcsXG5cdFx0ZG90c0NsYXNzOiAnb3dsLWRvdHMnLFxuXHRcdGRvdHM6IHRydWUsXG5cdFx0ZG90c0VhY2g6IGZhbHNlLFxuXHRcdGRvdHNEYXRhOiBmYWxzZSxcblx0XHRkb3RzU3BlZWQ6IGZhbHNlLFxuXHRcdGRvdHNDb250YWluZXI6IGZhbHNlXG5cdH07XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIHRoZSBsYXlvdXQgb2YgdGhlIHBsdWdpbiBhbmQgZXh0ZW5kcyB0aGUgY2Fyb3VzZWwuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdE5hdmlnYXRpb24ucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgb3ZlcnJpZGUsXG5cdFx0XHRzZXR0aW5ncyA9IHRoaXMuX2NvcmUuc2V0dGluZ3M7XG5cblx0XHQvLyBjcmVhdGUgRE9NIHN0cnVjdHVyZSBmb3IgcmVsYXRpdmUgbmF2aWdhdGlvblxuXHRcdHRoaXMuX2NvbnRyb2xzLiRyZWxhdGl2ZSA9IChzZXR0aW5ncy5uYXZDb250YWluZXIgPyAkKHNldHRpbmdzLm5hdkNvbnRhaW5lcilcblx0XHRcdDogJCgnPGRpdj4nKS5hZGRDbGFzcyhzZXR0aW5ncy5uYXZDb250YWluZXJDbGFzcykuYXBwZW5kVG8odGhpcy4kZWxlbWVudCkpLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xuXG5cdFx0dGhpcy5fY29udHJvbHMuJHByZXZpb3VzID0gJCgnPCcgKyBzZXR0aW5ncy5uYXZFbGVtZW50ICsgJz4nKVxuXHRcdFx0LmFkZENsYXNzKHNldHRpbmdzLm5hdkNsYXNzWzBdKVxuXHRcdFx0Lmh0bWwoc2V0dGluZ3MubmF2VGV4dFswXSlcblx0XHRcdC5wcmVwZW5kVG8odGhpcy5fY29udHJvbHMuJHJlbGF0aXZlKVxuXHRcdFx0Lm9uKCdjbGljaycsICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHR0aGlzLnByZXYoc2V0dGluZ3MubmF2U3BlZWQpO1xuXHRcdFx0fSwgdGhpcykpO1xuXHRcdHRoaXMuX2NvbnRyb2xzLiRuZXh0ID0gJCgnPCcgKyBzZXR0aW5ncy5uYXZFbGVtZW50ICsgJz4nKVxuXHRcdFx0LmFkZENsYXNzKHNldHRpbmdzLm5hdkNsYXNzWzFdKVxuXHRcdFx0Lmh0bWwoc2V0dGluZ3MubmF2VGV4dFsxXSlcblx0XHRcdC5hcHBlbmRUbyh0aGlzLl9jb250cm9scy4kcmVsYXRpdmUpXG5cdFx0XHQub24oJ2NsaWNrJywgJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdHRoaXMubmV4dChzZXR0aW5ncy5uYXZTcGVlZCk7XG5cdFx0XHR9LCB0aGlzKSk7XG5cblx0XHQvLyBjcmVhdGUgRE9NIHN0cnVjdHVyZSBmb3IgYWJzb2x1dGUgbmF2aWdhdGlvblxuXHRcdGlmICghc2V0dGluZ3MuZG90c0RhdGEpIHtcblx0XHRcdHRoaXMuX3RlbXBsYXRlcyA9IFsgJCgnPGRpdj4nKVxuXHRcdFx0XHQuYWRkQ2xhc3Moc2V0dGluZ3MuZG90Q2xhc3MpXG5cdFx0XHRcdC5hcHBlbmQoJCgnPHNwYW4+JykpXG5cdFx0XHRcdC5wcm9wKCdvdXRlckhUTUwnKSBdO1xuXHRcdH1cblxuXHRcdHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZSA9IChzZXR0aW5ncy5kb3RzQ29udGFpbmVyID8gJChzZXR0aW5ncy5kb3RzQ29udGFpbmVyKVxuXHRcdFx0OiAkKCc8ZGl2PicpLmFkZENsYXNzKHNldHRpbmdzLmRvdHNDbGFzcykuYXBwZW5kVG8odGhpcy4kZWxlbWVudCkpLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xuXG5cdFx0dGhpcy5fY29udHJvbHMuJGFic29sdXRlLm9uKCdjbGljaycsICdkaXYnLCAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdHZhciBpbmRleCA9ICQoZS50YXJnZXQpLnBhcmVudCgpLmlzKHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZSlcblx0XHRcdFx0PyAkKGUudGFyZ2V0KS5pbmRleCgpIDogJChlLnRhcmdldCkucGFyZW50KCkuaW5kZXgoKTtcblxuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHR0aGlzLnRvKGluZGV4LCBzZXR0aW5ncy5kb3RzU3BlZWQpO1xuXHRcdH0sIHRoaXMpKTtcblxuXHRcdC8vIG92ZXJyaWRlIHB1YmxpYyBtZXRob2RzIG9mIHRoZSBjYXJvdXNlbFxuXHRcdGZvciAob3ZlcnJpZGUgaW4gdGhpcy5fb3ZlcnJpZGVzKSB7XG5cdFx0XHR0aGlzLl9jb3JlW292ZXJyaWRlXSA9ICQucHJveHkodGhpc1tvdmVycmlkZV0sIHRoaXMpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogRGVzdHJveXMgdGhlIHBsdWdpbi5cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0TmF2aWdhdGlvbi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBoYW5kbGVyLCBjb250cm9sLCBwcm9wZXJ0eSwgb3ZlcnJpZGU7XG5cblx0XHRmb3IgKGhhbmRsZXIgaW4gdGhpcy5faGFuZGxlcnMpIHtcblx0XHRcdHRoaXMuJGVsZW1lbnQub2ZmKGhhbmRsZXIsIHRoaXMuX2hhbmRsZXJzW2hhbmRsZXJdKTtcblx0XHR9XG5cdFx0Zm9yIChjb250cm9sIGluIHRoaXMuX2NvbnRyb2xzKSB7XG5cdFx0XHR0aGlzLl9jb250cm9sc1tjb250cm9sXS5yZW1vdmUoKTtcblx0XHR9XG5cdFx0Zm9yIChvdmVycmlkZSBpbiB0aGlzLm92ZXJpZGVzKSB7XG5cdFx0XHR0aGlzLl9jb3JlW292ZXJyaWRlXSA9IHRoaXMuX292ZXJyaWRlc1tvdmVycmlkZV07XG5cdFx0fVxuXHRcdGZvciAocHJvcGVydHkgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcblx0XHRcdHR5cGVvZiB0aGlzW3Byb3BlcnR5XSAhPSAnZnVuY3Rpb24nICYmICh0aGlzW3Byb3BlcnR5XSA9IG51bGwpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgc3RhdGUuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdE5hdmlnYXRpb24ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpLCBqLCBrLFxuXHRcdFx0bG93ZXIgPSB0aGlzLl9jb3JlLmNsb25lcygpLmxlbmd0aCAvIDIsXG5cdFx0XHR1cHBlciA9IGxvd2VyICsgdGhpcy5fY29yZS5pdGVtcygpLmxlbmd0aCxcblx0XHRcdG1heGltdW0gPSB0aGlzLl9jb3JlLm1heGltdW0odHJ1ZSksXG5cdFx0XHRzZXR0aW5ncyA9IHRoaXMuX2NvcmUuc2V0dGluZ3MsXG5cdFx0XHRzaXplID0gc2V0dGluZ3MuY2VudGVyIHx8IHNldHRpbmdzLmF1dG9XaWR0aCB8fCBzZXR0aW5ncy5kb3RzRGF0YVxuXHRcdFx0XHQ/IDEgOiBzZXR0aW5ncy5kb3RzRWFjaCB8fCBzZXR0aW5ncy5pdGVtcztcblxuXHRcdGlmIChzZXR0aW5ncy5zbGlkZUJ5ICE9PSAncGFnZScpIHtcblx0XHRcdHNldHRpbmdzLnNsaWRlQnkgPSBNYXRoLm1pbihzZXR0aW5ncy5zbGlkZUJ5LCBzZXR0aW5ncy5pdGVtcyk7XG5cdFx0fVxuXG5cdFx0aWYgKHNldHRpbmdzLmRvdHMgfHwgc2V0dGluZ3Muc2xpZGVCeSA9PSAncGFnZScpIHtcblx0XHRcdHRoaXMuX3BhZ2VzID0gW107XG5cblx0XHRcdGZvciAoaSA9IGxvd2VyLCBqID0gMCwgayA9IDA7IGkgPCB1cHBlcjsgaSsrKSB7XG5cdFx0XHRcdGlmIChqID49IHNpemUgfHwgaiA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuX3BhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0c3RhcnQ6IE1hdGgubWluKG1heGltdW0sIGkgLSBsb3dlciksXG5cdFx0XHRcdFx0XHRlbmQ6IGkgLSBsb3dlciArIHNpemUgLSAxXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKE1hdGgubWluKG1heGltdW0sIGkgLSBsb3dlcikgPT09IG1heGltdW0pIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRqID0gMCwgKytrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGogKz0gdGhpcy5fY29yZS5tZXJnZXJzKHRoaXMuX2NvcmUucmVsYXRpdmUoaSkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogRHJhd3MgdGhlIHVzZXIgaW50ZXJmYWNlLlxuXHQgKiBAdG9kbyBUaGUgb3B0aW9uIGBkb3RzRGF0YWAgd29udCB3b3JrLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHROYXZpZ2F0aW9uLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGRpZmZlcmVuY2UsXG5cdFx0XHRzZXR0aW5ncyA9IHRoaXMuX2NvcmUuc2V0dGluZ3MsXG5cdFx0XHRkaXNhYmxlZCA9IHRoaXMuX2NvcmUuaXRlbXMoKS5sZW5ndGggPD0gc2V0dGluZ3MuaXRlbXMsXG5cdFx0XHRpbmRleCA9IHRoaXMuX2NvcmUucmVsYXRpdmUodGhpcy5fY29yZS5jdXJyZW50KCkpLFxuXHRcdFx0bG9vcCA9IHNldHRpbmdzLmxvb3AgfHwgc2V0dGluZ3MucmV3aW5kO1xuXG5cdFx0dGhpcy5fY29udHJvbHMuJHJlbGF0aXZlLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsICFzZXR0aW5ncy5uYXYgfHwgZGlzYWJsZWQpO1xuXG5cdFx0aWYgKHNldHRpbmdzLm5hdikge1xuXHRcdFx0dGhpcy5fY29udHJvbHMuJHByZXZpb3VzLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsICFsb29wICYmIGluZGV4IDw9IHRoaXMuX2NvcmUubWluaW11bSh0cnVlKSk7XG5cdFx0XHR0aGlzLl9jb250cm9scy4kbmV4dC50b2dnbGVDbGFzcygnZGlzYWJsZWQnLCAhbG9vcCAmJiBpbmRleCA+PSB0aGlzLl9jb3JlLm1heGltdW0odHJ1ZSkpO1xuXHRcdH1cblxuXHRcdHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS50b2dnbGVDbGFzcygnZGlzYWJsZWQnLCAhc2V0dGluZ3MuZG90cyB8fCBkaXNhYmxlZCk7XG5cblx0XHRpZiAoc2V0dGluZ3MuZG90cykge1xuXHRcdFx0ZGlmZmVyZW5jZSA9IHRoaXMuX3BhZ2VzLmxlbmd0aCAtIHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5jaGlsZHJlbigpLmxlbmd0aDtcblxuXHRcdFx0aWYgKHNldHRpbmdzLmRvdHNEYXRhICYmIGRpZmZlcmVuY2UgIT09IDApIHtcblx0XHRcdFx0dGhpcy5fY29udHJvbHMuJGFic29sdXRlLmh0bWwodGhpcy5fdGVtcGxhdGVzLmpvaW4oJycpKTtcblx0XHRcdH0gZWxzZSBpZiAoZGlmZmVyZW5jZSA+IDApIHtcblx0XHRcdFx0dGhpcy5fY29udHJvbHMuJGFic29sdXRlLmFwcGVuZChuZXcgQXJyYXkoZGlmZmVyZW5jZSArIDEpLmpvaW4odGhpcy5fdGVtcGxhdGVzWzBdKSk7XG5cdFx0XHR9IGVsc2UgaWYgKGRpZmZlcmVuY2UgPCAwKSB7XG5cdFx0XHRcdHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5jaGlsZHJlbigpLnNsaWNlKGRpZmZlcmVuY2UpLnJlbW92ZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9jb250cm9scy4kYWJzb2x1dGUuZmluZCgnLmFjdGl2ZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcblx0XHRcdHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5jaGlsZHJlbigpLmVxKCQuaW5BcnJheSh0aGlzLmN1cnJlbnQoKSwgdGhpcy5fcGFnZXMpKS5hZGRDbGFzcygnYWN0aXZlJyk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBFeHRlbmRzIGV2ZW50IGRhdGEuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0IHdoaWNoIGdldHMgdGhyb3duLlxuXHQgKi9cblx0TmF2aWdhdGlvbi5wcm90b3R5cGUub25UcmlnZ2VyID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHR2YXIgc2V0dGluZ3MgPSB0aGlzLl9jb3JlLnNldHRpbmdzO1xuXG5cdFx0ZXZlbnQucGFnZSA9IHtcblx0XHRcdGluZGV4OiAkLmluQXJyYXkodGhpcy5jdXJyZW50KCksIHRoaXMuX3BhZ2VzKSxcblx0XHRcdGNvdW50OiB0aGlzLl9wYWdlcy5sZW5ndGgsXG5cdFx0XHRzaXplOiBzZXR0aW5ncyAmJiAoc2V0dGluZ3MuY2VudGVyIHx8IHNldHRpbmdzLmF1dG9XaWR0aCB8fCBzZXR0aW5ncy5kb3RzRGF0YVxuXHRcdFx0XHQ/IDEgOiBzZXR0aW5ncy5kb3RzRWFjaCB8fCBzZXR0aW5ncy5pdGVtcylcblx0XHR9O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBjdXJyZW50IHBhZ2UgcG9zaXRpb24gb2YgdGhlIGNhcm91c2VsLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9XG5cdCAqL1xuXHROYXZpZ2F0aW9uLnByb3RvdHlwZS5jdXJyZW50ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGN1cnJlbnQgPSB0aGlzLl9jb3JlLnJlbGF0aXZlKHRoaXMuX2NvcmUuY3VycmVudCgpKTtcblx0XHRyZXR1cm4gJC5ncmVwKHRoaXMuX3BhZ2VzLCAkLnByb3h5KGZ1bmN0aW9uKHBhZ2UsIGluZGV4KSB7XG5cdFx0XHRyZXR1cm4gcGFnZS5zdGFydCA8PSBjdXJyZW50ICYmIHBhZ2UuZW5kID49IGN1cnJlbnQ7XG5cdFx0fSwgdGhpcykpLnBvcCgpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBjdXJyZW50IHN1Y2Nlc29yL3ByZWRlY2Vzc29yIHBvc2l0aW9uLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9XG5cdCAqL1xuXHROYXZpZ2F0aW9uLnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKHN1Y2Nlc3Nvcikge1xuXHRcdHZhciBwb3NpdGlvbiwgbGVuZ3RoLFxuXHRcdFx0c2V0dGluZ3MgPSB0aGlzLl9jb3JlLnNldHRpbmdzO1xuXG5cdFx0aWYgKHNldHRpbmdzLnNsaWRlQnkgPT0gJ3BhZ2UnKSB7XG5cdFx0XHRwb3NpdGlvbiA9ICQuaW5BcnJheSh0aGlzLmN1cnJlbnQoKSwgdGhpcy5fcGFnZXMpO1xuXHRcdFx0bGVuZ3RoID0gdGhpcy5fcGFnZXMubGVuZ3RoO1xuXHRcdFx0c3VjY2Vzc29yID8gKytwb3NpdGlvbiA6IC0tcG9zaXRpb247XG5cdFx0XHRwb3NpdGlvbiA9IHRoaXMuX3BhZ2VzWygocG9zaXRpb24gJSBsZW5ndGgpICsgbGVuZ3RoKSAlIGxlbmd0aF0uc3RhcnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBvc2l0aW9uID0gdGhpcy5fY29yZS5yZWxhdGl2ZSh0aGlzLl9jb3JlLmN1cnJlbnQoKSk7XG5cdFx0XHRsZW5ndGggPSB0aGlzLl9jb3JlLml0ZW1zKCkubGVuZ3RoO1xuXHRcdFx0c3VjY2Vzc29yID8gcG9zaXRpb24gKz0gc2V0dGluZ3Muc2xpZGVCeSA6IHBvc2l0aW9uIC09IHNldHRpbmdzLnNsaWRlQnk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvc2l0aW9uO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTbGlkZXMgdG8gdGhlIG5leHQgaXRlbSBvciBwYWdlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbc3BlZWQ9ZmFsc2VdIC0gVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgdHJhbnNpdGlvbi5cblx0ICovXG5cdE5hdmlnYXRpb24ucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbihzcGVlZCkge1xuXHRcdCQucHJveHkodGhpcy5fb3ZlcnJpZGVzLnRvLCB0aGlzLl9jb3JlKSh0aGlzLmdldFBvc2l0aW9uKHRydWUpLCBzcGVlZCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFNsaWRlcyB0byB0aGUgcHJldmlvdXMgaXRlbSBvciBwYWdlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbc3BlZWQ9ZmFsc2VdIC0gVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgdHJhbnNpdGlvbi5cblx0ICovXG5cdE5hdmlnYXRpb24ucHJvdG90eXBlLnByZXYgPSBmdW5jdGlvbihzcGVlZCkge1xuXHRcdCQucHJveHkodGhpcy5fb3ZlcnJpZGVzLnRvLCB0aGlzLl9jb3JlKSh0aGlzLmdldFBvc2l0aW9uKGZhbHNlKSwgc3BlZWQpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTbGlkZXMgdG8gdGhlIHNwZWNpZmllZCBpdGVtIG9yIHBhZ2UuXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIG9yIHBhZ2UuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbc3BlZWRdIC0gVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgdHJhbnNpdGlvbi5cblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RhbmRhcmQ9ZmFsc2VdIC0gV2hldGhlciB0byB1c2UgdGhlIHN0YW5kYXJkIGJlaGF2aW91ciBvciBub3QuXG5cdCAqL1xuXHROYXZpZ2F0aW9uLnByb3RvdHlwZS50byA9IGZ1bmN0aW9uKHBvc2l0aW9uLCBzcGVlZCwgc3RhbmRhcmQpIHtcblx0XHR2YXIgbGVuZ3RoO1xuXG5cdFx0aWYgKCFzdGFuZGFyZCAmJiB0aGlzLl9wYWdlcy5sZW5ndGgpIHtcblx0XHRcdGxlbmd0aCA9IHRoaXMuX3BhZ2VzLmxlbmd0aDtcblx0XHRcdCQucHJveHkodGhpcy5fb3ZlcnJpZGVzLnRvLCB0aGlzLl9jb3JlKSh0aGlzLl9wYWdlc1soKHBvc2l0aW9uICUgbGVuZ3RoKSArIGxlbmd0aCkgJSBsZW5ndGhdLnN0YXJ0LCBzcGVlZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCQucHJveHkodGhpcy5fb3ZlcnJpZGVzLnRvLCB0aGlzLl9jb3JlKShwb3NpdGlvbiwgc3BlZWQpO1xuXHRcdH1cblx0fTtcblxuXHQkLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuTmF2aWdhdGlvbiA9IE5hdmlnYXRpb247XG5cbn0pKHdpbmRvdy5aZXB0byB8fCB3aW5kb3cualF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50KTtcblxuLyoqXG4gKiBIYXNoIFBsdWdpblxuICogQHZlcnNpb24gMi4xLjBcbiAqIEBhdXRob3IgQXJ0dXMgS29sYW5vd3NraVxuICogQGF1dGhvciBEYXZpZCBEZXV0c2NoXG4gKiBAbGljZW5zZSBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqL1xuOyhmdW5jdGlvbigkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBoYXNoIHBsdWdpbi5cblx0ICogQGNsYXNzIFRoZSBIYXNoIFBsdWdpblxuXHQgKiBAcGFyYW0ge093bH0gY2Fyb3VzZWwgLSBUaGUgT3dsIENhcm91c2VsXG5cdCAqL1xuXHR2YXIgSGFzaCA9IGZ1bmN0aW9uKGNhcm91c2VsKSB7XG5cdFx0LyoqXG5cdFx0ICogUmVmZXJlbmNlIHRvIHRoZSBjb3JlLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T3dsfVxuXHRcdCAqL1xuXHRcdHRoaXMuX2NvcmUgPSBjYXJvdXNlbDtcblxuXHRcdC8qKlxuXHRcdCAqIEhhc2ggaW5kZXggZm9yIHRoZSBpdGVtcy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0XHR0aGlzLl9oYXNoZXMgPSB7fTtcblxuXHRcdC8qKlxuXHRcdCAqIFRoZSBjYXJvdXNlbCBlbGVtZW50LlxuXHRcdCAqIEB0eXBlIHtqUXVlcnl9XG5cdFx0ICovXG5cdFx0dGhpcy4kZWxlbWVudCA9IHRoaXMuX2NvcmUuJGVsZW1lbnQ7XG5cblx0XHQvKipcblx0XHQgKiBBbGwgZXZlbnQgaGFuZGxlcnMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dGhpcy5faGFuZGxlcnMgPSB7XG5cdFx0XHQnaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiB0aGlzLl9jb3JlLnNldHRpbmdzLnN0YXJ0UG9zaXRpb24gPT09ICdVUkxIYXNoJykge1xuXHRcdFx0XHRcdCQod2luZG93KS50cmlnZ2VyKCdoYXNoY2hhbmdlLm93bC5uYXZpZ2F0aW9uJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J3ByZXBhcmVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UpIHtcblx0XHRcdFx0XHR2YXIgaGFzaCA9ICQoZS5jb250ZW50KS5maW5kKCdbZGF0YS1oYXNoXScpLmFkZEJhY2soJ1tkYXRhLWhhc2hdJykuYXR0cignZGF0YS1oYXNoJyk7XG5cblx0XHRcdFx0XHRpZiAoIWhhc2gpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLl9oYXNoZXNbaGFzaF0gPSBlLmNvbnRlbnQ7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J2NoYW5nZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiBlLnByb3BlcnR5Lm5hbWUgPT09ICdwb3NpdGlvbicpIHtcblx0XHRcdFx0XHR2YXIgY3VycmVudCA9IHRoaXMuX2NvcmUuaXRlbXModGhpcy5fY29yZS5yZWxhdGl2ZSh0aGlzLl9jb3JlLmN1cnJlbnQoKSkpLFxuXHRcdFx0XHRcdFx0aGFzaCA9ICQubWFwKHRoaXMuX2hhc2hlcywgZnVuY3Rpb24oaXRlbSwgaGFzaCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gaXRlbSA9PT0gY3VycmVudCA/IGhhc2ggOiBudWxsO1xuXHRcdFx0XHRcdFx0fSkuam9pbigpO1xuXG5cdFx0XHRcdFx0aWYgKCFoYXNoIHx8IHdpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpID09PSBoYXNoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0d2luZG93LmxvY2F0aW9uLmhhc2ggPSBoYXNoO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKVxuXHRcdH07XG5cblx0XHQvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG5cdFx0dGhpcy5fY29yZS5vcHRpb25zID0gJC5leHRlbmQoe30sIEhhc2guRGVmYXVsdHMsIHRoaXMuX2NvcmUub3B0aW9ucyk7XG5cblx0XHQvLyByZWdpc3RlciB0aGUgZXZlbnQgaGFuZGxlcnNcblx0XHR0aGlzLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKTtcblxuXHRcdC8vIHJlZ2lzdGVyIGV2ZW50IGxpc3RlbmVyIGZvciBoYXNoIG5hdmlnYXRpb25cblx0XHQkKHdpbmRvdykub24oJ2hhc2hjaGFuZ2Uub3dsLm5hdmlnYXRpb24nLCAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpLFxuXHRcdFx0XHRpdGVtcyA9IHRoaXMuX2NvcmUuJHN0YWdlLmNoaWxkcmVuKCksXG5cdFx0XHRcdHBvc2l0aW9uID0gdGhpcy5faGFzaGVzW2hhc2hdICYmIGl0ZW1zLmluZGV4KHRoaXMuX2hhc2hlc1toYXNoXSk7XG5cblx0XHRcdGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHBvc2l0aW9uID09PSB0aGlzLl9jb3JlLmN1cnJlbnQoKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2NvcmUudG8odGhpcy5fY29yZS5yZWxhdGl2ZShwb3NpdGlvbiksIGZhbHNlLCB0cnVlKTtcblx0XHR9LCB0aGlzKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlZmF1bHQgb3B0aW9ucy5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0SGFzaC5EZWZhdWx0cyA9IHtcblx0XHRVUkxoYXNoTGlzdGVuZXI6IGZhbHNlXG5cdH07XG5cblx0LyoqXG5cdCAqIERlc3Ryb3lzIHRoZSBwbHVnaW4uXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEhhc2gucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaGFuZGxlciwgcHJvcGVydHk7XG5cblx0XHQkKHdpbmRvdykub2ZmKCdoYXNoY2hhbmdlLm93bC5uYXZpZ2F0aW9uJyk7XG5cblx0XHRmb3IgKGhhbmRsZXIgaW4gdGhpcy5faGFuZGxlcnMpIHtcblx0XHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQub2ZmKGhhbmRsZXIsIHRoaXMuX2hhbmRsZXJzW2hhbmRsZXJdKTtcblx0XHR9XG5cdFx0Zm9yIChwcm9wZXJ0eSBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuXHRcdFx0dHlwZW9mIHRoaXNbcHJvcGVydHldICE9ICdmdW5jdGlvbicgJiYgKHRoaXNbcHJvcGVydHldID0gbnVsbCk7XG5cdFx0fVxuXHR9O1xuXG5cdCQuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5IYXNoID0gSGFzaDtcblxufSkod2luZG93LlplcHRvIHx8IHdpbmRvdy5qUXVlcnksIHdpbmRvdywgZG9jdW1lbnQpO1xuXG4vKipcbiAqIFN1cHBvcnQgUGx1Z2luXG4gKlxuICogQHZlcnNpb24gMi4xLjBcbiAqIEBhdXRob3IgVml2aWQgUGxhbmV0IFNvZnR3YXJlIEdtYkhcbiAqIEBhdXRob3IgQXJ0dXMgS29sYW5vd3NraVxuICogQGF1dGhvciBEYXZpZCBEZXV0c2NoXG4gKiBAbGljZW5zZSBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqL1xuOyhmdW5jdGlvbigkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcblxuXHR2YXIgc3R5bGUgPSAkKCc8c3VwcG9ydD4nKS5nZXQoMCkuc3R5bGUsXG5cdFx0cHJlZml4ZXMgPSAnV2Via2l0IE1veiBPIG1zJy5zcGxpdCgnICcpLFxuXHRcdGV2ZW50cyA9IHtcblx0XHRcdHRyYW5zaXRpb246IHtcblx0XHRcdFx0ZW5kOiB7XG5cdFx0XHRcdFx0V2Via2l0VHJhbnNpdGlvbjogJ3dlYmtpdFRyYW5zaXRpb25FbmQnLFxuXHRcdFx0XHRcdE1velRyYW5zaXRpb246ICd0cmFuc2l0aW9uZW5kJyxcblx0XHRcdFx0XHRPVHJhbnNpdGlvbjogJ29UcmFuc2l0aW9uRW5kJyxcblx0XHRcdFx0XHR0cmFuc2l0aW9uOiAndHJhbnNpdGlvbmVuZCdcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGFuaW1hdGlvbjoge1xuXHRcdFx0XHRlbmQ6IHtcblx0XHRcdFx0XHRXZWJraXRBbmltYXRpb246ICd3ZWJraXRBbmltYXRpb25FbmQnLFxuXHRcdFx0XHRcdE1vekFuaW1hdGlvbjogJ2FuaW1hdGlvbmVuZCcsXG5cdFx0XHRcdFx0T0FuaW1hdGlvbjogJ29BbmltYXRpb25FbmQnLFxuXHRcdFx0XHRcdGFuaW1hdGlvbjogJ2FuaW1hdGlvbmVuZCdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0dGVzdHMgPSB7XG5cdFx0XHRjc3N0cmFuc2Zvcm1zOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhdGVzdCgndHJhbnNmb3JtJyk7XG5cdFx0XHR9LFxuXHRcdFx0Y3NzdHJhbnNmb3JtczNkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhdGVzdCgncGVyc3BlY3RpdmUnKTtcblx0XHRcdH0sXG5cdFx0XHRjc3N0cmFuc2l0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIXRlc3QoJ3RyYW5zaXRpb24nKTtcblx0XHRcdH0sXG5cdFx0XHRjc3NhbmltYXRpb25zOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhdGVzdCgnYW5pbWF0aW9uJyk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRmdW5jdGlvbiB0ZXN0KHByb3BlcnR5LCBwcmVmaXhlZCkge1xuXHRcdHZhciByZXN1bHQgPSBmYWxzZSxcblx0XHRcdHVwcGVyID0gcHJvcGVydHkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zbGljZSgxKTtcblxuXHRcdCQuZWFjaCgocHJvcGVydHkgKyAnICcgKyBwcmVmaXhlcy5qb2luKHVwcGVyICsgJyAnKSArIHVwcGVyKS5zcGxpdCgnICcpLCBmdW5jdGlvbihpLCBwcm9wZXJ0eSkge1xuXHRcdFx0aWYgKHN0eWxlW3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJlc3VsdCA9IHByZWZpeGVkID8gcHJvcGVydHkgOiB0cnVlO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0ZnVuY3Rpb24gcHJlZml4ZWQocHJvcGVydHkpIHtcblx0XHRyZXR1cm4gdGVzdChwcm9wZXJ0eSwgdHJ1ZSk7XG5cdH1cblxuXHRpZiAodGVzdHMuY3NzdHJhbnNpdGlvbnMoKSkge1xuXHRcdC8qIGpzaGludCAtVzA1MyAqL1xuXHRcdCQuc3VwcG9ydC50cmFuc2l0aW9uID0gbmV3IFN0cmluZyhwcmVmaXhlZCgndHJhbnNpdGlvbicpKVxuXHRcdCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCA9IGV2ZW50cy50cmFuc2l0aW9uLmVuZFsgJC5zdXBwb3J0LnRyYW5zaXRpb24gXTtcblx0fVxuXG5cdGlmICh0ZXN0cy5jc3NhbmltYXRpb25zKCkpIHtcblx0XHQvKiBqc2hpbnQgLVcwNTMgKi9cblx0XHQkLnN1cHBvcnQuYW5pbWF0aW9uID0gbmV3IFN0cmluZyhwcmVmaXhlZCgnYW5pbWF0aW9uJykpXG5cdFx0JC5zdXBwb3J0LmFuaW1hdGlvbi5lbmQgPSBldmVudHMuYW5pbWF0aW9uLmVuZFsgJC5zdXBwb3J0LmFuaW1hdGlvbiBdO1xuXHR9XG5cblx0aWYgKHRlc3RzLmNzc3RyYW5zZm9ybXMoKSkge1xuXHRcdC8qIGpzaGludCAtVzA1MyAqL1xuXHRcdCQuc3VwcG9ydC50cmFuc2Zvcm0gPSBuZXcgU3RyaW5nKHByZWZpeGVkKCd0cmFuc2Zvcm0nKSk7XG5cdFx0JC5zdXBwb3J0LnRyYW5zZm9ybTNkID0gdGVzdHMuY3NzdHJhbnNmb3JtczNkKCk7XG5cdH1cblxufSkod2luZG93LlplcHRvIHx8IHdpbmRvdy5qUXVlcnksIHdpbmRvdywgZG9jdW1lbnQpO1xuIiwiLyohIHBpY3R1cmVmaWxsIC0gdjMuMC4yIC0gMjAxNi0wMi0xMlxuICogaHR0cHM6Ly9zY290dGplaGwuZ2l0aHViLmlvL3BpY3R1cmVmaWxsL1xuICogQ29weXJpZ2h0IChjKSAyMDE2IGh0dHBzOi8vZ2l0aHViLmNvbS9zY290dGplaGwvcGljdHVyZWZpbGwvYmxvYi9tYXN0ZXIvQXV0aG9ycy50eHQ7IExpY2Vuc2VkIE1JVFxuICovXG4hZnVuY3Rpb24oYSl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudDthLkhUTUxQaWN0dXJlRWxlbWVudCYmL2Vja28vLnRlc3QoYikmJmIubWF0Y2goL3J2XFw6KFxcZCspLykmJlJlZ0V4cC4kMTw0NSYmYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLGZ1bmN0aW9uKCl7dmFyIGIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic291cmNlXCIpLGQ9ZnVuY3Rpb24oYSl7dmFyIGIsZCxlPWEucGFyZW50Tm9kZTtcIlBJQ1RVUkVcIj09PWUubm9kZU5hbWUudG9VcHBlckNhc2UoKT8oYj1jLmNsb25lTm9kZSgpLGUuaW5zZXJ0QmVmb3JlKGIsZS5maXJzdEVsZW1lbnRDaGlsZCksc2V0VGltZW91dChmdW5jdGlvbigpe2UucmVtb3ZlQ2hpbGQoYil9KSk6KCFhLl9wZkxhc3RTaXplfHxhLm9mZnNldFdpZHRoPmEuX3BmTGFzdFNpemUpJiYoYS5fcGZMYXN0U2l6ZT1hLm9mZnNldFdpZHRoLGQ9YS5zaXplcyxhLnNpemVzKz1cIiwxMDB2d1wiLHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLnNpemVzPWR9KSl9LGU9ZnVuY3Rpb24oKXt2YXIgYSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJwaWN0dXJlID4gaW1nLCBpbWdbc3Jjc2V0XVtzaXplc11cIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylkKGJbYV0pfSxmPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGIpLGI9c2V0VGltZW91dChlLDk5KX0sZz1hLm1hdGNoTWVkaWEmJm1hdGNoTWVkaWEoXCIob3JpZW50YXRpb246IGxhbmRzY2FwZSlcIiksaD1mdW5jdGlvbigpe2YoKSxnJiZnLmFkZExpc3RlbmVyJiZnLmFkZExpc3RlbmVyKGYpfTtyZXR1cm4gYy5zcmNzZXQ9XCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFBQUFDSDVCQUVLQUFFQUxBQUFBQUFCQUFFQUFBSUNUQUVBT3c9PVwiLC9eW2N8aV18ZCQvLnRlc3QoZG9jdW1lbnQucmVhZHlTdGF0ZXx8XCJcIik/aCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsaCksZn0oKSl9KHdpbmRvdyksZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGQoYSl7cmV0dXJuXCIgXCI9PT1hfHxcIlx0XCI9PT1hfHxcIlxcblwiPT09YXx8XCJcXGZcIj09PWF8fFwiXFxyXCI9PT1hfWZ1bmN0aW9uIGUoYixjKXt2YXIgZD1uZXcgYS5JbWFnZTtyZXR1cm4gZC5vbmVycm9yPWZ1bmN0aW9uKCl7QVtiXT0hMSxiYSgpfSxkLm9ubG9hZD1mdW5jdGlvbigpe0FbYl09MT09PWQud2lkdGgsYmEoKX0sZC5zcmM9YyxcInBlbmRpbmdcIn1mdW5jdGlvbiBmKCl7TT0hMSxQPWEuZGV2aWNlUGl4ZWxSYXRpbyxOPXt9LE89e30scy5EUFI9UHx8MSxRLndpZHRoPU1hdGgubWF4KGEuaW5uZXJXaWR0aHx8MCx6LmNsaWVudFdpZHRoKSxRLmhlaWdodD1NYXRoLm1heChhLmlubmVySGVpZ2h0fHwwLHouY2xpZW50SGVpZ2h0KSxRLnZ3PVEud2lkdGgvMTAwLFEudmg9US5oZWlnaHQvMTAwLHI9W1EuaGVpZ2h0LFEud2lkdGgsUF0uam9pbihcIi1cIiksUS5lbT1zLmdldEVtVmFsdWUoKSxRLnJlbT1RLmVtfWZ1bmN0aW9uIGcoYSxiLGMsZCl7dmFyIGUsZixnLGg7cmV0dXJuXCJzYXZlRGF0YVwiPT09Qi5hbGdvcml0aG0/YT4yLjc/aD1jKzE6KGY9Yi1jLGU9TWF0aC5wb3coYS0uNiwxLjUpLGc9ZiplLGQmJihnKz0uMSplKSxoPWErZyk6aD1jPjE/TWF0aC5zcXJ0KGEqYik6YSxoPmN9ZnVuY3Rpb24gaChhKXt2YXIgYixjPXMuZ2V0U2V0KGEpLGQ9ITE7XCJwZW5kaW5nXCIhPT1jJiYoZD1yLGMmJihiPXMuc2V0UmVzKGMpLHMuYXBwbHlTZXRDYW5kaWRhdGUoYixhKSkpLGFbcy5uc10uZXZhbGVkPWR9ZnVuY3Rpb24gaShhLGIpe3JldHVybiBhLnJlcy1iLnJlc31mdW5jdGlvbiBqKGEsYixjKXt2YXIgZDtyZXR1cm4hYyYmYiYmKGM9YVtzLm5zXS5zZXRzLGM9YyYmY1tjLmxlbmd0aC0xXSksZD1rKGIsYyksZCYmKGI9cy5tYWtlVXJsKGIpLGFbcy5uc10uY3VyU3JjPWIsYVtzLm5zXS5jdXJDYW49ZCxkLnJlc3x8YWEoZCxkLnNldC5zaXplcykpLGR9ZnVuY3Rpb24gayhhLGIpe3ZhciBjLGQsZTtpZihhJiZiKWZvcihlPXMucGFyc2VTZXQoYiksYT1zLm1ha2VVcmwoYSksYz0wO2M8ZS5sZW5ndGg7YysrKWlmKGE9PT1zLm1ha2VVcmwoZVtjXS51cmwpKXtkPWVbY107YnJlYWt9cmV0dXJuIGR9ZnVuY3Rpb24gbChhLGIpe3ZhciBjLGQsZSxmLGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNvdXJjZVwiKTtmb3IoYz0wLGQ9Zy5sZW5ndGg7ZD5jO2MrKyllPWdbY10sZVtzLm5zXT0hMCxmPWUuZ2V0QXR0cmlidXRlKFwic3Jjc2V0XCIpLGYmJmIucHVzaCh7c3Jjc2V0OmYsbWVkaWE6ZS5nZXRBdHRyaWJ1dGUoXCJtZWRpYVwiKSx0eXBlOmUuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSxzaXplczplLmdldEF0dHJpYnV0ZShcInNpemVzXCIpfSl9ZnVuY3Rpb24gbShhLGIpe2Z1bmN0aW9uIGMoYil7dmFyIGMsZD1iLmV4ZWMoYS5zdWJzdHJpbmcobSkpO3JldHVybiBkPyhjPWRbMF0sbSs9Yy5sZW5ndGgsYyk6dm9pZCAwfWZ1bmN0aW9uIGUoKXt2YXIgYSxjLGQsZSxmLGksaixrLGwsbT0hMSxvPXt9O2ZvcihlPTA7ZTxoLmxlbmd0aDtlKyspZj1oW2VdLGk9ZltmLmxlbmd0aC0xXSxqPWYuc3Vic3RyaW5nKDAsZi5sZW5ndGgtMSksaz1wYXJzZUludChqLDEwKSxsPXBhcnNlRmxvYXQoaiksWC50ZXN0KGopJiZcIndcIj09PWk/KChhfHxjKSYmKG09ITApLDA9PT1rP209ITA6YT1rKTpZLnRlc3QoaikmJlwieFwiPT09aT8oKGF8fGN8fGQpJiYobT0hMCksMD5sP209ITA6Yz1sKTpYLnRlc3QoaikmJlwiaFwiPT09aT8oKGR8fGMpJiYobT0hMCksMD09PWs/bT0hMDpkPWspOm09ITA7bXx8KG8udXJsPWcsYSYmKG8udz1hKSxjJiYoby5kPWMpLGQmJihvLmg9ZCksZHx8Y3x8YXx8KG8uZD0xKSwxPT09by5kJiYoYi5oYXMxeD0hMCksby5zZXQ9YixuLnB1c2gobykpfWZ1bmN0aW9uIGYoKXtmb3IoYyhUKSxpPVwiXCIsaj1cImluIGRlc2NyaXB0b3JcIjs7KXtpZihrPWEuY2hhckF0KG0pLFwiaW4gZGVzY3JpcHRvclwiPT09ailpZihkKGspKWkmJihoLnB1c2goaSksaT1cIlwiLGo9XCJhZnRlciBkZXNjcmlwdG9yXCIpO2Vsc2V7aWYoXCIsXCI9PT1rKXJldHVybiBtKz0xLGkmJmgucHVzaChpKSx2b2lkIGUoKTtpZihcIihcIj09PWspaSs9ayxqPVwiaW4gcGFyZW5zXCI7ZWxzZXtpZihcIlwiPT09aylyZXR1cm4gaSYmaC5wdXNoKGkpLHZvaWQgZSgpO2krPWt9fWVsc2UgaWYoXCJpbiBwYXJlbnNcIj09PWopaWYoXCIpXCI9PT1rKWkrPWssaj1cImluIGRlc2NyaXB0b3JcIjtlbHNle2lmKFwiXCI9PT1rKXJldHVybiBoLnB1c2goaSksdm9pZCBlKCk7aSs9a31lbHNlIGlmKFwiYWZ0ZXIgZGVzY3JpcHRvclwiPT09ailpZihkKGspKTtlbHNle2lmKFwiXCI9PT1rKXJldHVybiB2b2lkIGUoKTtqPVwiaW4gZGVzY3JpcHRvclwiLG0tPTF9bSs9MX19Zm9yKHZhciBnLGgsaSxqLGssbD1hLmxlbmd0aCxtPTAsbj1bXTs7KXtpZihjKFUpLG0+PWwpcmV0dXJuIG47Zz1jKFYpLGg9W10sXCIsXCI9PT1nLnNsaWNlKC0xKT8oZz1nLnJlcGxhY2UoVyxcIlwiKSxlKCkpOmYoKX19ZnVuY3Rpb24gbihhKXtmdW5jdGlvbiBiKGEpe2Z1bmN0aW9uIGIoKXtmJiYoZy5wdXNoKGYpLGY9XCJcIil9ZnVuY3Rpb24gYygpe2dbMF0mJihoLnB1c2goZyksZz1bXSl9Zm9yKHZhciBlLGY9XCJcIixnPVtdLGg9W10saT0wLGo9MCxrPSExOzspe2lmKGU9YS5jaGFyQXQoaiksXCJcIj09PWUpcmV0dXJuIGIoKSxjKCksaDtpZihrKXtpZihcIipcIj09PWUmJlwiL1wiPT09YVtqKzFdKXtrPSExLGorPTIsYigpO2NvbnRpbnVlfWorPTF9ZWxzZXtpZihkKGUpKXtpZihhLmNoYXJBdChqLTEpJiZkKGEuY2hhckF0KGotMSkpfHwhZil7ais9MTtjb250aW51ZX1pZigwPT09aSl7YigpLGorPTE7Y29udGludWV9ZT1cIiBcIn1lbHNlIGlmKFwiKFwiPT09ZSlpKz0xO2Vsc2UgaWYoXCIpXCI9PT1lKWktPTE7ZWxzZXtpZihcIixcIj09PWUpe2IoKSxjKCksais9MTtjb250aW51ZX1pZihcIi9cIj09PWUmJlwiKlwiPT09YS5jaGFyQXQoaisxKSl7az0hMCxqKz0yO2NvbnRpbnVlfX1mKz1lLGorPTF9fX1mdW5jdGlvbiBjKGEpe3JldHVybiBrLnRlc3QoYSkmJnBhcnNlRmxvYXQoYSk+PTA/ITA6bC50ZXN0KGEpPyEwOlwiMFwiPT09YXx8XCItMFwiPT09YXx8XCIrMFwiPT09YT8hMDohMX12YXIgZSxmLGcsaCxpLGosaz0vXig/OlsrLV0/WzAtOV0rfFswLTldKlxcLlswLTldKykoPzpbZUVdWystXT9bMC05XSspPyg/OmNofGNtfGVtfGV4fGlufG1tfHBjfHB0fHB4fHJlbXx2aHx2bWlufHZtYXh8dncpJC9pLGw9L15jYWxjXFwoKD86WzAtOWEteiBcXC5cXCtcXC1cXCpcXC9cXChcXCldKylcXCkkL2k7Zm9yKGY9YihhKSxnPWYubGVuZ3RoLGU9MDtnPmU7ZSsrKWlmKGg9ZltlXSxpPWhbaC5sZW5ndGgtMV0sYyhpKSl7aWYoaj1pLGgucG9wKCksMD09PWgubGVuZ3RoKXJldHVybiBqO2lmKGg9aC5qb2luKFwiIFwiKSxzLm1hdGNoZXNNZWRpYShoKSlyZXR1cm4gan1yZXR1cm5cIjEwMHZ3XCJ9Yi5jcmVhdGVFbGVtZW50KFwicGljdHVyZVwiKTt2YXIgbyxwLHEscixzPXt9LHQ9ITEsdT1mdW5jdGlvbigpe30sdj1iLmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiksdz12LmdldEF0dHJpYnV0ZSx4PXYuc2V0QXR0cmlidXRlLHk9di5yZW1vdmVBdHRyaWJ1dGUsej1iLmRvY3VtZW50RWxlbWVudCxBPXt9LEI9e2FsZ29yaXRobTpcIlwifSxDPVwiZGF0YS1wZnNyY1wiLEQ9QytcInNldFwiLEU9bmF2aWdhdG9yLnVzZXJBZ2VudCxGPS9yaWRlbnQvLnRlc3QoRSl8fC9lY2tvLy50ZXN0KEUpJiZFLm1hdGNoKC9ydlxcOihcXGQrKS8pJiZSZWdFeHAuJDE+MzUsRz1cImN1cnJlbnRTcmNcIixIPS9cXHMrXFwrP1xcZCsoZVxcZCspP3cvLEk9LyhcXChbXildK1xcKSk/XFxzKiguKykvLEo9YS5waWN0dXJlZmlsbENGRyxLPVwicG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3Zpc2liaWxpdHk6aGlkZGVuO2Rpc3BsYXk6YmxvY2s7cGFkZGluZzowO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxZW07d2lkdGg6MWVtO292ZXJmbG93OmhpZGRlbjtjbGlwOnJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KVwiLEw9XCJmb250LXNpemU6MTAwJSFpbXBvcnRhbnQ7XCIsTT0hMCxOPXt9LE89e30sUD1hLmRldmljZVBpeGVsUmF0aW8sUT17cHg6MSxcImluXCI6OTZ9LFI9Yi5jcmVhdGVFbGVtZW50KFwiYVwiKSxTPSExLFQ9L15bIFxcdFxcblxcclxcdTAwMGNdKy8sVT0vXlssIFxcdFxcblxcclxcdTAwMGNdKy8sVj0vXlteIFxcdFxcblxcclxcdTAwMGNdKy8sVz0vWyxdKyQvLFg9L15cXGQrJC8sWT0vXi0/KD86WzAtOV0rfFswLTldKlxcLlswLTldKykoPzpbZUVdWystXT9bMC05XSspPyQvLFo9ZnVuY3Rpb24oYSxiLGMsZCl7YS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsZHx8ITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoXCJvblwiK2IsYyl9LCQ9ZnVuY3Rpb24oYSl7dmFyIGI9e307cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBjIGluIGJ8fChiW2NdPWEoYykpLGJbY119fSxfPWZ1bmN0aW9uKCl7dmFyIGE9L14oW1xcZFxcLl0rKShlbXx2d3xweCkkLyxiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWFyZ3VtZW50cyxiPTAsYz1hWzBdOysrYiBpbiBhOyljPWMucmVwbGFjZShhW2JdLGFbKytiXSk7cmV0dXJuIGN9LGM9JChmdW5jdGlvbihhKXtyZXR1cm5cInJldHVybiBcIitiKChhfHxcIlwiKS50b0xvd2VyQ2FzZSgpLC9cXGJhbmRcXGIvZyxcIiYmXCIsLywvZyxcInx8XCIsL21pbi0oW2Etei1cXHNdKyk6L2csXCJlLiQxPj1cIiwvbWF4LShbYS16LVxcc10rKTovZyxcImUuJDE8PVwiLC9jYWxjKFteKV0rKS9nLFwiKCQxKVwiLC8oXFxkK1tcXC5dKltcXGRdKikoW2Etel0rKS9nLFwiKCQxICogZS4kMilcIiwvXig/IShlLlthLXpdfFswLTlcXC4mPXw+PFxcK1xcLVxcKlxcKFxcKVxcL10pKS4qL2dpLFwiXCIpK1wiO1wifSk7cmV0dXJuIGZ1bmN0aW9uKGIsZCl7dmFyIGU7aWYoIShiIGluIE4pKWlmKE5bYl09ITEsZCYmKGU9Yi5tYXRjaChhKSkpTltiXT1lWzFdKlFbZVsyXV07ZWxzZSB0cnl7TltiXT1uZXcgRnVuY3Rpb24oXCJlXCIsYyhiKSkoUSl9Y2F0Y2goZil7fXJldHVybiBOW2JdfX0oKSxhYT1mdW5jdGlvbihhLGIpe3JldHVybiBhLnc/KGEuY1dpZHRoPXMuY2FsY0xpc3RMZW5ndGgoYnx8XCIxMDB2d1wiKSxhLnJlcz1hLncvYS5jV2lkdGgpOmEucmVzPWEuZCxhfSxiYT1mdW5jdGlvbihhKXtpZih0KXt2YXIgYyxkLGUsZj1hfHx7fTtpZihmLmVsZW1lbnRzJiYxPT09Zi5lbGVtZW50cy5ub2RlVHlwZSYmKFwiSU1HXCI9PT1mLmVsZW1lbnRzLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk/Zi5lbGVtZW50cz1bZi5lbGVtZW50c106KGYuY29udGV4dD1mLmVsZW1lbnRzLGYuZWxlbWVudHM9bnVsbCkpLGM9Zi5lbGVtZW50c3x8cy5xc2EoZi5jb250ZXh0fHxiLGYucmVldmFsdWF0ZXx8Zi5yZXNlbGVjdD9zLnNlbDpzLnNlbFNob3J0KSxlPWMubGVuZ3RoKXtmb3Iocy5zZXR1cFJ1bihmKSxTPSEwLGQ9MDtlPmQ7ZCsrKXMuZmlsbEltZyhjW2RdLGYpO3MudGVhcmRvd25SdW4oZil9fX07bz1hLmNvbnNvbGUmJmNvbnNvbGUud2Fybj9mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oYSl9OnUsRyBpbiB2fHwoRz1cInNyY1wiKSxBW1wiaW1hZ2UvanBlZ1wiXT0hMCxBW1wiaW1hZ2UvZ2lmXCJdPSEwLEFbXCJpbWFnZS9wbmdcIl09ITAsQVtcImltYWdlL3N2Zyt4bWxcIl09Yi5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKFwiaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNJbWFnZVwiLFwiMS4xXCIpLHMubnM9KFwicGZcIisobmV3IERhdGUpLmdldFRpbWUoKSkuc3Vic3RyKDAsOSkscy5zdXBTcmNzZXQ9XCJzcmNzZXRcImluIHYscy5zdXBTaXplcz1cInNpemVzXCJpbiB2LHMuc3VwUGljdHVyZT0hIWEuSFRNTFBpY3R1cmVFbGVtZW50LHMuc3VwU3Jjc2V0JiZzLnN1cFBpY3R1cmUmJiFzLnN1cFNpemVzJiYhZnVuY3Rpb24oYSl7di5zcmNzZXQ9XCJkYXRhOixhXCIsYS5zcmM9XCJkYXRhOixhXCIscy5zdXBTcmNzZXQ9di5jb21wbGV0ZT09PWEuY29tcGxldGUscy5zdXBQaWN0dXJlPXMuc3VwU3Jjc2V0JiZzLnN1cFBpY3R1cmV9KGIuY3JlYXRlRWxlbWVudChcImltZ1wiKSkscy5zdXBTcmNzZXQmJiFzLnN1cFNpemVzPyFmdW5jdGlvbigpe3ZhciBhPVwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQWdBQkFQQUFBUC8vL3dBQUFDSDVCQUFBQUFBQUxBQUFBQUFDQUFFQUFBSUNCQW9BT3c9PVwiLGM9XCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFBQUFDSDVCQUVLQUFFQUxBQUFBQUFCQUFFQUFBSUNUQUVBT3c9PVwiLGQ9Yi5jcmVhdGVFbGVtZW50KFwiaW1nXCIpLGU9ZnVuY3Rpb24oKXt2YXIgYT1kLndpZHRoOzI9PT1hJiYocy5zdXBTaXplcz0hMCkscT1zLnN1cFNyY3NldCYmIXMuc3VwU2l6ZXMsdD0hMCxzZXRUaW1lb3V0KGJhKX07ZC5vbmxvYWQ9ZSxkLm9uZXJyb3I9ZSxkLnNldEF0dHJpYnV0ZShcInNpemVzXCIsXCI5cHhcIiksZC5zcmNzZXQ9YytcIiAxdyxcIithK1wiIDl3XCIsZC5zcmM9Y30oKTp0PSEwLHMuc2VsU2hvcnQ9XCJwaWN0dXJlPmltZyxpbWdbc3Jjc2V0XVwiLHMuc2VsPXMuc2VsU2hvcnQscy5jZmc9QixzLkRQUj1QfHwxLHMudT1RLHMudHlwZXM9QSxzLnNldFNpemU9dSxzLm1ha2VVcmw9JChmdW5jdGlvbihhKXtyZXR1cm4gUi5ocmVmPWEsUi5ocmVmfSkscy5xc2E9ZnVuY3Rpb24oYSxiKXtyZXR1cm5cInF1ZXJ5U2VsZWN0b3JcImluIGE/YS5xdWVyeVNlbGVjdG9yQWxsKGIpOltdfSxzLm1hdGNoZXNNZWRpYT1mdW5jdGlvbigpe3JldHVybiBhLm1hdGNoTWVkaWEmJihtYXRjaE1lZGlhKFwiKG1pbi13aWR0aDogMC4xZW0pXCIpfHx7fSkubWF0Y2hlcz9zLm1hdGNoZXNNZWRpYT1mdW5jdGlvbihhKXtyZXR1cm4hYXx8bWF0Y2hNZWRpYShhKS5tYXRjaGVzfTpzLm1hdGNoZXNNZWRpYT1zLm1NUSxzLm1hdGNoZXNNZWRpYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHMubU1RPWZ1bmN0aW9uKGEpe3JldHVybiBhP18oYSk6ITB9LHMuY2FsY0xlbmd0aD1mdW5jdGlvbihhKXt2YXIgYj1fKGEsITApfHwhMTtyZXR1cm4gMD5iJiYoYj0hMSksYn0scy5zdXBwb3J0c1R5cGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGE/QVthXTohMH0scy5wYXJzZVNpemU9JChmdW5jdGlvbihhKXt2YXIgYj0oYXx8XCJcIikubWF0Y2goSSk7cmV0dXJue21lZGlhOmImJmJbMV0sbGVuZ3RoOmImJmJbMl19fSkscy5wYXJzZVNldD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jYW5kc3x8KGEuY2FuZHM9bShhLnNyY3NldCxhKSksYS5jYW5kc30scy5nZXRFbVZhbHVlPWZ1bmN0aW9uKCl7dmFyIGE7aWYoIXAmJihhPWIuYm9keSkpe3ZhciBjPWIuY3JlYXRlRWxlbWVudChcImRpdlwiKSxkPXouc3R5bGUuY3NzVGV4dCxlPWEuc3R5bGUuY3NzVGV4dDtjLnN0eWxlLmNzc1RleHQ9Syx6LnN0eWxlLmNzc1RleHQ9TCxhLnN0eWxlLmNzc1RleHQ9TCxhLmFwcGVuZENoaWxkKGMpLHA9Yy5vZmZzZXRXaWR0aCxhLnJlbW92ZUNoaWxkKGMpLHA9cGFyc2VGbG9hdChwLDEwKSx6LnN0eWxlLmNzc1RleHQ9ZCxhLnN0eWxlLmNzc1RleHQ9ZX1yZXR1cm4gcHx8MTZ9LHMuY2FsY0xpc3RMZW5ndGg9ZnVuY3Rpb24oYSl7aWYoIShhIGluIE8pfHxCLnVUKXt2YXIgYj1zLmNhbGNMZW5ndGgobihhKSk7T1thXT1iP2I6US53aWR0aH1yZXR1cm4gT1thXX0scy5zZXRSZXM9ZnVuY3Rpb24oYSl7dmFyIGI7aWYoYSl7Yj1zLnBhcnNlU2V0KGEpO2Zvcih2YXIgYz0wLGQ9Yi5sZW5ndGg7ZD5jO2MrKylhYShiW2NdLGEuc2l6ZXMpfXJldHVybiBifSxzLnNldFJlcy5yZXM9YWEscy5hcHBseVNldENhbmRpZGF0ZT1mdW5jdGlvbihhLGIpe2lmKGEubGVuZ3RoKXt2YXIgYyxkLGUsZixoLGssbCxtLG4sbz1iW3MubnNdLHA9cy5EUFI7aWYoaz1vLmN1clNyY3x8YltHXSxsPW8uY3VyQ2FufHxqKGIsayxhWzBdLnNldCksbCYmbC5zZXQ9PT1hWzBdLnNldCYmKG49RiYmIWIuY29tcGxldGUmJmwucmVzLS4xPnAsbnx8KGwuY2FjaGVkPSEwLGwucmVzPj1wJiYoaD1sKSkpLCFoKWZvcihhLnNvcnQoaSksZj1hLmxlbmd0aCxoPWFbZi0xXSxkPTA7Zj5kO2QrKylpZihjPWFbZF0sYy5yZXM+PXApe2U9ZC0xLGg9YVtlXSYmKG58fGshPT1zLm1ha2VVcmwoYy51cmwpKSYmZyhhW2VdLnJlcyxjLnJlcyxwLGFbZV0uY2FjaGVkKT9hW2VdOmM7YnJlYWt9aCYmKG09cy5tYWtlVXJsKGgudXJsKSxvLmN1clNyYz1tLG8uY3VyQ2FuPWgsbSE9PWsmJnMuc2V0U3JjKGIsaCkscy5zZXRTaXplKGIpKX19LHMuc2V0U3JjPWZ1bmN0aW9uKGEsYil7dmFyIGM7YS5zcmM9Yi51cmwsXCJpbWFnZS9zdmcreG1sXCI9PT1iLnNldC50eXBlJiYoYz1hLnN0eWxlLndpZHRoLGEuc3R5bGUud2lkdGg9YS5vZmZzZXRXaWR0aCsxK1wicHhcIixhLm9mZnNldFdpZHRoKzEmJihhLnN0eWxlLndpZHRoPWMpKX0scy5nZXRTZXQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9ITEsZj1hW3MubnNdLnNldHM7Zm9yKGI9MDtiPGYubGVuZ3RoJiYhZTtiKyspaWYoYz1mW2JdLGMuc3Jjc2V0JiZzLm1hdGNoZXNNZWRpYShjLm1lZGlhKSYmKGQ9cy5zdXBwb3J0c1R5cGUoYy50eXBlKSkpe1wicGVuZGluZ1wiPT09ZCYmKGM9ZCksZT1jO2JyZWFrfXJldHVybiBlfSxzLnBhcnNlU2V0cz1mdW5jdGlvbihhLGIsZCl7dmFyIGUsZixnLGgsaT1iJiZcIlBJQ1RVUkVcIj09PWIubm9kZU5hbWUudG9VcHBlckNhc2UoKSxqPWFbcy5uc107KGouc3JjPT09Y3x8ZC5zcmMpJiYoai5zcmM9dy5jYWxsKGEsXCJzcmNcIiksai5zcmM/eC5jYWxsKGEsQyxqLnNyYyk6eS5jYWxsKGEsQykpLChqLnNyY3NldD09PWN8fGQuc3Jjc2V0fHwhcy5zdXBTcmNzZXR8fGEuc3Jjc2V0KSYmKGU9dy5jYWxsKGEsXCJzcmNzZXRcIiksai5zcmNzZXQ9ZSxoPSEwKSxqLnNldHM9W10saSYmKGoucGljPSEwLGwoYixqLnNldHMpKSxqLnNyY3NldD8oZj17c3Jjc2V0Omouc3Jjc2V0LHNpemVzOncuY2FsbChhLFwic2l6ZXNcIil9LGouc2V0cy5wdXNoKGYpLGc9KHF8fGouc3JjKSYmSC50ZXN0KGouc3Jjc2V0fHxcIlwiKSxnfHwhai5zcmN8fGsoai5zcmMsZil8fGYuaGFzMXh8fChmLnNyY3NldCs9XCIsIFwiK2ouc3JjLGYuY2FuZHMucHVzaCh7dXJsOmouc3JjLGQ6MSxzZXQ6Zn0pKSk6ai5zcmMmJmouc2V0cy5wdXNoKHtzcmNzZXQ6ai5zcmMsc2l6ZXM6bnVsbH0pLGouY3VyQ2FuPW51bGwsai5jdXJTcmM9YyxqLnN1cHBvcnRlZD0hKGl8fGYmJiFzLnN1cFNyY3NldHx8ZyYmIXMuc3VwU2l6ZXMpLGgmJnMuc3VwU3Jjc2V0JiYhai5zdXBwb3J0ZWQmJihlPyh4LmNhbGwoYSxELGUpLGEuc3Jjc2V0PVwiXCIpOnkuY2FsbChhLEQpKSxqLnN1cHBvcnRlZCYmIWouc3Jjc2V0JiYoIWouc3JjJiZhLnNyY3x8YS5zcmMhPT1zLm1ha2VVcmwoai5zcmMpKSYmKG51bGw9PT1qLnNyYz9hLnJlbW92ZUF0dHJpYnV0ZShcInNyY1wiKTphLnNyYz1qLnNyYyksai5wYXJzZWQ9ITB9LHMuZmlsbEltZz1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9Yi5yZXNlbGVjdHx8Yi5yZWV2YWx1YXRlO2Fbcy5uc118fChhW3MubnNdPXt9KSxjPWFbcy5uc10sKGR8fGMuZXZhbGVkIT09cikmJigoIWMucGFyc2VkfHxiLnJlZXZhbHVhdGUpJiZzLnBhcnNlU2V0cyhhLGEucGFyZW50Tm9kZSxiKSxjLnN1cHBvcnRlZD9jLmV2YWxlZD1yOmgoYSkpfSxzLnNldHVwUnVuPWZ1bmN0aW9uKCl7KCFTfHxNfHxQIT09YS5kZXZpY2VQaXhlbFJhdGlvKSYmZigpfSxzLnN1cFBpY3R1cmU/KGJhPXUscy5maWxsSW1nPXUpOiFmdW5jdGlvbigpe3ZhciBjLGQ9YS5hdHRhY2hFdmVudD8vZCR8XmMvOi9kJHxeY3xeaS8sZT1mdW5jdGlvbigpe3ZhciBhPWIucmVhZHlTdGF0ZXx8XCJcIjtmPXNldFRpbWVvdXQoZSxcImxvYWRpbmdcIj09PWE/MjAwOjk5OSksYi5ib2R5JiYocy5maWxsSW1ncygpLGM9Y3x8ZC50ZXN0KGEpLGMmJmNsZWFyVGltZW91dChmKSl9LGY9c2V0VGltZW91dChlLGIuYm9keT85Ojk5KSxnPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWZ1bmN0aW9uKCl7dmFyIGY9bmV3IERhdGUtZDtiPmY/Yz1zZXRUaW1lb3V0KGUsYi1mKTooYz1udWxsLGEoKSl9O3JldHVybiBmdW5jdGlvbigpe2Q9bmV3IERhdGUsY3x8KGM9c2V0VGltZW91dChlLGIpKX19LGg9ei5jbGllbnRIZWlnaHQsaT1mdW5jdGlvbigpe009TWF0aC5tYXgoYS5pbm5lcldpZHRofHwwLHouY2xpZW50V2lkdGgpIT09US53aWR0aHx8ei5jbGllbnRIZWlnaHQhPT1oLGg9ei5jbGllbnRIZWlnaHQsTSYmcy5maWxsSW1ncygpfTtaKGEsXCJyZXNpemVcIixnKGksOTkpKSxaKGIsXCJyZWFkeXN0YXRlY2hhbmdlXCIsZSl9KCkscy5waWN0dXJlZmlsbD1iYSxzLmZpbGxJbWdzPWJhLHMudGVhcmRvd25SdW49dSxiYS5fPXMsYS5waWN0dXJlZmlsbENGRz17cGY6cyxwdXNoOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc2hpZnQoKTtcImZ1bmN0aW9uXCI9PXR5cGVvZiBzW2JdP3NbYl0uYXBwbHkocyxhKTooQltiXT1hWzBdLFMmJnMuZmlsbEltZ3Moe3Jlc2VsZWN0OiEwfSkpfX07Zm9yKDtKJiZKLmxlbmd0aDspYS5waWN0dXJlZmlsbENGRy5wdXNoKEouc2hpZnQoKSk7YS5waWN0dXJlZmlsbD1iYSxcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YmE6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoXCJwaWN0dXJlZmlsbFwiLGZ1bmN0aW9uKCl7cmV0dXJuIGJhfSkscy5zdXBQaWN0dXJlfHwoQVtcImltYWdlL3dlYnBcIl09ZShcImltYWdlL3dlYnBcIixcImRhdGE6aW1hZ2Uvd2VicDtiYXNlNjQsVWtsR1Jrb0FBQUJYUlVKUVZsQTRXQW9BQUFBUUFBQUFBQUFBQUFBQVFVeFFTQXdBQUFBQkJ4QVIvUTlFUlA4REFBQldVRGdnR0FBQUFEQUJBSjBCS2dFQUFRQURBRFFscEFBRGNBRCsrLzFRQUE9PVwiKSl9KHdpbmRvdyxkb2N1bWVudCk7IiwiLyohIFVJa2l0IDIuMjUuMCB8IGh0dHA6Ly93d3cuZ2V0dWlraXQuY29tIHwgKGMpIDIwMTQgWU9PdGhlbWUgfCBNSVQgTGljZW5zZSAqL1xuIWZ1bmN0aW9uKHQpe3ZhciBpO3dpbmRvdy5VSWtpdCYmKGk9dChVSWtpdCkpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKFwidWlraXQtYWNjb3JkaW9uXCIsW1widWlraXRcIl0sZnVuY3Rpb24oKXtyZXR1cm4gaXx8dChVSWtpdCl9KX0oZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaShpKXt2YXIgbz10LiQoaSksZT1cImF1dG9cIjtpZihvLmlzKFwiOnZpc2libGVcIikpZT1vLm91dGVySGVpZ2h0KCk7ZWxzZXt2YXIgYT17cG9zaXRpb246by5jc3MoXCJwb3NpdGlvblwiKSx2aXNpYmlsaXR5Om8uY3NzKFwidmlzaWJpbGl0eVwiKSxkaXNwbGF5Om8uY3NzKFwiZGlzcGxheVwiKX07ZT1vLmNzcyh7cG9zaXRpb246XCJhYnNvbHV0ZVwiLHZpc2liaWxpdHk6XCJoaWRkZW5cIixkaXNwbGF5OlwiYmxvY2tcIn0pLm91dGVySGVpZ2h0KCksby5jc3MoYSl9cmV0dXJuIGV9cmV0dXJuIHQuY29tcG9uZW50KFwiYWNjb3JkaW9uXCIse2RlZmF1bHRzOntzaG93Zmlyc3Q6ITAsY29sbGFwc2U6ITAsYW5pbWF0ZTohMCxlYXNpbmc6XCJzd2luZ1wiLGR1cmF0aW9uOjMwMCx0b2dnbGU6XCIudWstYWNjb3JkaW9uLXRpdGxlXCIsY29udGFpbmVyczpcIi51ay1hY2NvcmRpb24tY29udGVudFwiLGNsc2FjdGl2ZTpcInVrLWFjdGl2ZVwifSxib290OmZ1bmN0aW9uKCl7dC5yZWFkeShmdW5jdGlvbihpKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC4kKFwiW2RhdGEtdWstYWNjb3JkaW9uXVwiLGkpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT10LiQodGhpcyk7aS5kYXRhKFwiYWNjb3JkaW9uXCIpfHx0LmFjY29yZGlvbihpLHQuVXRpbHMub3B0aW9ucyhpLmF0dHIoXCJkYXRhLXVrLWFjY29yZGlvblwiKSkpfSl9LDApfSl9LGluaXQ6ZnVuY3Rpb24oKXt2YXIgaT10aGlzO3RoaXMuZWxlbWVudC5vbihcImNsaWNrLnVrLmFjY29yZGlvblwiLHRoaXMub3B0aW9ucy50b2dnbGUsZnVuY3Rpb24obyl7by5wcmV2ZW50RGVmYXVsdCgpLGkudG9nZ2xlSXRlbSh0LiQodGhpcykuZGF0YShcIndyYXBwZXJcIiksaS5vcHRpb25zLmFuaW1hdGUsaS5vcHRpb25zLmNvbGxhcHNlKX0pLHRoaXMudXBkYXRlKCksdGhpcy5vcHRpb25zLnNob3dmaXJzdCYmdGhpcy50b2dnbGVJdGVtKHRoaXMudG9nZ2xlLmVxKDApLmRhdGEoXCJ3cmFwcGVyXCIpLCExLCExKX0sdG9nZ2xlSXRlbTpmdW5jdGlvbihvLGUsYSl7dmFyIG49dGhpcztvLmRhdGEoXCJ0b2dnbGVcIikudG9nZ2xlQ2xhc3ModGhpcy5vcHRpb25zLmNsc2FjdGl2ZSksby5kYXRhKFwiY29udGVudFwiKS50b2dnbGVDbGFzcyh0aGlzLm9wdGlvbnMuY2xzYWN0aXZlKTt2YXIgcz1vLmRhdGEoXCJ0b2dnbGVcIikuaGFzQ2xhc3ModGhpcy5vcHRpb25zLmNsc2FjdGl2ZSk7YSYmKHRoaXMudG9nZ2xlLm5vdChvLmRhdGEoXCJ0b2dnbGVcIikpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5jbHNhY3RpdmUpLHRoaXMuY29udGVudC5ub3Qoby5kYXRhKFwiY29udGVudFwiKSkucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmNsc2FjdGl2ZSkucGFyZW50KCkuc3RvcCgpLmNzcyhcIm92ZXJmbG93XCIsXCJoaWRkZW5cIikuYW5pbWF0ZSh7aGVpZ2h0OjB9LHtlYXNpbmc6dGhpcy5vcHRpb25zLmVhc2luZyxkdXJhdGlvbjplP3RoaXMub3B0aW9ucy5kdXJhdGlvbjowfSkuYXR0cihcImFyaWEtZXhwYW5kZWRcIixcImZhbHNlXCIpKSxvLnN0b3AoKS5jc3MoXCJvdmVyZmxvd1wiLFwiaGlkZGVuXCIpLGU/by5hbmltYXRlKHtoZWlnaHQ6cz9pKG8uZGF0YShcImNvbnRlbnRcIikpOjB9LHtlYXNpbmc6dGhpcy5vcHRpb25zLmVhc2luZyxkdXJhdGlvbjp0aGlzLm9wdGlvbnMuZHVyYXRpb24sY29tcGxldGU6ZnVuY3Rpb24oKXtzJiYoby5jc3Moe292ZXJmbG93OlwiXCIsaGVpZ2h0OlwiYXV0b1wifSksdC5VdGlscy5jaGVja0Rpc3BsYXkoby5kYXRhKFwiY29udGVudFwiKSkpLG4udHJpZ2dlcihcImRpc3BsYXkudWsuY2hlY2tcIil9fSk6KG8uaGVpZ2h0KHM/XCJhdXRvXCI6MCkscyYmKG8uY3NzKHtvdmVyZmxvdzpcIlwifSksdC5VdGlscy5jaGVja0Rpc3BsYXkoby5kYXRhKFwiY29udGVudFwiKSkpLHRoaXMudHJpZ2dlcihcImRpc3BsYXkudWsuY2hlY2tcIikpLG8uYXR0cihcImFyaWEtZXhwYW5kZWRcIixzKSx0aGlzLmVsZW1lbnQudHJpZ2dlcihcInRvZ2dsZS51ay5hY2NvcmRpb25cIixbcyxvLmRhdGEoXCJ0b2dnbGVcIiksby5kYXRhKFwiY29udGVudFwiKV0pfSx1cGRhdGU6ZnVuY3Rpb24oKXt2YXIgaSxvLGUsYT10aGlzO3RoaXMudG9nZ2xlPXRoaXMuZmluZCh0aGlzLm9wdGlvbnMudG9nZ2xlKSx0aGlzLmNvbnRlbnQ9dGhpcy5maW5kKHRoaXMub3B0aW9ucy5jb250YWluZXJzKSx0aGlzLmNvbnRlbnQuZWFjaChmdW5jdGlvbihuKXtpPXQuJCh0aGlzKSxpLnBhcmVudCgpLmRhdGEoXCJ3cmFwcGVyXCIpP289aS5wYXJlbnQoKToobz10LiQodGhpcykud3JhcCgnPGRpdiBkYXRhLXdyYXBwZXI9XCJ0cnVlXCIgc3R5bGU9XCJvdmVyZmxvdzpoaWRkZW47aGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7XCI+PC9kaXY+JykucGFyZW50KCksby5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLFwiZmFsc2VcIikpLGU9YS50b2dnbGUuZXEobiksby5kYXRhKFwidG9nZ2xlXCIsZSksby5kYXRhKFwiY29udGVudFwiLGkpLGUuZGF0YShcIndyYXBwZXJcIixvKSxpLmRhdGEoXCJ3cmFwcGVyXCIsbyl9KSx0aGlzLmVsZW1lbnQudHJpZ2dlcihcInVwZGF0ZS51ay5hY2NvcmRpb25cIixbdGhpc10pfX0pLHQuYWNjb3JkaW9ufSk7IiwiLyohIFVJa2l0IDIuMjcuNCB8IGh0dHA6Ly93d3cuZ2V0dWlraXQuY29tIHwgKGMpIDIwMTQgWU9PdGhlbWUgfCBNSVQgTGljZW5zZSAqL1xuIWZ1bmN0aW9uKGkpe3ZhciB0O3dpbmRvdy5VSWtpdDImJih0PWkoVUlraXQyKSksXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoXCJ1aWtpdC1saWdodGJveFwiLFtcInVpa2l0XCJdLGZ1bmN0aW9uKCl7cmV0dXJuIHR8fGkoVUlraXQyKX0pfShmdW5jdGlvbihpKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KHQpe2lmKGUpcmV0dXJuIGUubGlnaHRib3g9dCxlO2U9aS4kKFsnPGRpdiBjbGFzcz1cInVrLW1vZGFsXCI+JywnPGRpdiBjbGFzcz1cInVrLW1vZGFsLWRpYWxvZyB1ay1tb2RhbC1kaWFsb2ctbGlnaHRib3ggdWstc2xpZGVuYXYtcG9zaXRpb25cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG87d2lkdGg6MjAwcHg7aGVpZ2h0OjIwMHB4O3RvcDonK01hdGguYWJzKHdpbmRvdy5pbm5lckhlaWdodC8yLTIwMCkrJ3B4O1wiPicsJzxhIGhyZWY9XCIjXCIgY2xhc3M9XCJ1ay1tb2RhbC1jbG9zZSB1ay1jbG9zZSB1ay1jbG9zZS1hbHRcIj48L2E+JywnPGRpdiBjbGFzcz1cInVrLWxpZ2h0Ym94LWNvbnRlbnRcIj48L2Rpdj4nLCc8ZGl2IGNsYXNzPVwidWstbW9kYWwtc3Bpbm5lciB1ay1oaWRkZW5cIj48L2Rpdj4nLFwiPC9kaXY+XCIsXCI8L2Rpdj5cIl0uam9pbihcIlwiKSkuYXBwZW5kVG8oXCJib2R5XCIpLGUuZGlhbG9nPWUuZmluZChcIi51ay1tb2RhbC1kaWFsb2c6Zmlyc3RcIiksZS5jb250ZW50PWUuZmluZChcIi51ay1saWdodGJveC1jb250ZW50OmZpcnN0XCIpLGUubG9hZGVyPWUuZmluZChcIi51ay1tb2RhbC1zcGlubmVyOmZpcnN0XCIpLGUuY2xvc2VyPWUuZmluZChcIi51ay1jbG9zZS51ay1jbG9zZS1hbHRcIiksZS5tb2RhbD1pLm1vZGFsKGUse21vZGFsOiExfSksZS5vbihcInN3aXBlUmlnaHQgc3dpcGVMZWZ0XCIsZnVuY3Rpb24oaSl7ZS5saWdodGJveFtcInN3aXBlTGVmdFwiPT1pLnR5cGU/XCJuZXh0XCI6XCJwcmV2aW91c1wiXSgpfSkub24oXCJjbGlja1wiLFwiW2RhdGEtbGlnaHRib3gtcHJldmlvdXNdLCBbZGF0YS1saWdodGJveC1uZXh0XVwiLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSxlLmxpZ2h0Ym94W2kuJCh0aGlzKS5pcyhcIltkYXRhLWxpZ2h0Ym94LW5leHRdXCIpP1wibmV4dFwiOlwicHJldmlvdXNcIl0oKX0pLGUub24oXCJoaWRlLnVrLm1vZGFsXCIsZnVuY3Rpb24oKXtlLmNvbnRlbnQuaHRtbChcIlwiKX0pO3ZhciBvPXt3OndpbmRvdy5pbm5lcldpZHRoLGg6d2luZG93LmlubmVySGVpZ2h0fTtyZXR1cm4gaS4kd2luLm9uKFwibG9hZCByZXNpemUgb3JpZW50YXRpb25jaGFuZ2VcIixpLlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uKCl7by53IT09d2luZG93LmlubmVyV2lkdGgmJmUuaXMoXCI6dmlzaWJsZVwiKSYmIWkuVXRpbHMuaXNGdWxsc2NyZWVuKCkmJmUubGlnaHRib3guZml0U2l6ZSgpLG89e3c6d2luZG93LmlubmVyV2lkdGgsaDp3aW5kb3cuaW5uZXJIZWlnaHR9fSwxMDApKSxlLmxpZ2h0Ym94PXQsZX12YXIgZSxvPXt9O3JldHVybiBpLmNvbXBvbmVudChcImxpZ2h0Ym94XCIse2RlZmF1bHRzOnthbGxvd2Z1bGxzY3JlZW46ITAsZHVyYXRpb246NDAwLGdyb3VwOiExLGtleWJvYXJkOiEwfSxpbmRleDowLGl0ZW1zOiExLGJvb3Q6ZnVuY3Rpb24oKXtpLiRodG1sLm9uKFwiY2xpY2tcIixcIltkYXRhLXVrLWxpZ2h0Ym94XVwiLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKTt2YXIgZT1pLiQodGhpcyk7ZS5kYXRhKFwibGlnaHRib3hcIil8fGkubGlnaHRib3goZSxpLlV0aWxzLm9wdGlvbnMoZS5hdHRyKFwiZGF0YS11ay1saWdodGJveFwiKSkpLGUuZGF0YShcImxpZ2h0Ym94XCIpLnNob3coZSl9KSxpLiRkb2Mub24oXCJrZXl1cFwiLGZ1bmN0aW9uKGkpe2lmKGUmJmUuaXMoXCI6dmlzaWJsZVwiKSYmZS5saWdodGJveC5vcHRpb25zLmtleWJvYXJkKXN3aXRjaChpLnByZXZlbnREZWZhdWx0KCksaS5rZXlDb2RlKXtjYXNlIDM3OmUubGlnaHRib3gucHJldmlvdXMoKTticmVhaztjYXNlIDM5OmUubGlnaHRib3gubmV4dCgpfX0pfSxpbml0OmZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5pbmRleD0wLHRoaXMuc2libGluZ3M9W10sdGhpcy5lbGVtZW50JiZ0aGlzLmVsZW1lbnQubGVuZ3RoKXt2YXIgZT10aGlzLm9wdGlvbnMuZ3JvdXA/aS4kKCdbZGF0YS11ay1saWdodGJveCo9XCInK3RoaXMub3B0aW9ucy5ncm91cCsnXCJdJyk6dGhpcy5lbGVtZW50O2UuZWFjaChmdW5jdGlvbigpe3ZhciBlPWkuJCh0aGlzKTt0LnB1c2goe3NvdXJjZTplLmF0dHIoXCJocmVmXCIpLHRpdGxlOmUuYXR0cihcImRhdGEtdGl0bGVcIil8fGUuYXR0cihcInRpdGxlXCIpLHR5cGU6ZS5hdHRyKFwiZGF0YS1saWdodGJveC10eXBlXCIpfHxcImF1dG9cIixsaW5rOmV9KX0pLHRoaXMuaW5kZXg9ZS5pbmRleCh0aGlzLmVsZW1lbnQpLHRoaXMuc2libGluZ3M9dH1lbHNlIHRoaXMub3B0aW9ucy5ncm91cCYmdGhpcy5vcHRpb25zLmdyb3VwLmxlbmd0aCYmKHRoaXMuc2libGluZ3M9dGhpcy5vcHRpb25zLmdyb3VwKTt0aGlzLnRyaWdnZXIoXCJsaWdodGJveC1pbml0XCIsW3RoaXNdKX0sc2hvdzpmdW5jdGlvbihlKXt0aGlzLm1vZGFsPXQodGhpcyksdGhpcy5tb2RhbC5kaWFsb2cuc3RvcCgpLHRoaXMubW9kYWwuY29udGVudC5zdG9wKCk7dmFyIG8sbixzPXRoaXMsaD1pLiQuRGVmZXJyZWQoKTtlPWV8fDAsXCJvYmplY3RcIj09dHlwZW9mIGUmJnRoaXMuc2libGluZ3MuZm9yRWFjaChmdW5jdGlvbihpLHQpe2VbMF09PT1pLmxpbmtbMF0mJihlPXQpfSksMD5lP2U9dGhpcy5zaWJsaW5ncy5sZW5ndGgtZTp0aGlzLnNpYmxpbmdzW2VdfHwoZT0wKSxuPXRoaXMuc2libGluZ3NbZV0sbz17bGlnaHRib3g6cyxzb3VyY2U6bi5zb3VyY2UsdHlwZTpuLnR5cGUsaW5kZXg6ZSxwcm9taXNlOmgsdGl0bGU6bi50aXRsZSxpdGVtOm4sbWV0YTp7Y29udGVudDpcIlwiLHdpZHRoOm51bGwsaGVpZ2h0Om51bGx9fSx0aGlzLmluZGV4PWUsdGhpcy5tb2RhbC5jb250ZW50LmVtcHR5KCksdGhpcy5tb2RhbC5pcyhcIjp2aXNpYmxlXCIpfHwodGhpcy5tb2RhbC5jb250ZW50LmNzcyh7d2lkdGg6XCJcIixoZWlnaHQ6XCJcIn0pLmVtcHR5KCksdGhpcy5tb2RhbC5tb2RhbC5zaG93KCkpLHRoaXMubW9kYWwubG9hZGVyLnJlbW92ZUNsYXNzKFwidWstaGlkZGVuXCIpLGgucHJvbWlzZSgpLmRvbmUoZnVuY3Rpb24oKXtzLmRhdGE9byxzLmZpdFNpemUobyl9KS5mYWlsKGZ1bmN0aW9uKCl7by5tZXRhLmNvbnRlbnQ9JzxkaXYgY2xhc3M9XCJ1ay1wb3NpdGlvbi1jb3ZlciB1ay1mbGV4IHVrLWZsZXgtbWlkZGxlIHVrLWZsZXgtY2VudGVyXCI+PHN0cm9uZz5Mb2FkaW5nIHJlc291cmNlIGZhaWxlZCE8L3N0cm9uZz48L2Rpdj4nLG8ubWV0YS53aWR0aD00MDAsby5tZXRhLmhlaWdodD0zMDAscy5kYXRhPW8scy5maXRTaXplKG8pfSkscy50cmlnZ2VyKFwic2hvd2l0ZW0udWsubGlnaHRib3hcIixbb10pfSxmaXRTaXplOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuZGF0YSxvPXRoaXMubW9kYWwuZGlhbG9nLm91dGVyV2lkdGgoKS10aGlzLm1vZGFsLmRpYWxvZy53aWR0aCgpLG49cGFyc2VJbnQodGhpcy5tb2RhbC5kaWFsb2cuY3NzKFwibWFyZ2luLXRvcFwiKSwxMCkscz1wYXJzZUludCh0aGlzLm1vZGFsLmRpYWxvZy5jc3MoXCJtYXJnaW4tYm90dG9tXCIpLDEwKSxoPW4rcyxhPWUubWV0YS5jb250ZW50LGw9dC5vcHRpb25zLmR1cmF0aW9uO3RoaXMuc2libGluZ3MubGVuZ3RoPjEmJihhPVthLCc8YSBocmVmPVwiI1wiIGNsYXNzPVwidWstc2xpZGVuYXYgdWstc2xpZGVuYXYtY29udHJhc3QgdWstc2xpZGVuYXYtcHJldmlvdXMgdWstaGlkZGVuLXRvdWNoXCIgZGF0YS1saWdodGJveC1wcmV2aW91cz48L2E+JywnPGEgaHJlZj1cIiNcIiBjbGFzcz1cInVrLXNsaWRlbmF2IHVrLXNsaWRlbmF2LWNvbnRyYXN0IHVrLXNsaWRlbmF2LW5leHQgdWstaGlkZGVuLXRvdWNoXCIgZGF0YS1saWdodGJveC1uZXh0PjwvYT4nXS5qb2luKFwiXCIpKTt2YXIgZCxyLHU9aS4kKFwiPGRpdj4mbmJzcDs8L2Rpdj5cIikuY3NzKHtvcGFjaXR5OjAscG9zaXRpb246XCJhYnNvbHV0ZVwiLHRvcDowLGxlZnQ6MCx3aWR0aDpcIjEwMCVcIixtYXhXaWR0aDp0Lm1vZGFsLmRpYWxvZy5jc3MoXCJtYXgtd2lkdGhcIikscGFkZGluZzp0Lm1vZGFsLmRpYWxvZy5jc3MoXCJwYWRkaW5nXCIpLG1hcmdpbjp0Lm1vZGFsLmRpYWxvZy5jc3MoXCJtYXJnaW5cIil9KSxjPWUubWV0YS53aWR0aCxnPWUubWV0YS5oZWlnaHQ7dS5hcHBlbmRUbyhcImJvZHlcIikud2lkdGgoKSxkPXUud2lkdGgoKSxyPXdpbmRvdy5pbm5lckhlaWdodC1oLHUucmVtb3ZlKCksdGhpcy5tb2RhbC5kaWFsb2cuZmluZChcIi51ay1tb2RhbC1jYXB0aW9uXCIpLnJlbW92ZSgpLGUudGl0bGUmJih0aGlzLm1vZGFsLmRpYWxvZy5hcHBlbmQoJzxkaXYgY2xhc3M9XCJ1ay1tb2RhbC1jYXB0aW9uXCI+JytlLnRpdGxlK1wiPC9kaXY+XCIpLHItPXRoaXMubW9kYWwuZGlhbG9nLmZpbmQoXCIudWstbW9kYWwtY2FwdGlvblwiKS5vdXRlckhlaWdodCgpKSxkPGUubWV0YS53aWR0aCYmKGc9TWF0aC5mbG9vcihnKihkL2MpKSxjPWQpLGc+ciYmKGc9TWF0aC5mbG9vcihyKSxjPU1hdGguY2VpbChlLm1ldGEud2lkdGgqKHIvZS5tZXRhLmhlaWdodCkpKSx0aGlzLm1vZGFsLmNvbnRlbnQuY3NzKFwib3BhY2l0eVwiLDApLndpZHRoKGMpLmh0bWwoYSksXCJpZnJhbWVcIj09ZS50eXBlJiZ0aGlzLm1vZGFsLmNvbnRlbnQuZmluZChcImlmcmFtZTpmaXJzdFwiKS5oZWlnaHQoZyk7dmFyIG09ZytvLHA9TWF0aC5mbG9vcih3aW5kb3cuaW5uZXJIZWlnaHQvMi1tLzIpLWg7MD5wJiYocD0wKSx0aGlzLm1vZGFsLmNsb3Nlci5hZGRDbGFzcyhcInVrLWhpZGRlblwiKSx0Lm1vZGFsLmRhdGEoXCJtd2lkdGhcIik9PWMmJnQubW9kYWwuZGF0YShcIm1oZWlnaHRcIik9PWcmJihsPTApLHRoaXMubW9kYWwuZGlhbG9nLmFuaW1hdGUoe3dpZHRoOmMrbyxoZWlnaHQ6ZytvLHRvcDpwfSxsLFwic3dpbmdcIixmdW5jdGlvbigpe3QubW9kYWwubG9hZGVyLmFkZENsYXNzKFwidWstaGlkZGVuXCIpLHQubW9kYWwuY29udGVudC5jc3Moe3dpZHRoOlwiXCJ9KS5hbmltYXRlKHtvcGFjaXR5OjF9LGZ1bmN0aW9uKCl7dC5tb2RhbC5jbG9zZXIucmVtb3ZlQ2xhc3MoXCJ1ay1oaWRkZW5cIil9KSx0Lm1vZGFsLmRhdGEoe213aWR0aDpjLG1oZWlnaHQ6Z30pfSl9LG5leHQ6ZnVuY3Rpb24oKXt0aGlzLnNob3codGhpcy5zaWJsaW5nc1t0aGlzLmluZGV4KzFdP3RoaXMuaW5kZXgrMTowKX0scHJldmlvdXM6ZnVuY3Rpb24oKXt0aGlzLnNob3codGhpcy5zaWJsaW5nc1t0aGlzLmluZGV4LTFdP3RoaXMuaW5kZXgtMTp0aGlzLnNpYmxpbmdzLmxlbmd0aC0xKX19KSxpLnBsdWdpbihcImxpZ2h0Ym94XCIsXCJpbWFnZVwiLHtpbml0OmZ1bmN0aW9uKGkpe2kub24oXCJzaG93aXRlbS51ay5saWdodGJveFwiLGZ1bmN0aW9uKGksdCl7aWYoXCJpbWFnZVwiPT10LnR5cGV8fHQuc291cmNlJiZ0LnNvdXJjZS5tYXRjaCgvXFwuKGpwZ3xqcGVnfHBuZ3xnaWZ8c3ZnKSQvaSkpe3ZhciBlPWZ1bmN0aW9uKGksZSxvKXt0Lm1ldGE9e2NvbnRlbnQ6JzxpbWcgY2xhc3M9XCJ1ay1yZXNwb25zaXZlLXdpZHRoXCIgd2lkdGg9XCInK2UrJ1wiIGhlaWdodD1cIicrbysnXCIgc3JjID1cIicraSsnXCI+Jyx3aWR0aDplLGhlaWdodDpvfSx0LnR5cGU9XCJpbWFnZVwiLHQucHJvbWlzZS5yZXNvbHZlKCl9O2lmKG9bdC5zb3VyY2VdKWUodC5zb3VyY2Usb1t0LnNvdXJjZV0ud2lkdGgsb1t0LnNvdXJjZV0uaGVpZ2h0KTtlbHNle3ZhciBuPW5ldyBJbWFnZTtuLm9uZXJyb3I9ZnVuY3Rpb24oKXt0LnByb21pc2UucmVqZWN0KFwiTG9hZGluZyBpbWFnZSBmYWlsZWRcIil9LG4ub25sb2FkPWZ1bmN0aW9uKCl7b1t0LnNvdXJjZV09e3dpZHRoOm4ud2lkdGgsaGVpZ2h0Om4uaGVpZ2h0fSxlKHQuc291cmNlLG9bdC5zb3VyY2VdLndpZHRoLG9bdC5zb3VyY2VdLmhlaWdodCl9LG4uc3JjPXQuc291cmNlfX19KX19KSxpLnBsdWdpbihcImxpZ2h0Ym94XCIsXCJ5b3V0dWJlXCIse2luaXQ6ZnVuY3Rpb24oaSl7dmFyIHQ9LyhcXC9cXC8uKj95b3V0dWJlXFwuW2Etel0rKVxcL3dhdGNoXFw/dj0oW14mXSspJj8oLiopLyxuPS95b3V0dVxcLmJlXFwvKC4qKS87aS5vbihcInNob3dpdGVtLnVrLmxpZ2h0Ym94XCIsZnVuY3Rpb24oaSxzKXt2YXIgaCxhLGw9ZnVuY3Rpb24oaSx0LG8pe3MubWV0YT17Y29udGVudDonPGlmcmFtZSBzcmM9XCIvL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8nK2krJ1wiIHdpZHRoPVwiJyt0KydcIiBoZWlnaHQ9XCInK28rJ1wiIHN0eWxlPVwibWF4LXdpZHRoOjEwMCU7XCInKyhlLmxpZ2h0Ym94Lm9wdGlvbnMuYWxsb3dmdWxsc2NyZWVuP1wiIGFsbG93ZnVsbHNjcmVlblwiOlwiXCIpK1wiPjwvaWZyYW1lPlwiLHdpZHRoOnQsaGVpZ2h0Om99LHMudHlwZT1cImlmcmFtZVwiLHMucHJvbWlzZS5yZXNvbHZlKCl9O2lmKChhPXMuc291cmNlLm1hdGNoKHQpKSYmKGg9YVsyXSksKGE9cy5zb3VyY2UubWF0Y2gobikpJiYoaD1hWzFdKSxoKXtpZihvW2hdKWwoaCxvW2hdLndpZHRoLG9baF0uaGVpZ2h0KTtlbHNle3ZhciBkPW5ldyBJbWFnZSxyPSExO2Qub25lcnJvcj1mdW5jdGlvbigpe29baF09e3dpZHRoOjY0MCxoZWlnaHQ6MzIwfSxsKGgsb1toXS53aWR0aCxvW2hdLmhlaWdodCl9LGQub25sb2FkPWZ1bmN0aW9uKCl7MTIwPT1kLndpZHRoJiY5MD09ZC5oZWlnaHQ/cj8ob1toXT17d2lkdGg6NjQwLGhlaWdodDozMjB9LGwoaCxvW2hdLndpZHRoLG9baF0uaGVpZ2h0KSk6KHI9ITAsZC5zcmM9XCIvL2ltZy55b3V0dWJlLmNvbS92aS9cIitoK1wiLzAuanBnXCIpOihvW2hdPXt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodH0sbChoLGQud2lkdGgsZC5oZWlnaHQpKX0sZC5zcmM9XCIvL2ltZy55b3V0dWJlLmNvbS92aS9cIitoK1wiL21heHJlc2RlZmF1bHQuanBnXCJ9aS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX19KX19KSxpLnBsdWdpbihcImxpZ2h0Ym94XCIsXCJ2aW1lb1wiLHtpbml0OmZ1bmN0aW9uKHQpe3ZhciBuLHM9LyhcXC9cXC8uKj8pdmltZW9cXC5bYS16XStcXC8oWzAtOV0rKS4qPy87dC5vbihcInNob3dpdGVtLnVrLmxpZ2h0Ym94XCIsZnVuY3Rpb24odCxoKXt2YXIgYSxsPWZ1bmN0aW9uKGksdCxvKXtoLm1ldGE9e2NvbnRlbnQ6JzxpZnJhbWUgc3JjPVwiLy9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLycraSsnXCIgd2lkdGg9XCInK3QrJ1wiIGhlaWdodD1cIicrbysnXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtcIicrKGUubGlnaHRib3gub3B0aW9ucy5hbGxvd2Z1bGxzY3JlZW4/XCIgYWxsb3dmdWxsc2NyZWVuXCI6XCJcIikrXCI+PC9pZnJhbWU+XCIsd2lkdGg6dCxoZWlnaHQ6b30saC50eXBlPVwiaWZyYW1lXCIsaC5wcm9taXNlLnJlc29sdmUoKX07KG49aC5zb3VyY2UubWF0Y2gocykpJiYoYT1uWzJdLG9bYV0/bChhLG9bYV0ud2lkdGgsb1thXS5oZWlnaHQpOmkuJC5hamF4KHt0eXBlOlwiR0VUXCIsdXJsOlwiLy92aW1lby5jb20vYXBpL29lbWJlZC5qc29uP3VybD1cIitlbmNvZGVVUkkoaC5zb3VyY2UpLGpzb25wOlwiY2FsbGJhY2tcIixkYXRhVHlwZTpcImpzb25wXCIsc3VjY2VzczpmdW5jdGlvbihpKXtvW2FdPXt3aWR0aDppLndpZHRoLGhlaWdodDppLmhlaWdodH0sbChhLG9bYV0ud2lkdGgsb1thXS5oZWlnaHQpfX0pLHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfSl9fSksaS5wbHVnaW4oXCJsaWdodGJveFwiLFwidmlkZW9cIix7aW5pdDpmdW5jdGlvbih0KXt0Lm9uKFwic2hvd2l0ZW0udWsubGlnaHRib3hcIixmdW5jdGlvbih0LGUpe3ZhciBuPWZ1bmN0aW9uKGksdCxvKXtlLm1ldGE9e2NvbnRlbnQ6Jzx2aWRlbyBjbGFzcz1cInVrLXJlc3BvbnNpdmUtd2lkdGhcIiBzcmM9XCInK2krJ1wiIHdpZHRoPVwiJyt0KydcIiBoZWlnaHQ9XCInK28rJ1wiIGNvbnRyb2xzPjwvdmlkZW8+Jyx3aWR0aDp0LGhlaWdodDpvfSxlLnR5cGU9XCJ2aWRlb1wiLGUucHJvbWlzZS5yZXNvbHZlKCl9O2lmKFwidmlkZW9cIj09ZS50eXBlfHxlLnNvdXJjZS5tYXRjaCgvXFwuKG1wNHx3ZWJtfG9ndikkL2kpKWlmKG9bZS5zb3VyY2VdKW4oZS5zb3VyY2Usb1tlLnNvdXJjZV0ud2lkdGgsb1tlLnNvdXJjZV0uaGVpZ2h0KTtlbHNlIHZhciBzPWkuJCgnPHZpZGVvIHN0eWxlPVwicG9zaXRpb246Zml4ZWQ7dmlzaWJpbGl0eTpoaWRkZW47dG9wOi0xMDAwMHB4O1wiPjwvdmlkZW8+JykuYXR0cihcInNyY1wiLGUuc291cmNlKS5hcHBlbmRUbyhcImJvZHlcIiksaD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3NbMF0udmlkZW9XaWR0aCYmKGNsZWFySW50ZXJ2YWwoaCksb1tlLnNvdXJjZV09e3dpZHRoOnNbMF0udmlkZW9XaWR0aCxoZWlnaHQ6c1swXS52aWRlb0hlaWdodH0sbihlLnNvdXJjZSxvW2Uuc291cmNlXS53aWR0aCxvW2Uuc291cmNlXS5oZWlnaHQpLHMucmVtb3ZlKCkpfSwyMCl9KX19KSxpLnBsdWdpbihcImxpZ2h0Ym94XCIsXCJpZnJhbWVcIix7aW5pdDpmdW5jdGlvbihpKXtpLm9uKFwic2hvd2l0ZW0udWsubGlnaHRib3hcIixmdW5jdGlvbih0LG8pe3ZhciBuPWZ1bmN0aW9uKGksdCxuKXtvLm1ldGE9e2NvbnRlbnQ6JzxpZnJhbWUgY2xhc3M9XCJ1ay1yZXNwb25zaXZlLXdpZHRoXCIgc3JjPVwiJytpKydcIiB3aWR0aD1cIicrdCsnXCIgaGVpZ2h0PVwiJytuKydcIicrKGUubGlnaHRib3gub3B0aW9ucy5hbGxvd2Z1bGxzY3JlZW4/XCIgYWxsb3dmdWxsc2NyZWVuXCI6XCJcIikrXCI+PC9pZnJhbWU+XCIsd2lkdGg6dCxoZWlnaHQ6bn0sby50eXBlPVwiaWZyYW1lXCIsby5wcm9taXNlLnJlc29sdmUoKX07KFwiaWZyYW1lXCI9PT1vLnR5cGV8fG8uc291cmNlLm1hdGNoKC9cXC4oaHRtbHxwaHApJC8pKSYmbihvLnNvdXJjZSxpLm9wdGlvbnMud2lkdGh8fDgwMCxpLm9wdGlvbnMuaGVpZ2h0fHw2MDApfSl9fSksaS5saWdodGJveC5jcmVhdGU9ZnVuY3Rpb24odCxlKXtpZih0KXt2YXIgbyxuPVtdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCl7bi5wdXNoKGkuJC5leHRlbmQoe3NvdXJjZTpcIlwiLHRpdGxlOlwiXCIsdHlwZTpcImF1dG9cIixsaW5rOiExfSxcInN0cmluZ1wiPT10eXBlb2YgdD97c291cmNlOnR9OnQpKX0pLG89aS5saWdodGJveChpLiQuZXh0ZW5kKHt9LGUse2dyb3VwOm59KSl9fSxpLmxpZ2h0Ym94fSk7IiwiLyohIFVJa2l0IDIuMjcuNCB8IGh0dHA6Ly93d3cuZ2V0dWlraXQuY29tIHwgKGMpIDIwMTQgWU9PdGhlbWUgfCBNSVQgTGljZW5zZSAqL1xuIWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGkoaSxlKXtyZXR1cm4gZT8oXCJvYmplY3RcIj09dHlwZW9mIGk/KGk9aSBpbnN0YW5jZW9mIGpRdWVyeT9pOnQuJChpKSxpLnBhcmVudCgpLmxlbmd0aCYmKGUucGVyc2lzdD1pLGUucGVyc2lzdC5kYXRhKFwibW9kYWxQZXJzaXN0UGFyZW50XCIsaS5wYXJlbnQoKSkpKTppPVwic3RyaW5nXCI9PXR5cGVvZiBpfHxcIm51bWJlclwiPT10eXBlb2YgaT90LiQoXCI8ZGl2PjwvZGl2PlwiKS5odG1sKGkpOnQuJChcIjxkaXY+PC9kaXY+XCIpLmh0bWwoXCJVSWtpdDIubW9kYWwgRXJyb3I6IFVuc3VwcG9ydGVkIGRhdGEgdHlwZTogXCIrdHlwZW9mIGkpLGkuYXBwZW5kVG8oZS5lbGVtZW50LmZpbmQoXCIudWstbW9kYWwtZGlhbG9nXCIpKSxlKTp2b2lkIDB9dmFyIGUsbz0hMSxuPTAscz10LiRodG1sO3QuJHdpbi5vbihcInJlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZVwiLHQuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24oKXt0LiQoXCIudWstbW9kYWwudWstb3BlblwiKS5lYWNoKGZ1bmN0aW9uKCl7cmV0dXJuIHQuJCh0aGlzKS5kYXRhKFwibW9kYWxcIikmJnQuJCh0aGlzKS5kYXRhKFwibW9kYWxcIikucmVzaXplKCl9KX0sMTUwKSksdC5jb21wb25lbnQoXCJtb2RhbFwiLHtkZWZhdWx0czp7a2V5Ym9hcmQ6ITAsYmdjbG9zZTohMCxtaW5TY3JvbGxIZWlnaHQ6MTUwLGNlbnRlcjohMSxtb2RhbDohMH0sc2Nyb2xsYWJsZTohMSx0cmFuc2l0aW9uOiExLGhhc1RyYW5zaXRpb25lZDohMCxpbml0OmZ1bmN0aW9uKCl7aWYoZXx8KGU9dC4kKFwiYm9keVwiKSksdGhpcy5lbGVtZW50Lmxlbmd0aCl7dmFyIGk9dGhpczt0aGlzLnBhZGRpbmdkaXI9XCJwYWRkaW5nLVwiKyhcImxlZnRcIj09dC5sYW5nZGlyZWN0aW9uP1wicmlnaHRcIjpcImxlZnRcIiksdGhpcy5kaWFsb2c9dGhpcy5maW5kKFwiLnVrLW1vZGFsLWRpYWxvZ1wiKSx0aGlzLmFjdGl2ZT0hMSx0aGlzLmVsZW1lbnQuYXR0cihcImFyaWEtaGlkZGVuXCIsdGhpcy5lbGVtZW50Lmhhc0NsYXNzKFwidWstb3BlblwiKSksdGhpcy5vbihcImNsaWNrXCIsXCIudWstbW9kYWwtY2xvc2VcIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksaS5oaWRlKCl9KS5vbihcImNsaWNrXCIsZnVuY3Rpb24oZSl7dmFyIG89dC4kKGUudGFyZ2V0KTtvWzBdPT1pLmVsZW1lbnRbMF0mJmkub3B0aW9ucy5iZ2Nsb3NlJiZpLmhpZGUoKX0pLHQuZG9tT2JzZXJ2ZSh0aGlzLmVsZW1lbnQsZnVuY3Rpb24oKXtpLnJlc2l6ZSgpfSl9fSx0b2dnbGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0aGlzLmlzQWN0aXZlKCk/XCJoaWRlXCI6XCJzaG93XCJdKCl9LHNob3c6ZnVuY3Rpb24oKXtpZih0aGlzLmVsZW1lbnQubGVuZ3RoKXt2YXIgaT10aGlzO2lmKCF0aGlzLmlzQWN0aXZlKCkpcmV0dXJuIHRoaXMub3B0aW9ucy5tb2RhbCYmbyYmby5oaWRlKCEwKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJ1ay1vcGVuXCIpLnNob3coKSx0aGlzLnJlc2l6ZSghMCksdGhpcy5vcHRpb25zLm1vZGFsJiYobz10aGlzKSx0aGlzLmFjdGl2ZT0hMCxuKyssdC5zdXBwb3J0LnRyYW5zaXRpb24/KHRoaXMuaGFzVHJhbnNpdGlvbmVkPSExLHRoaXMuZWxlbWVudC5vbmUodC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGZ1bmN0aW9uKCl7aS5oYXNUcmFuc2l0aW9uZWQ9ITAsdC5VdGlscy5mb2N1cyhpLmRpYWxvZyxcImFbaHJlZl1cIil9KS5hZGRDbGFzcyhcInVrLW9wZW5cIikpOih0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoXCJ1ay1vcGVuXCIpLHQuVXRpbHMuZm9jdXModGhpcy5kaWFsb2csXCJhW2hyZWZdXCIpKSxzLmFkZENsYXNzKFwidWstbW9kYWwtcGFnZVwiKS5oZWlnaHQoKSx0aGlzLmVsZW1lbnQuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKSx0aGlzLmVsZW1lbnQudHJpZ2dlcihcInNob3cudWsubW9kYWxcIiksdC5VdGlscy5jaGVja0Rpc3BsYXkodGhpcy5kaWFsb2csITApLHRoaXN9fSxoaWRlOmZ1bmN0aW9uKGkpe2lmKCFpJiZ0LnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy5oYXNUcmFuc2l0aW9uZWQpe3ZhciBlPXRoaXM7dGhpcy5vbmUodC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGZ1bmN0aW9uKCl7ZS5faGlkZSgpfSkucmVtb3ZlQ2xhc3MoXCJ1ay1vcGVuXCIpfWVsc2UgdGhpcy5faGlkZSgpO3JldHVybiB0aGlzfSxyZXNpemU6ZnVuY3Rpb24odCl7aWYodGhpcy5pc0FjdGl2ZSgpfHx0KXt2YXIgaT1lLndpZHRoKCk7aWYodGhpcy5zY3JvbGxiYXJ3aWR0aD13aW5kb3cuaW5uZXJXaWR0aC1pLGUuY3NzKHRoaXMucGFkZGluZ2Rpcix0aGlzLnNjcm9sbGJhcndpZHRoKSx0aGlzLmVsZW1lbnQuY3NzKFwib3ZlcmZsb3cteVwiLHRoaXMuc2Nyb2xsYmFyd2lkdGg/XCJzY3JvbGxcIjpcImF1dG9cIiksIXRoaXMudXBkYXRlU2Nyb2xsYWJsZSgpJiZ0aGlzLm9wdGlvbnMuY2VudGVyKXt2YXIgbz10aGlzLmRpYWxvZy5vdXRlckhlaWdodCgpLG49cGFyc2VJbnQodGhpcy5kaWFsb2cuY3NzKFwibWFyZ2luLXRvcFwiKSwxMCkrcGFyc2VJbnQodGhpcy5kaWFsb2cuY3NzKFwibWFyZ2luLWJvdHRvbVwiKSwxMCk7bytuPHdpbmRvdy5pbm5lckhlaWdodD90aGlzLmRpYWxvZy5jc3Moe3RvcDp3aW5kb3cuaW5uZXJIZWlnaHQvMi1vLzItbn0pOnRoaXMuZGlhbG9nLmNzcyh7dG9wOlwiXCJ9KX19fSx1cGRhdGVTY3JvbGxhYmxlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kaWFsb2cuZmluZChcIi51ay1vdmVyZmxvdy1jb250YWluZXI6dmlzaWJsZTpmaXJzdFwiKTtpZih0Lmxlbmd0aCl7dC5jc3MoXCJoZWlnaHRcIiwwKTt2YXIgaT1NYXRoLmFicyhwYXJzZUludCh0aGlzLmRpYWxvZy5jc3MoXCJtYXJnaW4tdG9wXCIpLDEwKSksZT10aGlzLmRpYWxvZy5vdXRlckhlaWdodCgpLG89d2luZG93LmlubmVySGVpZ2h0LG49by0yKigyMD5pPzIwOmkpLWU7cmV0dXJuIHQuY3NzKHttYXhIZWlnaHQ6bjx0aGlzLm9wdGlvbnMubWluU2Nyb2xsSGVpZ2h0P1wiXCI6bixoZWlnaHQ6XCJcIn0pLCEwfXJldHVybiExfSxfaGlkZTpmdW5jdGlvbigpe3RoaXMuYWN0aXZlPSExLG4+MD9uLS06bj0wLHRoaXMuZWxlbWVudC5oaWRlKCkucmVtb3ZlQ2xhc3MoXCJ1ay1vcGVuXCIpLHRoaXMuZWxlbWVudC5hdHRyKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIiksbnx8KHMucmVtb3ZlQ2xhc3MoXCJ1ay1tb2RhbC1wYWdlXCIpLGUuY3NzKHRoaXMucGFkZGluZ2RpcixcIlwiKSksbz09PXRoaXMmJihvPSExKSx0aGlzLnRyaWdnZXIoXCJoaWRlLnVrLm1vZGFsXCIpfSxpc0FjdGl2ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQuaGFzQ2xhc3MoXCJ1ay1vcGVuXCIpfX0pLHQuY29tcG9uZW50KFwibW9kYWxUcmlnZ2VyXCIse2Jvb3Q6ZnVuY3Rpb24oKXt0LiRodG1sLm9uKFwiY2xpY2subW9kYWwudWlraXRcIixcIltkYXRhLXVrLW1vZGFsXVwiLGZ1bmN0aW9uKGkpe3ZhciBlPXQuJCh0aGlzKTtpZihlLmlzKFwiYVwiKSYmaS5wcmV2ZW50RGVmYXVsdCgpLCFlLmRhdGEoXCJtb2RhbFRyaWdnZXJcIikpe3ZhciBvPXQubW9kYWxUcmlnZ2VyKGUsdC5VdGlscy5vcHRpb25zKGUuYXR0cihcImRhdGEtdWstbW9kYWxcIikpKTtvLnNob3coKX19KSx0LiRodG1sLm9uKFwia2V5ZG93bi5tb2RhbC51aWtpdFwiLGZ1bmN0aW9uKHQpe28mJjI3PT09dC5rZXlDb2RlJiZvLm9wdGlvbnMua2V5Ym9hcmQmJih0LnByZXZlbnREZWZhdWx0KCksby5oaWRlKCkpfSl9LGluaXQ6ZnVuY3Rpb24oKXt2YXIgaT10aGlzO3RoaXMub3B0aW9ucz10LiQuZXh0ZW5kKHt0YXJnZXQ6aS5lbGVtZW50LmlzKFwiYVwiKT9pLmVsZW1lbnQuYXR0cihcImhyZWZcIik6ITF9LHRoaXMub3B0aW9ucyksdGhpcy5tb2RhbD10Lm1vZGFsKHRoaXMub3B0aW9ucy50YXJnZXQsdGhpcy5vcHRpb25zKSx0aGlzLm9uKFwiY2xpY2tcIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksaS5zaG93KCl9KSx0aGlzLnByb3h5KHRoaXMubW9kYWwsXCJzaG93IGhpZGUgaXNBY3RpdmVcIil9fSksdC5tb2RhbC5kaWFsb2c9ZnVuY3Rpb24oZSxvKXt2YXIgbj10Lm1vZGFsKHQuJCh0Lm1vZGFsLmRpYWxvZy50ZW1wbGF0ZSkuYXBwZW5kVG8oXCJib2R5XCIpLG8pO3JldHVybiBuLm9uKFwiaGlkZS51ay5tb2RhbFwiLGZ1bmN0aW9uKCl7bi5wZXJzaXN0JiYobi5wZXJzaXN0LmFwcGVuZFRvKG4ucGVyc2lzdC5kYXRhKFwibW9kYWxQZXJzaXN0UGFyZW50XCIpKSxuLnBlcnNpc3Q9ITEpLG4uZWxlbWVudC5yZW1vdmUoKX0pLGkoZSxuKSxufSx0Lm1vZGFsLmRpYWxvZy50ZW1wbGF0ZT0nPGRpdiBjbGFzcz1cInVrLW1vZGFsXCI+PGRpdiBjbGFzcz1cInVrLW1vZGFsLWRpYWxvZ1wiIHN0eWxlPVwibWluLWhlaWdodDowO1wiPjwvZGl2PjwvZGl2PicsdC5tb2RhbC5hbGVydD1mdW5jdGlvbihpLGUpe2U9dC4kLmV4dGVuZCghMCx7YmdjbG9zZTohMSxrZXlib2FyZDohMSxtb2RhbDohMSxsYWJlbHM6dC5tb2RhbC5sYWJlbHN9LGUpO3ZhciBvPXQubW9kYWwuZGlhbG9nKFsnPGRpdiBjbGFzcz1cInVrLW1hcmdpbiB1ay1tb2RhbC1jb250ZW50XCI+JytTdHJpbmcoaSkrXCI8L2Rpdj5cIiwnPGRpdiBjbGFzcz1cInVrLW1vZGFsLWZvb3RlciB1ay10ZXh0LXJpZ2h0XCI+PGJ1dHRvbiBjbGFzcz1cInVrLWJ1dHRvbiB1ay1idXR0b24tcHJpbWFyeSB1ay1tb2RhbC1jbG9zZVwiPicrZS5sYWJlbHMuT2srXCI8L2J1dHRvbj48L2Rpdj5cIl0uam9pbihcIlwiKSxlKTtyZXR1cm4gby5vbihcInNob3cudWsubW9kYWxcIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtvLmVsZW1lbnQuZmluZChcImJ1dHRvbjpmaXJzdFwiKS5mb2N1cygpfSw1MCl9KSxvLnNob3coKX0sdC5tb2RhbC5jb25maXJtPWZ1bmN0aW9uKGksZSxvKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdP2FyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdOnt9O2U9dC4kLmlzRnVuY3Rpb24oZSk/ZTpmdW5jdGlvbigpe30sbz10LiQuaXNGdW5jdGlvbihvKT9vOmZ1bmN0aW9uKCl7fSxuPXQuJC5leHRlbmQoITAse2JnY2xvc2U6ITEsa2V5Ym9hcmQ6ITEsbW9kYWw6ITEsbGFiZWxzOnQubW9kYWwubGFiZWxzfSx0LiQuaXNGdW5jdGlvbihuKT97fTpuKTt2YXIgcz10Lm1vZGFsLmRpYWxvZyhbJzxkaXYgY2xhc3M9XCJ1ay1tYXJnaW4gdWstbW9kYWwtY29udGVudFwiPicrU3RyaW5nKGkpK1wiPC9kaXY+XCIsJzxkaXYgY2xhc3M9XCJ1ay1tb2RhbC1mb290ZXIgdWstdGV4dC1yaWdodFwiPjxidXR0b24gY2xhc3M9XCJ1ay1idXR0b24ganMtbW9kYWwtY29uZmlybS1jYW5jZWxcIj4nK24ubGFiZWxzLkNhbmNlbCsnPC9idXR0b24+IDxidXR0b24gY2xhc3M9XCJ1ay1idXR0b24gdWstYnV0dG9uLXByaW1hcnkganMtbW9kYWwtY29uZmlybVwiPicrbi5sYWJlbHMuT2srXCI8L2J1dHRvbj48L2Rpdj5cIl0uam9pbihcIlwiKSxuKTtyZXR1cm4gcy5lbGVtZW50LmZpbmQoXCIuanMtbW9kYWwtY29uZmlybSwgLmpzLW1vZGFsLWNvbmZpcm0tY2FuY2VsXCIpLm9uKFwiY2xpY2tcIixmdW5jdGlvbigpe3QuJCh0aGlzKS5pcyhcIi5qcy1tb2RhbC1jb25maXJtXCIpP2UoKTpvKCkscy5oaWRlKCl9KSxzLm9uKFwic2hvdy51ay5tb2RhbFwiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3MuZWxlbWVudC5maW5kKFwiLmpzLW1vZGFsLWNvbmZpcm1cIikuZm9jdXMoKX0sNTApfSkscy5zaG93KCl9LHQubW9kYWwucHJvbXB0PWZ1bmN0aW9uKGksZSxvLG4pe289dC4kLmlzRnVuY3Rpb24obyk/bzpmdW5jdGlvbigpe30sbj10LiQuZXh0ZW5kKCEwLHtiZ2Nsb3NlOiExLGtleWJvYXJkOiExLG1vZGFsOiExLGxhYmVsczp0Lm1vZGFsLmxhYmVsc30sbik7dmFyIHM9dC5tb2RhbC5kaWFsb2coW2k/JzxkaXYgY2xhc3M9XCJ1ay1tb2RhbC1jb250ZW50IHVrLWZvcm1cIj4nK1N0cmluZyhpKStcIjwvZGl2PlwiOlwiXCIsJzxkaXYgY2xhc3M9XCJ1ay1tYXJnaW4tc21hbGwtdG9wIHVrLW1vZGFsLWNvbnRlbnQgdWstZm9ybVwiPjxwPjxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwidWstd2lkdGgtMS0xXCI+PC9wPjwvZGl2PicsJzxkaXYgY2xhc3M9XCJ1ay1tb2RhbC1mb290ZXIgdWstdGV4dC1yaWdodFwiPjxidXR0b24gY2xhc3M9XCJ1ay1idXR0b24gdWstbW9kYWwtY2xvc2VcIj4nK24ubGFiZWxzLkNhbmNlbCsnPC9idXR0b24+IDxidXR0b24gY2xhc3M9XCJ1ay1idXR0b24gdWstYnV0dG9uLXByaW1hcnkganMtbW9kYWwtb2tcIj4nK24ubGFiZWxzLk9rK1wiPC9idXR0b24+PC9kaXY+XCJdLmpvaW4oXCJcIiksbiksYT1zLmVsZW1lbnQuZmluZChcImlucHV0W3R5cGU9J3RleHQnXVwiKS52YWwoZXx8XCJcIikub24oXCJrZXl1cFwiLGZ1bmN0aW9uKHQpezEzPT10LmtleUNvZGUmJnMuZWxlbWVudC5maW5kKFwiLmpzLW1vZGFsLW9rXCIpLnRyaWdnZXIoXCJjbGlja1wiKX0pO3JldHVybiBzLmVsZW1lbnQuZmluZChcIi5qcy1tb2RhbC1va1wiKS5vbihcImNsaWNrXCIsZnVuY3Rpb24oKXtvKGEudmFsKCkpIT09ITEmJnMuaGlkZSgpfSkscy5zaG93KCl9LHQubW9kYWwuYmxvY2tVST1mdW5jdGlvbihpLGUpe3ZhciBvPXQubW9kYWwuZGlhbG9nKFsnPGRpdiBjbGFzcz1cInVrLW1hcmdpbiB1ay1tb2RhbC1jb250ZW50XCI+JytTdHJpbmcoaXx8JzxkaXYgY2xhc3M9XCJ1ay10ZXh0LWNlbnRlclwiPi4uLjwvZGl2PicpK1wiPC9kaXY+XCJdLmpvaW4oXCJcIiksdC4kLmV4dGVuZCh7YmdjbG9zZTohMSxrZXlib2FyZDohMSxtb2RhbDohMX0sZSkpO3JldHVybiBvLmNvbnRlbnQ9by5lbGVtZW50LmZpbmQoXCIudWstbW9kYWwtY29udGVudDpmaXJzdFwiKSxvLnNob3coKX0sdC5tb2RhbC5sYWJlbHM9e09rOlwiT2tcIixDYW5jZWw6XCJDYW5jZWxcIn19KFVJa2l0Mik7IiwiLyohIFVJa2l0IDIuMjUuMCB8IGh0dHA6Ly93d3cuZ2V0dWlraXQuY29tIHwgKGMpIDIwMTQgWU9PdGhlbWUgfCBNSVQgTGljZW5zZSAqL1xuIWZ1bmN0aW9uKHQpe3ZhciBlO3dpbmRvdy5VSWtpdCYmKGU9dChVSWtpdCkpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKFwidWlraXQtc2xpZGVyXCIsW1widWlraXRcIl0sZnVuY3Rpb24oKXtyZXR1cm4gZXx8dChVSWtpdCl9KX0oZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGUsaSxzLG4sYT17fTtyZXR1cm4gdC5jb21wb25lbnQoXCJzbGlkZXJcIix7ZGVmYXVsdHM6e2NlbnRlcjohMSx0aHJlc2hvbGQ6MTAsaW5maW5pdGU6ITAsYXV0b3BsYXk6ITEsYXV0b3BsYXlJbnRlcnZhbDo3ZTMscGF1c2VPbkhvdmVyOiEwLGFjdGl2ZWNsczpcInVrLWFjdGl2ZVwifSxib290OmZ1bmN0aW9uKCl7dC5yZWFkeShmdW5jdGlvbihlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC4kKFwiW2RhdGEtdWstc2xpZGVyXVwiLGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10LiQodGhpcyk7ZS5kYXRhKFwic2xpZGVyXCIpfHx0LnNsaWRlcihlLHQuVXRpbHMub3B0aW9ucyhlLmF0dHIoXCJkYXRhLXVrLXNsaWRlclwiKSkpfSl9LDApfSl9LGluaXQ6ZnVuY3Rpb24oKXt2YXIgbz10aGlzO3RoaXMuY29udGFpbmVyPXRoaXMuZWxlbWVudC5maW5kKFwiLnVrLXNsaWRlclwiKSx0aGlzLmZvY3VzPTAsdC4kd2luLm9uKFwicmVzaXplIGxvYWRcIix0LlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uKCl7by5yZXNpemUoITApfSwxMDApKSx0aGlzLm9uKFwiY2xpY2sudWsuc2xpZGVyXCIsXCJbZGF0YS11ay1zbGlkZXItaXRlbV1cIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCk7dmFyIGk9dC4kKHRoaXMpLmF0dHIoXCJkYXRhLXVrLXNsaWRlci1pdGVtXCIpO2lmKG8uZm9jdXMhPWkpc3dpdGNoKG8uc3RvcCgpLGkpe2Nhc2VcIm5leHRcIjpjYXNlXCJwcmV2aW91c1wiOm9bXCJuZXh0XCI9PWk/XCJuZXh0XCI6XCJwcmV2aW91c1wiXSgpO2JyZWFrO2RlZmF1bHQ6by51cGRhdGVGb2N1cyhwYXJzZUludChpLDEwKSl9fSksdGhpcy5jb250YWluZXIub24oe1widG91Y2hzdGFydCBtb3VzZWRvd25cIjpmdW5jdGlvbihoKXtoLm9yaWdpbmFsRXZlbnQmJmgub3JpZ2luYWxFdmVudC50b3VjaGVzJiYoaD1oLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXSksaC5idXR0b24mJjI9PWguYnV0dG9ufHwhby5hY3RpdmV8fChvLnN0b3AoKSxzPXQuJChoLnRhcmdldCkuaXMoXCJhXCIpP3QuJChoLnRhcmdldCk6dC4kKGgudGFyZ2V0KS5wYXJlbnRzKFwiYTpmaXJzdFwiKSxuPSExLHMubGVuZ3RoJiZzLm9uZShcImNsaWNrXCIsZnVuY3Rpb24odCl7biYmdC5wcmV2ZW50RGVmYXVsdCgpfSksaT1mdW5jdGlvbih0KXtuPSEwLGU9byxhPXt0b3VjaHg6cGFyc2VJbnQodC5wYWdlWCwxMCksZGlyOjEsZm9jdXM6by5mb2N1cyxiYXNlOm8ub3B0aW9ucy5jZW50ZXI/XCJjZW50ZXJcIjpcImFyZWFcIn0sdC5vcmlnaW5hbEV2ZW50JiZ0Lm9yaWdpbmFsRXZlbnQudG91Y2hlcyYmKHQ9dC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0pLGUuZWxlbWVudC5kYXRhKHtcInBvaW50ZXItc3RhcnRcIjp7eDpwYXJzZUludCh0LnBhZ2VYLDEwKSx5OnBhcnNlSW50KHQucGFnZVksMTApfSxcInBvaW50ZXItcG9zLXN0YXJ0XCI6by5wb3N9KSxvLmNvbnRhaW5lci5hZGRDbGFzcyhcInVrLWRyYWdcIiksaT0hMX0saS54PXBhcnNlSW50KGgucGFnZVgsMTApLGkudGhyZXNob2xkPW8ub3B0aW9ucy50aHJlc2hvbGQpfSxtb3VzZWVudGVyOmZ1bmN0aW9uKCl7by5vcHRpb25zLnBhdXNlT25Ib3ZlciYmKG8uaG92ZXJpbmc9ITApfSxtb3VzZWxlYXZlOmZ1bmN0aW9uKCl7by5ob3ZlcmluZz0hMX19KSx0aGlzLnJlc2l6ZSghMCksdGhpcy5vbihcImRpc3BsYXkudWsuY2hlY2tcIixmdW5jdGlvbigpe28uZWxlbWVudC5pcyhcIjp2aXNpYmxlXCIpJiZvLnJlc2l6ZSghMCl9KSx0aGlzLmVsZW1lbnQuZmluZChcImEsaW1nXCIpLmF0dHIoXCJkcmFnZ2FibGVcIixcImZhbHNlXCIpLHRoaXMub3B0aW9ucy5hdXRvcGxheSYmdGhpcy5zdGFydCgpfSxyZXNpemU6ZnVuY3Rpb24oZSl7dmFyIGkscyxuLGEsbz10aGlzLGg9MCxyPTA7cmV0dXJuIHRoaXMuaXRlbXM9dGhpcy5jb250YWluZXIuY2hpbGRyZW4oKS5maWx0ZXIoXCI6dmlzaWJsZVwiKSx0aGlzLnZwPXRoaXMuZWxlbWVudFswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCx0aGlzLmNvbnRhaW5lci5jc3Moe1wibWluLXdpZHRoXCI6XCJcIixcIm1pbi1oZWlnaHRcIjpcIlwifSksdGhpcy5pdGVtcy5lYWNoKGZ1bmN0aW9uKGUpe2k9dC4kKHRoaXMpLGE9aS5jc3Moe2xlZnQ6XCJcIix3aWR0aDpcIlwifSlbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz1hLndpZHRoLG49aS53aWR0aCgpLHI9TWF0aC5tYXgocixhLmhlaWdodCksaS5jc3Moe2xlZnQ6aCx3aWR0aDpzfSkuZGF0YSh7aWR4OmUsbGVmdDpoLHdpZHRoOnMsY3dpZHRoOm4sYXJlYTpoK3MsY2VudGVyOmgtKG8udnAvMi1uLzIpfSksaCs9c30pLHRoaXMuY29udGFpbmVyLmNzcyh7XCJtaW4td2lkdGhcIjpoLFwibWluLWhlaWdodFwiOnJ9KSx0aGlzLm9wdGlvbnMuaW5maW5pdGUmJihoPD0yKnRoaXMudnB8fHRoaXMuaXRlbXMubGVuZ3RoPDUpJiYhdGhpcy5pdGVtc1Jlc2l6ZWQ/KHRoaXMuY29udGFpbmVyLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbih0KXtvLmNvbnRhaW5lci5hcHBlbmQoby5pdGVtcy5lcSh0KS5jbG9uZSghMCkuYXR0cihcImlkXCIsXCJcIikpfSkuZWFjaChmdW5jdGlvbih0KXtvLmNvbnRhaW5lci5hcHBlbmQoby5pdGVtcy5lcSh0KS5jbG9uZSghMCkuYXR0cihcImlkXCIsXCJcIikpfSksdGhpcy5pdGVtc1Jlc2l6ZWQ9ITAsdGhpcy5yZXNpemUoKSk6KHRoaXMuY3c9aCx0aGlzLnBvcz0wLHRoaXMuYWN0aXZlPWg+PXRoaXMudnAsdGhpcy5jb250YWluZXIuY3NzKHtcIi1tcy10cmFuc2Zvcm1cIjpcIlwiLFwiLXdlYmtpdC10cmFuc2Zvcm1cIjpcIlwiLHRyYW5zZm9ybTpcIlwifSksZSYmdGhpcy51cGRhdGVGb2N1cyh0aGlzLmZvY3VzKSx2b2lkIDApfSx1cGRhdGVQb3M6ZnVuY3Rpb24odCl7dGhpcy5wb3M9dCx0aGlzLmNvbnRhaW5lci5jc3Moe1wiLW1zLXRyYW5zZm9ybVwiOlwidHJhbnNsYXRlWChcIit0K1wicHgpXCIsXCItd2Via2l0LXRyYW5zZm9ybVwiOlwidHJhbnNsYXRlWChcIit0K1wicHgpXCIsdHJhbnNmb3JtOlwidHJhbnNsYXRlWChcIit0K1wicHgpXCJ9KX0sdXBkYXRlRm9jdXM6ZnVuY3Rpb24oZSxpKXtpZih0aGlzLmFjdGl2ZSl7aT1pfHwoZT50aGlzLmZvY3VzPzE6LTEpO3ZhciBzLG4sYT10aGlzLml0ZW1zLmVxKGUpO2lmKHRoaXMub3B0aW9ucy5pbmZpbml0ZSYmdGhpcy5pbmZpbml0ZShlLGkpLHRoaXMub3B0aW9ucy5jZW50ZXIpdGhpcy51cGRhdGVQb3MoLTEqYS5kYXRhKFwiY2VudGVyXCIpKSx0aGlzLml0ZW1zLmZpbHRlcihcIi5cIit0aGlzLm9wdGlvbnMuYWN0aXZlY2xzKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlY2xzKSxhLmFkZENsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVjbHMpO2Vsc2UgaWYodGhpcy5vcHRpb25zLmluZmluaXRlKXRoaXMudXBkYXRlUG9zKC0xKmEuZGF0YShcImxlZnRcIikpO2Vsc2V7Zm9yKHM9MCxuPWU7bjx0aGlzLml0ZW1zLmxlbmd0aDtuKyspcys9dGhpcy5pdGVtcy5lcShuKS5kYXRhKFwid2lkdGhcIik7aWYocz50aGlzLnZwKXRoaXMudXBkYXRlUG9zKC0xKmEuZGF0YShcImxlZnRcIikpO2Vsc2UgaWYoMT09aSl7Zm9yKHM9MCxuPXRoaXMuaXRlbXMubGVuZ3RoLTE7bj49MDtuLS0pe2lmKHMrPXRoaXMuaXRlbXMuZXEobikuZGF0YShcIndpZHRoXCIpLHM9PXRoaXMudnApe2U9bjticmVha31pZihzPnRoaXMudnApe2U9bjx0aGlzLml0ZW1zLmxlbmd0aC0xP24rMTpuO2JyZWFrfX1zPnRoaXMudnA/dGhpcy51cGRhdGVQb3MoLTEqKHRoaXMuY29udGFpbmVyLndpZHRoKCktdGhpcy52cCkpOnRoaXMudXBkYXRlUG9zKC0xKnRoaXMuaXRlbXMuZXEoZSkuZGF0YShcImxlZnRcIikpfX12YXIgbz10aGlzLml0ZW1zLmVxKGUpLmRhdGEoXCJsZWZ0XCIpO3RoaXMuaXRlbXMucmVtb3ZlQ2xhc3MoXCJ1ay1zbGlkZS1iZWZvcmUgdWstc2xpZGUtYWZ0ZXJcIikuZWFjaChmdW5jdGlvbihpKXtpIT09ZSYmdC4kKHRoaXMpLmFkZENsYXNzKHQuJCh0aGlzKS5kYXRhKFwibGVmdFwiKTxvP1widWstc2xpZGUtYmVmb3JlXCI6XCJ1ay1zbGlkZS1hZnRlclwiKX0pLHRoaXMuZm9jdXM9ZSx0aGlzLnRyaWdnZXIoXCJmb2N1c2l0ZW0udWsuc2xpZGVyXCIsW2UsdGhpcy5pdGVtcy5lcShlKSx0aGlzXSl9fSxuZXh0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pdGVtc1t0aGlzLmZvY3VzKzFdP3RoaXMuZm9jdXMrMTp0aGlzLm9wdGlvbnMuaW5maW5pdGU/MDp0aGlzLmZvY3VzO3RoaXMudXBkYXRlRm9jdXModCwxKX0scHJldmlvdXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLml0ZW1zW3RoaXMuZm9jdXMtMV0/dGhpcy5mb2N1cy0xOnRoaXMub3B0aW9ucy5pbmZpbml0ZT90aGlzLml0ZW1zW3RoaXMuZm9jdXMtMV0/dGhpcy5pdGVtcy0xOnRoaXMuaXRlbXMubGVuZ3RoLTE6dGhpcy5mb2N1czt0aGlzLnVwZGF0ZUZvY3VzKHQsLTEpfSxzdGFydDpmdW5jdGlvbigpe3RoaXMuc3RvcCgpO3ZhciB0PXRoaXM7dGhpcy5pbnRlcnZhbD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3QuaG92ZXJpbmd8fHQubmV4dCgpfSx0aGlzLm9wdGlvbnMuYXV0b3BsYXlJbnRlcnZhbCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmludGVydmFsJiZjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpfSxpbmZpbml0ZTpmdW5jdGlvbih0LGUpe3ZhciBpLHM9dGhpcyxuPXRoaXMuaXRlbXMuZXEodCksYT10LG89W10saD0wO2lmKDE9PWUpe2ZvcihpPTA7aTx0aGlzLml0ZW1zLmxlbmd0aCYmKGEhPXQmJihoKz10aGlzLml0ZW1zLmVxKGEpLmRhdGEoXCJ3aWR0aFwiKSxvLnB1c2godGhpcy5pdGVtcy5lcShhKSkpLCEoaD50aGlzLnZwKSk7aSsrKWE9YSsxPT10aGlzLml0ZW1zLmxlbmd0aD8wOmErMTtvLmxlbmd0aCYmby5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPW4uZGF0YShcImFyZWFcIik7dC5jc3Moe2xlZnQ6ZX0pLmRhdGEoe2xlZnQ6ZSxhcmVhOmUrdC5kYXRhKFwid2lkdGhcIiksY2VudGVyOmUtKHMudnAvMi10LmRhdGEoXCJjd2lkdGhcIikvMil9KSxuPXR9KX1lbHNle2ZvcihpPXRoaXMuaXRlbXMubGVuZ3RoLTE7aT4tMSYmKGgrPXRoaXMuaXRlbXMuZXEoYSkuZGF0YShcIndpZHRoXCIpLGEhPXQmJm8ucHVzaCh0aGlzLml0ZW1zLmVxKGEpKSwhKGg+dGhpcy52cCkpO2ktLSlhPWEtMT09LTE/dGhpcy5pdGVtcy5sZW5ndGgtMTphLTE7by5sZW5ndGgmJm8uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1uLmRhdGEoXCJsZWZ0XCIpLXQuZGF0YShcIndpZHRoXCIpO3QuY3NzKHtsZWZ0OmV9KS5kYXRhKHtsZWZ0OmUsYXJlYTplK3QuZGF0YShcIndpZHRoXCIpLGNlbnRlcjplLShzLnZwLzItdC5kYXRhKFwiY3dpZHRoXCIpLzIpfSksbj10fSl9fX0pLHQuJGRvYy5vbihcIm1vdXNlbW92ZS51ay5zbGlkZXIgdG91Y2htb3ZlLnVrLnNsaWRlclwiLGZ1bmN0aW9uKHQpe2lmKHQub3JpZ2luYWxFdmVudCYmdC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMmJih0PXQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdKSxpJiZNYXRoLmFicyh0LnBhZ2VYLWkueCk+aS50aHJlc2hvbGQmJih3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKT9lPWk9ITE6aSh0KSksZSl7dmFyIHMsbixvLGgscixjLGYsdSxkLGw7aWYodC5jbGllbnRYfHx0LmNsaWVudFk/cz10LmNsaWVudFg6KHQucGFnZVh8fHQucGFnZVkpJiYocz10LnBhZ2VYLWRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdC1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCkscj1hLmZvY3VzLG49cy1lLmVsZW1lbnQuZGF0YShcInBvaW50ZXItc3RhcnRcIikueCxvPWUuZWxlbWVudC5kYXRhKFwicG9pbnRlci1wb3Mtc3RhcnRcIikrbixoPXM+ZS5lbGVtZW50LmRhdGEoXCJwb2ludGVyLXN0YXJ0XCIpLng/LTE6MSxjPWUuaXRlbXMuZXEoYS5mb2N1cyksMT09aClmb3IoZj1jLmRhdGEoXCJsZWZ0XCIpK01hdGguYWJzKG4pLHU9MCxkPWEuZm9jdXM7dTxlLml0ZW1zLmxlbmd0aDt1Kyspe2lmKGw9ZS5pdGVtcy5lcShkKSxkIT1hLmZvY3VzJiZsLmRhdGEoXCJsZWZ0XCIpPGYmJmwuZGF0YShcImFyZWFcIik+Zil7cj1kO2JyZWFrfWQ9ZCsxPT1lLml0ZW1zLmxlbmd0aD8wOmQrMX1lbHNlIGZvcihmPWMuZGF0YShcImxlZnRcIiktTWF0aC5hYnMobiksdT0wLGQ9YS5mb2N1czt1PGUuaXRlbXMubGVuZ3RoO3UrKyl7aWYobD1lLml0ZW1zLmVxKGQpLGQhPWEuZm9jdXMmJmwuZGF0YShcImFyZWFcIik8PWMuZGF0YShcImxlZnRcIikmJmwuZGF0YShcImNlbnRlclwiKTxmKXtyPWQ7YnJlYWt9ZD1kLTE9PS0xP2UuaXRlbXMubGVuZ3RoLTE6ZC0xfWUub3B0aW9ucy5pbmZpbml0ZSYmciE9YS5fZm9jdXMmJmUuaW5maW5pdGUocixoKSxlLnVwZGF0ZVBvcyhvKSxhLmRpcj1oLGEuX2ZvY3VzPXIsYS50b3VjaHg9cGFyc2VJbnQodC5wYWdlWCwxMCksYS5kaWZmPWZ9fSksdC4kZG9jLm9uKFwibW91c2V1cC51ay5zbGlkZXIgdG91Y2hlbmQudWsuc2xpZGVyXCIsZnVuY3Rpb24oKXtpZihlKXtlLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhcInVrLWRyYWdcIiksZS5pdGVtcy5lcShhLmZvY3VzKTt2YXIgdCxzLG4sbz0hMTtpZigxPT1hLmRpcilmb3Iocz0wLG49YS5mb2N1cztzPGUuaXRlbXMubGVuZ3RoO3MrKyl7aWYodD1lLml0ZW1zLmVxKG4pLG4hPWEuZm9jdXMmJnQuZGF0YShcImxlZnRcIik+YS5kaWZmKXtvPW47YnJlYWt9bj1uKzE9PWUuaXRlbXMubGVuZ3RoPzA6bisxfWVsc2UgZm9yKHM9MCxuPWEuZm9jdXM7czxlLml0ZW1zLmxlbmd0aDtzKyspe2lmKHQ9ZS5pdGVtcy5lcShuKSxuIT1hLmZvY3VzJiZ0LmRhdGEoXCJsZWZ0XCIpPGEuZGlmZil7bz1uO2JyZWFrfW49bi0xPT0tMT9lLml0ZW1zLmxlbmd0aC0xOm4tMX1lLnVwZGF0ZUZvY3VzKG8hPT0hMT9vOmEuX2ZvY3VzKX1lPWk9ITF9KSx0LnNsaWRlcn0pOyIsIi8qISBVSWtpdCAyLjI1LjAgfCBodHRwOi8vd3d3LmdldHVpa2l0LmNvbSB8IChjKSAyMDE0IFlPT3RoZW1lIHwgTUlUIExpY2Vuc2UgKi9cbiFmdW5jdGlvbih0KXt2YXIgaTt3aW5kb3cuVUlraXQmJihpPXQoVUlraXQpKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZShcInVpa2l0LXNsaWRlc2V0XCIsW1widWlraXRcIl0sZnVuY3Rpb24oKXtyZXR1cm4gaXx8dChVSWtpdCl9KX0oZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaShpLGUscyxuKXt2YXIgYSxvLHIsbCxoPXQuJC5EZWZlcnJlZCgpLHU9dGhpcy5vcHRpb25zLmRlbGF5PT09ITE/TWF0aC5mbG9vcih0aGlzLm9wdGlvbnMuZHVyYXRpb24vMik6dGhpcy5vcHRpb25zLmRlbGF5LGQ9dGhpcztpZihuPW58fDEsdGhpcy5lbGVtZW50LmNzcyhcIm1pbi1oZWlnaHRcIix0aGlzLmVsZW1lbnQuaGVpZ2h0KCkpLHNbMF09PT1lWzBdKXJldHVybiBoLnJlc29sdmUoKSxoLnByb21pc2UoKTtpZihcIm9iamVjdFwiPT10eXBlb2YgaT8oYT1pWzBdLG89aVsxXXx8aVswXSk6KGE9aSxvPWEpLHI9ZnVuY3Rpb24oKXtpZihlJiZlLmxlbmd0aCYmZS5oaWRlKCkucmVtb3ZlQ2xhc3MobytcIiB1ay1hbmltYXRpb24tcmV2ZXJzZVwiKS5jc3Moe29wYWNpdHk6XCJcIixcImFuaW1hdGlvbi1kZWxheVwiOlwiXCIsYW5pbWF0aW9uOlwiXCJ9KSwhcy5sZW5ndGgpcmV0dXJuIGgucmVzb2x2ZSgpLHZvaWQgMDtmb3IobD0wO2w8cy5sZW5ndGg7bCsrKXMuZXEoMT09bj9sOnMubGVuZ3RoLWwtMSkuY3NzKFwiYW5pbWF0aW9uLWRlbGF5XCIsbCp1K1wibXNcIik7dmFyIGk9ZnVuY3Rpb24oKXtzLnJlbW92ZUNsYXNzKFwiXCIrYSkuY3NzKHtvcGFjaXR5OlwiXCIsZGlzcGxheTpcIlwiLFwiYW5pbWF0aW9uLWRlbGF5XCI6XCJcIixhbmltYXRpb246XCJcIn0pLGgucmVzb2x2ZSgpLGQuZWxlbWVudC5jc3MoXCJtaW4taGVpZ2h0XCIsXCJcIiksaT0hMX07cy5hZGRDbGFzcyhhKVsxPT1uP1wibGFzdFwiOlwiZmlyc3RcIl0oKS5vbmUodC5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsZnVuY3Rpb24oKXtpJiZpKCl9KS5lbmQoKS5jc3MoXCJkaXNwbGF5XCIsXCJcIiksc2V0VGltZW91dChmdW5jdGlvbigpe2kmJmkoKX0scy5sZW5ndGgqdSoyKX0scy5sZW5ndGgmJnMuY3NzKFwiYW5pbWF0aW9uLWR1cmF0aW9uXCIsdGhpcy5vcHRpb25zLmR1cmF0aW9uK1wibXNcIiksZSYmZS5sZW5ndGgpZm9yKGUuY3NzKFwiYW5pbWF0aW9uLWR1cmF0aW9uXCIsdGhpcy5vcHRpb25zLmR1cmF0aW9uK1wibXNcIilbMT09bj9cImxhc3RcIjpcImZpcnN0XCJdKCkub25lKHQuc3VwcG9ydC5hbmltYXRpb24uZW5kLGZ1bmN0aW9uKCl7cigpfSksbD0wO2w8ZS5sZW5ndGg7bCsrKSFmdW5jdGlvbihpLGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmNzcyhcImRpc3BsYXlcIixcIm5vbmVcIikuY3NzKFwiZGlzcGxheVwiLFwiXCIpLmNzcyhcIm9wYWNpdHlcIiwwKS5vbih0LnN1cHBvcnQuYW5pbWF0aW9uLmVuZCxmdW5jdGlvbigpe2UucmVtb3ZlQ2xhc3Mobyl9KS5hZGRDbGFzcyhvK1wiIHVrLWFuaW1hdGlvbi1yZXZlcnNlXCIpfS5iaW5kKHRoaXMpLGwqdSl9KGwsZS5lcSgxPT1uP2w6ZS5sZW5ndGgtbC0xKSk7ZWxzZSByKCk7cmV0dXJuIGgucHJvbWlzZSgpfWZ1bmN0aW9uIGUodCxpKXt2YXIgZSxzPTAsbj0tMSxhPXQubGVuZ3RofHwwLG89W107aWYoMT5pKXJldHVybiBudWxsO2Zvcig7YT5zOyllPXMlaSxlP29bbl1bZV09dFtzXTpvWysrbl09W3Rbc11dLHMrKztmb3Iocz0wLGE9by5sZW5ndGg7YT5zOylvW3NdPWpRdWVyeShvW3NdKSxzKys7cmV0dXJuIG99dmFyIHM7dC5jb21wb25lbnQoXCJzbGlkZXNldFwiLHtkZWZhdWx0czp7XCJkZWZhdWx0XCI6MSxhbmltYXRpb246XCJmYWRlXCIsZHVyYXRpb246MjAwLGZpbHRlcjpcIlwiLGRlbGF5OiExLGNvbnRyb2xzOiExLGF1dG9wbGF5OiExLGF1dG9wbGF5SW50ZXJ2YWw6N2UzLHBhdXNlT25Ib3ZlcjohMH0sc2V0czpbXSxib290OmZ1bmN0aW9uKCl7dC5yZWFkeShmdW5jdGlvbihpKXt0LiQoXCJbZGF0YS11ay1zbGlkZXNldF1cIixpKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9dC4kKHRoaXMpO2kuZGF0YShcInNsaWRlc2V0XCIpfHx0LnNsaWRlc2V0KGksdC5VdGlscy5vcHRpb25zKGkuYXR0cihcImRhdGEtdWstc2xpZGVzZXRcIikpKX0pfSl9LGluaXQ6ZnVuY3Rpb24oKXt2YXIgaT10aGlzO3RoaXMuYWN0aXZlU2V0PSExLHRoaXMubGlzdD10aGlzLmVsZW1lbnQuZmluZChcIi51ay1zbGlkZXNldFwiKSx0aGlzLm5hdj10aGlzLmVsZW1lbnQuZmluZChcIi51ay1zbGlkZXNldC1uYXZcIiksdGhpcy5jb250cm9scz10aGlzLm9wdGlvbnMuY29udHJvbHM/dC4kKHRoaXMub3B0aW9ucy5jb250cm9scyk6dGhpcy5lbGVtZW50LHQuJHdpbi5vbihcInJlc2l6ZSBsb2FkXCIsdC5VdGlscy5kZWJvdW5jZShmdW5jdGlvbigpe2kudXBkYXRlU2V0cygpfSwxMDApKSxpLmxpc3QuYWRkQ2xhc3MoXCJ1ay1ncmlkLXdpZHRoLTEtXCIraS5vcHRpb25zLmRlZmF1bHQpLFtcInhsYXJnZVwiLFwibGFyZ2VcIixcIm1lZGl1bVwiLFwic21hbGxcIl0uZm9yRWFjaChmdW5jdGlvbih0KXtpLm9wdGlvbnNbdF0mJmkubGlzdC5hZGRDbGFzcyhcInVrLWdyaWQtd2lkdGgtXCIrdCtcIi0xLVwiK2kub3B0aW9uc1t0XSl9KSx0aGlzLm9uKFwiY2xpY2sudWsuc2xpZGVzZXRcIixcIltkYXRhLXVrLXNsaWRlc2V0LWl0ZW1dXCIsZnVuY3Rpb24oZSl7aWYoZS5wcmV2ZW50RGVmYXVsdCgpLCFpLmFuaW1hdGluZyl7dmFyIHM9dC4kKHRoaXMpLmF0dHIoXCJkYXRhLXVrLXNsaWRlc2V0LWl0ZW1cIik7aWYoaS5hY3RpdmVTZXQhPT1zKXN3aXRjaChzKXtjYXNlXCJuZXh0XCI6Y2FzZVwicHJldmlvdXNcIjppW1wibmV4dFwiPT1zP1wibmV4dFwiOlwicHJldmlvdXNcIl0oKTticmVhaztkZWZhdWx0Omkuc2hvdyhwYXJzZUludChzLDEwKSl9fX0pLHRoaXMuY29udHJvbHMub24oXCJjbGljay51ay5zbGlkZXNldFwiLFwiW2RhdGEtdWstZmlsdGVyXVwiLGZ1bmN0aW9uKGUpe3ZhciBzPXQuJCh0aGlzKTtzLnBhcmVudCgpLmhhc0NsYXNzKFwidWstc2xpZGVzZXRcIil8fChlLnByZXZlbnREZWZhdWx0KCksaS5hbmltYXRpbmd8fGkuY3VycmVudEZpbHRlcj09cy5hdHRyKFwiZGF0YS11ay1maWx0ZXJcIil8fChpLnVwZGF0ZUZpbHRlcihzLmF0dHIoXCJkYXRhLXVrLWZpbHRlclwiKSksaS5faGlkZSgpLnRoZW4oZnVuY3Rpb24oKXtpLnVwZGF0ZVNldHMoITAsITApfSkpKX0pLHRoaXMub24oXCJzd2lwZVJpZ2h0IHN3aXBlTGVmdFwiLGZ1bmN0aW9uKHQpe2lbXCJzd2lwZUxlZnRcIj09dC50eXBlP1wibmV4dFwiOlwicHJldmlvdXNcIl0oKX0pLHRoaXMudXBkYXRlRmlsdGVyKHRoaXMub3B0aW9ucy5maWx0ZXIpLHRoaXMudXBkYXRlU2V0cygpLHRoaXMuZWxlbWVudC5vbih7bW91c2VlbnRlcjpmdW5jdGlvbigpe2kub3B0aW9ucy5wYXVzZU9uSG92ZXImJihpLmhvdmVyaW5nPSEwKX0sbW91c2VsZWF2ZTpmdW5jdGlvbigpe2kuaG92ZXJpbmc9ITF9fSksdGhpcy5vcHRpb25zLmF1dG9wbGF5JiZ0aGlzLnN0YXJ0KCl9LHVwZGF0ZVNldHM6ZnVuY3Rpb24odCxpKXt2YXIgcyxuPXRoaXMudmlzaWJsZTtpZih0aGlzLnZpc2libGU9dGhpcy5nZXRWaXNpYmxlT25DdXJyZW5CcmVha3BvaW50KCksbiE9dGhpcy52aXNpYmxlfHxpKXtmb3IodGhpcy5jaGlsZHJlbj10aGlzLmxpc3QuY2hpbGRyZW4oKS5oaWRlKCksdGhpcy5pdGVtcz10aGlzLmdldEl0ZW1zKCksdGhpcy5zZXRzPWUodGhpcy5pdGVtcyx0aGlzLnZpc2libGUpLHM9MDtzPHRoaXMuc2V0cy5sZW5ndGg7cysrKXRoaXMuc2V0c1tzXS5jc3Moe2Rpc3BsYXk6XCJub25lXCJ9KTtpZih0aGlzLm5hdi5sZW5ndGgmJnRoaXMubmF2LmVtcHR5KCkpe2ZvcihzPTA7czx0aGlzLnNldHMubGVuZ3RoO3MrKyl0aGlzLm5hdi5hcHBlbmQoJzxsaSBkYXRhLXVrLXNsaWRlc2V0LWl0ZW09XCInK3MrJ1wiPjxhPjwvYT48L2xpPicpO3RoaXMubmF2WzE9PXRoaXMubmF2LmNoaWxkcmVuKCkubGVuZ3RoP1wiYWRkQ2xhc3NcIjpcInJlbW92ZUNsYXNzXCJdKFwidWstaW52aXNpYmxlXCIpfXRoaXMuYWN0aXZlU2V0PSExLHRoaXMuc2hvdygwLCF0KX19LHVwZGF0ZUZpbHRlcjpmdW5jdGlvbihpKXt2YXIgZSxzPXRoaXM7dGhpcy5jdXJyZW50RmlsdGVyPWksdGhpcy5jb250cm9scy5maW5kKFwiW2RhdGEtdWstZmlsdGVyXVwiKS5lYWNoKGZ1bmN0aW9uKCl7ZT10LiQodGhpcyksZS5wYXJlbnQoKS5oYXNDbGFzcyhcInVrLXNsaWRlc2V0XCIpfHwoZS5hdHRyKFwiZGF0YS11ay1maWx0ZXJcIik9PXMuY3VycmVudEZpbHRlcj9lLmFkZENsYXNzKFwidWstYWN0aXZlXCIpOmUucmVtb3ZlQ2xhc3MoXCJ1ay1hY3RpdmVcIikpfSl9LGdldFZpc2libGVPbkN1cnJlbkJyZWFrcG9pbnQ6ZnVuY3Rpb24oKXt2YXIgaT1udWxsLGU9dC4kKCc8ZGl2IHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjFweDt0b3A6LTEwMDBweDt3aWR0aDoxMDBweFwiPjxkaXY+PC9kaXY+PC9kaXY+JykuYXBwZW5kVG8oXCJib2R5XCIpLHM9ZS5jaGlsZHJlbigpLmVxKDApLG49dGhpcy5vcHRpb25zO3JldHVybltcInhsYXJnZVwiLFwibGFyZ2VcIixcIm1lZGl1bVwiLFwic21hbGxcIl0uZm9yRWFjaChmdW5jdGlvbih0KXtuW3RdJiYhaSYmKGUuYXR0cihcImNsYXNzXCIsXCJ1ay1ncmlkLXdpZHRoLVwiK3QrXCItMS0yXCIpLndpZHRoKCksNTA9PXMud2lkdGgoKSYmKGk9dCkpfSksZS5yZW1vdmUoKSx0aGlzLm9wdGlvbnNbaV18fHRoaXMub3B0aW9uc1tcImRlZmF1bHRcIl19LGdldEl0ZW1zOmZ1bmN0aW9uKCl7dmFyIGksZT1bXTtyZXR1cm4gdGhpcy5jdXJyZW50RmlsdGVyPyhpPXRoaXMuY3VycmVudEZpbHRlcnx8W10sXCJzdHJpbmdcIj09dHlwZW9mIGkmJihpPWkuc3BsaXQoLywvKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpfSkpLHRoaXMuY2hpbGRyZW4uZWFjaChmdW5jdGlvbigpe3ZhciBzPXQuJCh0aGlzKSxuPXMuYXR0cihcImRhdGEtdWstZmlsdGVyXCIpLGE9aS5sZW5ndGg/ITE6ITA7biYmKG49bi5zcGxpdCgvLC8pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KSxpLmZvckVhY2goZnVuY3Rpb24odCl7bi5pbmRleE9mKHQpPi0xJiYoYT0hMCl9KSksYSYmZS5wdXNoKHNbMF0pfSksZT10LiQoZSkpOmU9dGhpcy5saXN0LmNoaWxkcmVuKCksZX0sc2hvdzpmdW5jdGlvbihpLGUsbil7dmFyIGE9dGhpcztpZih0aGlzLmFjdGl2ZVNldCE9PWkmJiF0aGlzLmFuaW1hdGluZyl7bj1ufHwoaTx0aGlzLmFjdGl2ZVNldD8tMToxKTt2YXIgbz10aGlzLnNldHNbdGhpcy5hY3RpdmVTZXRdfHxbXSxyPXRoaXMuc2V0c1tpXSxsPXRoaXMuX2dldEFuaW1hdGlvbigpOyhlfHwhdC5zdXBwb3J0LmFuaW1hdGlvbikmJihsPXMubm9uZSksdGhpcy5hbmltYXRpbmc9ITAsdGhpcy5uYXYubGVuZ3RoJiZ0aGlzLm5hdi5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKFwidWstYWN0aXZlXCIpLmVxKGkpLmFkZENsYXNzKFwidWstYWN0aXZlXCIpLGwuYXBwbHkoYSxbbyxyLG5dKS50aGVuKGZ1bmN0aW9uKCl7dC5VdGlscy5jaGVja0Rpc3BsYXkociwhMCksYS5jaGlsZHJlbi5oaWRlKCkucmVtb3ZlQ2xhc3MoXCJ1ay1hY3RpdmVcIiksci5hZGRDbGFzcyhcInVrLWFjdGl2ZVwiKS5jc3Moe2Rpc3BsYXk6XCJcIixvcGFjaXR5OlwiXCJ9KSxhLmFuaW1hdGluZz0hMSxhLmFjdGl2ZVNldD1pLHQuVXRpbHMuY2hlY2tEaXNwbGF5KHIsITApLGEudHJpZ2dlcihcInNob3cudWsuc2xpZGVzZXRcIixbcl0pfSl9fSxfZ2V0QW5pbWF0aW9uOmZ1bmN0aW9uKCl7dmFyIGk9c1t0aGlzLm9wdGlvbnMuYW5pbWF0aW9uXXx8cy5ub25lO3JldHVybiB0LnN1cHBvcnQuYW5pbWF0aW9ufHwoaT1zLm5vbmUpLGl9LF9oaWRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxpPXRoaXMuc2V0c1t0aGlzLmFjdGl2ZVNldF18fFtdLGU9dGhpcy5fZ2V0QW5pbWF0aW9uKCk7cmV0dXJuIHRoaXMuYW5pbWF0aW5nPSEwLGUuYXBwbHkodCxbaSxbXSwxXSkudGhlbihmdW5jdGlvbigpe3QuYW5pbWF0aW5nPSExfSl9LG5leHQ6ZnVuY3Rpb24oKXt0aGlzLnNob3codGhpcy5zZXRzW3RoaXMuYWN0aXZlU2V0KzFdP3RoaXMuYWN0aXZlU2V0KzE6MCwhMSwxKX0scHJldmlvdXM6ZnVuY3Rpb24oKXt0aGlzLnNob3codGhpcy5zZXRzW3RoaXMuYWN0aXZlU2V0LTFdP3RoaXMuYWN0aXZlU2V0LTE6dGhpcy5zZXRzLmxlbmd0aC0xLCExLC0xKX0sc3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0b3AoKTt2YXIgdD10aGlzO3RoaXMuaW50ZXJ2YWw9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0LmhvdmVyaW5nfHx0LmFuaW1hdGluZ3x8dC5uZXh0KCl9LHRoaXMub3B0aW9ucy5hdXRvcGxheUludGVydmFsKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuaW50ZXJ2YWwmJmNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCl9fSkscz17bm9uZTpmdW5jdGlvbigpe3ZhciBpPXQuJC5EZWZlcnJlZCgpO3JldHVybiBpLnJlc29sdmUoKSxpLnByb21pc2UoKX0sZmFkZTpmdW5jdGlvbih0LGUpe3JldHVybiBpLmFwcGx5KHRoaXMsW1widWstYW5pbWF0aW9uLWZhZGVcIix0LGVdKX0sXCJzbGlkZS1ib3R0b21cIjpmdW5jdGlvbih0LGUpe3JldHVybiBpLmFwcGx5KHRoaXMsW1widWstYW5pbWF0aW9uLXNsaWRlLWJvdHRvbVwiLHQsZV0pfSxcInNsaWRlLXRvcFwiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkuYXBwbHkodGhpcyxbXCJ1ay1hbmltYXRpb24tc2xpZGUtdG9wXCIsdCxlXSl9LFwic2xpZGUtdmVydGljYWxcIjpmdW5jdGlvbih0LGUscyl7dmFyIG49W1widWstYW5pbWF0aW9uLXNsaWRlLXRvcFwiLFwidWstYW5pbWF0aW9uLXNsaWRlLWJvdHRvbVwiXTtyZXR1cm4tMT09cyYmbi5yZXZlcnNlKCksaS5hcHBseSh0aGlzLFtuLHQsZV0pfSxcInNsaWRlLWhvcml6b250YWxcIjpmdW5jdGlvbih0LGUscyl7dmFyIG49W1widWstYW5pbWF0aW9uLXNsaWRlLXJpZ2h0XCIsXCJ1ay1hbmltYXRpb24tc2xpZGUtbGVmdFwiXTtyZXR1cm4tMT09cyYmbi5yZXZlcnNlKCksaS5hcHBseSh0aGlzLFtuLHQsZSxzXSl9LHNjYWxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkuYXBwbHkodGhpcyxbXCJ1ay1hbmltYXRpb24tc2NhbGUtdXBcIix0LGVdKX19LHQuc2xpZGVzZXQuYW5pbWF0aW9ucz1zfSk7IiwiLyohIFVJa2l0IDIuMjUuMCB8IGh0dHA6Ly93d3cuZ2V0dWlraXQuY29tIHwgKGMpIDIwMTQgWU9PdGhlbWUgfCBNSVQgTGljZW5zZSAqL1xuIWZ1bmN0aW9uIChpKSB7XG4gICAgdmFyIHQ7XG4gICAgd2luZG93LlVJa2l0ICYmICh0ID0gaShVSWtpdCkpLCBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGRlZmluZSAmJiBkZWZpbmUuYW1kICYmIGRlZmluZShcInVpa2l0LXNsaWRlc2hvd1wiLCBbXCJ1aWtpdFwiXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdCB8fCBpKFVJa2l0KVxuICAgIH0pXG59KGZ1bmN0aW9uIChpKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgdmFyIHQsIHMgPSAwO1xuICAgIGkuY29tcG9uZW50KFwic2xpZGVzaG93XCIsIHtcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogXCJmYWRlXCIsXG4gICAgICAgICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgICAgICAgaGVpZ2h0OiBcImF1dG9cIixcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgYXV0b3BsYXk6ICExLFxuICAgICAgICAgICAgYXV0b3BsYXlJbnRlcnZhbDogN2UzLFxuICAgICAgICAgICAgdmlkZW9hdXRvcGxheTogITAsXG4gICAgICAgICAgICB2aWRlb211dGU6ICEwLFxuICAgICAgICAgICAgc2xpY2VzOiAxNSxcbiAgICAgICAgICAgIHBhdXNlT25Ib3ZlcjogITAsXG4gICAgICAgICAgICBrZW5idXJuczogITEsXG4gICAgICAgICAgICBrZW5idXJuc2FuaW1hdGlvbnM6IFtcInVrLWFuaW1hdGlvbi1taWRkbGUtbGVmdFwiLCBcInVrLWFuaW1hdGlvbi10b3AtcmlnaHRcIiwgXCJ1ay1hbmltYXRpb24tYm90dG9tLWxlZnRcIiwgXCJ1ay1hbmltYXRpb24tdG9wLWNlbnRlclwiLCBcIlwiLCBcInVrLWFuaW1hdGlvbi1ib3R0b20tcmlnaHRcIl1cbiAgICAgICAgfSwgY3VycmVudDogITEsIGludGVydmFsOiBudWxsLCBob3ZlcmluZzogITEsIGJvb3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGkucmVhZHkoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICBpLiQoXCJbZGF0YS11ay1zbGlkZXNob3ddXCIsIHQpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGkuJCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgdC5kYXRhKFwic2xpZGVzaG93XCIpIHx8IGkuc2xpZGVzaG93KHQsIGkuVXRpbHMub3B0aW9ucyh0LmF0dHIoXCJkYXRhLXVrLXNsaWRlc2hvd1wiKSkpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0sIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0LCBlLCBhID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5lbGVtZW50Lmhhc0NsYXNzKFwidWstc2xpZGVzaG93XCIpID8gdGhpcy5lbGVtZW50IDogaS4kKHRoaXMuZmluZChcIi51ay1zbGlkZXNob3dcIikpLCB0aGlzLnNsaWRlcyA9IHRoaXMuY29udGFpbmVyLmNoaWxkcmVuKCksIHRoaXMuc2xpZGVzQ291bnQgPSB0aGlzLnNsaWRlcy5sZW5ndGgsIHRoaXMuY3VycmVudCA9IHRoaXMub3B0aW9ucy5zdGFydCwgdGhpcy5hbmltYXRpbmcgPSAhMSwgdGhpcy50cmlnZ2VycyA9IHRoaXMuZmluZChcIltkYXRhLXVrLXNsaWRlc2hvdy1pdGVtXVwiKSwgdGhpcy5maXhGdWxsc2NyZWVuID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvKGlQYWR8aVBob25lfGlQb2QpL2cpICYmIHRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwidWstc2xpZGVzaG93LWZ1bGxzY3JlZW5cIiksIHRoaXMub3B0aW9ucy5rZW5idXJucyAmJiAoZSA9IHRoaXMub3B0aW9ucy5rZW5idXJucyA9PT0gITAgPyBcIjE1c1wiIDogdGhpcy5vcHRpb25zLmtlbmJ1cm5zLCBTdHJpbmcoZSkubWF0Y2goLyhtc3xzKSQvKSB8fCAoZSArPSBcIm1zXCIpLCBcInN0cmluZ1wiID09IHR5cGVvZiB0aGlzLm9wdGlvbnMua2VuYnVybnNhbmltYXRpb25zICYmICh0aGlzLm9wdGlvbnMua2VuYnVybnNhbmltYXRpb25zID0gdGhpcy5vcHRpb25zLmtlbmJ1cm5zYW5pbWF0aW9ucy5zcGxpdChcIixcIikpKSwgdGhpcy5zbGlkZXMuZWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgICAgIHZhciBvID0gaS4kKHRoaXMpLCByID0gby5jaGlsZHJlbihcImltZyx2aWRlbyxpZnJhbWVcIikuZXEoMCk7XG4gICAgICAgICAgICAgICAgaWYgKG8uZGF0YShcIm1lZGlhXCIsIHIpLCBvLmRhdGEoXCJzaXplclwiLCByKSwgci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGQ7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoclswXS5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiUElDVFVSRVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiSU1HXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBpLiQoJzxkaXYgY2xhc3M9XCJ1ay1jb3Zlci1iYWNrZ3JvdW5kIHVrLXBvc2l0aW9uLWNvdmVyXCI+PC9kaXY+JykuY3NzKHtcImJhY2tncm91bmQtaW1hZ2VcIjogXCJ1cmwoXCIgKyByLmF0dHIoXCJzcmNcIikgKyBcIilcIn0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYXR0cihcIndpZHRoXCIpICYmIHIuYXR0cihcImhlaWdodFwiKSAmJiAoZCA9IGkuJChcIjxjYW52YXM+PC9jYW52YXM+XCIpLmF0dHIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogci5hdHRyKFwid2lkdGhcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogci5hdHRyKFwiaGVpZ2h0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIucmVwbGFjZVdpdGgoZCksIHIgPSBkLCBkID0gdm9pZCAwKSwgci5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogXCJhdXRvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgby5wcmVwZW5kKHUpLmRhdGEoXCJjb3ZlclwiLCB1KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcIklGUkFNRVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gclswXS5zcmMsIGMgPSBcInN3LVwiICsgKytzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYXR0cihcInNyY1wiLCBcIlwiKS5vbihcImxvYWRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG4gIT09IGEuY3VycmVudCB8fCBuID09IGEuY3VycmVudCAmJiAhYS5vcHRpb25zLnZpZGVvYXV0b3BsYXkpICYmIGEucGF1c2VtZWRpYShyKSwgYS5vcHRpb25zLnZpZGVvbXV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5tdXRlbWVkaWEocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHNldEludGVydmFsKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5tdXRlbWVkaWEociksICsrdCA+PSA0ICYmIGNsZWFySW50ZXJ2YWwoaSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KDApLCAyNTApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5kYXRhKFwic2xpZGVzaG93XCIsIGEpLmF0dHIoXCJkYXRhLXBsYXllci1pZFwiLCBjKS5hdHRyKFwic3JjXCIsIFtoLCBoLmluZGV4T2YoXCI/XCIpID4gLTEgPyBcIiZcIiA6IFwiP1wiLCBcImVuYWJsZWpzYXBpPTEmYXBpPTEmcGxheWVyX2lkPVwiICsgY10uam9pbihcIlwiKSkuYWRkQ2xhc3MoXCJ1ay1wb3NpdGlvbi1hYnNvbHV0ZVwiKSwgaS5zdXBwb3J0LnRvdWNoIHx8IHIuY3NzKFwicG9pbnRlci1ldmVudHNcIiwgXCJub25lXCIpLCBkID0gITAsIGkuY292ZXIgJiYgKGkuY292ZXIociksIHIuYXR0cihcImRhdGEtdWstY292ZXJcIiwgXCJ7fVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJWSURFT1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYWRkQ2xhc3MoXCJ1ay1jb3Zlci1vYmplY3QgdWstcG9zaXRpb24tYWJzb2x1dGVcIiksIGQgPSAhMCwgYS5vcHRpb25zLnZpZGVvbXV0ZSAmJiBhLm11dGVtZWRpYShyKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ID0gaS4kKFwiPGNhbnZhcz48L2NhbnZhcz5cIikuYXR0cih7d2lkdGg6IHJbMF0ud2lkdGgsIGhlaWdodDogclswXS5oZWlnaHR9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gaS4kKCc8aW1nIHN0eWxlPVwid2lkdGg6MTAwJTtoZWlnaHQ6YXV0bztcIj4nKS5hdHRyKFwic3JjXCIsIHRbMF0udG9EYXRhVVJMKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgby5wcmVwZW5kKGwpLCBvLmRhdGEoXCJzaXplclwiLCBsKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIG8uZGF0YShcInNpemVyXCIsIG8pO1xuICAgICAgICAgICAgICAgIGEuaGFzS2VuQnVybnMobykgJiYgby5kYXRhKFwiY292ZXJcIikuY3NzKHtcIi13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uXCI6IGUsIFwiYW5pbWF0aW9uLWR1cmF0aW9uXCI6IGV9KVxuICAgICAgICAgICAgfSksIHRoaXMub24oXCJjbGljay51ay5zbGlkZXNob3dcIiwgXCJbZGF0YS11ay1zbGlkZXNob3ctaXRlbV1cIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdmFyIHMgPSBpLiQodGhpcykuYXR0cihcImRhdGEtdWstc2xpZGVzaG93LWl0ZW1cIik7XG4gICAgICAgICAgICAgICAgaWYgKGEuY3VycmVudCAhPSBzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwibmV4dFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwicHJldmlvdXNcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW1wibmV4dFwiID09IHMgPyBcIm5leHRcIiA6IFwicHJldmlvdXNcIl0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5zaG93KHBhcnNlSW50KHMsIDEwKSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhLnN0b3AoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLCB0aGlzLnNsaWRlcy5hdHRyKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpLmVxKHRoaXMuY3VycmVudCkuYWRkQ2xhc3MoXCJ1ay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsIFwiZmFsc2VcIiksIHRoaXMudHJpZ2dlcnMuZmlsdGVyKCdbZGF0YS11ay1zbGlkZXNob3ctaXRlbT1cIicgKyB0aGlzLmN1cnJlbnQgKyAnXCJdJykuYWRkQ2xhc3MoXCJ1ay1hY3RpdmVcIiksIGkuJHdpbi5vbihcInJlc2l6ZSBsb2FkXCIsIGkuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGEucmVzaXplKCksIGEuZml4RnVsbHNjcmVlbiAmJiAoYS5jb250YWluZXIuY3NzKFwiaGVpZ2h0XCIsIHdpbmRvdy5pbm5lckhlaWdodCksIGEuc2xpZGVzLmNzcyhcImhlaWdodFwiLCB3aW5kb3cuaW5uZXJIZWlnaHQpKVxuICAgICAgICAgICAgfSwgMTAwKSksIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGEucmVzaXplKClcbiAgICAgICAgICAgIH0sIDgwKSwgdGhpcy5vcHRpb25zLmF1dG9wbGF5ICYmIHRoaXMuc3RhcnQoKSwgdGhpcy5vcHRpb25zLnZpZGVvYXV0b3BsYXkgJiYgdGhpcy5zbGlkZXMuZXEodGhpcy5jdXJyZW50KS5kYXRhKFwibWVkaWFcIikgJiYgdGhpcy5wbGF5bWVkaWEodGhpcy5zbGlkZXMuZXEodGhpcy5jdXJyZW50KS5kYXRhKFwibWVkaWFcIikpLCB0aGlzLm9wdGlvbnMua2VuYnVybnMgJiYgdGhpcy5hcHBseUtlbkJ1cm5zKHRoaXMuc2xpZGVzLmVxKHRoaXMuY3VycmVudCkpLCB0aGlzLmNvbnRhaW5lci5vbih7XG4gICAgICAgICAgICAgICAgbW91c2VlbnRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBhLm9wdGlvbnMucGF1c2VPbkhvdmVyICYmIChhLmhvdmVyaW5nID0gITApXG4gICAgICAgICAgICAgICAgfSwgbW91c2VsZWF2ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBhLmhvdmVyaW5nID0gITFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSwgdGhpcy5vbihcInN3aXBlUmlnaHQgc3dpcGVMZWZ0XCIsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgYVtcInN3aXBlTGVmdFwiID09IGkudHlwZSA/IFwibmV4dFwiIDogXCJwcmV2aW91c1wiXSgpXG4gICAgICAgICAgICB9KSwgdGhpcy5vbihcImRpc3BsYXkudWsuY2hlY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGEuZWxlbWVudC5pcyhcIjp2aXNpYmxlXCIpICYmIChhLnJlc2l6ZSgpLCBhLmZpeEZ1bGxzY3JlZW4gJiYgKGEuY29udGFpbmVyLmNzcyhcImhlaWdodFwiLCB3aW5kb3cuaW5uZXJIZWlnaHQpLCBhLnNsaWRlcy5jc3MoXCJoZWlnaHRcIiwgd2luZG93LmlubmVySGVpZ2h0KSkpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LCByZXNpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb250YWluZXIuaGFzQ2xhc3MoXCJ1ay1zbGlkZXNob3ctZnVsbHNjcmVlblwiKSkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5vcHRpb25zLmhlaWdodDtcbiAgICAgICAgICAgICAgICBcImF1dG9cIiA9PT0gdGhpcy5vcHRpb25zLmhlaWdodCAmJiAodCA9IDAsIHRoaXMuc2xpZGVzLmNzcyhcImhlaWdodFwiLCBcIlwiKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IE1hdGgubWF4KHQsIGkuJCh0aGlzKS5oZWlnaHQoKSlcbiAgICAgICAgICAgICAgICB9KSksIHRoaXMuY29udGFpbmVyLmNzcyhcImhlaWdodFwiLCB0KSwgdGhpcy5zbGlkZXMuY3NzKFwiaGVpZ2h0XCIsIHQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHNob3c6IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYW5pbWF0aW5nICYmIHRoaXMuY3VycmVudCAhPSBzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbmltYXRpbmcgPSAhMDtcbiAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMsIG4gPSB0aGlzLnNsaWRlcy5lcSh0aGlzLmN1cnJlbnQpLCBvID0gdGhpcy5zbGlkZXMuZXEocyksIHIgPSBlID8gZSA6IHRoaXMuY3VycmVudCA8IHMgPyAxIDogLTEsIGQgPSBuLmRhdGEoXCJtZWRpYVwiKSwgdSA9IHRbdGhpcy5vcHRpb25zLmFuaW1hdGlvbl0gPyB0aGlzLm9wdGlvbnMuYW5pbWF0aW9uIDogXCJmYWRlXCIsIGggPSBvLmRhdGEoXCJtZWRpYVwiKSwgYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgYS5hbmltYXRpbmcgJiYgKGQgJiYgZC5pcyhcInZpZGVvLGlmcmFtZVwiKSAmJiBhLnBhdXNlbWVkaWEoZCksIGggJiYgaC5pcyhcInZpZGVvLGlmcmFtZVwiKSAmJiBhLnBsYXltZWRpYShoKSwgby5hZGRDbGFzcyhcInVrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIiwgXCJmYWxzZVwiKSwgbi5yZW1vdmVDbGFzcyhcInVrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpLCBhLmFuaW1hdGluZyA9ICExLCBhLmN1cnJlbnQgPSBzLCBpLlV0aWxzLmNoZWNrRGlzcGxheShvLCAnW2NsYXNzKj1cInVrLWFuaW1hdGlvbi1cIl06bm90KC51ay1jb3Zlci1iYWNrZ3JvdW5kLnVrLXBvc2l0aW9uLWNvdmVyKScpLCBhLnRyaWdnZXIoXCJzaG93LnVrLnNsaWRlc2hvd1wiLCBbbywgbiwgYV0pKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYS5hcHBseUtlbkJ1cm5zKG8pLCBpLnN1cHBvcnQuYW5pbWF0aW9uIHx8ICh1ID0gXCJub25lXCIpLCBuID0gaS4kKG4pLCBvID0gaS4kKG8pLCBhLnRyaWdnZXIoXCJiZWZvcmVzaG93LnVrLnNsaWRlc2hvd1wiLCBbbywgbiwgYV0pLCB0W3VdLmFwcGx5KHRoaXMsIFtuLCBvLCByXSkudGhlbihjKSwgYS50cmlnZ2Vycy5yZW1vdmVDbGFzcyhcInVrLWFjdGl2ZVwiKSwgYS50cmlnZ2Vycy5maWx0ZXIoJ1tkYXRhLXVrLXNsaWRlc2hvdy1pdGVtPVwiJyArIHMgKyAnXCJdJykuYWRkQ2xhc3MoXCJ1ay1hY3RpdmVcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgYXBwbHlLZW5CdXJuczogZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0tlbkJ1cm5zKGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLm9wdGlvbnMua2VuYnVybnNhbmltYXRpb25zLCBzID0gdGhpcy5rYmluZGV4IHx8IDA7XG4gICAgICAgICAgICAgICAgaS5kYXRhKFwiY292ZXJcIikuYXR0cihcImNsYXNzXCIsIFwidWstY292ZXItYmFja2dyb3VuZCB1ay1wb3NpdGlvbi1jb3ZlclwiKS53aWR0aCgpLCBpLmRhdGEoXCJjb3ZlclwiKS5hZGRDbGFzcyhbXCJ1ay1hbmltYXRpb24tc2NhbGVcIiwgXCJ1ay1hbmltYXRpb24tcmV2ZXJzZVwiLCB0W3NdLnRyaW0oKV0uam9pbihcIiBcIikpLCB0aGlzLmtiaW5kZXggPSB0W3MgKyAxXSA/IHMgKyAxIDogMFxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBoYXNLZW5CdXJuczogZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMua2VuYnVybnMgJiYgaS5kYXRhKFwiY292ZXJcIilcbiAgICAgICAgfSwgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5zaG93KHRoaXMuc2xpZGVzW3RoaXMuY3VycmVudCArIDFdID8gdGhpcy5jdXJyZW50ICsgMSA6IDAsIDEpXG4gICAgICAgIH0sIHByZXZpb3VzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLnNob3codGhpcy5zbGlkZXNbdGhpcy5jdXJyZW50IC0gMV0gPyB0aGlzLmN1cnJlbnQgLSAxIDogdGhpcy5zbGlkZXMubGVuZ3RoIC0gMSwgLTEpXG4gICAgICAgIH0sIHN0YXJ0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgIHZhciBpID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaS5ob3ZlcmluZyB8fCBpLm5leHQoKVxuICAgICAgICAgICAgfSwgdGhpcy5vcHRpb25zLmF1dG9wbGF5SW50ZXJ2YWwpXG4gICAgICAgIH0sIHN0b3A6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJ2YWwgJiYgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKVxuICAgICAgICB9LCBwbGF5bWVkaWE6IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICBpZiAoaSAmJiBpWzBdKXN3aXRjaCAoaVswXS5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIGNhc2VcIlZJREVPXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52aWRlb211dGUgfHwgKGlbMF0ubXV0ZWQgPSAhMSksIGlbMF0ucGxheSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlXCJJRlJBTUVcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZpZGVvbXV0ZSB8fCBpWzBdLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ3sgXCJldmVudFwiOiBcImNvbW1hbmRcIiwgXCJmdW5jXCI6IFwidW5tdXRlXCIsIFwibWV0aG9kXCI6XCJzZXRWb2x1bWVcIiwgXCJ2YWx1ZVwiOjF9JywgXCIqXCIpLCBpWzBdLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ3sgXCJldmVudFwiOiBcImNvbW1hbmRcIiwgXCJmdW5jXCI6IFwicGxheVZpZGVvXCIsIFwibWV0aG9kXCI6XCJwbGF5XCJ9JywgXCIqXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHBhdXNlbWVkaWE6IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGlbMF0ubm9kZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlXCJWSURFT1wiOlxuICAgICAgICAgICAgICAgICAgICBpWzBdLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2VcIklGUkFNRVwiOlxuICAgICAgICAgICAgICAgICAgICBpWzBdLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ3sgXCJldmVudFwiOiBcImNvbW1hbmRcIiwgXCJmdW5jXCI6IFwicGF1c2VWaWRlb1wiLCBcIm1ldGhvZFwiOlwicGF1c2VcIn0nLCBcIipcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgbXV0ZW1lZGlhOiBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgc3dpdGNoIChpWzBdLm5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgY2FzZVwiVklERU9cIjpcbiAgICAgICAgICAgICAgICAgICAgaVswXS5tdXRlZCA9ICEwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlXCJJRlJBTUVcIjpcbiAgICAgICAgICAgICAgICAgICAgaVswXS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCd7IFwiZXZlbnRcIjogXCJjb21tYW5kXCIsIFwiZnVuY1wiOiBcIm11dGVcIiwgXCJtZXRob2RcIjpcInNldFZvbHVtZVwiLCBcInZhbHVlXCI6MH0nLCBcIipcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pLCB0ID0ge1xuICAgICAgICBub25lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdCA9IGkuJC5EZWZlcnJlZCgpO1xuICAgICAgICAgICAgcmV0dXJuIHQucmVzb2x2ZSgpLCB0LnByb21pc2UoKVxuICAgICAgICB9LCBzY3JvbGw6IGZ1bmN0aW9uICh0LCBzLCBlKSB7XG4gICAgICAgICAgICB2YXIgYSA9IGkuJC5EZWZlcnJlZCgpO1xuICAgICAgICAgICAgcmV0dXJuIHQuY3NzKFwiYW5pbWF0aW9uLWR1cmF0aW9uXCIsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiArIFwibXNcIiksIHMuY3NzKFwiYW5pbWF0aW9uLWR1cmF0aW9uXCIsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiArIFwibXNcIiksIHMuY3NzKFwib3BhY2l0eVwiLCAxKS5vbmUoaS5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0LnJlbW92ZUNsYXNzKC0xID09IGUgPyBcInVrLXNsaWRlc2hvdy1zY3JvbGwtYmFja3dhcmQtb3V0XCIgOiBcInVrLXNsaWRlc2hvdy1zY3JvbGwtZm9yd2FyZC1vdXRcIiksIHMuY3NzKFwib3BhY2l0eVwiLCBcIlwiKS5yZW1vdmVDbGFzcygtMSA9PSBlID8gXCJ1ay1zbGlkZXNob3ctc2Nyb2xsLWJhY2t3YXJkLWluXCIgOiBcInVrLXNsaWRlc2hvdy1zY3JvbGwtZm9yd2FyZC1pblwiKSwgYS5yZXNvbHZlKClcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSksIHQuYWRkQ2xhc3MoLTEgPT0gZSA/IFwidWstc2xpZGVzaG93LXNjcm9sbC1iYWNrd2FyZC1vdXRcIiA6IFwidWstc2xpZGVzaG93LXNjcm9sbC1mb3J3YXJkLW91dFwiKSwgcy5hZGRDbGFzcygtMSA9PSBlID8gXCJ1ay1zbGlkZXNob3ctc2Nyb2xsLWJhY2t3YXJkLWluXCIgOiBcInVrLXNsaWRlc2hvdy1zY3JvbGwtZm9yd2FyZC1pblwiKSwgcy53aWR0aCgpLCBhLnByb21pc2UoKVxuICAgICAgICB9LCBzd2lwZTogZnVuY3Rpb24gKHQsIHMsIGUpIHtcbiAgICAgICAgICAgIHZhciBhID0gaS4kLkRlZmVycmVkKCk7XG4gICAgICAgICAgICByZXR1cm4gdC5jc3MoXCJhbmltYXRpb24tZHVyYXRpb25cIiwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICsgXCJtc1wiKSwgcy5jc3MoXCJhbmltYXRpb24tZHVyYXRpb25cIiwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICsgXCJtc1wiKSwgcy5jc3MoXCJvcGFjaXR5XCIsIDEpLm9uZShpLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHQucmVtb3ZlQ2xhc3MoLTEgPT09IGUgPyBcInVrLXNsaWRlc2hvdy1zd2lwZS1iYWNrd2FyZC1vdXRcIiA6IFwidWstc2xpZGVzaG93LXN3aXBlLWZvcndhcmQtb3V0XCIpLCBzLmNzcyhcIm9wYWNpdHlcIiwgXCJcIikucmVtb3ZlQ2xhc3MoLTEgPT09IGUgPyBcInVrLXNsaWRlc2hvdy1zd2lwZS1iYWNrd2FyZC1pblwiIDogXCJ1ay1zbGlkZXNob3ctc3dpcGUtZm9yd2FyZC1pblwiKSwgYS5yZXNvbHZlKClcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSksIHQuYWRkQ2xhc3MoLTEgPT0gZSA/IFwidWstc2xpZGVzaG93LXN3aXBlLWJhY2t3YXJkLW91dFwiIDogXCJ1ay1zbGlkZXNob3ctc3dpcGUtZm9yd2FyZC1vdXRcIiksIHMuYWRkQ2xhc3MoLTEgPT0gZSA/IFwidWstc2xpZGVzaG93LXN3aXBlLWJhY2t3YXJkLWluXCIgOiBcInVrLXNsaWRlc2hvdy1zd2lwZS1mb3J3YXJkLWluXCIpLCBzLndpZHRoKCksIGEucHJvbWlzZSgpXG4gICAgICAgIH0sIHNjYWxlOiBmdW5jdGlvbiAodCwgcykge1xuICAgICAgICAgICAgdmFyIGUgPSBpLiQuRGVmZXJyZWQoKTtcbiAgICAgICAgICAgIHJldHVybiB0LmNzcyhcImFuaW1hdGlvbi1kdXJhdGlvblwiLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyBcIm1zXCIpLCBzLmNzcyhcImFuaW1hdGlvbi1kdXJhdGlvblwiLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyBcIm1zXCIpLCBzLmNzcyhcIm9wYWNpdHlcIiwgMSksIHQub25lKGkuc3VwcG9ydC5hbmltYXRpb24uZW5kLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdC5yZW1vdmVDbGFzcyhcInVrLXNsaWRlc2hvdy1zY2FsZS1vdXRcIiksIHMuY3NzKFwib3BhY2l0eVwiLCBcIlwiKSwgZS5yZXNvbHZlKClcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSksIHQuYWRkQ2xhc3MoXCJ1ay1zbGlkZXNob3ctc2NhbGUtb3V0XCIpLCB0LndpZHRoKCksIGUucHJvbWlzZSgpXG4gICAgICAgIH0sIGZhZGU6IGZ1bmN0aW9uICh0LCBzKSB7XG4gICAgICAgICAgICB2YXIgZSA9IGkuJC5EZWZlcnJlZCgpO1xuICAgICAgICAgICAgcmV0dXJuIHQuY3NzKFwiYW5pbWF0aW9uLWR1cmF0aW9uXCIsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiArIFwibXNcIiksIHMuY3NzKFwiYW5pbWF0aW9uLWR1cmF0aW9uXCIsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiArIFwibXNcIiksIHMuY3NzKFwib3BhY2l0eVwiLCAxKSwgcy5kYXRhKFwiY292ZXJcIikgfHwgcy5kYXRhKFwicGxhY2Vob2xkZXJcIikgfHwgcy5jc3MoXCJvcGFjaXR5XCIsIDEpLm9uZShpLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHMucmVtb3ZlQ2xhc3MoXCJ1ay1zbGlkZXNob3ctZmFkZS1pblwiKVxuICAgICAgICAgICAgfSkuYWRkQ2xhc3MoXCJ1ay1zbGlkZXNob3ctZmFkZS1pblwiKSwgdC5vbmUoaS5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0LnJlbW92ZUNsYXNzKFwidWstc2xpZGVzaG93LWZhZGUtb3V0XCIpLCBzLmNzcyhcIm9wYWNpdHlcIiwgXCJcIiksIGUucmVzb2x2ZSgpXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpLCB0LmFkZENsYXNzKFwidWstc2xpZGVzaG93LWZhZGUtb3V0XCIpLCB0LndpZHRoKCksIGUucHJvbWlzZSgpXG4gICAgICAgIH1cbiAgICB9LCBpLnNsaWRlc2hvdy5hbmltYXRpb25zID0gdCwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBzLCBlID0gdC5kYXRhO1xuICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgZSl0cnkge1xuICAgICAgICAgICAgZSA9IEpTT04ucGFyc2UoZSlcbiAgICAgICAgfSBjYXRjaCAoYSkge1xuICAgICAgICAgICAgZSA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgdC5vcmlnaW4gJiYgdC5vcmlnaW4uaW5kZXhPZihcInZpbWVvXCIpID4gLTEgJiYgXCJyZWFkeVwiID09IGUuZXZlbnQgJiYgZS5wbGF5ZXJfaWQgJiYgKHMgPSBpLiQoJ1tkYXRhLXBsYXllci1pZD1cIicgKyBlLnBsYXllcl9pZCArICdcIl0nKSwgcy5sZW5ndGggJiYgcy5kYXRhKFwic2xpZGVzaG93XCIpLm11dGVtZWRpYShzKSlcbiAgICB9LCAhMSlcbn0pOyIsIi8qISBVSWtpdCAyLjI2LjMgfCBodHRwOi8vd3d3LmdldHVpa2l0LmNvbSB8IChjKSAyMDE0IFlPT3RoZW1lIHwgTUlUIExpY2Vuc2UgKi9cbiFmdW5jdGlvbih0KXt2YXIgaTt3aW5kb3cuVUlraXQmJihpPXQoVUlraXQpKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZShcInVpa2l0LXN0aWNreVwiLFtcInVpa2l0XCJdLGZ1bmN0aW9uKCl7cmV0dXJuIGl8fHQoVUlraXQpfSl9KGZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGkoKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50czpuO2lmKGkubGVuZ3RoJiYhKGUuc2Nyb2xsVG9wKCk8MCkpZm9yKHZhciBvLGEscixoLHA9ZS5zY3JvbGxUb3AoKSxjPXMuaGVpZ2h0KCksbD1lLmhlaWdodCgpLGQ9Yy1sLHU9cD5kP2QtcDowLG09MDttPGkubGVuZ3RoO20rKylpZihoPWlbbV0saC5lbGVtZW50LmlzKFwiOnZpc2libGVcIikmJiFoLmFuaW1hdGUpe2lmKGguY2hlY2soKSl7aWYoaC50b3A8MD9vPTA6KHI9aC5lbGVtZW50Lm91dGVySGVpZ2h0KCksbz1jLXItaC50b3AtaC5vcHRpb25zLmJvdHRvbS1wLXUsbz0wPm8/bytoLnRvcDpoLnRvcCksaC5ib3VuZGFyeSYmaC5ib3VuZGFyeS5sZW5ndGgpe3ZhciBmPWguYm91bmRhcnkub2Zmc2V0KCkudG9wO2E9aC5ib3VuZHRvcGFyZW50P2MtKGYraC5ib3VuZGFyeS5vdXRlckhlaWdodCgpKStwYXJzZUludChoLmJvdW5kYXJ5LmNzcyhcInBhZGRpbmctYm90dG9tXCIpKTpjLWYsbz1wK3I+Yy1hLShoLnRvcDwwPzA6aC50b3ApP2MtYS0ocCtyKTpvfWlmKGguY3VycmVudFRvcCE9byl7aWYoaC5lbGVtZW50LmNzcyh7cG9zaXRpb246XCJmaXhlZFwiLHRvcDpvLHdpZHRoOmguZ2V0V2lkdGhGcm9tLmxlbmd0aD9oLmdldFdpZHRoRnJvbS53aWR0aCgpOmguZWxlbWVudC53aWR0aCgpfSksIWguaW5pdCYmKGguZWxlbWVudC5hZGRDbGFzcyhoLm9wdGlvbnMuY2xzaW5pdCksbG9jYXRpb24uaGFzaCYmcD4wJiZoLm9wdGlvbnMudGFyZ2V0KSl7dmFyIGc9dC4kKGxvY2F0aW9uLmhhc2gpO2cubGVuZ3RoJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKHQsaSl7cmV0dXJuIGZ1bmN0aW9uKCl7aS5lbGVtZW50LndpZHRoKCk7dmFyIGU9dC5vZmZzZXQoKSxzPWUudG9wK3Qub3V0ZXJIZWlnaHQoKSxuPWkuZWxlbWVudC5vZmZzZXQoKSxvPWkuZWxlbWVudC5vdXRlckhlaWdodCgpLGE9bi50b3ArbztuLnRvcDxzJiZlLnRvcDxhJiYocD1lLnRvcC1vLWkub3B0aW9ucy50YXJnZXQsd2luZG93LnNjcm9sbFRvKDAscCkpfX0oZyxoKSwwKX1oLmVsZW1lbnQuYWRkQ2xhc3MoaC5vcHRpb25zLmNsc2FjdGl2ZSkucmVtb3ZlQ2xhc3MoaC5vcHRpb25zLmNsc2luYWN0aXZlKSxoLmVsZW1lbnQudHJpZ2dlcihcImFjdGl2ZS51ay5zdGlja3lcIiksaC5lbGVtZW50LmNzcyhcIm1hcmdpblwiLFwiXCIpLGgub3B0aW9ucy5hbmltYXRpb24mJmguaW5pdCYmIXQuVXRpbHMuaXNJblZpZXcoaC53cmFwcGVyKSYmaC5lbGVtZW50LmFkZENsYXNzKGgub3B0aW9ucy5hbmltYXRpb24pLGguY3VycmVudFRvcD1vfX1lbHNlIG51bGwhPT1oLmN1cnJlbnRUb3AmJmgucmVzZXQoKTtoLmluaXQ9ITB9fXZhciBlPXQuJHdpbixzPXQuJGRvYyxuPVtdLG89MTtyZXR1cm4gdC5jb21wb25lbnQoXCJzdGlja3lcIix7ZGVmYXVsdHM6e3RvcDowLGJvdHRvbTowLGFuaW1hdGlvbjpcIlwiLGNsc2luaXQ6XCJ1ay1zdGlja3ktaW5pdFwiLGNsc2FjdGl2ZTpcInVrLWFjdGl2ZVwiLGNsc2luYWN0aXZlOlwiXCIsZ2V0V2lkdGhGcm9tOlwiXCIsc2hvd3VwOiExLGJvdW5kYXJ5OiExLG1lZGlhOiExLHRhcmdldDohMSxkaXNhYmxlZDohMX0sYm9vdDpmdW5jdGlvbigpe3QuJGRvYy5vbihcInNjcm9sbGluZy51ay5kb2N1bWVudFwiLGZ1bmN0aW9uKHQsZSl7ZSYmZS5kaXImJihvPWUuZGlyLnksaSgpKX0pLHQuJHdpbi5vbihcInJlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZVwiLHQuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24oKXtpZihuLmxlbmd0aCl7Zm9yKHZhciB0PTA7dDxuLmxlbmd0aDt0Kyspblt0XS5yZXNldCghMCk7aSgpfX0sMTAwKSksdC5yZWFkeShmdW5jdGlvbihlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC4kKFwiW2RhdGEtdWstc3RpY2t5XVwiLGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT10LiQodGhpcyk7aS5kYXRhKFwic3RpY2t5XCIpfHx0LnN0aWNreShpLHQuVXRpbHMub3B0aW9ucyhpLmF0dHIoXCJkYXRhLXVrLXN0aWNreVwiKSkpfSksaSgpfSwwKX0pfSxpbml0OmZ1bmN0aW9uKCl7dmFyIGksYT10aGlzLm9wdGlvbnMuYm91bmRhcnk7dGhpcy53cmFwcGVyPXRoaXMuZWxlbWVudC53cmFwKCc8ZGl2IGNsYXNzPVwidWstc3RpY2t5LXBsYWNlaG9sZGVyXCI+PC9kaXY+JykucGFyZW50KCksdGhpcy5jb21wdXRlV3JhcHBlcigpLHRoaXMuZWxlbWVudC5jc3MoXCJtYXJnaW5cIiwwKSxhJiYoYT09PSEwfHxcIiFcIj09PWFbMF0/KGE9YT09PSEwP3RoaXMud3JhcHBlci5wYXJlbnQoKTp0aGlzLndyYXBwZXIuY2xvc2VzdChhLnN1YnN0cigxKSksaT0hMCk6XCJzdHJpbmdcIj09dHlwZW9mIGEmJihhPXQuJChhKSkpLHRoaXMuc3RpY2t5PXtzZWxmOnRoaXMsb3B0aW9uczp0aGlzLm9wdGlvbnMsZWxlbWVudDp0aGlzLmVsZW1lbnQsY3VycmVudFRvcDpudWxsLHdyYXBwZXI6dGhpcy53cmFwcGVyLGluaXQ6ITEsZ2V0V2lkdGhGcm9tOnQuJCh0aGlzLm9wdGlvbnMuZ2V0V2lkdGhGcm9tfHx0aGlzLndyYXBwZXIpLGJvdW5kYXJ5OmEsYm91bmR0b3BhcmVudDppLHRvcDowLGNhbGNUb3A6ZnVuY3Rpb24oKXt2YXIgaT10aGlzLm9wdGlvbnMudG9wO2lmKHRoaXMub3B0aW9ucy50b3AmJlwic3RyaW5nXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMudG9wKWlmKHRoaXMub3B0aW9ucy50b3AubWF0Y2goL14oLXwpKFxcZCspdmgkLykpaT13aW5kb3cuaW5uZXJIZWlnaHQqcGFyc2VJbnQodGhpcy5vcHRpb25zLnRvcCwxMCkvMTAwO2Vsc2V7dmFyIGU9dC4kKHRoaXMub3B0aW9ucy50b3ApLmZpcnN0KCk7ZS5sZW5ndGgmJmUuaXMoXCI6dmlzaWJsZVwiKSYmKGk9LTEqKGUub2Zmc2V0KCkudG9wK2Uub3V0ZXJIZWlnaHQoKS10aGlzLndyYXBwZXIub2Zmc2V0KCkudG9wKSl9dGhpcy50b3A9aX0scmVzZXQ6ZnVuY3Rpb24oaSl7dGhpcy5jYWxjVG9wKCk7dmFyIGU9ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuY3NzKHtwb3NpdGlvbjpcIlwiLHRvcDpcIlwiLHdpZHRoOlwiXCIsbGVmdDpcIlwiLG1hcmdpbjpcIjBcIn0pLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhbdGhpcy5vcHRpb25zLmFuaW1hdGlvbixcInVrLWFuaW1hdGlvbi1yZXZlcnNlXCIsdGhpcy5vcHRpb25zLmNsc2FjdGl2ZV0uam9pbihcIiBcIikpLHRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuY2xzaW5hY3RpdmUpLHRoaXMuZWxlbWVudC50cmlnZ2VyKFwiaW5hY3RpdmUudWsuc3RpY2t5XCIpLHRoaXMuY3VycmVudFRvcD1udWxsLHRoaXMuYW5pbWF0ZT0hMX0uYmluZCh0aGlzKTshaSYmdGhpcy5vcHRpb25zLmFuaW1hdGlvbiYmdC5zdXBwb3J0LmFuaW1hdGlvbiYmIXQuVXRpbHMuaXNJblZpZXcodGhpcy53cmFwcGVyKT8odGhpcy5hbmltYXRlPSEwLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKS5vbmUodC5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsZnVuY3Rpb24oKXtlKCl9KS53aWR0aCgpLHRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYW5pbWF0aW9uK1wiIHVrLWFuaW1hdGlvbi1yZXZlcnNlXCIpKTplKCl9LGNoZWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLmRpc2FibGVkKXJldHVybiExO2lmKHRoaXMub3B0aW9ucy5tZWRpYSlzd2l0Y2godHlwZW9mIHRoaXMub3B0aW9ucy5tZWRpYSl7Y2FzZVwibnVtYmVyXCI6aWYod2luZG93LmlubmVyV2lkdGg8dGhpcy5vcHRpb25zLm1lZGlhKXJldHVybiExO2JyZWFrO2Nhc2VcInN0cmluZ1wiOmlmKHdpbmRvdy5tYXRjaE1lZGlhJiYhd2luZG93Lm1hdGNoTWVkaWEodGhpcy5vcHRpb25zLm1lZGlhKS5tYXRjaGVzKXJldHVybiExfXZhciBpPWUuc2Nyb2xsVG9wKCksbj1zLmhlaWdodCgpLGE9bi13aW5kb3cuaW5uZXJIZWlnaHQscj1pPmE/YS1pOjAsaD10aGlzLndyYXBwZXIub2Zmc2V0KCkudG9wLHA9aC10aGlzLnRvcC1yLGM9aT49cDtyZXR1cm4gYyYmdGhpcy5vcHRpb25zLnNob3d1cCYmKDE9PW8mJihjPSExKSwtMT09byYmIXRoaXMuZWxlbWVudC5oYXNDbGFzcyh0aGlzLm9wdGlvbnMuY2xzYWN0aXZlKSYmdC5VdGlscy5pc0luVmlldyh0aGlzLndyYXBwZXIpJiYoYz0hMSkpLGN9fSx0aGlzLnN0aWNreS5jYWxjVG9wKCksbi5wdXNoKHRoaXMuc3RpY2t5KX0sdXBkYXRlOmZ1bmN0aW9uKCl7aSh0aGlzLnN0aWNreSl9LGVuYWJsZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5kaXNhYmxlZD0hMSx0aGlzLnVwZGF0ZSgpfSxkaXNhYmxlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucy5kaXNhYmxlZD0hMCx0aGlzLnN0aWNreS5yZXNldCh0KX0sY29tcHV0ZVdyYXBwZXI6ZnVuY3Rpb24oKXt0aGlzLndyYXBwZXIuY3NzKHtoZWlnaHQ6LTE9PVtcImFic29sdXRlXCIsXCJmaXhlZFwiXS5pbmRleE9mKHRoaXMuZWxlbWVudC5jc3MoXCJwb3NpdGlvblwiKSk/dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCk6XCJcIixcImZsb2F0XCI6XCJub25lXCIhPXRoaXMuZWxlbWVudC5jc3MoXCJmbG9hdFwiKT90aGlzLmVsZW1lbnQuY3NzKFwiZmxvYXRcIik6XCJcIixtYXJnaW46dGhpcy5lbGVtZW50LmNzcyhcIm1hcmdpblwiKX0pLFwiZml4ZWRcIj09dGhpcy5lbGVtZW50LmNzcyhcInBvc2l0aW9uXCIpJiZ0aGlzLmVsZW1lbnQuY3NzKHt3aWR0aDp0aGlzLnN0aWNreS5nZXRXaWR0aEZyb20ubGVuZ3RoP3RoaXMuc3RpY2t5LmdldFdpZHRoRnJvbS53aWR0aCgpOnRoaXMuZWxlbWVudC53aWR0aCgpfSl9fSksdC5zdGlja3l9KTsiLCIvKiEgVUlraXQgMi4yNi4zIHwgaHR0cDovL3d3dy5nZXR1aWtpdC5jb20gfCAoYykgMjAxNCBZT090aGVtZSB8IE1JVCBMaWNlbnNlICovXG4hZnVuY3Rpb24odCl7dmFyIGk7d2luZG93LlVJa2l0JiYoaT10KFVJa2l0KSksXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoXCJ1aWtpdC10b29sdGlwXCIsW1widWlraXRcIl0sZnVuY3Rpb24oKXtyZXR1cm4gaXx8dChVSWtpdCl9KX0oZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksbyxlO3JldHVybiB0LmNvbXBvbmVudChcInRvb2x0aXBcIix7ZGVmYXVsdHM6e29mZnNldDo1LHBvczpcInRvcFwiLGFuaW1hdGlvbjohMSxkZWxheTowLGNsczpcIlwiLGFjdGl2ZUNsYXNzOlwidWstYWN0aXZlXCIsc3JjOmZ1bmN0aW9uKHQpe3ZhciBpPXQuYXR0cihcInRpdGxlXCIpO3JldHVybiB2b2lkIDAhPT1pJiZ0LmRhdGEoXCJjYWNoZWQtdGl0bGVcIixpKS5yZW1vdmVBdHRyKFwidGl0bGVcIiksdC5kYXRhKFwiY2FjaGVkLXRpdGxlXCIpfX0sdGlwOlwiXCIsYm9vdDpmdW5jdGlvbigpe3QuJGh0bWwub24oXCJtb3VzZWVudGVyLnRvb2x0aXAudWlraXQgZm9jdXMudG9vbHRpcC51aWtpdFwiLFwiW2RhdGEtdWstdG9vbHRpcF1cIixmdW5jdGlvbigpe3ZhciBpPXQuJCh0aGlzKTtpLmRhdGEoXCJ0b29sdGlwXCIpfHwodC50b29sdGlwKGksdC5VdGlscy5vcHRpb25zKGkuYXR0cihcImRhdGEtdWstdG9vbHRpcFwiKSkpLGkudHJpZ2dlcihcIm1vdXNlZW50ZXJcIikpfSl9LGluaXQ6ZnVuY3Rpb24oKXt2YXIgbz10aGlzO2l8fChpPXQuJCgnPGRpdiBjbGFzcz1cInVrLXRvb2x0aXBcIj48L2Rpdj4nKS5hcHBlbmRUbyhcImJvZHlcIikpLHRoaXMub24oe2ZvY3VzOmZ1bmN0aW9uKCl7by5zaG93KCl9LGJsdXI6ZnVuY3Rpb24oKXtvLmhpZGUoKX0sbW91c2VlbnRlcjpmdW5jdGlvbigpe28uc2hvdygpfSxtb3VzZWxlYXZlOmZ1bmN0aW9uKCl7by5oaWRlKCl9fSl9LHNob3c6ZnVuY3Rpb24oKXtpZih0aGlzLnRpcD1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuc3JjP3RoaXMub3B0aW9ucy5zcmModGhpcy5lbGVtZW50KTp0aGlzLm9wdGlvbnMuc3JjLG8mJmNsZWFyVGltZW91dChvKSxlJiZjbGVhclRpbWVvdXQoZSksXCJzdHJpbmdcIj09dHlwZW9mIHRoaXMudGlwP3RoaXMudGlwLmxlbmd0aDowKXtpLnN0b3AoKS5jc3Moe3RvcDotMmUzLHZpc2liaWxpdHk6XCJoaWRkZW5cIn0pLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcykuc2hvdygpLGkuaHRtbCgnPGRpdiBjbGFzcz1cInVrLXRvb2x0aXAtaW5uZXJcIj4nK3RoaXMudGlwK1wiPC9kaXY+XCIpO3ZhciBzPXRoaXMsbj10LiQuZXh0ZW5kKHt9LHRoaXMuZWxlbWVudC5vZmZzZXQoKSx7d2lkdGg6dGhpcy5lbGVtZW50WzBdLm9mZnNldFdpZHRoLGhlaWdodDp0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fSksbD1pWzBdLm9mZnNldFdpZHRoLGY9aVswXS5vZmZzZXRIZWlnaHQscD1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMub2Zmc2V0P3RoaXMub3B0aW9ucy5vZmZzZXQuY2FsbCh0aGlzLmVsZW1lbnQpOnRoaXMub3B0aW9ucy5vZmZzZXQsYT1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMucG9zP3RoaXMub3B0aW9ucy5wb3MuY2FsbCh0aGlzLmVsZW1lbnQpOnRoaXMub3B0aW9ucy5wb3MsaD1hLnNwbGl0KFwiLVwiKSxjPXtkaXNwbGF5Olwibm9uZVwiLHZpc2liaWxpdHk6XCJ2aXNpYmxlXCIsdG9wOm4udG9wK24uaGVpZ2h0K2YsbGVmdDpuLmxlZnR9O2lmKFwiZml4ZWRcIj09dC4kaHRtbC5jc3MoXCJwb3NpdGlvblwiKXx8XCJmaXhlZFwiPT10LiRib2R5LmNzcyhcInBvc2l0aW9uXCIpKXt2YXIgcj10LiQoXCJib2R5XCIpLm9mZnNldCgpLGQ9dC4kKFwiaHRtbFwiKS5vZmZzZXQoKSx1PXt0b3A6ZC50b3Arci50b3AsbGVmdDpkLmxlZnQrci5sZWZ0fTtuLmxlZnQtPXUubGVmdCxuLnRvcC09dS50b3B9XCJsZWZ0XCIhPWhbMF0mJlwicmlnaHRcIiE9aFswXXx8XCJyaWdodFwiIT10LmxhbmdkaXJlY3Rpb258fChoWzBdPVwibGVmdFwiPT1oWzBdP1wicmlnaHRcIjpcImxlZnRcIik7dmFyIG09e2JvdHRvbTp7dG9wOm4udG9wK24uaGVpZ2h0K3AsbGVmdDpuLmxlZnQrbi53aWR0aC8yLWwvMn0sdG9wOnt0b3A6bi50b3AtZi1wLGxlZnQ6bi5sZWZ0K24ud2lkdGgvMi1sLzJ9LGxlZnQ6e3RvcDpuLnRvcCtuLmhlaWdodC8yLWYvMixsZWZ0Om4ubGVmdC1sLXB9LHJpZ2h0Ont0b3A6bi50b3Arbi5oZWlnaHQvMi1mLzIsbGVmdDpuLmxlZnQrbi53aWR0aCtwfX07dC4kLmV4dGVuZChjLG1baFswXV0pLDI9PWgubGVuZ3RoJiYoYy5sZWZ0PVwibGVmdFwiPT1oWzFdP24ubGVmdDpuLmxlZnQrbi53aWR0aC1sKTt2YXIgdj10aGlzLmNoZWNrQm91bmRhcnkoYy5sZWZ0LGMudG9wLGwsZik7aWYodil7c3dpdGNoKHYpe2Nhc2VcInhcIjphPTI9PWgubGVuZ3RoP2hbMF0rXCItXCIrKGMubGVmdDwwP1wibGVmdFwiOlwicmlnaHRcIik6Yy5sZWZ0PDA/XCJyaWdodFwiOlwibGVmdFwiO2JyZWFrO2Nhc2VcInlcIjphPTI9PWgubGVuZ3RoPyhjLnRvcDwwP1wiYm90dG9tXCI6XCJ0b3BcIikrXCItXCIraFsxXTpjLnRvcDwwP1wiYm90dG9tXCI6XCJ0b3BcIjticmVhaztjYXNlXCJ4eVwiOmE9Mj09aC5sZW5ndGg/KGMudG9wPDA/XCJib3R0b21cIjpcInRvcFwiKStcIi1cIisoYy5sZWZ0PDA/XCJsZWZ0XCI6XCJyaWdodFwiKTpjLmxlZnQ8MD9cInJpZ2h0XCI6XCJsZWZ0XCJ9aD1hLnNwbGl0KFwiLVwiKSx0LiQuZXh0ZW5kKGMsbVtoWzBdXSksMj09aC5sZW5ndGgmJihjLmxlZnQ9XCJsZWZ0XCI9PWhbMV0/bi5sZWZ0Om4ubGVmdCtuLndpZHRoLWwpfWMubGVmdC09dC4kYm9keS5wb3NpdGlvbigpLmxlZnQsbz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5jc3MoYykuYXR0cihcImNsYXNzXCIsW1widWstdG9vbHRpcFwiLFwidWstdG9vbHRpcC1cIithLHMub3B0aW9ucy5jbHNdLmpvaW4oXCIgXCIpKSxzLm9wdGlvbnMuYW5pbWF0aW9uP2kuY3NzKHtvcGFjaXR5OjAsZGlzcGxheTpcImJsb2NrXCJ9KS5hZGRDbGFzcyhzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLmFuaW1hdGUoe29wYWNpdHk6MX0scGFyc2VJbnQocy5vcHRpb25zLmFuaW1hdGlvbiwxMCl8fDQwMCk6aS5zaG93KCkuYWRkQ2xhc3Mocy5vcHRpb25zLmFjdGl2ZUNsYXNzKSxvPSExLGU9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtzLmVsZW1lbnQuaXMoXCI6dmlzaWJsZVwiKXx8cy5oaWRlKCl9LDE1MCl9LHBhcnNlSW50KHRoaXMub3B0aW9ucy5kZWxheSwxMCl8fDApfX0saGlkZTpmdW5jdGlvbigpe2lmKCF0aGlzLmVsZW1lbnQuaXMoXCJpbnB1dFwiKXx8dGhpcy5lbGVtZW50WzBdIT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudClpZihvJiZjbGVhclRpbWVvdXQobyksZSYmY2xlYXJUaW1lb3V0KGUpLGkuc3RvcCgpLHRoaXMub3B0aW9ucy5hbmltYXRpb24pe3ZhciB0PXRoaXM7aS5mYWRlT3V0KHBhcnNlSW50KHRoaXMub3B0aW9ucy5hbmltYXRpb24sMTApfHw0MDAsZnVuY3Rpb24oKXtpLnJlbW92ZUNsYXNzKHQub3B0aW9ucy5hY3RpdmVDbGFzcyl9KX1lbHNlIGkuaGlkZSgpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyl9LGNvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aXB9LGNoZWNrQm91bmRhcnk6ZnVuY3Rpb24oaSxvLGUscyl7dmFyIG49XCJcIjtyZXR1cm4oMD5pfHxpLXQuJHdpbi5zY3JvbGxMZWZ0KCkrZT53aW5kb3cuaW5uZXJXaWR0aCkmJihuKz1cInhcIiksKDA+b3x8by10LiR3aW4uc2Nyb2xsVG9wKCkrcz53aW5kb3cuaW5uZXJIZWlnaHQpJiYobis9XCJ5XCIpLG59fSksdC50b29sdGlwfSk7Il19

/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.slice(0,n.length-1).concat(a),k=0;k<a.length;k+=1)if(m=a[k],"."===m)a.splice(k,1),k-=1;else if(".."===m){if(1===k&&(".."===a[2]||".."===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=v.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),n.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,"require"===k)u[n]=p.require(a);else if("exports"===k)u[n]=p.exports(a),s=!0;else if("module"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+" missing "+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if("string"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){if("string"!=typeof a)throw new Error("See almond README: incorrect module build, no module name");b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];"function"==typeof e&&"constructor"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice,c=b.call(arguments,1);this.listeners=this.listeners||{},null==c&&(c=[]),0===c.length&&c.push({}),c[0]._type=a,a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||"hidden"!==f&&"visible"!==f?"scroll"===e||"scroll"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" aria-live="assertive" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(".select2-results");c.append(a)},c.prototype.sort=function(a){var b=this.options.get("sorter");return b(a)},c.prototype.highlightFirstItem=function(){var a=this.$results.find(".select2-results__option[aria-selected]"),b=a.filter("[aria-selected=true]");b.length>0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";a(h);this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a("<ul></ul>",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):0>h-g&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var c=a(this),e=c.data("data");return"true"===c.attr("aria-selected")?void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{})):void d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class="select2-selection" role="combobox"  aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},e.prototype.selectionContainer=function(){return a("<span></span>")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},d.prototype.selectionContainer=function(){var b=a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.selectionContainer(),g=this.display(e,f);f.append(g),f.prop("title",e.title||e.text),f.data("data",e),b.push(f)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(a){function b(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return b.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},b.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},b.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger("unselect",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle",{})}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(".select2-selection__placeholder").length>0||0===c.length)){var d=a('<span class="select2-selection__clear">&times;</span>');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}});var f=document.documentMode,g=f&&11>=f;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){return g?void e.$selection.off("input.search input.searchcheck"):void e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","Ａ":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","Ｂ":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","Ｃ":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","Ｄ":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","Ǳ":"DZ","Ǆ":"DZ","ǲ":"Dz","ǅ":"Dz","Ⓔ":"E","Ｅ":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","Ｆ":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","Ｇ":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","Ｈ":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","Ｉ":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","Ｊ":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","Ｋ":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","Ｌ":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","Ǉ":"LJ","ǈ":"Lj","Ⓜ":"M","Ｍ":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","Ｎ":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","Ǌ":"NJ","ǋ":"Nj","Ⓞ":"O","Ｏ":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","Ｐ":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Ｑ":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","Ｒ":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","Ｓ":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","Ｔ":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","Ｕ":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","Ｖ":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","Ｗ":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","Ｘ":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Ｙ":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Ｚ":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","ａ":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","ｂ":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","ｃ":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","ｄ":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","ǳ":"dz","ǆ":"dz","ⓔ":"e","ｅ":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","ｆ":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","ｇ":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","ｈ":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","ｉ":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","ｊ":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","ｋ":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","ｌ":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","ǉ":"lj","ⓜ":"m","ｍ":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","ｎ":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ŉ":"n","ꞑ":"n","ꞥ":"n","ǌ":"nj","ⓞ":"o","ｏ":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","ｐ":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","ｑ":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","ｒ":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","ｓ":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","ｔ":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","ｕ":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","ｖ":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","ｗ":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","ｘ":"x","ẋ":"x","ẍ":"x","ⓨ":"y","ｙ":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","ｚ":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");
if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple"))return a.selected=!1,c(a.element).is("option")?(a.element.selected=!1,void this.$element.trigger("change")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})},d.prototype.bind=function(a,b){var c=this;this.container=a,a.on("select",function(a){c.select(a.data)}),a.on("unselect",function(a){c.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){c.removeData(this,"data")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement("optgroup"),b.label=a.text):(b=document.createElement("option"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,"data",e),d},d.prototype.item=function(a){var b={};if(b=c.data(a[0],"data"),null!=b)return b;if(a.is("option"))b={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){b={text:a.prop("label"),children:[],title:a.prop("title")};for(var d=a.children("option"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],"data",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get("matcher");return c(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h<e.length;h++){var i=e[h],j=this._normalizeItem(i),k=this.option(j);this.$element.append(k)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr("data-select2-tag",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(b){var c=(this._lastTag,this.$element.find("option[data-select2-tag]"));c.each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(b,c,d){function e(b){var c=g._normalizeItem(b),d=g.$element.find("option").filter(function(){return a(this).val()===c.id});if(!d.length){var e=g.option(c);e.attr("data-select2-tag",!0),g._removeOldTags(),g.addOptions([e])}f(c)}function f(a){g.trigger("select",{data:a})}var g=this;c.term=c.term||"";var h=this.tokenizer(c,this.options,e);h.term!==c.term&&(this.$search.length&&(this.$search.val(h.term),this.$search.focus()),c.term=h.term),b.call(this,c,d)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);null!=m?(e(m),g=g.substr(h+1)||"",h=0):h++}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",b.term.length<this.minimumInputLength?void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="select2-results__option select2-results__option--load-more"role="treeitem" aria-disabled="true"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id,h=this.$container.parents().filter(b.hasScroll);h.off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(a){d._handleSelectOnClose(a)})},a.prototype._handleSelectOnClose=function(a,b){if(b&&null!=b.originalSelect2Event){var c=b.originalSelect2Event;if("select"===c._type||"unselect"===c._type)return}var d=this.getHighlightedResults();if(!(d.length<1)){var e=d.data("data");null!=e.element&&e.element.selected||null==e.element&&e.selected||this.trigger("select",{data:e})}},a}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close",{originalEvent:c,originalSelect2Event:b})},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c="Please enter "+b+" or more characters";return c},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend(!0,{},this.defaults,l),null==l.dataAdapter){if(null!=l.ajax?l.dataAdapter=o:null!=l.data?l.dataAdapter=n:l.dataAdapter=m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+"en"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e<b.addedNodes.length;e++){var f=b.addedNodes[e];f.selected&&(c=!0)}else b.removedNodes&&b.removedNodes.length>0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null;
},e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});