UNPKG

boundless-arrow-key-navigation

Version:

A higher-order component for arrow key navigation on a grouping of children.

2 lines 64.4 kB
module.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=9)}([function(e,t,n){"function"==typeof Symbol&&Symbol.iterator;e.exports=n(7)()},function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("boundless-utils-uuid")},function(e,t){e.exports=require("react")},function(e,t){e.exports=require("react-dom")},function(e,t,n){"use strict";function r(e){return function(){return e}}var o=function(){};o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(e){return e},e.exports=o},function(e,t,n){"use strict";function r(e,t,n,r,i,s,a,u){if(o(t),!e){var c;if(void 0===t)c=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,r,i,s,a,u],p=0;c=new Error(t.replace(/%s/g,function(){return l[p++]})),c.name="Invariant Violation"}throw c.framesToPop=1,c}}var o=function(e){};e.exports=r},function(e,t,n){"use strict";var r=n(5),o=n(6),i=n(8);e.exports=function(){function e(e,t,n,r,s,a){a!==i&&o(!1,"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types")}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t};return n.checkPropTypes=r,n.PropTypes=n,n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=n(0),u=n.n(a),c=n(3),l=(n.n(c),n(4)),p=(n.n(l),n(1)),d=n.n(p),f=n(2),h=n.n(f),v=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},m=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),y="data-focus-index",O=function(e){function t(){var e,r,s,a;o(this,t);for(var u=arguments.length,p=Array(u),d=0;d<u;d++)p[d]=arguments[d];return r=s=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(p))),s.state={activeChildIndex:s.props.defaultActiveChildIndex,children:[]},s.handleKeyDown=function(e){switch(e.key){case"ArrowUp":s.props.mode!==t.mode.VERTICAL&&s.props.mode!==t.mode.BOTH||(e.preventDefault(),s.moveFocus(-1));break;case"ArrowLeft":s.props.mode!==t.mode.HORIZONTAL&&s.props.mode!==t.mode.BOTH||(e.preventDefault(),s.moveFocus(-1));break;case"ArrowDown":s.props.mode!==t.mode.VERTICAL&&s.props.mode!==t.mode.BOTH||(e.preventDefault(),s.moveFocus(1));break;case"ArrowRight":s.props.mode!==t.mode.HORIZONTAL&&s.props.mode!==t.mode.BOTH||(e.preventDefault(),s.moveFocus(1))}s.props.onKeyDown&&s.props.onKeyDown(e)},s.handleFocus=function(e){if(e.target.hasAttribute(y)){var t=parseInt(e.target.getAttribute(y),10),n=c.Children.toArray(s.state.children)[t];s.setState({activeChildIndex:t}),n.props.onFocus&&n.props.onFocus(e)}},s.persistWrapperElementReference=function(e){s.$wrapper=e instanceof HTMLElement?e:n.i(l.findDOMNode)(e)},a=r,i(s,a)}return s(t,e),m(t,[{key:"getFilteredChildren",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.props;return c.Children.toArray(e.children).filter(Boolean)}},{key:"setActiveChildIndex",value:function(){if(0!==this.state.activeChildIndex){var e=c.Children.count(this.state.children);0===e?this.setState({activeChildIndex:0}):this.state.activeChildIndex>=e&&this.setState({activeChildIndex:e-1})}}},{key:"componentWillMount",value:function(){this.setState({children:this.getFilteredChildren()})}},{key:"componentWillReceiveProps",value:function(e){if(e.children!==this.props.children)return this.setState({children:this.getFilteredChildren(e)},this.setActiveChildIndex);this.setActiveChildIndex()}},{key:"componentDidUpdate",value:function(e,t){this.state.activeChildIndex!==t.activeChildIndex&&this.setFocus(this.state.activeChildIndex)}},{key:"setFocus",value:function(e){var t=this.$wrapper.children[e];t&&t.hasAttribute("data-focus-skip")?this.moveFocus(t.compareDocumentPosition(document.activeElement)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1):t&&document.activeElement!==t&&t.focus()}},{key:"moveFocus",value:function(e){var t=this.state.children?c.Children.count(this.state.children):0,n=this.state.activeChildIndex+e;n>=t?n=0:n<0&&(n=t-1),this.setState({activeChildIndex:n})}},{key:"renderChildren",value:function(){var e=this;return c.Children.map(this.state.children,function(t,o){var i;return n.i(c.cloneElement)(t,(i={},r(i,y,o),r(i,"data-focus-skip",-1===parseInt(t.props.tabIndex,10)||void 0),r(i,"key",t.key||o),r(i,"tabIndex",e.state.activeChildIndex===o?0:-1),i))})}},{key:"render",value:function(){return n.i(c.createElement)(this.props.component,v({},d()(this.props,t.internalKeys),{ref:this.persistWrapperElementReference,onFocus:this.handleFocus,onKeyDown:this.handleKeyDown}),this.renderChildren())}}]),t}(c.PureComponent);O.mode={HORIZONTAL:h()(),VERTICAL:h()(),BOTH:h()()},O.propTypes={"*":u.a.any,component:u.a.oneOfType([u.a.string,u.a.func]),defaultActiveChildIndex:u.a.number,mode:u.a.oneOf([O.mode.BOTH,O.mode.HORIZONTAL,O.mode.VERTICAL])},O.defaultProps={component:"div",defaultActiveChildIndex:0,mode:O.mode.BOTH,onKeyDown:function(){}},O.internalKeys=Object.keys(O.defaultProps),t.default=O}]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDUzMjQyOGE1NWQ1YjE4NzMzYzdjIiwid2VicGFjazovLy8uL34vcHJvcC10eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy11dWlkXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0LWRvbVwifSIsIndlYnBhY2s6Ly8vLi9+L2ZianMvbGliL2VtcHR5RnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9mYmpzL2xpYi9pbnZhcmlhbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qcyIsIndlYnBhY2s6Ly8vLi9+L3Byb3AtdHlwZXMvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0LmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy1hcnJvdy1rZXktbmF2aWdhdGlvbi9pbmRleC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImluc3RhbGxlZE1vZHVsZXMiLCJpIiwibCIsImNhbGwiLCJtIiwiYyIsInZhbHVlIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwiZ2V0IiwibiIsIl9fZXNNb2R1bGUiLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJTeW1ib2wiLCJpdGVyYXRvciIsInJlcXVpcmUiLCJtYWtlRW1wdHlGdW5jdGlvbiIsImFyZyIsImVtcHR5RnVuY3Rpb24iLCJ0aGF0UmV0dXJucyIsInRoYXRSZXR1cm5zRmFsc2UiLCJ0aGF0UmV0dXJuc1RydWUiLCJ0aGF0UmV0dXJuc051bGwiLCJ0aGF0UmV0dXJuc1RoaXMiLCJ0aGlzIiwidGhhdFJldHVybnNBcmd1bWVudCIsImludmFyaWFudCIsImNvbmRpdGlvbiIsImZvcm1hdCIsImEiLCJiIiwiZSIsImYiLCJ2YWxpZGF0ZUZvcm1hdCIsImVycm9yIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJhcmdzIiwiYXJnSW5kZXgiLCJyZXBsYWNlIiwiZnJhbWVzVG9Qb3AiLCJSZWFjdFByb3BUeXBlc1NlY3JldCIsInNoaW0iLCJwcm9wcyIsInByb3BOYW1lIiwiY29tcG9uZW50TmFtZSIsImxvY2F0aW9uIiwicHJvcEZ1bGxOYW1lIiwic2VjcmV0IiwiZ2V0U2hpbSIsImlzUmVxdWlyZWQiLCJSZWFjdFByb3BUeXBlcyIsImFycmF5IiwiYm9vbCIsImZ1bmMiLCJudW1iZXIiLCJzdHJpbmciLCJzeW1ib2wiLCJhbnkiLCJhcnJheU9mIiwiZWxlbWVudCIsImluc3RhbmNlT2YiLCJub2RlIiwib2JqZWN0T2YiLCJvbmVPZiIsIm9uZU9mVHlwZSIsInNoYXBlIiwiY2hlY2tQcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwiX2RlZmluZVByb3BlcnR5Iiwib2JqIiwia2V5Iiwid3JpdGFibGUiLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX3JlYWN0X2RvbV9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJEQVRBX0FUVFJJQlVURV9JTkRFWCIsIkFycm93S2V5TmF2aWdhdGlvbiIsIl9QdXJlQ29tcG9uZW50IiwiX3JlZiIsIl90ZW1wIiwiX3RoaXMiLCJfcmV0IiwiX2xlbiIsIkFycmF5IiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJzdGF0ZSIsImFjdGl2ZUNoaWxkSW5kZXgiLCJkZWZhdWx0QWN0aXZlQ2hpbGRJbmRleCIsImNoaWxkcmVuIiwiaGFuZGxlS2V5RG93biIsImV2ZW50IiwibW9kZSIsIlZFUlRJQ0FMIiwiQk9USCIsInByZXZlbnREZWZhdWx0IiwibW92ZUZvY3VzIiwiSE9SSVpPTlRBTCIsIm9uS2V5RG93biIsImhhbmRsZUZvY3VzIiwiaGFzQXR0cmlidXRlIiwiaW5kZXgiLCJwYXJzZUludCIsImdldEF0dHJpYnV0ZSIsImNoaWxkIiwidG9BcnJheSIsInNldFN0YXRlIiwib25Gb2N1cyIsInBlcnNpc3RXcmFwcGVyRWxlbWVudFJlZmVyZW5jZSIsInVua25vd25UeXBlIiwiJHdyYXBwZXIiLCJIVE1MRWxlbWVudCIsImZpbHRlciIsIkJvb2xlYW4iLCJudW1DaGlsZHJlbiIsImNvdW50IiwiZ2V0RmlsdGVyZWRDaGlsZHJlbiIsIm5leHRQcm9wcyIsInNldEFjdGl2ZUNoaWxkSW5kZXgiLCJwcmV2UHJvcHMiLCJwcmV2U3RhdGUiLCJzZXRGb2N1cyIsImNoaWxkTm9kZSIsImNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIiwiZG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50IiwiTm9kZSIsIkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORyIsImZvY3VzIiwiZGVsdGEiLCJuZXh0SW5kZXgiLCJfdGhpczIiLCJtYXAiLCJfY2xvbmVFbGVtZW50IiwidGFiSW5kZXgiLCJjb21wb25lbnQiLCJpbnRlcm5hbEtleXMiLCJyZWYiLCJyZW5kZXJDaGlsZHJlbiIsInByb3BUeXBlcyIsIioiLCJkZWZhdWx0UHJvcHMiLCJrZXlzIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxP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TW1CLE1BQU04SCxVQUFaekUsS0FDUUgsSUFBS3JFLEtBQUttQixNQUFPaUUsRUFBbUI4RCxlQUN4Q0MsSUFBS25KLEtBQUtzSCwrQkFDVkQsUUFBU3JILEtBQUs2RyxZQUNkRCxVQUFXNUcsS0FBS29HLGdCQUNmcEcsS0FBS29KLHNCWHRFNitNaEUsR1c5SG45TWxCLEVBQUEsY0FBM0JrQixHQUNWa0IsTUFDSEssV0FBWXBDLE1BQ1pnQyxTQUFVaEMsTUFDVmlDLEtBQU1qQyxPQUpPYSxFQU9WaUUsV0FLSEMsSUFBS3JGLEVBQUE1RCxFQUFVNkIsSUFNZitHLFVBQVdoRixFQUFBNUQsRUFBVW9DLFdBQ2pCd0IsRUFBQTVELEVBQVUyQixPQUNWaUMsRUFBQTVELEVBQVV5QixPQU1kb0Usd0JBQXlCakMsRUFBQTVELEVBQVUwQixPQWFuQ3VFLEtBQU1yQyxFQUFBNUQsRUFBVW1DLE9BQ1o0QyxFQUFtQmtCLEtBQUtFLEtBQ3hCcEIsRUFBbUJrQixLQUFLSyxXQUN4QnZCLEVBQW1Ca0IsS0FBS0MsWUExQ2ZuQixFQThDVm1FLGNBQ0hOLFVBQVcsTUFDWC9DLHdCQUF5QixFQUN6QkksS0FBTWxCLEVBQW1Ca0IsS0FBS0UsS0FDOUJJLFVBQVcsY0FsREV4QixFQXFEVjhELGFBQWUxSyxPQUFPZ0wsS0FBS3BFLEVBQW1CbUUsY1h5RXdnUDFHLEVBQTZCLFFBQUkiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA5KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIF90eXBlb2Y9dHlwZW9mIFN5bWJvbD09PVwiZnVuY3Rpb25cIiYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09PVwic3ltYm9sXCI/ZnVuY3Rpb24ob2JqKXtyZXR1cm4gdHlwZW9mIG9iajt9OmZ1bmN0aW9uKG9iail7cmV0dXJuIG9iaiYmdHlwZW9mIFN5bWJvbD09PVwiZnVuY3Rpb25cIiYmb2JqLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZvYmohPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIG9iajt9O2lmKGZhbHNlKXt2YXIgUkVBQ1RfRUxFTUVOVF9UWVBFPXR5cGVvZiBTeW1ib2w9PT0nZnVuY3Rpb24nJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyl8fDB4ZWFjNzt2YXIgaXNWYWxpZEVsZW1lbnQ9ZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KXtyZXR1cm4odHlwZW9mIG9iamVjdD09PSd1bmRlZmluZWQnPyd1bmRlZmluZWQnOl90eXBlb2Yob2JqZWN0KSk9PT0nb2JqZWN0JyYmb2JqZWN0IT09bnVsbCYmb2JqZWN0LiQkdHlwZW9mPT09UkVBQ1RfRUxFTUVOVF9UWVBFO307dmFyIHRocm93T25EaXJlY3RBY2Nlc3M9dHJ1ZTttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzJykoaXNWYWxpZEVsZW1lbnQsdGhyb3dPbkRpcmVjdEFjY2Vzcyk7fWVsc2V7bW9kdWxlLmV4cG9ydHM9X193ZWJwYWNrX3JlcXVpcmVfXyg3KSgpO31cblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtdXVpZFwiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3QtZG9tXCIpO1xuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5mdW5jdGlvbiBtYWtlRW1wdHlGdW5jdGlvbihhcmcpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhcmc7fTt9dmFyIGVtcHR5RnVuY3Rpb249ZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpe307ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJucz1tYWtlRW1wdHlGdW5jdGlvbjtlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2U9bWFrZUVtcHR5RnVuY3Rpb24oZmFsc2UpO2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlPW1ha2VFbXB0eUZ1bmN0aW9uKHRydWUpO2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsPW1ha2VFbXB0eUZ1bmN0aW9uKG51bGwpO2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fTtlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zQXJndW1lbnQ9ZnVuY3Rpb24oYXJnKXtyZXR1cm4gYXJnO307bW9kdWxlLmV4cG9ydHM9ZW1wdHlGdW5jdGlvbjtcblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xudmFyIHZhbGlkYXRlRm9ybWF0PWZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCl7fTtpZihmYWxzZSl7dmFsaWRhdGVGb3JtYXQ9ZnVuY3Rpb24gdmFsaWRhdGVGb3JtYXQoZm9ybWF0KXtpZihmb3JtYXQ9PT11bmRlZmluZWQpe3Rocm93IG5ldyBFcnJvcignaW52YXJpYW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQnKTt9fTt9ZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbixmb3JtYXQsYSxiLGMsZCxlLGYpe3ZhbGlkYXRlRm9ybWF0KGZvcm1hdCk7aWYoIWNvbmRpdGlvbil7dmFyIGVycm9yO2lmKGZvcm1hdD09PXVuZGVmaW5lZCl7ZXJyb3I9bmV3IEVycm9yKCdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnKydmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLicpO31lbHNle3ZhciBhcmdzPVthLGIsYyxkLGUsZl07dmFyIGFyZ0luZGV4PTA7ZXJyb3I9bmV3IEVycm9yKGZvcm1hdC5yZXBsYWNlKC8lcy9nLGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107fSkpO2Vycm9yLm5hbWU9J0ludmFyaWFudCBWaW9sYXRpb24nO31lcnJvci5mcmFtZXNUb1BvcD0xO3Rocm93IGVycm9yO319bW9kdWxlLmV4cG9ydHM9aW52YXJpYW50O1xuXG4vKioqLyB9KSxcbi8qIDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgZW1wdHlGdW5jdGlvbj1fX3dlYnBhY2tfcmVxdWlyZV9fKDUpO3ZhciBpbnZhcmlhbnQ9X193ZWJwYWNrX3JlcXVpcmVfXyg2KTt2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQ9X193ZWJwYWNrX3JlcXVpcmVfXyg4KTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbigpe2Z1bmN0aW9uIHNoaW0ocHJvcHMscHJvcE5hbWUsY29tcG9uZW50TmFtZSxsb2NhdGlvbixwcm9wRnVsbE5hbWUsc2VjcmV0KXtpZihzZWNyZXQ9PT1SZWFjdFByb3BUeXBlc1NlY3JldCl7cmV0dXJuO31pbnZhcmlhbnQoZmFsc2UsJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcrJ1VzZSBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKSB0byBjYWxsIHRoZW0uICcrJ1JlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMnKTt9O3NoaW0uaXNSZXF1aXJlZD1zaGltO2Z1bmN0aW9uIGdldFNoaW0oKXtyZXR1cm4gc2hpbTt9O3ZhciBSZWFjdFByb3BUeXBlcz17YXJyYXk6c2hpbSxib29sOnNoaW0sZnVuYzpzaGltLG51bWJlcjpzaGltLG9iamVjdDpzaGltLHN0cmluZzpzaGltLHN5bWJvbDpzaGltLGFueTpzaGltLGFycmF5T2Y6Z2V0U2hpbSxlbGVtZW50OnNoaW0saW5zdGFuY2VPZjpnZXRTaGltLG5vZGU6c2hpbSxvYmplY3RPZjpnZXRTaGltLG9uZU9mOmdldFNoaW0sb25lT2ZUeXBlOmdldFNoaW0sc2hhcGU6Z2V0U2hpbX07UmVhY3RQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXM9ZW1wdHlGdW5jdGlvbjtSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXM9UmVhY3RQcm9wVHlwZXM7cmV0dXJuIFJlYWN0UHJvcFR5cGVzO307XG5cbi8qKiovIH0pLFxuLyogOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldD0nU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO21vZHVsZS5leHBvcnRzPVJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuXG4vKioqLyB9KSxcbi8qIDkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfcmVhY3RfZG9tX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9yZWFjdF9kb21fX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9yZWFjdF9kb21fXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLGtleSx2YWx1ZSl7aWYoa2V5IGluIG9iail7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixrZXkse3ZhbHVlOnZhbHVlLGVudW1lcmFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZSx3cml0YWJsZTp0cnVlfSk7fWVsc2V7b2JqW2tleV09dmFsdWU7fXJldHVybiBvYmo7fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTt9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTt9cmV0dXJuIGNhbGwmJih0eXBlb2YgY2FsbD09PVwib2JqZWN0XCJ8fHR5cGVvZiBjYWxsPT09XCJmdW5jdGlvblwiKT9jYWxsOnNlbGY7fWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PVwiZnVuY3Rpb25cIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiBzdXBlckNsYXNzKTt9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzO312YXIgREFUQV9BVFRSSUJVVEVfSU5ERVg9J2RhdGEtZm9jdXMtaW5kZXgnO3ZhciBEQVRBX0FUVFJJQlVURV9TS0lQPSdkYXRhLWZvY3VzLXNraXAnO3ZhciBBcnJvd0tleU5hdmlnYXRpb249ZnVuY3Rpb24oX1B1cmVDb21wb25lbnQpe19pbmhlcml0cyhBcnJvd0tleU5hdmlnYXRpb24sX1B1cmVDb21wb25lbnQpO2Z1bmN0aW9uIEFycm93S2V5TmF2aWdhdGlvbigpe3ZhciBfcmVmO3ZhciBfdGVtcCxfdGhpcyxfcmV0O19jbGFzc0NhbGxDaGVjayh0aGlzLEFycm93S2V5TmF2aWdhdGlvbik7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5XT1hcmd1bWVudHNbX2tleV07fXJldHVybiBfcmV0PShfdGVtcD0oX3RoaXM9X3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoX3JlZj1BcnJvd0tleU5hdmlnYXRpb24uX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoQXJyb3dLZXlOYXZpZ2F0aW9uKSkuY2FsbC5hcHBseShfcmVmLFt0aGlzXS5jb25jYXQoYXJncykpKSxfdGhpcyksX3RoaXMuc3RhdGU9e2FjdGl2ZUNoaWxkSW5kZXg6X3RoaXMucHJvcHMuZGVmYXVsdEFjdGl2ZUNoaWxkSW5kZXgsY2hpbGRyZW46W119LF90aGlzLmhhbmRsZUtleURvd249ZnVuY3Rpb24oZXZlbnQpe3N3aXRjaChldmVudC5rZXkpe2Nhc2UnQXJyb3dVcCc6aWYoX3RoaXMucHJvcHMubW9kZT09PUFycm93S2V5TmF2aWdhdGlvbi5tb2RlLlZFUlRJQ0FMfHxfdGhpcy5wcm9wcy5tb2RlPT09QXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuQk9USCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtfdGhpcy5tb3ZlRm9jdXMoLTEpO31icmVhaztjYXNlJ0Fycm93TGVmdCc6aWYoX3RoaXMucHJvcHMubW9kZT09PUFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkhPUklaT05UQUx8fF90aGlzLnByb3BzLm1vZGU9PT1BcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RIKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO190aGlzLm1vdmVGb2N1cygtMSk7fWJyZWFrO2Nhc2UnQXJyb3dEb3duJzppZihfdGhpcy5wcm9wcy5tb2RlPT09QXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuVkVSVElDQUx8fF90aGlzLnByb3BzLm1vZGU9PT1BcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RIKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO190aGlzLm1vdmVGb2N1cygxKTt9YnJlYWs7Y2FzZSdBcnJvd1JpZ2h0JzppZihfdGhpcy5wcm9wcy5tb2RlPT09QXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuSE9SSVpPTlRBTHx8X3RoaXMucHJvcHMubW9kZT09PUFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7X3RoaXMubW92ZUZvY3VzKDEpO31icmVhazt9aWYoX3RoaXMucHJvcHMub25LZXlEb3duKXtfdGhpcy5wcm9wcy5vbktleURvd24oZXZlbnQpO319LF90aGlzLmhhbmRsZUZvY3VzPWZ1bmN0aW9uKGV2ZW50KXtpZihldmVudC50YXJnZXQuaGFzQXR0cmlidXRlKERBVEFfQVRUUklCVVRFX0lOREVYKSl7dmFyIGluZGV4PXBhcnNlSW50KGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoREFUQV9BVFRSSUJVVEVfSU5ERVgpLDEwKTt2YXIgY2hpbGQ9X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X19bXCJDaGlsZHJlblwiXS50b0FycmF5KF90aGlzLnN0YXRlLmNoaWxkcmVuKVtpbmRleF07X3RoaXMuc2V0U3RhdGUoe2FjdGl2ZUNoaWxkSW5kZXg6aW5kZXh9KTtpZihjaGlsZC5wcm9wcy5vbkZvY3VzKXtjaGlsZC5wcm9wcy5vbkZvY3VzKGV2ZW50KTt9fX0sX3RoaXMucGVyc2lzdFdyYXBwZXJFbGVtZW50UmVmZXJlbmNlPWZ1bmN0aW9uKHVua25vd25UeXBlKXtfdGhpcy4kd3JhcHBlcj11bmtub3duVHlwZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50P3Vua25vd25UeXBlOl9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfcmVhY3RfZG9tX19bXCJmaW5kRE9NTm9kZVwiXSkodW5rbm93blR5cGUpO30sX3RlbXApLF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLF9yZXQpO31fY3JlYXRlQ2xhc3MoQXJyb3dLZXlOYXZpZ2F0aW9uLFt7a2V5OidnZXRGaWx0ZXJlZENoaWxkcmVuJyx2YWx1ZTpmdW5jdGlvbiBnZXRGaWx0ZXJlZENoaWxkcmVuKCl7dmFyIHByb3BzPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1swXTp0aGlzLnByb3BzO3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfX1tcIkNoaWxkcmVuXCJdLnRvQXJyYXkocHJvcHMuY2hpbGRyZW4pLmZpbHRlcihCb29sZWFuKTt9fSx7a2V5OidzZXRBY3RpdmVDaGlsZEluZGV4Jyx2YWx1ZTpmdW5jdGlvbiBzZXRBY3RpdmVDaGlsZEluZGV4KCl7aWYodGhpcy5zdGF0ZS5hY3RpdmVDaGlsZEluZGV4IT09MCl7dmFyIG51bUNoaWxkcmVuPV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9fW1wiQ2hpbGRyZW5cIl0uY291bnQodGhpcy5zdGF0ZS5jaGlsZHJlbik7aWYobnVtQ2hpbGRyZW49PT0wKXt0aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4OjB9KTt9ZWxzZSBpZih0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXg+PW51bUNoaWxkcmVuKXt0aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4Om51bUNoaWxkcmVuLTF9KTt9fX19LHtrZXk6J2NvbXBvbmVudFdpbGxNb3VudCcsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCl7dGhpcy5zZXRTdGF0ZSh7Y2hpbGRyZW46dGhpcy5nZXRGaWx0ZXJlZENoaWxkcmVuKCl9KTt9fSx7a2V5Oidjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyl7aWYobmV4dFByb3BzLmNoaWxkcmVuIT09dGhpcy5wcm9wcy5jaGlsZHJlbil7cmV0dXJuIHRoaXMuc2V0U3RhdGUoe2NoaWxkcmVuOnRoaXMuZ2V0RmlsdGVyZWRDaGlsZHJlbihuZXh0UHJvcHMpfSx0aGlzLnNldEFjdGl2ZUNoaWxkSW5kZXgpO310aGlzLnNldEFjdGl2ZUNoaWxkSW5kZXgoKTt9fSx7a2V5Oidjb21wb25lbnREaWRVcGRhdGUnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMscHJldlN0YXRlKXtpZih0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXghPT1wcmV2U3RhdGUuYWN0aXZlQ2hpbGRJbmRleCl7dGhpcy5zZXRGb2N1cyh0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXgpO319fSx7a2V5OidzZXRGb2N1cycsdmFsdWU6ZnVuY3Rpb24gc2V0Rm9jdXMoaW5kZXgpe3ZhciBjaGlsZE5vZGU9dGhpcy4kd3JhcHBlci5jaGlsZHJlbltpbmRleF07aWYoY2hpbGROb2RlJiZjaGlsZE5vZGUuaGFzQXR0cmlidXRlKERBVEFfQVRUUklCVVRFX1NLSVApKXt0aGlzLm1vdmVGb2N1cyhjaGlsZE5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkmTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkc/LTE6MSk7fWVsc2UgaWYoY2hpbGROb2RlJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09Y2hpbGROb2RlKXtjaGlsZE5vZGUuZm9jdXMoKTt9fX0se2tleTonbW92ZUZvY3VzJyx2YWx1ZTpmdW5jdGlvbiBtb3ZlRm9jdXMoZGVsdGEpe3ZhciBudW1DaGlsZHJlbj10aGlzLnN0YXRlLmNoaWxkcmVuP19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9fW1wiQ2hpbGRyZW5cIl0uY291bnQodGhpcy5zdGF0ZS5jaGlsZHJlbik6MDt2YXIgbmV4dEluZGV4PXRoaXMuc3RhdGUuYWN0aXZlQ2hpbGRJbmRleCtkZWx0YTtpZihuZXh0SW5kZXg+PW51bUNoaWxkcmVuKXtuZXh0SW5kZXg9MDt9ZWxzZSBpZihuZXh0SW5kZXg8MCl7bmV4dEluZGV4PW51bUNoaWxkcmVuLTE7fXRoaXMuc2V0U3RhdGUoe2FjdGl2ZUNoaWxkSW5kZXg6bmV4dEluZGV4fSk7fX0se2tleToncmVuZGVyQ2hpbGRyZW4nLHZhbHVlOmZ1bmN0aW9uIHJlbmRlckNoaWxkcmVuKCl7dmFyIF90aGlzMj10aGlzO3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfX1tcIkNoaWxkcmVuXCJdLm1hcCh0aGlzLnN0YXRlLmNoaWxkcmVuLGZ1bmN0aW9uKGNoaWxkLGluZGV4KXt2YXIgX2Nsb25lRWxlbWVudDtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9fW1wiY2xvbmVFbGVtZW50XCJdKShjaGlsZCwoX2Nsb25lRWxlbWVudD17fSxfZGVmaW5lUHJvcGVydHkoX2Nsb25lRWxlbWVudCxEQVRBX0FUVFJJQlVURV9JTkRFWCxpbmRleCksX2RlZmluZVByb3BlcnR5KF9jbG9uZUVsZW1lbnQsREFUQV9BVFRSSUJVVEVfU0tJUCxwYXJzZUludChjaGlsZC5wcm9wcy50YWJJbmRleCwxMCk9PT0tMXx8dW5kZWZpbmVkKSxfZGVmaW5lUHJvcGVydHkoX2Nsb25lRWxlbWVudCwna2V5JyxjaGlsZC5rZXl8fGluZGV4KSxfZGVmaW5lUHJvcGVydHkoX2Nsb25lRWxlbWVudCwndGFiSW5kZXgnLF90aGlzMi5zdGF0ZS5hY3RpdmVDaGlsZEluZGV4PT09aW5kZXg/MDotMSksX2Nsb25lRWxlbWVudCkpO30pO319LHtrZXk6J3JlbmRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfX1tcImNyZWF0ZUVsZW1lbnRcIl0pKHRoaXMucHJvcHMuY29tcG9uZW50LF9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCgpKHRoaXMucHJvcHMsQXJyb3dLZXlOYXZpZ2F0aW9uLmludGVybmFsS2V5cykse3JlZjp0aGlzLnBlcnNpc3RXcmFwcGVyRWxlbWVudFJlZmVyZW5jZSxvbkZvY3VzOnRoaXMuaGFuZGxlRm9jdXMsb25LZXlEb3duOnRoaXMuaGFuZGxlS2V5RG93bn0pLHRoaXMucmVuZGVyQ2hpbGRyZW4oKSk7fX1dKTtyZXR1cm4gQXJyb3dLZXlOYXZpZ2F0aW9uO30oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X19bXCJQdXJlQ29tcG9uZW50XCJdKTtBcnJvd0tleU5hdmlnYXRpb24ubW9kZT17SE9SSVpPTlRBTDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0KCkoKSxWRVJUSUNBTDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0KCkoKSxCT1RIOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQoKSgpfTtBcnJvd0tleU5hdmlnYXRpb24ucHJvcFR5cGVzPXsnKic6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0LmEuYW55LGNvbXBvbmVudDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcHJvcF90eXBlc19fX2RlZmF1bHQuYS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX19fZGVmYXVsdC5hLnN0cmluZyxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcHJvcF90eXBlc19fX2RlZmF1bHQuYS5mdW5jXSksZGVmYXVsdEFjdGl2ZUNoaWxkSW5kZXg6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0LmEubnVtYmVyLG1vZGU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0LmEub25lT2YoW0Fycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgsQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuSE9SSVpPTlRBTCxBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5WRVJUSUNBTF0pfTtBcnJvd0tleU5hdmlnYXRpb24uZGVmYXVsdFByb3BzPXtjb21wb25lbnQ6J2RpdicsZGVmYXVsdEFjdGl2ZUNoaWxkSW5kZXg6MCxtb2RlOkFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgsb25LZXlEb3duOmZ1bmN0aW9uIG9uS2V5RG93bigpe319O0Fycm93S2V5TmF2aWdhdGlvbi5pbnRlcm5hbEtleXM9T2JqZWN0LmtleXMoQXJyb3dLZXlOYXZpZ2F0aW9uLmRlZmF1bHRQcm9wcyk7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChBcnJvd0tleU5hdmlnYXRpb24pO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA5KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA1MzI0MjhhNTVkNWIxODczM2M3YyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIFN5bWJvbC5mb3IgJiZcbiAgICBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykpIHx8XG4gICAgMHhlYWM3O1xuXG4gIHZhciBpc1ZhbGlkRWxlbWVudCA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgb2JqZWN0ICE9PSBudWxsICYmXG4gICAgICBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbiAgfTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L3Byb3AtdHlwZXMvaW5kZXguanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wifVxuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtdXVpZFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy11dWlkXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3QtZG9tXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3QtZG9tXCJ9XG4vLyBtb2R1bGUgaWQgPSA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuZnVuY3Rpb24gbWFrZUVtcHR5RnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGFyZztcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgYW5kIGRpc2NhcmRzIGlucHV0czsgaXQgaGFzIG5vIHNpZGUgZWZmZWN0cy4gVGhpcyBpc1xuICogcHJpbWFyaWx5IHVzZWZ1bCBpZGlvbWF0aWNhbGx5IGZvciBvdmVycmlkYWJsZSBmdW5jdGlvbiBlbmRwb2ludHMgd2hpY2hcbiAqIGFsd2F5cyBuZWVkIHRvIGJlIGNhbGxhYmxlLCBzaW5jZSBKUyBsYWNrcyBhIG51bGwtY2FsbCBpZGlvbSBhbGEgQ29jb2EuXG4gKi9cbnZhciBlbXB0eUZ1bmN0aW9uID0gZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpIHt9O1xuXG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zID0gbWFrZUVtcHR5RnVuY3Rpb247XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2UgPSBtYWtlRW1wdHlGdW5jdGlvbihmYWxzZSk7XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZSA9IG1ha2VFbXB0eUZ1bmN0aW9uKHRydWUpO1xuZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGwgPSBtYWtlRW1wdHlGdW5jdGlvbihudWxsKTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUaGlzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcztcbn07XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zQXJndW1lbnQgPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHJldHVybiBhcmc7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVtcHR5RnVuY3Rpb247XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9mYmpzL2xpYi9lbXB0eUZ1bmN0aW9uLmpzIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciB2YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhbGlkYXRlRm9ybWF0ID