UNPKG

@foxone/finance-ui

Version:

The Financial UI Component Library Based on @foxone/uikit and vuetify

369 lines (307 loc) 46.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.AssetRangeInput = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _vuePropertyDecorator = require("vue-property-decorator"); var _classnames = _interopRequireDefault(require("../utils/classnames")); var _number = require("../utils/number"); var _lib = require("vuetify/lib"); var _FAssetAmountInput = require("@foxone/uikit/src/components/FAssetAmountInput"); var _FButton = require("@foxone/uikit/src/components/FButton"); require("vue-slider-component/theme/default.css"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var __decorate = void 0 && (void 0).__decorate || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if ((typeof Reflect === "undefined" ? "undefined" : (0, _typeof2["default"])(Reflect)) === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) { if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; } return c > 3 && r && Object.defineProperty(target, key, r), r; }; // avoid typescript error var VueSlider = require('vue-slider-component'); var AssetRangeInput = /*#__PURE__*/function (_Vue) { (0, _inherits2["default"])(AssetRangeInput, _Vue); var _super = _createSuper(AssetRangeInput); function AssetRangeInput() { var _this; (0, _classCallCheck2["default"])(this, AssetRangeInput); _this = _super.apply(this, arguments); _this._value_input = ''; _this._value_slider = 0; return _this; } (0, _createClass2["default"])(AssetRangeInput, [{ key: "hasInputLeftTips", get: function get() { var _a, _b, _c; return !!(((_a = this.inputTips) === null || _a === void 0 ? void 0 : _a.amount) || ((_b = this.inputTips) === null || _b === void 0 ? void 0 : _b.amountSymbol) || ((_c = this.inputTips) === null || _c === void 0 ? void 0 : _c.tipLeft)); } }, { key: "hasUpperLimit", get: function get() { return this.max && 1 / this.max; } }, { key: "isInRange", value: function isInRange(val) { return val >= this.min && (!this.hasUpperLimit || val <= this.max); } }, { key: "setSliderValueWithLimit", value: function setSliderValueWithLimit(val) { if (this.hasUpperLimit && typeof val === 'number') { var _val = val / this.max * 100; if (_val > 100) _val = 100; if (_val < 0) _val = 0; this._value_slider = (0, _number.format)({ n: _val, p: 2 }); } } }, { key: "handleValueChange", value: function handleValueChange(val) { if (!this.isInRange(+val)) this.$emit('error:limit'); this._value_input = val; this.setSliderValueWithLimit(+val); } }, { key: "created", value: function created() { if (!this.isInRange(+this.value)) this.$emit('error:limit'); this._value_input = this.value; this.setSliderValueWithLimit(+this.value); } }, { key: "render", value: function render(h) { var _this2 = this; var _a, _b, _c, _d, _e, _f, _g, _h; var btn = this.$slots.button; var slider = this.$slots.slider; var inputTips = this.$slots.inputTips; var sliderTips = this.$slots.sliderTips; var activator = this.$scopedSlots.activator; var classes = (0, _classnames["default"])('asset-range-input'); return h(_lib.VLayout, { staticClass: classes(), "class": this.className, attrs: { column: true, 'align-center': true } }, [// top section h('div', { staticClass: classes('top') }, [// asset input h(_FAssetAmountInput.FAssetAmountInput, { props: { value: this._value_input, assets: this.assets, asset: this.bindAsset, selectable: this.selectable, border: this.border, loading: this.loading }, attrs: Object.assign(Object.assign({}, this.$attrs), { disabled: this.disabledInput }), on: Object.assign(Object.assign({}, this.$listeners), { input: function input(val, e) { if (!_this2.isInRange(+val)) _this2.$emit('error:limit'); _this2._value_input = val; _this2.$emit('input', val); if (!_this2.value) _this2.$nextTick(function () { return _this2.$forceUpdate(); }); _this2.setSliderValueWithLimit(+val); } }), scopedSlots: { activator: activator } }), // tips inputTips !== null && inputTips !== void 0 ? inputTips : h(_lib.VLayout, { staticClass: classes('top-tips', 'mt-2 f-greyscale-3 f-caption'), attrs: { 'justify-space-between': true, 'align-center': true } }, [this.hasInputLeftTips ? h('div', { staticClass: classes('top-tips-left') }, [((_a = this.inputTips) === null || _a === void 0 ? void 0 : _a.tipLeft) ? h('span', { staticClass: classes('top-tips-left-txt', 'mr-1') }, [(_b = this.inputTips) === null || _b === void 0 ? void 0 : _b.tipLeft]) : null, ((_c = this.inputTips) === null || _c === void 0 ? void 0 : _c.amount) ? h('span', { staticClass: classes('top-tips-left-amount', 'f-greyscale-1 font-weight-bold'), on: { click: function click() { var _a, _b; if (!_this2.isInRange(+((_a = _this2.inputTips) === null || _a === void 0 ? void 0 : _a.amount))) _this2.$emit('error:limit'); _this2._value_input = "".concat((_b = _this2.inputTips) === null || _b === void 0 ? void 0 : _b.amount); _this2.setSliderValueWithLimit(+_this2._value_input); _this2.$emit('input', _this2._value_input); _this2.$emit('click:amount'); _this2.$nextTick(function () { return _this2.$forceUpdate(); }); } } }, "".concat((_d = this.inputTips) === null || _d === void 0 ? void 0 : _d.amount).concat((_f = (_e = this.inputTips) === null || _e === void 0 ? void 0 : _e.amountSymbol) !== null && _f !== void 0 ? _f : '')) : null]) : null, ((_g = this.inputTips) === null || _g === void 0 ? void 0 : _g.tipRight) ? h('div', { staticClass: classes('top-tips-right') }, [this.inputTips.tipRight]) : null]), // error this.error ? h('div', { staticClass: classes('top-error', 'f-caption pt-2') }, [typeof this.error === 'function' ? this.error(this._value_input) : this.error]) : h('div', { staticClass: classes('top-error-placeholder') })]), // slider section this.showSlider ? h('div', { staticClass: classes('mid', 'mb-8') }, slider !== null && slider !== void 0 ? slider : [sliderTips !== null && sliderTips !== void 0 ? sliderTips : h(_lib.VLayout, { staticClass: classes('mid-tips', 'mb-5 f-greyscale-3 f-body-2'), attrs: { 'justify-space-between': true, 'align-center': true } }, [h('span', this.ratioText), h('span', { staticClass: 'f-greyscale-1 font-weight-bold' }, "".concat((_h = this._value_slider) !== null && _h !== void 0 ? _h : 0, "%"))]), h(VueSlider, { props: { value: this._value_slider, height: 8, min: 0, max: 100, interval: 0.01, lazy: true, tooltip: 'none', contained: true, disabled: this.disabledSlider }, on: { change: function change(val) { _this2._value_slider = +val; if (_this2.hasUpperLimit) { _this2._value_input = (0, _number.format)({ n: +val / 100 * _this2.max, p: 8 }); _this2.$emit('input', _this2._value_input); } _this2.$nextTick(function () { return _this2.$forceUpdate(); }); } } })]) : null, // btn section this.showBtn ? btn !== null && btn !== void 0 ? btn : h(_FButton.FButton, { staticClass: 'px-8 py-4', props: { color: this.color }, attrs: { disabled: this.disabledBtn !== void 0 ? this.disabledBtn : !this.isInRange(+this._value_input) }, on: { click: function click() { _this2.$emit('click:button'); } } }, this.btnText) : null]); } }]); return AssetRangeInput; }(_vuePropertyDecorator.Vue); exports.AssetRangeInput = AssetRangeInput; __decorate([(0, _vuePropertyDecorator.Model)('input', { type: [String, Number], "default": '' })], AssetRangeInput.prototype, "value", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: Number, "default": 0 })], AssetRangeInput.prototype, "min", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: Number, "default": Infinity })], AssetRangeInput.prototype, "max", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: String, "default": '' })], AssetRangeInput.prototype, "className", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: String, "default": 'primary' })], AssetRangeInput.prototype, "color", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: Boolean, "default": void 0 })], AssetRangeInput.prototype, "disabledInput", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: Boolean, "default": true })], AssetRangeInput.prototype, "selectable", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: Boolean, "default": false })], AssetRangeInput.prototype, "border", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: Boolean, "default": false })], AssetRangeInput.prototype, "loading", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: Array, "default": function _default() { return []; } })], AssetRangeInput.prototype, "assets", void 0); __decorate([(0, _vuePropertyDecorator.PropSync)('asset')], AssetRangeInput.prototype, "bindAsset", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: Object, "default": function _default() { return {}; } })], AssetRangeInput.prototype, "inputTips", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: [String, Function], "default": '' })], AssetRangeInput.prototype, "error", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: String, "default": 'Ratio' })], AssetRangeInput.prototype, "ratioText", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: Boolean, "default": void 0 })], AssetRangeInput.prototype, "disabledSlider", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: Boolean, "default": true })], AssetRangeInput.prototype, "showSlider", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: String, "default": 'Confirm' })], AssetRangeInput.prototype, "btnText", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: Boolean, "default": void 0 })], AssetRangeInput.prototype, "disabledBtn", void 0); __decorate([(0, _vuePropertyDecorator.Prop)({ type: Boolean, "default": true })], AssetRangeInput.prototype, "showBtn", void 0); __decorate([(0, _vuePropertyDecorator.Watch)('value')], AssetRangeInput.prototype, "handleValueChange", null); exports.AssetRangeInput = AssetRangeInput = __decorate([_vuePropertyDecorator.Component], AssetRangeInput); var _default2 = AssetRangeInput; exports["default"] = _default2; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9Bc3NldFJhbmdlSW5wdXQvX2RlcHJlY2F0ZS50cyIsIkFzc2V0UmFuZ2VJbnB1dC9fZGVwcmVjYXRlLmpzIl0sIm5hbWVzIjpbIl9fZGVjb3JhdGUiLCJkZWNvcmF0b3JzIiwidGFyZ2V0Iiwia2V5IiwiZGVzYyIsImMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJyIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZCIsIlJlZmxlY3QiLCJkZWNvcmF0ZSIsImkiLCJkZWZpbmVQcm9wZXJ0eSIsIlZ1ZVNsaWRlciIsInJlcXVpcmUiLCJBc3NldFJhbmdlSW5wdXQiLCJfdmFsdWVfaW5wdXQiLCJfdmFsdWVfc2xpZGVyIiwiX2EiLCJfYiIsIl9jIiwiaW5wdXRUaXBzIiwiYW1vdW50IiwiYW1vdW50U3ltYm9sIiwidGlwTGVmdCIsIm1heCIsInZhbCIsIm1pbiIsImhhc1VwcGVyTGltaXQiLCJfdmFsIiwibiIsInAiLCJpc0luUmFuZ2UiLCIkZW1pdCIsInNldFNsaWRlclZhbHVlV2l0aExpbWl0IiwidmFsdWUiLCJoIiwiX2QiLCJfZSIsIl9mIiwiX2ciLCJfaCIsImJ0biIsIiRzbG90cyIsImJ1dHRvbiIsInNsaWRlciIsInNsaWRlclRpcHMiLCJhY3RpdmF0b3IiLCIkc2NvcGVkU2xvdHMiLCJjbGFzc2VzIiwiVkxheW91dCIsInN0YXRpY0NsYXNzIiwiY2xhc3NOYW1lIiwiYXR0cnMiLCJjb2x1bW4iLCJGQXNzZXRBbW91bnRJbnB1dCIsInByb3BzIiwiYXNzZXRzIiwiYXNzZXQiLCJiaW5kQXNzZXQiLCJzZWxlY3RhYmxlIiwiYm9yZGVyIiwibG9hZGluZyIsImFzc2lnbiIsIiRhdHRycyIsImRpc2FibGVkIiwiZGlzYWJsZWRJbnB1dCIsIm9uIiwiJGxpc3RlbmVycyIsImlucHV0IiwiZSIsIiRuZXh0VGljayIsIiRmb3JjZVVwZGF0ZSIsInNjb3BlZFNsb3RzIiwiaGFzSW5wdXRMZWZ0VGlwcyIsImNsaWNrIiwidGlwUmlnaHQiLCJlcnJvciIsInNob3dTbGlkZXIiLCJyYXRpb1RleHQiLCJoZWlnaHQiLCJpbnRlcnZhbCIsImxhenkiLCJ0b29sdGlwIiwiY29udGFpbmVkIiwiZGlzYWJsZWRTbGlkZXIiLCJjaGFuZ2UiLCJzaG93QnRuIiwiRkJ1dHRvbiIsImNvbG9yIiwiZGlzYWJsZWRCdG4iLCJidG5UZXh0IiwiVnVlIiwidHlwZSIsIlN0cmluZyIsIk51bWJlciIsInByb3RvdHlwZSIsIkluZmluaXR5IiwiQm9vbGVhbiIsIkFycmF5IiwiRnVuY3Rpb24iLCJDb21wb25lbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQVFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUNiQSxJQUFJQSxVQUFVLEdBQUksVUFBUSxTQUFLQSxVQUFkLElBQTZCLFVBQVVDLFVBQVYsRUFBc0JDLE1BQXRCLEVBQThCQyxHQUE5QixFQUFtQ0MsSUFBbkMsRUFBeUM7QUFDbkYsTUFBSUMsQ0FBQyxHQUFHQyxTQUFTLENBQUNDLE1BQWxCO0FBQUEsTUFBMEJDLENBQUMsR0FBR0gsQ0FBQyxHQUFHLENBQUosR0FBUUgsTUFBUixHQUFpQkUsSUFBSSxLQUFLLElBQVQsR0FBZ0JBLElBQUksR0FBR0ssTUFBTSxDQUFDQyx3QkFBUCxDQUFnQ1IsTUFBaEMsRUFBd0NDLEdBQXhDLENBQXZCLEdBQXNFQyxJQUFySDtBQUFBLE1BQTJITyxDQUEzSDtBQUNBLE1BQUksUUFBT0MsT0FBUCwwREFBT0EsT0FBUCxPQUFtQixRQUFuQixJQUErQixPQUFPQSxPQUFPLENBQUNDLFFBQWYsS0FBNEIsVUFBL0QsRUFBMkVMLENBQUMsR0FBR0ksT0FBTyxDQUFDQyxRQUFSLENBQWlCWixVQUFqQixFQUE2QkMsTUFBN0IsRUFBcUNDLEdBQXJDLEVBQTBDQyxJQUExQyxDQUFKLENBQTNFLEtBQ0ssS0FBSyxJQUFJVSxDQUFDLEdBQUdiLFVBQVUsQ0FBQ00sTUFBWCxHQUFvQixDQUFqQyxFQUFvQ08sQ0FBQyxJQUFJ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aUIsYUFBUyxLQUFLO0FBQS9CLENBQUwsQ0FBeUMsQ0FBQSxFQ2dOekNuRixlQUFlLENBQUNpRixTRGhOeUIsRUNnTmQsYURoTmMsRUNnTkMsS0FBSyxDRGhOTixDQUFBOztBQUNGbkcsVUFBQSxDQUFBLENBQXZDLGdDQUFLO0FBQUVnRyxFQUFBQSxJQUFJLEVBQUVLLE9BQVI7QUFBaUIsYUFBUztBQUExQixDQUFMLENBQXVDLENBQUEsRUNrTnZDbkYsZUFBZSxDQUFDaUYsU0RsTnVCLEVDa05aLFNEbE5ZLEVDa05ELEtBQUssQ0RsTkosQ0FBQTs7QUErQnhDbkcsVUFBQSxDQUFBLENBREMsaUNBQU0sT0FBTixDQUNELENBQUEsRUNzTENrQixlQUFlLENBQUNpRixTRHRMakIsRUNzTDRCLG1CRHRMNUIsRUNzTGlELElEdExqRCxDQUFBOztBQTNEVywwQkFBQWpGLGVBQWUsR0FBQWxCLFVBQUEsQ0FBQSxDQUQzQndHLCtCQUMyQixDQUFBLEVBQWZ0RixlQUFlLENBQWY7Z0JBeVJFQSxlIiwiZmlsZSI6IkFzc2V0UmFuZ2VJbnB1dC9fZGVwcmVjYXRlLmpzIiwic291cmNlc0NvbnRlbnQiOltudWxsLCJ2YXIgX19kZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn07XG5pbXBvcnQgeyBDb21wb25lbnQsIFZ1ZSwgUHJvcCwgUHJvcFN5bmMsIE1vZGVsLCBXYXRjaCB9IGZyb20gJ3Z1ZS1wcm9wZXJ0eS1kZWNvcmF0b3InO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnLi4vdXRpbHMvY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICcuLi91dGlscy9udW1iZXInO1xuaW1wb3J0IHsgVkxheW91dCB9IGZyb20gJ3Z1ZXRpZnkvbGliJztcbmltcG9ydCB7IEZBc3NldEFtb3VudElucHV0IH0gZnJvbSAnQGZveG9uZS91aWtpdC9zcmMvY29tcG9uZW50cy9GQXNzZXRBbW91bnRJbnB1dCc7XG5pbXBvcnQgeyBGQnV0dG9uIH0gZnJvbSAnQGZveG9uZS91aWtpdC9zcmMvY29tcG9uZW50cy9GQnV0dG9uJztcbmltcG9ydCAndnVlLXNsaWRlci1jb21wb25lbnQvdGhlbWUvZGVmYXVsdC5jc3MnO1xuLy8gYXZvaWQgdHlwZXNjcmlwdCBlcnJvclxuY29uc3QgVnVlU2xpZGVyID0gcmVxdWlyZSgndnVlLXNsaWRlci1jb21wb25lbnQnKTtcbmxldCBBc3NldFJhbmdlSW5wdXQgPSBjbGFzcyBBc3NldFJhbmdlSW5wdXQgZXh0ZW5kcyBWdWUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl92YWx1ZV9pbnB1dCA9ICcnO1xuICAgICAgICB0aGlzLl92YWx1ZV9zbGlkZXIgPSAwO1xuICAgIH1cbiAgICBnZXQgaGFzSW5wdXRMZWZ0VGlwcygpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHJldHVybiAhISgoKF9hID0gdGhpcy5pbnB1dFRpcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hbW91bnQpIHx8ICgoX2IgPSB0aGlzLmlucHV0VGlwcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmFtb3VudFN5bWJvbCkgfHwgKChfYyA9IHRoaXMuaW5wdXRUaXBzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudGlwTGVmdCkpO1xuICAgIH1cbiAgICBnZXQgaGFzVXBwZXJMaW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4ICYmICgxIC8gdGhpcy5tYXgpO1xuICAgIH1cbiAgICBpc0luUmFuZ2UodmFsKSB7XG4gICAgICAgIHJldHVybiB2YWwgPj0gdGhpcy5taW4gJiYgKCF0aGlzLmhhc1VwcGVyTGltaXQgfHwgdmFsIDw9IHRoaXMubWF4KTtcbiAgICB9XG4gICAgc2V0U2xpZGVyVmFsdWVXaXRoTGltaXQodmFsKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1VwcGVyTGltaXQgJiYgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGxldCBfdmFsID0gdmFsIC8gdGhpcy5tYXggKiAxMDA7XG4gICAgICAgICAgICBpZiAoX3ZhbCA+IDEwMClcbiAgICAgICAgICAgICAgICBfdmFsID0gMTAwO1xuICAgICAgICAgICAgaWYgKF92YWwgPCAwKVxuICAgICAgICAgICAgICAgIF92YWwgPSAwO1xuICAgICAgICAgICAgdGhpcy5fdmFsdWVfc2xpZGVyID0gZm9ybWF0KHtcbiAgICAgICAgICAgICAgICBuOiBfdmFsLFxuICAgICAgICAgICAgICAgIHA6IDJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZVZhbHVlQ2hhbmdlKHZhbCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNJblJhbmdlKCt2YWwpKVxuICAgICAgICAgICAgdGhpcy4kZW1pdCgnZXJyb3I6bGltaXQnKTtcbiAgICAgICAgdGhpcy5fdmFsdWVfaW5wdXQgPSB2YWw7XG4gICAgICAgIHRoaXMuc2V0U2xpZGVyVmFsdWVXaXRoTGltaXQoK3ZhbCk7XG4gICAgfVxuICAgIGNyZWF0ZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0luUmFuZ2UoK3RoaXMudmFsdWUpKVxuICAgICAgICAgICAgdGhpcy4kZW1pdCgnZXJyb3I6bGltaXQnKTtcbiAgICAgICAgdGhpcy5fdmFsdWVfaW5wdXQgPSB0aGlzLnZhbHVlO1xuICAgICAgICB0aGlzLnNldFNsaWRlclZhbHVlV2l0aExpbWl0KCt0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgcmVuZGVyKGgpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaDtcbiAgICAgICAgY29uc3QgYnRuID0gdGhpcy4kc2xvdHMuYnV0dG9uO1xuICAgICAgICBjb25zdCBzbGlkZXIgPSB0aGlzLiRzbG90cy5zbGlkZXI7XG4gICAgICAgIGNvbnN0IGlucHV0VGlwcyA9IHRoaXMuJHNsb3RzLmlucHV0VGlwcztcbiAgICAgICAgY29uc3Qgc2xpZGVyVGlwcyA9IHRoaXMuJHNsb3RzLnNsaWRlclRpcHM7XG4gICAgICAgIGNvbnN0IGFjdGl2YXRvciA9IHRoaXMuJHNjb3BlZFNsb3RzLmFjdGl2YXRvcjtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGNsYXNzbmFtZXMoJ2Fzc2V0LXJhbmdlLWlucHV0Jyk7XG4gICAgICAgIHJldHVybiBoKFZMYXlvdXQsIHtcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBjbGFzc2VzKCksXG4gICAgICAgICAgICBjbGFzczogdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgIGNvbHVtbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAnYWxpZ24tY2VudGVyJzogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBbXG4gICAgICAgICAgICAvLyB0b3Agc2VjdGlvblxuICAgICAgICAgICAgaCgnZGl2Jywge1xuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBjbGFzc2VzKCd0b3AnKVxuICAgICAgICAgICAgfSwgW1xuICAgICAgICAgICAgICAgIC8vIGFzc2V0IGlucHV0XG4gICAgICAgICAgICAgICAgaChGQXNzZXRBbW91bnRJbnB1dCwge1xuICAgICAgICAgICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3ZhbHVlX2lucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXRzOiB0aGlzLmFzc2V0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2V0OiB0aGlzLmJpbmRBc3NldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IHRoaXMuc2VsZWN0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogdGhpcy5ib3JkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nOiB0aGlzLmxvYWRpbmcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMuJGF0dHJzKSwgeyBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZElucHV0IH0pLFxuICAgICAgICAgICAgICAgICAgICBvbjogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLiRsaXN0ZW5lcnMpLCB7IGlucHV0OiAodmFsLCBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW5SYW5nZSgrdmFsKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZW1pdCgnZXJyb3I6bGltaXQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZV9pbnB1dCA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB0aGlzLiRmb3JjZVVwZGF0ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNsaWRlclZhbHVlV2l0aExpbWl0KCt2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSxcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVkU2xvdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRvclxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC8vIHRpcHNcbiAgICAgICAgICAgICAgICBpbnB1dFRpcHMgIT09IG51bGwgJiYgaW5wdXRUaXBzICE9PSB2b2lkIDAgPyBpbnB1dFRpcHMgOiBoKFZMYXlvdXQsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IGNsYXNzZXMoJ3RvcC10aXBzJywgJ210LTIgZi1ncmV5c2NhbGUtMyBmLWNhcHRpb24nKSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdqdXN0aWZ5LXNwYWNlLWJldHdlZW4nOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2FsaWduLWNlbnRlcic6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNJbnB1dExlZnRUaXBzID8gaCgnZGl2Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IGNsYXNzZXMoJ3RvcC10aXBzLWxlZnQnKVxuICAgICAgICAgICAgICAgICAgICB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAoKF9hID0gdGhpcy5pbnB1dFRpcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50aXBMZWZ0KSA/IGgoJ3NwYW4nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IGNsYXNzZXMoJ3RvcC10aXBzLWxlZnQtdHh0JywgJ21yLTEnKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgWyhfYiA9IHRoaXMuaW5wdXRUaXBzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IudGlwTGVmdF0pIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICgoX2MgPSB0aGlzLmlucHV0VGlwcykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmFtb3VudCkgPyBoKCdzcGFuJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBjbGFzc2VzKCd0b3AtdGlwcy1sZWZ0LWFtb3VudCcsICdmLWdyZXlzY2FsZS0xIGZvbnQtd2VpZ2h0LWJvbGQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0luUmFuZ2UoKygoX2EgPSB0aGlzLmlucHV0VGlwcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFtb3VudCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVtaXQoJ2Vycm9yOmxpbWl0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZV9pbnB1dCA9IGAkeyhfYiA9IHRoaXMuaW5wdXRUaXBzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuYW1vdW50fWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNsaWRlclZhbHVlV2l0aExpbWl0KCt0aGlzLl92YWx1ZV9pbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHRoaXMuX3ZhbHVlX2lucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVtaXQoJ2NsaWNrOmFtb3VudCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gdGhpcy4kZm9yY2VVcGRhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBgJHsoX2QgPSB0aGlzLmlucHV0VGlwcykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmFtb3VudH0keyhfZiA9IChfZSA9IHRoaXMuaW5wdXRUaXBzKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UuYW1vdW50U3ltYm9sKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiAnJ31gKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIF0pIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgKChfZyA9IHRoaXMuaW5wdXRUaXBzKSA9PT0gbnVsbCB8fCBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2cudGlwUmlnaHQpID8gaCgnZGl2Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IGNsYXNzZXMoJ3RvcC10aXBzLXJpZ2h0JylcbiAgICAgICAgICAgICAgICAgICAgfSwgW3RoaXMuaW5wdXRUaXBzLnRpcFJpZ2h0XSkgOiBudWxsXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgLy8gZXJyb3JcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yID8gaCgnZGl2Jywge1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogY2xhc3NlcygndG9wLWVycm9yJywgJ2YtY2FwdGlvbiBwdC0yJylcbiAgICAgICAgICAgICAgICB9LCBbXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLmVycm9yID09PSAnZnVuY3Rpb24nID8gdGhpcy5lcnJvcih0aGlzLl92YWx1ZV9pbnB1dCkgOiB0aGlzLmVycm9yXG4gICAgICAgICAgICAgICAgXSkgOiBoKCdkaXYnLCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBjbGFzc2VzKCd0b3AtZXJyb3ItcGxhY2Vob2xkZXInKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIC8vIHNsaWRlciBzZWN0aW9uXG4gICAgICAgICAgICB0aGlzLnNob3dTbGlkZXIgPyBoKCdkaXYnLCB7XG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IGNsYXNzZXMoJ21pZCcsICdtYi04JylcbiAgICAgICAgICAgIH0sIHNsaWRlciAhPT0gbnVsbCAmJiBzbGlkZXIgIT09IHZvaWQgMCA/IHNsaWRlciA6IFtcbiAgICAgICAgICAgICAgICBzbGlkZXJUaXBzICE9PSBudWxsICYmIHNsaWRlclRpcHMgIT09IHZvaWQgMCA/IHNsaWRlclRpcHMgOiBoKFZMYXlvdXQsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IGNsYXNzZXMoJ21pZC10aXBzJywgJ21iLTUgZi1ncmV5c2NhbGUtMyBmLWJvZHktMicpLFxuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2p1c3RpZnktc3BhY2UtYmV0d2Vlbic6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAnYWxpZ24tY2VudGVyJzogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgW1xuICAgICAgICAgICAgICAgICAgICBoKCdzcGFuJywgdGhpcy5yYXRpb1RleHQpLFxuICAgICAgICAgICAgICAgICAgICBoKCdzcGFuJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6ICdmLWdyZXlzY2FsZS0xIGZvbnQtd2VpZ2h0LWJvbGQnLFxuICAgICAgICAgICAgICAgICAgICB9LCBgJHsoX2ggPSB0aGlzLl92YWx1ZV9zbGlkZXIpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IDB9JWApXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgaChWdWVTbGlkZXIsIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl92YWx1ZV9zbGlkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsOiAwLjAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGF6eTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkU2xpZGVyXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVfc2xpZGVyID0gK3ZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNVcHBlckxpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlX2lucHV0ID0gZm9ybWF0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG46ICt2YWwgLyAxMDAgKiB0aGlzLm1heCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6IDhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdGhpcy5fdmFsdWVfaW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB0aGlzLiRmb3JjZVVwZGF0ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKSA6IG51bGwsXG4gICAgICAgICAgICAvLyBidG4gc2VjdGlvblxuICAgICAgICAgICAgdGhpcy5zaG93QnRuID8gYnRuICE9PSBudWxsICYmIGJ0biAhPT0gdm9pZCAwID8gYnRuIDogaChGQnV0dG9uLCB7XG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6ICdweC04IHB5LTQnLFxuICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZEJ0biAhPT0gdm9pZCAwID8gdGhpcy5kaXNhYmxlZEJ0biA6ICF0aGlzLmlzSW5SYW5nZSgrdGhpcy5fdmFsdWVfaW5wdXQpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZW1pdCgnY2xpY2s6YnV0dG9uJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzLmJ0blRleHQpIDogbnVsbFxuICAgICAgICBdKTtcbiAgICB9XG59O1xuX19kZWNvcmF0ZShbXG4gICAgTW9kZWwoJ2lucHV0JywgeyB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLCBkZWZhdWx0OiAnJyB9KVxuXSwgQXNzZXRSYW5nZUlucHV0LnByb3RvdHlwZSwgXCJ2YWx1ZVwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgUHJvcCh7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9KVxuXSwgQXNzZXRSYW5nZUlucHV0LnByb3RvdHlwZSwgXCJtaW5cIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIFByb3AoeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IEluZmluaXR5IH0pXG5dLCBBc3NldFJhbmdlSW5wdXQucHJvdG90eXBlLCBcIm1heFwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgUHJvcCh7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfSlcbl0sIEFzc2V0UmFuZ2VJbnB1dC5wcm90b3R5cGUsIFwiY2xhc3NOYW1lXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBQcm9wKHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAncHJpbWFyeScgfSlcbl0sIEFzc2V0UmFuZ2VJbnB1dC5wcm90b3R5cGUsIFwiY29sb3JcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIFByb3AoeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB2b2lkIDAgfSlcbl0sIEFzc2V0UmFuZ2VJbnB1dC5wcm90b3R5cGUsIFwiZGlzYWJsZWRJbnB1dFwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgUHJvcCh7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSlcbl0sIEFzc2V0UmFuZ2VJbnB1dC5wcm90b3R5cGUsIFwic2VsZWN0YWJsZVwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgUHJvcCh7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0pXG5dLCBBc3NldFJhbmdlSW5wdXQucHJvdG90eXBlLCBcImJvcmRlclwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgUHJvcCh7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0pXG5dLCBBc3NldFJhbmdlSW5wdXQucHJvdG90eXBlLCBcImxvYWRpbmdcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIFByb3AoeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogKCkgPT4gW10gfSlcbl0sIEFzc2V0UmFuZ2VJbnB1dC5wcm90b3R5cGUsIFwiYXNzZXRzXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBQcm9wU3luYygnYXNzZXQnKVxuXSwgQXNzZXRSYW5nZUlucHV0LnByb3RvdHlwZSwgXCJiaW5kQXNzZXRcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIFByb3AoeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+ICh7fSkgfSlcbl0sIEFzc2V0UmFuZ2VJbnB1dC5wcm90b3R5cGUsIFwiaW5wdXRUaXBzXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBQcm9wKHsgdHlwZTogW1N0cmluZywgRnVuY3Rpb25dLCBkZWZhdWx0OiAnJyB9KVxuXSwgQXNzZXRSYW5nZUlucHV0LnByb3RvdHlwZSwgXCJlcnJvclwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgUHJvcCh7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ1JhdGlvJyB9KVxuXSwgQXNzZXRSYW5nZUlucHV0LnByb3RvdHlwZSwgXCJyYXRpb1RleHRcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIFByb3AoeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB2b2lkIDAgfSlcbl0sIEFzc2V0UmFuZ2VJbnB1dC5wcm90b3R5cGUsIFwiZGlzYWJsZWRTbGlkZXJcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIFByb3AoeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0pXG5dLCBBc3NldFJhbmdlSW5wdXQucHJvdG90eXBlLCBcInNob3dTbGlkZXJcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIFByb3AoeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdDb25maXJtJyB9KVxuXSwgQXNzZXRSYW5nZUlucHV0LnByb3RvdHlwZSwgXCJidG5UZXh0XCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBQcm9wKHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdm9pZCAwIH0pXG5dLCBBc3NldFJhbmdlSW5wdXQucHJvdG90eXBlLCBcImRpc2FibGVkQnRuXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBQcm9wKHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9KVxuXSwgQXNzZXRSYW5nZUlucHV0LnByb3RvdHlwZSwgXCJzaG93QnRuXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBXYXRjaCgndmFsdWUnKVxuXSwgQXNzZXRSYW5nZUlucHV0LnByb3RvdHlwZSwgXCJoYW5kbGVWYWx1ZUNoYW5nZVwiLCBudWxsKTtcbkFzc2V0UmFuZ2VJbnB1dCA9IF9fZGVjb3JhdGUoW1xuICAgIENvbXBvbmVudFxuXSwgQXNzZXRSYW5nZUlucHV0KTtcbmV4cG9ydCB7IEFzc2V0UmFuZ2VJbnB1dCB9O1xuZXhwb3J0IGRlZmF1bHQgQXNzZXRSYW5nZUlucHV0OyJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjIn0=