/* react-onsenui v1.13.3 - 2023-06-20 */

(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('onsenui'), require('prop-types'), require('onsenui/esm/elements/ons-action-sheet'), require('react'), require('react-dom'), require('onsenui/esm/elements/ons-action-sheet-button'), require('onsenui/esm/elements/ons-alert-dialog'), require('onsenui/esm/elements/ons-alert-dialog-button'), require('onsenui/esm/elements/ons-back-button'), require('onsenui/esm/elements/ons-bottom-toolbar'), require('onsenui/esm/elements/ons-button'), require('onsenui/esm/elements/ons-card'), require('onsenui/esm/elements/ons-carousel'), require('onsenui/esm/elements/ons-carousel-item'), require('onsenui/esm/elements/ons-checkbox'), require('onsenui/esm/elements/ons-col'), require('onsenui/esm/elements/ons-dialog'), require('onsenui/esm/elements/ons-fab'), require('onsenui/esm/elements/ons-gesture-detector'), require('onsenui/esm/elements/ons-icon'), require('onsenui/esm/elements/ons-input'), require('onsenui/esm/elements/ons-lazy-repeat'), require('onsenui/esm/elements/ons-list'), require('onsenui/esm/elements/ons-list-header'), require('onsenui/esm/elements/ons-list-item'), require('onsenui/esm/elements/ons-list-title'), require('onsenui/esm/elements/ons-navigator'), require('onsenui/esm/elements/ons-modal'), require('onsenui/esm/elements/ons-page'), require('onsenui/esm/elements/ons-popover'), require('onsenui/esm/elements/ons-progress-bar'), require('onsenui/esm/elements/ons-progress-circular'), require('onsenui/esm/elements/ons-pull-hook'), require('onsenui/esm/elements/ons-radio'), require('onsenui/esm/elements/ons-range'), require('onsenui/esm/elements/ons-ripple'), require('onsenui/esm/elements/ons-row'), require('onsenui/esm/elements/ons-search-input'), require('onsenui/esm/elements/ons-segment'), require('onsenui/esm/elements/ons-select'), require('onsenui/esm/elements/ons-speed-dial'), require('onsenui/esm/elements/ons-speed-dial-item'), require('onsenui/esm/elements/ons-splitter'), require('onsenui/esm/elements/ons-splitter-content'), require('onsenui/esm/elements/ons-splitter-mask'), require('onsenui/esm/elements/ons-splitter-side'), require('onsenui/esm/elements/ons-switch'), require('onsenui/esm/elements/ons-tab'), require('onsenui/esm/elements/ons-tabbar'), require('onsenui/esm/elements/ons-toast'), require('onsenui/esm/elements/ons-toolbar'), require('onsenui/esm/elements/ons-toolbar-button')) :
  typeof define === 'function' && define.amd ? define(['exports', 'onsenui', 'prop-types', 'onsenui/esm/elements/ons-action-sheet', 'react', 'react-dom', 'onsenui/esm/elements/ons-action-sheet-button', 'onsenui/esm/elements/ons-alert-dialog', 'onsenui/esm/elements/ons-alert-dialog-button', 'onsenui/esm/elements/ons-back-button', 'onsenui/esm/elements/ons-bottom-toolbar', 'onsenui/esm/elements/ons-button', 'onsenui/esm/elements/ons-card', 'onsenui/esm/elements/ons-carousel', 'onsenui/esm/elements/ons-carousel-item', 'onsenui/esm/elements/ons-checkbox', 'onsenui/esm/elements/ons-col', 'onsenui/esm/elements/ons-dialog', 'onsenui/esm/elements/ons-fab', 'onsenui/esm/elements/ons-gesture-detector', 'onsenui/esm/elements/ons-icon', 'onsenui/esm/elements/ons-input', 'onsenui/esm/elements/ons-lazy-repeat', 'onsenui/esm/elements/ons-list', 'onsenui/esm/elements/ons-list-header', 'onsenui/esm/elements/ons-list-item', 'onsenui/esm/elements/ons-list-title', 'onsenui/esm/elements/ons-navigator', 'onsenui/esm/elements/ons-modal', 'onsenui/esm/elements/ons-page', 'onsenui/esm/elements/ons-popover', 'onsenui/esm/elements/ons-progress-bar', 'onsenui/esm/elements/ons-progress-circular', 'onsenui/esm/elements/ons-pull-hook', 'onsenui/esm/elements/ons-radio', 'onsenui/esm/elements/ons-range', 'onsenui/esm/elements/ons-ripple', 'onsenui/esm/elements/ons-row', 'onsenui/esm/elements/ons-search-input', 'onsenui/esm/elements/ons-segment', 'onsenui/esm/elements/ons-select', 'onsenui/esm/elements/ons-speed-dial', 'onsenui/esm/elements/ons-speed-dial-item', 'onsenui/esm/elements/ons-splitter', 'onsenui/esm/elements/ons-splitter-content', 'onsenui/esm/elements/ons-splitter-mask', 'onsenui/esm/elements/ons-splitter-side', 'onsenui/esm/elements/ons-switch', 'onsenui/esm/elements/ons-tab', 'onsenui/esm/elements/ons-tabbar', 'onsenui/esm/elements/ons-toast', 'onsenui/esm/elements/ons-toolbar', 'onsenui/esm/elements/ons-toolbar-button'], factory) :
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Ons = {}, global.ons, global.PropTypes, global.ons.elements.ActionSheet, global.React, global.ReactDOM));
})(this, (function (exports, onsenui, PropTypes, onsActionSheet, React, ReactDOM) { 'use strict';

  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }

  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
  var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM);

  function _extends() {
    _extends = Object.assign ? Object.assign.bind() : function (target) {
      for (var i = 1; i < arguments.length; i++) {
        var source = arguments[i];
        for (var key in source) {
          if (Object.prototype.hasOwnProperty.call(source, key)) {
            target[key] = source[key];
          }
        }
      }
      return target;
    };
    return _extends.apply(this, arguments);
  }

  const kebabize = camelString => camelString.replace(/([a-zA-Z])([A-Z])/g, '$1-$2').toLowerCase();
  const addDeprecated = (props, deprecated) => {
    const propsCopy = {
      ...props
    };
    const nameMap = {
      className: 'class',
      ...deprecated
    };

    // eslint-disable-next-line no-unused-vars
    for (const [oldName, newName] of Object.entries(nameMap)) {
      if (propsCopy[newName] === undefined && propsCopy[oldName] !== undefined) {
        propsCopy[newName] = propsCopy[oldName];
        delete propsCopy[oldName];
      }
    }
    return propsCopy;
  };
  function useCustomElementListener(ref, prop, handler) {
    const event = prop.slice(2).toLowerCase();
    React.useEffect(() => {
      const current = ref.current;
      current.addEventListener(event, handler);
      return function cleanup() {
        current.removeEventListener(event, handler);
      };
    }, [ref, handler]);
  }
  function useCustomElement(props) {
    let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
    let ref = arguments.length > 2 ? arguments[2] : undefined;
    const notAttributes = options.notAttributes || [];
    const deprecated = options.deprecated || {};
    const properties = {};
    // eslint-disable-next-line no-unused-vars
    for (const [prop, value] of Object.entries(addDeprecated(props, deprecated))) {
      const jsName = kebabize(prop);
      if (notAttributes.includes(prop)) {
        React.useEffect(() => {
          ref.current[prop] = value;
        });
      } else if (/^on[A-Z]/.test(prop)) {
        useCustomElementListener(ref, prop, value);
      } else if (typeof value === 'boolean') {
        properties[jsName] = value ? '' : null;
      } else if (typeof value === 'object' && value !== null) {
        properties[jsName] = JSON.stringify(value);
      } else {
        properties[jsName] = value;
      }
    }
    return {
      properties
    };
  }
  function onsCustomElement(WrappedComponent, options) {
    return /*#__PURE__*/React__default["default"].forwardRef((props, _ref) => {
      const ref = _ref || React.useRef();
      const {
        style,
        children,
        ...rest
      } = props;
      const {
        properties
      } = useCustomElement(rest, options, ref);
      return /*#__PURE__*/React__default["default"].createElement(WrappedComponent, _extends({
        ref: ref,
        style: style
      }, properties), children);
    });
  }

  class Portal extends React__default["default"].Component {
    constructor(props) {
      super(props);
      this.container = document.createElement('div');
    }
    componentDidMount() {
      document.body.appendChild(this.container);
    }
    componentWillUnmount() {
      document.body.removeChild(this.container);
    }
    render() {
      return /*#__PURE__*/ReactDOM__default["default"].createPortal(this.props.children, this.container);
    }
  }
  const baseDialog = DialogComponent => /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
    // visible prop should be applied last since it depends on animation and
    // maskColor props being set first
    const {
      visible,
      ...rest
    } = props;
    return /*#__PURE__*/React__default["default"].createElement(Portal, null, /*#__PURE__*/React__default["default"].createElement(DialogComponent, _extends({}, rest, {
      visible: visible,
      ref: ref
    }), props.children));
  });

  const propTypes$7 = {
    /**
     * @name title
     * @type string
     * @required false
     * @description
     *  [en]
     *  Optional title of the action sheet. A new element will be created containing this string.
     *  [/en]
     *  [ja][/ja]
     */
    title: PropTypes__default["default"].string,
    /**
     * @name onDialogCancel
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called only if cancelable is true. It will be called after tapping the background or by pressing the back button on Android devices.
     *  [/en]
     *  [ja][/ja]
     */
    onDialogCancel: PropTypes__default["default"].func,
    /**
     * @name visible
     * @type bool
     * @description
     *  [en]
     *  Indicates whether the dialog is open and shown.
     *  [/en]
     *  [ja][/ja]
     */
    visible: PropTypes__default["default"].bool,
    /**
     * @name cancelable
     * @type bool
     * @required false
     * @description
     *  [en]
     *  Specifies whether the dialog is cancelable or not.
     *  A cancelable dialog will call onCancel  when tapping the background or or  pressing the back button on Android devices
     *  [/en]
     *  [ja][/ja]
     */
    cancelable: PropTypes__default["default"].bool,
    /**
     * @name disabled
     * @type bool
     * @required false
     * @description
     *  [en]
     *  Specifies whether the dialog is disabled.
     *  [/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name onCancel
     * @type function
     * @required false
     * @description
     *  [en]
     *  DEPRECATED! Use `onDialogCancel` instead.
     *  [/en]
     *  [ja][/ja]
     */
    onCancel: PropTypes__default["default"].func,
    /**
     * @name isOpen
     * @type bool
     * @description
     *  [en]
     *  DEPRECATED! Use `visible` instead.
     *  [/en]
     *  [ja][/ja]
     */
    isOpen: PropTypes__default["default"].bool,
    /**
     * @name isCancelable
     * @type bool
     * @required false
     * @description
     *  [en]
     *  DEPRECATED! Use `cancelable` instead.
     *  [/en]
     *  [ja][/ja]
     */
    isCancelable: PropTypes__default["default"].bool,
    /**
     * @name isDisabled
     * @type bool
     * @required false
     * @description
     *  [en]
     *  DEPRECATED! Use `disabled` instead.
     *  [/en]
     *  [ja][/ja]
     */
    isDisabled: PropTypes__default["default"].bool,
    /**
     * @name animation
     * @type string
     * @required false
     * @description
     *  [en]
     *  The animation used when showing and hiding the dialog. Can be either `"none"` or `"default"`.
     *  [/en]
     *  [ja][/ja]
     */
    animation: PropTypes__default["default"].string,
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the dialog.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name maskColor
     * @type string
     * @required false
     * @description
     *  [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)"[/en]
     *  [ja][/ja]
     */
    maskColor: PropTypes__default["default"].string,
    /**
     * @name animationOptions
     * @type object
     * @required false
     * @description
     *  [en]Specify the animation's duration, delay and timing. E.g.  `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
     *  [ja][/ja]
     */
    animationOptions: PropTypes__default["default"].object,
    /**
     * @name onPreShow
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called just before the action sheet is displayed.
     *  [/en]
     *  [ja][/ja]
     */
    onPreShow: PropTypes__default["default"].func,
    /**
     * @name onPostShow
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called just after the action sheet is displayed.
     *  [/en]
     *  [ja][/ja]
     */
    onPostShow: PropTypes__default["default"].func,
    /**
     * @name onPreHide
     * @type function
     * @required false
     * @description
     *  [en]Called just before the action sheet is hidden.[/en]
     *  [ja][/ja]
     */
    onPreHide: PropTypes__default["default"].func,
    /**
     * @name onPostHide
     * @type function
     * @required false
     * @description
     *  [en]Called just after the action sheet is hidden.[/en]
     *  [ja][/ja]
     */
    onPostHide: PropTypes__default["default"].func,
    /**
     * @name onDeviceBackButton
     * @type function
     * @required false
     * @description
     *  [en]
     *  Custom handler for device back button.
     *  [/en]
     *  [ja][/ja]
     */
    onDeviceBackButton: PropTypes__default["default"].func
  };
  const deprecated$a = {
    onCancel: 'onDialogCancel',
    isOpen: 'visible',
    isDisabled: 'disabled',
    isCancelable: 'cancelable'
  };
  const notAttributes$d = ['onDeviceBackButton'];

  /**
   * @original ons-action-sheet
   * @category dialog
   * @tutorial react/Reference/action-sheet
   * @description
   * [en]
   *  Action/bottom sheet that is displayed on top of current screen.
   *  The action sheet is useful for displaying a list of options and asking the user to make a decision. An ActionSheetButton component is provided for this purpose, although it can contain any type of content.
   *  It will automatically be displayed as Material Design (bottom sheet) when running on an Android device.
   * [/en]
   * [ja][/ja]
   */
  const ActionSheet = onsCustomElement(baseDialog('ons-action-sheet'), {
    propTypes: propTypes$7,
    deprecated: deprecated$a,
    notAttributes: notAttributes$d
  });
  ActionSheet.propTypes = propTypes$7;

  const propTypes$6 = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the action sheet button.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name icon
     * @type string
     * @description
     *  [en]Creates an `Icon` component with this string. Only visible on Android.[/en]
     *  [ja][/ja]
     */
    icon: PropTypes__default["default"].string,
    /**
     * @name onClick
     * @type function
     * @description
     *  [en]This function will be called when the button is clicked.[/en]
     *  [ja][/ja]
     */
    onClick: PropTypes__default["default"].func
  };

  /**
   * @original ons-action-sheet-button
   * @category dialog
   * @tutorial react/Reference/action-sheet
   * @description
   * [en]Component that represent each button of the action sheet.[/en]
   * [ja][/ja]
   */
  const ActionSheetButton = onsCustomElement('ons-action-sheet-button', {
    propTypes: propTypes$6
  });
  ActionSheetButton.propTypes = propTypes$6;

  const deprecated$9 = {
    onCancel: 'onDialogCancel',
    isOpen: 'visible',
    isDisabled: 'disabled',
    isCancelable: 'cancelable'
  };
  const notAttributes$c = ['onDeviceBackButton'];

  /**
   * @original ons-alert-dialog
   * @category dialog
   * @tutorial react/Reference/alert-dialog
   * @description
   * [en]
   *   Alert dialog that is displayed on top of the current screen. Useful for displaying questions, warnings or error messages to the user. The title, content and buttons can be easily customized and it will automatically switch style based on the platform.
   * [/en]
   * [ja][/ja]
   * @example
     <AlertDialog isOpen={this.state.isOpen} onCancel={this.handleCancel.bind(this)} cancelable>
       <div className="alert-dialog-title">Warning!</div>
       <div className="alert-dialog-content">
         An error has occurred!
       </div>
       <div className="alert-dialog-footer">
         <Button onClick={this.handleCancel.bind(this)} className="alert-dialog-button">
           Cancel
         </Button>
         <Button onClick={this.handleCancel.bind(this)} className="alert-dialog-button">
           Ok
         </Button>
       </div>
     </AlertDialog>
   */
  const AlertDialog = onsCustomElement(baseDialog('ons-alert-dialog'), {
    deprecated: deprecated$9,
    notAttributes: notAttributes$c
  });
  AlertDialog.propTypes = {
    /**
     * @name visible
     * @type bool
     * @description
     *  [en]
     *  Indicates whether the dialog is open and shown.
     *  [/en]
     *  [ja][/ja]
     */
    visible: PropTypes__default["default"].bool,
    /**
     * @name disabled
     * @type bool
     * @required false
     * @description
     *  [en]
     *  Specifies whether the dialog is disabled.
     *  [/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name cancelable
     * @type bool
     * @required false
     * @description
     *  [en]
     *  Specifies whether the dialog is cancelable or not.
     *  A cancelable dialog will call `onDialogCancel` when tapping the background or pressing the back button on Android devices.
     *  [/en]
     *  [ja][/ja]
     */
    cancelable: PropTypes__default["default"].bool,
    /**
     * @name onDialogCancel
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called only if `cancelable` is true. It will be called after tapping the background or by pressing the back button on Android devices.
     *  [/en]
     *  [ja][/ja]
     */
    onDialogCancel: PropTypes__default["default"].func,
    /**
     * @name onCancel
     * @type function
     * @required false
     * @description
     *  [en]
     *  DEPRECATED! Use `onDialogCancel` instead.
     *  [/en]
     *  [ja][/ja]
     */
    onCancel: PropTypes__default["default"].func,
    /**
     * @name isOpen
     * @type bool
     * @description
     *  [en]
     *  DEPRECATED! Use `visible` instead.
     *  [/en]
     *  [ja][/ja]
     */
    isOpen: PropTypes__default["default"].bool,
    /**
     * @name isCancelable
     * @type bool
     * @required false
     * @description
     *  [en]
     *  DEPRECATED! Use `cancelable` instead.
     *  [/en]
     *  [ja][/ja]
     */
    isCancelable: PropTypes__default["default"].bool,
    /**
     * @name isDisabled
     * @type bool
     * @required false
     * @description
     *  [en]
     *  DEPRECATED! Use `disabled` instead.
     *  [/en]
     *  [ja][/ja]
     */
    isDisabled: PropTypes__default["default"].bool,
    /**
     * @name animation
     * @type string
     * @required false
     * @description
     *  [en]
     *  The animation used when showing and hiding the dialog. Can be either `"none"` or `"default"`.
     *  [/en]
     *  [ja][/ja]
     */
    animation: PropTypes__default["default"].string,
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the dialog.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name maskColor
     * @type string
     * @required false
     * @description
     *  [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)"[/en]
     *  [ja][/ja]
     */
    maskColor: PropTypes__default["default"].string,
    /**
     * @name animationOptions
     * @type object
     * @required false
     * @description
     *  [en]Specify the animation's duration, delay and timing. E.g.  `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
     *  [ja][/ja]
     */
    animationOptions: PropTypes__default["default"].object,
    /**
     * @name onPreShow
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called just before the alert dialog is displayed.
     *  [/en]
     *  [ja][/ja]
     */
    onPreShow: PropTypes__default["default"].func,
    /**
     * @name onPostShow
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called just after the alert dialog is displayed.
     *  [/en]
     *  [ja][/ja]
     */
    onPostShow: PropTypes__default["default"].func,
    /**
     * @name onPreHide
     * @type function
     * @required false
     * @description
     *  [en]Called just before the alert dialog is hidden.[/en]
     *  [ja][/ja]
     */
    onPreHide: PropTypes__default["default"].func,
    /**
     * @name onPostHide
     * @type function
     * @required false
     * @description
     *  [en]Called just after the alert dialog is hidden.[/en]
     *  [ja][/ja]
     */
    onPostHide: PropTypes__default["default"].func,
    /**
     * @name onDeviceBackButton
     * @type function
     * @required false
     * @description
     *  [en]
     *  Custom handler for device back button.
     *  [/en]
     *  [ja][/ja]
     */
    onDeviceBackButton: PropTypes__default["default"].func
  };

  /**
   * @original ons-alert-dialog-button
   * @category dialog
   * @tutorial react/Reference/dialog
   * @description
   * [en]Component that represent each button of the alert dialog.[/en]
   * [ja][/ja]
   */
  const AlertDialogButton = onsCustomElement('ons-alert-dialog-button');
  AlertDialogButton.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the alert dialog button.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en]
     *  Specifies whether the button is disabled.
     *  [/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name onClick
     * @type function
     * @description
     *  [en]This function will be called when the button is clicked.[/en]
     *  [ja][/ja]
     */
    onClick: PropTypes__default["default"].func
  };

  const notAttributes$b = ['options'];

  /**
   * @original ons-back-button
   * @category navigation
   * @tutorial react/Reference/back-button
   * @description
   * [en]
   *   Back button component for Toolbar. It enables to automatically to pop the top page of the navigator. When only presented with one page, the button is hidden automatically.
   *
   *   The default behavior can be overridden using the `onClick` prop.
   * [/en]
   * [ja][/ja]
   * @example
   * <Toolbar modifier={this.props.modifier} >
        <div className="left"><BackButton modifier={this.props.modifier}>Back</BackButton></div>
        <div className="center">{this.props.title}</div>
     </Toolbar>
   */
  const BackButton = onsCustomElement('ons-back-button', {
    notAttributes: notAttributes$b
  });
  BackButton.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the back button.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name onClick
     * @type function
     * @description
     *  [en]This function will be called when the button is clicked. To prevent the default click behaviour, call `event.preventDefault()`.[/en]
     *  [ja][/ja]
     */
    onClick: PropTypes__default["default"].func,
    /**
     * @name options
     * @type object
     * @description
     *  [en]Specifies the animation, animationOptions, and callback.[/en]
     *  [ja][/ja]
     */
    options: PropTypes__default["default"].shape({
      animation: PropTypes__default["default"].string,
      animationOptions: PropTypes__default["default"].object,
      callback: PropTypes__default["default"].func
    })
  };

  const propTypes$5 = {
    /**
     * @name modifier
     * @type string
     * @description
     *  [en]Specify modifier name to specify custom styles. Optional.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string
  };

  /**
   * @original ons-bottom-toolbar
   * @category page
   * @description
   * [en]Toolbar component that is positioned at the bottom of the page.[/en]
   * [ja][/ja]
   * @example
   * <BottomToolbar modifier="material"> Content </BottomToolbar>
   */
  const BottomToolbar = onsCustomElement('ons-bottom-toolbar', {
    propTypes: propTypes$5
  });
  BottomToolbar.propTypes = propTypes$5;

  const propTypes$4 = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the button.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en]
     *  Specifies whether the button is disabled.
     *  [/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name ripple
     * @type bool
     * @description
     *  [en]
     *  Specifies whether the button has a ripple effect.
     *  [/en]
     *  [ja][/ja]
     */
    ripple: PropTypes__default["default"].bool,
    /**
     * @name onClick
     * @type function
     * @description
     *  [en] This function will be called when the button is clicked. [/en]
     *  [ja][/ja]
     */
    onClick: PropTypes__default["default"].func
  };

  /**
   * @original ons-button
   * @category form
   * @tutorial react/Reference/button
   * @description
   * [en] Button component. If you want to place a button in a toolbar, use `ToolbarButton` or `BackButton` instead. Will automatically display as a Material Design button with a ripple effect on Android.
   [/en]
   * [ja][/ja]
   * @example
   * <Button modifier="large--cta">
   *   Tap Me
   * </Button>
   */
  const Button = onsCustomElement('ons-button', {
    propTypes: propTypes$4
  });
  Button.propTypes = propTypes$4;

  /**
   * @original ons-card
   * @category visual
   * @tutorial react/Reference/visual
   * @description
   * [en]Card component that can be used to display content.[/en]
   * [ja][/ja]
   * @example
   *
  <Card>
    <p>Some content</p>
  </Card>
   */
  const Card = onsCustomElement('ons-card');
  Card.propTypes = {
    /**
     * @name modifier
     * @type string
     * @description
     *  [en]
     *  Specify modifier name to specify custom styles. Optional.
     *  [/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string
  };

  const deprecated$8 = {
    index: 'activeIndex'
  };
  const Element$9 = onsCustomElement('ons-carousel', {
    deprecated: deprecated$8
  });

  /**
   * @original ons-carousel
   * @category carousel
   * @tutorial react/Reference/carousel
   * @description
   * [en] Carousel component. A carousel can be used to display several items in the same space.
   *     The component supports displaying content both horizontally and vertically. The user can scroll through the items by dragging and it can also be controller programmatically.
   [/en]
   * [ja][/ja]
   * @example
   *    <Carousel
            onPostChange={() => console.log('onPostChange')}
            onOverscroll={() => console.log('onOverscroll')}
            onRefresh={() => console.log('onRefresh')}
            ref={(carousel) => { this.carousel = carousel; }}
            swipeable
            overscrollable
            autoScroll
            fullscreen
            autoScrollRatio={0.2}
        >
            <CarouselItem style={{backgroundColor: 'gray'}}>
              <div className='item-label'>GRAY</div>
            </CarouselItem>
            <CarouselItem style={{backgroundColor: '#085078'}}>
              <div className='item-label'>BLUE</div>
            </CarouselItem>
          </Carousel>

   */
  const Carousel = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
    const {
      itemWidth,
      itemHeight,
      ...rest
    } = props;

    // string values for itemWidth and itemHeight are deprecated but handle them
    // safely anyway to avoid breaking user code
    const stringify = x => typeof x === 'number' ? `${x}px` : x;
    const realItemWidth = stringify(itemWidth);
    const realItemHeight = stringify(itemHeight);
    return /*#__PURE__*/React__default["default"].createElement(Element$9, _extends({
      itemWidth: realItemWidth,
      itemHeight: realItemHeight,
      ref: ref
    }, rest), props.children);
  });
  Carousel.propTypes = {
    /**
     * @name direction
     * @type string
     * @required false
     * @description
     *  [en]The direction of the carousel. Can be either "horizontal" or "vertical". Default is "horizontal".[/en]
     *  [ja][/ja]
     */
    direction: PropTypes__default["default"].oneOf(['horizontal', 'vertical']),
    /**
     * @name fullscreen
     * @type bool
     * @description
     *  [en]If true, the carousel will cover the whole screen.[/en]
     *  [ja][/ja]
     */
    fullscreen: PropTypes__default["default"].bool,
    /**
     * @name overscrollable
     * @type bool
     * @description
     *  [en]If true, the carousel will be scrollable over the edge. It will bounce back when released.[/en]
     *  [ja][/ja]
     */
    overscrollable: PropTypes__default["default"].bool,
    /**
     * @name centered
     * @type bool
     * @description
     *  [en]If true, the carousel then the selected item will be in the center of the carousel instead of the beginning. Useful only when the items are smaller than the carousel.[/en]
     *  [ja][/ja]
     */
    centered: PropTypes__default["default"].bool,
    /**
     * @name itemWidth
     * @type string
     * @description
     *  [en]ons-carousel-item's width. Only works when the direction is set to "horizontal". Can be in pixels or a percentage.[/en]
     *  [ja][/ja]
     */
    itemWidth: PropTypes__default["default"].string,
    /**
     * @name itemHeight
     * @type string
     * @description
     *  [en]ons-carousel-item's height. Only works when the direction is set to "vertical". Can be in pixels or a percentage.[/en]
     *  [ja][/ja]
     */
    itemHeight: PropTypes__default["default"].string,
    /**
     * @name autoScroll
     * @type bool
     * @description
     *  [en]If true, the carousel will be automatically scrolled to the closest item border when released.[/en]
     *  [ja][/ja]
     */
    autoScroll: PropTypes__default["default"].bool,
    /**
     * @name autoScrollRatio
     * @type number
     * @description
     *  [en]A number between 0.0 and 1.0 that specifies how much the user must drag the carousel in order for it to auto scroll to the next item.[/en]
     *  [ja][/ja]
     */
    autoScrollRatio: PropTypes__default["default"].number,
    /**
     * @name swipeable
     * @type bool
     * @description
     *  [en]If true, the carousel can be scrolled by drag or swipe.[/en]
     *  [ja][/ja]
     */
    swipeable: PropTypes__default["default"].bool,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en]If true, the carousel will be disabled.[/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name activeIndex
     * @type number
     * @description
     *  [en]Specify the index of the ons-carousel-item to show. Default is 0.[/en]
     *  [ja][/ja]
     */
    activeIndex: PropTypes__default["default"].number,
    /**
     * @name index
     * @type number
     * @description
     *  [en]DEPRECATED! Use `activeIndex` instead.[/en]
     *  [ja][/ja]
     */
    index: PropTypes__default["default"].number,
    /**
     * @name autoRefresh
     * @type bool
     * @description
     *  [en]When this attribute is set the carousel will automatically refresh when the number of child nodes change.[/en]
     *  [ja][/ja]
     */
    autoRefresh: PropTypes__default["default"].bool,
    /**
     * @name onPreChange
     * @type function
     * @description
     *  [en]Called just before the current carousel item changes.[/en]
     *  [ja][/ja]
     */
    onPreChange: PropTypes__default["default"].func,
    /**
     * @name onPostChange
     * @type function
     * @description
     *  [en]Called just after the current carousel item has changed.[/en]
     *  [ja][/ja]
     */
    onPostChange: PropTypes__default["default"].func,
    /**
     * @name onRefresh
     * @type function
     * @description
     *  [en]Called when the carousel has been refreshed. [/en]
     *  [ja][/ja]
     */
    onRefresh: PropTypes__default["default"].func,
    /**
     * @name onOverscroll
     * @type function
     * @description
     *  [en]Called when the carousel has been overscrolled. [/en]
     *  [ja][/ja]
     */
    onOverscroll: PropTypes__default["default"].func,
    /**
     * @name animation
     * @type string
     * @required false
     * @description
     *  [en]If this prop is set to "none" the transitions will not be animated.[/en]
     *  [ja][/ja]
     */
    animation: PropTypes__default["default"].string,
    /**
     * @name animationOptions
     * @type object
     * @required false
     * @description
     *  [en]Specify the animation's duration, delay and timing. E.g.  `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
     *  [ja][/ja]
     */
    animationOptions: PropTypes__default["default"].object,
    /**
     * @name onSwipe
     * @type function
     * @description
     *  [en]Hook called whenever the user slides the carousel. It gets a decimal index and an animationOptions object as arguments.[/en]
     *  [ja][/ja]
     */
    onSwipe: PropTypes__default["default"].func
  };

  /**
   * @original ons-carousel-item
   * @category carousel
   * @tutorial react/Reference/carousel
   * @description
   * [en] Carousel item component. Used as a child of the `<ons-carousel>` element.
   [/en]
   * [ja][/ja]
   * @example
  *  <Carousel swipeable overscrollable autoScroll fullscreen >
       <CarouselItem style={{backgroundColor: 'gray'}}>
         <div className='item-label'>GRAY</div>
       </CarouselItem>
       <CarouselItem style={{backgroundColor: '#085078'}}>
         <div className='item-label'>BLUE</div>
       </CarouselItem>
     </Carousel>
   */
  const CarouselItem = onsCustomElement('ons-carousel-item');
  CarouselItem.propTypes = {
    /**
     * @name modifier
     * @type string
     * @description
     *  [en]
     *  Specify modifier name to specify custom styles. Optional.
     *  [/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string
  };

  // For a prop with name `defaultProp`, sets the component's `prop` prop to the
  // value of `defaultProp` when the component mounts only.
  //
  // For example, Input has a defaulttValue prop that should set the inner input's
  // value when the component mounted and do nothing afterwards.
  const oneTimeProp = (WrappedComponent, defaultProp, prop) => {
    class OneTimeProp extends React__default["default"].Component {
      constructor(props) {
        super(props);
        this.ref = /*#__PURE__*/React__default["default"].createRef();
      }
      componentDidMount() {
        const value = this.props[defaultProp];
        if (value) {
          this.ref.current[prop] = value;
        }
      }
      render() {
        const {
          innerRef,
          ...rest
        } = this.props;
        delete rest[defaultProp];
        if (innerRef && innerRef !== this.ref) {
          this.ref = innerRef;
        }
        return /*#__PURE__*/React__default["default"].createElement(WrappedComponent, _extends({
          ref: this.ref
        }, rest), this.props.children);
      }
    }
    return /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(OneTimeProp, _extends({
      innerRef: ref
    }, props), props.children));
  };

  const INPUT_PROPS = {
    autoCapitalize: 'autocapitalize',
    autoComplete: 'autocomplete',
    autoCorrect: 'autocorrect',
    autoFocus: 'autofocus',
    inputMode: 'inputmode',
    maxLength: 'maxlength',
    minLength: 'minlength',
    readOnly: 'readonly',
    spellCheck: 'spellcheck'
  };

  const nameMap$6 = {
    ...INPUT_PROPS
  };
  const withDefaultChecked$2 = component => oneTimeProp(component, 'defaultChecked', 'checked');

  /**
   * @original ons-checkbox
   * @category form
   * @tutorial react/Reference/checkbox
   * @description
   * [en]
   *  A checkbox element. The component will automatically render as a Material Design checkbox on Android devices.
   *
   *  Most attributes that can be used for a normal `<input type="checkbox">` element can also be used on the `<Checkbox>` component.
   * [/en]
   * [ja][/ja]
   * @example
   * <Checkbox
   *   onChange={event => { this.setState({checked: event.target.checked})} }
   *   modifier='material' />
   */
  const Checkbox = withDefaultChecked$2(onsCustomElement('ons-checkbox', {
    deprecated: nameMap$6
  }));
  Checkbox.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the checkbox.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en]
     *  Specifies whether the checkbox is disabled.
     *  [/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name onChange
     * @type function
     * @description
     *  [en]Called when the inner checkbox fires a `change` event.[/en]
     *  [ja][/ja]
     */
    onChange: PropTypes__default["default"].func,
    /**
     * @name onInput
     * @type function
     * @description
     *  [en]Called when the inner checkbox fires an `input` event.[/en]
     *  [ja][/ja]
     */
    onInput: PropTypes__default["default"].func,
    /**
     * @name value
     * @type string
     * @description
     *  [en] Value of the checkbox.[/en]
     *  [ja][/ja]
     */
    value: PropTypes__default["default"].oneOfType([PropTypes__default["default"].string, PropTypes__default["default"].instanceOf(Date)]),
    /**
     * @name checked
     * @type boolean
     * @description
     *  [en]Controls the state of the checkbox (controlled).[/en]
     *  [ja][/ja]
     */
    checked: PropTypes__default["default"].bool,
    /**
     * @name defaultChecked
     * @type boolean
     * @description
     *  [en]Defined the state of the checkbox at first render for uncontrolled inputs.[/en]
     *  [ja][/ja]
     */
    defaultChecked: PropTypes__default["default"].bool,
    /**
     * @name inputId
     * @type string
     * @description
     *  [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using <label for="..."> elements.[/en]
     *  [ja][/ja]
     */
    inputId: PropTypes__default["default"].string
  };

  /**
   * @original ons-col
   * @category grid
   * @description
   * [en]
   * Represents a column in the grid system. Use with `<ons-row>` to layout components.
   * [/en]
   * [ja][/ja]
   * <Row>
   *   <Col width={50}>
    *   <ons-icon icon="fa-twitter"></ons-icon>
   *   </Col>
   *   <Col>Text</Col>
   * </Row>
   */
  const Col = onsCustomElement('ons-col');
  Col.propTypes = {
    /**
    * @name verticalAlign
    * @type {String}
    * @description
    *   [en]Short hand attribute for aligning vertically. Valid values are top, bottom, and center.[/en]
    *   [ja][/ja]
    */
    verticalAlign: PropTypes__default["default"].oneOf(['top', 'bottom', 'center']),
    /**
    * @name width
    * @type {String}
    * @description
    *   [en]The width of the column. Valid values are css width values ("10%", 50).[/en]
    *   [ja][/ja]
    */
    width: PropTypes__default["default"].oneOfType([PropTypes__default["default"].number, PropTypes__default["default"].string])
  };

  const deprecated$7 = {
    onCancel: 'onDialogCancel',
    isOpen: 'visible',
    isDisabled: 'disabled',
    isCancelable: 'cancelable'
  };
  const notAttributes$a = ['onDeviceBackButton'];

  /**
   * @original ons-dialog
   * @category dialog
   * @tutorial react/Reference/dialog
   * @description
   * [en]  Dialog that is displayed on top of current screen. As opposed to the AlertDialog element, this component can contain any kind of content.  The dialog is useful for displaying menus, additional information or to ask the user to make a decision.  It will automatically be displayed as Material Design when running on an Android device.
   [/en]
   * [ja][/ja]
   * @example
     <Dialog onCancel={this.onCancel}
       isOpen={this.props.isOpen}
       style={{height: 250}}  cancelable>
       <Page>
         Page Content
       </Page>
      </Dialog>

   */
  const Dialog = onsCustomElement(baseDialog('ons-dialog'), {
    deprecated: deprecated$7,
    notAttributes: notAttributes$a
  });
  Dialog.propTypes = {
    /**
     * @name visible
     * @type bool
     * @description
     *  [en]
     *  Indicates whether the dialog is open and shown.
     *  [/en]
     *  [ja][/ja]
     */
    visible: PropTypes__default["default"].bool,
    /**
     * @name disabled
     * @type bool
     * @required false
     * @description
     *  [en]
     *  Specifies whether the dialog is disabled.
     *  [/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name cancelable
     * @type bool
     * @required false
     * @description
     *  [en]
     *  Specifies whether the dialog is cancelable or not.
     *  A cancelable dialog will call `onDialogCancel` when tapping the background or pressing the back button on Android devices.
     *  [/en]
     *  [ja][/ja]
     */
    cancelable: PropTypes__default["default"].bool,
    /**
     * @name onDialogCancel
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called only if `cancelable` is true. It will be called after tapping the background or by pressing the back button on Android devices.
     *  [/en]
     *  [ja][/ja]
     */
    onDialogCancel: PropTypes__default["default"].func,
    /**
     * @name onCancel
     * @type function
     * @required false
     * @description
     *  [en]
     *  DEPRECATED! Use `onDialogCancel` instead.
     *  [/en]
     *  [ja][/ja]
     */
    onCancel: PropTypes__default["default"].func,
    /**
     * @name isOpen
     * @type bool
     * @description
     *  [en]
     *  DEPRECATED! Use `visible` instead.
     *  [/en]
     *  [ja][/ja]
     */
    isOpen: PropTypes__default["default"].bool,
    /**
     * @name isCancelable
     * @type bool
     * @required false
     * @description
     *  [en]
     *  DEPRECATED! Use `cancelable` instead.
     *  [/en]
     *  [ja][/ja]
     */
    isCancelable: PropTypes__default["default"].bool,
    /**
     * @name isDisabled
     * @type bool
     * @required false
     * @description
     *  [en]
     *  DEPRECATED! Use `disabled` instead.
     *  [/en]
     *  [ja][/ja]
     */
    isDisabled: PropTypes__default["default"].bool,
    /**
     * @name animation
     * @type string
     * @required false
     * @description
     *  [en]
     *  The animation used when showing and hiding the dialog. Can be either `"none"` or `"default"`.
     *  [/en]
     *  [ja][/ja]
     */
    animation: PropTypes__default["default"].string,
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the dialog.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name maskColor
     * @type string
     * @required false
     * @description
     *  [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)"[/en]
     *  [ja][/ja]
     */
    maskColor: PropTypes__default["default"].string,
    /**
     * @name animationOptions
     * @type object
     * @required false
     * @description
     *  [en]Specify the animation's duration, delay and timing. E.g.  `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
     *  [ja][/ja]
     */
    animationOptions: PropTypes__default["default"].object,
    /**
     * @name onPreShow
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called just before the alert dialog is displayed.
     *  [/en]
     *  [ja][/ja]
     */
    onPreShow: PropTypes__default["default"].func,
    /**
     * @name onPostShow
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called just after the alert dialog is displayed.
     *  [/en]
     *  [ja][/ja]
     */
    onPostShow: PropTypes__default["default"].func,
    /**
     * @name onPreHide
     * @type function
     * @required false
     * @description
     *  [en]Called just before the alert dialog is hidden.[/en]
     *  [ja][/ja]
     */
    onPreHide: PropTypes__default["default"].func,
    /**
     * @name onPostHide
     * @type function
     * @required false
     * @description
     *  [en]Called just after the alert dialog is hidden.[/en]
     *  [ja][/ja]
     */
    onPostHide: PropTypes__default["default"].func,
    /**
     * @name onDeviceBackButton
     * @type function
     * @required false
     * @description
     *  [en]
     *  Custom handler for device back button.
     *  [/en]
     *  [ja][/ja]
     */
    onDeviceBackButton: PropTypes__default["default"].func
  };

  /**
   * @original ons-fab
   * @category form
   * @tutorial react/Reference/fab
   * @description
   * [en] The Floating action button is a circular button defined in the [Material Design specification](https://www.google.com/design/spec/components/buttons-floating-action-button.html). They are often used to promote the primary action of the app.
   *     It can be displayed either as an inline element or in one of the corners. Normally it will be positioned in the lower right corner of the screen.
   [/en]
   * [ja][/ja]
   * @example
   * <SpeedDial disabled={false} direction='right' onClick={() => console.log('test1')} position='left bottom'>
       <Fab>
         <Icon icon='fa-twitter' size={26} fixedWidth={false} style={{verticalAlign: 'middle'}} />
       </Fab>
       <SpeedDialItem onClick={() => console.log('speed A')}> A </SpeedDialItem>
       <SpeedDialItem onClick={() => console.log('speed B')}> B </SpeedDialItem>
       <SpeedDialItem onClick={() => console.log('speed C')}> C </SpeedDialItem>
       <SpeedDialItem onClick={() => console.log('speed D')}> D </SpeedDialItem>
     </SpeedDial>
    */
  const Fab = onsCustomElement('ons-fab');
  Fab.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the button.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name ripple
     * @type bool
     * @description
     *  [en]If true,  the button will have a ripple effect when tapped.[/en]
     *  [ja][/ja]
     */
    ripple: PropTypes__default["default"].bool,
    /**
     * @name position
     * @type string
     * @required false
     * @description
     *  [en]The position of the button. Should be a string like `"bottom right"` or `"top left"`. If this attribute is not defined it will be displayed as an inline element.[/en]
     *  [ja][/ja]
     */
    position: PropTypes__default["default"].string,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en] If true, the button will be disabled. [/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name onClick
     * @type function
     * @description
     *  [en] This function will be called ones the button is clicked. [/en]
     *  [ja][/ja]
     */
    onClick: PropTypes__default["default"].func
  };

  const propTypes$3 = {
    /**
     * @name onDrag
     * @type function
     * @description
     *  [en]Called when the user drags in any direction.[/en]
     *  [ja][/ja]
     */
    onDrag: PropTypes__default["default"].func,
    /**
     * @name onDragLeft
     * @type function
     * @description
     *  [en]Called when the user drags left.[/en]
     *  [ja][/ja]
     */
    onDragLeft: PropTypes__default["default"].func,
    /**
     * @name onDragRight
     * @type function
     * @description
     *  [en]Called when the user drags right.[/en]
     *  [ja][/ja]
     */
    onDragRight: PropTypes__default["default"].func,
    /**
     * @name onDragUp
     * @type function
     * @description
     *  [en]Called when the user drags up.[/en]
     *  [ja][/ja]
     */
    onDragUp: PropTypes__default["default"].func,
    /**
     * @name onDragDown
     * @type function
     * @description
     *  [en]Called when the user drags down.[/en]
     *  [ja][/ja]
     */
    onDragDown: PropTypes__default["default"].func,
    /**
     * @name onHold
     * @type function
     * @description
     *  [en]Called when the user holds.[/en]
     *  [ja][/ja]
     */
    onHold: PropTypes__default["default"].func,
    /**
     * @name onRelease
     * @type function
     * @description
     *  [en]Called when the user releases.[/en]
     *  [ja][/ja]
     */
    onRelease: PropTypes__default["default"].func,
    /**
     * @name onSwipe
     * @type function
     * @description
     *  [en]Called when the user swipes in any direction.[/en]
     *  [ja][/ja]
     */
    onSwipe: PropTypes__default["default"].func,
    /**
     * @name onSwipeLeft
     * @type function
     * @description
     *  [en]Called when the user swipes left.[/en]
     *  [ja][/ja]
     */
    onSwipeLeft: PropTypes__default["default"].func,
    /**
     * @name onSwipeRight
     * @type function
     * @description
     *  [en]Called when the user swipes right.[/en]
     *  [ja][/ja]
     */
    onSwipeRight: PropTypes__default["default"].func,
    /**
     * @name onSwipeUp
     * @type function
     * @description
     *  [en]Called when the user swipes up.[/en]
     *  [ja][/ja]
     */
    onSwipeUp: PropTypes__default["default"].func,
    /**
     * @name onSwipeDown
     * @type function
     * @description
     *  [en]Called when the user swipes down.[/en]
     *  [ja][/ja]
     */
    onSwipeDown: PropTypes__default["default"].func,
    /**
     * @name onTap
     * @type function
     * @description
     *  [en]Called when the user taps.[/en]
     *  [ja][/ja]
     */
    onTap: PropTypes__default["default"].func,
    /**
     * @name onDoubleTap
     * @type function
     * @description
     *  [en]Called when the user double taps.[/en]
     *  [ja][/ja]
     */
    onDoubleTap: PropTypes__default["default"].func,
    /**
     * @name onPinch
     * @type function
     * @description
     *  [en]Called when the user pinches in or out.[/en]
     *  [ja][/ja]
     */
    onPinch: PropTypes__default["default"].func,
    /**
     * @name onPinchIn
     * @type function
     * @description
     *  [en]Called when the user pinches in.[/en]
     *  [ja][/ja]
     */
    onPinchIn: PropTypes__default["default"].func,
    /**
     * @name onPinchOut
     * @type function
     * @description
     *  [en]Called when the user pinches out.[/en]
     *  [ja][/ja]
     */
    onPinchOut: PropTypes__default["default"].func,
    /**
     * @name onTouch
     * @type function
     * @description
     *  [en]Called when the user touches.[/en]
     *  [ja][/ja]
     */
    onTouch: PropTypes__default["default"].func,
    /**
     * @name onTransform
     * @type function
     * @description
     *  [en]Called when the user transforms.[/en]
     *  [ja][/ja]
     */
    onTransform: PropTypes__default["default"].func,
    /**
     * @name onRotate
     * @type function
     * @description
     *  [en]Called when the user rotates.[/en]
     *  [ja][/ja]
     */
    onRotate: PropTypes__default["default"].func
  };

  /**
   * @original ons-gesture-detector
   * @category gesture
   * @tutorial react/Reference/gesture-detector
   * @description
   * [en]Component to detect finger gestures within a wrapped element.
   [/en]
   * [ja][/ja]
   * @example
   * <GestureDetector
   *   onTap={() => console.log('tap')}
   *   onSwipeleft={() => console.log('swipe left')}
   * >
   *   <div style={{backgroundColor: 'pink', width: '100px', height: '100px'}}>
   *     Swipe Here
   *   </div>
   * </GestureDetector>
   *
   */
  const GestureDetector = onsCustomElement('ons-gesture-detector', {
    propTypes: propTypes$3
  });
  GestureDetector.propTypes = propTypes$3;

  const parseIcon = icon => {
    if (icon) {
      if (typeof icon === 'string') {
        return icon;
      } else {
        const keys = Object.keys(icon).filter(a => a !== 'default');
        const innerString = keys.map(key => key + ':' + icon[key] + '');
        return icon.default + ', ' + innerString.join(',');
      }
    }
  };
  const parseSize = size => {
    if (size) {
      if (typeof size === 'number') {
        return `${size}px`;
      } else {
        const keys = Object.keys(size).filter(a => a !== 'default');
        const innerString = keys.map(key => key + ':' + size[key] + 'px');
        return size.default + 'px, ' + innerString.join(',');
      }
    }
  };
  const Element$8 = onsCustomElement('ons-icon');

  /**
   * @original ons-icon
   * @category visual
   * @tutorial react/Reference/icon
   * @description
   * [en]
   * Displays an icon. The following icon suites are available:
   *   *  [Font Awesome](https://fortawesome.github.io/Font-Awesome/)
   *   *  [Ionicons](http://ionicons.com/)
   *   *  [Material Design Iconic Font](http://zavoloklom.github.io/material-design-iconic-font/)
   * [/en]
   * [ja][/ja]
   * @example
    <Icon
      size={{default: 32, material: 40}}
      icon={{default: 'ion-navicon', material: 'md-menu'}}
    />
  */
  const Icon = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
    const {
      icon,
      size,
      ...rest
    } = props;
    return /*#__PURE__*/React__default["default"].createElement(Element$8, _extends({
      icon: parseIcon(icon),
      size: parseSize(size)
    }, rest, {
      ref: ref
    }), props.children);
  });
  Icon.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the icon.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name icon
     * @type 'object or string'
     * @description
     *  [en] can be either a string or an object. If it is an string, it is set to an specific icon like 'ions-navicon'. If it is an object, it represents a dictionary of the icons depending on the modifier e.g.   `{{default: 'ion-navicon', material: 'md-menu'}}` [/en]
     *  [ja][/ja]
     */
    icon: PropTypes__default["default"].oneOfType([PropTypes__default["default"].string, PropTypes__default["default"].objectOf(PropTypes__default["default"].string)]),
    /**
     * @name size
     * @type 'object or number'
     * @description
     *  [en] can be either a number or an object. If it is an number, it  specifies the icon size with a number in pixels. If it is an object, it represents a dictionary of the icon sizes depending on the modifier e.g.   `{{default: 20, material: 18}}` [/en]
     *  [ja][/ja]
     */
    size: PropTypes__default["default"].oneOfType([PropTypes__default["default"].number, PropTypes__default["default"].objectOf(PropTypes__default["default"].number)]),
    /**
     * @name rotate
     * @type number
     * @description
     *  [en] Number of degrees to rotate the icon. Valid values are 90, 180 and 270. [/en]
     *  [ja][/ja]
     */
    rotate: PropTypes__default["default"].oneOf([0, 90, 180, 270]),
    /**
     * @name fixedWidth
     * @type bool
     * @description
     * [en] When used in a list, you want the icons to have the same width so that they align vertically by defining this attribute. [/en]
     *  [ja][/ja]
     */
    fixedWidth: PropTypes__default["default"].bool,
    /**
     * @name spin
     * @type bool
     * @description
     * [en] Specify whether the icon should be spinning. [/en]
     *  [ja][/ja]
     */
    spin: PropTypes__default["default"].bool
  };

  const nameMap$5 = {
    ...INPUT_PROPS
  };
  const withDefaultValue$3 = component => oneTimeProp(component, 'defaultValue', 'value');
  const notAttributes$9 = ['value' // value must be applied as property since attribute only works before input is touched
  ];

  /**
   * @original ons-input
   * @category form
   * @tutorial react/Reference/input
   * @description
   * [en]
   * An input element. The `type` attribute can be used to change the input type. All text input types as well as `checkbox` and `radio` are supported. The component will automatically render as a Material Design input on Android devices. Most attributes that can be used for a normal `<input>` element can also be used on the `<ons-input>` element..
   [/en]
   * [ja][/ja]
   * @example
   * <Input
   *   value={this.state.text} float
   *   onChange={(event) => { this.setState({text: event.target.value})} }
   *   modifier='material'
   *   placeholder='Username' />
   */
  const Input = withDefaultValue$3(onsCustomElement('ons-input', {
    deprecated: nameMap$5,
    notAttributes: notAttributes$9
  }));
  Input.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the input.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en]Specifies whether the input is disabled.[/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name readOnly
     * @type bool
     * @description
     *  [en]Specifies whether the input is read-only.[/en]
     *  [ja][/ja]
     */
    readOnly: PropTypes__default["default"].bool,
    /**
     * @name onChange
     * @type function
     * @description
     *  [en]Called when the inner input fires a `change` event.[/en]
     *  [ja][/ja]
     */
    onChange: PropTypes__default["default"].func,
    /**
     * @name onInput
     * @type function
     * @description
     *  [en]Called when the inner input fires an `input` event.[/en]
     *  [ja][/ja]
     */
    onInput: PropTypes__default["default"].func,
    /**
     * @name value
     * @type string
     * @description
     *  [en]Content of the input (controlled).[/en]
     *  [ja][/ja]
     */
    value: PropTypes__default["default"].oneOfType([PropTypes__default["default"].string, PropTypes__default["default"].instanceOf(Date)]),
    /**
     * @name defaultValue
     * @type string
     * @description
     *  [en]Content of the input at first render (uncontrolled).[/en]
     *  [ja][/ja]
     */
    defaultValue: PropTypes__default["default"].oneOfType([PropTypes__default["default"].string, PropTypes__default["default"].instanceOf(Date)]),
    /**
     * @name placeholder
     * @type string
     * @description
     *  [en] Placeholder text. In Material Design this placeholder will be a floating label. [/en]
     *  [ja][/ja]
     */
    placeholder: PropTypes__default["default"].string,
    /**
     * @name type
     * @type string
     * @description
     *  [en]
     *    Specify the input type. This is the same as the "type" attribute for normal inputs. It expects strict text types such as `text`, `password`, etc. For checkbox, radio button, select or range, please have a look at the corresponding components.
     *
     *    Please take a look at [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-type) for an exhaustive list of possible values. Depending on the platform and browser version some of these might not work.
     *  [/en]
     *  [ja][/ja]
     */
    type: PropTypes__default["default"].string,
    /**
     * @name inputId
     * @type string
     * @description
     *  [en]  Specify the "id" attribute of the inner `<input>` element. This is useful when using <label for="..."> elements [/en]
     *  [ja][/ja]
     */
    inputId: PropTypes__default["default"].string,
    /**
     * @name float
     * @type bool
     * @description
     *  [en]  If this attribute is present, the placeholder will be animated in Material Design.  [/en]
     *  [ja][/ja]
     */
    float: PropTypes__default["default"].bool
  };

  const Element$7 = onsCustomElement('ons-list');

  /**
   * @original ons-list
   * @category list
   * @tutorial react/Reference/list
   * @description
   *   [en]
   *     Component for representing a list. It takes an array called datasource and calls renderRow(row, index) for every row.  Furthermore, the header and the footer can be specified with `renderRow` and `renderHeader` respectively. [/en]
   * [ja][/ja]
   * @example
    <List
      dataSource={['Row 1', 'Row 2']}
      renderHeader={this.renderHeader}
      renderRow={(row, idx) => (
        <ListItem modifier={idx === this.state.data.length - 1 ? 'longdivider' : null}>
        {row}
    <Button modifier="quiet" onClick={this.remove.bind(this, idx)}>Remove</Button>
    </ListItem>
    )}
    renderFooter={this.renderFooter}
    />
   */
  const List = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
    const {
      renderHeader,
      renderFooter,
      renderRow,
      dataSource,
      ...rest
    } = props;
    const rows = dataSource.map((data, index) => renderRow(data, index));
    return /*#__PURE__*/React__default["default"].createElement(Element$7, _extends({}, rest, {
      ref: ref
    }), renderHeader(), rows, props.children, renderFooter());
  });
  List.propTypes = {
    /**
     * @name modifier
     * @type string
     * @description
     *  [en]
     *  Specify modifier name to specify custom styles.
     *  [/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name dataSource
     * @type string
     * @description
     *  [en]
     *    Source of the list data. Should be an array.
     *  [/en]
     *  [ja][/ja]
     */
    dataSource: PropTypes__default["default"].array,
    /**
     * @name renderRow
     * @type function
     * @description
     *  [en]
     *  Function to specify the rendering function for every element in
     *  in the dataSource.
     *  [/en]
     *  [ja][/ja]
     */
    renderRow: PropTypes__default["default"].func,
    /**
     * @name renderHeader
     * @type function
     * @description
     *  [en]
     *  Function to specify the rendering function for the header
     *  [/en]
     *  [ja][/ja]
     */
    renderHeader: PropTypes__default["default"].func,
    /**
     * @name renderFooter
     * @type function
     * @description
     *  [en]
     *  Function to specify the rendering function for the footer
     *  [/en]
     *  [ja][/ja]
     */
    renderFooter: PropTypes__default["default"].func
  };
  List.defaultProps = {
    dataSource: [],
    renderRow: () => null,
    renderHeader: () => null,
    renderFooter: () => null
  };

  /**
   * @original ons-lazy-repeat
   * @category list
   * @tutorial react/Reference/lazy-list
   * @description
   * [en] Using this component a list with millions of items can be rendered without a drop in performance.
   *     It does that by "lazily" loading elements into the DOM when they come into view and
   *     removing items from the DOM when they are not visible.
   [/en]
   * [ja][/ja]
   * @example
   *
    renderRow(index) {
      return (
        <ListItem key={index}>
          {'Item ' + (index + 1)}
        </ListItem>
      );
    }

    render() {
      return (
        <Page renderToolbar={() => <MyToolbar title='LazyList' />} >
          <div style={{height: 100}}>
            <LazyList
              length={1000}
              renderRow={() =>
                <ListItem key={index}>
                  {'Item ' + (index + 1)}
                </ListItem>
              }
              calculateItemHeight={() => 44}
            />
          </div>
        </Page>
      );
    }
  }
   */
  const LazyList = /*#__PURE__*/React__default["default"].forwardRef((props, forwardedRef) => {
    const ref = forwardedRef || React.useRef();
    const [children, setChildren] = React.useState([]);
    const [, setUpdateTop] = React.useState();
    const {
      calculateItemHeight,
      renderRow,
      length,
      ...rest
    } = props;
    React.useEffect(() => {
      ref.current.delegate = {
        calculateItemHeight: function (index) {
          return calculateItemHeight(index);
        },
        _render: function (start, limit, updateTop) {
          const el = [];
          for (let i = start; i < limit; i++) {
            el.push(renderRow(i));
          }
          setChildren(el);
          setUpdateTop(updateTop); // doesn't work without this, but why? does it just trigger a rerender?
        },

        countItems: function () {
          return length;
        }
      };
    }, [calculateItemHeight, renderRow, length]);
    return /*#__PURE__*/React__default["default"].createElement(List, _extends({}, rest, {
      style: {
        position: 'relative'
      }
    }), /*#__PURE__*/React__default["default"].createElement("ons-lazy-repeat", {
      ref: ref
    }), children);
  });
  LazyList.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the lazy list.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name length
     * @type number
     * @description
     *  [en]The length of the list.[/en]
     *  [ja][/ja]
     */
    length: PropTypes__default["default"].number.isRequired,
    /**
     * @name renderRow
     * @type function
     * @description
     *  [en] A function given the index of the to display row, renders it.[/en]
     *  [ja][/ja]
     */
    renderRow: PropTypes__default["default"].func.isRequired,
    /**
     * @name calculateItemHeight
     * @type function
     * @description
     *  [en] A function given the index of the to row, returns the height of it.[/en]
     *  [ja][/ja]
     */
    calculateItemHeight: PropTypes__default["default"].func.isRequired
  };

  /**
   * @original ons-list-header
   * @category list
   * @tutorial react/Reference/list
   * @description
   * [en] Header element for list items. Must be put inside ons-list component.
   [/en]
   * [ja][/ja]
   * @example
     <List
       dataSource={this.state.data}
       renderHeader={() =>
          <ListHeader style={{fontSize: 15}} className="testClass"> Header Text </ListHeader> }
      renderRow={(row, idx) => (
        <ListItem > {row} </ListItem>
      )}
    />
   */
  const ListHeader = onsCustomElement('ons-list-header');
  ListHeader.propTypes = {
    /**
     * @name modifier
     * @type string
     * @description
     *  [en]
     *  Specify modifier name to specify custom styles. Optional.
     *  [/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string
  };

  const propTypes$2 = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en] The appearance of the list item.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name tappable
     * @type bool
     * @description
     *  [en]
     *  Specifies whether the list item is tappable.
     *  [/en]
     *  [ja][/ja]
     */
    tappable: PropTypes__default["default"].bool,
    /**
     * @name tapBackgroundColor
     * @type string
     * @description
     *  [en]
     *  Changes the background color when tapped. For this to work, the attribute "tappable" needs to be set. The default color is "#d9d9d9". It will display as a ripple effect on Android.
     *  [/en]
     *  [ja][/ja]
     */
    tapBackgroundColor: PropTypes__default["default"].string,
    /**
     * @name keepTapBackgroundColor
     * @type bool
     * @description
     *  [en]
     *  Prevent from clearing the background color on `"touchmove"`, `"touchcancel"`, `"touchend"`, `"touchleave"`, `"mouseup"`, and `"mouseout"`. For this to work, the attribute "tappable" needs to be set.
     *  [/en]
     *  [ja][/ja]
     */
    keepTapBackgroundColor: PropTypes__default["default"].bool,
    /**
     * @name lockOnDrag
     * @type bool
     * @description
     *  [en] Prevent vertical scrolling when the user drags horizontally. [/en]
     *  [ja][/ja]
     */
    lockOnDrag: PropTypes__default["default"].bool,
    /**
     * @name expandable
     * @type bool
     * @description
     *  [en]Specifies whether list item can be expanded to reveal hidden content. Expanded content must be defined in `div.expandable-content`.[/en]
     *  [ja][/ja]
     */
    expandable: PropTypes__default["default"].bool,
    /**
     * @name expanded
     * @type bool
     * @description
     *  [en]For expandable list items, specifies whether item is expanded[/en]
     *  [ja][/ja]
     */
    expanded: PropTypes__default["default"].bool,
    /**
     * @name onExpand
     * @type function
     * @description
     *  [en] This function will be called when the expandable list item expands or contracts.[/en]
     *  [ja][/ja]
     */
    onExpand: PropTypes__default["default"].func,
    /**
     * @name animation
     * @type string
     * @description
     *  [en]The animation used when showing and hiding the expandable content. Can be either "default" or "none".[/en]
     *  [ja][/ja]
     */
    animation: PropTypes__default["default"].string
  };

  /**
   * @original ons-list-item
   * @category list
   * @tutorial react/Reference/list
   * @description
   *   [en]
   *   Component that represents each item in the list. Must be put inside the `List` component. The list item is composed of four parts that are represented with the `left`, `center`, `right` and `expandable-content` classes. These classes can be used to ensure that the content of the list items is properly aligned.
   *   [/en]
   * [ja][/ja]
   * @example
     <ListItem>
   *   <div className="left">Left</div>
   *   <div className="center">Center</div>
   *   <div className="right">Right</div>
   *   <div className="expandable-content">Expandable content</div>
   * </ListItem>
   */
  const ListItem = onsCustomElement('ons-list-item', {
    propTypes: propTypes$2
  });
  ListItem.propTypes = propTypes$2;

  const propTypes$1 = {
    /**
     * @name modifier
     * @type string
     * @description
     *  [en]
     *  Specify modifier name to specify custom styles. Optional.
     *  [/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string
  };

  /**
   * @original ons-list-title
   * @category list
   * @tutorial react/Reference/list
   * @description
   * [en] Title element for lists. Usually comes before ons-list component.
   [/en]
   * [ja][/ja]
   * @example
   * <ListTitle>List Title</ListTitle>
     <List
       dataSource={this.state.data}
       renderHeader={() =>
          <ListHeader style={{fontSize: 15}} className="testClass"> Header Text </ListHeader> }
      renderRow={(row, idx) => (
        <ListItem > {row} </ListItem>
      )}
    />
   */
  const ListTitle = onsCustomElement('ons-list-title', {
    propTypes: propTypes$1
  });
  ListTitle.propTypes = propTypes$1;

  const Element$6 = onsCustomElement('ons-navigator');
  class NavigatorClass extends React__default["default"].Component {
    constructor() {
      super(...arguments);
      this.ref = /*#__PURE__*/React__default["default"].createRef();
      this.pages = [];
      this.state = {};
      this._prePush = this._prePush.bind(this);
      this._postPush = this._postPush.bind(this);
      this._prePop = this._prePop.bind(this);
      this._postPop = this._postPop.bind(this);
    }
    update(pages, obj) {
      this.pages = pages || [];
      return new Promise(resolve => {
        this.forceUpdate(resolve);
      });
    }

    /**
     * @method resetPage
     * @signature resetPage(route, options = {})
     * @param {Object} route
     *   [en] The route that the page should be reset to.[/en]
     *   [ja][/ja]
     * @return {Promise}
     *   [en]Promise which resolves to the revealed page.[/en]
     *   [ja]明らかにしたページを解決するPromiseを返します。[/ja]
     * @description
     *   [en]Resets the current page[/en]
     *   [ja][/ja]
     */
    resetPage(route) {
      let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      return this.resetPageStack([route], options);
    }

    /**
     * @method resetPageStack
     * @signature resetPageStack(route, options = {})
     * @param {Array} routes
     *   [en] The routes that the navigator should be reset to.[/en]
     *   [ja][/ja]
     * @return {Promise}
     *   [en]Promise which resolves to the revealed page.[/en]
     *   [ja]明らかにしたページを解決するPromiseを返します。[/ja]
     * @description
     *   [en] Resets the navigator to the current page stack[/en]
     *   [ja][/ja]
     */
    resetPageStack(routes) {
      let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      if (this.isRunning()) {
        return Promise.reject('Navigator is already running animation.');
      }
      const hidePages = () => {
        const pageElements = this.ref.current.pages;
        for (let i = pageElements.length - 2; i >= 0; i--) {
          pageElements[i].style.display = 'none';
        }
      };
      if (options.pop) {
        this.routesBeforePop = this.routes.slice();
        this.routesAfterPop = routes;
        this.routes = routes.concat([this.routes[this.routes.length - 1]]);
        const update = () => {
          this.pages.pop();
          this.routes = routes;
          return new Promise(resolve => this.forceUpdate(resolve));
        };
        return this.update(this.pages).then(() => this.ref.current._popPage(options, update)).then(() => hidePages());
      }
      const lastRoute = routes[routes.length - 1];
      const newPage = this.props.renderPage(lastRoute, this);
      this.routes.push(lastRoute);
      const update = () => {
        this.pages.push(newPage);
        return new Promise(resolve => this.forceUpdate(resolve));
      };
      return this.ref.current._pushPage(options, update).then(() => {
        this.routes = routes;
        this.pages = routes.map(route => this.props.renderPage(route, this));
        return this.update(this.pages).then(() => hidePages());
      });
    }

    /**
     * @method pushPage
     * @signature pushPage(route, options = {})
     * @param {Object} route
     *   [en] The route that the navigator should push to.[/en]
     *   [ja][/ja]
     * @return {Promise}
     *   [en] Promise which resolves to the revealed page.[/en]
     *   [ja]明らかにしたページを解決するPromiseを返します。[/ja]
     * @description
     *   [en] Pushes a page to the page stack[/en]
     *   [ja][/ja]
     */
    pushPage(route) {
      let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      if (this.isRunning()) {
        return Promise.reject('Navigator is already running animation.');
      }
      return new Promise(resolve => {
        const update = () => {
          return new Promise(resolve => {
            this.pages.push(this.props.renderPage(route, this));
            this.forceUpdate(resolve);
          });
        };
        this.routes.push(route);
        this.ref.current._pushPage(options, update).then(resolve).catch(error => {
          this.routes.pop();
          this.pages.pop();
          throw error;
        });
      });
    }
    isRunning() {
      return this.ref.current._isRunning;
    }

    /*
     * @method replacePage
     * @signature replacePage(route, [options])
     * @param {Object} route
     *   [en] The route that the navigator should replace the top page with.[/en]
     *   [ja][/ja]
     * @return {Promise}
     *   [en]Promise which resolves to the new page.[/en]
     *   [ja]新しいページを解決するPromiseを返します。[/ja]
     * @description
     *   [en]Replaces the current top page with the specified one. Extends `pushPage()` parameters.[/en]
     *   [ja]現在表示中のページをを指定したページに置き換えます。[/ja]
     */
    replacePage(route) {
      let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      if (this.isRunning()) {
        return Promise.reject('Navigator is already running animation.');
      }
      return this.pushPage(route, options).then(() => {
        const pos = this.pages.length - 2;
        this.pages.splice(pos, 1);
        this.routes.splice(pos, 1);
        this.ref.current.topPage.updateBackButton(this.pages.length > 1);
        this.forceUpdate();
      });
    }

    /**
     * @method popPage
     * @signature popPage(options = {})
     * @return {Promise}
     *   [en] Promise which resolves to the revealed page.[/en]
     *   [ja]明らかにしたページを解決するPromiseを返します。[/ja]
     * @description
     *   [en] Pops a page out of the page stack[/en]
     *   [ja][/ja]
     */
    popPage() {
      let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
      if (this.isRunning()) {
        return Promise.reject('Navigator is already running animation.');
      }
      this.routesBeforePop = this.routes.slice();
      this.routesAfterPop = this.routesBeforePop.slice(0, this.routesBeforePop.length - 1);
      const update = () => {
        return new Promise(resolve => {
          this.pages.pop();
          this.routes.pop();
          ReactDOM__default["default"].flushSync(() => {
            // prevents flickering caused by React 18 batching
            this.forceUpdate(resolve);
          });
        });
      };
      return this.ref.current._popPage(options, update);
    }
    _onDeviceBackButton(event) {
      if (this.pages.length > 1) {
        this.popPage();
      } else {
        event.callParentHandler();
      }
    }
    _prePop(event) {
      if (event.target !== this.ref.current) {
        return;
      }
      event.routes = {
        poppingRoute: this.routesBeforePop[this.routesBeforePop.length - 1],
        routes: this.routesBeforePop
      };
      this.props.onPrePop(event);
    }
    _postPop(event) {
      if (event.target !== this.ref.current) {
        return;
      }
      event.routes = {
        poppedRoute: this.routesBeforePop[this.routesBeforePop.length - 1],
        routes: this.routesAfterPop
      };
      this.props.onPostPop(event);
    }
    _prePush(event) {
      if (event.target !== this.ref.current) {
        return;
      }
      event.routes = {
        pushingRoute: this.routes[this.routes.length - 1],
        routes: this.routes.slice(0, this.routes.length - 1)
      };
      this.props.onPrePush(event);
    }
    _postPush(event) {
      if (event.target !== this.ref.current) {
        return;
      }
      event.routes = {
        pushedRoute: this.routes[this.routes.length - 1],
        routes: this.routes
      };
      this.props.onPostPush(event);
    }
    componentDidMount() {
      const node = this.ref.current;
      node.popPage = this.popPage.bind(this);
      node.addEventListener('prepush', this._prePush);
      node.addEventListener('postpush', this._postPush);
      node.addEventListener('prepop', this._prePop);
      node.addEventListener('postpop', this._postPop);
      node.swipeMax = this.props.swipePop;
      node.onDeviceBackButton = this.props.onDeviceBackButton || this._onDeviceBackButton.bind(this);
      if (this.props.initialRoute && this.props.initialRouteStack) {
        throw new Error('In Navigator either initalRoute or initalRoutes can be set');
      }
      if (this.props.initialRoute) {
        this.routes = [this.props.initialRoute];
      } else if (this.props.initialRouteStack) {
        this.routes = this.props.initialRouteStack;
      } else {
        this.routes = [];
      }
      this.pages = this.routes.map(route => this.props.renderPage(route, this));
      this.forceUpdate();
    }
    componentDidUpdate() {
      if (this.props.onDeviceBackButton !== undefined) {
        this.ref.current.onDeviceBackButton = this.props.onDeviceBackButton;
      }
    }
    componentWillUnmount() {
      const node = this.ref.current;
      node.removeEventListener('prepush', this.props.onPrePush);
      node.removeEventListener('postpush', this.props.onPostPush);
      node.removeEventListener('prepop', this.props.onPrePop);
      node.removeEventListener('postpop', this.props.onPostPop);
    }
    render() {
      const {
        innerRef,
        renderPage,
        // these props should not be passed down
        initialRouteStack,
        initialRoute,
        onPrePush,
        onPostPush,
        onPrePop,
        onPostPop,
        swipePop,
        onDeviceBackButton,
        ...rest
      } = this.props;
      const pages = this.routes ? this.routes.map(route => renderPage(route, this)) : null;
      if (innerRef && innerRef !== this.ref) {
        this.ref = innerRef;
      }
      return /*#__PURE__*/React__default["default"].createElement(Element$6, _extends({
        ref: this.ref
      }, rest), pages);
    }
  }

  /**
   * @original ons-navigator
   * @category navigation
   * @tutorial react/Reference/navigator
   * @description
   * [en] This component is responsible for page transitioning and managing the pages of your OnsenUI application. In order to manage to display the pages, the  navigator needs to define the `renderPage` method, that takes an route and a navigator and  converts it to an page.  [/en]
   * [ja][/ja]
   * @example
    <Navigator
      renderPage={(route, navigator) =>
       <MyPage
         title={route.title}
         onPop={() => navigator.popPage()}
         />
      }
      initialRoute={{
          title: 'First Page'
      }} />
     }
   }
   */
  const Navigator = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(NavigatorClass, _extends({
    innerRef: ref
  }, props), props.children));
  Navigator.propTypes = {
    /**
     * @name renderPage
     * @type function
     * @required true
     * @defaultValue null
     * @description
     *  [en] This function takes the current route object as a parameter and returns a React component.[/en]
     *  [ja][/ja]
     */
    renderPage: PropTypes__default["default"].func.isRequired,
    /**
     * @name initialRouteStack
     * @type array
     * @required false
     * @defaultValue null
     * @description
     *  [en] This array contains the initial routes from the Navigator,
     *  which will be used to render the initial pages in the `renderPage` method.
     *  [/en]
     *  [ja][/ja]
     */
    initialRouteStack: PropTypes__default["default"].array,
    /**
     * @name initialRoute
     * @type object
     * @required false
     * @defaultValue null
     * @description
     *  [en] This array contains the initial route of the navigator,
     *  which will be used to render the initial pages in the
     *  renderPage method.
     *  [/en]
     *  [ja][/ja]
     */
    initialRoute: PropTypes__default["default"].object,
    /**
     * @name onPrePush
     * @type function
     * @required false
     * @description
     *  [en]Called just before a page is pushed. It gets an event object with route information.[/en]
     *  [ja][/ja]
     */
    onPrePush: PropTypes__default["default"].func,
    /**
     * @name onPostPush
     * @type function
     * @required false
     * @description
     *  [en]Called just after a page is pushed. It gets an event object with route information.[/en]
     *  [ja][/ja]
     */
    onPostPush: PropTypes__default["default"].func,
    /**
     * @name onPrePop
     * @type function
     * @required false
     * @description
     *  [en]Called just before a page is popped. It gets an event object with route information.[/en]
     */
    onPrePop: PropTypes__default["default"].func,
    /**
     * @name onPostPop
     * @type function
     * @required false
     * @description
     *  [en]Called just after a page is popped. It gets an event object with route information.[/en]
     *  [ja][/ja]
     */
    onPostPop: PropTypes__default["default"].func,
    /**
     * @name animation
     * @type {String}
     * @description
     *   [en]
     *     Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
     *     These are platform based animations. For fixed animations, add `"-ios"` or `"-md"` suffix to the animation name. E.g. `"lift-ios"`, `"lift-md"`. Defaults values are `"slide-ios"` and `"fade-md"`.
     *   [/en]
     *   [ja][/ja]
     */
    animation: PropTypes__default["default"].string,
    /**
     * @name animationOptions
     * @type object
     * @description
     *  [en]Specify the animation's duration, delay and timing. E.g.  `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
     *  [ja][/ja]
     */
    animationOptions: PropTypes__default["default"].object,
    /**
     * @name swipeable
     * @type bool|string
     * @required false
     * @description
     *  [en]Enables swipe-to-pop functionality for iOS.[/en]
     *  [ja][/ja]
     */
    swipeable: PropTypes__default["default"].oneOfType([PropTypes__default["default"].bool, PropTypes__default["default"].string]),
    /**
     * @name swipePop
     * @type function
     * @required false
     * @description
     *  [en]Optional function called on swipe-to-pop. If provided, must perform a popPage with the given options object.[/en]
     *  [ja][/ja]
     */
    swipePop: PropTypes__default["default"].func,
    /**
     * @name onDeviceBackButton
     * @type function
     * @required false
     * @description
     *  [en]Custom handler for device back button.[/en]
     *  [ja][/ja]
     */
    onDeviceBackButton: PropTypes__default["default"].func
  };
  const NOOP$1 = () => null;
  Navigator.defaultProps = {
    onPostPush: NOOP$1,
    onPrePush: NOOP$1,
    onPrePop: NOOP$1,
    onPostPop: NOOP$1
  };

  const deprecated$6 = {
    isOpen: 'visible'
  };
  const notAttributes$8 = ['onDeviceBackButton'];

  /**
   * @original ons-modal
   * @category dialog
   * @tutorial react/Reference/modal
   * @description
   * [en]
   *   A modal component covers the entire screen. Underlying components are not
   *   subject to any events while the modal component is shown.
   *
   *   This component can be used to block user input while some operation is
   *   running or to show some information to the user.
   * [/en]
   * [ja]
   *   画面全体をマスクするモーダル用コンポーネントです。下側にあるコンポーネントは、
   *   モーダルが表示されている間はイベント通知が行われません
   * [/ja]
   * @example
    <Page>
      <div> Page content </div>

      <Modal isOpen={this.state.isLoading}>
        Loading ...
      </Modal>
    </Page>
   */
  const Modal = onsCustomElement(baseDialog('ons-modal'), {
    deprecated: deprecated$6,
    notAttributes: notAttributes$8
  });
  Modal.propTypes = {
    /**
     * @name animation
     * @type {String}
     * @description
     *   [en]
     *     Animation name. Available animations are `"fade"`, `"lift"` and `"none"`.
     *   [/en]
     */
    animation: PropTypes__default["default"].oneOf(['none', 'fade', 'lift']),
    /**
     * @name animationOptions
     * @type object
     * @description
     *  [en]Specify the animation's duration, delay and timing. E.g.  `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
     */
    animationOptions: PropTypes__default["default"].object,
    /**
     * @name onPreShow
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called just before the modal is displayed.
     *  [/en]
     *  [ja][/ja]
     */
    onPreShow: PropTypes__default["default"].func,
    /**
     * @name onPostShow
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called just after the modal is displayed.
     *  [/en]
     *  [ja][/ja]
     */
    onPostShow: PropTypes__default["default"].func,
    /**
     * @name onPreHide
     * @type function
     * @required false
     * @description
     *  [en]Called just before the modal is hidden.[/en]
     *  [ja][/ja]
     */
    onPreHide: PropTypes__default["default"].func,
    /**
     * @name onPostHide
     * @type function
     * @required false
     * @description
     *  [en]Called just after the modal is hidden.[/en]
     *  [ja][/ja]
     */
    onPostHide: PropTypes__default["default"].func,
    /**
     * @name visible
     * @type boolean
     * @description
     *  [en]When `true` the modal will show itself.[/en]
     */
    visible: PropTypes__default["default"].bool,
    /**
     * @name isOpen
     * @type boolean
     * @description
     *  [en]DEPRECATED! Use `visible` instead.[/en]
     */
    isOpen: PropTypes__default["default"].bool,
    /**
     * @name onDeviceBackButton
     * @type function
     * @required false
     * @description
     *  [en]
     *  Custom handler for device back button.
     *  [/en]
     *  [ja][/ja]
     */
    onDeviceBackButton: PropTypes__default["default"].func
  };

  const notAttributes$7 = ['onInfiniteScroll', 'onDeviceBackButton'];
  const Element$5 = onsCustomElement('ons-page', {
    notAttributes: notAttributes$7
  });

  /**
   * @original ons-page
   * @category page
   * @tutorial react/Reference/page
   * @description
   * [en]
   *   This component is handling the entire page. The content can be scrolled.
   *
   *   To add fixed content that doesn't scroll with the page the `renderFixed` prop is used.
   *
   *   A page toolbar can be added with the `renderToolbar` prop.
   * [/en]
   * [ja][/ja]
   * @example
    <Page
      renderFixed={() => <Fab></Fab>}
      renderToolbar={() => <Toolbar>...</Toolbar>}
      contentStyle={{padding: 40}}>
      <div> Page content </div>
    </Page>
   */
  const Page = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
    const {
      renderToolbar,
      renderBottomToolbar,
      renderModal,
      renderFixed,
      contentStyle,
      children,
      ...rest
    } = props;
    return /*#__PURE__*/React__default["default"].createElement(Element$5, _extends({}, rest, {
      ref: ref
    }), renderToolbar(ref), /*#__PURE__*/React__default["default"].createElement("div", {
      className: "page__background"
    }, " "), /*#__PURE__*/React__default["default"].createElement("div", {
      className: "page__content",
      style: contentStyle
    }, children), /*#__PURE__*/React__default["default"].createElement("div", {
      className: "page__extra",
      style: {
        zIndex: 10001
      }
    }, renderModal(ref)), renderFixed(ref), renderBottomToolbar(ref));
  });
  Page.propTypes = {
    /**
     * @name contentStyle
     * @type Object
     * @description
     *  [en]
     *  Specify the style of the page content. Optional.
     *  [/en]
     */
    contentStyle: PropTypes__default["default"].object,
    /**
     * @name modifier
     * @type string
     * @description
     *  [en]
     *  Specify modifier name to specify custom styles. Optional.
     *  [/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name renderModal
     * @type function
     * @required false
     * @defaultValue null
     * @description
     *  [en] This function renders a modal that masks current screen.[/en]
     */
    renderModal: PropTypes__default["default"].func,
    /**
     * @name renderToolbar
     * @type function
     * @required false
     * @defaultValue null
     * @description
     *  [en] This function renders the toolbar of the page.[/en]
     *  [ja][/ja]
     */
    renderToolbar: PropTypes__default["default"].func,
    /**
     * @name renderBottomToolbar
     * @type function
     * @defaultValue null
     * @description
     *  [en] This function renders the bottom toolbar of the page.[/en]
     *  [ja][/ja]
     */
    renderBottomToolbar: PropTypes__default["default"].func,
    /**
     * @name renderFixed
     * @type function
     * @defaultValue null
     * @description
     *  [en] This function renders fixed content of the page. Can be used to render `Fab` or `SpeedDial` components as well as other components that don't scroll with the page.[/en]
     *  [ja][/ja]
     */
    renderFixed: PropTypes__default["default"].func,
    /**
     * @name onInit
     * @type function
     * @required false
     * @description
     *  [en]
     *  	Fired right after the page is attached.
     *  [/en]
     *  [ja][/ja]
     */
    onInit: PropTypes__default["default"].func,
    /**
     * @name onShow
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called Fired right after the page is shown.
     *  [/en]
     *  [ja][/ja]
     */
    onShow: PropTypes__default["default"].func,
    /**
     * @name onHide
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called after the page is hidden.
     *  [/en]
     *  [ja][/ja]
     */
    onHide: PropTypes__default["default"].func,
    /**
     * @name onInfiniteScroll
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called when scrolling to the bottom of the page. It gets a 'done' callback (first argument) that must be called when it's finished.
     *  [/en]
     *  [ja][/ja]
     */
    onInfiniteScroll: PropTypes__default["default"].func,
    /**
     * @name onDeviceBackButton
     * @type function
     * @required false
     * @description
     *  [en]
     *  Custom handler for device back button.
     *  [/en]
     *  [ja][/ja]
     */
    onDeviceBackButton: PropTypes__default["default"].func
  };
  const NOOP = () => null;
  Page.defaultProps = {
    renderToolbar: NOOP,
    renderBottomToolbar: NOOP,
    renderModal: NOOP,
    renderFixed: NOOP
  };

  const deprecated$5 = {
    onCancel: 'onDialogCancel',
    isDisabled: 'disabled',
    isCancelable: 'cancelable'
  };
  const notAttributes$6 = ['onDeviceBackButton'];
  const Elem = onsCustomElement(baseDialog('ons-popover'), {
    deprecated: deprecated$5,
    notAttributes: notAttributes$6
  });

  /**
   * @original ons-popover
   * @category dialog
   * @tutorial react/Reference/popover
   * @description
   *   [en]
   *     A component that displays a popover next to an element. The popover can be used to display extra information about a component or a tooltip.
   *    Another common way to use the popover is to display a menu when a button on the screen is tapped.
   *   [/en]
   * [ja][/ja]
   * @example
   * <Page>
   *  <Button
   *    ref={(btn) => { this.btn = btn; }}
   *    onClick={() =>
   *      this.setState({target: this.btn, isOpen: true})
   *    }
   *  />
      <Popover
        isOpen={this.state.isOpen}
        onCancel={() => this.setState({isOpen: false})}
        getTarget={() => this.state.target}
      >
        <div style={{textAlign: 'center', opacity: 0.5}}>
          <p>This is a popover!</p>
            <p><small>Click the background to remove the popover.</small></p>
          </div>
          </Popover>
   * </Page>
   */
  const Popover = /*#__PURE__*/React__default["default"].forwardRef((props, forwardedRef) => {
    const {
      isOpen,
      getTarget,
      children,
      ...rest
    } = props;
    const ref = forwardedRef || React.useRef();
    React.useEffect(() => {
      if (isOpen !== ref.current.visible) {
        if (isOpen) {
          let target = getTarget();

          // if React ref was returned instead of DOM Element, use ref.current instead
          const isElement = x => x instanceof Element || x instanceof HTMLDocument;
          if (!isElement(target) && target.current) {
            target = target.current;
          }
          ref.current.show({
            target
          });
        } else {
          ref.current.hide();
        }
      }
    });
    return /*#__PURE__*/React__default["default"].createElement(Elem, _extends({
      ref: ref
    }, rest), children);
  });
  Popover.propTypes = {
    /**
     * @name getTarget
     * @type function
     * @required true
     * @description
     *  [en]
     *  This function should return a ref to the DOM node that the popover will target.
     *  [/en]
     *  [ja][/ja]
     */
    getTarget: PropTypes__default["default"].func.isRequired,
    /**
     * @name onDialogCancel
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called only if isCancelable is true. It will be called after tapping the background or by pressing the back button on Android devices.
     *  [/en]
     *  [ja][/ja]
     */
    onDialogCancel: PropTypes__default["default"].func,
    /**
     * @name onCancel
     * @type function
     * @required false
     * @description
     *  [en]
     *  DEPRECATED! Use `onDialogCancel` instead.
     *  [/en]
     *  [ja][/ja]
     */
    onCancel: PropTypes__default["default"].func,
    /**
     * @name isOpen
     * @type bool
     * @required true
     * @description
     *  [en]
     *  Indicates whether the dialog is open and shown.
     *  [/en]
     *  [ja][/ja]
     */
    isOpen: PropTypes__default["default"].bool.isRequired,
    /**
     * @name cancelable
     * @type bool
     * @required false
     * @description
     *  [en]
     *  Specifies whether the dialog is cancelable or not.
     *  A cancelable dialog will call onCancel  when tapping the background or or  pressing the back button on Android devices
     *  [/en]
     *  [ja][/ja]
     */
    cancelable: PropTypes__default["default"].bool,
    /**
     * @name isCancelable
     * @type bool
     * @required false
     * @description
     *  [en]
     *  DEPRECATED! Use `cancelable` instead.
     *  [/en]
     *  [ja][/ja]
     */
    isCancelable: PropTypes__default["default"].bool,
    /**
     * @name disabled
     * @type bool
     * @required false
     * @description
     *  [en]
     *  Specifies whether the dialog is disabled.
     *  [/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name isDisabled
     * @type bool
     * @required false
     * @description
     *  [en]
     *  DEPRECATED! Use `disabled` instead.
     *  [/en]
     *  [ja][/ja]
     */
    isDisabled: PropTypes__default["default"].bool,
    /**
     * @name animation
     * @type string
     * @required false
     * @description
     *  [en]
     *  The animation used when showing and hiding the dialog. Can be either `"none"` or `"default"`.
     *  [/en]
     *  [ja][/ja]
     */
    animation: PropTypes__default["default"].string,
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the dialog.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name maskColor
     * @type string
     * @required false
     * @description
     *  [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)"[/en]
     *  [ja][/ja]
     */
    maskColor: PropTypes__default["default"].string,
    /**
     * @name animationOptions
     * @type object
     * @required false
     * @description
     *  [en]Specify the animation's duration, delay and timing. E.g.  `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
     *  [ja][/ja]
     */
    animationOptions: PropTypes__default["default"].object,
    /**
     * @name onPreShow
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called just before the alert dialog is displayed.
     *  [/en]
     *  [ja][/ja]
     */
    onPreShow: PropTypes__default["default"].func,
    /**
     * @name onPostShow
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called just after the alert dialog is displayed.
     *  [/en]
     *  [ja][/ja]
     */
    onPostShow: PropTypes__default["default"].func,
    /**
     * @name onPreHide
     * @type function
     * @required false
     * @description
     *  [en]Called just before the alert dialog is hidden.[/en]
     *  [ja][/ja]
     */
    onPreHide: PropTypes__default["default"].func,
    /**
     * @name onPostHide
     * @type function
     * @required false
     * @description
     *  [en]Called just after the alert dialog is hidden.[/en]
     *  [ja][/ja]
     */
    onPostHide: PropTypes__default["default"].func,
    /**
     * @name onDeviceBackButton
     * @type function
     * @required false
     * @description
     *  [en]
     *  Custom handler for device back button.
     *  [/en]
     *  [ja][/ja]
     */
    onDeviceBackButton: PropTypes__default["default"].func
  };

  /**
   * @original ons-progress-bar
   * @category visual
   * @tutorial react/Reference/progress
   * @description
   * [en] The component is used to display a linear progress bar. It can either display a progress bar that shows the user how much of a task has been completed. In the case where the percentage is not known it can be used to display an animated progress bar so the user can see that an operation is in progress.  [/en]
   * [ja][/ja]
   * @example
   *<ProgressBar value={55} secondaryValue={87} />
   *<ProgressBar indeterminate />
   */
  const ProgressBar = onsCustomElement('ons-progress-bar');
  ProgressBar.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the progress indicator.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name value
     * @type number
     * @description
     *  [en]
     *  Current progress. Should be a value between 0 and 100.
     *  [/en]
     *  [ja][/ja]
     */
    value: PropTypes__default["default"].number,
    /**
     * @name secondaryValue
     * @type bool
     * @description
     *  [en]
     *  Current secondary progress. Should be a value between 0 and 100.
     *  [/en]
     *  [ja][/ja]
     */
    secondaryValue: PropTypes__default["default"].number,
    /**
     * @name indeterminate
     * @type bool
     * @description
     *  [en] If this property is set, an infinite looping animation will be shown. [/en]
     *  [ja][/ja]
     */
    indeterminate: PropTypes__default["default"].bool
  };

  /**
   * @original ons-progress-circular
   * @category visual
   * @tutorial react/Reference/progress-circular
   * @description
   * [en] This component displays a circular progress indicator. It can either be used to show how much of a task has been completed or to show a looping animation to indicate that an operation is currently running.
   * [/en]
   * [ja][/ja]
   * @example
   *<ProgressCircular value={55} secondaryValue={87} />
   *<ProgressCircular indeterminate />
   */
  const ProgressCircular = onsCustomElement('ons-progress-circular');
  ProgressCircular.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the progress indicator.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name value
     * @type number
     * @description
     *  [en]
     *  Current progress. Should be a value between 0 and 100.
     *  [/en]
     *  [ja][/ja]
     */
    value: PropTypes__default["default"].number,
    /**
     * @name secondaryValue
     * @type bool
     * @description
     *  [en]
     *  Current secondary progress. Should be a value between 0 and 100.
     *  [/en]
     *  [ja][/ja]
     */
    secondaryValue: PropTypes__default["default"].number,
    /**
     * @name indeterminate
     * @type bool
     * @description
     *  [en] If this property is set, an infinite looping animation will be shown. [/en]
     *  [ja][/ja]
     */
    indeterminate: PropTypes__default["default"].bool
  };

  const deprecated$4 = {
    onLoad: 'onAction',
    onChange: 'onChangeState'
  };
  const notAttributes$5 = ['onAction'];

  /**
   * @original ons-pull-hook
   * @category control
   * @tutorial react/Reference/pull-hook
   * @description
   * [en]  Component that adds **Pull to refresh** functionality to an `<ons-page>` element.
   *     It can be used to perform a task when the user pulls down at the top of the page. A common usage is to refresh the data displayed in a page.
   [/en]
   * [ja][/ja]
   * @example

      return (
        <PullHook onChange={this.onChange} onLoad={this.onLoad}>
        {
         (this.state.pullHookState === 'initial') ?
          <span >
            <Icon size={35} spin={false} icon='ion-arrow-down-a' />
            Pull down to refresh
          </span> :
          (this.state.pullHookState === 'preaction') ?
           <span>
             <Icon size={35} spin={false} icon='ion-arrow-up-a' />
             Release to refresh
          </span>
          :
          <span><Icon size={35} spin={true} icon='ion-load-d'></Icon> Loading data...</span>
      }
        </PullHook>
      );
   */
  const PullHook = onsCustomElement('ons-pull-hook', {
    deprecated: deprecated$4,
    notAttributes: notAttributes$5
  });
  PullHook.propTypes = {
    /**
     * @name onChangeState
     * @type function
     * @required false
     * @description
     *  [en]Called when the pull hook inner state is changed. The state can be either "initial", "preaction" or "action"[/en]
     *  [ja][/ja]
     */
    onChangeState: PropTypes__default["default"].func,
    /**
     * @name onChange
     * @type function
     * @required false
     * @description
     *  [en]DEPRECATED! Use `onChangeState` instead.[/en]
     *  [ja][/ja]
     */
    onChange: PropTypes__default["default"].func,
    /**
     * @name onAction
     * @type function
     * @required false
     * @description
     *  [en]Called when the pull hook is in the `action` state[/en]
     *  [ja][/ja]
     */
    onAction: PropTypes__default["default"].func,
    /**
     * @name onLoad
     * @type function
     * @required false
     * @description
     *  [en]DEPRECATED! Use `onAction` instead.[/en]
     *  [ja][/ja]
     */
    onLoad: PropTypes__default["default"].func,
    /**
     * @name onPull
     * @type function
     * @required false
     * @description
     *  [en]Hook called whenever the user pulls the element. It gets the pulled distance ratio (scroll / height) and an animationOptions object as arguments.[/en]
     *  [ja][/ja]
     */
    onPull: PropTypes__default["default"].func,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en] When set to true, the pull hook will be disabled.[/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name height
     * @type number
     * @description
     *  [en] The height of the pull hook in pixels. The default value is 64.[/en]
     *  [ja][/ja]
     */
    height: PropTypes__default["default"].number,
    /**
     * @name thresholdHeight
     * @type number
     * @description
     *  [en] The threshold height of the pull hook in pixels. The default value is 96.[/en]
     *  [ja][/ja]
     */
    thresholdHeight: PropTypes__default["default"].number,
    /**
     * @name fixedContent
     * @type number
     * @description
     *  [en] If set to true, the content of the page will not move when pulling.[/en]
     *  [ja][/ja]
     */
    fixedContent: PropTypes__default["default"].bool
  };

  const nameMap$4 = {
    ...INPUT_PROPS
  };
  const withDefaultChecked$1 = component => oneTimeProp(component, 'defaultChecked', 'checked');

  /**
   * @original ons-radio
   * @category form
   * @tutorial react/Reference/radio
   * @description
   * [en]
   *  A radio button element. The component will automatically render as a Material Design radio button on Android devices.
   *
   *  Most attributes that can be used for a normal `<input type="radio">` element can also be used on the `<Radio>` component.
   * [/en]
   * [ja][/ja]
   * @example
   * <Radio
   *   onChange={event => { this.setState({checked: event.target.checked})} }
   *   modifier='material' />
   */
  const Radio = withDefaultChecked$1(onsCustomElement('ons-radio', {
    deprecated: nameMap$4
  }));
  Radio.propTypes = {
    /**
     * @name name
     * @type string
     * @description
     *  [en]The name of the radio button.[/en]
     *  [ja][/ja]
     */
    name: PropTypes__default["default"].string,
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the radio button.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en]
     *  Specifies whether the radio button is disabled.
     *  [/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name onChange
     * @type function
     * @description
     *  [en] Called when the radio button state changes.[/en]
     *  [ja][/ja]
     */
    onChange: PropTypes__default["default"].func,
    /**
     * @name value
     * @type string
     * @description
     *  [en] Value of the radio button.[/en]
     *  [ja][/ja]
     */
    value: PropTypes__default["default"].oneOfType([PropTypes__default["default"].string, PropTypes__default["default"].instanceOf(Date)]),
    /**
     * @name checked
     * @type boolean
     * @description
     *  [en]Controls the state of the radio button (controlled).[/en]
     *  [ja][/ja]
     */
    checked: PropTypes__default["default"].bool,
    /**
     * @name defaultChecked
     * @type boolean
     * @description
     *  [en]Defined the state of the radio button at first render for uncontrolled inputs.[/en]
     *  [ja][/ja]
     */
    defaultChecked: PropTypes__default["default"].bool,
    /**
     * @name inputId
     * @type string
     * @description
     *  [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using <label for="..."> elements.[/en]
     *  [ja][/ja]
     */
    inputId: PropTypes__default["default"].string
  };

  const nameMap$3 = {
    ...INPUT_PROPS
  };
  const withDefaultValue$2 = component => oneTimeProp(component, 'defaultValue', 'value');

  /**
   * @original ons-range
   * @category form
   * @tutorial react/Reference/range
   * @description
   * [en]
   *   Range input component.
   * [/en]
   * [ja][/ja]
   * @example
   * <Range modifier="material"
   *   value={this.state.value}
   *   onChange={(event) => this.setState({value: parseInt(event.target.value)})}
   *   />
   */
  const Range = withDefaultValue$2(onsCustomElement('ons-range', {
    deprecated: nameMap$3
  }));
  Range.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the progress indicator.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name onChange
     * @type function
     * @description
     *  [en] Called when the value of the input changes.[/en]
     *  [ja][/ja]
     */
    onChange: PropTypes__default["default"].func,
    /**
     * @name onInput
     * @type function
     * @description
     *  [en] Called when the inner range fires an `input` event.[/en]
     *  [ja][/ja]
     */
    onInput: PropTypes__default["default"].func,
    /**
     * @name value
     * @type number
     * @description
     *  [en]
     *  Current value of the element.
     *  [/en]
     *  [ja][/ja]
     */
    value: PropTypes__default["default"].number,
    /**
     * @name value
     * @type number
     * @description
     *  [en]
     *  Default value of the element (for uncontrolled components).
     *  [/en]
     *  [ja][/ja]
     */
    defaultValue: PropTypes__default["default"].number,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en] If true, the element is disabled. [/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool
  };

  /**
   * @original ons-ripple
   * @category visual
   * @tutorial react/Reference/ripple
   * @description
   * [en]
   *   Adds a Material Design "ripple" effect to an element.
   * [/en]
   * [ja][/ja]
   * @example
     <div className='myList'>
       <Ripple color='red' />
     </div>
   */
  const Ripple = onsCustomElement('ons-ripple');
  Ripple.propTypes = {
    /**
     * @name color
     * @type string
     * @required false
     * @description
     *  [en]Color of the ripple effect.[/en]
     *  [ja][/ja]
     */
    color: PropTypes__default["default"].string,
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the ripple effect.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name background
     * @type string
     * @required false
     * @description
     *  [en]Color of the background.[/en]
     *  [ja][/ja]
     */
    background: PropTypes__default["default"].string,
    /**
     * @name size
     * @type string
     * @required false
     * @description
     *  [en]Sizing of the wave on ripple effect. Set "cover" or "contain". Default is "cover".[/en]
     *  [ja][/ja]
     */
    size: PropTypes__default["default"].string,
    /**
     * @name size
     * @type string
     * @required false
     * @description
     *  [en]Changes the position of wave effect to center of the target element.[/en]
     *  [ja][/ja]
     */
    center: PropTypes__default["default"].bool,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en]
     *  Specifies whether the button is disabled.
     *  [/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool
  };

  const Element$4 = onsCustomElement('ons-navigator');
  class RouterNavigatorClass extends React__default["default"].Component {
    constructor() {
      super(...arguments);
      this.cancelUpdate = false;
      const callback = (name, event) => {
        if (this.props[name]) {
          return this.props[name](event);
        }
      };
      this.onPrePush = callback.bind(this, 'onPrePush');
      this.onPostPush = callback.bind(this, 'onPostPush');
      this.onPrePop = callback.bind(this, 'onPrePop');
      this.onPostPop = callback.bind(this, 'onPostPop');
      this.ref = /*#__PURE__*/React__default["default"].createRef();
      this.state = {
        internalStack: []
      };
    }
    update(cb) {
      if (!this.cancelUpdate) {
        this.setState({}, cb);
      }
    }

    /**
     * @method resetPageStack
     * @signature resetPageStack(route, options = {})
     * @param {Array} [routes]
     *   [en] The routes that the navigator should be reset to.[/en]
     *   [ja][/ja]
     * @return {Promise}
     *   [en]Promise which resolves to the revealed page.[/en]
     *   [ja]明らかにしたページを解決するPromiseを返します。[/ja]
     * @description
     *   [en] Resets the navigator to the current page stack[/en]
     *   [ja][/ja]
     */
    resetPageStack(routes) {
      let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      if (this.isRunning()) {
        return;
      }
      const update = () => {
        return new Promise(resolve => {
          this.setState({
            internalStack: [...this.state.internalStack, routes[routes.length - 1]]
          }, resolve);
        });
      };
      return this.ref.current._pushPage(options, update).then(() => {
        this.setState({
          internalStack: [...routes]
        });
      });
    }

    /**
     * @method pushPage
     * @signature pushPage(route, options = {})
     * @param {Array} [routes]
     *   [en] The routes that the navigator should push to.[/en]
     *   [ja][/ja]
     * @return {Promise}
     *   [en] Promise which resolves to the revealed page.[/en]
     *   [ja]明らかにしたページを解決するPromiseを返します。[/ja]
     * @description
     *   [en] Pushes a page to the page stack[/en]
     *   [ja][/ja]
     */
    pushPage(route) {
      let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      if (this.isRunning()) {
        return;
      }
      const update = () => {
        return new Promise(resolve => {
          this.setState({
            internalStack: [...this.state.internalStack, route]
          }, resolve);
        });
      };
      return this.ref.current._pushPage(options, update);
    }
    isRunning() {
      return this.ref.current._isRunning;
    }

    /*
     * @method replacePage
     * @signature replacePage(page, [options])
     * @return {Promise}
     *   [en]Promise which resolves to the new page.[/en]
     *   [ja]新しいページを解決するPromiseを返します。[/ja]
     * @description
     *   [en]Replaces the current top page with the specified one. Extends `pushPage()` parameters.[/en]
     *   [ja]現在表示中のページをを指定したページに置き換えます。[/ja]
     */
    replacePage(route) {
      let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      if (this.isRunning()) {
        return;
      }
      const update = () => {
        return new Promise(resolve => {
          this.setState({
            internalStack: [...this.state.internalStack, route]
          }, resolve);
        });
      };
      return this.ref.current._pushPage(options, update).then(() => {
        this.setState({
          internalStack: [...this.state.internalStack.slice(0, -2), route]
        });
      });
    }

    /**
     * @method popPage
     * @signature popPage(route, options = {})
     * @return {Promise}
     *   [en] Promise which resolves to the revealed page.[/en]
     *   [ja]明らかにしたページを解決するPromiseを返します。[/ja]
     * @description
     *   [en] Pops a page out of the page stack[/en]
     *   [ja][/ja]
     */
    popPage() {
      let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
      if (this.isRunning()) {
        return;
      }
      const update = () => {
        return new Promise(resolve => {
          ReactDOM__default["default"].flushSync(() => {
            // prevents flickering caused by React 18 batching
            this.setState({
              internalStack: this.state.internalStack.slice(0, -1)
            }, resolve);
          });
        });
      };
      return this.ref.current._popPage(options, update);
    }
    _onDeviceBackButton(event) {
      if (this.props.routeConfig.routeStack.length > 1) {
        this.popPage();
      } else {
        event.callParentHandler();
      }
    }
    componentDidMount() {
      const node = this.ref.current;
      this.cancelUpdate = false;
      node.addEventListener('prepush', this.onPrePush);
      node.addEventListener('postpush', this.onPostPush);
      node.addEventListener('prepop', this.onPrePop);
      node.addEventListener('postpop', this.onPostPop);
      if (!this.props.routeConfig) {
        throw new Error('In RouterNavigator the property routeConfig needs to be set');
      }
      node.swipeMax = this.props.swipePop;
      node.onDeviceBackButton = this.props.onDeviceBackButton || this._onDeviceBackButton.bind(this);
      this.setState({
        internalStack: this.props.routeConfig.routeStack
      });
    }
    componentWillUnmount() {
      const node = this.ref.current;
      node.removeEventListener('prepush', this.onPrePush);
      node.removeEventListener('postpush', this.onPostPush);
      node.removeEventListener('prepop', this.onPrePop);
      node.removeEventListener('postpop', this.onPostPop);
      this.cancelUpdate = true;
    }
    componentDidUpdate(prevProps) {
      if (this.props.onDeviceBackButton !== undefined) {
        this.ref.current.onDeviceBackButton = this.props.onDeviceBackButton;
      }
      const processStack = [...this.props.routeConfig.processStack];

      /**
       * Fix for Redux Timetravel.
       */
      if (prevProps.routeConfig.processStack.length < this.props.routeConfig.processStack.length && prevProps.routeConfig.routeStack.length > this.props.routeConfig.routeStack.length) {
        return;
      }
      if (processStack.length > 0) {
        const {
          type,
          route,
          options
        } = processStack[0];
        switch (type) {
          case 'push':
            this.pushPage(route, options);
            break;
          case 'pop':
            this.popPage(options);
            break;
          case 'reset':
            if (Array.isArray(route)) {
              this.resetPageStack(route, options);
            } else {
              this.resetPageStack([route], options);
            }
            break;
          case 'replace':
            this.replacePage(route, options);
            break;
          default:
            throw new Error(`Unknown type ${type} in processStack`);
        }
      }
    }
    render() {
      const {
        innerRef,
        renderPage,
        // these props should not be passed down
        onPrePush,
        onPostPush,
        onPrePop,
        onPostPop,
        swipePop,
        onDeviceBackButton,
        ...rest
      } = this.props;
      const pagesToRender = this.state.internalStack.map(route => renderPage(route));
      if (innerRef && innerRef !== this.ref) {
        this.ref = innerRef;
      }
      return /*#__PURE__*/React__default["default"].createElement(Element$4, _extends({}, rest, {
        ref: this.ref
      }), pagesToRender);
    }
  }

  /**
   * @original ons-navigator
   * @category navigation
   * @tutorial react/Reference/navigator
   * @description
   * [en] This component is a variant of the Navigator with a declarative API. In order to manage to display the pages, the  navigator needs to define the `renderPage` method, that takes an route and a navigator and  converts it to an page.[/en]
   * [ja][/ja]
   */
  const RouterNavigator = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(RouterNavigatorClass, _extends({
    innerRef: ref
  }, props), props.children));
  RouterNavigator.propTypes = {
    /**
     * @name renderPage
     * @type function
     * @required true
     * @defaultValue null
     * @description
     *  [en] This function takes the current route object as a parameter and returns a react componen.[/en]
     *  [ja][/ja]
     */
    renderPage: PropTypes__default["default"].func.isRequired,
    /**
     * @name routeConfig
     * @type object
     * @required true
     * @defaultValue null
     * @description
     *  [en] This object must contain two properties:
     *  `routeStack`: An array of route objects,
     *  `processStack`: An array of process objects `{ type: push | pop | reset, route: userRoute }` that
     *  describe the transition from the current state to the next state.
     *  Make sure that the route stack is not emptied before the animations for the `processStack` have completed.
     *  It is recommended to update the `routeStack` and empty the `processStack` in the 'onPostPop' callback.
     *  [/en]
     *  [ja][/ja]
     */
    routeConfig: PropTypes__default["default"].shape({
      routeStack: PropTypes__default["default"].arrayOf(PropTypes__default["default"].object),
      processStack: PropTypes__default["default"].arrayOf(PropTypes__default["default"].object)
    }),
    /**
     * @name onPrePush
     * @type function
     * @required false
     * @description
     *  [en]Called just before a page is pushed.[/en]
     */
    onPrePush: PropTypes__default["default"].func,
    /**
     * @name onPostPush
     * @type function
     * @required false
     * @description
     *  [en]Called just after a page is pushed.[/en]
     */
    onPostPush: PropTypes__default["default"].func,
    /**
     * @name onPrePop
     * @type function
     * @required false
     * @description
     *  [en]Called just before a page is popped.[/en]
     */
    onPrePop: PropTypes__default["default"].func,
    /**
     * @name onPostPop
     * @type function
     * @required false
     * @description
     *  [en]Called just after a page is popped.[/en]
     */
    onPostPop: PropTypes__default["default"].func,
    /**
     * @property animation
     * @type {String}
     * @description
     *   [en]
     *     Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
     *     These are platform based animations. For fixed animations, add `"-ios"` or `"-md"` suffix to the animation name. E.g. `"lift-ios"`, `"lift-md"`. Defaults values are `"slide-ios"` and `"fade-md"`.
     *   [/en]
     */
    animation: PropTypes__default["default"].string,
    /**
     * @name animationOptions
     * @type object
     * @description
     *  [en]Specify the animation's duration, delay and timing. E.g.  `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
     *  [ja][/ja]
     */
    animationOptions: PropTypes__default["default"].object,
    /**
     * @name swipeable
     * @type bool|string
     * @required false
     * @description
     *  [en]
     *  Enables swipe-to-pop functionality for iOS.
     *  [/en]
     *  [ja][/ja]
     */
    swipeable: PropTypes__default["default"].oneOfType([PropTypes__default["default"].bool, PropTypes__default["default"].string]),
    /**
     * @name swipePop
     * @type function
     * @required false
     * @description
     *  [en]
     *  Function called on swipe-to-pop. Must perform a popPage with the given options object.
     *  [/en]
     *  [ja][/ja]
     */
    swipePop: PropTypes__default["default"].func,
    /**
     * @name onDeviceBackButton
     * @type function
     * @required false
     * @description
     *  [en]
     *  Custom handler for device back button.
     *  [/en]
     *  [ja][/ja]
     */
    onDeviceBackButton: PropTypes__default["default"].func
  };

  /**
   * @original ons-row
   * @category grid
   * @description
   * [en]
   * Represents a row in the grid system. Use with `Col` to layout components.
   * [/en]
   * [ja][/ja]
   * <Row>
   *   <Col width={50}>
    *   <ons-icon icon="fa-twitter"></ons-icon>
   *   </Col>
   *   <Col>Text</Col>
   * </Row>
   */
  const Row = onsCustomElement('ons-row');
  Row.propTypes = {
    /**
    * @name verticalAlign
    * @type {String}
    * @description
    *   [en]Short hand attribute for aligning vertically. Valid values are top, bottom, and center.[/en]
    *   [ja][/ja]
    */
    verticalAlign: PropTypes__default["default"].oneOf(['top', 'bottom', 'center'])
  };

  const nameMap$2 = {
    ...INPUT_PROPS
  };
  const withDefaultValue$1 = component => oneTimeProp(component, 'defaultValue', 'value');
  const notAttributes$4 = ['value' // value must be applied as property since attribute only works before input is touched
  ];

  /**
   * @original ons-search-input
   * @category form
   * @tutorial react/Reference/search-input
   * @description
   * [en]
   *  A search input component. The component will automatically render as a Material Design search input on Android devices.
   *
   *  Most attributes that can be used for a normal `<input>` element can also be used on the `<SearchInput>` component.
   * [/en]
   * [ja][/ja]
   * @example
   * <SearchInput
   *   value={this.state.text}
   *   onChange={(event) => { this.setState({text: event.target.value})} }
   *   modifier='material'
   *   placeholder='Username' />
   */
  const SearchInput = withDefaultValue$1(onsCustomElement('ons-search-input', {
    deprecated: nameMap$2,
    notAttributes: notAttributes$4
  }));
  SearchInput.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the input.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en]Specifies whether the input is disabled.[/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name readOnly
     * @type bool
     * @description
     *  [en]Specifies whether the input is read-only.[/en]
     *  [ja][/ja]
     */
    readOnly: PropTypes__default["default"].bool,
    /**
     * @name onChange
     * @type function
     * @description
     *  [en]Called when the inner input fires a `change` event.[/en]
     *  [ja][/ja]
     */
    onChange: PropTypes__default["default"].func,
    /**
     * @name onInput
     * @type function
     * @description
     *  [en]Called when the inner input fires an `input` event.[/en]
     *  [ja][/ja]
     */
    onInput: PropTypes__default["default"].func,
    /**
     * @name value
     * @type string
     * @description
     *  [en]Content of the input (controlled).[/en]
     *  [ja][/ja]
     */
    value: PropTypes__default["default"].oneOfType([PropTypes__default["default"].string, PropTypes__default["default"].instanceOf(Date)]),
    /**
     * @name defaultValue
     * @type string
     * @description
     *  [en]Content of the input at first render (uncontrolled).[/en]
     *  [ja][/ja]
     */
    defaultValue: PropTypes__default["default"].oneOfType([PropTypes__default["default"].string, PropTypes__default["default"].instanceOf(Date)]),
    /**
     * @name placeholder
     * @type string
     * @description
     *  [en] Placeholder text. In Material Design this placeholder will be a floating label. [/en]
     *  [ja][/ja]
     */
    placeholder: PropTypes__default["default"].string,
    /**
     * @name inputId
     * @type string
     * @description
     *  [en]  Specify the "id" attribute of the inner `<input>` element. This is useful when using <label for="..."> elements [/en]
     *  [ja][/ja]
     */
    inputId: PropTypes__default["default"].string
  };

  const deprecated$3 = {
    index: 'activeIndex'
  };

  /**
   * @original ons-segment
   * @category control
   * @tutorial react/Reference/segment
   * @description
   * [en]
   *   Segment component.
   * [/en]
   * [ja][/ja]
   * @example
   * <Segment modifier="material">
   *  <button>Label 1</button>
   *  <button>Label 2</button>
   *  <button>Label 3</button>
   * </Segment>
   */
  const Segment = onsCustomElement('ons-segment', {
    deprecated: deprecated$3
  });
  Segment.propTypes = {
    /**
     * @name activeIndex
     * @type number
     * @description
     *  [en]The index of the button to highlight.[/en]
     *  [ja][/ja]
     */
    activeIndex: PropTypes__default["default"].number,
    /**
     * @name index
     * @type number
     * @description
     *  [en]DEPRECATED! Use `activeIndex` instead.[/en]
     *  [ja][/ja]
     */
    index: PropTypes__default["default"].number,
    /**
     * @name tabbarId
     * @type string
     * @description
     *  [en] ID of the `<Tabbar>` to "connect" to the segment. [/en]
     *  [ja][/ja]
     */
    tabbarId: PropTypes__default["default"].string,
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the segment.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name onPostChange
     * @type function
     * @description
     *  [en] Called after the active button changes.[/en]
     *  [ja][/ja]
     */
    onPostChange: PropTypes__default["default"].func,
    /**
     * @name disabled
     * @type boolean
     * @description
     *   [en]Specifies whether the segment should be disabled.[/en]
     *   [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool
  };

  const nameMap$1 = {
    ...INPUT_PROPS
  };
  const withDefaultValue = component => oneTimeProp(component, 'defaultValue', 'value');
  const Element$3 = withDefaultValue(onsCustomElement('ons-select', {
    deprecated: nameMap$1
  }));

  /**
   * @original ons-select
   * @category form
   * @tutorial react/Reference/select
   * @description
   * [en]
   *   Select input component.
   * [/en]
   * [ja][/ja]
   * @example
   * <Select modifier="material"
   *   value={this.state.value}
   *   onChange={(event) => this.setState({value: event.target.value})}>
   *   <option value="1">1</option>
   *   <option value="2">2nd</option>
   *   <option value="3">3rd option</option>
   * </Select>
   */
  const Select = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(Element$3, _extends({}, props, {
    ref: ref
  }), /*#__PURE__*/React__default["default"].createElement("select", null, props.children)));
  Select.propTypes = {
    /**
     * @name modifier
     * @type string
     * @description
     *  [en]The appearance of the select box.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en]Specifies whether the select is disabled.[/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name onChange
     * @type function
     * @description
     *  [en]Called when the value of the select changes.[/en]
     *  [ja][/ja]
     */
    onChange: PropTypes__default["default"].func,
    /**
     * @name value
     * @type string
     * @description
     *  [en]Use this prop to set the selected option value.[/en]
     *  [ja][/ja]
     */
    value: PropTypes__default["default"].string,
    /**
     * @name defaultValue
     * @type string
     * @description
     *  [en]Use this prop to set the defalut selected option value (uncontrolled components).[/en]
     *  [ja][/ja]
     */
    defaultValue: PropTypes__default["default"].string,
    /**
     * @name multiple
     * @type boolean
     * @description
     *  [en]If this attribute is defined, multiple options can be selected at once.[/en]
     *  [ja][/ja]
     */
    multiple: PropTypes__default["default"].bool,
    /**
     * @name autofocus
     * @type boolean
     * @description
     *  [en]Element automatically gains focus on page load.[/en]
     *  [ja][/ja]
     */
    autofocus: PropTypes__default["default"].bool,
    /**
     * @name required
     * @type boolean
     * @description
     *  [en]Make the select input required for submitting the form it is part of.[/en]
     *  [ja][/ja]
     */
    required: PropTypes__default["default"].bool,
    /**
     * @name form
     * @type string
     * @description
     *  [en]Associate a select element to an existing form on the page, even if not nested.[/en]
     *  [ja][/ja]
     */
    form: PropTypes__default["default"].string,
    /**
     * @name size
     * @type number
     * @description
     *  [en]How many options are displayed; if there are more than the size then a scroll appears to navigate them[/en]
     *  [ja][/ja]
     */
    size: PropTypes__default["default"].number,
    /**
     * @name name
     * @type string
     * @description
     *  [en]Name the select element, useful for instance if it is part of a form.[/en]
     *  [ja][/ja]
     */
    name: PropTypes__default["default"].string
  };

  /**
   * @original ons-speed-dial
   * @category control
   * @tutorial react/Reference/speed-dial
   * @description
   * [en] Element that displays a Material Design Speed Dialog component. It is useful when there are more than one primary action that can be performed in a page.
   *  The Speed dial looks like a `Fab` element but will expand a menu when tapped.
   [/en]
   * [ja][/ja]
   * @example
   * <SpeedDial disabled={false} direction='right' onClick={() => console.log('test1')} position='left bottom'>
       <Fab>
         <Icon icon='fa-twitter' size={26} fixedWidth={false} style={{verticalAlign: 'middle'}} />
       </Fab>
       <SpeedDialItem onClick={() => console.log('speed A')}> A </SpeedDialItem>
       <SpeedDialItem onClick={() => console.log('speed B')}> B </SpeedDialItem>
       <SpeedDialItem onClick={() => console.log('speed C')}> C </SpeedDialItem>
       <SpeedDialItem onClick={() => console.log('speed D')}> D </SpeedDialItem>
     </SpeedDial>
   */
  const SpeedDial = onsCustomElement('ons-speed-dial');
  SpeedDial.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the speed dial.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name position
     * @type string
     * @description
     *  [en]Specify the vertical and horizontal position of the component.
     *     I.e. to display it in the top right corner specify "right top".
     *     Choose from "right", "left", "top" and "bottom".
    [/en]
     *  [ja][/ja]
     */
    position: PropTypes__default["default"].string,
    /**
     * @name direction
     * @type string
     * @description
     *  [en]Specify the direction the items are displayed. Possible values are "up", "down", "left" and "right".[/en]
     *  [ja][/ja]
     */
    direction: PropTypes__default["default"].oneOf(['up', 'down', 'left', 'right']),
    /**
     * @name disabled
     * @type string
     * @description
     *  [en]Specify if button should be disabled.[/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool
  };

  /**
   * @original ons-speed-dial-item
   * @category control
   * @tutorial react/Reference/speed-dial
   * @description
   * [en] This component displays the child elements of the Material Design Speed dial component. [/en]
   * [ja][/ja]
   * @example
   * <SpeedDial disabled={false} direction='right' onClick={() => console.log('test1')} position='left bottom'>
       <Fab>
         <Icon icon='fa-twitter' size={26} fixedWidth={false} style={{verticalAlign: 'middle'}} />
       </Fab>
       <SpeedDialItem onClick={() => console.log('speed A')}> A </SpeedDialItem>
       <SpeedDialItem onClick={() => console.log('speed B')}> B </SpeedDialItem>
       <SpeedDialItem onClick={() => console.log('speed C')}> C </SpeedDialItem>
       <SpeedDialItem onClick={() => console.log('speed D')}> D </SpeedDialItem>
     </SpeedDial>
   */
  const SpeedDialItem = onsCustomElement('ons-speed-dial-item');
  SpeedDialItem.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the button.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name onClick
     * @type function
     * @description
     *  [en]This function will be called when the button is clicked.[/en]
     *  [ja][/ja]
     */
    onClick: PropTypes__default["default"].func
  };

  const notAttributes$3 = ['onDeviceBackButton'];

  /**
   * @original ons-splitter
   * @category menu
   * @tutorial react/Reference/splitter
   * @description
   * [en]  A component that enables responsive layout by implementing both a two-column layout and a sliding menu layout.
   *
   *    It can be configured to automatically expand into a column layout on large screens and collapse the menu on smaller screens. When the menu is collapsed the user can open it by swiping.
   [/en]
   * [ja][/ja]
   * @example
    <Splitter>
      <SplitterSide
        side="left"
        width={200}
        isSwipeable={true}>
        <Page> Page Left </Page>
      </SplitterSide>
      <SplitterContent>
        <Page> Page Content </Page>
      </SplitterContent>
      <SplitterSide
        side="right"
        width={300}
        collapse={!this.state.showRight}
        isOpen={this.state.openRight}
        onClose={this.handleRightClose.bind(this)}
        onOpen={this.handleRightOpen.bind(this)}
        isSwipeable={true}>
        <Page> Page Right </Page>
      </SplitterSide>
    </Splitter>
   */
  const Splitter = onsCustomElement('ons-splitter', {
    notAttributes: notAttributes$3
  });
  Splitter.propTypes = {
    /**
     * @name onDeviceBackButton
     * @type function
     * @required false
     * @description
     *  [en]
     *  Custom handler for device back button.
     *  [/en]
     *  [ja][/ja]
     */
    onDeviceBackButton: PropTypes__default["default"].func
  };

  /**
   * @original ons-splitter-content
   * @category menu
   * @tutorial react/Reference/splitter
   * @description
   * [en]  The SplitterContent  element is used as a child element of Splitter.
   *    It contains the main content of the page while SplitterSide contains the list.
   [/en]
   * [ja][/ja]
   * @example
    <Splitter>
      <SplitterSide
        side="left"
        width={200}
        isSwipeable={true}>
        <Page> Page Left </Page>
      </SplitterSide>
      <SplitterContent>
        <Page> Page Content </Page>
      </SplitterContent>
      <SplitterSide
        side="right"
        width={300}
        collapse={!this.state.showRight}
        isOpen={this.state.openRight}
        onClose={this.handleRightClose.bind(this)}
        onOpen={this.handleRightOpen.bind(this)}
        isSwipeable={true}>
        <Page> Page Right </Page>
      </SplitterSide>
    </Splitter>
   */
  const SplitterContent = onsCustomElement('ons-splitter-content');

  /**
   * @original ons-splitter-mask
   * @category menu
   * @tutorial react/Reference/splitter
   * @description
   * [en]  The SplitterMask  element is used as a child element of Splitter.
   *    It contains the mask content of the page.
   [/en]
   * [ja][/ja]
   * @example
    <Splitter>
      <SplitterSide
        side="left"
        width={200}
        isSwipeable={true}>
        <Page> Page Left </Page>
      </SplitterSide>
      <SplitterMask>
        <Page> Page Content </Page>
      </SplitterMask>
      <SplitterSide
        side="right"
        width={300}
        collapse={!this.state.showRight}
        isOpen={this.state.openRight}
        onClose={this.handleRightClose.bind(this)}
        onOpen={this.handleRightOpen.bind(this)}
        isSwipeable={true}>
        <Page> Page Right </Page>
      </SplitterSide>
    </Splitter>
   */
  const SplitterMask = onsCustomElement('ons-splitter-mask');

  const deprecated$2 = {
    onOpen: 'onPostOpen',
    onClose: 'onPostClose'
  };
  const notAttributes$2 = ['isOpen'];
  const Element$2 = onsCustomElement('ons-splitter-side', {
    deprecated: deprecated$2,
    notAttributes: notAttributes$2
  });

  /**
   * @original ons-splitter-side
   * @category menu
   * @tutorial react/Reference/splitter
   * @description
   * [en]  The SplitterContent  element is used as a child element of Splitter.
   *    It contains the main content of the page while SplitterSide contains the list.
   [/en]
   * [ja][/ja]
   * @example
    <Splitter>
      <SplitterSide
        side="left"
        width={200}
        swipeable={true}>
        <Page> Page Left </Page>
      </SplitterSide>
      <SplitterContent>
        <Page> Page Content </Page>
      </SplitterContent>
      <SplitterSide
        side="right"
        width={300}
        collapse={!this.state.showRight}
        isOpen={this.state.openRight}
        onClose={this.handleRightClose.bind(this)}
        onOpen={this.handleRightOpen.bind(this)}
        swipeable={true}>
        <Page> Page Right </Page>
      </SplitterSide>
    </Splitter>
   */
  const SplitterSide = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
    const {
      width,
      ...rest
    } = props;

    // number values for width are deprecated but handle them safely to avoid breaking user code
    const realWidth = typeof width === 'number' ? `${width}px` : width;
    return /*#__PURE__*/React__default["default"].createElement(Element$2, _extends({
      width: realWidth,
      ref: ref
    }, rest), props.children);
  });
  SplitterSide.propTypes = {
    /**
     * @name collapse
     * @type string
     * @description
     *  [en] Specify the collapse behavior. Valid values are `"portrait"`, `"landscape"` or a media query.
     *     The strings `"portrait"` and `"landscape"` means the view will collapse when device is in landscape or portrait orientation.
     *     If the value is not defined, the view always be in `"collapse"` mode.
    [/en]
     *  [ja][/ja]
     */
    collapse: PropTypes__default["default"].oneOfType([PropTypes__default["default"].bool, PropTypes__default["default"].string]),
    /**
     * @name swipeable
     * @type bool
     * @description
     *  [en]Ennable swipe interaction on collapse mode.[/en]
     *  [ja][/ja]
     */
    swipeable: PropTypes__default["default"].bool,
    /**
     * @name isOpen
     * @type bool
     * @description
     *  [en]Specifies whether the menu is open.[/en]
     *  [ja][/ja]
     */
    isOpen: PropTypes__default["default"].bool,
    /**
     * @name onPostOpen
     * @type function
     * @description
     *  [en]Called after the menu is opened.[/en]
     *  [ja][/ja]
     */
    onPostOpen: PropTypes__default["default"].func,
    /**
     * @name onOpen
     * @type function
     * @description
     *  [en]DEPRECATED! Use `onPostOpen` instead.[/en]
     *  [ja][/ja]
     */
    onOpen: PropTypes__default["default"].func,
    /**
     * @name onPostClose
     * @type function
     * @description
     *  [en]Called after the menu is closed.[/en]
     *  [ja][/ja]
     */
    onPostClose: PropTypes__default["default"].func,
    /**
     * @name onClose
     * @type function
     * @description
     *  [en]DEPRECATED! Use `onPostClose` instead.[/en]
     *  [ja][/ja]
     */
    onClose: PropTypes__default["default"].func,
    /**
     * @name side
     * @type string
     * @description
     *  [en]Specify which side of the screen the SplitterSide element is located. Possible values are `"left"` and `"right"`.[/en]
     *  [ja][/ja]
     */
    side: PropTypes__default["default"].oneOf(['left', 'right']),
    /**
     * @name swipeTargetWidth
     * @type number
     * @description
     *  [en]The width of swipeable area calculated from the edge (in pixels). Use this to enable swipe only when the finger touch on the screen edge.[/en]
     *  [ja][/ja]
     */
    swipeTargetWidth: PropTypes__default["default"].number,
    /**
     * @name width
     * @type  number
     * @description
     *  [en]Specifies the width of the menu. Can be specified in either pixels or as a percentage, e.g. `"90%"` or `"200px"`.[/en]
     *  [ja][/ja]
     */
    width: PropTypes__default["default"].string,
    /**
     * @name animation
     * @type string
     * @required false
     * @description
     *  [en]Specify the animation. Use one of `overlay`, `push`, `reveal`, or `default`.[/en]
     *  [ja][/ja]
     */
    animation: PropTypes__default["default"].string,
    /**
     * @name animationOptions
     * @type object
     * @required false
     * @description
     *  [en]Specify the animation's duration, delay and timing. E.g.  `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
     *  [ja][/ja]
     */
    animationOptions: PropTypes__default["default"].object,
    /**
     * @name openThreshold
     * @type object
     * @required false
     * @description
     *  [en] Specify how much the menu needs to be swiped before opening. A value between `0` and `1`.  [/en]
     *  [ja][/ja]
     */
    openThreshold: PropTypes__default["default"].number,
    /**
     * @name onPreOpen
     * @type string
     * @description
     *  [en] Called before the menu opens.  [/en]
     *  [ja][/ja]
     */
    onPreOpen: PropTypes__default["default"].func,
    /**
     * @name onPreClose
     * @type string
     * @description
     *  [en] Called before the menu closes.  [/en]
     *  [ja][/ja]
     */
    onPreClose: PropTypes__default["default"].func,
    /**
     * @name onModeChange
     * @type string
     * @description
     *  [en] Called after the component's mode changes. [/en]
     *  [ja][/ja]
     */
    onModeChange: PropTypes__default["default"].func
  };

  const nameMap = {
    ...INPUT_PROPS
  };
  const withDefaultChecked = component => oneTimeProp(component, 'defaultChecked', 'checked');

  /**
   * @original ons-switch
   * @category form
   * @tutorial react/Reference/switch
   * @description
   * [en]   Switch component. The switch can be toggled both by dragging and tapping.
   *     Will automatically displays a Material Design switch on Android devices.
   [/en]
   * [ja][/ja]
   * @example
   * <Switch checked={this.state.checked} onChange={this.onChange} />
   */
  const Switch = withDefaultChecked(onsCustomElement('ons-switch', {
    deprecated: nameMap
  }));
  Switch.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the checkbox.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name onChange
     * @type function
     * @description
     *  [en] Called when the value of the switch changes (checked/unchecked) [/en]
     *  [ja][/ja]
     */
    onChange: PropTypes__default["default"].func,
    /**
     * @name checked
     * @type bool
     * @description
     *  [en] Whether the switch is checked.[/en]
     *  [ja][/ja]
     */
    checked: PropTypes__default["default"].bool,
    /**
     * @name defaultChecked
     * @type boolean
     * @description
     *  [en]Defined the state of the switch at first render for uncontrolled inputs.[/en]
     *  [ja][/ja]
     */
    defaultChecked: PropTypes__default["default"].bool,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en] If set, the switch is disabled.[/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name inputId
     * @type string
     * @description
     *  [en] Specify the `id` attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
     *  [ja][/ja]
     */
    inputId: PropTypes__default["default"].string
  };

  /**
   * @original ons-tab
   * @category tabbar
   * @tutorial react/Reference/tabbar
   * @description
   * [en] Represents a tab inside tab bar.
   [/en]
   * [ja][/ja]
   * @example
   * <Tap>
   *   Home
   * </Tap>
   */
  const Tab = onsCustomElement('ons-tab');
  Tab.propTypes = {
    /**
     * @name icon
     * @type string
     * @description
     *  [en]The icon name for the tab. Can specify the same icon name as <ons-icon>.[/en]
     *  [ja][/ja]
     */
    icon: PropTypes__default["default"].string,
    /**
     * @name activeIcon
     * @type string
     * @description
     *  [en]The name of the icon when the tab is active.[/en]
     *  [ja][/ja]
     */
    activeIcon: PropTypes__default["default"].string,
    /**
     * @name label
     * @type string
     * @description
     *  [en]The label of the tab item.[/en]
     *  [ja][/ja]
     */
    label: PropTypes__default["default"].string,
    /**
     * @name badge
     * @type string
     * @description
     *  [en]Display a notification badge on top of the tab.[/en]
     *  [ja][/ja]
     */
    badge: PropTypes__default["default"].string
  };

  const deprecated$1 = {
    index: 'activeIndex'
  };
  const Element$1 = onsCustomElement('ons-tabbar', {
    deprecated: deprecated$1
  });

  /**
   * @original ons-tabbar
   * @category tabbar
   * @tutorial react/Reference/tabbar
   * @description
   * [en] Component to display a tabbar on either the top or the bottom of a page.
   * To define the tabs and the content the property renderTabs need to be implemented, that returns an array of tabs and their content. See the example for specifics. [/en]* [ja][/ja]
   * @example

    <Page>
      <Tabbar
        onPreChange={({index}) => this.setState(index)}
        onPostChange={() => console.log('postChange')}
        onReactive={() => console.log('postChange')}
        position='bottom'
        index={this.state.index}
        renderTabs={(activeIndex, tabbar) => [
          {
            content: <TabPage title="Home" active={activeIndex === 0} tabbar={tabbar} />,
            tab: <Tab label="Home" icon="md-home" />
          },
          {
            content: <TabPage title="Settings" active={activeIndex === 1} tabbar={tabbar} />,
            tab: <Tab label="Settings" icon="md-settings" />
          }]
        }
      />
    </Page>
   */
  const Tabbar = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
    const {
      visible,
      hideTabs,
      renderTabs,
      ...rest
    } = props;
    const tabs = renderTabs(props.activeIndex, ref);

    // visible is deprecated in favour of hideTabs, but if visible is defined and
    // hideTabs is not, we use its negation as the value of hideTabs
    let reallyHideTabs;
    if (hideTabs === undefined && visible !== undefined) {
      reallyHideTabs = !visible;
    } else {
      reallyHideTabs = hideTabs;
    }
    return /*#__PURE__*/React__default["default"].createElement(Element$1, _extends({
      hideTabs: reallyHideTabs
    }, rest, {
      ref: ref
    }), /*#__PURE__*/React__default["default"].createElement("div", {
      className: "tabbar__content"
    }, /*#__PURE__*/React__default["default"].createElement("div", null, tabs.map(tab => tab.content)), /*#__PURE__*/React__default["default"].createElement("div", null)), /*#__PURE__*/React__default["default"].createElement("div", {
      className: "tabbar"
    }, tabs.map(tab => tab.tab), /*#__PURE__*/React__default["default"].createElement("div", {
      className: "tabbar__border"
    })));
  });
  Tabbar.propTypes = {
    /**
     * @name activeIndex
     * @type number
     * @description
     *  [en]The index of the tab to highlight.[/en]
     *  [ja][/ja]
     */
    activeIndex: PropTypes__default["default"].number,
    /**
     * @name index
     * @type number
     * @description
     *  [en]DEPRECATED! Use `activeIndex` instead.[/en]
     *  [ja][/ja]
     */
    index: PropTypes__default["default"].number,
    /**
     * @name renderTabs
     * @type function
     * @description
     *  [en]Function that returns an array of objects with the keys `content` and `tab`.[/en]
     *  [ja][/ja]
     */
    renderTabs: PropTypes__default["default"].func.isRequired,
    /**
     * @name position
     * @type string
     * @description
     *  [en]Tabbar's position. Available values are `"bottom"` and `"top"`. Use `"auto"` to choose position depending on platform (iOS bottom, Android top). [/en]
     *  [ja][/ja]
     */
    position: PropTypes__default["default"].string,
    /**
     * @name swipeable
     * @type bool
     * @description
     *  [en]Enable swipe interaction.[/en]
     *  [ja][/ja]
     */
    swipeable: PropTypes__default["default"].bool,
    /**
     * @name ignoreEdgeWidth
     * @type number
     * @description
     *  [en]Distance in pixels from both edges. Swiping on these areas will prioritize parent components such as `Splitter` or `Navigator`.[/en]
     *  [ja][/ja]
     */
    ignoreEdgeWidth: PropTypes__default["default"].number,
    /**
     * @name animation
     * @type string
     * @description
     *  [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
     *  [ja][/ja]
     */
    animation: PropTypes__default["default"].oneOf(['none', 'slide']),
    /**
     * @name animationOptions
     * @type object
     * @required false
     * @description
     *  [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
     *  [ja][/ja]
     */
    animationOptions: PropTypes__default["default"].object,
    /**
     * @name tabBorder
     * @type bool
     * @description
     *  [en]If true, the tabs show a dynamic bottom border. Only works for iOS since the border is always visible in Material Design.[/en]
     *  [ja][/ja]
     */
    tabBorder: PropTypes__default["default"].bool,
    /**
     * @name onPreChange
     * @type function
     * @description
     *  [en]Called just before the tab is changed.[/en]
     *  [ja][/ja]
     */
    onPreChange: PropTypes__default["default"].func,
    /**
     * @name onPostChange
     * @type function
     * @description
     *  [en]Called just after the tab is changed.[/en]
     *  [ja][/ja]
     */
    onPostChange: PropTypes__default["default"].func,
    /**
     * @name onReactive
     * @type function
     * @description
     *  [en]Called if the already open tab is tapped again.[/en]
     *  [ja][/ja]
     */
    onReactive: PropTypes__default["default"].func,
    /**
     * @name onSwipe
     * @type function
     * @description
     *  [en]Hook called whenever the user slides the tabbar. It gets a decimal index and an animationOptions object as arguments.[/en]
     *  [ja][/ja]
     */
    onSwipe: PropTypes__default["default"].func,
    /**
     * @name visible
     * @type bool
     * @description
     *  [en]If true, the tabbar is not shown on the screen. Otherwise, the tabbar is shown.[/en]
     *  [ja][/ja]
     */
    hideTabs: PropTypes__default["default"].bool,
    /**
     * @name visible
     * @type bool
     * @description
     *  [en]DEPRECATED! Use `hideTabs` instead.[/en]
     *  [ja][/ja]
     */
    visible: PropTypes__default["default"].bool,
    /**
     * @name modifier
     * @type string
     * @description
     *  [en]The appearance of the tabbar.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string
  };

  const propTypes = {
    /**
     * @name visible
     * @type bool
     * @description
     *  [en]
     *  Indicates whether the toast open and shown.
     *  [/en]
     *  [ja][/ja]
     */
    visible: PropTypes__default["default"].bool,
    /**
     * @name isOpen
     * @type bool
     * @description
     *  [en]
     *  DEPRECATED! Use `visible` instead.
     *  [/en]
     *  [ja][/ja]
     */
    isOpen: PropTypes__default["default"].bool,
    /**
     * @name animation
     * @type string
     * @required false
     * @description
     *  [en]Animation name. Available animations are `"default"`, `"ascend"` (Android), `"lift"` (iOS), `"fall"`, `"fade"` or `"none"`.[/en]
     *  [ja][/ja]
     */
    animation: PropTypes__default["default"].string,
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the toast.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name animationOptions
     * @type object
     * @required false
     * @description
     *  [en]Specify the animation's duration, delay and timing. E.g.  `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
     *  [ja][/ja]
     */
    animationOptions: PropTypes__default["default"].object,
    /**
     * @name onPreShow
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called just before the toast is displayed.
     *  [/en]
     *  [ja][/ja]
     */
    onPreShow: PropTypes__default["default"].func,
    /**
     * @name onPostShow
     * @type function
     * @required false
     * @description
     *  [en]
     *  Called just after the toast is displayed.
     *  [/en]
     *  [ja][/ja]
     */
    onPostShow: PropTypes__default["default"].func,
    /**
     * @name onPreHide
     * @type function
     * @required false
     * @description
     *  [en]Called just before the toast is hidden.[/en]
     *  [ja][/ja]
     */
    onPreHide: PropTypes__default["default"].func,
    /**
     * @name onPostHide
     * @type function
     * @required false
     * @description
     *  [en]Called just after the toast is hidden.[/en]
     *  [ja][/ja]
     */
    onPostHide: PropTypes__default["default"].func,
    /**
     * @name onDeviceBackButton
     * @type function
     * @required false
     * @description
     *  [en]
     *  Custom handler for device back button.
     *  [/en]
     *  [ja][/ja]
     */
    onDeviceBackButton: PropTypes__default["default"].func
  };
  const deprecated = {
    isOpen: 'visible'
  };
  const notAttributes$1 = ['onDeviceBackButton'];

  /**
   * @original ons-toast
   * @category dialog
   * @tutorial react/Reference/toast
   * @description
   * [en]
   *  The Toast or Snackbar component is useful for displaying dismissable information or simple actions at (normally) the bottom of the page.
   *
   *  This component does not block user input, allowing the app to continue its flow. Furthermore, it can be automatically hidden after a timeout.
   * [/en]
   * [ja][/ja]
   */
  const Toast = onsCustomElement(baseDialog('ons-toast'), {
    propTypes,
    deprecated,
    notAttributes: notAttributes$1
  });
  Toast.propTypes = propTypes;

  const notAttributes = ['visible'];

  /**
   * @original ons-toolbar
   * @category page
   * @tutorial react/Reference/toolbar
   * @description
   * [en]Toolbar component that can be used with navigation. Left, center and right container can be specified by class names. This component will automatically displays as a Material Design toolbar when running on Android devices.[/en]
   * [ja][/ja]
   * @example
   *
  <Page renderToolbar={() =>
    <Toolbar>
      <div className="left">
        <BackButton>
            Back
        </BackButton>
      </div>
      <div className="center">
        Title
      </div>
      <div className="right">
        <ToolbarButton>
          <Icon icon="md-menu" />
        </ToolbarButton>
      </div>
    </Toolbar> }
  />
   */
  const Toolbar = onsCustomElement('ons-toolbar', {
    notAttributes
  });
  Toolbar.propTypes = {
    /**
     * @name modifier
     * @type string
     * @description
     *  [en]
     *  Specify modifier name to specify custom styles. Optional.
     *  [/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name visible
     * @type bool
     * @description
     *  [en]If true, the toolbar is shown on the screen. Otherwise, the toolbar is not shown.[/en]
     *  [ja][/ja]
     */
    visible: PropTypes__default["default"].bool,
    /**
     * @name static
     * @type bool
     * @description
     *   [en]Static toolbars are not animated by `ons-navigator` when pushing or popping pages. This can be useful to improve performance in some situations.[/en]
     *  [ja][/ja]
     */
    static: PropTypes__default["default"].bool,
    /**
     * @name inline
     * @type bool
     * @description
     *   [en]Display the toolbar as an inline element.[/en]
     *   [ja]ツールバーをインラインに置きます。スクロール領域内にそのまま表示されます。[/ja]
     */
    inline: PropTypes__default["default"].bool
  };

  /**
   * @original ons-toolbar-button
   * @category page
   * @tutorial react/Reference/page
   * @description
   *   [en]
   *   Button component for the Toolbar. Using this component gives a nice default style.
   *
   *
   *   [/en]
   * [ja][/ja]
   * @example
   * <Page
       renderToolbar = { () =>
        <Toolbar>
          <div className='left'><BackButton>Back</BackButton></div>
          <div className='center'>Input</div>
          <div className='right'>
            <ToolbarButton onClick={this.add} >Add</ToolbarButton>
          </div>
        </Toolbar>
       }>
        Page Content
      </Page>
   */
  const ToolbarButton = onsCustomElement('ons-toolbar-button');
  ToolbarButton.propTypes = {
    /**
     * @name modifier
     * @type string
     * @required false
     * @description
     *  [en]The appearance of the button.[/en]
     *  [ja][/ja]
     */
    modifier: PropTypes__default["default"].string,
    /**
     * @name disabled
     * @type bool
     * @description
     *  [en]
     *  Indicates whether the button is disabled.
     *  [/en]
     *  [ja][/ja]
     */
    disabled: PropTypes__default["default"].bool,
    /**
     * @name icon
     * @type string
     * @description
     *  [en]Creates an `Icon` component with this string.[/en]
     *  [ja][/ja]
     */
    icon: PropTypes__default["default"].string,
    /**
     * @name onClick
     * @type function
     * @description
     *  [en]This function will be called when the button is clicked.[/en]
     *  [ja][/ja]
     */
    onClick: PropTypes__default["default"].func
  };

  /*
   * routeStack : [userRoute, userRoute2, ...]
   * processStack: [
   * { type: push | pop | reset, route: userRoute },
   * { type: push | pop | reset, route: userRoute2 },
   * ...
   * ]
   */

  var RouterUtil = {
    init: routes => {
      return {
        routeStack: [...routes],
        processStack: []
      };
    },
    replace: _ref => {
      let {
        routeConfig,
        route,
        options,
        key
      } = _ref;
      const config = {
        ...routeConfig
      };
      const routeStack = [...config.routeStack];
      let processStack = [...config.processStack];
      if (key == null || processStack.filter(el => el.key === key).length === 0) {
        const process = {
          type: 'replace',
          route,
          options,
          key
        };
        processStack = [...processStack, process];
      }
      return {
        routeStack,
        processStack
      };
    },
    reset: _ref2 => {
      let {
        routeConfig,
        route,
        options,
        key
      } = _ref2;
      const config = {
        ...routeConfig
      };
      const routeStack = [...config.routeStack];
      let processStack = [...config.processStack];
      if (key == null || processStack.filter(el => el.key === key).length === 0) {
        const process = {
          type: 'reset',
          route,
          options,
          key
        };
        processStack = [...processStack, process];
      }
      return {
        routeStack,
        processStack
      };
    },
    push: _ref3 => {
      let {
        routeConfig,
        route,
        options,
        key
      } = _ref3;
      const config = {
        ...routeConfig
      };
      const routeStack = [...config.routeStack];
      let processStack = [...config.processStack];
      if (key == null || config.processStack.filter(el => el.key === key).length === 0) {
        const process = {
          type: 'push',
          route,
          options,
          key
        };
        processStack = [...processStack, process];
      }
      return {
        routeStack,
        processStack
      };
    },
    pop: _ref4 => {
      let {
        routeConfig,
        options,
        key
      } = _ref4;
      const config = {
        ...routeConfig
      };
      const routeStack = [...config.routeStack];
      let processStack = [...config.processStack];

      /**
       * Safegaurd to ensure that not
       * too many pages are popped from
       * the stack.
       */
      const pops = processStack.filter(x => x.type === 'pop').length;
      if (pops + 1 >= routeStack.length) {
        console.warn('Page stack is already empty');
        return config;
      }
      const process = {
        type: 'pop',
        key,
        options
      };
      processStack = [...processStack, process];
      return {
        routeStack,
        processStack
      };
    },
    postPush: routeConfig => {
      const config = {
        ...routeConfig
      };
      let routeStack = [...config.routeStack];
      const processStack = [...config.processStack];
      const next = processStack.shift();
      const type = next.type;
      let route = next.route;
      if (type === 'push') {
        if (route !== null) {
          routeStack = [...routeStack, route];
        }
      } else if (type === 'reset') {
        if (!Array.isArray(route)) route = [route];
        routeStack = route;
      } else if (type === 'replace') {
        routeStack.pop();
        routeStack.push(route);
      }
      return {
        routeStack,
        processStack
      };
    },
    postPop: routeConfig => {
      const config = {
        ...routeConfig
      };
      let routeStack = [...config.routeStack];
      let processStack = [...config.processStack];
      routeStack = routeStack.slice(0, routeStack.length - 1);
      processStack = processStack.slice(1);
      return {
        routeStack,
        processStack
      };
    }
  };

  exports.ActionSheet = ActionSheet;
  exports.ActionSheetButton = ActionSheetButton;
  exports.AlertDialog = AlertDialog;
  exports.AlertDialogButton = AlertDialogButton;
  exports.BackButton = BackButton;
  exports.BottomToolbar = BottomToolbar;
  exports.Button = Button;
  exports.Card = Card;
  exports.Carousel = Carousel;
  exports.CarouselItem = CarouselItem;
  exports.Checkbox = Checkbox;
  exports.Col = Col;
  exports.Dialog = Dialog;
  exports.Fab = Fab;
  exports.GestureDetector = GestureDetector;
  exports.Icon = Icon;
  exports.Input = Input;
  exports.LazyList = LazyList;
  exports.List = List;
  exports.ListHeader = ListHeader;
  exports.ListItem = ListItem;
  exports.ListTitle = ListTitle;
  exports.Modal = Modal;
  exports.Navigator = Navigator;
  exports.Page = Page;
  exports.Popover = Popover;
  exports.ProgressBar = ProgressBar;
  exports.ProgressCircular = ProgressCircular;
  exports.PullHook = PullHook;
  exports.Radio = Radio;
  exports.Range = Range;
  exports.Ripple = Ripple;
  exports.RouterNavigator = RouterNavigator;
  exports.RouterUtil = RouterUtil;
  exports.Row = Row;
  exports.SearchInput = SearchInput;
  exports.Segment = Segment;
  exports.Select = Select;
  exports.SpeedDial = SpeedDial;
  exports.SpeedDialItem = SpeedDialItem;
  exports.Splitter = Splitter;
  exports.SplitterContent = SplitterContent;
  exports.SplitterMask = SplitterMask;
  exports.SplitterSide = SplitterSide;
  exports.Switch = Switch;
  exports.Tab = Tab;
  exports.Tabbar = Tabbar;
  exports.Toast = Toast;
  exports.Toolbar = Toolbar;
  exports.ToolbarButton = ToolbarButton;

  Object.defineProperty(exports, '__esModule', { value: true });

}));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3Qtb25zZW51aS5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL29uc0N1c3RvbUVsZW1lbnQuanN4IiwiLi4vc3JjL2Jhc2VEaWFsb2cuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvQWN0aW9uU2hlZXQuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvQWN0aW9uU2hlZXRCdXR0b24uanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvQWxlcnREaWFsb2cuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvQWxlcnREaWFsb2dCdXR0b24uanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvQmFja0J1dHRvbi5qc3giLCIuLi9zcmMvY29tcG9uZW50cy9Cb3R0b21Ub29sYmFyLmpzeCIsIi4uL3NyYy9jb21wb25lbnRzL0J1dHRvbi5qc3giLCIuLi9zcmMvY29tcG9uZW50cy9DYXJkLmpzeCIsIi4uL3NyYy9jb21wb25lbnRzL0Nhcm91c2VsLmpzeCIsIi4uL3NyYy9jb21wb25lbnRzL0Nhcm91c2VsSXRlbS5qc3giLCIuLi9zcmMvb25lVGltZVByb3AuanN4IiwiLi4vc3JjL2lucHV0UHJvcHMuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvQ2hlY2tib3guanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvQ29sLmpzeCIsIi4uL3NyYy9jb21wb25lbnRzL0RpYWxvZy5qc3giLCIuLi9zcmMvY29tcG9uZW50cy9GYWIuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvR2VzdHVyZURldGVjdG9yLmpzeCIsIi4uL3NyYy9jb21wb25lbnRzL0ljb24uanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvSW5wdXQuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvTGlzdC5qc3giLCIuLi9zcmMvY29tcG9uZW50cy9MYXp5TGlzdC5qc3giLCIuLi9zcmMvY29tcG9uZW50cy9MaXN0SGVhZGVyLmpzeCIsIi4uL3NyYy9jb21wb25lbnRzL0xpc3RJdGVtLmpzeCIsIi4uL3NyYy9jb21wb25lbnRzL0xpc3RUaXRsZS5qc3giLCIuLi9zcmMvY29tcG9uZW50cy9OYXZpZ2F0b3IuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvTW9kYWwuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvUGFnZS5qc3giLCIuLi9zcmMvY29tcG9uZW50cy9Qb3BvdmVyLmpzeCIsIi4uL3NyYy9jb21wb25lbnRzL1Byb2dyZXNzQmFyLmpzeCIsIi4uL3NyYy9jb21wb25lbnRzL1Byb2dyZXNzQ2lyY3VsYXIuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvUHVsbEhvb2suanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvUmFkaW8uanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvUmFuZ2UuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvUmlwcGxlLmpzeCIsIi4uL3NyYy9jb21wb25lbnRzL1JvdXRlck5hdmlnYXRvci5qc3giLCIuLi9zcmMvY29tcG9uZW50cy9Sb3cuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvU2VhcmNoSW5wdXQuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvU2VnbWVudC5qc3giLCIuLi9zcmMvY29tcG9uZW50cy9TZWxlY3QuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvU3BlZWREaWFsLmpzeCIsIi4uL3NyYy9jb21wb25lbnRzL1NwZWVkRGlhbEl0ZW0uanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvU3BsaXR0ZXIuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvU3BsaXR0ZXJDb250ZW50LmpzeCIsIi4uL3NyYy9jb21wb25lbnRzL1NwbGl0dGVyTWFzay5qc3giLCIuLi9zcmMvY29tcG9uZW50cy9TcGxpdHRlclNpZGUuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvU3dpdGNoLmpzeCIsIi4uL3NyYy9jb21wb25lbnRzL1RhYi5qc3giLCIuLi9zcmMvY29tcG9uZW50cy9UYWJiYXIuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvVG9hc3QuanN4IiwiLi4vc3JjL2NvbXBvbmVudHMvVG9vbGJhci5qc3giLCIuLi9zcmMvY29tcG9uZW50cy9Ub29sYmFyQnV0dG9uLmpzeCIsIi4uL3NyYy9Sb3V0ZXJVdGlsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmNvbnN0IGtlYmFiaXplID0gY2FtZWxTdHJpbmcgPT5cbiAgY2FtZWxTdHJpbmcucmVwbGFjZSgvKFthLXpBLVpdKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKTtcblxuY29uc3QgYWRkRGVwcmVjYXRlZCA9IChwcm9wcywgZGVwcmVjYXRlZCkgPT4ge1xuICBjb25zdCBwcm9wc0NvcHkgPSB7IC4uLnByb3BzIH07XG5cbiAgY29uc3QgbmFtZU1hcCA9IHtcbiAgICBjbGFzc05hbWU6ICdjbGFzcycsXG4gICAgLi4uZGVwcmVjYXRlZFxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBPYmplY3QuZW50cmllcyhuYW1lTWFwKSkge1xuICAgIGlmIChwcm9wc0NvcHlbbmV3TmFtZV0gPT09IHVuZGVmaW5lZCAmJiBwcm9wc0NvcHlbb2xkTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHNDb3B5W25ld05hbWVdID0gcHJvcHNDb3B5W29sZE5hbWVdO1xuICAgICAgZGVsZXRlIHByb3BzQ29weVtvbGROYW1lXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcHJvcHNDb3B5O1xufTtcblxuZnVuY3Rpb24gdXNlQ3VzdG9tRWxlbWVudExpc3RlbmVyKHJlZiwgcHJvcCwgaGFuZGxlcikge1xuICBjb25zdCBldmVudCA9IHByb3Auc2xpY2UoMikudG9Mb3dlckNhc2UoKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gcmVmLmN1cnJlbnQ7XG4gICAgY3VycmVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcbiAgICB9O1xuICB9LCBbcmVmLCBoYW5kbGVyXSk7XG59XG5cbmZ1bmN0aW9uIHVzZUN1c3RvbUVsZW1lbnQocHJvcHMsIG9wdGlvbnMgPSB7fSwgcmVmKSB7XG4gIGNvbnN0IG5vdEF0dHJpYnV0ZXMgPSBvcHRpb25zLm5vdEF0dHJpYnV0ZXMgfHwgW107XG4gIGNvbnN0IGRlcHJlY2F0ZWQgPSBvcHRpb25zLmRlcHJlY2F0ZWQgfHwge307XG5cbiAgY29uc3QgcHJvcGVydGllcyA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZm9yIChjb25zdCBbcHJvcCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFkZERlcHJlY2F0ZWQocHJvcHMsIGRlcHJlY2F0ZWQpKSkge1xuICAgIGNvbnN0IGpzTmFtZSA9IGtlYmFiaXplKHByb3ApO1xuXG4gICAgaWYgKG5vdEF0dHJpYnV0ZXMuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHJlZi5jdXJyZW50W3Byb3BdID0gdmFsdWU7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKC9eb25bQS1aXS8udGVzdChwcm9wKSkge1xuICAgICAgdXNlQ3VzdG9tRWxlbWVudExpc3RlbmVyKHJlZiwgcHJvcCwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHByb3BlcnRpZXNbanNOYW1lXSA9IHZhbHVlID8gJycgOiBudWxsO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcHJvcGVydGllc1tqc05hbWVdID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wZXJ0aWVzW2pzTmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge3Byb3BlcnRpZXN9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvbnNDdXN0b21FbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBfcmVmKSA9PiB7XG4gICAgY29uc3QgcmVmID0gX3JlZiB8fCB1c2VSZWYoKTtcblxuICAgIGNvbnN0IHtzdHlsZSwgY2hpbGRyZW4sIC4uLnJlc3R9ID0gcHJvcHM7XG4gICAgY29uc3Qge3Byb3BlcnRpZXN9ID0gdXNlQ3VzdG9tRWxlbWVudChyZXN0LCBvcHRpb25zLCByZWYpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxXcmFwcGVkQ29tcG9uZW50XG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgIHsuLi5wcm9wZXJ0aWVzfVxuICAgICAgPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L1dyYXBwZWRDb21wb25lbnQ+XG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5cbmNsYXNzIFBvcnRhbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBSZWFjdERPTS5jcmVhdGVQb3J0YWwoXG4gICAgICB0aGlzLnByb3BzLmNoaWxkcmVuLFxuICAgICAgdGhpcy5jb250YWluZXJcbiAgICApO1xuICB9XG59XG5cbmNvbnN0IGJhc2VEaWFsb2cgPSBEaWFsb2dDb21wb25lbnQgPT5cbiAgUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICAgIC8vIHZpc2libGUgcHJvcCBzaG91bGQgYmUgYXBwbGllZCBsYXN0IHNpbmNlIGl0IGRlcGVuZHMgb24gYW5pbWF0aW9uIGFuZFxuICAgIC8vIG1hc2tDb2xvciBwcm9wcyBiZWluZyBzZXQgZmlyc3RcbiAgICBjb25zdCB7dmlzaWJsZSwgLi4ucmVzdH0gPSBwcm9wcztcblxuICAgIHJldHVybiAoXG4gICAgICA8UG9ydGFsPlxuICAgICAgICA8RGlhbG9nQ29tcG9uZW50XG4gICAgICAgICAgey4uLnJlc3R9XG4gICAgICAgICAgdmlzaWJsZT17dmlzaWJsZX1cblxuICAgICAgICAgIHJlZj17cmVmfVxuICAgICAgICA+XG4gICAgICAgICAge3Byb3BzLmNoaWxkcmVufVxuICAgICAgICA8L0RpYWxvZ0NvbXBvbmVudD5cbiAgICAgIDwvUG9ydGFsPlxuICAgICk7XG4gIH0pO1xuXG5leHBvcnQgZGVmYXVsdCBiYXNlRGlhbG9nO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLWFjdGlvbi1zaGVldCc7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuaW1wb3J0IGJhc2VEaWFsb2cgZnJvbSAnLi4vYmFzZURpYWxvZyc7XG5cbmNvbnN0IHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEBuYW1lIHRpdGxlXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBPcHRpb25hbCB0aXRsZSBvZiB0aGUgYWN0aW9uIHNoZWV0LiBBIG5ldyBlbGVtZW50IHdpbGwgYmUgY3JlYXRlZCBjb250YWluaW5nIHRoaXMgc3RyaW5nLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uRGlhbG9nQ2FuY2VsXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIENhbGxlZCBvbmx5IGlmIGNhbmNlbGFibGUgaXMgdHJ1ZS4gSXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGFwcGluZyB0aGUgYmFja2dyb3VuZCBvciBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gb24gQW5kcm9pZCBkZXZpY2VzLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25EaWFsb2dDYW5jZWw6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSB2aXNpYmxlXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGlhbG9nIGlzIG9wZW4gYW5kIHNob3duLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgdmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGNhbmNlbGFibGVcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBTcGVjaWZpZXMgd2hldGhlciB0aGUgZGlhbG9nIGlzIGNhbmNlbGFibGUgb3Igbm90LlxuICAgKiAgQSBjYW5jZWxhYmxlIGRpYWxvZyB3aWxsIGNhbGwgb25DYW5jZWwgIHdoZW4gdGFwcGluZyB0aGUgYmFja2dyb3VuZCBvciBvciAgcHJlc3NpbmcgdGhlIGJhY2sgYnV0dG9uIG9uIEFuZHJvaWQgZGV2aWNlc1xuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgY2FuY2VsYWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGRpc2FibGVkXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGRpYWxvZyBpcyBkaXNhYmxlZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgb25DYW5jZWxcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgREVQUkVDQVRFRCEgVXNlIGBvbkRpYWxvZ0NhbmNlbGAgaW5zdGVhZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uQ2FuY2VsOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgaXNPcGVuXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBERVBSRUNBVEVEISBVc2UgYHZpc2libGVgIGluc3RlYWQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBpc09wZW46IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBpc0NhbmNlbGFibGVcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBERVBSRUNBVEVEISBVc2UgYGNhbmNlbGFibGVgIGluc3RlYWQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBpc0NhbmNlbGFibGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBpc0Rpc2FibGVkXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgREVQUkVDQVRFRCEgVXNlIGBkaXNhYmxlZGAgaW5zdGVhZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGlzRGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBhbmltYXRpb25cbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIFRoZSBhbmltYXRpb24gdXNlZCB3aGVuIHNob3dpbmcgYW5kIGhpZGluZyB0aGUgZGlhbG9nLiBDYW4gYmUgZWl0aGVyIGBcIm5vbmVcImAgb3IgYFwiZGVmYXVsdFwiYC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGFuaW1hdGlvbjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgZGlhbG9nLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG1vZGlmaWVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBtYXNrQ29sb3JcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIFwicmdiYSgwLCAwLCAwLCAwLjIpXCJbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtYXNrQ29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUgb2JqZWN0XG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiAgYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGFuaW1hdGlvbk9wdGlvbnM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUHJlU2hvd1xuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBDYWxsZWQganVzdCBiZWZvcmUgdGhlIGFjdGlvbiBzaGVldCBpcyBkaXNwbGF5ZWQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblByZVNob3c6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblBvc3RTaG93XG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIENhbGxlZCBqdXN0IGFmdGVyIHRoZSBhY3Rpb24gc2hlZXQgaXMgZGlzcGxheWVkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25Qb3N0U2hvdzogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUHJlSGlkZVxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBhY3Rpb24gc2hlZXQgaXMgaGlkZGVuLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUHJlSGlkZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUG9zdEhpZGVcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCBqdXN0IGFmdGVyIHRoZSBhY3Rpb24gc2hlZXQgaXMgaGlkZGVuLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUG9zdEhpZGU6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkRldmljZUJhY2tCdXR0b25cbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgQ3VzdG9tIGhhbmRsZXIgZm9yIGRldmljZSBiYWNrIGJ1dHRvbi5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uRGV2aWNlQmFja0J1dHRvbjogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmNvbnN0IGRlcHJlY2F0ZWQgPSB7XG4gIG9uQ2FuY2VsOiAnb25EaWFsb2dDYW5jZWwnLFxuICBpc09wZW46ICd2aXNpYmxlJyxcbiAgaXNEaXNhYmxlZDogJ2Rpc2FibGVkJyxcbiAgaXNDYW5jZWxhYmxlOiAnY2FuY2VsYWJsZSdcbn07XG5cbmNvbnN0IG5vdEF0dHJpYnV0ZXMgPSBbJ29uRGV2aWNlQmFja0J1dHRvbiddO1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtYWN0aW9uLXNoZWV0XG4gKiBAY2F0ZWdvcnkgZGlhbG9nXG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL2FjdGlvbi1zaGVldFxuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dXG4gKiAgQWN0aW9uL2JvdHRvbSBzaGVldCB0aGF0IGlzIGRpc3BsYXllZCBvbiB0b3Agb2YgY3VycmVudCBzY3JlZW4uXG4gKiAgVGhlIGFjdGlvbiBzaGVldCBpcyB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgYSBsaXN0IG9mIG9wdGlvbnMgYW5kIGFza2luZyB0aGUgdXNlciB0byBtYWtlIGEgZGVjaXNpb24uIEFuIEFjdGlvblNoZWV0QnV0dG9uIGNvbXBvbmVudCBpcyBwcm92aWRlZCBmb3IgdGhpcyBwdXJwb3NlLCBhbHRob3VnaCBpdCBjYW4gY29udGFpbiBhbnkgdHlwZSBvZiBjb250ZW50LlxuICogIEl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBkaXNwbGF5ZWQgYXMgTWF0ZXJpYWwgRGVzaWduIChib3R0b20gc2hlZXQpIHdoZW4gcnVubmluZyBvbiBhbiBBbmRyb2lkIGRldmljZS5cbiAqIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqL1xuY29uc3QgQWN0aW9uU2hlZXQgPSBvbnNDdXN0b21FbGVtZW50KGJhc2VEaWFsb2coJ29ucy1hY3Rpb24tc2hlZXQnKSwge3Byb3BUeXBlcywgZGVwcmVjYXRlZCwgbm90QXR0cmlidXRlc30pO1xuQWN0aW9uU2hlZXQucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5leHBvcnQgZGVmYXVsdCBBY3Rpb25TaGVldDtcbiIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJ29uc2VudWkvZXNtL2VsZW1lbnRzL29ucy1hY3Rpb24tc2hlZXQtYnV0dG9uJztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5cbmNvbnN0IHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEBuYW1lIG1vZGlmaWVyXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGFjdGlvbiBzaGVldCBidXR0b24uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbW9kaWZpZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGljb25cbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNyZWF0ZXMgYW4gYEljb25gIGNvbXBvbmVudCB3aXRoIHRoaXMgc3RyaW5nLiBPbmx5IHZpc2libGUgb24gQW5kcm9pZC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBpY29uOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkNsaWNrXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1hY3Rpb24tc2hlZXQtYnV0dG9uXG4gKiBAY2F0ZWdvcnkgZGlhbG9nXG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL2FjdGlvbi1zaGVldFxuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dQ29tcG9uZW50IHRoYXQgcmVwcmVzZW50IGVhY2ggYnV0dG9uIG9mIHRoZSBhY3Rpb24gc2hlZXQuWy9lbl1cbiAqIFtqYV1bL2phXVxuICovXG5jb25zdCBBY3Rpb25TaGVldEJ1dHRvbiA9IG9uc0N1c3RvbUVsZW1lbnQoJ29ucy1hY3Rpb24tc2hlZXQtYnV0dG9uJywge3Byb3BUeXBlc30pO1xuQWN0aW9uU2hlZXRCdXR0b24ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5leHBvcnQgZGVmYXVsdCBBY3Rpb25TaGVldEJ1dHRvbjtcbiIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJ29uc2VudWkvZXNtL2VsZW1lbnRzL29ucy1hbGVydC1kaWFsb2cnO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcbmltcG9ydCBiYXNlRGlhbG9nIGZyb20gJy4uL2Jhc2VEaWFsb2cnO1xuXG5jb25zdCBkZXByZWNhdGVkID0ge1xuICBvbkNhbmNlbDogJ29uRGlhbG9nQ2FuY2VsJyxcbiAgaXNPcGVuOiAndmlzaWJsZScsXG4gIGlzRGlzYWJsZWQ6ICdkaXNhYmxlZCcsXG4gIGlzQ2FuY2VsYWJsZTogJ2NhbmNlbGFibGUnXG59O1xuXG5jb25zdCBub3RBdHRyaWJ1dGVzID0gWydvbkRldmljZUJhY2tCdXR0b24nXTtcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLWFsZXJ0LWRpYWxvZ1xuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS9hbGVydC1kaWFsb2dcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXVxuICogICBBbGVydCBkaWFsb2cgdGhhdCBpcyBkaXNwbGF5ZWQgb24gdG9wIG9mIHRoZSBjdXJyZW50IHNjcmVlbi4gVXNlZnVsIGZvciBkaXNwbGF5aW5nIHF1ZXN0aW9ucywgd2FybmluZ3Mgb3IgZXJyb3IgbWVzc2FnZXMgdG8gdGhlIHVzZXIuIFRoZSB0aXRsZSwgY29udGVudCBhbmQgYnV0dG9ucyBjYW4gYmUgZWFzaWx5IGN1c3RvbWl6ZWQgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBzd2l0Y2ggc3R5bGUgYmFzZWQgb24gdGhlIHBsYXRmb3JtLlxuICogWy9lbl1cbiAqIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAgIDxBbGVydERpYWxvZyBpc09wZW49e3RoaXMuc3RhdGUuaXNPcGVufSBvbkNhbmNlbD17dGhpcy5oYW5kbGVDYW5jZWwuYmluZCh0aGlzKX0gY2FuY2VsYWJsZT5cbiAgICAgPGRpdiBjbGFzc05hbWU9XCJhbGVydC1kaWFsb2ctdGl0bGVcIj5XYXJuaW5nITwvZGl2PlxuICAgICA8ZGl2IGNsYXNzTmFtZT1cImFsZXJ0LWRpYWxvZy1jb250ZW50XCI+XG4gICAgICAgQW4gZXJyb3IgaGFzIG9jY3VycmVkIVxuICAgICA8L2Rpdj5cbiAgICAgPGRpdiBjbGFzc05hbWU9XCJhbGVydC1kaWFsb2ctZm9vdGVyXCI+XG4gICAgICAgPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLmhhbmRsZUNhbmNlbC5iaW5kKHRoaXMpfSBjbGFzc05hbWU9XCJhbGVydC1kaWFsb2ctYnV0dG9uXCI+XG4gICAgICAgICBDYW5jZWxcbiAgICAgICA8L0J1dHRvbj5cbiAgICAgICA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2FuY2VsLmJpbmQodGhpcyl9IGNsYXNzTmFtZT1cImFsZXJ0LWRpYWxvZy1idXR0b25cIj5cbiAgICAgICAgIE9rXG4gICAgICAgPC9CdXR0b24+XG4gICAgIDwvZGl2PlxuICAgPC9BbGVydERpYWxvZz5cbiAqL1xuY29uc3QgQWxlcnREaWFsb2cgPSBvbnNDdXN0b21FbGVtZW50KGJhc2VEaWFsb2coJ29ucy1hbGVydC1kaWFsb2cnKSwge2RlcHJlY2F0ZWQsIG5vdEF0dHJpYnV0ZXN9KTtcblxuQWxlcnREaWFsb2cucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgdmlzaWJsZVxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRpYWxvZyBpcyBvcGVuIGFuZCBzaG93bi5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkaXNhYmxlZFxuICAgKiBAdHlwZSBib29sXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBkaWFsb2cgaXMgZGlzYWJsZWQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGNhbmNlbGFibGVcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBTcGVjaWZpZXMgd2hldGhlciB0aGUgZGlhbG9nIGlzIGNhbmNlbGFibGUgb3Igbm90LlxuICAgKiAgQSBjYW5jZWxhYmxlIGRpYWxvZyB3aWxsIGNhbGwgYG9uRGlhbG9nQ2FuY2VsYCB3aGVuIHRhcHBpbmcgdGhlIGJhY2tncm91bmQgb3IgcHJlc3NpbmcgdGhlIGJhY2sgYnV0dG9uIG9uIEFuZHJvaWQgZGV2aWNlcy5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGNhbmNlbGFibGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkRpYWxvZ0NhbmNlbFxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBDYWxsZWQgb25seSBpZiBgY2FuY2VsYWJsZWAgaXMgdHJ1ZS4gSXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGFwcGluZyB0aGUgYmFja2dyb3VuZCBvciBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gb24gQW5kcm9pZCBkZXZpY2VzLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25EaWFsb2dDYW5jZWw6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkNhbmNlbFxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBERVBSRUNBVEVEISBVc2UgYG9uRGlhbG9nQ2FuY2VsYCBpbnN0ZWFkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25DYW5jZWw6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBpc09wZW5cbiAgICogQHR5cGUgYm9vbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIERFUFJFQ0FURUQhIFVzZSBgdmlzaWJsZWAgaW5zdGVhZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGlzT3BlbjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGlzQ2FuY2VsYWJsZVxuICAgKiBAdHlwZSBib29sXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIERFUFJFQ0FURUQhIFVzZSBgY2FuY2VsYWJsZWAgaW5zdGVhZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGlzQ2FuY2VsYWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGlzRGlzYWJsZWRcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBERVBSRUNBVEVEISBVc2UgYGRpc2FibGVkYCBpbnN0ZWFkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgaXNEaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGFuaW1hdGlvblxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgVGhlIGFuaW1hdGlvbiB1c2VkIHdoZW4gc2hvd2luZyBhbmQgaGlkaW5nIHRoZSBkaWFsb2cuIENhbiBiZSBlaXRoZXIgYFwibm9uZVwiYCBvciBgXCJkZWZhdWx0XCJgLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgYW5pbWF0aW9uOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBtb2RpZmllclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBkaWFsb2cuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbW9kaWZpZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG1hc2tDb2xvclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kIG1hc2suIERlZmF1bHQgaXMgXCJyZ2JhKDAsIDAsIDAsIDAuMilcIlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG1hc2tDb2xvcjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSBvYmplY3RcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuICBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgYW5pbWF0aW9uT3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQG5hbWUgb25QcmVTaG93XG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIENhbGxlZCBqdXN0IGJlZm9yZSB0aGUgYWxlcnQgZGlhbG9nIGlzIGRpc3BsYXllZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUHJlU2hvdzogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUG9zdFNob3dcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgQ2FsbGVkIGp1c3QgYWZ0ZXIgdGhlIGFsZXJ0IGRpYWxvZyBpcyBkaXNwbGF5ZWQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblBvc3RTaG93OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25QcmVIaWRlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQganVzdCBiZWZvcmUgdGhlIGFsZXJ0IGRpYWxvZyBpcyBoaWRkZW4uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25QcmVIaWRlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25Qb3N0SGlkZVxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIGp1c3QgYWZ0ZXIgdGhlIGFsZXJ0IGRpYWxvZyBpcyBoaWRkZW4uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25Qb3N0SGlkZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uRGV2aWNlQmFja0J1dHRvblxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBDdXN0b20gaGFuZGxlciBmb3IgZGV2aWNlIGJhY2sgYnV0dG9uLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25EZXZpY2VCYWNrQnV0dG9uOiBQcm9wVHlwZXMuZnVuY1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWxlcnREaWFsb2c7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtYWxlcnQtZGlhbG9nLWJ1dHRvbic7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtYWxlcnQtZGlhbG9nLWJ1dHRvblxuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS9kaWFsb2dcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXUNvbXBvbmVudCB0aGF0IHJlcHJlc2VudCBlYWNoIGJ1dHRvbiBvZiB0aGUgYWxlcnQgZGlhbG9nLlsvZW5dXG4gKiBbamFdWy9qYV1cbiAqL1xuY29uc3QgQWxlcnREaWFsb2dCdXR0b24gPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtYWxlcnQtZGlhbG9nLWJ1dHRvbicpO1xuXG5BbGVydERpYWxvZ0J1dHRvbi5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSBtb2RpZmllclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBhbGVydCBkaWFsb2cgYnV0dG9uLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG1vZGlmaWVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkaXNhYmxlZFxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgb25DbGlja1xuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jXG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbGVydERpYWxvZ0J1dHRvbjtcbiIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJ29uc2VudWkvZXNtL2VsZW1lbnRzL29ucy1iYWNrLWJ1dHRvbic7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuXG5jb25zdCBub3RBdHRyaWJ1dGVzID0gWydvcHRpb25zJ107XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1iYWNrLWJ1dHRvblxuICogQGNhdGVnb3J5IG5hdmlnYXRpb25cbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2UvYmFjay1idXR0b25cbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXVxuICogICBCYWNrIGJ1dHRvbiBjb21wb25lbnQgZm9yIFRvb2xiYXIuIEl0IGVuYWJsZXMgdG8gYXV0b21hdGljYWxseSB0byBwb3AgdGhlIHRvcCBwYWdlIG9mIHRoZSBuYXZpZ2F0b3IuIFdoZW4gb25seSBwcmVzZW50ZWQgd2l0aCBvbmUgcGFnZSwgdGhlIGJ1dHRvbiBpcyBoaWRkZW4gYXV0b21hdGljYWxseS5cbiAqXG4gKiAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZSBgb25DbGlja2AgcHJvcC5cbiAqIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8VG9vbGJhciBtb2RpZmllcj17dGhpcy5wcm9wcy5tb2RpZmllcn0gPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJsZWZ0XCI+PEJhY2tCdXR0b24gbW9kaWZpZXI9e3RoaXMucHJvcHMubW9kaWZpZXJ9PkJhY2s8L0JhY2tCdXR0b24+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNlbnRlclwiPnt0aGlzLnByb3BzLnRpdGxlfTwvZGl2PlxuICAgPC9Ub29sYmFyPlxuICovXG5jb25zdCBCYWNrQnV0dG9uID0gb25zQ3VzdG9tRWxlbWVudCgnb25zLWJhY2stYnV0dG9uJywge25vdEF0dHJpYnV0ZXN9KTtcblxuQmFja0J1dHRvbi5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSBtb2RpZmllclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBiYWNrIGJ1dHRvbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgb25DbGlja1xuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLiBUbyBwcmV2ZW50IHRoZSBkZWZhdWx0IGNsaWNrIGJlaGF2aW91ciwgY2FsbCBgZXZlbnQucHJldmVudERlZmF1bHQoKWAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9wdGlvbnNcbiAgICogQHR5cGUgb2JqZWN0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZmllcyB0aGUgYW5pbWF0aW9uLCBhbmltYXRpb25PcHRpb25zLCBhbmQgY2FsbGJhY2suWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb3B0aW9uczogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBhbmltYXRpb246IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgYW5pbWF0aW9uT3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBjYWxsYmFjazogUHJvcFR5cGVzLmZ1bmNcbiAgfSlcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJhY2tCdXR0b247XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtYm90dG9tLXRvb2xiYXInO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuY29uc3QgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgbW9kaWZpZXIgbmFtZSB0byBzcGVjaWZ5IGN1c3RvbSBzdHlsZXMuIE9wdGlvbmFsLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG1vZGlmaWVyOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtYm90dG9tLXRvb2xiYXJcbiAqIEBjYXRlZ29yeSBwYWdlXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl1Ub29sYmFyIGNvbXBvbmVudCB0aGF0IGlzIHBvc2l0aW9uZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZS5bL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPEJvdHRvbVRvb2xiYXIgbW9kaWZpZXI9XCJtYXRlcmlhbFwiPiBDb250ZW50IDwvQm90dG9tVG9vbGJhcj5cbiAqL1xuY29uc3QgQm90dG9tVG9vbGJhciA9IG9uc0N1c3RvbUVsZW1lbnQoJ29ucy1ib3R0b20tdG9vbGJhcicsIHtwcm9wVHlwZXN9KTtcbkJvdHRvbVRvb2xiYXIucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5leHBvcnQgZGVmYXVsdCBCb3R0b21Ub29sYmFyO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLWJ1dHRvbic7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuXG5jb25zdCBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSBtb2RpZmllclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBidXR0b24uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbW9kaWZpZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGRpc2FibGVkXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBTcGVjaWZpZXMgd2hldGhlciB0aGUgYnV0dG9uIGlzIGRpc2FibGVkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSByaXBwbGVcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBidXR0b24gaGFzIGEgcmlwcGxlIGVmZmVjdC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHJpcHBsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uQ2xpY2tcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQuIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jXG59O1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtYnV0dG9uXG4gKiBAY2F0ZWdvcnkgZm9ybVxuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS9idXR0b25cbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXSBCdXR0b24gY29tcG9uZW50LiBJZiB5b3Ugd2FudCB0byBwbGFjZSBhIGJ1dHRvbiBpbiBhIHRvb2xiYXIsIHVzZSBgVG9vbGJhckJ1dHRvbmAgb3IgYEJhY2tCdXR0b25gIGluc3RlYWQuIFdpbGwgYXV0b21hdGljYWxseSBkaXNwbGF5IGFzIGEgTWF0ZXJpYWwgRGVzaWduIGJ1dHRvbiB3aXRoIGEgcmlwcGxlIGVmZmVjdCBvbiBBbmRyb2lkLlxuIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8QnV0dG9uIG1vZGlmaWVyPVwibGFyZ2UtLWN0YVwiPlxuICogICBUYXAgTWVcbiAqIDwvQnV0dG9uPlxuICovXG5jb25zdCBCdXR0b24gPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtYnV0dG9uJywge3Byb3BUeXBlc30pO1xuQnV0dG9uLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxuZXhwb3J0IGRlZmF1bHQgQnV0dG9uO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLWNhcmQnO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLWNhcmRcbiAqIEBjYXRlZ29yeSB2aXN1YWxcbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2UvdmlzdWFsXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl1DYXJkIGNvbXBvbmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgY29udGVudC5bL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICpcbjxDYXJkPlxuICA8cD5Tb21lIGNvbnRlbnQ8L3A+XG48L0NhcmQ+XG4gKi9cbmNvbnN0IENhcmQgPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtY2FyZCcpO1xuXG5DYXJkLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEBuYW1lIG1vZGlmaWVyXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIFNwZWNpZnkgbW9kaWZpZXIgbmFtZSB0byBzcGVjaWZ5IGN1c3RvbSBzdHlsZXMuIE9wdGlvbmFsLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbW9kaWZpZXI6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENhcmQ7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLWNhcm91c2VsJztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5cbmNvbnN0IGRlcHJlY2F0ZWQgPSB7XG4gIGluZGV4OiAnYWN0aXZlSW5kZXgnXG59O1xuXG5jb25zdCBFbGVtZW50ID0gb25zQ3VzdG9tRWxlbWVudCgnb25zLWNhcm91c2VsJywge2RlcHJlY2F0ZWR9KTtcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLWNhcm91c2VsXG4gKiBAY2F0ZWdvcnkgY2Fyb3VzZWxcbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2UvY2Fyb3VzZWxcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXSBDYXJvdXNlbCBjb21wb25lbnQuIEEgY2Fyb3VzZWwgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBzZXZlcmFsIGl0ZW1zIGluIHRoZSBzYW1lIHNwYWNlLlxuICogICAgIFRoZSBjb21wb25lbnQgc3VwcG9ydHMgZGlzcGxheWluZyBjb250ZW50IGJvdGggaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5LiBUaGUgdXNlciBjYW4gc2Nyb2xsIHRocm91Z2ggdGhlIGl0ZW1zIGJ5IGRyYWdnaW5nIGFuZCBpdCBjYW4gYWxzbyBiZSBjb250cm9sbGVyIHByb2dyYW1tYXRpY2FsbHkuXG4gWy9lbl1cbiAqIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqICAgIDxDYXJvdXNlbFxuICAgICAgICAgIG9uUG9zdENoYW5nZT17KCkgPT4gY29uc29sZS5sb2coJ29uUG9zdENoYW5nZScpfVxuICAgICAgICAgIG9uT3ZlcnNjcm9sbD17KCkgPT4gY29uc29sZS5sb2coJ29uT3ZlcnNjcm9sbCcpfVxuICAgICAgICAgIG9uUmVmcmVzaD17KCkgPT4gY29uc29sZS5sb2coJ29uUmVmcmVzaCcpfVxuICAgICAgICAgIHJlZj17KGNhcm91c2VsKSA9PiB7IHRoaXMuY2Fyb3VzZWwgPSBjYXJvdXNlbDsgfX1cbiAgICAgICAgICBzd2lwZWFibGVcbiAgICAgICAgICBvdmVyc2Nyb2xsYWJsZVxuICAgICAgICAgIGF1dG9TY3JvbGxcbiAgICAgICAgICBmdWxsc2NyZWVuXG4gICAgICAgICAgYXV0b1Njcm9sbFJhdGlvPXswLjJ9XG4gICAgICA+XG4gICAgICAgICAgPENhcm91c2VsSXRlbSBzdHlsZT17e2JhY2tncm91bmRDb2xvcjogJ2dyYXknfX0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naXRlbS1sYWJlbCc+R1JBWTwvZGl2PlxuICAgICAgICAgIDwvQ2Fyb3VzZWxJdGVtPlxuICAgICAgICAgIDxDYXJvdXNlbEl0ZW0gc3R5bGU9e3tiYWNrZ3JvdW5kQ29sb3I6ICcjMDg1MDc4J319PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2l0ZW0tbGFiZWwnPkJMVUU8L2Rpdj5cbiAgICAgICAgICA8L0Nhcm91c2VsSXRlbT5cbiAgICAgICAgPC9DYXJvdXNlbD5cblxuICovXG5jb25zdCBDYXJvdXNlbCA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge2l0ZW1XaWR0aCwgaXRlbUhlaWdodCwgLi4ucmVzdH0gPSBwcm9wcztcblxuICAvLyBzdHJpbmcgdmFsdWVzIGZvciBpdGVtV2lkdGggYW5kIGl0ZW1IZWlnaHQgYXJlIGRlcHJlY2F0ZWQgYnV0IGhhbmRsZSB0aGVtXG4gIC8vIHNhZmVseSBhbnl3YXkgdG8gYXZvaWQgYnJlYWtpbmcgdXNlciBjb2RlXG4gIGNvbnN0IHN0cmluZ2lmeSA9IHggPT4gdHlwZW9mIHggPT09ICdudW1iZXInID8gYCR7eH1weGAgOiB4O1xuICBjb25zdCByZWFsSXRlbVdpZHRoID0gc3RyaW5naWZ5KGl0ZW1XaWR0aCk7XG4gIGNvbnN0IHJlYWxJdGVtSGVpZ2h0ID0gc3RyaW5naWZ5KGl0ZW1IZWlnaHQpO1xuXG4gIHJldHVybiAoXG4gICAgPEVsZW1lbnRcbiAgICAgIGl0ZW1XaWR0aD17cmVhbEl0ZW1XaWR0aH1cbiAgICAgIGl0ZW1IZWlnaHQ9e3JlYWxJdGVtSGVpZ2h0fVxuICAgICAgcmVmPXtyZWZ9XG4gICAgICB7Li4ucmVzdH1cbiAgICA+XG4gICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgPC9FbGVtZW50PlxuICApO1xufSk7XG5cbkNhcm91c2VsLnByb3BUeXBlcyA9IHtcblxuICAvKipcbiAgICogQG5hbWUgZGlyZWN0aW9uXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGRpcmVjdGlvbiBvZiB0aGUgY2Fyb3VzZWwuIENhbiBiZSBlaXRoZXIgXCJob3Jpem9udGFsXCIgb3IgXCJ2ZXJ0aWNhbFwiLiBEZWZhdWx0IGlzIFwiaG9yaXpvbnRhbFwiLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRpcmVjdGlvbjogUHJvcFR5cGVzLm9uZU9mKFsnaG9yaXpvbnRhbCcsICd2ZXJ0aWNhbCddKSxcblxuICAvKipcbiAgICogQG5hbWUgZnVsbHNjcmVlblxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRydWUsIHRoZSBjYXJvdXNlbCB3aWxsIGNvdmVyIHRoZSB3aG9sZSBzY3JlZW4uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZnVsbHNjcmVlbjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG92ZXJzY3JvbGxhYmxlXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdHJ1ZSwgdGhlIGNhcm91c2VsIHdpbGwgYmUgc2Nyb2xsYWJsZSBvdmVyIHRoZSBlZGdlLiBJdCB3aWxsIGJvdW5jZSBiYWNrIHdoZW4gcmVsZWFzZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb3ZlcnNjcm9sbGFibGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBjZW50ZXJlZFxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRydWUsIHRoZSBjYXJvdXNlbCB0aGVuIHRoZSBzZWxlY3RlZCBpdGVtIHdpbGwgYmUgaW4gdGhlIGNlbnRlciBvZiB0aGUgY2Fyb3VzZWwgaW5zdGVhZCBvZiB0aGUgYmVnaW5uaW5nLiBVc2VmdWwgb25seSB3aGVuIHRoZSBpdGVtcyBhcmUgc21hbGxlciB0aGFuIHRoZSBjYXJvdXNlbC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBjZW50ZXJlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGl0ZW1XaWR0aFxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5db25zLWNhcm91c2VsLWl0ZW0ncyB3aWR0aC4gT25seSB3b3JrcyB3aGVuIHRoZSBkaXJlY3Rpb24gaXMgc2V0IHRvIFwiaG9yaXpvbnRhbFwiLiBDYW4gYmUgaW4gcGl4ZWxzIG9yIGEgcGVyY2VudGFnZS5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBpdGVtV2lkdGg6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGl0ZW1IZWlnaHRcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXW9ucy1jYXJvdXNlbC1pdGVtJ3MgaGVpZ2h0LiBPbmx5IHdvcmtzIHdoZW4gdGhlIGRpcmVjdGlvbiBpcyBzZXQgdG8gXCJ2ZXJ0aWNhbFwiLiBDYW4gYmUgaW4gcGl4ZWxzIG9yIGEgcGVyY2VudGFnZS5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBpdGVtSGVpZ2h0OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBhdXRvU2Nyb2xsXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdHJ1ZSwgdGhlIGNhcm91c2VsIHdpbGwgYmUgYXV0b21hdGljYWxseSBzY3JvbGxlZCB0byB0aGUgY2xvc2VzdCBpdGVtIGJvcmRlciB3aGVuIHJlbGVhc2VkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGF1dG9TY3JvbGw6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBhdXRvU2Nyb2xsUmF0aW9cbiAgICogQHR5cGUgbnVtYmVyXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUEgbnVtYmVyIGJldHdlZW4gMC4wIGFuZCAxLjAgdGhhdCBzcGVjaWZpZXMgaG93IG11Y2ggdGhlIHVzZXIgbXVzdCBkcmFnIHRoZSBjYXJvdXNlbCBpbiBvcmRlciBmb3IgaXQgdG8gYXV0byBzY3JvbGwgdG8gdGhlIG5leHQgaXRlbS5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBhdXRvU2Nyb2xsUmF0aW86IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAqIEBuYW1lIHN3aXBlYWJsZVxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRydWUsIHRoZSBjYXJvdXNlbCBjYW4gYmUgc2Nyb2xsZWQgYnkgZHJhZyBvciBzd2lwZS5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBzd2lwZWFibGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkaXNhYmxlZFxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRydWUsIHRoZSBjYXJvdXNlbCB3aWxsIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgYWN0aXZlSW5kZXhcbiAgICogQHR5cGUgbnVtYmVyXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGluZGV4IG9mIHRoZSBvbnMtY2Fyb3VzZWwtaXRlbSB0byBzaG93LiBEZWZhdWx0IGlzIDAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgYWN0aXZlSW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGluZGV4XG4gICAqIEB0eXBlIG51bWJlclxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1ERVBSRUNBVEVEISBVc2UgYGFjdGl2ZUluZGV4YCBpbnN0ZWFkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBhdXRvUmVmcmVzaFxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBjYXJvdXNlbCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aGVuIHRoZSBudW1iZXIgb2YgY2hpbGQgbm9kZXMgY2hhbmdlLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGF1dG9SZWZyZXNoOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgb25QcmVDaGFuZ2VcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBjdXJyZW50IGNhcm91c2VsIGl0ZW0gY2hhbmdlcy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblByZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUG9zdENoYW5nZVxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQganVzdCBhZnRlciB0aGUgY3VycmVudCBjYXJvdXNlbCBpdGVtIGhhcyBjaGFuZ2VkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUG9zdENoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUmVmcmVzaFxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQgd2hlbiB0aGUgY2Fyb3VzZWwgaGFzIGJlZW4gcmVmcmVzaGVkLiBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblJlZnJlc2g6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbk92ZXJzY3JvbGxcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIHdoZW4gdGhlIGNhcm91c2VsIGhhcyBiZWVuIG92ZXJzY3JvbGxlZC4gWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25PdmVyc2Nyb2xsOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBwcm9wIGlzIHNldCB0byBcIm5vbmVcIiB0aGUgdHJhbnNpdGlvbnMgd2lsbCBub3QgYmUgYW5pbWF0ZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgYW5pbWF0aW9uOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBhbmltYXRpb25PcHRpb25zXG4gICAqIEB0eXBlIG9iamVjdFxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBhbmltYXRpb25PcHRpb25zOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblN3aXBlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUhvb2sgY2FsbGVkIHdoZW5ldmVyIHRoZSB1c2VyIHNsaWRlcyB0aGUgY2Fyb3VzZWwuIEl0IGdldHMgYSBkZWNpbWFsIGluZGV4IGFuZCBhbiBhbmltYXRpb25PcHRpb25zIG9iamVjdCBhcyBhcmd1bWVudHMuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25Td2lwZTogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENhcm91c2VsO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLWNhcm91c2VsLWl0ZW0nO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLWNhcm91c2VsLWl0ZW1cbiAqIEBjYXRlZ29yeSBjYXJvdXNlbFxuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS9jYXJvdXNlbFxuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dIENhcm91c2VsIGl0ZW0gY29tcG9uZW50LiBVc2VkIGFzIGEgY2hpbGQgb2YgdGhlIGA8b25zLWNhcm91c2VsPmAgZWxlbWVudC5cbiBbL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuKiAgPENhcm91c2VsIHN3aXBlYWJsZSBvdmVyc2Nyb2xsYWJsZSBhdXRvU2Nyb2xsIGZ1bGxzY3JlZW4gPlxuICAgICA8Q2Fyb3VzZWxJdGVtIHN0eWxlPXt7YmFja2dyb3VuZENvbG9yOiAnZ3JheSd9fT5cbiAgICAgICA8ZGl2IGNsYXNzTmFtZT0naXRlbS1sYWJlbCc+R1JBWTwvZGl2PlxuICAgICA8L0Nhcm91c2VsSXRlbT5cbiAgICAgPENhcm91c2VsSXRlbSBzdHlsZT17e2JhY2tncm91bmRDb2xvcjogJyMwODUwNzgnfX0+XG4gICAgICAgPGRpdiBjbGFzc05hbWU9J2l0ZW0tbGFiZWwnPkJMVUU8L2Rpdj5cbiAgICAgPC9DYXJvdXNlbEl0ZW0+XG4gICA8L0Nhcm91c2VsPlxuICovXG5jb25zdCBDYXJvdXNlbEl0ZW0gPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtY2Fyb3VzZWwtaXRlbScpO1xuXG5DYXJvdXNlbEl0ZW0ucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgU3BlY2lmeSBtb2RpZmllciBuYW1lIHRvIHNwZWNpZnkgY3VzdG9tIHN0eWxlcy4gT3B0aW9uYWwuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQ2Fyb3VzZWxJdGVtO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuLy8gRm9yIGEgcHJvcCB3aXRoIG5hbWUgYGRlZmF1bHRQcm9wYCwgc2V0cyB0aGUgY29tcG9uZW50J3MgYHByb3BgIHByb3AgdG8gdGhlXG4vLyB2YWx1ZSBvZiBgZGVmYXVsdFByb3BgIHdoZW4gdGhlIGNvbXBvbmVudCBtb3VudHMgb25seS5cbi8vXG4vLyBGb3IgZXhhbXBsZSwgSW5wdXQgaGFzIGEgZGVmYXVsdHRWYWx1ZSBwcm9wIHRoYXQgc2hvdWxkIHNldCB0aGUgaW5uZXIgaW5wdXQnc1xuLy8gdmFsdWUgd2hlbiB0aGUgY29tcG9uZW50IG1vdW50ZWQgYW5kIGRvIG5vdGhpbmcgYWZ0ZXJ3YXJkcy5cbmNvbnN0IG9uZVRpbWVQcm9wID0gKFdyYXBwZWRDb21wb25lbnQsIGRlZmF1bHRQcm9wLCBwcm9wKSA9PiB7XG4gIGNsYXNzIE9uZVRpbWVQcm9wIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgdGhpcy5yZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wcm9wc1tkZWZhdWx0UHJvcF07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5yZWYuY3VycmVudFtwcm9wXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtpbm5lclJlZiwgLi4ucmVzdH0gPSB0aGlzLnByb3BzO1xuICAgICAgZGVsZXRlIHJlc3RbZGVmYXVsdFByb3BdO1xuXG4gICAgICBpZiAoaW5uZXJSZWYgJiYgaW5uZXJSZWYgIT09IHRoaXMucmVmKSB7XG4gICAgICAgIHRoaXMucmVmID0gaW5uZXJSZWY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxXcmFwcGVkQ29tcG9uZW50XG4gICAgICAgICAgcmVmPXt0aGlzLnJlZn1cbiAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgPlxuICAgICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgICAgICA8L1dyYXBwZWRDb21wb25lbnQ+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PlxuICAgIDxPbmVUaW1lUHJvcCBpbm5lclJlZj17cmVmfSB7Li4ucHJvcHN9Pntwcm9wcy5jaGlsZHJlbn08L09uZVRpbWVQcm9wPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgb25lVGltZVByb3A7XG4iLCJjb25zdCBJTlBVVF9QUk9QUyA9IHtcbiAgYXV0b0NhcGl0YWxpemU6ICdhdXRvY2FwaXRhbGl6ZScsXG4gIGF1dG9Db21wbGV0ZTogJ2F1dG9jb21wbGV0ZScsXG4gIGF1dG9Db3JyZWN0OiAnYXV0b2NvcnJlY3QnLFxuICBhdXRvRm9jdXM6ICdhdXRvZm9jdXMnLFxuICBpbnB1dE1vZGU6ICdpbnB1dG1vZGUnLFxuICBtYXhMZW5ndGg6ICdtYXhsZW5ndGgnLFxuICBtaW5MZW5ndGg6ICdtaW5sZW5ndGgnLFxuICByZWFkT25seTogJ3JlYWRvbmx5JyxcbiAgc3BlbGxDaGVjazogJ3NwZWxsY2hlY2snXG59O1xuXG5leHBvcnQgZGVmYXVsdCBJTlBVVF9QUk9QUztcbiIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJ29uc2VudWkvZXNtL2VsZW1lbnRzL29ucy1jaGVja2JveCc7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuaW1wb3J0IG9uZVRpbWVQcm9wIGZyb20gJy4uL29uZVRpbWVQcm9wJztcbmltcG9ydCBJTlBVVF9QUk9QUyBmcm9tICcuLi9pbnB1dFByb3BzJztcblxuY29uc3QgbmFtZU1hcCA9IHtcbiAgLi4uSU5QVVRfUFJPUFNcbn07XG5cbmNvbnN0IHdpdGhEZWZhdWx0Q2hlY2tlZCA9IGNvbXBvbmVudCA9PiBvbmVUaW1lUHJvcChjb21wb25lbnQsICdkZWZhdWx0Q2hlY2tlZCcsICdjaGVja2VkJyk7XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1jaGVja2JveFxuICogQGNhdGVnb3J5IGZvcm1cbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2UvY2hlY2tib3hcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXVxuICogIEEgY2hlY2tib3ggZWxlbWVudC4gVGhlIGNvbXBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVuZGVyIGFzIGEgTWF0ZXJpYWwgRGVzaWduIGNoZWNrYm94IG9uIEFuZHJvaWQgZGV2aWNlcy5cbiAqXG4gKiAgTW9zdCBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGEgbm9ybWFsIGA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCI+YCBlbGVtZW50IGNhbiBhbHNvIGJlIHVzZWQgb24gdGhlIGA8Q2hlY2tib3g+YCBjb21wb25lbnQuXG4gKiBbL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPENoZWNrYm94XG4gKiAgIG9uQ2hhbmdlPXtldmVudCA9PiB7IHRoaXMuc2V0U3RhdGUoe2NoZWNrZWQ6IGV2ZW50LnRhcmdldC5jaGVja2VkfSl9IH1cbiAqICAgbW9kaWZpZXI9J21hdGVyaWFsJyAvPlxuICovXG5jb25zdCBDaGVja2JveCA9IHdpdGhEZWZhdWx0Q2hlY2tlZChvbnNDdXN0b21FbGVtZW50KCdvbnMtY2hlY2tib3gnLCB7ZGVwcmVjYXRlZDogbmFtZU1hcH0pKTtcblxuQ2hlY2tib3gucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgY2hlY2tib3guWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbW9kaWZpZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGRpc2FibGVkXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBTcGVjaWZpZXMgd2hldGhlciB0aGUgY2hlY2tib3ggaXMgZGlzYWJsZWQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uQ2hhbmdlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCB3aGVuIHRoZSBpbm5lciBjaGVja2JveCBmaXJlcyBhIGBjaGFuZ2VgIGV2ZW50LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25JbnB1dFxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQgd2hlbiB0aGUgaW5uZXIgY2hlY2tib3ggZmlyZXMgYW4gYGlucHV0YCBldmVudC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvbklucHV0OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgdmFsdWVcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBWYWx1ZSBvZiB0aGUgY2hlY2tib3guWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgdmFsdWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgUHJvcFR5cGVzLmluc3RhbmNlT2YoRGF0ZSlcbiAgXSksXG5cbiAgLyoqXG4gICAqIEBuYW1lIGNoZWNrZWRcbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db250cm9scyB0aGUgc3RhdGUgb2YgdGhlIGNoZWNrYm94IChjb250cm9sbGVkKS5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBjaGVja2VkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgZGVmYXVsdENoZWNrZWRcbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1EZWZpbmVkIHRoZSBzdGF0ZSBvZiB0aGUgY2hlY2tib3ggYXQgZmlyc3QgcmVuZGVyIGZvciB1bmNvbnRyb2xsZWQgaW5wdXRzLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRlZmF1bHRDaGVja2VkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgaW5wdXRJZFxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgXCJpZFwiIGF0dHJpYnV0ZSBvZiB0aGUgaW5uZXIgYDxpbnB1dD5gIGVsZW1lbnQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gdXNpbmcgPGxhYmVsIGZvcj1cIi4uLlwiPiBlbGVtZW50cy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBpbnB1dElkOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5leHBvcnQgZGVmYXVsdCBDaGVja2JveDtcbiIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJ29uc2VudWkvZXNtL2VsZW1lbnRzL29ucy1jb2wnO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLWNvbFxuICogQGNhdGVnb3J5IGdyaWRcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXVxuICogUmVwcmVzZW50cyBhIGNvbHVtbiBpbiB0aGUgZ3JpZCBzeXN0ZW0uIFVzZSB3aXRoIGA8b25zLXJvdz5gIHRvIGxheW91dCBjb21wb25lbnRzLlxuICogWy9lbl1cbiAqIFtqYV1bL2phXVxuICogPFJvdz5cbiAqICAgPENvbCB3aWR0aD17NTB9PlxuICAqICAgPG9ucy1pY29uIGljb249XCJmYS10d2l0dGVyXCI+PC9vbnMtaWNvbj5cbiAqICAgPC9Db2w+XG4gKiAgIDxDb2w+VGV4dDwvQ29sPlxuICogPC9Sb3c+XG4gKi9cbmNvbnN0IENvbCA9IG9uc0N1c3RvbUVsZW1lbnQoJ29ucy1jb2wnKTtcblxuQ29sLnByb3BUeXBlcyA9IHtcblxuICAvKipcbiAgKiBAbmFtZSB2ZXJ0aWNhbEFsaWduXG4gICogQHR5cGUge1N0cmluZ31cbiAgKiBAZGVzY3JpcHRpb25cbiAgKiAgIFtlbl1TaG9ydCBoYW5kIGF0dHJpYnV0ZSBmb3IgYWxpZ25pbmcgdmVydGljYWxseS4gVmFsaWQgdmFsdWVzIGFyZSB0b3AsIGJvdHRvbSwgYW5kIGNlbnRlci5bL2VuXVxuICAqICAgW2phXVsvamFdXG4gICovXG4gIHZlcnRpY2FsQWxpZ246IFByb3BUeXBlcy5vbmVPZihbJ3RvcCcsICdib3R0b20nLCAnY2VudGVyJ10pLFxuXG4gIC8qKlxuICAqIEBuYW1lIHdpZHRoXG4gICogQHR5cGUge1N0cmluZ31cbiAgKiBAZGVzY3JpcHRpb25cbiAgKiAgIFtlbl1UaGUgd2lkdGggb2YgdGhlIGNvbHVtbi4gVmFsaWQgdmFsdWVzIGFyZSBjc3Mgd2lkdGggdmFsdWVzIChcIjEwJVwiLCA1MCkuWy9lbl1cbiAgKiAgIFtqYV1bL2phXVxuICAqL1xuICB3aWR0aDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pXG59O1xuXG5leHBvcnQgZGVmYXVsdCBDb2w7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtZGlhbG9nJztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5pbXBvcnQgYmFzZURpYWxvZyBmcm9tICcuLi9iYXNlRGlhbG9nJztcblxuY29uc3QgZGVwcmVjYXRlZCA9IHtcbiAgb25DYW5jZWw6ICdvbkRpYWxvZ0NhbmNlbCcsXG4gIGlzT3BlbjogJ3Zpc2libGUnLFxuICBpc0Rpc2FibGVkOiAnZGlzYWJsZWQnLFxuICBpc0NhbmNlbGFibGU6ICdjYW5jZWxhYmxlJ1xufTtcblxuY29uc3Qgbm90QXR0cmlidXRlcyA9IFsnb25EZXZpY2VCYWNrQnV0dG9uJ107XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1kaWFsb2dcbiAqIEBjYXRlZ29yeSBkaWFsb2dcbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2UvZGlhbG9nXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl0gIERpYWxvZyB0aGF0IGlzIGRpc3BsYXllZCBvbiB0b3Agb2YgY3VycmVudCBzY3JlZW4uIEFzIG9wcG9zZWQgdG8gdGhlIEFsZXJ0RGlhbG9nIGVsZW1lbnQsIHRoaXMgY29tcG9uZW50IGNhbiBjb250YWluIGFueSBraW5kIG9mIGNvbnRlbnQuICBUaGUgZGlhbG9nIGlzIHVzZWZ1bCBmb3IgZGlzcGxheWluZyBtZW51cywgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciB0byBhc2sgdGhlIHVzZXIgdG8gbWFrZSBhIGRlY2lzaW9uLiAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRpc3BsYXllZCBhcyBNYXRlcmlhbCBEZXNpZ24gd2hlbiBydW5uaW5nIG9uIGFuIEFuZHJvaWQgZGV2aWNlLlxuIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gICA8RGlhbG9nIG9uQ2FuY2VsPXt0aGlzLm9uQ2FuY2VsfVxuICAgICBpc09wZW49e3RoaXMucHJvcHMuaXNPcGVufVxuICAgICBzdHlsZT17e2hlaWdodDogMjUwfX0gIGNhbmNlbGFibGU+XG4gICAgIDxQYWdlPlxuICAgICAgIFBhZ2UgQ29udGVudFxuICAgICA8L1BhZ2U+XG4gICAgPC9EaWFsb2c+XG5cbiAqL1xuY29uc3QgRGlhbG9nID0gb25zQ3VzdG9tRWxlbWVudChiYXNlRGlhbG9nKCdvbnMtZGlhbG9nJyksIHtkZXByZWNhdGVkLCBub3RBdHRyaWJ1dGVzfSk7XG5cbkRpYWxvZy5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSB2aXNpYmxlXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGlhbG9nIGlzIG9wZW4gYW5kIHNob3duLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgdmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGRpc2FibGVkXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGRpYWxvZyBpcyBkaXNhYmxlZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgY2FuY2VsYWJsZVxuICAgKiBAdHlwZSBib29sXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBkaWFsb2cgaXMgY2FuY2VsYWJsZSBvciBub3QuXG4gICAqICBBIGNhbmNlbGFibGUgZGlhbG9nIHdpbGwgY2FsbCBgb25EaWFsb2dDYW5jZWxgIHdoZW4gdGFwcGluZyB0aGUgYmFja2dyb3VuZCBvciBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gb24gQW5kcm9pZCBkZXZpY2VzLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgY2FuY2VsYWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uRGlhbG9nQ2FuY2VsXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIENhbGxlZCBvbmx5IGlmIGBjYW5jZWxhYmxlYCBpcyB0cnVlLiBJdCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbiBvbiBBbmRyb2lkIGRldmljZXMuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvbkRpYWxvZ0NhbmNlbDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uQ2FuY2VsXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIERFUFJFQ0FURUQhIFVzZSBgb25EaWFsb2dDYW5jZWxgIGluc3RlYWQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvbkNhbmNlbDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGlzT3BlblxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgREVQUkVDQVRFRCEgVXNlIGB2aXNpYmxlYCBpbnN0ZWFkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgaXNPcGVuOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgaXNDYW5jZWxhYmxlXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgREVQUkVDQVRFRCEgVXNlIGBjYW5jZWxhYmxlYCBpbnN0ZWFkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgaXNDYW5jZWxhYmxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgaXNEaXNhYmxlZFxuICAgKiBAdHlwZSBib29sXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIERFUFJFQ0FURUQhIFVzZSBgZGlzYWJsZWRgIGluc3RlYWQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBpc0Rpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBUaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBzaG93aW5nIGFuZCBoaWRpbmcgdGhlIGRpYWxvZy4gQ2FuIGJlIGVpdGhlciBgXCJub25lXCJgIG9yIGBcImRlZmF1bHRcImAuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBhbmltYXRpb246IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG1vZGlmaWVyXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGRpYWxvZy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgbWFza0NvbG9yXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ29sb3Igb2YgdGhlIGJhY2tncm91bmQgbWFzay4gRGVmYXVsdCBpcyBcInJnYmEoMCwgMCwgMCwgMC4yKVwiWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbWFza0NvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBhbmltYXRpb25PcHRpb25zXG4gICAqIEB0eXBlIG9iamVjdFxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBhbmltYXRpb25PcHRpb25zOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblByZVNob3dcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgQ2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBhbGVydCBkaWFsb2cgaXMgZGlzcGxheWVkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25QcmVTaG93OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25Qb3N0U2hvd1xuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBDYWxsZWQganVzdCBhZnRlciB0aGUgYWxlcnQgZGlhbG9nIGlzIGRpc3BsYXllZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUG9zdFNob3c6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblByZUhpZGVcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgYWxlcnQgZGlhbG9nIGlzIGhpZGRlbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblByZUhpZGU6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblBvc3RIaWRlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQganVzdCBhZnRlciB0aGUgYWxlcnQgZGlhbG9nIGlzIGhpZGRlbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblBvc3RIaWRlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIEN1c3RvbSBoYW5kbGVyIGZvciBkZXZpY2UgYmFjayBidXR0b24uXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvbkRldmljZUJhY2tCdXR0b246IFByb3BUeXBlcy5mdW5jXG59O1xuXG5leHBvcnQgZGVmYXVsdCBEaWFsb2c7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtZmFiJztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1mYWJcbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL2ZhYlxuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dIFRoZSBGbG9hdGluZyBhY3Rpb24gYnV0dG9uIGlzIGEgY2lyY3VsYXIgYnV0dG9uIGRlZmluZWQgaW4gdGhlIFtNYXRlcmlhbCBEZXNpZ24gc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9kZXNpZ24vc3BlYy9jb21wb25lbnRzL2J1dHRvbnMtZmxvYXRpbmctYWN0aW9uLWJ1dHRvbi5odG1sKS4gVGhleSBhcmUgb2Z0ZW4gdXNlZCB0byBwcm9tb3RlIHRoZSBwcmltYXJ5IGFjdGlvbiBvZiB0aGUgYXBwLlxuICogICAgIEl0IGNhbiBiZSBkaXNwbGF5ZWQgZWl0aGVyIGFzIGFuIGlubGluZSBlbGVtZW50IG9yIGluIG9uZSBvZiB0aGUgY29ybmVycy4gTm9ybWFsbHkgaXQgd2lsbCBiZSBwb3NpdGlvbmVkIGluIHRoZSBsb3dlciByaWdodCBjb3JuZXIgb2YgdGhlIHNjcmVlbi5cbiBbL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPFNwZWVkRGlhbCBkaXNhYmxlZD17ZmFsc2V9IGRpcmVjdGlvbj0ncmlnaHQnIG9uQ2xpY2s9eygpID0+IGNvbnNvbGUubG9nKCd0ZXN0MScpfSBwb3NpdGlvbj0nbGVmdCBib3R0b20nPlxuICAgICA8RmFiPlxuICAgICAgIDxJY29uIGljb249J2ZhLXR3aXR0ZXInIHNpemU9ezI2fSBmaXhlZFdpZHRoPXtmYWxzZX0gc3R5bGU9e3t2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJ319IC8+XG4gICAgIDwvRmFiPlxuICAgICA8U3BlZWREaWFsSXRlbSBvbkNsaWNrPXsoKSA9PiBjb25zb2xlLmxvZygnc3BlZWQgQScpfT4gQSA8L1NwZWVkRGlhbEl0ZW0+XG4gICAgIDxTcGVlZERpYWxJdGVtIG9uQ2xpY2s9eygpID0+IGNvbnNvbGUubG9nKCdzcGVlZCBCJyl9PiBCIDwvU3BlZWREaWFsSXRlbT5cbiAgICAgPFNwZWVkRGlhbEl0ZW0gb25DbGljaz17KCkgPT4gY29uc29sZS5sb2coJ3NwZWVkIEMnKX0+IEMgPC9TcGVlZERpYWxJdGVtPlxuICAgICA8U3BlZWREaWFsSXRlbSBvbkNsaWNrPXsoKSA9PiBjb25zb2xlLmxvZygnc3BlZWQgRCcpfT4gRCA8L1NwZWVkRGlhbEl0ZW0+XG4gICA8L1NwZWVkRGlhbD5cbiAgKi9cbmNvbnN0IEZhYiA9IG9uc0N1c3RvbUVsZW1lbnQoJ29ucy1mYWInKTtcblxuRmFiLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEBuYW1lIG1vZGlmaWVyXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGJ1dHRvbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgcmlwcGxlXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdHJ1ZSwgIHRoZSBidXR0b24gd2lsbCBoYXZlIGEgcmlwcGxlIGVmZmVjdCB3aGVuIHRhcHBlZC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICByaXBwbGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBwb3NpdGlvblxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBwb3NpdGlvbiBvZiB0aGUgYnV0dG9uLiBTaG91bGQgYmUgYSBzdHJpbmcgbGlrZSBgXCJib3R0b20gcmlnaHRcImAgb3IgYFwidG9wIGxlZnRcImAuIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkIGl0IHdpbGwgYmUgZGlzcGxheWVkIGFzIGFuIGlubGluZSBlbGVtZW50LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHBvc2l0aW9uOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkaXNhYmxlZFxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBJZiB0cnVlLCB0aGUgYnV0dG9uIHdpbGwgYmUgZGlzYWJsZWQuIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgb25DbGlja1xuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbmVzIHRoZSBidXR0b24gaXMgY2xpY2tlZC4gWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZhYjtcbiIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJ29uc2VudWkvZXNtL2VsZW1lbnRzL29ucy1nZXN0dXJlLWRldGVjdG9yJztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5cbmNvbnN0IHByb3BUeXBlcyA9IHtcblxuICAvKipcbiAgICogQG5hbWUgb25EcmFnXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCB3aGVuIHRoZSB1c2VyIGRyYWdzIGluIGFueSBkaXJlY3Rpb24uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25EcmFnOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25EcmFnTGVmdFxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQgd2hlbiB0aGUgdXNlciBkcmFncyBsZWZ0LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uRHJhZ0xlZnQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkRyYWdSaWdodFxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQgd2hlbiB0aGUgdXNlciBkcmFncyByaWdodC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvbkRyYWdSaWdodDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uRHJhZ1VwXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCB3aGVuIHRoZSB1c2VyIGRyYWdzIHVwLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uRHJhZ1VwOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25EcmFnRG93blxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQgd2hlbiB0aGUgdXNlciBkcmFncyBkb3duLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uRHJhZ0Rvd246IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkhvbGRcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIHdoZW4gdGhlIHVzZXIgaG9sZHMuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25Ib2xkOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25SZWxlYXNlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCB3aGVuIHRoZSB1c2VyIHJlbGVhc2VzLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUmVsZWFzZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uU3dpcGVcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIHdoZW4gdGhlIHVzZXIgc3dpcGVzIGluIGFueSBkaXJlY3Rpb24uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25Td2lwZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uU3dpcGVMZWZ0XG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCB3aGVuIHRoZSB1c2VyIHN3aXBlcyBsZWZ0LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uU3dpcGVMZWZ0OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25Td2lwZVJpZ2h0XG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCB3aGVuIHRoZSB1c2VyIHN3aXBlcyByaWdodC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblN3aXBlUmlnaHQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblN3aXBlVXBcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIHdoZW4gdGhlIHVzZXIgc3dpcGVzIHVwLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uU3dpcGVVcDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uU3dpcGVEb3duXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCB3aGVuIHRoZSB1c2VyIHN3aXBlcyBkb3duLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uU3dpcGVEb3duOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25UYXBcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIHdoZW4gdGhlIHVzZXIgdGFwcy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblRhcDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uRG91YmxlVGFwXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCB3aGVuIHRoZSB1c2VyIGRvdWJsZSB0YXBzLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uRG91YmxlVGFwOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25QaW5jaFxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQgd2hlbiB0aGUgdXNlciBwaW5jaGVzIGluIG9yIG91dC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblBpbmNoOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25QaW5jaEluXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCB3aGVuIHRoZSB1c2VyIHBpbmNoZXMgaW4uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25QaW5jaEluOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25QaW5jaE91dFxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQgd2hlbiB0aGUgdXNlciBwaW5jaGVzIG91dC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblBpbmNoT3V0OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25Ub3VjaFxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQgd2hlbiB0aGUgdXNlciB0b3VjaGVzLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uVG91Y2g6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblRyYW5zZm9ybVxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQgd2hlbiB0aGUgdXNlciB0cmFuc2Zvcm1zLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uVHJhbnNmb3JtOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25Sb3RhdGVcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIHdoZW4gdGhlIHVzZXIgcm90YXRlcy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblJvdGF0ZTogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1nZXN0dXJlLWRldGVjdG9yXG4gKiBAY2F0ZWdvcnkgZ2VzdHVyZVxuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS9nZXN0dXJlLWRldGVjdG9yXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl1Db21wb25lbnQgdG8gZGV0ZWN0IGZpbmdlciBnZXN0dXJlcyB3aXRoaW4gYSB3cmFwcGVkIGVsZW1lbnQuXG4gWy9lbl1cbiAqIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqIDxHZXN0dXJlRGV0ZWN0b3JcbiAqICAgb25UYXA9eygpID0+IGNvbnNvbGUubG9nKCd0YXAnKX1cbiAqICAgb25Td2lwZWxlZnQ9eygpID0+IGNvbnNvbGUubG9nKCdzd2lwZSBsZWZ0Jyl9XG4gKiA+XG4gKiAgIDxkaXYgc3R5bGU9e3tiYWNrZ3JvdW5kQ29sb3I6ICdwaW5rJywgd2lkdGg6ICcxMDBweCcsIGhlaWdodDogJzEwMHB4J319PlxuICogICAgIFN3aXBlIEhlcmVcbiAqICAgPC9kaXY+XG4gKiA8L0dlc3R1cmVEZXRlY3Rvcj5cbiAqXG4gKi9cbmNvbnN0IEdlc3R1cmVEZXRlY3RvciA9IG9uc0N1c3RvbUVsZW1lbnQoJ29ucy1nZXN0dXJlLWRldGVjdG9yJywge3Byb3BUeXBlc30pO1xuR2VzdHVyZURldGVjdG9yLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxuZXhwb3J0IGRlZmF1bHQgR2VzdHVyZURldGVjdG9yO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJ29uc2VudWkvZXNtL2VsZW1lbnRzL29ucy1pY29uJztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5cbmNvbnN0IHBhcnNlSWNvbiA9IGljb24gPT4ge1xuICBpZiAoaWNvbikge1xuICAgIGlmICgodHlwZW9mIGljb24pID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGljb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpY29uKS5maWx0ZXIoKGEpID0+IGEgIT09ICdkZWZhdWx0Jyk7XG4gICAgICBjb25zdCBpbm5lclN0cmluZyA9IGtleXMubWFwKChrZXkpID0+IGtleSArICc6JyArIGljb25ba2V5XSArICcnKTtcbiAgICAgIHJldHVybiBpY29uLmRlZmF1bHQgKyAnLCAnICsgaW5uZXJTdHJpbmcuam9pbignLCcpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgcGFyc2VTaXplID0gc2l6ZSA9PiB7XG4gIGlmIChzaXplKSB7XG4gICAgaWYgKCh0eXBlb2Ygc2l6ZSkgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gYCR7c2l6ZX1weGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzaXplKS5maWx0ZXIoKGEpID0+IGEgIT09ICdkZWZhdWx0Jyk7XG4gICAgICBjb25zdCBpbm5lclN0cmluZyA9IGtleXMubWFwKChrZXkpID0+IGtleSArICc6JyArIHNpemVba2V5XSArICdweCcpO1xuICAgICAgcmV0dXJuIHNpemUuZGVmYXVsdCArICdweCwgJyArIGlubmVyU3RyaW5nLmpvaW4oJywnKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IEVsZW1lbnQgPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtaWNvbicpO1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtaWNvblxuICogQGNhdGVnb3J5IHZpc3VhbFxuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS9pY29uXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl1cbiAqIERpc3BsYXlzIGFuIGljb24uIFRoZSBmb2xsb3dpbmcgaWNvbiBzdWl0ZXMgYXJlIGF2YWlsYWJsZTpcbiAqICAgKiAgW0ZvbnQgQXdlc29tZV0oaHR0cHM6Ly9mb3J0YXdlc29tZS5naXRodWIuaW8vRm9udC1Bd2Vzb21lLylcbiAqICAgKiAgW0lvbmljb25zXShodHRwOi8vaW9uaWNvbnMuY29tLylcbiAqICAgKiAgW01hdGVyaWFsIERlc2lnbiBJY29uaWMgRm9udF0oaHR0cDovL3phdm9sb2tsb20uZ2l0aHViLmlvL21hdGVyaWFsLWRlc2lnbi1pY29uaWMtZm9udC8pXG4gKiBbL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICA8SWNvblxuICAgIHNpemU9e3tkZWZhdWx0OiAzMiwgbWF0ZXJpYWw6IDQwfX1cbiAgICBpY29uPXt7ZGVmYXVsdDogJ2lvbi1uYXZpY29uJywgbWF0ZXJpYWw6ICdtZC1tZW51J319XG4gIC8+XG4qL1xuY29uc3QgSWNvbiA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge2ljb24sIHNpemUsIC4uLnJlc3R9ID0gcHJvcHM7XG5cbiAgcmV0dXJuIChcbiAgICA8RWxlbWVudFxuICAgICAgaWNvbj17cGFyc2VJY29uKGljb24pfVxuICAgICAgc2l6ZT17cGFyc2VTaXplKHNpemUpfVxuICAgICAgey4uLnJlc3R9XG4gICAgICByZWY9e3JlZn1cbiAgICA+XG4gICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgPC9FbGVtZW50PlxuICApO1xufSk7XG5cbkljb24ucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgaWNvbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgaWNvblxuICAgKiBAdHlwZSAnb2JqZWN0IG9yIHN0cmluZydcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gb2JqZWN0LiBJZiBpdCBpcyBhbiBzdHJpbmcsIGl0IGlzIHNldCB0byBhbiBzcGVjaWZpYyBpY29uIGxpa2UgJ2lvbnMtbmF2aWNvbicuIElmIGl0IGlzIGFuIG9iamVjdCwgaXQgcmVwcmVzZW50cyBhIGRpY3Rpb25hcnkgb2YgdGhlIGljb25zIGRlcGVuZGluZyBvbiB0aGUgbW9kaWZpZXIgZS5nLiAgIGB7e2RlZmF1bHQ6ICdpb24tbmF2aWNvbicsIG1hdGVyaWFsOiAnbWQtbWVudSd9fWAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgaWNvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLnN0cmluZyxcbiAgICBQcm9wVHlwZXMub2JqZWN0T2YoUHJvcFR5cGVzLnN0cmluZylcbiAgXSksXG5cbiAgLyoqXG4gICAqIEBuYW1lIHNpemVcbiAgICogQHR5cGUgJ29iamVjdCBvciBudW1iZXInXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBjYW4gYmUgZWl0aGVyIGEgbnVtYmVyIG9yIGFuIG9iamVjdC4gSWYgaXQgaXMgYW4gbnVtYmVyLCBpdCAgc3BlY2lmaWVzIHRoZSBpY29uIHNpemUgd2l0aCBhIG51bWJlciBpbiBwaXhlbHMuIElmIGl0IGlzIGFuIG9iamVjdCwgaXQgcmVwcmVzZW50cyBhIGRpY3Rpb25hcnkgb2YgdGhlIGljb24gc2l6ZXMgZGVwZW5kaW5nIG9uIHRoZSBtb2RpZmllciBlLmcuICAgYHt7ZGVmYXVsdDogMjAsIG1hdGVyaWFsOiAxOH19YCBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBQcm9wVHlwZXMubnVtYmVyLFxuICAgIFByb3BUeXBlcy5vYmplY3RPZihQcm9wVHlwZXMubnVtYmVyKVxuICBdKSxcblxuICAvKipcbiAgICogQG5hbWUgcm90YXRlXG4gICAqIEB0eXBlIG51bWJlclxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gTnVtYmVyIG9mIGRlZ3JlZXMgdG8gcm90YXRlIHRoZSBpY29uLiBWYWxpZCB2YWx1ZXMgYXJlIDkwLCAxODAgYW5kIDI3MC4gWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgcm90YXRlOiBQcm9wVHlwZXMub25lT2YoWzAsIDkwLCAxODAsIDI3MF0pLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBmaXhlZFdpZHRoXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl0gV2hlbiB1c2VkIGluIGEgbGlzdCwgeW91IHdhbnQgdGhlIGljb25zIHRvIGhhdmUgdGhlIHNhbWUgd2lkdGggc28gdGhhdCB0aGV5IGFsaWduIHZlcnRpY2FsbHkgYnkgZGVmaW5pbmcgdGhpcyBhdHRyaWJ1dGUuIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGZpeGVkV2lkdGg6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBzcGluXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl0gU3BlY2lmeSB3aGV0aGVyIHRoZSBpY29uIHNob3VsZCBiZSBzcGlubmluZy4gWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgc3BpbjogUHJvcFR5cGVzLmJvb2xcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEljb247XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtaW5wdXQnO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcbmltcG9ydCBvbmVUaW1lUHJvcCBmcm9tICcuLi9vbmVUaW1lUHJvcCc7XG5pbXBvcnQgSU5QVVRfUFJPUFMgZnJvbSAnLi4vaW5wdXRQcm9wcyc7XG5cbmNvbnN0IG5hbWVNYXAgPSB7XG4gIC4uLklOUFVUX1BST1BTXG59O1xuXG5jb25zdCB3aXRoRGVmYXVsdFZhbHVlID0gY29tcG9uZW50ID0+IG9uZVRpbWVQcm9wKGNvbXBvbmVudCwgJ2RlZmF1bHRWYWx1ZScsICd2YWx1ZScpO1xuXG5jb25zdCBub3RBdHRyaWJ1dGVzID0gW1xuICAndmFsdWUnIC8vIHZhbHVlIG11c3QgYmUgYXBwbGllZCBhcyBwcm9wZXJ0eSBzaW5jZSBhdHRyaWJ1dGUgb25seSB3b3JrcyBiZWZvcmUgaW5wdXQgaXMgdG91Y2hlZFxuXTtcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLWlucHV0XG4gKiBAY2F0ZWdvcnkgZm9ybVxuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS9pbnB1dFxuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dXG4gKiBBbiBpbnB1dCBlbGVtZW50LiBUaGUgYHR5cGVgIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIGlucHV0IHR5cGUuIEFsbCB0ZXh0IGlucHV0IHR5cGVzIGFzIHdlbGwgYXMgYGNoZWNrYm94YCBhbmQgYHJhZGlvYCBhcmUgc3VwcG9ydGVkLiBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSByZW5kZXIgYXMgYSBNYXRlcmlhbCBEZXNpZ24gaW5wdXQgb24gQW5kcm9pZCBkZXZpY2VzLiBNb3N0IGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBub3JtYWwgYDxpbnB1dD5gIGVsZW1lbnQgY2FuIGFsc28gYmUgdXNlZCBvbiB0aGUgYDxvbnMtaW5wdXQ+YCBlbGVtZW50Li5cbiBbL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPElucHV0XG4gKiAgIHZhbHVlPXt0aGlzLnN0YXRlLnRleHR9IGZsb2F0XG4gKiAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHsgdGhpcy5zZXRTdGF0ZSh7dGV4dDogZXZlbnQudGFyZ2V0LnZhbHVlfSl9IH1cbiAqICAgbW9kaWZpZXI9J21hdGVyaWFsJ1xuICogICBwbGFjZWhvbGRlcj0nVXNlcm5hbWUnIC8+XG4gKi9cbmNvbnN0IElucHV0ID0gd2l0aERlZmF1bHRWYWx1ZShvbnNDdXN0b21FbGVtZW50KCdvbnMtaW5wdXQnLCB7ZGVwcmVjYXRlZDogbmFtZU1hcCwgbm90QXR0cmlidXRlc30pKTtcblxuSW5wdXQucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgaW5wdXQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbW9kaWZpZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGRpc2FibGVkXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGlucHV0IGlzIGRpc2FibGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgcmVhZE9ubHlcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZpZXMgd2hldGhlciB0aGUgaW5wdXQgaXMgcmVhZC1vbmx5LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHJlYWRPbmx5OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgb25DaGFuZ2VcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIHdoZW4gdGhlIGlubmVyIGlucHV0IGZpcmVzIGEgYGNoYW5nZWAgZXZlbnQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbklucHV0XG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCB3aGVuIHRoZSBpbm5lciBpbnB1dCBmaXJlcyBhbiBgaW5wdXRgIGV2ZW50LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uSW5wdXQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSB2YWx1ZVxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ29udGVudCBvZiB0aGUgaW5wdXQgKGNvbnRyb2xsZWQpLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIFByb3BUeXBlcy5pbnN0YW5jZU9mKERhdGUpXG4gIF0pLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkZWZhdWx0VmFsdWVcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNvbnRlbnQgb2YgdGhlIGlucHV0IGF0IGZpcnN0IHJlbmRlciAodW5jb250cm9sbGVkKS5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBkZWZhdWx0VmFsdWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgUHJvcFR5cGVzLmluc3RhbmNlT2YoRGF0ZSlcbiAgXSksXG5cbiAgLyoqXG4gICAqIEBuYW1lIHBsYWNlaG9sZGVyXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gUGxhY2Vob2xkZXIgdGV4dC4gSW4gTWF0ZXJpYWwgRGVzaWduIHRoaXMgcGxhY2Vob2xkZXIgd2lsbCBiZSBhIGZsb2F0aW5nIGxhYmVsLiBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBwbGFjZWhvbGRlcjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgdHlwZVxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICAgIFNwZWNpZnkgdGhlIGlucHV0IHR5cGUuIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIFwidHlwZVwiIGF0dHJpYnV0ZSBmb3Igbm9ybWFsIGlucHV0cy4gSXQgZXhwZWN0cyBzdHJpY3QgdGV4dCB0eXBlcyBzdWNoIGFzIGB0ZXh0YCwgYHBhc3N3b3JkYCwgZXRjLiBGb3IgY2hlY2tib3gsIHJhZGlvIGJ1dHRvbiwgc2VsZWN0IG9yIHJhbmdlLCBwbGVhc2UgaGF2ZSBhIGxvb2sgYXQgdGhlIGNvcnJlc3BvbmRpbmcgY29tcG9uZW50cy5cbiAgICpcbiAgICogICAgUGxlYXNlIHRha2UgYSBsb29rIGF0IFtNRE5dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dCNhdHRyLXR5cGUpIGZvciBhbiBleGhhdXN0aXZlIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIGFuZCBicm93c2VyIHZlcnNpb24gc29tZSBvZiB0aGVzZSBtaWdodCBub3Qgd29yay5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGlucHV0SWRcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSAgU3BlY2lmeSB0aGUgXCJpZFwiIGF0dHJpYnV0ZSBvZiB0aGUgaW5uZXIgYDxpbnB1dD5gIGVsZW1lbnQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gdXNpbmcgPGxhYmVsIGZvcj1cIi4uLlwiPiBlbGVtZW50cyBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBpbnB1dElkOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBmbG9hdFxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgdGhlIHBsYWNlaG9sZGVyIHdpbGwgYmUgYW5pbWF0ZWQgaW4gTWF0ZXJpYWwgRGVzaWduLiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZmxvYXQ6IFByb3BUeXBlcy5ib29sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBJbnB1dDtcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtbGlzdCc7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuXG5jb25zdCBFbGVtZW50ID0gb25zQ3VzdG9tRWxlbWVudCgnb25zLWxpc3QnKTtcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLWxpc3RcbiAqIEBjYXRlZ29yeSBsaXN0XG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL2xpc3RcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgQ29tcG9uZW50IGZvciByZXByZXNlbnRpbmcgYSBsaXN0LiBJdCB0YWtlcyBhbiBhcnJheSBjYWxsZWQgZGF0YXNvdXJjZSBhbmQgY2FsbHMgcmVuZGVyUm93KHJvdywgaW5kZXgpIGZvciBldmVyeSByb3cuICBGdXJ0aGVybW9yZSwgdGhlIGhlYWRlciBhbmQgdGhlIGZvb3RlciBjYW4gYmUgc3BlY2lmaWVkIHdpdGggYHJlbmRlclJvd2AgYW5kIGByZW5kZXJIZWFkZXJgIHJlc3BlY3RpdmVseS4gWy9lbl1cbiAqIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAgPExpc3RcbiAgICBkYXRhU291cmNlPXtbJ1JvdyAxJywgJ1JvdyAyJ119XG4gICAgcmVuZGVySGVhZGVyPXt0aGlzLnJlbmRlckhlYWRlcn1cbiAgICByZW5kZXJSb3c9eyhyb3csIGlkeCkgPT4gKFxuICAgICAgPExpc3RJdGVtIG1vZGlmaWVyPXtpZHggPT09IHRoaXMuc3RhdGUuZGF0YS5sZW5ndGggLSAxID8gJ2xvbmdkaXZpZGVyJyA6IG51bGx9PlxuICAgICAge3Jvd31cbiAgPEJ1dHRvbiBtb2RpZmllcj1cInF1aWV0XCIgb25DbGljaz17dGhpcy5yZW1vdmUuYmluZCh0aGlzLCBpZHgpfT5SZW1vdmU8L0J1dHRvbj5cbiAgPC9MaXN0SXRlbT5cbiAgKX1cbiAgcmVuZGVyRm9vdGVyPXt0aGlzLnJlbmRlckZvb3Rlcn1cbiAgLz5cbiAqL1xuY29uc3QgTGlzdCA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge3JlbmRlckhlYWRlciwgcmVuZGVyRm9vdGVyLCByZW5kZXJSb3csIGRhdGFTb3VyY2UsIC4uLnJlc3R9ID0gcHJvcHM7XG5cbiAgY29uc3Qgcm93cyA9IGRhdGFTb3VyY2UubWFwKChkYXRhLCBpbmRleCkgPT4gcmVuZGVyUm93KGRhdGEsIGluZGV4KSk7XG5cbiAgcmV0dXJuIChcbiAgICA8RWxlbWVudFxuICAgICAgey4uLnJlc3R9XG4gICAgICByZWY9e3JlZn1cbiAgICA+XG4gICAgICB7cmVuZGVySGVhZGVyKCl9XG4gICAgICB7cm93c31cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICAgIHtyZW5kZXJGb290ZXIoKX1cbiAgICA8L0VsZW1lbnQ+XG4gICk7XG59KTtcblxuTGlzdC5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSBtb2RpZmllclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBTcGVjaWZ5IG1vZGlmaWVyIG5hbWUgdG8gc3BlY2lmeSBjdXN0b20gc3R5bGVzLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbW9kaWZpZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGRhdGFTb3VyY2VcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgICBTb3VyY2Ugb2YgdGhlIGxpc3QgZGF0YS4gU2hvdWxkIGJlIGFuIGFycmF5LlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZGF0YVNvdXJjZTogUHJvcFR5cGVzLmFycmF5LFxuXG4gIC8qKlxuICAgKiBAbmFtZSByZW5kZXJSb3dcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBGdW5jdGlvbiB0byBzcGVjaWZ5IHRoZSByZW5kZXJpbmcgZnVuY3Rpb24gZm9yIGV2ZXJ5IGVsZW1lbnQgaW5cbiAgICogIGluIHRoZSBkYXRhU291cmNlLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgcmVuZGVyUm93OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgcmVuZGVySGVhZGVyXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgRnVuY3Rpb24gdG8gc3BlY2lmeSB0aGUgcmVuZGVyaW5nIGZ1bmN0aW9uIGZvciB0aGUgaGVhZGVyXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICByZW5kZXJIZWFkZXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSByZW5kZXJGb290ZXJcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBGdW5jdGlvbiB0byBzcGVjaWZ5IHRoZSByZW5kZXJpbmcgZnVuY3Rpb24gZm9yIHRoZSBmb290ZXJcbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHJlbmRlckZvb3RlcjogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbkxpc3QuZGVmYXVsdFByb3BzID0ge1xuICBkYXRhU291cmNlOiBbXSxcbiAgcmVuZGVyUm93OiAoKSA9PiBudWxsLFxuICByZW5kZXJIZWFkZXI6ICgpID0+IG51bGwsXG4gIHJlbmRlckZvb3RlcjogKCkgPT4gbnVsbFxufTtcblxuZXhwb3J0IGRlZmF1bHQgTGlzdDtcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtbGF6eS1yZXBlYXQnO1xuXG5pbXBvcnQgTGlzdCBmcm9tICcuL0xpc3QnO1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtbGF6eS1yZXBlYXRcbiAqIEBjYXRlZ29yeSBsaXN0XG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL2xhenktbGlzdFxuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dIFVzaW5nIHRoaXMgY29tcG9uZW50IGEgbGlzdCB3aXRoIG1pbGxpb25zIG9mIGl0ZW1zIGNhbiBiZSByZW5kZXJlZCB3aXRob3V0IGEgZHJvcCBpbiBwZXJmb3JtYW5jZS5cbiAqICAgICBJdCBkb2VzIHRoYXQgYnkgXCJsYXppbHlcIiBsb2FkaW5nIGVsZW1lbnRzIGludG8gdGhlIERPTSB3aGVuIHRoZXkgY29tZSBpbnRvIHZpZXcgYW5kXG4gKiAgICAgcmVtb3ZpbmcgaXRlbXMgZnJvbSB0aGUgRE9NIHdoZW4gdGhleSBhcmUgbm90IHZpc2libGUuXG4gWy9lbl1cbiAqIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqXG4gIHJlbmRlclJvdyhpbmRleCkge1xuICAgIHJldHVybiAoXG4gICAgICA8TGlzdEl0ZW0ga2V5PXtpbmRleH0+XG4gICAgICAgIHsnSXRlbSAnICsgKGluZGV4ICsgMSl9XG4gICAgICA8L0xpc3RJdGVtPlxuICAgICk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxQYWdlIHJlbmRlclRvb2xiYXI9eygpID0+IDxNeVRvb2xiYXIgdGl0bGU9J0xhenlMaXN0JyAvPn0gPlxuICAgICAgICA8ZGl2IHN0eWxlPXt7aGVpZ2h0OiAxMDB9fT5cbiAgICAgICAgICA8TGF6eUxpc3RcbiAgICAgICAgICAgIGxlbmd0aD17MTAwMH1cbiAgICAgICAgICAgIHJlbmRlclJvdz17KCkgPT5cbiAgICAgICAgICAgICAgPExpc3RJdGVtIGtleT17aW5kZXh9PlxuICAgICAgICAgICAgICAgIHsnSXRlbSAnICsgKGluZGV4ICsgMSl9XG4gICAgICAgICAgICAgIDwvTGlzdEl0ZW0+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxjdWxhdGVJdGVtSGVpZ2h0PXsoKSA9PiA0NH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvUGFnZT5cbiAgICApO1xuICB9XG59XG4gKi9cbmNvbnN0IExhenlMaXN0ID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCByZWYgPSBmb3J3YXJkZWRSZWYgfHwgdXNlUmVmKCk7XG4gIGNvbnN0IFtjaGlsZHJlbiwgc2V0Q2hpbGRyZW5dID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbLCBzZXRVcGRhdGVUb3BdID0gdXNlU3RhdGUoKTtcblxuICBjb25zdCB7Y2FsY3VsYXRlSXRlbUhlaWdodCwgcmVuZGVyUm93LCBsZW5ndGgsIC4uLnJlc3R9ID0gcHJvcHM7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICByZWYuY3VycmVudC5kZWxlZ2F0ZSA9IHtcbiAgICAgIGNhbGN1bGF0ZUl0ZW1IZWlnaHQ6IGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBjYWxjdWxhdGVJdGVtSGVpZ2h0KGluZGV4KTtcbiAgICAgIH0sXG4gICAgICBfcmVuZGVyOiBmdW5jdGlvbihzdGFydCwgbGltaXQsIHVwZGF0ZVRvcCkge1xuICAgICAgICBjb25zdCBlbCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBsaW1pdDsgaSsrKSB7XG4gICAgICAgICAgZWwucHVzaChyZW5kZXJSb3coaSkpO1xuICAgICAgICB9XG4gICAgICAgIHNldENoaWxkcmVuKGVsKTtcbiAgICAgICAgc2V0VXBkYXRlVG9wKHVwZGF0ZVRvcCk7IC8vIGRvZXNuJ3Qgd29yayB3aXRob3V0IHRoaXMsIGJ1dCB3aHk/IGRvZXMgaXQganVzdCB0cmlnZ2VyIGEgcmVyZW5kZXI/XG4gICAgICB9LFxuICAgICAgY291bnRJdGVtczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2NhbGN1bGF0ZUl0ZW1IZWlnaHQsIHJlbmRlclJvdywgbGVuZ3RoXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8TGlzdFxuICAgICAgey4uLnJlc3R9XG4gICAgICBzdHlsZT17e3Bvc2l0aW9uOiAncmVsYXRpdmUnfX1cbiAgICA+XG4gICAgICA8b25zLWxhenktcmVwZWF0IHJlZj17cmVmfSAvPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvTGlzdD5cbiAgKTtcbn0pO1xuXG5MYXp5TGlzdC5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSBtb2RpZmllclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBsYXp5IGxpc3QuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbW9kaWZpZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGxlbmd0aFxuICAgKiBAdHlwZSBudW1iZXJcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGxlbmd0aCBvZiB0aGUgbGlzdC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBsZW5ndGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogQG5hbWUgcmVuZGVyUm93XG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBBIGZ1bmN0aW9uIGdpdmVuIHRoZSBpbmRleCBvZiB0aGUgdG8gZGlzcGxheSByb3csIHJlbmRlcnMgaXQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgcmVuZGVyUm93OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBjYWxjdWxhdGVJdGVtSGVpZ2h0XG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBBIGZ1bmN0aW9uIGdpdmVuIHRoZSBpbmRleCBvZiB0aGUgdG8gcm93LCByZXR1cm5zIHRoZSBoZWlnaHQgb2YgaXQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgY2FsY3VsYXRlSXRlbUhlaWdodDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxufTtcblxuZXhwb3J0IGRlZmF1bHQgTGF6eUxpc3Q7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtbGlzdC1oZWFkZXInO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLWxpc3QtaGVhZGVyXG4gKiBAY2F0ZWdvcnkgbGlzdFxuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS9saXN0XG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl0gSGVhZGVyIGVsZW1lbnQgZm9yIGxpc3QgaXRlbXMuIE11c3QgYmUgcHV0IGluc2lkZSBvbnMtbGlzdCBjb21wb25lbnQuXG4gWy9lbl1cbiAqIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAgIDxMaXN0XG4gICAgIGRhdGFTb3VyY2U9e3RoaXMuc3RhdGUuZGF0YX1cbiAgICAgcmVuZGVySGVhZGVyPXsoKSA9PlxuICAgICAgICA8TGlzdEhlYWRlciBzdHlsZT17e2ZvbnRTaXplOiAxNX19IGNsYXNzTmFtZT1cInRlc3RDbGFzc1wiPiBIZWFkZXIgVGV4dCA8L0xpc3RIZWFkZXI+IH1cbiAgICByZW5kZXJSb3c9eyhyb3csIGlkeCkgPT4gKFxuICAgICAgPExpc3RJdGVtID4ge3Jvd30gPC9MaXN0SXRlbT5cbiAgICApfVxuICAvPlxuICovXG5jb25zdCBMaXN0SGVhZGVyID0gb25zQ3VzdG9tRWxlbWVudCgnb25zLWxpc3QtaGVhZGVyJyk7XG5cbkxpc3RIZWFkZXIucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgU3BlY2lmeSBtb2RpZmllciBuYW1lIHRvIHNwZWNpZnkgY3VzdG9tIHN0eWxlcy4gT3B0aW9uYWwuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTGlzdEhlYWRlcjtcbiIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJ29uc2VudWkvZXNtL2VsZW1lbnRzL29ucy1saXN0LWl0ZW0nO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuY29uc3QgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGxpc3QgaXRlbS5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgdGFwcGFibGVcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBsaXN0IGl0ZW0gaXMgdGFwcGFibGUuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICB0YXBwYWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIHRhcEJhY2tncm91bmRDb2xvclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBDaGFuZ2VzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHdoZW4gdGFwcGVkLiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgYXR0cmlidXRlIFwidGFwcGFibGVcIiBuZWVkcyB0byBiZSBzZXQuIFRoZSBkZWZhdWx0IGNvbG9yIGlzIFwiI2Q5ZDlkOVwiLiBJdCB3aWxsIGRpc3BsYXkgYXMgYSByaXBwbGUgZWZmZWN0IG9uIEFuZHJvaWQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICB0YXBCYWNrZ3JvdW5kQ29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGtlZXBUYXBCYWNrZ3JvdW5kQ29sb3JcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIFByZXZlbnQgZnJvbSBjbGVhcmluZyB0aGUgYmFja2dyb3VuZCBjb2xvciBvbiBgXCJ0b3VjaG1vdmVcImAsIGBcInRvdWNoY2FuY2VsXCJgLCBgXCJ0b3VjaGVuZFwiYCwgYFwidG91Y2hsZWF2ZVwiYCwgYFwibW91c2V1cFwiYCwgYW5kIGBcIm1vdXNlb3V0XCJgLiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgYXR0cmlidXRlIFwidGFwcGFibGVcIiBuZWVkcyB0byBiZSBzZXQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBrZWVwVGFwQmFja2dyb3VuZENvbG9yOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgbG9ja09uRHJhZ1xuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBQcmV2ZW50IHZlcnRpY2FsIHNjcm9sbGluZyB3aGVuIHRoZSB1c2VyIGRyYWdzIGhvcml6b250YWxseS4gWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbG9ja09uRHJhZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGV4cGFuZGFibGVcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZpZXMgd2hldGhlciBsaXN0IGl0ZW0gY2FuIGJlIGV4cGFuZGVkIHRvIHJldmVhbCBoaWRkZW4gY29udGVudC4gRXhwYW5kZWQgY29udGVudCBtdXN0IGJlIGRlZmluZWQgaW4gYGRpdi5leHBhbmRhYmxlLWNvbnRlbnRgLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGV4cGFuZGFibGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBleHBhbmRlZFxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUZvciBleHBhbmRhYmxlIGxpc3QgaXRlbXMsIHNwZWNpZmllcyB3aGV0aGVyIGl0ZW0gaXMgZXhwYW5kZWRbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBleHBhbmRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uRXhwYW5kXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGV4cGFuZGFibGUgbGlzdCBpdGVtIGV4cGFuZHMgb3IgY29udHJhY3RzLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uRXhwYW5kOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBzaG93aW5nIGFuZCBoaWRpbmcgdGhlIGV4cGFuZGFibGUgY29udGVudC4gQ2FuIGJlIGVpdGhlciBcImRlZmF1bHRcIiBvciBcIm5vbmVcIi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBhbmltYXRpb246IFByb3BUeXBlcy5zdHJpbmdcbn07XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1saXN0LWl0ZW1cbiAqIEBjYXRlZ29yeSBsaXN0XG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL2xpc3RcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgIENvbXBvbmVudCB0aGF0IHJlcHJlc2VudHMgZWFjaCBpdGVtIGluIHRoZSBsaXN0LiBNdXN0IGJlIHB1dCBpbnNpZGUgdGhlIGBMaXN0YCBjb21wb25lbnQuIFRoZSBsaXN0IGl0ZW0gaXMgY29tcG9zZWQgb2YgZm91ciBwYXJ0cyB0aGF0IGFyZSByZXByZXNlbnRlZCB3aXRoIHRoZSBgbGVmdGAsIGBjZW50ZXJgLCBgcmlnaHRgIGFuZCBgZXhwYW5kYWJsZS1jb250ZW50YCBjbGFzc2VzLiBUaGVzZSBjbGFzc2VzIGNhbiBiZSB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250ZW50IG9mIHRoZSBsaXN0IGl0ZW1zIGlzIHByb3Blcmx5IGFsaWduZWQuXG4gKiAgIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gICA8TGlzdEl0ZW0+XG4gKiAgIDxkaXYgY2xhc3NOYW1lPVwibGVmdFwiPkxlZnQ8L2Rpdj5cbiAqICAgPGRpdiBjbGFzc05hbWU9XCJjZW50ZXJcIj5DZW50ZXI8L2Rpdj5cbiAqICAgPGRpdiBjbGFzc05hbWU9XCJyaWdodFwiPlJpZ2h0PC9kaXY+XG4gKiAgIDxkaXYgY2xhc3NOYW1lPVwiZXhwYW5kYWJsZS1jb250ZW50XCI+RXhwYW5kYWJsZSBjb250ZW50PC9kaXY+XG4gKiA8L0xpc3RJdGVtPlxuICovXG5jb25zdCBMaXN0SXRlbSA9IG9uc0N1c3RvbUVsZW1lbnQoJ29ucy1saXN0LWl0ZW0nLCB7cHJvcFR5cGVzfSk7XG5MaXN0SXRlbS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cbmV4cG9ydCBkZWZhdWx0IExpc3RJdGVtO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLWxpc3QtdGl0bGUnO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuY29uc3QgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgU3BlY2lmeSBtb2RpZmllciBuYW1lIHRvIHNwZWNpZnkgY3VzdG9tIHN0eWxlcy4gT3B0aW9uYWwuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLWxpc3QtdGl0bGVcbiAqIEBjYXRlZ29yeSBsaXN0XG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL2xpc3RcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXSBUaXRsZSBlbGVtZW50IGZvciBsaXN0cy4gVXN1YWxseSBjb21lcyBiZWZvcmUgb25zLWxpc3QgY29tcG9uZW50LlxuIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8TGlzdFRpdGxlPkxpc3QgVGl0bGU8L0xpc3RUaXRsZT5cbiAgIDxMaXN0XG4gICAgIGRhdGFTb3VyY2U9e3RoaXMuc3RhdGUuZGF0YX1cbiAgICAgcmVuZGVySGVhZGVyPXsoKSA9PlxuICAgICAgICA8TGlzdEhlYWRlciBzdHlsZT17e2ZvbnRTaXplOiAxNX19IGNsYXNzTmFtZT1cInRlc3RDbGFzc1wiPiBIZWFkZXIgVGV4dCA8L0xpc3RIZWFkZXI+IH1cbiAgICByZW5kZXJSb3c9eyhyb3csIGlkeCkgPT4gKFxuICAgICAgPExpc3RJdGVtID4ge3Jvd30gPC9MaXN0SXRlbT5cbiAgICApfVxuICAvPlxuICovXG5jb25zdCBMaXN0VGl0bGUgPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtbGlzdC10aXRsZScsIHtwcm9wVHlwZXN9KTtcbkxpc3RUaXRsZS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cbmV4cG9ydCBkZWZhdWx0IExpc3RUaXRsZTtcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJ29uc2VudWkvZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3InO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuY29uc3QgRWxlbWVudCA9IG9uc0N1c3RvbUVsZW1lbnQoJ29ucy1uYXZpZ2F0b3InKTtcblxuY2xhc3MgTmF2aWdhdG9yQ2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7XG4gICAgc3VwZXIoLi4uYXJncyk7XG4gICAgdGhpcy5yZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcbiAgICB0aGlzLnBhZ2VzID0gW107XG4gICAgdGhpcy5zdGF0ZSA9IHsgfTtcbiAgICB0aGlzLl9wcmVQdXNoID0gdGhpcy5fcHJlUHVzaC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3Bvc3RQdXNoID0gdGhpcy5fcG9zdFB1c2guYmluZCh0aGlzKTtcbiAgICB0aGlzLl9wcmVQb3AgPSB0aGlzLl9wcmVQb3AuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9wb3N0UG9wID0gdGhpcy5fcG9zdFBvcC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgdXBkYXRlKHBhZ2VzLCBvYmopIHtcbiAgICB0aGlzLnBhZ2VzID0gcGFnZXMgfHwgW107XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLmZvcmNlVXBkYXRlKHJlc29sdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcmVzZXRQYWdlXG4gICAqIEBzaWduYXR1cmUgcmVzZXRQYWdlKHJvdXRlLCBvcHRpb25zID0ge30pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByb3V0ZVxuICAgKiAgIFtlbl0gVGhlIHJvdXRlIHRoYXQgdGhlIHBhZ2Ugc2hvdWxkIGJlIHJlc2V0IHRvLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIHJldmVhbGVkIHBhZ2UuWy9lbl1cbiAgICogICBbamFd5piO44KJ44GL44Gr44GX44Gf44Oa44O844K444KS6Kej5rG644GZ44KLUHJvbWlzZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXNldHMgdGhlIGN1cnJlbnQgcGFnZVsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICByZXNldFBhZ2Uocm91dGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLnJlc2V0UGFnZVN0YWNrKFtyb3V0ZV0sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcmVzZXRQYWdlU3RhY2tcbiAgICogQHNpZ25hdHVyZSByZXNldFBhZ2VTdGFjayhyb3V0ZSwgb3B0aW9ucyA9IHt9KVxuICAgKiBAcGFyYW0ge0FycmF5fSByb3V0ZXNcbiAgICogICBbZW5dIFRoZSByb3V0ZXMgdGhhdCB0aGUgbmF2aWdhdG9yIHNob3VsZCBiZSByZXNldCB0by5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1Qcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSByZXZlYWxlZCBwYWdlLlsvZW5dXG4gICAqICAgW2phXeaYjuOCieOBi+OBq+OBl+OBn+ODmuODvOOCuOOCkuino+axuuOBmeOCi1Byb21pc2XjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dIFJlc2V0cyB0aGUgbmF2aWdhdG9yIHRvIHRoZSBjdXJyZW50IHBhZ2Ugc3RhY2tbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgcmVzZXRQYWdlU3RhY2socm91dGVzLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdOYXZpZ2F0b3IgaXMgYWxyZWFkeSBydW5uaW5nIGFuaW1hdGlvbi4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBoaWRlUGFnZXMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBwYWdlRWxlbWVudHMgPSB0aGlzLnJlZi5jdXJyZW50LnBhZ2VzO1xuICAgICAgZm9yIChsZXQgaSA9IHBhZ2VFbGVtZW50cy5sZW5ndGggLSAyOyBpID49IDA7IGktLSkge1xuICAgICAgICBwYWdlRWxlbWVudHNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKG9wdGlvbnMucG9wKSB7XG4gICAgICB0aGlzLnJvdXRlc0JlZm9yZVBvcCA9IHRoaXMucm91dGVzLnNsaWNlKCk7XG4gICAgICB0aGlzLnJvdXRlc0FmdGVyUG9wID0gcm91dGVzO1xuICAgICAgdGhpcy5yb3V0ZXMgPSByb3V0ZXMuY29uY2F0KFt0aGlzLnJvdXRlc1t0aGlzLnJvdXRlcy5sZW5ndGggLSAxXV0pO1xuXG4gICAgICBjb25zdCB1cGRhdGUgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucGFnZXMucG9wKCk7XG4gICAgICAgIHRoaXMucm91dGVzID0gcm91dGVzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHRoaXMuZm9yY2VVcGRhdGUocmVzb2x2ZSkpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHRoaXMucGFnZXMpXG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMucmVmLmN1cnJlbnQuX3BvcFBhZ2Uob3B0aW9ucywgdXBkYXRlKSlcbiAgICAgICAgLnRoZW4oKCkgPT4gaGlkZVBhZ2VzKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RSb3V0ZSA9IHJvdXRlc1tyb3V0ZXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgbmV3UGFnZSA9IHRoaXMucHJvcHMucmVuZGVyUGFnZShsYXN0Um91dGUsIHRoaXMpO1xuICAgIHRoaXMucm91dGVzLnB1c2gobGFzdFJvdXRlKTtcblxuICAgIGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMucGFnZXMucHVzaChuZXdQYWdlKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gdGhpcy5mb3JjZVVwZGF0ZShyZXNvbHZlKSk7XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnJlZi5jdXJyZW50Ll9wdXNoUGFnZShvcHRpb25zLCB1cGRhdGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3V0ZXMgPSByb3V0ZXM7XG4gICAgICB0aGlzLnBhZ2VzID0gcm91dGVzLm1hcChyb3V0ZSA9PiB0aGlzLnByb3BzLnJlbmRlclBhZ2Uocm91dGUsIHRoaXMpKTtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZSh0aGlzLnBhZ2VzKS50aGVuKCgpID0+IGhpZGVQYWdlcygpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHB1c2hQYWdlXG4gICAqIEBzaWduYXR1cmUgcHVzaFBhZ2Uocm91dGUsIG9wdGlvbnMgPSB7fSlcbiAgICogQHBhcmFtIHtPYmplY3R9IHJvdXRlXG4gICAqICAgW2VuXSBUaGUgcm91dGUgdGhhdCB0aGUgbmF2aWdhdG9yIHNob3VsZCBwdXNoIHRvLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXSBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSByZXZlYWxlZCBwYWdlLlsvZW5dXG4gICAqICAgW2phXeaYjuOCieOBi+OBq+OBl+OBn+ODmuODvOOCuOOCkuino+axuuOBmeOCi1Byb21pc2XjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dIFB1c2hlcyBhIHBhZ2UgdG8gdGhlIHBhZ2Ugc3RhY2tbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgcHVzaFBhZ2Uocm91dGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICh0aGlzLmlzUnVubmluZygpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ05hdmlnYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmcgYW5pbWF0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICB0aGlzLnBhZ2VzLnB1c2godGhpcy5wcm9wcy5yZW5kZXJQYWdlKHJvdXRlLCB0aGlzKSk7XG4gICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZShyZXNvbHZlKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnJvdXRlcy5wdXNoKHJvdXRlKTtcbiAgICAgIHRoaXMucmVmLmN1cnJlbnRcbiAgICAgICAgLl9wdXNoUGFnZShcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHVwZGF0ZVxuICAgICAgICApXG4gICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLnJvdXRlcy5wb3AoKTtcbiAgICAgICAgICB0aGlzLnBhZ2VzLnBvcCgpO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzUnVubmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWYuY3VycmVudC5faXNSdW5uaW5nO1xuICB9XG5cbiAgLypcbiAgICogQG1ldGhvZCByZXBsYWNlUGFnZVxuICAgKiBAc2lnbmF0dXJlIHJlcGxhY2VQYWdlKHJvdXRlLCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByb3V0ZVxuICAgKiAgIFtlbl0gVGhlIHJvdXRlIHRoYXQgdGhlIG5hdmlnYXRvciBzaG91bGQgcmVwbGFjZSB0aGUgdG9wIHBhZ2Ugd2l0aC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1Qcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSBuZXcgcGFnZS5bL2VuXVxuICAgKiAgIFtqYV3mlrDjgZfjgYTjg5rjg7zjgrjjgpLop6PmsbrjgZnjgotQcm9taXNl44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJlcGxhY2VzIHRoZSBjdXJyZW50IHRvcCBwYWdlIHdpdGggdGhlIHNwZWNpZmllZCBvbmUuIEV4dGVuZHMgYHB1c2hQYWdlKClgIHBhcmFtZXRlcnMuWy9lbl1cbiAgICogICBbamFd54++5Zyo6KGo56S65Lit44Gu44Oa44O844K444KS44KS5oyH5a6a44GX44Gf44Oa44O844K444Gr572u44GN5o+b44GI44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHJlcGxhY2VQYWdlKHJvdXRlLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdOYXZpZ2F0b3IgaXMgYWxyZWFkeSBydW5uaW5nIGFuaW1hdGlvbi4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wdXNoUGFnZShyb3V0ZSwgb3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBwb3MgPSB0aGlzLnBhZ2VzLmxlbmd0aCAtIDI7XG4gICAgICB0aGlzLnBhZ2VzLnNwbGljZShwb3MsIDEpO1xuICAgICAgdGhpcy5yb3V0ZXMuc3BsaWNlKHBvcywgMSk7XG4gICAgICB0aGlzLnJlZi5jdXJyZW50LnRvcFBhZ2UudXBkYXRlQmFja0J1dHRvbih0aGlzLnBhZ2VzLmxlbmd0aCA+IDEpO1xuICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcG9wUGFnZVxuICAgKiBAc2lnbmF0dXJlIHBvcFBhZ2Uob3B0aW9ucyA9IHt9KVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl0gUHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byB0aGUgcmV2ZWFsZWQgcGFnZS5bL2VuXVxuICAgKiAgIFtqYV3mmI7jgonjgYvjgavjgZfjgZ/jg5rjg7zjgrjjgpLop6PmsbrjgZnjgotQcm9taXNl44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXSBQb3BzIGEgcGFnZSBvdXQgb2YgdGhlIHBhZ2Ugc3RhY2tbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgcG9wUGFnZShvcHRpb25zID0ge30pIHtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdOYXZpZ2F0b3IgaXMgYWxyZWFkeSBydW5uaW5nIGFuaW1hdGlvbi4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnJvdXRlc0JlZm9yZVBvcCA9IHRoaXMucm91dGVzLnNsaWNlKCk7XG4gICAgdGhpcy5yb3V0ZXNBZnRlclBvcCA9IHRoaXMucm91dGVzQmVmb3JlUG9wLnNsaWNlKDAsIHRoaXMucm91dGVzQmVmb3JlUG9wLmxlbmd0aCAtIDEpO1xuXG4gICAgY29uc3QgdXBkYXRlID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXMucGFnZXMucG9wKCk7XG4gICAgICAgIHRoaXMucm91dGVzLnBvcCgpO1xuXG4gICAgICAgIFJlYWN0RE9NLmZsdXNoU3luYygoKSA9PiB7IC8vIHByZXZlbnRzIGZsaWNrZXJpbmcgY2F1c2VkIGJ5IFJlYWN0IDE4IGJhdGNoaW5nXG4gICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZShyZXNvbHZlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucmVmLmN1cnJlbnQuX3BvcFBhZ2Uob3B0aW9ucywgdXBkYXRlKTtcbiAgfVxuXG4gIF9vbkRldmljZUJhY2tCdXR0b24oZXZlbnQpIHtcbiAgICBpZiAodGhpcy5wYWdlcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLnBvcFBhZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXZlbnQuY2FsbFBhcmVudEhhbmRsZXIoKTtcbiAgICB9XG4gIH1cblxuICBfcHJlUG9wKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5yZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnJvdXRlcyA9IHtcbiAgICAgIHBvcHBpbmdSb3V0ZTogdGhpcy5yb3V0ZXNCZWZvcmVQb3BbdGhpcy5yb3V0ZXNCZWZvcmVQb3AubGVuZ3RoIC0gMV0sXG4gICAgICByb3V0ZXM6IHRoaXMucm91dGVzQmVmb3JlUG9wXG4gICAgfTtcblxuICAgIHRoaXMucHJvcHMub25QcmVQb3AoZXZlbnQpO1xuICB9XG5cbiAgX3Bvc3RQb3AoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLnJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucm91dGVzID0ge1xuICAgICAgcG9wcGVkUm91dGU6IHRoaXMucm91dGVzQmVmb3JlUG9wW3RoaXMucm91dGVzQmVmb3JlUG9wLmxlbmd0aCAtIDFdLFxuICAgICAgcm91dGVzOiB0aGlzLnJvdXRlc0FmdGVyUG9wXG4gICAgfTtcblxuICAgIHRoaXMucHJvcHMub25Qb3N0UG9wKGV2ZW50KTtcbiAgfVxuXG4gIF9wcmVQdXNoKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5yZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnJvdXRlcyA9IHtcbiAgICAgIHB1c2hpbmdSb3V0ZTogdGhpcy5yb3V0ZXNbdGhpcy5yb3V0ZXMubGVuZ3RoIC0gMV0sXG4gICAgICByb3V0ZXM6IHRoaXMucm91dGVzLnNsaWNlKDAsIHRoaXMucm91dGVzLmxlbmd0aCAtIDEpXG4gICAgfTtcblxuICAgIHRoaXMucHJvcHMub25QcmVQdXNoKGV2ZW50KTtcbiAgfVxuXG4gIF9wb3N0UHVzaChldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMucmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5yb3V0ZXMgPSB7XG4gICAgICBwdXNoZWRSb3V0ZTogdGhpcy5yb3V0ZXNbdGhpcy5yb3V0ZXMubGVuZ3RoIC0gMV0sXG4gICAgICByb3V0ZXM6IHRoaXMucm91dGVzXG4gICAgfTtcblxuICAgIHRoaXMucHJvcHMub25Qb3N0UHVzaChldmVudCk7XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5yZWYuY3VycmVudDtcbiAgICBub2RlLnBvcFBhZ2UgPSB0aGlzLnBvcFBhZ2UuYmluZCh0aGlzKTtcblxuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigncHJlcHVzaCcsIHRoaXMuX3ByZVB1c2gpO1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigncG9zdHB1c2gnLCB0aGlzLl9wb3N0UHVzaCk7XG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdwcmVwb3AnLCB0aGlzLl9wcmVQb3ApO1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigncG9zdHBvcCcsIHRoaXMuX3Bvc3RQb3ApO1xuXG4gICAgbm9kZS5zd2lwZU1heCA9IHRoaXMucHJvcHMuc3dpcGVQb3A7XG4gICAgbm9kZS5vbkRldmljZUJhY2tCdXR0b24gPSB0aGlzLnByb3BzLm9uRGV2aWNlQmFja0J1dHRvbiB8fCB0aGlzLl9vbkRldmljZUJhY2tCdXR0b24uYmluZCh0aGlzKTtcblxuICAgIGlmICh0aGlzLnByb3BzLmluaXRpYWxSb3V0ZSAmJiB0aGlzLnByb3BzLmluaXRpYWxSb3V0ZVN0YWNrKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luIE5hdmlnYXRvciBlaXRoZXIgaW5pdGFsUm91dGUgb3IgaW5pdGFsUm91dGVzIGNhbiBiZSBzZXQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5pbml0aWFsUm91dGUpIHtcbiAgICAgIHRoaXMucm91dGVzID0gW3RoaXMucHJvcHMuaW5pdGlhbFJvdXRlXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuaW5pdGlhbFJvdXRlU3RhY2spIHtcbiAgICAgIHRoaXMucm91dGVzID0gdGhpcy5wcm9wcy5pbml0aWFsUm91dGVTdGFjaztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3V0ZXMgPSBbXTtcbiAgICB9XG5cbiAgICB0aGlzLnBhZ2VzID0gdGhpcy5yb3V0ZXMubWFwKFxuICAgICAgKHJvdXRlKSA9PiB0aGlzLnByb3BzLnJlbmRlclBhZ2Uocm91dGUsIHRoaXMpXG4gICAgKTtcbiAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMub25EZXZpY2VCYWNrQnV0dG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVmLmN1cnJlbnQub25EZXZpY2VCYWNrQnV0dG9uID0gdGhpcy5wcm9wcy5vbkRldmljZUJhY2tCdXR0b247XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMucmVmLmN1cnJlbnQ7XG4gICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwcmVwdXNoJywgdGhpcy5wcm9wcy5vblByZVB1c2gpO1xuICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9zdHB1c2gnLCB0aGlzLnByb3BzLm9uUG9zdFB1c2gpO1xuICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncHJlcG9wJywgdGhpcy5wcm9wcy5vblByZVBvcCk7XG4gICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb3N0cG9wJywgdGhpcy5wcm9wcy5vblBvc3RQb3ApO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlubmVyUmVmLFxuICAgICAgcmVuZGVyUGFnZSxcblxuICAgICAgLy8gdGhlc2UgcHJvcHMgc2hvdWxkIG5vdCBiZSBwYXNzZWQgZG93blxuICAgICAgaW5pdGlhbFJvdXRlU3RhY2ssXG4gICAgICBpbml0aWFsUm91dGUsXG4gICAgICBvblByZVB1c2gsXG4gICAgICBvblBvc3RQdXNoLFxuICAgICAgb25QcmVQb3AsXG4gICAgICBvblBvc3RQb3AsXG4gICAgICBzd2lwZVBvcCxcbiAgICAgIG9uRGV2aWNlQmFja0J1dHRvbixcblxuICAgICAgLi4ucmVzdFxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3QgcGFnZXMgPSB0aGlzLnJvdXRlcyA/IHRoaXMucm91dGVzLm1hcCgocm91dGUpID0+IHJlbmRlclBhZ2Uocm91dGUsIHRoaXMpKSA6IG51bGw7XG5cbiAgICBpZiAoaW5uZXJSZWYgJiYgaW5uZXJSZWYgIT09IHRoaXMucmVmKSB7XG4gICAgICB0aGlzLnJlZiA9IGlubmVyUmVmO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8RWxlbWVudFxuICAgICAgICByZWY9e3RoaXMucmVmfVxuICAgICAgICB7Li4ucmVzdH1cbiAgICAgID5cbiAgICAgICAge3BhZ2VzfVxuICAgICAgPC9FbGVtZW50PlxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLW5hdmlnYXRvclxuICogQGNhdGVnb3J5IG5hdmlnYXRpb25cbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2UvbmF2aWdhdG9yXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl0gVGhpcyBjb21wb25lbnQgaXMgcmVzcG9uc2libGUgZm9yIHBhZ2UgdHJhbnNpdGlvbmluZyBhbmQgbWFuYWdpbmcgdGhlIHBhZ2VzIG9mIHlvdXIgT25zZW5VSSBhcHBsaWNhdGlvbi4gSW4gb3JkZXIgdG8gbWFuYWdlIHRvIGRpc3BsYXkgdGhlIHBhZ2VzLCB0aGUgIG5hdmlnYXRvciBuZWVkcyB0byBkZWZpbmUgdGhlIGByZW5kZXJQYWdlYCBtZXRob2QsIHRoYXQgdGFrZXMgYW4gcm91dGUgYW5kIGEgbmF2aWdhdG9yIGFuZCAgY29udmVydHMgaXQgdG8gYW4gcGFnZS4gIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gIDxOYXZpZ2F0b3JcbiAgICByZW5kZXJQYWdlPXsocm91dGUsIG5hdmlnYXRvcikgPT5cbiAgICAgPE15UGFnZVxuICAgICAgIHRpdGxlPXtyb3V0ZS50aXRsZX1cbiAgICAgICBvblBvcD17KCkgPT4gbmF2aWdhdG9yLnBvcFBhZ2UoKX1cbiAgICAgICAvPlxuICAgIH1cbiAgICBpbml0aWFsUm91dGU9e3tcbiAgICAgICAgdGl0bGU6ICdGaXJzdCBQYWdlJ1xuICAgIH19IC8+XG4gICB9XG4gfVxuICovXG5jb25zdCBOYXZpZ2F0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiAoXG4gIDxOYXZpZ2F0b3JDbGFzcyBpbm5lclJlZj17cmVmfSB7Li4ucHJvcHN9Pntwcm9wcy5jaGlsZHJlbn08L05hdmlnYXRvckNsYXNzPlxuKSk7XG5cbk5hdmlnYXRvci5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSByZW5kZXJQYWdlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCB0cnVlXG4gICAqIEBkZWZhdWx0VmFsdWUgbnVsbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgY3VycmVudCByb3V0ZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBSZWFjdCBjb21wb25lbnQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgcmVuZGVyUGFnZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgLyoqXG4gICAqIEBuYW1lIGluaXRpYWxSb3V0ZVN0YWNrXG4gICAqIEB0eXBlIGFycmF5XG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVmYXVsdFZhbHVlIG51bGxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIGluaXRpYWwgcm91dGVzIGZyb20gdGhlIE5hdmlnYXRvcixcbiAgICogIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZW5kZXIgdGhlIGluaXRpYWwgcGFnZXMgaW4gdGhlIGByZW5kZXJQYWdlYCBtZXRob2QuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBpbml0aWFsUm91dGVTdGFjazogUHJvcFR5cGVzLmFycmF5LFxuXG4gIC8qKlxuICAgKiBAbmFtZSBpbml0aWFsUm91dGVcbiAgICogQHR5cGUgb2JqZWN0XG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVmYXVsdFZhbHVlIG51bGxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIGluaXRpYWwgcm91dGUgb2YgdGhlIG5hdmlnYXRvcixcbiAgICogIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZW5kZXIgdGhlIGluaXRpYWwgcGFnZXMgaW4gdGhlXG4gICAqICByZW5kZXJQYWdlIG1ldGhvZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGluaXRpYWxSb3V0ZTogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQG5hbWUgb25QcmVQdXNoXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQganVzdCBiZWZvcmUgYSBwYWdlIGlzIHB1c2hlZC4gSXQgZ2V0cyBhbiBldmVudCBvYmplY3Qgd2l0aCByb3V0ZSBpbmZvcm1hdGlvbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblByZVB1c2g6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblBvc3RQdXNoXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQganVzdCBhZnRlciBhIHBhZ2UgaXMgcHVzaGVkLiBJdCBnZXRzIGFuIGV2ZW50IG9iamVjdCB3aXRoIHJvdXRlIGluZm9ybWF0aW9uLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUG9zdFB1c2g6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblByZVBvcFxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIGp1c3QgYmVmb3JlIGEgcGFnZSBpcyBwb3BwZWQuIEl0IGdldHMgYW4gZXZlbnQgb2JqZWN0IHdpdGggcm91dGUgaW5mb3JtYXRpb24uWy9lbl1cbiAgICovXG4gIG9uUHJlUG9wOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25Qb3N0UG9wXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQganVzdCBhZnRlciBhIHBhZ2UgaXMgcG9wcGVkLiBJdCBnZXRzIGFuIGV2ZW50IG9iamVjdCB3aXRoIHJvdXRlIGluZm9ybWF0aW9uLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUG9zdFBvcDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dXG4gICAqICAgICBBbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBcInNsaWRlXCJgLCBgXCJsaWZ0XCJgLCBgXCJmYWRlXCJgIGFuZCBgXCJub25lXCJgLlxuICAgKiAgICAgVGhlc2UgYXJlIHBsYXRmb3JtIGJhc2VkIGFuaW1hdGlvbnMuIEZvciBmaXhlZCBhbmltYXRpb25zLCBhZGQgYFwiLWlvc1wiYCBvciBgXCItbWRcImAgc3VmZml4IHRvIHRoZSBhbmltYXRpb24gbmFtZS4gRS5nLiBgXCJsaWZ0LWlvc1wiYCwgYFwibGlmdC1tZFwiYC4gRGVmYXVsdHMgdmFsdWVzIGFyZSBgXCJzbGlkZS1pb3NcImAgYW5kIGBcImZhZGUtbWRcImAuXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGFuaW1hdGlvbjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSBvYmplY3RcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBhbmltYXRpb25PcHRpb25zOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAbmFtZSBzd2lwZWFibGVcbiAgICogQHR5cGUgYm9vbHxzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUVuYWJsZXMgc3dpcGUtdG8tcG9wIGZ1bmN0aW9uYWxpdHkgZm9yIGlPUy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBzd2lwZWFibGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqXG4gICAqIEBuYW1lIHN3aXBlUG9wXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1PcHRpb25hbCBmdW5jdGlvbiBjYWxsZWQgb24gc3dpcGUtdG8tcG9wLiBJZiBwcm92aWRlZCwgbXVzdCBwZXJmb3JtIGEgcG9wUGFnZSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zIG9iamVjdC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBzd2lwZVBvcDogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiBAbmFtZSBvbkRldmljZUJhY2tCdXR0b25cbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUN1c3RvbSBoYW5kbGVyIGZvciBkZXZpY2UgYmFjayBidXR0b24uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25EZXZpY2VCYWNrQnV0dG9uOiBQcm9wVHlwZXMuZnVuY1xufTtcblxuY29uc3QgTk9PUCA9ICgpID0+IG51bGw7XG5cbk5hdmlnYXRvci5kZWZhdWx0UHJvcHMgPSB7XG4gIG9uUG9zdFB1c2g6IE5PT1AsXG4gIG9uUHJlUHVzaDogTk9PUCxcbiAgb25QcmVQb3A6IE5PT1AsXG4gIG9uUG9zdFBvcDogTk9PUFxufTtcblxuZXhwb3J0IGRlZmF1bHQgTmF2aWdhdG9yO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLW1vZGFsJztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5pbXBvcnQgYmFzZURpYWxvZyBmcm9tICcuLi9iYXNlRGlhbG9nJztcblxuY29uc3QgZGVwcmVjYXRlZCA9IHtcbiAgaXNPcGVuOiAndmlzaWJsZSdcbn07XG5cbmNvbnN0IG5vdEF0dHJpYnV0ZXMgPSBbJ29uRGV2aWNlQmFja0J1dHRvbiddO1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtbW9kYWxcbiAqIEBjYXRlZ29yeSBkaWFsb2dcbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2UvbW9kYWxcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXVxuICogICBBIG1vZGFsIGNvbXBvbmVudCBjb3ZlcnMgdGhlIGVudGlyZSBzY3JlZW4uIFVuZGVybHlpbmcgY29tcG9uZW50cyBhcmUgbm90XG4gKiAgIHN1YmplY3QgdG8gYW55IGV2ZW50cyB3aGlsZSB0aGUgbW9kYWwgY29tcG9uZW50IGlzIHNob3duLlxuICpcbiAqICAgVGhpcyBjb21wb25lbnQgY2FuIGJlIHVzZWQgdG8gYmxvY2sgdXNlciBpbnB1dCB3aGlsZSBzb21lIG9wZXJhdGlvbiBpc1xuICogICBydW5uaW5nIG9yIHRvIHNob3cgc29tZSBpbmZvcm1hdGlvbiB0byB0aGUgdXNlci5cbiAqIFsvZW5dXG4gKiBbamFdXG4gKiAgIOeUu+mdouWFqOS9k+OCkuODnuOCueOCr+OBmeOCi+ODouODvOODgOODq+eUqOOCs+ODs+ODneODvOODjeODs+ODiOOBp+OBmeOAguS4i+WBtOOBq+OBguOCi+OCs+ODs+ODneODvOODjeODs+ODiOOBr+OAgVxuICogICDjg6Ljg7zjg4Djg6vjgYzooajnpLrjgZXjgozjgabjgYTjgovplpPjga/jgqTjg5njg7Pjg4jpgJrnn6XjgYzooYzjgo/jgozjgb7jgZvjgpNcbiAqIFsvamFdXG4gKiBAZXhhbXBsZVxuICA8UGFnZT5cbiAgICA8ZGl2PiBQYWdlIGNvbnRlbnQgPC9kaXY+XG5cbiAgICA8TW9kYWwgaXNPcGVuPXt0aGlzLnN0YXRlLmlzTG9hZGluZ30+XG4gICAgICBMb2FkaW5nIC4uLlxuICAgIDwvTW9kYWw+XG4gIDwvUGFnZT5cbiAqL1xuY29uc3QgTW9kYWwgPSBvbnNDdXN0b21FbGVtZW50KGJhc2VEaWFsb2coJ29ucy1tb2RhbCcpLCB7ZGVwcmVjYXRlZCwgbm90QXR0cmlidXRlc30pO1xuXG5Nb2RhbC5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSBhbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJmYWRlXCJgLCBgXCJsaWZ0XCJgIGFuZCBgXCJub25lXCJgLlxuICAgKiAgIFsvZW5dXG4gICAqL1xuICBhbmltYXRpb246IFByb3BUeXBlcy5vbmVPZihbJ25vbmUnLCAnZmFkZScsICdsaWZ0J10pLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBhbmltYXRpb25PcHRpb25zXG4gICAqIEB0eXBlIG9iamVjdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiAgYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqL1xuICBhbmltYXRpb25PcHRpb25zOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblByZVNob3dcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgQ2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBtb2RhbCBpcyBkaXNwbGF5ZWQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblByZVNob3c6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblBvc3RTaG93XG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIENhbGxlZCBqdXN0IGFmdGVyIHRoZSBtb2RhbCBpcyBkaXNwbGF5ZWQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblBvc3RTaG93OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25QcmVIaWRlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQganVzdCBiZWZvcmUgdGhlIG1vZGFsIGlzIGhpZGRlbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblByZUhpZGU6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblBvc3RIaWRlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQganVzdCBhZnRlciB0aGUgbW9kYWwgaXMgaGlkZGVuLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUG9zdEhpZGU6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSB2aXNpYmxlXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dV2hlbiBgdHJ1ZWAgdGhlIG1vZGFsIHdpbGwgc2hvdyBpdHNlbGYuWy9lbl1cbiAgICovXG4gIHZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBpc09wZW5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1ERVBSRUNBVEVEISBVc2UgYHZpc2libGVgIGluc3RlYWQuWy9lbl1cbiAgICovXG4gIGlzT3BlbjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uRGV2aWNlQmFja0J1dHRvblxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBDdXN0b20gaGFuZGxlciBmb3IgZGV2aWNlIGJhY2sgYnV0dG9uLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25EZXZpY2VCYWNrQnV0dG9uOiBQcm9wVHlwZXMuZnVuY1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTW9kYWw7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLXBhZ2UnO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuY29uc3Qgbm90QXR0cmlidXRlcyA9IFsnb25JbmZpbml0ZVNjcm9sbCcsICdvbkRldmljZUJhY2tCdXR0b24nXTtcbmNvbnN0IEVsZW1lbnQgPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtcGFnZScsIHtub3RBdHRyaWJ1dGVzfSk7XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1wYWdlXG4gKiBAY2F0ZWdvcnkgcGFnZVxuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS9wYWdlXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl1cbiAqICAgVGhpcyBjb21wb25lbnQgaXMgaGFuZGxpbmcgdGhlIGVudGlyZSBwYWdlLiBUaGUgY29udGVudCBjYW4gYmUgc2Nyb2xsZWQuXG4gKlxuICogICBUbyBhZGQgZml4ZWQgY29udGVudCB0aGF0IGRvZXNuJ3Qgc2Nyb2xsIHdpdGggdGhlIHBhZ2UgdGhlIGByZW5kZXJGaXhlZGAgcHJvcCBpcyB1c2VkLlxuICpcbiAqICAgQSBwYWdlIHRvb2xiYXIgY2FuIGJlIGFkZGVkIHdpdGggdGhlIGByZW5kZXJUb29sYmFyYCBwcm9wLlxuICogWy9lbl1cbiAqIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAgPFBhZ2VcbiAgICByZW5kZXJGaXhlZD17KCkgPT4gPEZhYj48L0ZhYj59XG4gICAgcmVuZGVyVG9vbGJhcj17KCkgPT4gPFRvb2xiYXI+Li4uPC9Ub29sYmFyPn1cbiAgICBjb250ZW50U3R5bGU9e3twYWRkaW5nOiA0MH19PlxuICAgIDxkaXY+IFBhZ2UgY29udGVudCA8L2Rpdj5cbiAgPC9QYWdlPlxuICovXG5jb25zdCBQYWdlID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgcmVuZGVyVG9vbGJhcixcbiAgICByZW5kZXJCb3R0b21Ub29sYmFyLFxuICAgIHJlbmRlck1vZGFsLFxuICAgIHJlbmRlckZpeGVkLFxuICAgIGNvbnRlbnRTdHlsZSxcbiAgICBjaGlsZHJlbixcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICByZXR1cm4gKFxuICAgIDxFbGVtZW50XG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHJlZj17cmVmfVxuICAgID5cbiAgICAgIHtyZW5kZXJUb29sYmFyKHJlZil9XG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ncGFnZV9fYmFja2dyb3VuZCc+IDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9J3BhZ2VfX2NvbnRlbnQnIHN0eWxlPXtjb250ZW50U3R5bGV9PlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdwYWdlX19leHRyYScgc3R5bGU9e3t6SW5kZXg6IDEwMDAxfX0+XG4gICAgICAgIHtyZW5kZXJNb2RhbChyZWYpfVxuICAgICAgPC9kaXY+XG4gICAgICB7cmVuZGVyRml4ZWQocmVmKX1cbiAgICAgIHtyZW5kZXJCb3R0b21Ub29sYmFyKHJlZil9XG4gICAgPC9FbGVtZW50PlxuICApO1xufSk7XG5cblBhZ2UucHJvcFR5cGVzID0ge1xuXG4gIC8qKlxuICAgKiBAbmFtZSBjb250ZW50U3R5bGVcbiAgICogQHR5cGUgT2JqZWN0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgU3BlY2lmeSB0aGUgc3R5bGUgb2YgdGhlIHBhZ2UgY29udGVudC4gT3B0aW9uYWwuXG4gICAqICBbL2VuXVxuICAgKi9cbiAgY29udGVudFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAbmFtZSBtb2RpZmllclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBTcGVjaWZ5IG1vZGlmaWVyIG5hbWUgdG8gc3BlY2lmeSBjdXN0b20gc3R5bGVzLiBPcHRpb25hbC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG1vZGlmaWVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSByZW5kZXJNb2RhbFxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlZmF1bHRWYWx1ZSBudWxsXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBUaGlzIGZ1bmN0aW9uIHJlbmRlcnMgYSBtb2RhbCB0aGF0IG1hc2tzIGN1cnJlbnQgc2NyZWVuLlsvZW5dXG4gICAqL1xuICByZW5kZXJNb2RhbDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIHJlbmRlclRvb2xiYXJcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZWZhdWx0VmFsdWUgbnVsbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gVGhpcyBmdW5jdGlvbiByZW5kZXJzIHRoZSB0b29sYmFyIG9mIHRoZSBwYWdlLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHJlbmRlclRvb2xiYXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSByZW5kZXJCb3R0b21Ub29sYmFyXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZWZhdWx0VmFsdWUgbnVsbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gVGhpcyBmdW5jdGlvbiByZW5kZXJzIHRoZSBib3R0b20gdG9vbGJhciBvZiB0aGUgcGFnZS5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICByZW5kZXJCb3R0b21Ub29sYmFyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgcmVuZGVyRml4ZWRcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlZmF1bHRWYWx1ZSBudWxsXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBUaGlzIGZ1bmN0aW9uIHJlbmRlcnMgZml4ZWQgY29udGVudCBvZiB0aGUgcGFnZS4gQ2FuIGJlIHVzZWQgdG8gcmVuZGVyIGBGYWJgIG9yIGBTcGVlZERpYWxgIGNvbXBvbmVudHMgYXMgd2VsbCBhcyBvdGhlciBjb21wb25lbnRzIHRoYXQgZG9uJ3Qgc2Nyb2xsIHdpdGggdGhlIHBhZ2UuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgcmVuZGVyRml4ZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkluaXRcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgXHRGaXJlZCByaWdodCBhZnRlciB0aGUgcGFnZSBpcyBhdHRhY2hlZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uSW5pdDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uU2hvd1xuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBDYWxsZWQgRmlyZWQgcmlnaHQgYWZ0ZXIgdGhlIHBhZ2UgaXMgc2hvd24uXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblNob3c6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkhpZGVcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgQ2FsbGVkIGFmdGVyIHRoZSBwYWdlIGlzIGhpZGRlbi5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uSGlkZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uSW5maW5pdGVTY3JvbGxcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgQ2FsbGVkIHdoZW4gc2Nyb2xsaW5nIHRvIHRoZSBib3R0b20gb2YgdGhlIHBhZ2UuIEl0IGdldHMgYSAnZG9uZScgY2FsbGJhY2sgKGZpcnN0IGFyZ3VtZW50KSB0aGF0IG11c3QgYmUgY2FsbGVkIHdoZW4gaXQncyBmaW5pc2hlZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uSW5maW5pdGVTY3JvbGw6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkRldmljZUJhY2tCdXR0b25cbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgQ3VzdG9tIGhhbmRsZXIgZm9yIGRldmljZSBiYWNrIGJ1dHRvbi5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uRGV2aWNlQmFja0J1dHRvbjogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmNvbnN0IE5PT1AgPSAoKSA9PiBudWxsO1xuXG5QYWdlLmRlZmF1bHRQcm9wcyA9IHtcbiAgcmVuZGVyVG9vbGJhcjogTk9PUCxcbiAgcmVuZGVyQm90dG9tVG9vbGJhcjogTk9PUCxcbiAgcmVuZGVyTW9kYWw6IE5PT1AsXG4gIHJlbmRlckZpeGVkOiBOT09QXG59O1xuXG5leHBvcnQgZGVmYXVsdCBQYWdlO1xuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLXBvcG92ZXInO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcbmltcG9ydCBiYXNlRGlhbG9nIGZyb20gJy4uL2Jhc2VEaWFsb2cnO1xuXG5jb25zdCBkZXByZWNhdGVkID0ge1xuICBvbkNhbmNlbDogJ29uRGlhbG9nQ2FuY2VsJyxcbiAgaXNEaXNhYmxlZDogJ2Rpc2FibGVkJyxcbiAgaXNDYW5jZWxhYmxlOiAnY2FuY2VsYWJsZSdcbn07XG5cbmNvbnN0IG5vdEF0dHJpYnV0ZXMgPSBbJ29uRGV2aWNlQmFja0J1dHRvbiddO1xuXG5jb25zdCBFbGVtID0gb25zQ3VzdG9tRWxlbWVudChiYXNlRGlhbG9nKCdvbnMtcG9wb3ZlcicpLCB7ZGVwcmVjYXRlZCwgbm90QXR0cmlidXRlc30pO1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtcG9wb3ZlclxuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS9wb3BvdmVyXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIEEgY29tcG9uZW50IHRoYXQgZGlzcGxheXMgYSBwb3BvdmVyIG5leHQgdG8gYW4gZWxlbWVudC4gVGhlIHBvcG92ZXIgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbXBvbmVudCBvciBhIHRvb2x0aXAuXG4gKiAgICBBbm90aGVyIGNvbW1vbiB3YXkgdG8gdXNlIHRoZSBwb3BvdmVyIGlzIHRvIGRpc3BsYXkgYSBtZW51IHdoZW4gYSBidXR0b24gb24gdGhlIHNjcmVlbiBpcyB0YXBwZWQuXG4gKiAgIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8UGFnZT5cbiAqICA8QnV0dG9uXG4gKiAgICByZWY9eyhidG4pID0+IHsgdGhpcy5idG4gPSBidG47IH19XG4gKiAgICBvbkNsaWNrPXsoKSA9PlxuICogICAgICB0aGlzLnNldFN0YXRlKHt0YXJnZXQ6IHRoaXMuYnRuLCBpc09wZW46IHRydWV9KVxuICogICAgfVxuICogIC8+XG4gICAgPFBvcG92ZXJcbiAgICAgIGlzT3Blbj17dGhpcy5zdGF0ZS5pc09wZW59XG4gICAgICBvbkNhbmNlbD17KCkgPT4gdGhpcy5zZXRTdGF0ZSh7aXNPcGVuOiBmYWxzZX0pfVxuICAgICAgZ2V0VGFyZ2V0PXsoKSA9PiB0aGlzLnN0YXRlLnRhcmdldH1cbiAgICA+XG4gICAgICA8ZGl2IHN0eWxlPXt7dGV4dEFsaWduOiAnY2VudGVyJywgb3BhY2l0eTogMC41fX0+XG4gICAgICAgIDxwPlRoaXMgaXMgYSBwb3BvdmVyITwvcD5cbiAgICAgICAgICA8cD48c21hbGw+Q2xpY2sgdGhlIGJhY2tncm91bmQgdG8gcmVtb3ZlIHRoZSBwb3BvdmVyLjwvc21hbGw+PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9Qb3BvdmVyPlxuICogPC9QYWdlPlxuICovXG5jb25zdCBQb3BvdmVyID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7aXNPcGVuLCBnZXRUYXJnZXQsIGNoaWxkcmVuLCAuLi5yZXN0fSA9IHByb3BzO1xuICBjb25zdCByZWYgPSBmb3J3YXJkZWRSZWYgfHwgdXNlUmVmKCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNPcGVuICE9PSByZWYuY3VycmVudC52aXNpYmxlKSB7XG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIGxldCB0YXJnZXQgPSBnZXRUYXJnZXQoKTtcblxuICAgICAgICAvLyBpZiBSZWFjdCByZWYgd2FzIHJldHVybmVkIGluc3RlYWQgb2YgRE9NIEVsZW1lbnQsIHVzZSByZWYuY3VycmVudCBpbnN0ZWFkXG4gICAgICAgIGNvbnN0IGlzRWxlbWVudCA9IHggPT4geCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgeCBpbnN0YW5jZW9mIEhUTUxEb2N1bWVudDtcbiAgICAgICAgaWYgKCFpc0VsZW1lbnQodGFyZ2V0KSAmJiB0YXJnZXQuY3VycmVudCkge1xuICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5jdXJyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmVmLmN1cnJlbnQuc2hvdyh7dGFyZ2V0fSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWYuY3VycmVudC5oaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gKFxuICAgIDxFbGVtXG4gICAgICByZWY9e3JlZn1cbiAgICAgIHsuLi5yZXN0fVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0VsZW0+XG4gICk7XG59KTtcblxuUG9wb3Zlci5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSBnZXRUYXJnZXRcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIHRydWVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSByZWYgdG8gdGhlIERPTSBub2RlIHRoYXQgdGhlIHBvcG92ZXIgd2lsbCB0YXJnZXQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBnZXRUYXJnZXQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uRGlhbG9nQ2FuY2VsXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIENhbGxlZCBvbmx5IGlmIGlzQ2FuY2VsYWJsZSBpcyB0cnVlLiBJdCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbiBvbiBBbmRyb2lkIGRldmljZXMuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvbkRpYWxvZ0NhbmNlbDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uQ2FuY2VsXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIERFUFJFQ0FURUQhIFVzZSBgb25EaWFsb2dDYW5jZWxgIGluc3RlYWQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvbkNhbmNlbDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGlzT3BlblxuICAgKiBAdHlwZSBib29sXG4gICAqIEByZXF1aXJlZCB0cnVlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRpYWxvZyBpcyBvcGVuIGFuZCBzaG93bi5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGlzT3BlbjogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogQG5hbWUgY2FuY2VsYWJsZVxuICAgKiBAdHlwZSBib29sXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBkaWFsb2cgaXMgY2FuY2VsYWJsZSBvciBub3QuXG4gICAqICBBIGNhbmNlbGFibGUgZGlhbG9nIHdpbGwgY2FsbCBvbkNhbmNlbCAgd2hlbiB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIG9yICBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gb24gQW5kcm9pZCBkZXZpY2VzXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBjYW5jZWxhYmxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgaXNDYW5jZWxhYmxlXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgREVQUkVDQVRFRCEgVXNlIGBjYW5jZWxhYmxlYCBpbnN0ZWFkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgaXNDYW5jZWxhYmxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgZGlzYWJsZWRcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBTcGVjaWZpZXMgd2hldGhlciB0aGUgZGlhbG9nIGlzIGRpc2FibGVkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBpc0Rpc2FibGVkXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgREVQUkVDQVRFRCEgVXNlIGBkaXNhYmxlZGAgaW5zdGVhZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGlzRGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBhbmltYXRpb25cbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIFRoZSBhbmltYXRpb24gdXNlZCB3aGVuIHNob3dpbmcgYW5kIGhpZGluZyB0aGUgZGlhbG9nLiBDYW4gYmUgZWl0aGVyIGBcIm5vbmVcImAgb3IgYFwiZGVmYXVsdFwiYC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGFuaW1hdGlvbjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgZGlhbG9nLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG1vZGlmaWVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBtYXNrQ29sb3JcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIFwicmdiYSgwLCAwLCAwLCAwLjIpXCJbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtYXNrQ29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUgb2JqZWN0XG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiAgYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGFuaW1hdGlvbk9wdGlvbnM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUHJlU2hvd1xuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBDYWxsZWQganVzdCBiZWZvcmUgdGhlIGFsZXJ0IGRpYWxvZyBpcyBkaXNwbGF5ZWQuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblByZVNob3c6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblBvc3RTaG93XG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIENhbGxlZCBqdXN0IGFmdGVyIHRoZSBhbGVydCBkaWFsb2cgaXMgZGlzcGxheWVkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25Qb3N0U2hvdzogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUHJlSGlkZVxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBhbGVydCBkaWFsb2cgaXMgaGlkZGVuLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUHJlSGlkZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUG9zdEhpZGVcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCBqdXN0IGFmdGVyIHRoZSBhbGVydCBkaWFsb2cgaXMgaGlkZGVuLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUG9zdEhpZGU6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkRldmljZUJhY2tCdXR0b25cbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgQ3VzdG9tIGhhbmRsZXIgZm9yIGRldmljZSBiYWNrIGJ1dHRvbi5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uRGV2aWNlQmFja0J1dHRvbjogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFBvcG92ZXI7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtcHJvZ3Jlc3MtYmFyJztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1wcm9ncmVzcy1iYXJcbiAqIEBjYXRlZ29yeSB2aXN1YWxcbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2UvcHJvZ3Jlc3NcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXSBUaGUgY29tcG9uZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIGxpbmVhciBwcm9ncmVzcyBiYXIuIEl0IGNhbiBlaXRoZXIgZGlzcGxheSBhIHByb2dyZXNzIGJhciB0aGF0IHNob3dzIHRoZSB1c2VyIGhvdyBtdWNoIG9mIGEgdGFzayBoYXMgYmVlbiBjb21wbGV0ZWQuIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBwZXJjZW50YWdlIGlzIG5vdCBrbm93biBpdCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IGFuIGFuaW1hdGVkIHByb2dyZXNzIGJhciBzbyB0aGUgdXNlciBjYW4gc2VlIHRoYXQgYW4gb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiAgWy9lbl1cbiAqIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqPFByb2dyZXNzQmFyIHZhbHVlPXs1NX0gc2Vjb25kYXJ5VmFsdWU9ezg3fSAvPlxuICo8UHJvZ3Jlc3NCYXIgaW5kZXRlcm1pbmF0ZSAvPlxuICovXG5jb25zdCBQcm9ncmVzc0JhciA9IG9uc0N1c3RvbUVsZW1lbnQoJ29ucy1wcm9ncmVzcy1iYXInKTtcblxuUHJvZ3Jlc3NCYXIucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgcHJvZ3Jlc3MgaW5kaWNhdG9yLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG1vZGlmaWVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSB2YWx1ZVxuICAgKiBAdHlwZSBudW1iZXJcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBDdXJyZW50IHByb2dyZXNzLiBTaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBzZWNvbmRhcnlWYWx1ZVxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgQ3VycmVudCBzZWNvbmRhcnkgcHJvZ3Jlc3MuIFNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgc2Vjb25kYXJ5VmFsdWU6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGluZGV0ZXJtaW5hdGVcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQsIGFuIGluZmluaXRlIGxvb3BpbmcgYW5pbWF0aW9uIHdpbGwgYmUgc2hvd24uIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGluZGV0ZXJtaW5hdGU6IFByb3BUeXBlcy5ib29sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBQcm9ncmVzc0JhcjtcbiIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJ29uc2VudWkvZXNtL2VsZW1lbnRzL29ucy1wcm9ncmVzcy1jaXJjdWxhcic7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtcHJvZ3Jlc3MtY2lyY3VsYXJcbiAqIEBjYXRlZ29yeSB2aXN1YWxcbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2UvcHJvZ3Jlc3MtY2lyY3VsYXJcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXSBUaGlzIGNvbXBvbmVudCBkaXNwbGF5cyBhIGNpcmN1bGFyIHByb2dyZXNzIGluZGljYXRvci4gSXQgY2FuIGVpdGhlciBiZSB1c2VkIHRvIHNob3cgaG93IG11Y2ggb2YgYSB0YXNrIGhhcyBiZWVuIGNvbXBsZXRlZCBvciB0byBzaG93IGEgbG9vcGluZyBhbmltYXRpb24gdG8gaW5kaWNhdGUgdGhhdCBhbiBvcGVyYXRpb24gaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gKiBbL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICo8UHJvZ3Jlc3NDaXJjdWxhciB2YWx1ZT17NTV9IHNlY29uZGFyeVZhbHVlPXs4N30gLz5cbiAqPFByb2dyZXNzQ2lyY3VsYXIgaW5kZXRlcm1pbmF0ZSAvPlxuICovXG5jb25zdCBQcm9ncmVzc0NpcmN1bGFyID0gb25zQ3VzdG9tRWxlbWVudCgnb25zLXByb2dyZXNzLWNpcmN1bGFyJyk7XG5cblByb2dyZXNzQ2lyY3VsYXIucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgcHJvZ3Jlc3MgaW5kaWNhdG9yLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG1vZGlmaWVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSB2YWx1ZVxuICAgKiBAdHlwZSBudW1iZXJcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBDdXJyZW50IHByb2dyZXNzLiBTaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBzZWNvbmRhcnlWYWx1ZVxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgQ3VycmVudCBzZWNvbmRhcnkgcHJvZ3Jlc3MuIFNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgc2Vjb25kYXJ5VmFsdWU6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGluZGV0ZXJtaW5hdGVcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQsIGFuIGluZmluaXRlIGxvb3BpbmcgYW5pbWF0aW9uIHdpbGwgYmUgc2hvd24uIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGluZGV0ZXJtaW5hdGU6IFByb3BUeXBlcy5ib29sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBQcm9ncmVzc0NpcmN1bGFyO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLXB1bGwtaG9vayc7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuXG5jb25zdCBkZXByZWNhdGVkID0ge1xuICBvbkxvYWQ6ICdvbkFjdGlvbicsXG4gIG9uQ2hhbmdlOiAnb25DaGFuZ2VTdGF0ZSdcbn07XG5cbmNvbnN0IG5vdEF0dHJpYnV0ZXMgPSBbJ29uQWN0aW9uJ107XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1wdWxsLWhvb2tcbiAqIEBjYXRlZ29yeSBjb250cm9sXG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL3B1bGwtaG9va1xuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dICBDb21wb25lbnQgdGhhdCBhZGRzICoqUHVsbCB0byByZWZyZXNoKiogZnVuY3Rpb25hbGl0eSB0byBhbiBgPG9ucy1wYWdlPmAgZWxlbWVudC5cbiAqICAgICBJdCBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIGEgdGFzayB3aGVuIHRoZSB1c2VyIHB1bGxzIGRvd24gYXQgdGhlIHRvcCBvZiB0aGUgcGFnZS4gQSBjb21tb24gdXNhZ2UgaXMgdG8gcmVmcmVzaCB0aGUgZGF0YSBkaXNwbGF5ZWQgaW4gYSBwYWdlLlxuIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG5cbiAgICByZXR1cm4gKFxuICAgICAgPFB1bGxIb29rIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfSBvbkxvYWQ9e3RoaXMub25Mb2FkfT5cbiAgICAgIHtcbiAgICAgICAodGhpcy5zdGF0ZS5wdWxsSG9va1N0YXRlID09PSAnaW5pdGlhbCcpID9cbiAgICAgICAgPHNwYW4gPlxuICAgICAgICAgIDxJY29uIHNpemU9ezM1fSBzcGluPXtmYWxzZX0gaWNvbj0naW9uLWFycm93LWRvd24tYScgLz5cbiAgICAgICAgICBQdWxsIGRvd24gdG8gcmVmcmVzaFxuICAgICAgICA8L3NwYW4+IDpcbiAgICAgICAgKHRoaXMuc3RhdGUucHVsbEhvb2tTdGF0ZSA9PT0gJ3ByZWFjdGlvbicpID9cbiAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICA8SWNvbiBzaXplPXszNX0gc3Bpbj17ZmFsc2V9IGljb249J2lvbi1hcnJvdy11cC1hJyAvPlxuICAgICAgICAgICBSZWxlYXNlIHRvIHJlZnJlc2hcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA6XG4gICAgICAgIDxzcGFuPjxJY29uIHNpemU9ezM1fSBzcGluPXt0cnVlfSBpY29uPSdpb24tbG9hZC1kJz48L0ljb24+IExvYWRpbmcgZGF0YS4uLjwvc3Bhbj5cbiAgICB9XG4gICAgICA8L1B1bGxIb29rPlxuICAgICk7XG4gKi9cbmNvbnN0IFB1bGxIb29rID0gb25zQ3VzdG9tRWxlbWVudCgnb25zLXB1bGwtaG9vaycsIHtkZXByZWNhdGVkLCBub3RBdHRyaWJ1dGVzfSk7XG5cblB1bGxIb29rLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEBuYW1lIG9uQ2hhbmdlU3RhdGVcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCB3aGVuIHRoZSBwdWxsIGhvb2sgaW5uZXIgc3RhdGUgaXMgY2hhbmdlZC4gVGhlIHN0YXRlIGNhbiBiZSBlaXRoZXIgXCJpbml0aWFsXCIsIFwicHJlYWN0aW9uXCIgb3IgXCJhY3Rpb25cIlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uQ2hhbmdlU3RhdGU6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkNoYW5nZVxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dREVQUkVDQVRFRCEgVXNlIGBvbkNoYW5nZVN0YXRlYCBpbnN0ZWFkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25BY3Rpb25cbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCB3aGVuIHRoZSBwdWxsIGhvb2sgaXMgaW4gdGhlIGBhY3Rpb25gIHN0YXRlWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25BY3Rpb246IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkxvYWRcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXURFUFJFQ0FURUQhIFVzZSBgb25BY3Rpb25gIGluc3RlYWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25Mb2FkOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25QdWxsXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Ib29rIGNhbGxlZCB3aGVuZXZlciB0aGUgdXNlciBwdWxscyB0aGUgZWxlbWVudC4gSXQgZ2V0cyB0aGUgcHVsbGVkIGRpc3RhbmNlIHJhdGlvIChzY3JvbGwgLyBoZWlnaHQpIGFuZCBhbiBhbmltYXRpb25PcHRpb25zIG9iamVjdCBhcyBhcmd1bWVudHMuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25QdWxsOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgZGlzYWJsZWRcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIHB1bGwgaG9vayB3aWxsIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgaGVpZ2h0XG4gICAqIEB0eXBlIG51bWJlclxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gVGhlIGhlaWdodCBvZiB0aGUgcHVsbCBob29rIGluIHBpeGVscy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNjQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBAbmFtZSB0aHJlc2hvbGRIZWlnaHRcbiAgICogQHR5cGUgbnVtYmVyXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBUaGUgdGhyZXNob2xkIGhlaWdodCBvZiB0aGUgcHVsbCBob29rIGluIHBpeGVscy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgOTYuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgdGhyZXNob2xkSGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBmaXhlZENvbnRlbnRcbiAgICogQHR5cGUgbnVtYmVyXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2Ugd2lsbCBub3QgbW92ZSB3aGVuIHB1bGxpbmcuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZml4ZWRDb250ZW50OiBQcm9wVHlwZXMuYm9vbFxufTtcblxuZXhwb3J0IGRlZmF1bHQgUHVsbEhvb2s7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtcmFkaW8nO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcbmltcG9ydCBvbmVUaW1lUHJvcCBmcm9tICcuLi9vbmVUaW1lUHJvcCc7XG5pbXBvcnQgSU5QVVRfUFJPUFMgZnJvbSAnLi4vaW5wdXRQcm9wcyc7XG5cbmNvbnN0IG5hbWVNYXAgPSB7XG4gIC4uLklOUFVUX1BST1BTXG59O1xuXG5jb25zdCB3aXRoRGVmYXVsdENoZWNrZWQgPSBjb21wb25lbnQgPT4gb25lVGltZVByb3AoY29tcG9uZW50LCAnZGVmYXVsdENoZWNrZWQnLCAnY2hlY2tlZCcpO1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtcmFkaW9cbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL3JhZGlvXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl1cbiAqICBBIHJhZGlvIGJ1dHRvbiBlbGVtZW50LiBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSByZW5kZXIgYXMgYSBNYXRlcmlhbCBEZXNpZ24gcmFkaW8gYnV0dG9uIG9uIEFuZHJvaWQgZGV2aWNlcy5cbiAqXG4gKiAgTW9zdCBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGEgbm9ybWFsIGA8aW5wdXQgdHlwZT1cInJhZGlvXCI+YCBlbGVtZW50IGNhbiBhbHNvIGJlIHVzZWQgb24gdGhlIGA8UmFkaW8+YCBjb21wb25lbnQuXG4gKiBbL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPFJhZGlvXG4gKiAgIG9uQ2hhbmdlPXtldmVudCA9PiB7IHRoaXMuc2V0U3RhdGUoe2NoZWNrZWQ6IGV2ZW50LnRhcmdldC5jaGVja2VkfSl9IH1cbiAqICAgbW9kaWZpZXI9J21hdGVyaWFsJyAvPlxuICovXG5jb25zdCBSYWRpbyA9IHdpdGhEZWZhdWx0Q2hlY2tlZChvbnNDdXN0b21FbGVtZW50KCdvbnMtcmFkaW8nLCB7ZGVwcmVjYXRlZDogbmFtZU1hcH0pKTtcblxuUmFkaW8ucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbmFtZVxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIG5hbWUgb2YgdGhlIHJhZGlvIGJ1dHRvbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBtb2RpZmllclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSByYWRpbyBidXR0b24uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbW9kaWZpZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGRpc2FibGVkXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmFkaW8gYnV0dG9uIGlzIGRpc2FibGVkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkNoYW5nZVxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gQ2FsbGVkIHdoZW4gdGhlIHJhZGlvIGJ1dHRvbiBzdGF0ZSBjaGFuZ2VzLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgdmFsdWVcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBWYWx1ZSBvZiB0aGUgcmFkaW8gYnV0dG9uLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIFByb3BUeXBlcy5pbnN0YW5jZU9mKERhdGUpXG4gIF0pLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBjaGVja2VkXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ29udHJvbHMgdGhlIHN0YXRlIG9mIHRoZSByYWRpbyBidXR0b24gKGNvbnRyb2xsZWQpLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGNoZWNrZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkZWZhdWx0Q2hlY2tlZFxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXURlZmluZWQgdGhlIHN0YXRlIG9mIHRoZSByYWRpbyBidXR0b24gYXQgZmlyc3QgcmVuZGVyIGZvciB1bmNvbnRyb2xsZWQgaW5wdXRzLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRlZmF1bHRDaGVja2VkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgaW5wdXRJZFxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgXCJpZFwiIGF0dHJpYnV0ZSBvZiB0aGUgaW5uZXIgYDxpbnB1dD5gIGVsZW1lbnQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gdXNpbmcgPGxhYmVsIGZvcj1cIi4uLlwiPiBlbGVtZW50cy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBpbnB1dElkOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5leHBvcnQgZGVmYXVsdCBSYWRpbztcbiIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJ29uc2VudWkvZXNtL2VsZW1lbnRzL29ucy1yYW5nZSc7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuaW1wb3J0IG9uZVRpbWVQcm9wIGZyb20gJy4uL29uZVRpbWVQcm9wJztcbmltcG9ydCBJTlBVVF9QUk9QUyBmcm9tICcuLi9pbnB1dFByb3BzJztcblxuY29uc3QgbmFtZU1hcCA9IHtcbiAgLi4uSU5QVVRfUFJPUFNcbn07XG5cbmNvbnN0IHdpdGhEZWZhdWx0VmFsdWUgPSBjb21wb25lbnQgPT4gb25lVGltZVByb3AoY29tcG9uZW50LCAnZGVmYXVsdFZhbHVlJywgJ3ZhbHVlJyk7XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1yYW5nZVxuICogQGNhdGVnb3J5IGZvcm1cbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2UvcmFuZ2VcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXVxuICogICBSYW5nZSBpbnB1dCBjb21wb25lbnQuXG4gKiBbL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPFJhbmdlIG1vZGlmaWVyPVwibWF0ZXJpYWxcIlxuICogICB2YWx1ZT17dGhpcy5zdGF0ZS52YWx1ZX1cbiAqICAgb25DaGFuZ2U9eyhldmVudCkgPT4gdGhpcy5zZXRTdGF0ZSh7dmFsdWU6IHBhcnNlSW50KGV2ZW50LnRhcmdldC52YWx1ZSl9KX1cbiAqICAgLz5cbiAqL1xuY29uc3QgUmFuZ2UgPSB3aXRoRGVmYXVsdFZhbHVlKG9uc0N1c3RvbUVsZW1lbnQoJ29ucy1yYW5nZScsIHtkZXByZWNhdGVkOiBuYW1lTWFwfSkpO1xuXG5SYW5nZS5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSBtb2RpZmllclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBwcm9ncmVzcyBpbmRpY2F0b3IuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbW9kaWZpZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uQ2hhbmdlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBDYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIGlucHV0IGNoYW5nZXMuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbklucHV0XG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBDYWxsZWQgd2hlbiB0aGUgaW5uZXIgcmFuZ2UgZmlyZXMgYW4gYGlucHV0YCBldmVudC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvbklucHV0OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgdmFsdWVcbiAgICogQHR5cGUgbnVtYmVyXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgQ3VycmVudCB2YWx1ZSBvZiB0aGUgZWxlbWVudC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBAbmFtZSB2YWx1ZVxuICAgKiBAdHlwZSBudW1iZXJcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBEZWZhdWx0IHZhbHVlIG9mIHRoZSBlbGVtZW50IChmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMpLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZGVmYXVsdFZhbHVlOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkaXNhYmxlZFxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBJZiB0cnVlLCB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZC4gWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBSYW5nZTtcbiIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJ29uc2VudWkvZXNtL2VsZW1lbnRzL29ucy1yaXBwbGUnO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLXJpcHBsZVxuICogQGNhdGVnb3J5IHZpc3VhbFxuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS9yaXBwbGVcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXVxuICogICBBZGRzIGEgTWF0ZXJpYWwgRGVzaWduIFwicmlwcGxlXCIgZWZmZWN0IHRvIGFuIGVsZW1lbnQuXG4gKiBbL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICAgPGRpdiBjbGFzc05hbWU9J215TGlzdCc+XG4gICAgIDxSaXBwbGUgY29sb3I9J3JlZCcgLz5cbiAgIDwvZGl2PlxuICovXG5jb25zdCBSaXBwbGUgPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtcmlwcGxlJyk7XG5cblJpcHBsZS5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSBjb2xvclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNvbG9yIG9mIHRoZSByaXBwbGUgZWZmZWN0LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBtb2RpZmllclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSByaXBwbGUgZWZmZWN0LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG1vZGlmaWVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBiYWNrZ3JvdW5kXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ29sb3Igb2YgdGhlIGJhY2tncm91bmQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgYmFja2dyb3VuZDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgc2l6ZVxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNpemluZyBvZiB0aGUgd2F2ZSBvbiByaXBwbGUgZWZmZWN0LiBTZXQgXCJjb3ZlclwiIG9yIFwiY29udGFpblwiLiBEZWZhdWx0IGlzIFwiY292ZXJcIi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBzaXplOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBzaXplXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2hhbmdlcyB0aGUgcG9zaXRpb24gb2Ygd2F2ZSBlZmZlY3QgdG8gY2VudGVyIG9mIHRoZSB0YXJnZXQgZWxlbWVudC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBjZW50ZXI6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkaXNhYmxlZFxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbFxufTtcblxuZXhwb3J0IGRlZmF1bHQgUmlwcGxlO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLW5hdmlnYXRvcic7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuXG5jb25zdCBFbGVtZW50ID0gb25zQ3VzdG9tRWxlbWVudCgnb25zLW5hdmlnYXRvcicpO1xuXG5jbGFzcyBSb3V0ZXJOYXZpZ2F0b3JDbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICBzdXBlciguLi5hcmdzKTtcblxuICAgIHRoaXMuY2FuY2VsVXBkYXRlID0gZmFsc2U7XG5cbiAgICBjb25zdCBjYWxsYmFjayA9IChuYW1lLCBldmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMucHJvcHNbbmFtZV0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHNbbmFtZV0oZXZlbnQpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vblByZVB1c2ggPSBjYWxsYmFjay5iaW5kKHRoaXMsICdvblByZVB1c2gnKTtcbiAgICB0aGlzLm9uUG9zdFB1c2ggPSBjYWxsYmFjay5iaW5kKHRoaXMsICdvblBvc3RQdXNoJyk7XG4gICAgdGhpcy5vblByZVBvcCA9IGNhbGxiYWNrLmJpbmQodGhpcywgJ29uUHJlUG9wJyk7XG4gICAgdGhpcy5vblBvc3RQb3AgPSBjYWxsYmFjay5iaW5kKHRoaXMsICdvblBvc3RQb3AnKTtcblxuICAgIHRoaXMucmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaW50ZXJuYWxTdGFjazogW11cbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlKGNiKSB7XG4gICAgaWYgKCF0aGlzLmNhbmNlbFVwZGF0ZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7fSwgY2IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlc2V0UGFnZVN0YWNrXG4gICAqIEBzaWduYXR1cmUgcmVzZXRQYWdlU3RhY2socm91dGUsIG9wdGlvbnMgPSB7fSlcbiAgICogQHBhcmFtIHtBcnJheX0gW3JvdXRlc11cbiAgICogICBbZW5dIFRoZSByb3V0ZXMgdGhhdCB0aGUgbmF2aWdhdG9yIHNob3VsZCBiZSByZXNldCB0by5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1Qcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSByZXZlYWxlZCBwYWdlLlsvZW5dXG4gICAqICAgW2phXeaYjuOCieOBi+OBq+OBl+OBn+ODmuODvOOCuOOCkuino+axuuOBmeOCi1Byb21pc2XjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dIFJlc2V0cyB0aGUgbmF2aWdhdG9yIHRvIHRoZSBjdXJyZW50IHBhZ2Ugc3RhY2tbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgcmVzZXRQYWdlU3RhY2socm91dGVzLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW50ZXJuYWxTdGFjazogWy4uLnRoaXMuc3RhdGUuaW50ZXJuYWxTdGFjaywgcm91dGVzW3JvdXRlcy5sZW5ndGggLSAxXV19LCByZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5yZWYuY3VycmVudC5fcHVzaFBhZ2Uob3B0aW9ucywgdXBkYXRlKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbnRlcm5hbFN0YWNrOiBbLi4ucm91dGVzXX0pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBwdXNoUGFnZVxuICAgKiBAc2lnbmF0dXJlIHB1c2hQYWdlKHJvdXRlLCBvcHRpb25zID0ge30pXG4gICAqIEBwYXJhbSB7QXJyYXl9IFtyb3V0ZXNdXG4gICAqICAgW2VuXSBUaGUgcm91dGVzIHRoYXQgdGhlIG5hdmlnYXRvciBzaG91bGQgcHVzaCB0by5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl0gUHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byB0aGUgcmV2ZWFsZWQgcGFnZS5bL2VuXVxuICAgKiAgIFtqYV3mmI7jgonjgYvjgavjgZfjgZ/jg5rjg7zjgrjjgpLop6PmsbrjgZnjgotQcm9taXNl44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXSBQdXNoZXMgYSBwYWdlIHRvIHRoZSBwYWdlIHN0YWNrWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHB1c2hQYWdlKHJvdXRlLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW50ZXJuYWxTdGFjazogWy4uLnRoaXMuc3RhdGUuaW50ZXJuYWxTdGFjaywgcm91dGVdfSwgcmVzb2x2ZSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucmVmLmN1cnJlbnQuX3B1c2hQYWdlKG9wdGlvbnMsIHVwZGF0ZSk7XG4gIH1cblxuICBpc1J1bm5pbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVmLmN1cnJlbnQuX2lzUnVubmluZztcbiAgfVxuXG4gIC8qXG4gICAqIEBtZXRob2QgcmVwbGFjZVBhZ2VcbiAgICogQHNpZ25hdHVyZSByZXBsYWNlUGFnZShwYWdlLCBbb3B0aW9uc10pXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYWdlLlsvZW5dXG4gICAqICAgW2phXeaWsOOBl+OBhOODmuODvOOCuOOCkuino+axuuOBmeOCi1Byb21pc2XjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVwbGFjZXMgdGhlIGN1cnJlbnQgdG9wIHBhZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9uZS4gRXh0ZW5kcyBgcHVzaFBhZ2UoKWAgcGFyYW1ldGVycy5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjooajnpLrkuK3jga7jg5rjg7zjgrjjgpLjgpLmjIflrprjgZfjgZ/jg5rjg7zjgrjjgavnva7jgY3mj5vjgYjjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgcmVwbGFjZVBhZ2Uocm91dGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICh0aGlzLmlzUnVubmluZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdXBkYXRlID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbnRlcm5hbFN0YWNrOiBbLi4udGhpcy5zdGF0ZS5pbnRlcm5hbFN0YWNrLCByb3V0ZV19LCByZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5yZWYuY3VycmVudC5fcHVzaFBhZ2Uob3B0aW9ucywgdXBkYXRlKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbnRlcm5hbFN0YWNrOiBbLi4udGhpcy5zdGF0ZS5pbnRlcm5hbFN0YWNrLnNsaWNlKDAsIC0yKSwgcm91dGVdfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHBvcFBhZ2VcbiAgICogQHNpZ25hdHVyZSBwb3BQYWdlKHJvdXRlLCBvcHRpb25zID0ge30pXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXSBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSByZXZlYWxlZCBwYWdlLlsvZW5dXG4gICAqICAgW2phXeaYjuOCieOBi+OBq+OBl+OBn+ODmuODvOOCuOOCkuino+axuuOBmeOCi1Byb21pc2XjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dIFBvcHMgYSBwYWdlIG91dCBvZiB0aGUgcGFnZSBzdGFja1svZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBwb3BQYWdlKG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICh0aGlzLmlzUnVubmluZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdXBkYXRlID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBSZWFjdERPTS5mbHVzaFN5bmMoKCkgPT4geyAvLyBwcmV2ZW50cyBmbGlja2VyaW5nIGNhdXNlZCBieSBSZWFjdCAxOCBiYXRjaGluZ1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2ludGVybmFsU3RhY2s6IHRoaXMuc3RhdGUuaW50ZXJuYWxTdGFjay5zbGljZSgwLCAtMSl9LCByZXNvbHZlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucmVmLmN1cnJlbnQuX3BvcFBhZ2Uob3B0aW9ucywgdXBkYXRlKTtcbiAgfVxuXG4gIF9vbkRldmljZUJhY2tCdXR0b24oZXZlbnQpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5yb3V0ZUNvbmZpZy5yb3V0ZVN0YWNrLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMucG9wUGFnZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBldmVudC5jYWxsUGFyZW50SGFuZGxlcigpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnJlZi5jdXJyZW50O1xuXG4gICAgdGhpcy5jYW5jZWxVcGRhdGUgPSBmYWxzZTtcblxuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigncHJlcHVzaCcsIHRoaXMub25QcmVQdXNoKTtcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3Bvc3RwdXNoJywgdGhpcy5vblBvc3RQdXNoKTtcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3ByZXBvcCcsIHRoaXMub25QcmVQb3ApO1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigncG9zdHBvcCcsIHRoaXMub25Qb3N0UG9wKTtcblxuICAgIGlmICghdGhpcy5wcm9wcy5yb3V0ZUNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbiBSb3V0ZXJOYXZpZ2F0b3IgdGhlIHByb3BlcnR5IHJvdXRlQ29uZmlnIG5lZWRzIHRvIGJlIHNldCcpO1xuICAgIH1cblxuICAgIG5vZGUuc3dpcGVNYXggPSB0aGlzLnByb3BzLnN3aXBlUG9wO1xuICAgIG5vZGUub25EZXZpY2VCYWNrQnV0dG9uID0gdGhpcy5wcm9wcy5vbkRldmljZUJhY2tCdXR0b24gfHwgdGhpcy5fb25EZXZpY2VCYWNrQnV0dG9uLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLnNldFN0YXRlKHtpbnRlcm5hbFN0YWNrOiB0aGlzLnByb3BzLnJvdXRlQ29uZmlnLnJvdXRlU3RhY2t9KTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnJlZi5jdXJyZW50O1xuICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncHJlcHVzaCcsIHRoaXMub25QcmVQdXNoKTtcbiAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Bvc3RwdXNoJywgdGhpcy5vblBvc3RQdXNoKTtcbiAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3ByZXBvcCcsIHRoaXMub25QcmVQb3ApO1xuICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9zdHBvcCcsIHRoaXMub25Qb3N0UG9wKTtcbiAgICB0aGlzLmNhbmNlbFVwZGF0ZSA9IHRydWU7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgaWYgKHRoaXMucHJvcHMub25EZXZpY2VCYWNrQnV0dG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVmLmN1cnJlbnQub25EZXZpY2VCYWNrQnV0dG9uID0gdGhpcy5wcm9wcy5vbkRldmljZUJhY2tCdXR0b247XG4gICAgfVxuXG4gICAgY29uc3QgcHJvY2Vzc1N0YWNrID0gWy4uLnRoaXMucHJvcHMucm91dGVDb25maWcucHJvY2Vzc1N0YWNrXTtcblxuICAgIC8qKlxuICAgICAqIEZpeCBmb3IgUmVkdXggVGltZXRyYXZlbC5cbiAgICAgKi9cbiAgICBpZiAocHJldlByb3BzLnJvdXRlQ29uZmlnLnByb2Nlc3NTdGFjay5sZW5ndGggPCB0aGlzLnByb3BzLnJvdXRlQ29uZmlnLnByb2Nlc3NTdGFjay5sZW5ndGggJiZcbiAgICAgIHByZXZQcm9wcy5yb3V0ZUNvbmZpZy5yb3V0ZVN0YWNrLmxlbmd0aCA+IHRoaXMucHJvcHMucm91dGVDb25maWcucm91dGVTdGFjay5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzc1N0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHt0eXBlLCByb3V0ZSwgb3B0aW9uc30gPSBwcm9jZXNzU3RhY2tbMF07XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdwdXNoJzpcbiAgICAgICAgICB0aGlzLnB1c2hQYWdlKHJvdXRlLCBvcHRpb25zKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncG9wJzpcbiAgICAgICAgICB0aGlzLnBvcFBhZ2Uob3B0aW9ucyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Jlc2V0JzpcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3V0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRQYWdlU3RhY2socm91dGUsIG9wdGlvbnMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0UGFnZVN0YWNrKFtyb3V0ZV0sIG9wdGlvbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmVwbGFjZSc6XG4gICAgICAgICAgdGhpcy5yZXBsYWNlUGFnZShyb3V0ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHR5cGUgJHt0eXBlfSBpbiBwcm9jZXNzU3RhY2tgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW5uZXJSZWYsXG4gICAgICByZW5kZXJQYWdlLFxuXG4gICAgICAvLyB0aGVzZSBwcm9wcyBzaG91bGQgbm90IGJlIHBhc3NlZCBkb3duXG4gICAgICBvblByZVB1c2gsXG4gICAgICBvblBvc3RQdXNoLFxuICAgICAgb25QcmVQb3AsXG4gICAgICBvblBvc3RQb3AsXG4gICAgICBzd2lwZVBvcCxcbiAgICAgIG9uRGV2aWNlQmFja0J1dHRvbixcblxuICAgICAgLi4ucmVzdFxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3QgcGFnZXNUb1JlbmRlciA9IHRoaXMuc3RhdGUuaW50ZXJuYWxTdGFjay5tYXAocm91dGUgPT4gcmVuZGVyUGFnZShyb3V0ZSkpO1xuXG4gICAgaWYgKGlubmVyUmVmICYmIGlubmVyUmVmICE9PSB0aGlzLnJlZikge1xuICAgICAgdGhpcy5yZWYgPSBpbm5lclJlZjtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPEVsZW1lbnQgey4uLnJlc3R9IHJlZj17dGhpcy5yZWZ9PlxuICAgICAgICB7cGFnZXNUb1JlbmRlcn1cbiAgICAgIDwvRWxlbWVudD5cbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1uYXZpZ2F0b3JcbiAqIEBjYXRlZ29yeSBuYXZpZ2F0aW9uXG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL25hdmlnYXRvclxuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dIFRoaXMgY29tcG9uZW50IGlzIGEgdmFyaWFudCBvZiB0aGUgTmF2aWdhdG9yIHdpdGggYSBkZWNsYXJhdGl2ZSBBUEkuIEluIG9yZGVyIHRvIG1hbmFnZSB0byBkaXNwbGF5IHRoZSBwYWdlcywgdGhlICBuYXZpZ2F0b3IgbmVlZHMgdG8gZGVmaW5lIHRoZSBgcmVuZGVyUGFnZWAgbWV0aG9kLCB0aGF0IHRha2VzIGFuIHJvdXRlIGFuZCBhIG5hdmlnYXRvciBhbmQgIGNvbnZlcnRzIGl0IHRvIGFuIHBhZ2UuWy9lbl1cbiAqIFtqYV1bL2phXVxuICovXG5jb25zdCBSb3V0ZXJOYXZpZ2F0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiAoXG4gIDxSb3V0ZXJOYXZpZ2F0b3JDbGFzcyBpbm5lclJlZj17cmVmfSB7Li4ucHJvcHN9Pntwcm9wcy5jaGlsZHJlbn08L1JvdXRlck5hdmlnYXRvckNsYXNzPlxuKSk7XG5cblJvdXRlck5hdmlnYXRvci5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSByZW5kZXJQYWdlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCB0cnVlXG4gICAqIEBkZWZhdWx0VmFsdWUgbnVsbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgY3VycmVudCByb3V0ZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSByZWFjdCBjb21wb25lbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICByZW5kZXJQYWdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAvKipcbiAgICogQG5hbWUgcm91dGVDb25maWdcbiAgICogQHR5cGUgb2JqZWN0XG4gICAqIEByZXF1aXJlZCB0cnVlXG4gICAqIEBkZWZhdWx0VmFsdWUgbnVsbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gVGhpcyBvYmplY3QgbXVzdCBjb250YWluIHR3byBwcm9wZXJ0aWVzOlxuICAgKiAgYHJvdXRlU3RhY2tgOiBBbiBhcnJheSBvZiByb3V0ZSBvYmplY3RzLFxuICAgKiAgYHByb2Nlc3NTdGFja2A6IEFuIGFycmF5IG9mIHByb2Nlc3Mgb2JqZWN0cyBgeyB0eXBlOiBwdXNoIHwgcG9wIHwgcmVzZXQsIHJvdXRlOiB1c2VyUm91dGUgfWAgdGhhdFxuICAgKiAgZGVzY3JpYmUgdGhlIHRyYW5zaXRpb24gZnJvbSB0aGUgY3VycmVudCBzdGF0ZSB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICogIE1ha2Ugc3VyZSB0aGF0IHRoZSByb3V0ZSBzdGFjayBpcyBub3QgZW1wdGllZCBiZWZvcmUgdGhlIGFuaW1hdGlvbnMgZm9yIHRoZSBgcHJvY2Vzc1N0YWNrYCBoYXZlIGNvbXBsZXRlZC5cbiAgICogIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVwZGF0ZSB0aGUgYHJvdXRlU3RhY2tgIGFuZCBlbXB0eSB0aGUgYHByb2Nlc3NTdGFja2AgaW4gdGhlICdvblBvc3RQb3AnIGNhbGxiYWNrLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgcm91dGVDb25maWc6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgcm91dGVTdGFjazogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgcHJvY2Vzc1N0YWNrOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KVxuICB9KSxcblxuICAvKipcbiAgICogQG5hbWUgb25QcmVQdXNoXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQganVzdCBiZWZvcmUgYSBwYWdlIGlzIHB1c2hlZC5bL2VuXVxuICAgKi9cbiAgb25QcmVQdXNoOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25Qb3N0UHVzaFxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIGp1c3QgYWZ0ZXIgYSBwYWdlIGlzIHB1c2hlZC5bL2VuXVxuICAgKi9cbiAgb25Qb3N0UHVzaDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUHJlUG9wXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQganVzdCBiZWZvcmUgYSBwYWdlIGlzIHBvcHBlZC5bL2VuXVxuICAgKi9cbiAgb25QcmVQb3A6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblBvc3RQb3BcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCBqdXN0IGFmdGVyIGEgcGFnZSBpcyBwb3BwZWQuWy9lbl1cbiAgICovXG4gIG9uUG9zdFBvcDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBhbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJzbGlkZVwiYCwgYFwibGlmdFwiYCwgYFwiZmFkZVwiYCBhbmQgYFwibm9uZVwiYC5cbiAgICogICAgIFRoZXNlIGFyZSBwbGF0Zm9ybSBiYXNlZCBhbmltYXRpb25zLiBGb3IgZml4ZWQgYW5pbWF0aW9ucywgYWRkIGBcIi1pb3NcImAgb3IgYFwiLW1kXCJgIHN1ZmZpeCB0byB0aGUgYW5pbWF0aW9uIG5hbWUuIEUuZy4gYFwibGlmdC1pb3NcImAsIGBcImxpZnQtbWRcImAuIERlZmF1bHRzIHZhbHVlcyBhcmUgYFwic2xpZGUtaW9zXCJgIGFuZCBgXCJmYWRlLW1kXCJgLlxuICAgKiAgIFsvZW5dXG4gICAqL1xuICBhbmltYXRpb246IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUgb2JqZWN0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuICBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgYW5pbWF0aW9uT3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQG5hbWUgc3dpcGVhYmxlXG4gICAqIEB0eXBlIGJvb2x8c3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIEVuYWJsZXMgc3dpcGUtdG8tcG9wIGZ1bmN0aW9uYWxpdHkgZm9yIGlPUy5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHN3aXBlYWJsZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKipcbiAgICogQG5hbWUgc3dpcGVQb3BcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgRnVuY3Rpb24gY2FsbGVkIG9uIHN3aXBlLXRvLXBvcC4gTXVzdCBwZXJmb3JtIGEgcG9wUGFnZSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zIG9iamVjdC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHN3aXBlUG9wOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIEN1c3RvbSBoYW5kbGVyIGZvciBkZXZpY2UgYmFjayBidXR0b24uXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvbkRldmljZUJhY2tCdXR0b246IFByb3BUeXBlcy5mdW5jXG59O1xuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZXJOYXZpZ2F0b3I7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtcm93JztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1yb3dcbiAqIEBjYXRlZ29yeSBncmlkXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl1cbiAqIFJlcHJlc2VudHMgYSByb3cgaW4gdGhlIGdyaWQgc3lzdGVtLiBVc2Ugd2l0aCBgQ29sYCB0byBsYXlvdXQgY29tcG9uZW50cy5cbiAqIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIDxSb3c+XG4gKiAgIDxDb2wgd2lkdGg9ezUwfT5cbiAgKiAgIDxvbnMtaWNvbiBpY29uPVwiZmEtdHdpdHRlclwiPjwvb25zLWljb24+XG4gKiAgIDwvQ29sPlxuICogICA8Q29sPlRleHQ8L0NvbD5cbiAqIDwvUm93PlxuICovXG5jb25zdCBSb3cgPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtcm93Jyk7XG5cblJvdy5wcm9wVHlwZXMgPSB7XG5cbiAgLyoqXG4gICogQG5hbWUgdmVydGljYWxBbGlnblxuICAqIEB0eXBlIHtTdHJpbmd9XG4gICogQGRlc2NyaXB0aW9uXG4gICogICBbZW5dU2hvcnQgaGFuZCBhdHRyaWJ1dGUgZm9yIGFsaWduaW5nIHZlcnRpY2FsbHkuIFZhbGlkIHZhbHVlcyBhcmUgdG9wLCBib3R0b20sIGFuZCBjZW50ZXIuWy9lbl1cbiAgKiAgIFtqYV1bL2phXVxuICAqL1xuICB2ZXJ0aWNhbEFsaWduOiBQcm9wVHlwZXMub25lT2YoWyd0b3AnLCAnYm90dG9tJywgJ2NlbnRlciddKVxuXG59O1xuXG5leHBvcnQgZGVmYXVsdCBSb3c7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtc2VhcmNoLWlucHV0JztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5pbXBvcnQgb25lVGltZVByb3AgZnJvbSAnLi4vb25lVGltZVByb3AnO1xuaW1wb3J0IElOUFVUX1BST1BTIGZyb20gJy4uL2lucHV0UHJvcHMnO1xuXG5jb25zdCBuYW1lTWFwID0ge1xuICAuLi5JTlBVVF9QUk9QU1xufTtcblxuY29uc3Qgd2l0aERlZmF1bHRWYWx1ZSA9IGNvbXBvbmVudCA9PiBvbmVUaW1lUHJvcChjb21wb25lbnQsICdkZWZhdWx0VmFsdWUnLCAndmFsdWUnKTtcblxuY29uc3Qgbm90QXR0cmlidXRlcyA9IFtcbiAgJ3ZhbHVlJyAvLyB2YWx1ZSBtdXN0IGJlIGFwcGxpZWQgYXMgcHJvcGVydHkgc2luY2UgYXR0cmlidXRlIG9ubHkgd29ya3MgYmVmb3JlIGlucHV0IGlzIHRvdWNoZWRcbl07XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1zZWFyY2gtaW5wdXRcbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL3NlYXJjaC1pbnB1dFxuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dXG4gKiAgQSBzZWFyY2ggaW5wdXQgY29tcG9uZW50LiBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSByZW5kZXIgYXMgYSBNYXRlcmlhbCBEZXNpZ24gc2VhcmNoIGlucHV0IG9uIEFuZHJvaWQgZGV2aWNlcy5cbiAqXG4gKiAgTW9zdCBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGEgbm9ybWFsIGA8aW5wdXQ+YCBlbGVtZW50IGNhbiBhbHNvIGJlIHVzZWQgb24gdGhlIGA8U2VhcmNoSW5wdXQ+YCBjb21wb25lbnQuXG4gKiBbL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPFNlYXJjaElucHV0XG4gKiAgIHZhbHVlPXt0aGlzLnN0YXRlLnRleHR9XG4gKiAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHsgdGhpcy5zZXRTdGF0ZSh7dGV4dDogZXZlbnQudGFyZ2V0LnZhbHVlfSl9IH1cbiAqICAgbW9kaWZpZXI9J21hdGVyaWFsJ1xuICogICBwbGFjZWhvbGRlcj0nVXNlcm5hbWUnIC8+XG4gKi9cbmNvbnN0IFNlYXJjaElucHV0ID0gd2l0aERlZmF1bHRWYWx1ZShvbnNDdXN0b21FbGVtZW50KCdvbnMtc2VhcmNoLWlucHV0Jywge2RlcHJlY2F0ZWQ6IG5hbWVNYXAsIG5vdEF0dHJpYnV0ZXN9KSk7XG5cblNlYXJjaElucHV0LnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEBuYW1lIG1vZGlmaWVyXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGlucHV0LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG1vZGlmaWVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkaXNhYmxlZFxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZmllcyB3aGV0aGVyIHRoZSBpbnB1dCBpcyBkaXNhYmxlZC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIHJlYWRPbmx5XG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGlucHV0IGlzIHJlYWQtb25seS5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICByZWFkT25seTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uQ2hhbmdlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCB3aGVuIHRoZSBpbm5lciBpbnB1dCBmaXJlcyBhIGBjaGFuZ2VgIGV2ZW50LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25JbnB1dFxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQgd2hlbiB0aGUgaW5uZXIgaW5wdXQgZmlyZXMgYW4gYGlucHV0YCBldmVudC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvbklucHV0OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgdmFsdWVcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNvbnRlbnQgb2YgdGhlIGlucHV0IChjb250cm9sbGVkKS5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICB2YWx1ZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLnN0cmluZyxcbiAgICBQcm9wVHlwZXMuaW5zdGFuY2VPZihEYXRlKVxuICBdKSxcblxuICAvKipcbiAgICogQG5hbWUgZGVmYXVsdFZhbHVlXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db250ZW50IG9mIHRoZSBpbnB1dCBhdCBmaXJzdCByZW5kZXIgKHVuY29udHJvbGxlZCkuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZGVmYXVsdFZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIFByb3BUeXBlcy5pbnN0YW5jZU9mKERhdGUpXG4gIF0pLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBwbGFjZWhvbGRlclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dIFBsYWNlaG9sZGVyIHRleHQuIEluIE1hdGVyaWFsIERlc2lnbiB0aGlzIHBsYWNlaG9sZGVyIHdpbGwgYmUgYSBmbG9hdGluZyBsYWJlbC4gWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgcGxhY2Vob2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGlucHV0SWRcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSAgU3BlY2lmeSB0aGUgXCJpZFwiIGF0dHJpYnV0ZSBvZiB0aGUgaW5uZXIgYDxpbnB1dD5gIGVsZW1lbnQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gdXNpbmcgPGxhYmVsIGZvcj1cIi4uLlwiPiBlbGVtZW50cyBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBpbnB1dElkOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5leHBvcnQgZGVmYXVsdCBTZWFyY2hJbnB1dDtcbiIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJ29uc2VudWkvZXNtL2VsZW1lbnRzL29ucy1zZWdtZW50JztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5cbmNvbnN0IGRlcHJlY2F0ZWQgPSB7XG4gIGluZGV4OiAnYWN0aXZlSW5kZXgnXG59O1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtc2VnbWVudFxuICogQGNhdGVnb3J5IGNvbnRyb2xcbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2Uvc2VnbWVudFxuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dXG4gKiAgIFNlZ21lbnQgY29tcG9uZW50LlxuICogWy9lbl1cbiAqIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqIDxTZWdtZW50IG1vZGlmaWVyPVwibWF0ZXJpYWxcIj5cbiAqICA8YnV0dG9uPkxhYmVsIDE8L2J1dHRvbj5cbiAqICA8YnV0dG9uPkxhYmVsIDI8L2J1dHRvbj5cbiAqICA8YnV0dG9uPkxhYmVsIDM8L2J1dHRvbj5cbiAqIDwvU2VnbWVudD5cbiAqL1xuY29uc3QgU2VnbWVudCA9IG9uc0N1c3RvbUVsZW1lbnQoJ29ucy1zZWdtZW50Jywge2RlcHJlY2F0ZWR9KTtcblxuU2VnbWVudC5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSBhY3RpdmVJbmRleFxuICAgKiBAdHlwZSBudW1iZXJcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGluZGV4IG9mIHRoZSBidXR0b24gdG8gaGlnaGxpZ2h0LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGFjdGl2ZUluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBpbmRleFxuICAgKiBAdHlwZSBudW1iZXJcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dREVQUkVDQVRFRCEgVXNlIGBhY3RpdmVJbmRleGAgaW5zdGVhZC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBpbmRleDogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogQG5hbWUgdGFiYmFySWRcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBJRCBvZiB0aGUgYDxUYWJiYXI+YCB0byBcImNvbm5lY3RcIiB0byB0aGUgc2VnbWVudC4gWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgdGFiYmFySWQ6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG1vZGlmaWVyXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHNlZ21lbnQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbW9kaWZpZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUG9zdENoYW5nZVxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gQ2FsbGVkIGFmdGVyIHRoZSBhY3RpdmUgYnV0dG9uIGNoYW5nZXMuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25Qb3N0Q2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgZGlzYWJsZWRcbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHNlZ21lbnQgc2hvdWxkIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2xcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNlZ21lbnQ7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLXNlbGVjdCc7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuaW1wb3J0IG9uZVRpbWVQcm9wIGZyb20gJy4uL29uZVRpbWVQcm9wJztcbmltcG9ydCBJTlBVVF9QUk9QUyBmcm9tICcuLi9pbnB1dFByb3BzJztcblxuY29uc3QgbmFtZU1hcCA9IHtcbiAgLi4uSU5QVVRfUFJPUFNcbn07XG5cbmNvbnN0IHdpdGhEZWZhdWx0VmFsdWUgPSBjb21wb25lbnQgPT4gb25lVGltZVByb3AoY29tcG9uZW50LCAnZGVmYXVsdFZhbHVlJywgJ3ZhbHVlJyk7XG5jb25zdCBFbGVtZW50ID0gd2l0aERlZmF1bHRWYWx1ZShvbnNDdXN0b21FbGVtZW50KCdvbnMtc2VsZWN0Jywge2RlcHJlY2F0ZWQ6IG5hbWVNYXB9KSk7XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1zZWxlY3RcbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL3NlbGVjdFxuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dXG4gKiAgIFNlbGVjdCBpbnB1dCBjb21wb25lbnQuXG4gKiBbL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPFNlbGVjdCBtb2RpZmllcj1cIm1hdGVyaWFsXCJcbiAqICAgdmFsdWU9e3RoaXMuc3RhdGUudmFsdWV9XG4gKiAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHRoaXMuc2V0U3RhdGUoe3ZhbHVlOiBldmVudC50YXJnZXQudmFsdWV9KX0+XG4gKiAgIDxvcHRpb24gdmFsdWU9XCIxXCI+MTwvb3B0aW9uPlxuICogICA8b3B0aW9uIHZhbHVlPVwiMlwiPjJuZDwvb3B0aW9uPlxuICogICA8b3B0aW9uIHZhbHVlPVwiM1wiPjNyZCBvcHRpb248L29wdGlvbj5cbiAqIDwvU2VsZWN0PlxuICovXG5jb25zdCBTZWxlY3QgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiAoXG4gIDxFbGVtZW50IHsuLi5wcm9wc30gcmVmPXtyZWZ9PlxuICAgIDxzZWxlY3Q+XG4gICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgPC9zZWxlY3Q+XG4gIDwvRWxlbWVudD5cbikpO1xuXG5TZWxlY3QucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBzZWxlY3QgYm94LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG1vZGlmaWVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkaXNhYmxlZFxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZmllcyB3aGV0aGVyIHRoZSBzZWxlY3QgaXMgZGlzYWJsZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkNoYW5nZVxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdCBjaGFuZ2VzLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgdmFsdWVcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVVzZSB0aGlzIHByb3AgdG8gc2V0IHRoZSBzZWxlY3RlZCBvcHRpb24gdmFsdWUuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgdmFsdWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGRlZmF1bHRWYWx1ZVxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVXNlIHRoaXMgcHJvcCB0byBzZXQgdGhlIGRlZmFsdXQgc2VsZWN0ZWQgb3B0aW9uIHZhbHVlICh1bmNvbnRyb2xsZWQgY29tcG9uZW50cykuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZGVmYXVsdFZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBtdWx0aXBsZVxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIGRlZmluZWQsIG11bHRpcGxlIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIGF0IG9uY2UuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbXVsdGlwbGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBhdXRvZm9jdXNcbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1FbGVtZW50IGF1dG9tYXRpY2FsbHkgZ2FpbnMgZm9jdXMgb24gcGFnZSBsb2FkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGF1dG9mb2N1czogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIHJlcXVpcmVkXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dTWFrZSB0aGUgc2VsZWN0IGlucHV0IHJlcXVpcmVkIGZvciBzdWJtaXR0aW5nIHRoZSBmb3JtIGl0IGlzIHBhcnQgb2YuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgcmVxdWlyZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBmb3JtXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Bc3NvY2lhdGUgYSBzZWxlY3QgZWxlbWVudCB0byBhbiBleGlzdGluZyBmb3JtIG9uIHRoZSBwYWdlLCBldmVuIGlmIG5vdCBuZXN0ZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZm9ybTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgc2l6ZVxuICAgKiBAdHlwZSBudW1iZXJcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSG93IG1hbnkgb3B0aW9ucyBhcmUgZGlzcGxheWVkOyBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIHRoZSBzaXplIHRoZW4gYSBzY3JvbGwgYXBwZWFycyB0byBuYXZpZ2F0ZSB0aGVtWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogQG5hbWUgbmFtZVxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dTmFtZSB0aGUgc2VsZWN0IGVsZW1lbnQsIHVzZWZ1bCBmb3IgaW5zdGFuY2UgaWYgaXQgaXMgcGFydCBvZiBhIGZvcm0uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2VsZWN0O1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLXNwZWVkLWRpYWwnO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLXNwZWVkLWRpYWxcbiAqIEBjYXRlZ29yeSBjb250cm9sXG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL3NwZWVkLWRpYWxcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXSBFbGVtZW50IHRoYXQgZGlzcGxheXMgYSBNYXRlcmlhbCBEZXNpZ24gU3BlZWQgRGlhbG9nIGNvbXBvbmVudC4gSXQgaXMgdXNlZnVsIHdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcHJpbWFyeSBhY3Rpb24gdGhhdCBjYW4gYmUgcGVyZm9ybWVkIGluIGEgcGFnZS5cbiAqICBUaGUgU3BlZWQgZGlhbCBsb29rcyBsaWtlIGEgYEZhYmAgZWxlbWVudCBidXQgd2lsbCBleHBhbmQgYSBtZW51IHdoZW4gdGFwcGVkLlxuIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8U3BlZWREaWFsIGRpc2FibGVkPXtmYWxzZX0gZGlyZWN0aW9uPSdyaWdodCcgb25DbGljaz17KCkgPT4gY29uc29sZS5sb2coJ3Rlc3QxJyl9IHBvc2l0aW9uPSdsZWZ0IGJvdHRvbSc+XG4gICAgIDxGYWI+XG4gICAgICAgPEljb24gaWNvbj0nZmEtdHdpdHRlcicgc2l6ZT17MjZ9IGZpeGVkV2lkdGg9e2ZhbHNlfSBzdHlsZT17e3ZlcnRpY2FsQWxpZ246ICdtaWRkbGUnfX0gLz5cbiAgICAgPC9GYWI+XG4gICAgIDxTcGVlZERpYWxJdGVtIG9uQ2xpY2s9eygpID0+IGNvbnNvbGUubG9nKCdzcGVlZCBBJyl9PiBBIDwvU3BlZWREaWFsSXRlbT5cbiAgICAgPFNwZWVkRGlhbEl0ZW0gb25DbGljaz17KCkgPT4gY29uc29sZS5sb2coJ3NwZWVkIEInKX0+IEIgPC9TcGVlZERpYWxJdGVtPlxuICAgICA8U3BlZWREaWFsSXRlbSBvbkNsaWNrPXsoKSA9PiBjb25zb2xlLmxvZygnc3BlZWQgQycpfT4gQyA8L1NwZWVkRGlhbEl0ZW0+XG4gICAgIDxTcGVlZERpYWxJdGVtIG9uQ2xpY2s9eygpID0+IGNvbnNvbGUubG9nKCdzcGVlZCBEJyl9PiBEIDwvU3BlZWREaWFsSXRlbT5cbiAgIDwvU3BlZWREaWFsPlxuICovXG5jb25zdCBTcGVlZERpYWwgPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtc3BlZWQtZGlhbCcpO1xuXG5TcGVlZERpYWwucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgc3BlZWQgZGlhbC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgcG9zaXRpb25cbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBjb21wb25lbnQuXG4gICAqICAgICBJLmUuIHRvIGRpc3BsYXkgaXQgaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgc3BlY2lmeSBcInJpZ2h0IHRvcFwiLlxuICAgKiAgICAgQ2hvb3NlIGZyb20gXCJyaWdodFwiLCBcImxlZnRcIiwgXCJ0b3BcIiBhbmQgXCJib3R0b21cIi5cblsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHBvc2l0aW9uOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkaXJlY3Rpb25cbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGRpcmVjdGlvbiB0aGUgaXRlbXMgYXJlIGRpc3BsYXllZC4gUG9zc2libGUgdmFsdWVzIGFyZSBcInVwXCIsIFwiZG93blwiLCBcImxlZnRcIiBhbmQgXCJyaWdodFwiLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRpcmVjdGlvbjogUHJvcFR5cGVzLm9uZU9mKFsndXAnLCAnZG93bicsICdsZWZ0JywgJ3JpZ2h0J10pLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkaXNhYmxlZFxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSBpZiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbFxufTtcblxuZXhwb3J0IGRlZmF1bHQgU3BlZWREaWFsO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLXNwZWVkLWRpYWwtaXRlbSc7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtc3BlZWQtZGlhbC1pdGVtXG4gKiBAY2F0ZWdvcnkgY29udHJvbFxuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS9zcGVlZC1kaWFsXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl0gVGhpcyBjb21wb25lbnQgZGlzcGxheXMgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBNYXRlcmlhbCBEZXNpZ24gU3BlZWQgZGlhbCBjb21wb25lbnQuIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8U3BlZWREaWFsIGRpc2FibGVkPXtmYWxzZX0gZGlyZWN0aW9uPSdyaWdodCcgb25DbGljaz17KCkgPT4gY29uc29sZS5sb2coJ3Rlc3QxJyl9IHBvc2l0aW9uPSdsZWZ0IGJvdHRvbSc+XG4gICAgIDxGYWI+XG4gICAgICAgPEljb24gaWNvbj0nZmEtdHdpdHRlcicgc2l6ZT17MjZ9IGZpeGVkV2lkdGg9e2ZhbHNlfSBzdHlsZT17e3ZlcnRpY2FsQWxpZ246ICdtaWRkbGUnfX0gLz5cbiAgICAgPC9GYWI+XG4gICAgIDxTcGVlZERpYWxJdGVtIG9uQ2xpY2s9eygpID0+IGNvbnNvbGUubG9nKCdzcGVlZCBBJyl9PiBBIDwvU3BlZWREaWFsSXRlbT5cbiAgICAgPFNwZWVkRGlhbEl0ZW0gb25DbGljaz17KCkgPT4gY29uc29sZS5sb2coJ3NwZWVkIEInKX0+IEIgPC9TcGVlZERpYWxJdGVtPlxuICAgICA8U3BlZWREaWFsSXRlbSBvbkNsaWNrPXsoKSA9PiBjb25zb2xlLmxvZygnc3BlZWQgQycpfT4gQyA8L1NwZWVkRGlhbEl0ZW0+XG4gICAgIDxTcGVlZERpYWxJdGVtIG9uQ2xpY2s9eygpID0+IGNvbnNvbGUubG9nKCdzcGVlZCBEJyl9PiBEIDwvU3BlZWREaWFsSXRlbT5cbiAgIDwvU3BlZWREaWFsPlxuICovXG5jb25zdCBTcGVlZERpYWxJdGVtID0gb25zQ3VzdG9tRWxlbWVudCgnb25zLXNwZWVkLWRpYWwtaXRlbScpO1xuXG5TcGVlZERpYWxJdGVtLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEBuYW1lIG1vZGlmaWVyXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGJ1dHRvbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgb25DbGlja1xuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jXG59O1xuXG5leHBvcnQgZGVmYXVsdCBTcGVlZERpYWxJdGVtO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyJztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5cbmNvbnN0IG5vdEF0dHJpYnV0ZXMgPSBbJ29uRGV2aWNlQmFja0J1dHRvbiddO1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtc3BsaXR0ZXJcbiAqIEBjYXRlZ29yeSBtZW51XG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL3NwbGl0dGVyXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl0gIEEgY29tcG9uZW50IHRoYXQgZW5hYmxlcyByZXNwb25zaXZlIGxheW91dCBieSBpbXBsZW1lbnRpbmcgYm90aCBhIHR3by1jb2x1bW4gbGF5b3V0IGFuZCBhIHNsaWRpbmcgbWVudSBsYXlvdXQuXG4gKlxuICogICAgSXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYXV0b21hdGljYWxseSBleHBhbmQgaW50byBhIGNvbHVtbiBsYXlvdXQgb24gbGFyZ2Ugc2NyZWVucyBhbmQgY29sbGFwc2UgdGhlIG1lbnUgb24gc21hbGxlciBzY3JlZW5zLiBXaGVuIHRoZSBtZW51IGlzIGNvbGxhcHNlZCB0aGUgdXNlciBjYW4gb3BlbiBpdCBieSBzd2lwaW5nLlxuIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gIDxTcGxpdHRlcj5cbiAgICA8U3BsaXR0ZXJTaWRlXG4gICAgICBzaWRlPVwibGVmdFwiXG4gICAgICB3aWR0aD17MjAwfVxuICAgICAgaXNTd2lwZWFibGU9e3RydWV9PlxuICAgICAgPFBhZ2U+IFBhZ2UgTGVmdCA8L1BhZ2U+XG4gICAgPC9TcGxpdHRlclNpZGU+XG4gICAgPFNwbGl0dGVyQ29udGVudD5cbiAgICAgIDxQYWdlPiBQYWdlIENvbnRlbnQgPC9QYWdlPlxuICAgIDwvU3BsaXR0ZXJDb250ZW50PlxuICAgIDxTcGxpdHRlclNpZGVcbiAgICAgIHNpZGU9XCJyaWdodFwiXG4gICAgICB3aWR0aD17MzAwfVxuICAgICAgY29sbGFwc2U9eyF0aGlzLnN0YXRlLnNob3dSaWdodH1cbiAgICAgIGlzT3Blbj17dGhpcy5zdGF0ZS5vcGVuUmlnaHR9XG4gICAgICBvbkNsb3NlPXt0aGlzLmhhbmRsZVJpZ2h0Q2xvc2UuYmluZCh0aGlzKX1cbiAgICAgIG9uT3Blbj17dGhpcy5oYW5kbGVSaWdodE9wZW4uYmluZCh0aGlzKX1cbiAgICAgIGlzU3dpcGVhYmxlPXt0cnVlfT5cbiAgICAgIDxQYWdlPiBQYWdlIFJpZ2h0IDwvUGFnZT5cbiAgICA8L1NwbGl0dGVyU2lkZT5cbiAgPC9TcGxpdHRlcj5cbiAqL1xuY29uc3QgU3BsaXR0ZXIgPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtc3BsaXR0ZXInLCB7bm90QXR0cmlidXRlc30pO1xuXG5TcGxpdHRlci5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSBvbkRldmljZUJhY2tCdXR0b25cbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgQ3VzdG9tIGhhbmRsZXIgZm9yIGRldmljZSBiYWNrIGJ1dHRvbi5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uRGV2aWNlQmFja0J1dHRvbjogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNwbGl0dGVyO1xuIiwiaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtc3BsaXR0ZXItY29udGVudCc7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtc3BsaXR0ZXItY29udGVudFxuICogQGNhdGVnb3J5IG1lbnVcbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2Uvc3BsaXR0ZXJcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXSAgVGhlIFNwbGl0dGVyQ29udGVudCAgZWxlbWVudCBpcyB1c2VkIGFzIGEgY2hpbGQgZWxlbWVudCBvZiBTcGxpdHRlci5cbiAqICAgIEl0IGNvbnRhaW5zIHRoZSBtYWluIGNvbnRlbnQgb2YgdGhlIHBhZ2Ugd2hpbGUgU3BsaXR0ZXJTaWRlIGNvbnRhaW5zIHRoZSBsaXN0LlxuIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gIDxTcGxpdHRlcj5cbiAgICA8U3BsaXR0ZXJTaWRlXG4gICAgICBzaWRlPVwibGVmdFwiXG4gICAgICB3aWR0aD17MjAwfVxuICAgICAgaXNTd2lwZWFibGU9e3RydWV9PlxuICAgICAgPFBhZ2U+IFBhZ2UgTGVmdCA8L1BhZ2U+XG4gICAgPC9TcGxpdHRlclNpZGU+XG4gICAgPFNwbGl0dGVyQ29udGVudD5cbiAgICAgIDxQYWdlPiBQYWdlIENvbnRlbnQgPC9QYWdlPlxuICAgIDwvU3BsaXR0ZXJDb250ZW50PlxuICAgIDxTcGxpdHRlclNpZGVcbiAgICAgIHNpZGU9XCJyaWdodFwiXG4gICAgICB3aWR0aD17MzAwfVxuICAgICAgY29sbGFwc2U9eyF0aGlzLnN0YXRlLnNob3dSaWdodH1cbiAgICAgIGlzT3Blbj17dGhpcy5zdGF0ZS5vcGVuUmlnaHR9XG4gICAgICBvbkNsb3NlPXt0aGlzLmhhbmRsZVJpZ2h0Q2xvc2UuYmluZCh0aGlzKX1cbiAgICAgIG9uT3Blbj17dGhpcy5oYW5kbGVSaWdodE9wZW4uYmluZCh0aGlzKX1cbiAgICAgIGlzU3dpcGVhYmxlPXt0cnVlfT5cbiAgICAgIDxQYWdlPiBQYWdlIFJpZ2h0IDwvUGFnZT5cbiAgICA8L1NwbGl0dGVyU2lkZT5cbiAgPC9TcGxpdHRlcj5cbiAqL1xuY29uc3QgU3BsaXR0ZXJDb250ZW50ID0gb25zQ3VzdG9tRWxlbWVudCgnb25zLXNwbGl0dGVyLWNvbnRlbnQnKTtcblxuZXhwb3J0IGRlZmF1bHQgU3BsaXR0ZXJDb250ZW50O1xuIiwiaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtc3BsaXR0ZXItbWFzayc7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtc3BsaXR0ZXItbWFza1xuICogQGNhdGVnb3J5IG1lbnVcbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2Uvc3BsaXR0ZXJcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXSAgVGhlIFNwbGl0dGVyTWFzayAgZWxlbWVudCBpcyB1c2VkIGFzIGEgY2hpbGQgZWxlbWVudCBvZiBTcGxpdHRlci5cbiAqICAgIEl0IGNvbnRhaW5zIHRoZSBtYXNrIGNvbnRlbnQgb2YgdGhlIHBhZ2UuXG4gWy9lbl1cbiAqIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAgPFNwbGl0dGVyPlxuICAgIDxTcGxpdHRlclNpZGVcbiAgICAgIHNpZGU9XCJsZWZ0XCJcbiAgICAgIHdpZHRoPXsyMDB9XG4gICAgICBpc1N3aXBlYWJsZT17dHJ1ZX0+XG4gICAgICA8UGFnZT4gUGFnZSBMZWZ0IDwvUGFnZT5cbiAgICA8L1NwbGl0dGVyU2lkZT5cbiAgICA8U3BsaXR0ZXJNYXNrPlxuICAgICAgPFBhZ2U+IFBhZ2UgQ29udGVudCA8L1BhZ2U+XG4gICAgPC9TcGxpdHRlck1hc2s+XG4gICAgPFNwbGl0dGVyU2lkZVxuICAgICAgc2lkZT1cInJpZ2h0XCJcbiAgICAgIHdpZHRoPXszMDB9XG4gICAgICBjb2xsYXBzZT17IXRoaXMuc3RhdGUuc2hvd1JpZ2h0fVxuICAgICAgaXNPcGVuPXt0aGlzLnN0YXRlLm9wZW5SaWdodH1cbiAgICAgIG9uQ2xvc2U9e3RoaXMuaGFuZGxlUmlnaHRDbG9zZS5iaW5kKHRoaXMpfVxuICAgICAgb25PcGVuPXt0aGlzLmhhbmRsZVJpZ2h0T3Blbi5iaW5kKHRoaXMpfVxuICAgICAgaXNTd2lwZWFibGU9e3RydWV9PlxuICAgICAgPFBhZ2U+IFBhZ2UgUmlnaHQgPC9QYWdlPlxuICAgIDwvU3BsaXR0ZXJTaWRlPlxuICA8L1NwbGl0dGVyPlxuICovXG5jb25zdCBTcGxpdHRlck1hc2sgPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtc3BsaXR0ZXItbWFzaycpO1xuXG5leHBvcnQgZGVmYXVsdCBTcGxpdHRlck1hc2s7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyLXNpZGUnO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuY29uc3QgZGVwcmVjYXRlZCA9IHtcbiAgb25PcGVuOiAnb25Qb3N0T3BlbicsXG4gIG9uQ2xvc2U6ICdvblBvc3RDbG9zZSdcbn07XG5jb25zdCBub3RBdHRyaWJ1dGVzID0gWydpc09wZW4nXTtcblxuY29uc3QgRWxlbWVudCA9IG9uc0N1c3RvbUVsZW1lbnQoJ29ucy1zcGxpdHRlci1zaWRlJywge2RlcHJlY2F0ZWQsIG5vdEF0dHJpYnV0ZXN9KTtcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLXNwbGl0dGVyLXNpZGVcbiAqIEBjYXRlZ29yeSBtZW51XG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL3NwbGl0dGVyXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl0gIFRoZSBTcGxpdHRlckNvbnRlbnQgIGVsZW1lbnQgaXMgdXNlZCBhcyBhIGNoaWxkIGVsZW1lbnQgb2YgU3BsaXR0ZXIuXG4gKiAgICBJdCBjb250YWlucyB0aGUgbWFpbiBjb250ZW50IG9mIHRoZSBwYWdlIHdoaWxlIFNwbGl0dGVyU2lkZSBjb250YWlucyB0aGUgbGlzdC5cbiBbL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICA8U3BsaXR0ZXI+XG4gICAgPFNwbGl0dGVyU2lkZVxuICAgICAgc2lkZT1cImxlZnRcIlxuICAgICAgd2lkdGg9ezIwMH1cbiAgICAgIHN3aXBlYWJsZT17dHJ1ZX0+XG4gICAgICA8UGFnZT4gUGFnZSBMZWZ0IDwvUGFnZT5cbiAgICA8L1NwbGl0dGVyU2lkZT5cbiAgICA8U3BsaXR0ZXJDb250ZW50PlxuICAgICAgPFBhZ2U+IFBhZ2UgQ29udGVudCA8L1BhZ2U+XG4gICAgPC9TcGxpdHRlckNvbnRlbnQ+XG4gICAgPFNwbGl0dGVyU2lkZVxuICAgICAgc2lkZT1cInJpZ2h0XCJcbiAgICAgIHdpZHRoPXszMDB9XG4gICAgICBjb2xsYXBzZT17IXRoaXMuc3RhdGUuc2hvd1JpZ2h0fVxuICAgICAgaXNPcGVuPXt0aGlzLnN0YXRlLm9wZW5SaWdodH1cbiAgICAgIG9uQ2xvc2U9e3RoaXMuaGFuZGxlUmlnaHRDbG9zZS5iaW5kKHRoaXMpfVxuICAgICAgb25PcGVuPXt0aGlzLmhhbmRsZVJpZ2h0T3Blbi5iaW5kKHRoaXMpfVxuICAgICAgc3dpcGVhYmxlPXt0cnVlfT5cbiAgICAgIDxQYWdlPiBQYWdlIFJpZ2h0IDwvUGFnZT5cbiAgICA8L1NwbGl0dGVyU2lkZT5cbiAgPC9TcGxpdHRlcj5cbiAqL1xuY29uc3QgU3BsaXR0ZXJTaWRlID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7d2lkdGgsIC4uLnJlc3R9ID0gcHJvcHM7XG5cbiAgLy8gbnVtYmVyIHZhbHVlcyBmb3Igd2lkdGggYXJlIGRlcHJlY2F0ZWQgYnV0IGhhbmRsZSB0aGVtIHNhZmVseSB0byBhdm9pZCBicmVha2luZyB1c2VyIGNvZGVcbiAgY29uc3QgcmVhbFdpZHRoID0gdHlwZW9mIHdpZHRoID09PSAnbnVtYmVyJyA/IGAke3dpZHRofXB4YCA6IHdpZHRoO1xuXG4gIHJldHVybiAoXG4gICAgPEVsZW1lbnRcbiAgICAgIHdpZHRoPXtyZWFsV2lkdGh9XG4gICAgICByZWY9e3JlZn1cbiAgICAgIHsuLi5yZXN0fVxuICAgID5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L0VsZW1lbnQ+XG4gICk7XG59KTtcblxuU3BsaXR0ZXJTaWRlLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEBuYW1lIGNvbGxhcHNlXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gU3BlY2lmeSB0aGUgY29sbGFwc2UgYmVoYXZpb3IuIFZhbGlkIHZhbHVlcyBhcmUgYFwicG9ydHJhaXRcImAsIGBcImxhbmRzY2FwZVwiYCBvciBhIG1lZGlhIHF1ZXJ5LlxuICAgKiAgICAgVGhlIHN0cmluZ3MgYFwicG9ydHJhaXRcImAgYW5kIGBcImxhbmRzY2FwZVwiYCBtZWFucyB0aGUgdmlldyB3aWxsIGNvbGxhcHNlIHdoZW4gZGV2aWNlIGlzIGluIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbi5cbiAgICogICAgIElmIHRoZSB2YWx1ZSBpcyBub3QgZGVmaW5lZCwgdGhlIHZpZXcgYWx3YXlzIGJlIGluIGBcImNvbGxhcHNlXCJgIG1vZGUuXG5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBjb2xsYXBzZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKipcbiAgICogQG5hbWUgc3dpcGVhYmxlXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dRW5uYWJsZSBzd2lwZSBpbnRlcmFjdGlvbiBvbiBjb2xsYXBzZSBtb2RlLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHN3aXBlYWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGlzT3BlblxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZmllcyB3aGV0aGVyIHRoZSBtZW51IGlzIG9wZW4uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgaXNPcGVuOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgb25Qb3N0T3BlblxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DYWxsZWQgYWZ0ZXIgdGhlIG1lbnUgaXMgb3BlbmVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUG9zdE9wZW46IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbk9wZW5cbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dREVQUkVDQVRFRCEgVXNlIGBvblBvc3RPcGVuYCBpbnN0ZWFkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uT3BlbjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUG9zdENsb3NlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCBhZnRlciB0aGUgbWVudSBpcyBjbG9zZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25Qb3N0Q2xvc2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbkNsb3NlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXURFUFJFQ0FURUQhIFVzZSBgb25Qb3N0Q2xvc2VgIGluc3RlYWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25DbG9zZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIHNpZGVcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgd2hpY2ggc2lkZSBvZiB0aGUgc2NyZWVuIHRoZSBTcGxpdHRlclNpZGUgZWxlbWVudCBpcyBsb2NhdGVkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGBcImxlZnRcImAgYW5kIGBcInJpZ2h0XCJgLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHNpZGU6IFByb3BUeXBlcy5vbmVPZihbJ2xlZnQnLCAncmlnaHQnXSksXG5cbiAgLyoqXG4gICAqIEBuYW1lIHN3aXBlVGFyZ2V0V2lkdGhcbiAgICogQHR5cGUgbnVtYmVyXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSB3aWR0aCBvZiBzd2lwZWFibGUgYXJlYSBjYWxjdWxhdGVkIGZyb20gdGhlIGVkZ2UgKGluIHBpeGVscykuIFVzZSB0aGlzIHRvIGVuYWJsZSBzd2lwZSBvbmx5IHdoZW4gdGhlIGZpbmdlciB0b3VjaCBvbiB0aGUgc2NyZWVuIGVkZ2UuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgc3dpcGVUYXJnZXRXaWR0aDogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogQG5hbWUgd2lkdGhcbiAgICogQHR5cGUgIG51bWJlclxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBtZW51LiBDYW4gYmUgc3BlY2lmaWVkIGluIGVpdGhlciBwaXhlbHMgb3IgYXMgYSBwZXJjZW50YWdlLCBlLmcuIGBcIjkwJVwiYCBvciBgXCIyMDBweFwiYC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICB3aWR0aDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uLiBVc2Ugb25lIG9mIGBvdmVybGF5YCwgYHB1c2hgLCBgcmV2ZWFsYCwgb3IgYGRlZmF1bHRgLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGFuaW1hdGlvbjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSBvYmplY3RcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuICBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgYW5pbWF0aW9uT3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQG5hbWUgb3BlblRocmVzaG9sZFxuICAgKiBAdHlwZSBvYmplY3RcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBTcGVjaWZ5IGhvdyBtdWNoIHRoZSBtZW51IG5lZWRzIHRvIGJlIHN3aXBlZCBiZWZvcmUgb3BlbmluZy4gQSB2YWx1ZSBiZXR3ZWVuIGAwYCBhbmQgYDFgLiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb3BlblRocmVzaG9sZDogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogQG5hbWUgb25QcmVPcGVuXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gQ2FsbGVkIGJlZm9yZSB0aGUgbWVudSBvcGVucy4gIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUHJlT3BlbjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUHJlQ2xvc2VcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBDYWxsZWQgYmVmb3JlIHRoZSBtZW51IGNsb3Nlcy4gIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUHJlQ2xvc2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvbk1vZGVDaGFuZ2VcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBDYWxsZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCdzIG1vZGUgY2hhbmdlcy4gWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25Nb2RlQ2hhbmdlOiBQcm9wVHlwZXMuZnVuY1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU3BsaXR0ZXJTaWRlO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLXN3aXRjaCc7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuaW1wb3J0IG9uZVRpbWVQcm9wIGZyb20gJy4uL29uZVRpbWVQcm9wJztcbmltcG9ydCBJTlBVVF9QUk9QUyBmcm9tICcuLi9pbnB1dFByb3BzJztcblxuY29uc3QgbmFtZU1hcCA9IHtcbiAgLi4uSU5QVVRfUFJPUFNcbn07XG5cbmNvbnN0IHdpdGhEZWZhdWx0Q2hlY2tlZCA9IGNvbXBvbmVudCA9PiBvbmVUaW1lUHJvcChjb21wb25lbnQsICdkZWZhdWx0Q2hlY2tlZCcsICdjaGVja2VkJyk7XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy1zd2l0Y2hcbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAdHV0b3JpYWwgcmVhY3QvUmVmZXJlbmNlL3N3aXRjaFxuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dICAgU3dpdGNoIGNvbXBvbmVudC4gVGhlIHN3aXRjaCBjYW4gYmUgdG9nZ2xlZCBib3RoIGJ5IGRyYWdnaW5nIGFuZCB0YXBwaW5nLlxuICogICAgIFdpbGwgYXV0b21hdGljYWxseSBkaXNwbGF5cyBhIE1hdGVyaWFsIERlc2lnbiBzd2l0Y2ggb24gQW5kcm9pZCBkZXZpY2VzLlxuIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8U3dpdGNoIGNoZWNrZWQ9e3RoaXMuc3RhdGUuY2hlY2tlZH0gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2V9IC8+XG4gKi9cbmNvbnN0IFN3aXRjaCA9IHdpdGhEZWZhdWx0Q2hlY2tlZChvbnNDdXN0b21FbGVtZW50KCdvbnMtc3dpdGNoJywge2RlcHJlY2F0ZWQ6IG5hbWVNYXB9KSk7XG5cblN3aXRjaC5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAbmFtZSBtb2RpZmllclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBjaGVja2JveC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgb25DaGFuZ2VcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dIENhbGxlZCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgc3dpdGNoIGNoYW5nZXMgKGNoZWNrZWQvdW5jaGVja2VkKSBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGNoZWNrZWRcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gV2hldGhlciB0aGUgc3dpdGNoIGlzIGNoZWNrZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgY2hlY2tlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGRlZmF1bHRDaGVja2VkXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dRGVmaW5lZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaCBhdCBmaXJzdCByZW5kZXIgZm9yIHVuY29udHJvbGxlZCBpbnB1dHMuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZGVmYXVsdENoZWNrZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkaXNhYmxlZFxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXSBJZiBzZXQsIHRoZSBzd2l0Y2ggaXMgZGlzYWJsZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBpbnB1dElkXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gU3BlY2lmeSB0aGUgYGlkYCBhdHRyaWJ1dGUgb2YgdGhlIGlubmVyIGA8aW5wdXQ+YCBlbGVtZW50LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIGA8bGFiZWwgZm9yPVwiLi4uXCI+YCBlbGVtZW50cy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBpbnB1dElkOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5leHBvcnQgZGVmYXVsdCBTd2l0Y2g7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtdGFiJztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy10YWJcbiAqIEBjYXRlZ29yeSB0YWJiYXJcbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2UvdGFiYmFyXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl0gUmVwcmVzZW50cyBhIHRhYiBpbnNpZGUgdGFiIGJhci5cbiBbL2VuXVxuICogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPFRhcD5cbiAqICAgSG9tZVxuICogPC9UYXA+XG4gKi9cbmNvbnN0IFRhYiA9IG9uc0N1c3RvbUVsZW1lbnQoJ29ucy10YWInKTtcblxuVGFiLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEBuYW1lIGljb25cbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBpY29uIG5hbWUgZm9yIHRoZSB0YWIuIENhbiBzcGVjaWZ5IHRoZSBzYW1lIGljb24gbmFtZSBhcyA8b25zLWljb24+LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGljb246IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGFjdGl2ZUljb25cbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBuYW1lIG9mIHRoZSBpY29uIHdoZW4gdGhlIHRhYiBpcyBhY3RpdmUuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgYWN0aXZlSWNvbjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgbGFiZWxcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBsYWJlbCBvZiB0aGUgdGFiIGl0ZW0uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGJhZGdlXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1EaXNwbGF5IGEgbm90aWZpY2F0aW9uIGJhZGdlIG9uIHRvcCBvZiB0aGUgdGFiLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGJhZGdlOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5leHBvcnQgZGVmYXVsdCBUYWI7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLXRhYmJhcic7XG5cbmltcG9ydCBvbnNDdXN0b21FbGVtZW50IGZyb20gJy4uL29uc0N1c3RvbUVsZW1lbnQnO1xuXG5jb25zdCBkZXByZWNhdGVkID0ge1xuICBpbmRleDogJ2FjdGl2ZUluZGV4J1xufTtcbmNvbnN0IEVsZW1lbnQgPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtdGFiYmFyJywge2RlcHJlY2F0ZWR9KTtcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLXRhYmJhclxuICogQGNhdGVnb3J5IHRhYmJhclxuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS90YWJiYXJcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXSBDb21wb25lbnQgdG8gZGlzcGxheSBhIHRhYmJhciBvbiBlaXRoZXIgdGhlIHRvcCBvciB0aGUgYm90dG9tIG9mIGEgcGFnZS5cbiAqIFRvIGRlZmluZSB0aGUgdGFicyBhbmQgdGhlIGNvbnRlbnQgdGhlIHByb3BlcnR5IHJlbmRlclRhYnMgbmVlZCB0byBiZSBpbXBsZW1lbnRlZCwgdGhhdCByZXR1cm5zIGFuIGFycmF5IG9mIHRhYnMgYW5kIHRoZWlyIGNvbnRlbnQuIFNlZSB0aGUgZXhhbXBsZSBmb3Igc3BlY2lmaWNzLiBbL2VuXSogW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuXG4gIDxQYWdlPlxuICAgIDxUYWJiYXJcbiAgICAgIG9uUHJlQ2hhbmdlPXsoe2luZGV4fSkgPT4gdGhpcy5zZXRTdGF0ZShpbmRleCl9XG4gICAgICBvblBvc3RDaGFuZ2U9eygpID0+IGNvbnNvbGUubG9nKCdwb3N0Q2hhbmdlJyl9XG4gICAgICBvblJlYWN0aXZlPXsoKSA9PiBjb25zb2xlLmxvZygncG9zdENoYW5nZScpfVxuICAgICAgcG9zaXRpb249J2JvdHRvbSdcbiAgICAgIGluZGV4PXt0aGlzLnN0YXRlLmluZGV4fVxuICAgICAgcmVuZGVyVGFicz17KGFjdGl2ZUluZGV4LCB0YWJiYXIpID0+IFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IDxUYWJQYWdlIHRpdGxlPVwiSG9tZVwiIGFjdGl2ZT17YWN0aXZlSW5kZXggPT09IDB9IHRhYmJhcj17dGFiYmFyfSAvPixcbiAgICAgICAgICB0YWI6IDxUYWIgbGFiZWw9XCJIb21lXCIgaWNvbj1cIm1kLWhvbWVcIiAvPlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogPFRhYlBhZ2UgdGl0bGU9XCJTZXR0aW5nc1wiIGFjdGl2ZT17YWN0aXZlSW5kZXggPT09IDF9IHRhYmJhcj17dGFiYmFyfSAvPixcbiAgICAgICAgICB0YWI6IDxUYWIgbGFiZWw9XCJTZXR0aW5nc1wiIGljb249XCJtZC1zZXR0aW5nc1wiIC8+XG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgLz5cbiAgPC9QYWdlPlxuICovXG5jb25zdCBUYWJiYXIgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHt2aXNpYmxlLCBoaWRlVGFicywgcmVuZGVyVGFicywgLi4ucmVzdH0gPSBwcm9wcztcblxuICBjb25zdCB0YWJzID0gcmVuZGVyVGFicyhwcm9wcy5hY3RpdmVJbmRleCwgcmVmKTtcblxuICAvLyB2aXNpYmxlIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGhpZGVUYWJzLCBidXQgaWYgdmlzaWJsZSBpcyBkZWZpbmVkIGFuZFxuICAvLyBoaWRlVGFicyBpcyBub3QsIHdlIHVzZSBpdHMgbmVnYXRpb24gYXMgdGhlIHZhbHVlIG9mIGhpZGVUYWJzXG4gIGxldCByZWFsbHlIaWRlVGFicztcbiAgaWYgKGhpZGVUYWJzID09PSB1bmRlZmluZWQgJiYgdmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVhbGx5SGlkZVRhYnMgPSAhdmlzaWJsZTtcbiAgfSBlbHNlIHtcbiAgICByZWFsbHlIaWRlVGFicyA9IGhpZGVUYWJzO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8RWxlbWVudFxuICAgICAgaGlkZVRhYnM9e3JlYWxseUhpZGVUYWJzfVxuICAgICAgey4uLnJlc3R9XG5cbiAgICAgIHJlZj17cmVmfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPSd0YWJiYXJfX2NvbnRlbnQnPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIHt0YWJzLm1hcCh0YWIgPT4gdGFiLmNvbnRlbnQpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9J3RhYmJhcic+XG4gICAgICAgIHt0YWJzLm1hcCh0YWIgPT4gdGFiLnRhYil9XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSd0YWJiYXJfX2JvcmRlcic+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L0VsZW1lbnQ+XG4gICk7XG59KTtcblxuVGFiYmFyLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEBuYW1lIGFjdGl2ZUluZGV4XG4gICAqIEB0eXBlIG51bWJlclxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgaW5kZXggb2YgdGhlIHRhYiB0byBoaWdobGlnaHQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgYWN0aXZlSW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGluZGV4XG4gICAqIEB0eXBlIG51bWJlclxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1ERVBSRUNBVEVEISBVc2UgYGFjdGl2ZUluZGV4YCBpbnN0ZWFkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBAbmFtZSByZW5kZXJUYWJzXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggdGhlIGtleXMgYGNvbnRlbnRgIGFuZCBgdGFiYC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICByZW5kZXJUYWJzOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBwb3NpdGlvblxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGFiYmFyJ3MgcG9zaXRpb24uIEF2YWlsYWJsZSB2YWx1ZXMgYXJlIGBcImJvdHRvbVwiYCBhbmQgYFwidG9wXCJgLiBVc2UgYFwiYXV0b1wiYCB0byBjaG9vc2UgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBsYXRmb3JtIChpT1MgYm90dG9tLCBBbmRyb2lkIHRvcCkuIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHBvc2l0aW9uOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBzd2lwZWFibGVcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1FbmFibGUgc3dpcGUgaW50ZXJhY3Rpb24uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgc3dpcGVhYmxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgaWdub3JlRWRnZVdpZHRoXG4gICAqIEB0eXBlIG51bWJlclxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1EaXN0YW5jZSBpbiBwaXhlbHMgZnJvbSBib3RoIGVkZ2VzLiBTd2lwaW5nIG9uIHRoZXNlIGFyZWFzIHdpbGwgcHJpb3JpdGl6ZSBwYXJlbnQgY29tcG9uZW50cyBzdWNoIGFzIGBTcGxpdHRlcmAgb3IgYE5hdmlnYXRvcmAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgaWdub3JlRWRnZVdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBhbmltYXRpb25cbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBgXCJub25lXCJgIHRoZSB0cmFuc2l0aW9ucyB3aWxsIG5vdCBiZSBhbmltYXRlZC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBhbmltYXRpb246IFByb3BUeXBlcy5vbmVPZihbJ25vbmUnLCAnc2xpZGUnXSksXG5cbiAgLyoqXG4gICAqIEBuYW1lIGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUgb2JqZWN0XG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgYW5pbWF0aW9uT3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQG5hbWUgdGFiQm9yZGVyXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdHJ1ZSwgdGhlIHRhYnMgc2hvdyBhIGR5bmFtaWMgYm90dG9tIGJvcmRlci4gT25seSB3b3JrcyBmb3IgaU9TIHNpbmNlIHRoZSBib3JkZXIgaXMgYWx3YXlzIHZpc2libGUgaW4gTWF0ZXJpYWwgRGVzaWduLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHRhYkJvcmRlcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUHJlQ2hhbmdlXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgdGFiIGlzIGNoYW5nZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25QcmVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBvblBvc3RDaGFuZ2VcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIGp1c3QgYWZ0ZXIgdGhlIHRhYiBpcyBjaGFuZ2VkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uUG9zdENoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUmVhY3RpdmVcbiAgICogQHR5cGUgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIGlmIHRoZSBhbHJlYWR5IG9wZW4gdGFiIGlzIHRhcHBlZCBhZ2Fpbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblJlYWN0aXZlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25Td2lwZVxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Ib29rIGNhbGxlZCB3aGVuZXZlciB0aGUgdXNlciBzbGlkZXMgdGhlIHRhYmJhci4gSXQgZ2V0cyBhIGRlY2ltYWwgaW5kZXggYW5kIGFuIGFuaW1hdGlvbk9wdGlvbnMgb2JqZWN0IGFzIGFyZ3VtZW50cy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblN3aXBlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgdmlzaWJsZVxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRydWUsIHRoZSB0YWJiYXIgaXMgbm90IHNob3duIG9uIHRoZSBzY3JlZW4uIE90aGVyd2lzZSwgdGhlIHRhYmJhciBpcyBzaG93bi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBoaWRlVGFiczogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIHZpc2libGVcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1ERVBSRUNBVEVEISBVc2UgYGhpZGVUYWJzYCBpbnN0ZWFkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBtb2RpZmllclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHRhYmJhci5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgVGFiYmFyO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLXRvYXN0JztcblxuaW1wb3J0IG9uc0N1c3RvbUVsZW1lbnQgZnJvbSAnLi4vb25zQ3VzdG9tRWxlbWVudCc7XG5pbXBvcnQgYmFzZURpYWxvZyBmcm9tICcuLi9iYXNlRGlhbG9nJztcblxuY29uc3QgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgdmlzaWJsZVxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRvYXN0IG9wZW4gYW5kIHNob3duLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgdmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBuYW1lIGlzT3BlblxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgREVQUkVDQVRFRCEgVXNlIGB2aXNpYmxlYCBpbnN0ZWFkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgaXNPcGVuOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJkZWZhdWx0XCJgLCBgXCJhc2NlbmRcImAgKEFuZHJvaWQpLCBgXCJsaWZ0XCJgIChpT1MpLCBgXCJmYWxsXCJgLCBgXCJmYWRlXCJgIG9yIGBcIm5vbmVcImAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgYW5pbWF0aW9uOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBtb2RpZmllclxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSB0b2FzdC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSBvYmplY3RcbiAgICogQHJlcXVpcmVkIGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuICBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgYW5pbWF0aW9uT3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQG5hbWUgb25QcmVTaG93XG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIENhbGxlZCBqdXN0IGJlZm9yZSB0aGUgdG9hc3QgaXMgZGlzcGxheWVkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25QcmVTaG93OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25Qb3N0U2hvd1xuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICBDYWxsZWQganVzdCBhZnRlciB0aGUgdG9hc3QgaXMgZGlzcGxheWVkLlxuICAgKiAgWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25Qb3N0U2hvdzogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBuYW1lIG9uUHJlSGlkZVxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIGp1c3QgYmVmb3JlIHRoZSB0b2FzdCBpcyBoaWRkZW4uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgb25QcmVIaWRlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25Qb3N0SGlkZVxuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAcmVxdWlyZWQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ2FsbGVkIGp1c3QgYWZ0ZXIgdGhlIHRvYXN0IGlzIGhpZGRlbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvblBvc3RIaWRlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQG5hbWUgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1cbiAgICogIEN1c3RvbSBoYW5kbGVyIGZvciBkZXZpY2UgYmFjayBidXR0b24uXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBvbkRldmljZUJhY2tCdXR0b246IFByb3BUeXBlcy5mdW5jXG59O1xuXG5jb25zdCBkZXByZWNhdGVkID0ge1xuICBpc09wZW46ICd2aXNpYmxlJ1xufTtcblxuY29uc3Qgbm90QXR0cmlidXRlcyA9IFsnb25EZXZpY2VCYWNrQnV0dG9uJ107XG5cbi8qKlxuICogQG9yaWdpbmFsIG9ucy10b2FzdFxuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS90b2FzdFxuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dXG4gKiAgVGhlIFRvYXN0IG9yIFNuYWNrYmFyIGNvbXBvbmVudCBpcyB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgZGlzbWlzc2FibGUgaW5mb3JtYXRpb24gb3Igc2ltcGxlIGFjdGlvbnMgYXQgKG5vcm1hbGx5KSB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLlxuICpcbiAqICBUaGlzIGNvbXBvbmVudCBkb2VzIG5vdCBibG9jayB1c2VyIGlucHV0LCBhbGxvd2luZyB0aGUgYXBwIHRvIGNvbnRpbnVlIGl0cyBmbG93LiBGdXJ0aGVybW9yZSwgaXQgY2FuIGJlIGF1dG9tYXRpY2FsbHkgaGlkZGVuIGFmdGVyIGEgdGltZW91dC5cbiAqIFsvZW5dXG4gKiBbamFdWy9qYV1cbiAqL1xuY29uc3QgVG9hc3QgPSBvbnNDdXN0b21FbGVtZW50KGJhc2VEaWFsb2coJ29ucy10b2FzdCcpLCB7cHJvcFR5cGVzLCBkZXByZWNhdGVkLCBub3RBdHRyaWJ1dGVzfSk7XG5Ub2FzdC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cbmV4cG9ydCBkZWZhdWx0IFRvYXN0O1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnb25zZW51aS9lc20vZWxlbWVudHMvb25zLXRvb2xiYXInO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuY29uc3Qgbm90QXR0cmlidXRlcyA9IFsndmlzaWJsZSddO1xuXG4vKipcbiAqIEBvcmlnaW5hbCBvbnMtdG9vbGJhclxuICogQGNhdGVnb3J5IHBhZ2VcbiAqIEB0dXRvcmlhbCByZWFjdC9SZWZlcmVuY2UvdG9vbGJhclxuICogQGRlc2NyaXB0aW9uXG4gKiBbZW5dVG9vbGJhciBjb21wb25lbnQgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIG5hdmlnYXRpb24uIExlZnQsIGNlbnRlciBhbmQgcmlnaHQgY29udGFpbmVyIGNhbiBiZSBzcGVjaWZpZWQgYnkgY2xhc3MgbmFtZXMuIFRoaXMgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSBkaXNwbGF5cyBhcyBhIE1hdGVyaWFsIERlc2lnbiB0b29sYmFyIHdoZW4gcnVubmluZyBvbiBBbmRyb2lkIGRldmljZXMuWy9lbl1cbiAqIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqXG48UGFnZSByZW5kZXJUb29sYmFyPXsoKSA9PlxuICA8VG9vbGJhcj5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cImxlZnRcIj5cbiAgICAgIDxCYWNrQnV0dG9uPlxuICAgICAgICAgIEJhY2tcbiAgICAgIDwvQmFja0J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cImNlbnRlclwiPlxuICAgICAgVGl0bGVcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJpZ2h0XCI+XG4gICAgICA8VG9vbGJhckJ1dHRvbj5cbiAgICAgICAgPEljb24gaWNvbj1cIm1kLW1lbnVcIiAvPlxuICAgICAgPC9Ub29sYmFyQnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L1Rvb2xiYXI+IH1cbi8+XG4gKi9cbmNvbnN0IFRvb2xiYXIgPSBvbnNDdXN0b21FbGVtZW50KCdvbnMtdG9vbGJhcicsIHtub3RBdHRyaWJ1dGVzfSk7XG5cblRvb2xiYXIucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgU3BlY2lmeSBtb2RpZmllciBuYW1lIHRvIHNwZWNpZnkgY3VzdG9tIHN0eWxlcy4gT3B0aW9uYWwuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBtb2RpZmllcjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgdmlzaWJsZVxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRydWUsIHRoZSB0b29sYmFyIGlzIHNob3duIG9uIHRoZSBzY3JlZW4uIE90aGVyd2lzZSwgdGhlIHRvb2xiYXIgaXMgbm90IHNob3duLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBzdGF0aWNcbiAgICogQHR5cGUgYm9vbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3RhdGljIHRvb2xiYXJzIGFyZSBub3QgYW5pbWF0ZWQgYnkgYG9ucy1uYXZpZ2F0b3JgIHdoZW4gcHVzaGluZyBvciBwb3BwaW5nIHBhZ2VzLiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBzb21lIHNpdHVhdGlvbnMuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgc3RhdGljOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgaW5saW5lXG4gICAqIEB0eXBlIGJvb2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXURpc3BsYXkgdGhlIHRvb2xiYXIgYXMgYW4gaW5saW5lIGVsZW1lbnQuWy9lbl1cbiAgICogICBbamFd44OE44O844Or44OQ44O844KS44Kk44Oz44Op44Kk44Oz44Gr572u44GN44G+44GZ44CC44K544Kv44Ot44O844Or6aCY5Z+f5YaF44Gr44Gd44Gu44G+44G+6KGo56S644GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGlubGluZTogUHJvcFR5cGVzLmJvb2xcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFRvb2xiYXI7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICdvbnNlbnVpL2VzbS9lbGVtZW50cy9vbnMtdG9vbGJhci1idXR0b24nO1xuXG5pbXBvcnQgb25zQ3VzdG9tRWxlbWVudCBmcm9tICcuLi9vbnNDdXN0b21FbGVtZW50JztcblxuLyoqXG4gKiBAb3JpZ2luYWwgb25zLXRvb2xiYXItYnV0dG9uXG4gKiBAY2F0ZWdvcnkgcGFnZVxuICogQHR1dG9yaWFsIHJlYWN0L1JlZmVyZW5jZS9wYWdlXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICBCdXR0b24gY29tcG9uZW50IGZvciB0aGUgVG9vbGJhci4gVXNpbmcgdGhpcyBjb21wb25lbnQgZ2l2ZXMgYSBuaWNlIGRlZmF1bHQgc3R5bGUuXG4gKlxuICpcbiAqICAgWy9lbl1cbiAqIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqIDxQYWdlXG4gICAgIHJlbmRlclRvb2xiYXIgPSB7ICgpID0+XG4gICAgICA8VG9vbGJhcj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2xlZnQnPjxCYWNrQnV0dG9uPkJhY2s8L0JhY2tCdXR0b24+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjZW50ZXInPklucHV0PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyaWdodCc+XG4gICAgICAgICAgPFRvb2xiYXJCdXR0b24gb25DbGljaz17dGhpcy5hZGR9ID5BZGQ8L1Rvb2xiYXJCdXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9Ub29sYmFyPlxuICAgICB9PlxuICAgICAgUGFnZSBDb250ZW50XG4gICAgPC9QYWdlPlxuICovXG5jb25zdCBUb29sYmFyQnV0dG9uID0gb25zQ3VzdG9tRWxlbWVudCgnb25zLXRvb2xiYXItYnV0dG9uJyk7XG5cblRvb2xiYXJCdXR0b24ucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQG5hbWUgbW9kaWZpZXJcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEByZXF1aXJlZCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgYnV0dG9uLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG1vZGlmaWVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAbmFtZSBkaXNhYmxlZFxuICAgKiBAdHlwZSBib29sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVxuICAgKiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZC5cbiAgICogIFsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQG5hbWUgaWNvblxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ3JlYXRlcyBhbiBgSWNvbmAgY29tcG9uZW50IHdpdGggdGhpcyBzdHJpbmcuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgaWNvbjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQG5hbWUgb25DbGlja1xuICAgKiBAdHlwZSBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jXG59O1xuXG5leHBvcnQgZGVmYXVsdCBUb29sYmFyQnV0dG9uO1xuIiwiLypcbiAqIHJvdXRlU3RhY2sgOiBbdXNlclJvdXRlLCB1c2VyUm91dGUyLCAuLi5dXG4gKiBwcm9jZXNzU3RhY2s6IFtcbiAqIHsgdHlwZTogcHVzaCB8IHBvcCB8IHJlc2V0LCByb3V0ZTogdXNlclJvdXRlIH0sXG4gKiB7IHR5cGU6IHB1c2ggfCBwb3AgfCByZXNldCwgcm91dGU6IHVzZXJSb3V0ZTIgfSxcbiAqIC4uLlxuICogXVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogKHJvdXRlcykgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICByb3V0ZVN0YWNrOiBbLi4ucm91dGVzXSxcbiAgICAgIHByb2Nlc3NTdGFjazogW11cbiAgICB9O1xuICB9LFxuXG4gIHJlcGxhY2U6ICh7cm91dGVDb25maWcsIHJvdXRlLCBvcHRpb25zLCBrZXl9KSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gey4uLnJvdXRlQ29uZmlnfTtcbiAgICBjb25zdCByb3V0ZVN0YWNrID0gWy4uLmNvbmZpZy5yb3V0ZVN0YWNrXTtcbiAgICBsZXQgcHJvY2Vzc1N0YWNrID0gWy4uLmNvbmZpZy5wcm9jZXNzU3RhY2tdO1xuXG4gICAgaWYgKGtleSA9PSBudWxsIHx8IHByb2Nlc3NTdGFjay5maWx0ZXIoKGVsKSA9PiBlbC5rZXkgPT09IGtleSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBwcm9jZXNzID0ge1xuICAgICAgICB0eXBlOiAncmVwbGFjZScsXG4gICAgICAgIHJvdXRlLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBrZXlcbiAgICAgIH07XG4gICAgICBwcm9jZXNzU3RhY2sgPSBbXG4gICAgICAgIC4uLnByb2Nlc3NTdGFjayxcbiAgICAgICAgcHJvY2Vzc1xuICAgICAgXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm91dGVTdGFjayxcbiAgICAgIHByb2Nlc3NTdGFja1xuICAgIH07XG4gIH0sXG5cbiAgcmVzZXQ6ICh7cm91dGVDb25maWcsIHJvdXRlLCBvcHRpb25zLCBrZXl9KSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gey4uLnJvdXRlQ29uZmlnfTtcbiAgICBjb25zdCByb3V0ZVN0YWNrID0gWy4uLmNvbmZpZy5yb3V0ZVN0YWNrXTtcbiAgICBsZXQgcHJvY2Vzc1N0YWNrID0gWy4uLmNvbmZpZy5wcm9jZXNzU3RhY2tdO1xuXG4gICAgaWYgKGtleSA9PSBudWxsIHx8IHByb2Nlc3NTdGFjay5maWx0ZXIoKGVsKSA9PiBlbC5rZXkgPT09IGtleSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBwcm9jZXNzID0ge1xuICAgICAgICB0eXBlOiAncmVzZXQnLFxuICAgICAgICByb3V0ZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAga2V5XG4gICAgICB9O1xuXG4gICAgICBwcm9jZXNzU3RhY2sgPSBbXG4gICAgICAgIC4uLnByb2Nlc3NTdGFjayxcbiAgICAgICAgcHJvY2Vzc1xuICAgICAgXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm91dGVTdGFjayxcbiAgICAgIHByb2Nlc3NTdGFja1xuICAgIH07XG4gIH0sXG5cbiAgcHVzaDogKHtyb3V0ZUNvbmZpZywgcm91dGUsIG9wdGlvbnMsIGtleX0pID0+IHtcbiAgICBjb25zdCBjb25maWcgPSB7Li4ucm91dGVDb25maWd9O1xuICAgIGNvbnN0IHJvdXRlU3RhY2sgPSBbLi4uY29uZmlnLnJvdXRlU3RhY2tdO1xuICAgIGxldCBwcm9jZXNzU3RhY2sgPSBbLi4uY29uZmlnLnByb2Nlc3NTdGFja107XG5cbiAgICBpZiAoa2V5ID09IG51bGwgfHwgY29uZmlnLnByb2Nlc3NTdGFjay5maWx0ZXIoKGVsKSA9PiBlbC5rZXkgPT09IGtleSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBwcm9jZXNzID0ge1xuICAgICAgICB0eXBlOiAncHVzaCcsXG4gICAgICAgIHJvdXRlLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBrZXlcbiAgICAgIH07XG5cbiAgICAgIHByb2Nlc3NTdGFjayA9IFtcbiAgICAgICAgLi4ucHJvY2Vzc1N0YWNrLFxuICAgICAgICBwcm9jZXNzXG4gICAgICBdO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByb3V0ZVN0YWNrLFxuICAgICAgcHJvY2Vzc1N0YWNrXG4gICAgfTtcbiAgfSxcblxuICBwb3A6ICh7cm91dGVDb25maWcsIG9wdGlvbnMsIGtleX0pID0+IHtcbiAgICBjb25zdCBjb25maWcgPSB7Li4ucm91dGVDb25maWd9O1xuICAgIGNvbnN0IHJvdXRlU3RhY2sgPSBbLi4uY29uZmlnLnJvdXRlU3RhY2tdO1xuICAgIGxldCBwcm9jZXNzU3RhY2sgPSBbLi4uY29uZmlnLnByb2Nlc3NTdGFja107XG5cbiAgICAvKipcbiAgICAgKiBTYWZlZ2F1cmQgdG8gZW5zdXJlIHRoYXQgbm90XG4gICAgICogdG9vIG1hbnkgcGFnZXMgYXJlIHBvcHBlZCBmcm9tXG4gICAgICogdGhlIHN0YWNrLlxuICAgICAqL1xuICAgIGNvbnN0IHBvcHMgPSBwcm9jZXNzU3RhY2tcbiAgICAgIC5maWx0ZXIoeCA9PiB4LnR5cGUgPT09ICdwb3AnKVxuICAgICAgLmxlbmd0aDtcblxuICAgIGlmIChwb3BzICsgMSA+PSByb3V0ZVN0YWNrLmxlbmd0aCkge1xuICAgICAgY29uc29sZS53YXJuKCdQYWdlIHN0YWNrIGlzIGFscmVhZHkgZW1wdHknKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvY2VzcyA9IHtcbiAgICAgIHR5cGU6ICdwb3AnLFxuICAgICAga2V5LFxuICAgICAgb3B0aW9uc1xuICAgIH07XG5cbiAgICBwcm9jZXNzU3RhY2sgPSBbXG4gICAgICAuLi5wcm9jZXNzU3RhY2ssXG4gICAgICBwcm9jZXNzXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICByb3V0ZVN0YWNrLFxuICAgICAgcHJvY2Vzc1N0YWNrXG4gICAgfTtcbiAgfSxcblxuICBwb3N0UHVzaDogKHJvdXRlQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gey4uLnJvdXRlQ29uZmlnfTtcbiAgICBsZXQgcm91dGVTdGFjayA9IFsuLi5jb25maWcucm91dGVTdGFja107XG4gICAgY29uc3QgcHJvY2Vzc1N0YWNrID0gWy4uLmNvbmZpZy5wcm9jZXNzU3RhY2tdO1xuXG4gICAgY29uc3QgbmV4dCA9IHByb2Nlc3NTdGFjay5zaGlmdCgpO1xuICAgIGNvbnN0IHR5cGUgPSBuZXh0LnR5cGU7XG4gICAgbGV0IHJvdXRlID0gbmV4dC5yb3V0ZTtcblxuICAgIGlmICh0eXBlID09PSAncHVzaCcpIHtcbiAgICAgIGlmIChyb3V0ZSAhPT0gbnVsbCkge1xuICAgICAgICByb3V0ZVN0YWNrID0gW1xuICAgICAgICAgIC4uLnJvdXRlU3RhY2ssXG4gICAgICAgICAgcm91dGVcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyZXNldCcpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyb3V0ZSkpIHJvdXRlID0gW3JvdXRlXTtcbiAgICAgIHJvdXRlU3RhY2sgPSByb3V0ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyZXBsYWNlJykge1xuICAgICAgcm91dGVTdGFjay5wb3AoKTtcbiAgICAgIHJvdXRlU3RhY2sucHVzaChyb3V0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvdXRlU3RhY2ssXG4gICAgICBwcm9jZXNzU3RhY2tcbiAgICB9O1xuICB9LFxuXG4gIHBvc3RQb3A6IChyb3V0ZUNvbmZpZykgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5yb3V0ZUNvbmZpZ307XG4gICAgbGV0IHJvdXRlU3RhY2sgPSBbLi4uY29uZmlnLnJvdXRlU3RhY2tdO1xuICAgIGxldCBwcm9jZXNzU3RhY2sgPSBbLi4uY29uZmlnLnByb2Nlc3NTdGFja107XG4gICAgcm91dGVTdGFjayA9IHJvdXRlU3RhY2suc2xpY2UoMCwgcm91dGVTdGFjay5sZW5ndGggLSAxKTtcbiAgICBwcm9jZXNzU3RhY2sgPSBwcm9jZXNzU3RhY2suc2xpY2UoMSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm91dGVTdGFjayxcbiAgICAgIHByb2Nlc3NTdGFja1xuICAgIH07XG4gIH1cbn07XG4iXSwibmFtZXMiOlsia2ViYWJpemUiLCJjYW1lbFN0cmluZyIsInJlcGxhY2UiLCJ0b0xvd2VyQ2FzZSIsImFkZERlcHJlY2F0ZWQiLCJwcm9wcyIsImRlcHJlY2F0ZWQiLCJwcm9wc0NvcHkiLCJuYW1lTWFwIiwiY2xhc3NOYW1lIiwib2xkTmFtZSIsIm5ld05hbWUiLCJPYmplY3QiLCJlbnRyaWVzIiwidW5kZWZpbmVkIiwidXNlQ3VzdG9tRWxlbWVudExpc3RlbmVyIiwicmVmIiwicHJvcCIsImhhbmRsZXIiLCJldmVudCIsInNsaWNlIiwidXNlRWZmZWN0IiwiY3VycmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJjbGVhbnVwIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInVzZUN1c3RvbUVsZW1lbnQiLCJvcHRpb25zIiwibm90QXR0cmlidXRlcyIsInByb3BlcnRpZXMiLCJ2YWx1ZSIsImpzTmFtZSIsImluY2x1ZGVzIiwidGVzdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJvbnNDdXN0b21FbGVtZW50IiwiV3JhcHBlZENvbXBvbmVudCIsIlJlYWN0IiwiZm9yd2FyZFJlZiIsIl9yZWYiLCJ1c2VSZWYiLCJzdHlsZSIsImNoaWxkcmVuIiwicmVzdCIsIlBvcnRhbCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwiY29udGFpbmVyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY29tcG9uZW50RGlkTW91bnQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbW92ZUNoaWxkIiwicmVuZGVyIiwiUmVhY3RET00iLCJjcmVhdGVQb3J0YWwiLCJiYXNlRGlhbG9nIiwiRGlhbG9nQ29tcG9uZW50IiwidmlzaWJsZSIsInByb3BUeXBlcyIsInRpdGxlIiwiUHJvcFR5cGVzIiwic3RyaW5nIiwib25EaWFsb2dDYW5jZWwiLCJmdW5jIiwiYm9vbCIsImNhbmNlbGFibGUiLCJkaXNhYmxlZCIsIm9uQ2FuY2VsIiwiaXNPcGVuIiwiaXNDYW5jZWxhYmxlIiwiaXNEaXNhYmxlZCIsImFuaW1hdGlvbiIsIm1vZGlmaWVyIiwibWFza0NvbG9yIiwiYW5pbWF0aW9uT3B0aW9ucyIsIm9iamVjdCIsIm9uUHJlU2hvdyIsIm9uUG9zdFNob3ciLCJvblByZUhpZGUiLCJvblBvc3RIaWRlIiwib25EZXZpY2VCYWNrQnV0dG9uIiwiQWN0aW9uU2hlZXQiLCJpY29uIiwib25DbGljayIsIkFjdGlvblNoZWV0QnV0dG9uIiwiQWxlcnREaWFsb2ciLCJBbGVydERpYWxvZ0J1dHRvbiIsIkJhY2tCdXR0b24iLCJzaGFwZSIsImNhbGxiYWNrIiwiQm90dG9tVG9vbGJhciIsInJpcHBsZSIsIkJ1dHRvbiIsIkNhcmQiLCJpbmRleCIsIkVsZW1lbnQiLCJDYXJvdXNlbCIsIml0ZW1XaWR0aCIsIml0ZW1IZWlnaHQiLCJ4IiwicmVhbEl0ZW1XaWR0aCIsInJlYWxJdGVtSGVpZ2h0IiwiZGlyZWN0aW9uIiwib25lT2YiLCJmdWxsc2NyZWVuIiwib3ZlcnNjcm9sbGFibGUiLCJjZW50ZXJlZCIsImF1dG9TY3JvbGwiLCJhdXRvU2Nyb2xsUmF0aW8iLCJudW1iZXIiLCJzd2lwZWFibGUiLCJhY3RpdmVJbmRleCIsImF1dG9SZWZyZXNoIiwib25QcmVDaGFuZ2UiLCJvblBvc3RDaGFuZ2UiLCJvblJlZnJlc2giLCJvbk92ZXJzY3JvbGwiLCJvblN3aXBlIiwiQ2Fyb3VzZWxJdGVtIiwib25lVGltZVByb3AiLCJkZWZhdWx0UHJvcCIsIk9uZVRpbWVQcm9wIiwiY3JlYXRlUmVmIiwiaW5uZXJSZWYiLCJJTlBVVF9QUk9QUyIsImF1dG9DYXBpdGFsaXplIiwiYXV0b0NvbXBsZXRlIiwiYXV0b0NvcnJlY3QiLCJhdXRvRm9jdXMiLCJpbnB1dE1vZGUiLCJtYXhMZW5ndGgiLCJtaW5MZW5ndGgiLCJyZWFkT25seSIsInNwZWxsQ2hlY2siLCJ3aXRoRGVmYXVsdENoZWNrZWQiLCJjb21wb25lbnQiLCJDaGVja2JveCIsIm9uQ2hhbmdlIiwib25JbnB1dCIsIm9uZU9mVHlwZSIsImluc3RhbmNlT2YiLCJEYXRlIiwiY2hlY2tlZCIsImRlZmF1bHRDaGVja2VkIiwiaW5wdXRJZCIsIkNvbCIsInZlcnRpY2FsQWxpZ24iLCJ3aWR0aCIsIkRpYWxvZyIsIkZhYiIsInBvc2l0aW9uIiwib25EcmFnIiwib25EcmFnTGVmdCIsIm9uRHJhZ1JpZ2h0Iiwib25EcmFnVXAiLCJvbkRyYWdEb3duIiwib25Ib2xkIiwib25SZWxlYXNlIiwib25Td2lwZUxlZnQiLCJvblN3aXBlUmlnaHQiLCJvblN3aXBlVXAiLCJvblN3aXBlRG93biIsIm9uVGFwIiwib25Eb3VibGVUYXAiLCJvblBpbmNoIiwib25QaW5jaEluIiwib25QaW5jaE91dCIsIm9uVG91Y2giLCJvblRyYW5zZm9ybSIsIm9uUm90YXRlIiwiR2VzdHVyZURldGVjdG9yIiwicGFyc2VJY29uIiwia2V5cyIsImZpbHRlciIsImEiLCJpbm5lclN0cmluZyIsIm1hcCIsImtleSIsImRlZmF1bHQiLCJqb2luIiwicGFyc2VTaXplIiwic2l6ZSIsIkljb24iLCJvYmplY3RPZiIsInJvdGF0ZSIsImZpeGVkV2lkdGgiLCJzcGluIiwid2l0aERlZmF1bHRWYWx1ZSIsIklucHV0IiwiZGVmYXVsdFZhbHVlIiwicGxhY2Vob2xkZXIiLCJ0eXBlIiwiZmxvYXQiLCJMaXN0IiwicmVuZGVySGVhZGVyIiwicmVuZGVyRm9vdGVyIiwicmVuZGVyUm93IiwiZGF0YVNvdXJjZSIsInJvd3MiLCJkYXRhIiwiYXJyYXkiLCJkZWZhdWx0UHJvcHMiLCJMYXp5TGlzdCIsImZvcndhcmRlZFJlZiIsInNldENoaWxkcmVuIiwidXNlU3RhdGUiLCJzZXRVcGRhdGVUb3AiLCJjYWxjdWxhdGVJdGVtSGVpZ2h0IiwibGVuZ3RoIiwiZGVsZWdhdGUiLCJfcmVuZGVyIiwic3RhcnQiLCJsaW1pdCIsInVwZGF0ZVRvcCIsImVsIiwiaSIsInB1c2giLCJjb3VudEl0ZW1zIiwiaXNSZXF1aXJlZCIsIkxpc3RIZWFkZXIiLCJ0YXBwYWJsZSIsInRhcEJhY2tncm91bmRDb2xvciIsImtlZXBUYXBCYWNrZ3JvdW5kQ29sb3IiLCJsb2NrT25EcmFnIiwiZXhwYW5kYWJsZSIsImV4cGFuZGVkIiwib25FeHBhbmQiLCJMaXN0SXRlbSIsIkxpc3RUaXRsZSIsIk5hdmlnYXRvckNsYXNzIiwicGFnZXMiLCJzdGF0ZSIsIl9wcmVQdXNoIiwiYmluZCIsIl9wb3N0UHVzaCIsIl9wcmVQb3AiLCJfcG9zdFBvcCIsInVwZGF0ZSIsIm9iaiIsIlByb21pc2UiLCJyZXNvbHZlIiwiZm9yY2VVcGRhdGUiLCJyZXNldFBhZ2UiLCJyb3V0ZSIsInJlc2V0UGFnZVN0YWNrIiwicm91dGVzIiwiaXNSdW5uaW5nIiwicmVqZWN0IiwiaGlkZVBhZ2VzIiwicGFnZUVsZW1lbnRzIiwiZGlzcGxheSIsInBvcCIsInJvdXRlc0JlZm9yZVBvcCIsInJvdXRlc0FmdGVyUG9wIiwiY29uY2F0IiwidGhlbiIsIl9wb3BQYWdlIiwibGFzdFJvdXRlIiwibmV3UGFnZSIsInJlbmRlclBhZ2UiLCJfcHVzaFBhZ2UiLCJwdXNoUGFnZSIsImNhdGNoIiwiZXJyb3IiLCJfaXNSdW5uaW5nIiwicmVwbGFjZVBhZ2UiLCJwb3MiLCJzcGxpY2UiLCJ0b3BQYWdlIiwidXBkYXRlQmFja0J1dHRvbiIsInBvcFBhZ2UiLCJmbHVzaFN5bmMiLCJfb25EZXZpY2VCYWNrQnV0dG9uIiwiY2FsbFBhcmVudEhhbmRsZXIiLCJ0YXJnZXQiLCJwb3BwaW5nUm91dGUiLCJvblByZVBvcCIsInBvcHBlZFJvdXRlIiwib25Qb3N0UG9wIiwicHVzaGluZ1JvdXRlIiwib25QcmVQdXNoIiwicHVzaGVkUm91dGUiLCJvblBvc3RQdXNoIiwibm9kZSIsInN3aXBlTWF4Iiwic3dpcGVQb3AiLCJpbml0aWFsUm91dGUiLCJpbml0aWFsUm91dGVTdGFjayIsIkVycm9yIiwiY29tcG9uZW50RGlkVXBkYXRlIiwiTmF2aWdhdG9yIiwiTk9PUCIsIk1vZGFsIiwiUGFnZSIsInJlbmRlclRvb2xiYXIiLCJyZW5kZXJCb3R0b21Ub29sYmFyIiwicmVuZGVyTW9kYWwiLCJyZW5kZXJGaXhlZCIsImNvbnRlbnRTdHlsZSIsInpJbmRleCIsIm9uSW5pdCIsIm9uU2hvdyIsIm9uSGlkZSIsIm9uSW5maW5pdGVTY3JvbGwiLCJFbGVtIiwiUG9wb3ZlciIsImdldFRhcmdldCIsImlzRWxlbWVudCIsIkhUTUxEb2N1bWVudCIsInNob3ciLCJoaWRlIiwiUHJvZ3Jlc3NCYXIiLCJzZWNvbmRhcnlWYWx1ZSIsImluZGV0ZXJtaW5hdGUiLCJQcm9ncmVzc0NpcmN1bGFyIiwib25Mb2FkIiwiUHVsbEhvb2siLCJvbkNoYW5nZVN0YXRlIiwib25BY3Rpb24iLCJvblB1bGwiLCJoZWlnaHQiLCJ0aHJlc2hvbGRIZWlnaHQiLCJmaXhlZENvbnRlbnQiLCJSYWRpbyIsIm5hbWUiLCJSYW5nZSIsIlJpcHBsZSIsImNvbG9yIiwiYmFja2dyb3VuZCIsImNlbnRlciIsIlJvdXRlck5hdmlnYXRvckNsYXNzIiwiY2FuY2VsVXBkYXRlIiwiaW50ZXJuYWxTdGFjayIsImNiIiwic2V0U3RhdGUiLCJyb3V0ZUNvbmZpZyIsInJvdXRlU3RhY2siLCJwcmV2UHJvcHMiLCJwcm9jZXNzU3RhY2siLCJBcnJheSIsImlzQXJyYXkiLCJwYWdlc1RvUmVuZGVyIiwiUm91dGVyTmF2aWdhdG9yIiwiYXJyYXlPZiIsIlJvdyIsIlNlYXJjaElucHV0IiwiU2VnbWVudCIsInRhYmJhcklkIiwiU2VsZWN0IiwibXVsdGlwbGUiLCJhdXRvZm9jdXMiLCJyZXF1aXJlZCIsImZvcm0iLCJTcGVlZERpYWwiLCJTcGVlZERpYWxJdGVtIiwiU3BsaXR0ZXIiLCJTcGxpdHRlckNvbnRlbnQiLCJTcGxpdHRlck1hc2siLCJvbk9wZW4iLCJvbkNsb3NlIiwiU3BsaXR0ZXJTaWRlIiwicmVhbFdpZHRoIiwiY29sbGFwc2UiLCJvblBvc3RPcGVuIiwib25Qb3N0Q2xvc2UiLCJzaWRlIiwic3dpcGVUYXJnZXRXaWR0aCIsIm9wZW5UaHJlc2hvbGQiLCJvblByZU9wZW4iLCJvblByZUNsb3NlIiwib25Nb2RlQ2hhbmdlIiwiU3dpdGNoIiwiVGFiIiwiYWN0aXZlSWNvbiIsImxhYmVsIiwiYmFkZ2UiLCJUYWJiYXIiLCJoaWRlVGFicyIsInJlbmRlclRhYnMiLCJ0YWJzIiwicmVhbGx5SGlkZVRhYnMiLCJ0YWIiLCJjb250ZW50IiwiaWdub3JlRWRnZVdpZHRoIiwidGFiQm9yZGVyIiwib25SZWFjdGl2ZSIsIlRvYXN0IiwiVG9vbGJhciIsInN0YXRpYyIsImlubGluZSIsIlRvb2xiYXJCdXR0b24iLCJpbml0IiwiY29uZmlnIiwicHJvY2VzcyIsInJlc2V0IiwicG9wcyIsImNvbnNvbGUiLCJ3YXJuIiwicG9zdFB1c2giLCJuZXh0Iiwic2hpZnQiLCJwb3N0UG9wIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUNBLE1BQU1BLFFBQVEsR0FBR0MsV0FBVyxJQUMxQkEsV0FBVyxDQUFDQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLENBQUNDLFdBQVcsRUFBRSxDQUFBO0VBRWxFLE1BQU1DLGFBQWEsR0FBRyxDQUFDQyxLQUFLLEVBQUVDLFVBQVUsS0FBSztFQUMzQyxFQUFBLE1BQU1DLFNBQVMsR0FBRztNQUFFLEdBQUdGLEtBQUFBO0tBQU8sQ0FBQTtFQUU5QixFQUFBLE1BQU1HLE9BQU8sR0FBRztFQUNkQyxJQUFBQSxTQUFTLEVBQUUsT0FBTztNQUNsQixHQUFHSCxVQUFBQTtLQUNKLENBQUE7O0VBRUQ7RUFDQSxFQUFBLEtBQUssTUFBTSxDQUFDSSxPQUFPLEVBQUVDLE9BQU8sQ0FBQyxJQUFJQyxNQUFNLENBQUNDLE9BQU8sQ0FBQ0wsT0FBTyxDQUFDLEVBQUU7RUFDeEQsSUFBQSxJQUFJRCxTQUFTLENBQUNJLE9BQU8sQ0FBQyxLQUFLRyxTQUFTLElBQUlQLFNBQVMsQ0FBQ0csT0FBTyxDQUFDLEtBQUtJLFNBQVMsRUFBRTtFQUN4RVAsTUFBQUEsU0FBUyxDQUFDSSxPQUFPLENBQUMsR0FBR0osU0FBUyxDQUFDRyxPQUFPLENBQUMsQ0FBQTtRQUN2QyxPQUFPSCxTQUFTLENBQUNHLE9BQU8sQ0FBQyxDQUFBO0VBQzNCLEtBQUE7RUFDRixHQUFBO0VBRUEs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VyxFQUFFbEcsNkJBQVMsQ0FBQ0csSUFBSTtFQUUzQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUNFZ0csWUFBWSxFQUFFbkcsNkJBQVMsQ0FBQ0csSUFBSTtFQUU1QjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUNFaUcsU0FBUyxFQUFFcEcsNkJBQVMsQ0FBQ0csSUFBSTtFQUV6QjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUNFa0csV0FBVyxFQUFFckcsNkJBQVMsQ0FBQ0csSUFBSTtFQUUzQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUNFbUcsS0FBSyxFQUFFdEcsNkJBQVMsQ0FBQ0csSUFBSTtFQUVyQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUNFb0csV0FBVyxFQUFFdkcsNkJBQVMsQ0FBQ0csSUFBSTtFQUUzQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUNFcUcsT0FBTyxFQUFFeEcsNkJBQVMsQ0FBQ0csSUFBSTtFQUV2QjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUNFc0csU0FBUyxFQUFFekcsNkJBQVMsQ0FBQ0csSUFBSTtFQUV6QjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUNFdUcsVUFBVSxFQUFFMUcsNkJBQVMsQ0FBQ0csSUFBSTtFQUUxQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUNFd0csT0FBTyxFQUFFM0csNkJBQVMsQ0FBQ0csSUFBSTtFQUV2QjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUNFeUcsV0FBVyxFQUFFNUcsNkJBQVMsQ0FBQ0csSUFBSTtFQUUzQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUNFMEcsUUFBUSxFQUFFN0csNkJBQVMsQ0FBQ0csSUFBQUE7RUFDdEIsQ0FBQyxDQUFBOztFQUVEO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNB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
