123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var component_1 = require('./../common/component.js');
- var touch_1 = require('./../mixins/touch.js');
- component_1.VantComponent({
- mixins: [touch_1.touch],
- classes: ['nav-class', 'tab-class', 'tab-active-class', 'line-class'],
- relation: {
- name: 'tab',
- type: 'descendant',
- linked: function linked(child) {
- this.child.push(child);
- this.updateTabs(this.data.tabs.concat(child.data));
- },
- unlinked: function unlinked(child) {
- var index = this.child.indexOf(child);
- var tabs = this.data.tabs;
- tabs.splice(index, 1);
- this.child.splice(index, 1);
- this.updateTabs(tabs);
- }
- },
- props: {
- color: String,
- sticky: Boolean,
- animated: Boolean,
- swipeable: Boolean,
- lineWidth: {
- type: Number,
- value: -1
- },
- lineHeight: {
- type: Number,
- value: -1
- },
- active: {
- type: Number,
- value: 0
- },
- type: {
- type: String,
- value: 'line'
- },
- border: {
- type: Boolean,
- value: true
- },
- duration: {
- type: Number,
- value: 0.3
- },
- zIndex: {
- type: Number,
- value: 1
- },
- swipeThreshold: {
- type: Number,
- value: 4
- },
- offsetTop: {
- type: Number,
- value: 0
- }
- },
- data: {
- tabs: [],
- lineStyle: '',
- scrollLeft: 0,
- scrollable: false,
- trackStyle: '',
- wrapStyle: '',
- position: ''
- },
- watch: {
- swipeThreshold: function swipeThreshold() {
- this.set({
- scrollable: this.child.length > this.data.swipeThreshold
- });
- },
- color: 'setLine',
- lineWidth: 'setLine',
- lineHeight: 'setLine',
- active: 'setActiveTab',
- animated: 'setTrack',
- offsetTop: 'setWrapStyle'
- },
- beforeCreate: function beforeCreate() {
- this.child = [];
- },
- mounted: function mounted() {
- var _this = this;
- this.setLine(true);
- this.setTrack();
- this.scrollIntoView();
- this.getRect('.van-tabs__wrap').then(function (rect) {
- _this.navHeight = rect.height;
- _this.observerContentScroll();
- });
- },
- destroyed: function destroyed() {
- this.createIntersectionObserver().disconnect();
- },
- methods: {
- updateTabs: function updateTabs(tabs) {
- tabs = tabs || this.data.tabs;
- this.set({
- tabs: tabs,
- scrollable: tabs.length > this.data.swipeThreshold
- });
- this.setActiveTab();
- },
- trigger: function trigger(eventName, index) {
- this.$emit(eventName, {
- index: index,
- title: this.data.tabs[index].title
- });
- },
- onTap: function onTap(event) {
- var index = event.currentTarget.dataset.index;
- if (this.data.tabs[index].disabled) {
- this.trigger('disabled', index);
- } else {
- this.trigger('click', index);
- this.setActive(index);
- }
- },
- setActive: function setActive(active) {
- if (active !== this.data.active) {
- this.trigger('change', active);
- this.set({ active: active });
- this.setActiveTab();
- }
- },
- setLine: function setLine(skipTransition) {
- var _this = this;
- if (this.data.type !== 'line') {
- return;
- }
- var _a = this.data,
- color = _a.color,
- active = _a.active,
- duration = _a.duration,
- lineWidth = _a.lineWidth,
- lineHeight = _a.lineHeight;
- this.getRect('.van-tab', true).then(function (rects) {
- var rect = rects[active];
- var width = lineWidth !== -1 ? lineWidth : rect.width / 2;
- var height = lineHeight !== -1 ? "height: " + lineHeight + "px;" : '';
- var left = rects.slice(0, active).reduce(function (prev, curr) {
- return prev + curr.width;
- }, 0);
- left += (rect.width - width) / 2;
- var transition = skipTransition ? '' : "transition-duration: " + duration + "s; -webkit-transition-duration: " + duration + "s;";
- _this.set({
- lineStyle: "\n " + height + "\n width: " + width + "px;\n background-color: " + color + ";\n -webkit-transform: translateX(" + left + "px);\n transform: translateX(" + left + "px);\n " + transition + "\n "
- });
- });
- },
- setTrack: function setTrack() {
- var _this = this;
- var _a = this.data,
- animated = _a.animated,
- active = _a.active,
- duration = _a.duration;
- if (!animated) return '';
- this.getRect('.van-tabs__content').then(function (rect) {
- var width = rect.width;
- _this.set({
- trackStyle: "\n width: " + width * _this.child.length + "px;\n left: " + -1 * active * width + "px;\n transition: left " + duration + "s;\n display: -webkit-box;\n display: flex;\n "
- });
- var props = { width: width, animated: animated };
- _this.child.forEach(function (item) {
- item.set(props);
- });
- });
- },
- setActiveTab: function setActiveTab() {
- var _this = this;
- this.child.forEach(function (item, index) {
- var data = {
- active: index === _this.data.active
- };
- if (data.active) {
- data.inited = true;
- }
- if (data.active !== item.data.active) {
- item.set(data);
- }
- });
- this.set({}, function () {
- _this.setLine();
- _this.setTrack();
- _this.scrollIntoView();
- });
- },
- // scroll active tab into view
- scrollIntoView: function scrollIntoView() {
- var _this = this;
- var _a = this.data,
- active = _a.active,
- scrollable = _a.scrollable;
- if (!scrollable) {
- return;
- }
- Promise.all([this.getRect('.van-tab', true), this.getRect('.van-tabs__nav')]).then(function (_a) {
- var tabRects = _a[0],
- navRect = _a[1];
- var tabRect = tabRects[active];
- var offsetLeft = tabRects.slice(0, active).reduce(function (prev, curr) {
- return prev + curr.width;
- }, 0);
- _this.set({
- scrollLeft: offsetLeft - (navRect.width - tabRect.width) / 2
- });
- });
- },
- onTouchStart: function onTouchStart(event) {
- if (!this.data.swipeable) return;
- this.touchStart(event);
- },
- onTouchMove: function onTouchMove(event) {
- if (!this.data.swipeable) return;
- this.touchMove(event);
- },
- // watch swipe touch end
- onTouchEnd: function onTouchEnd() {
- if (!this.data.swipeable) return;
- var _a = this.data,
- active = _a.active,
- tabs = _a.tabs;
- var _b = this,
- direction = _b.direction,
- deltaX = _b.deltaX,
- offsetX = _b.offsetX;
- var minSwipeDistance = 50;
- if (direction === 'horizontal' && offsetX >= minSwipeDistance) {
- if (deltaX > 0 && active !== 0) {
- this.setActive(active - 1);
- } else if (deltaX < 0 && active !== tabs.length - 1) {
- this.setActive(active + 1);
- }
- }
- },
- setWrapStyle: function setWrapStyle() {
- var _a = this.data,
- offsetTop = _a.offsetTop,
- position = _a.position;
- var wrapStyle;
- switch (position) {
- case 'top':
- wrapStyle = "\n top: " + offsetTop + "px;\n position: fixed;\n ";
- break;
- case 'bottom':
- wrapStyle = "\n top: auto;\n bottom: 0;\n ";
- break;
- default:
- wrapStyle = '';
- }
- // cut down `set`
- if (wrapStyle === this.data.wrapStyle) return;
- this.set({ wrapStyle: wrapStyle });
- },
- observerContentScroll: function observerContentScroll() {
- var _this = this;
- if (!this.data.sticky) {
- return;
- }
- var offsetTop = this.data.offsetTop;
- var windowHeight = wx.getSystemInfoSync().windowHeight;
- this.createIntersectionObserver().disconnect();
- this.createIntersectionObserver().relativeToViewport({ top: -(this.navHeight + offsetTop) }).observe('.van-tabs', function (res) {
- var top = res.boundingClientRect.top;
- if (top > offsetTop) {
- return;
- }
- var position = res.intersectionRatio > 0 ? 'top' : 'bottom';
- _this.$emit('scroll', {
- scrollTop: top + offsetTop,
- isFixed: position === 'top'
- });
- _this.setPosition(position);
- });
- this.createIntersectionObserver().relativeToViewport({ bottom: -(windowHeight - 1 - offsetTop) }).observe('.van-tabs', function (res) {
- var _a = res.boundingClientRect,
- top = _a.top,
- bottom = _a.bottom;
- if (bottom < _this.navHeight) {
- return;
- }
- var position = res.intersectionRatio > 0 ? 'top' : '';
- _this.$emit('scroll', {
- scrollTop: top + offsetTop,
- isFixed: position === 'top'
- });
- _this.setPosition(position);
- });
- },
- setPosition: function setPosition(position) {
- var _this = this;
- if (position !== this.data.position) {
- this.set({ position: position }).then(function () {
- _this.setWrapStyle();
- });
- }
- }
- }
- });
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIk9iamVjdCIsInZhbHVlIiwiY29tcG9uZW50XzEiLCJyZXF1aXJlIiwidG91Y2hfMSIsIm1peGlucyIsImNsYXNzZXMiLCJyZWxhdGlvbiIsIm5hbWUiLCJ0eXBlIiwibGlua2VkIiwiY2hpbGQiLCJ1bmxpbmtlZCIsImluZGV4IiwidGFicyIsInByb3BzIiwiY29sb3IiLCJzdGlja3kiLCJhbmltYXRlZCIsInN3aXBlYWJsZSIsImxpbmVXaWR0aCIsImxpbmVIZWlnaHQiLCJhY3RpdmUiLCJib3JkZXIiLCJkdXJhdGlvbiIsInpJbmRleCIsInN3aXBlVGhyZXNob2xkIiwib2Zmc2V0VG9wIiwiZGF0YSIsImxpbmVTdHlsZSIsInNjcm9sbExlZnQiLCJzY3JvbGxhYmxlIiwidHJhY2tTdHlsZSIsIndyYXBTdHlsZSIsInBvc2l0aW9uIiwid2F0Y2giLCJiZWZvcmVDcmVhdGUiLCJtb3VudGVkIiwiX3RoaXMiLCJyZWN0IiwiZGVzdHJveWVkIiwibWV0aG9kcyIsInVwZGF0ZVRhYnMiLCJ0cmlnZ2VyIiwidGl0bGUiLCJvblRhcCIsImV2ZW50Iiwic2V0QWN0aXZlIiwic2V0TGluZSIsIl9hIiwicmVjdHMiLCJ3aWR0aCIsImhlaWdodCIsImxlZnQiLCJwcmV2IiwiY3VyciIsInRyYW5zaXRpb24iLCJza2lwVHJhbnNpdGlvbiIsInNldFRyYWNrIiwiaXRlbSIsInNldEFjdGl2ZVRhYiIsInNjcm9sbEludG9WaWV3IiwiUHJvbWlzZSIsInRhYlJlY3RzIiwibmF2UmVjdCIsInRhYlJlY3QiLCJvZmZzZXRMZWZ0Iiwib25Ub3VjaFN0YXJ0Iiwib25Ub3VjaE1vdmUiLCJvblRvdWNoRW5kIiwiX2IiLCJkaXJlY3Rpb24iLCJkZWx0YVgiLCJvZmZzZXRYIiwibWluU3dpcGVEaXN0YW5jZSIsInNldFdyYXBTdHlsZSIsIm9ic2VydmVyQ29udGVudFNjcm9sbCIsIndpbmRvd0hlaWdodCIsInd4IiwidG9wIiwicmVzIiwic2Ny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YUFBQTtBQWhMQyxTQUFBO0FBK0xMOEMscUJBQWEsU0FBQSxXQUFBLENBQUEsUUFBQSxFQUFvQjtBQUM3QixnQkFBSTlDLFFBQUosSUFBQTtBQUNBLGdCQUFJSixhQUFhLEtBQUEsSUFBQSxDQUFqQixRQUFBLEVBQXFDO0FBQ2pDLHFCQUFBLEdBQUEsQ0FBUyxFQUFFQSxVQUFYLFFBQVMsRUFBVCxFQUFBLElBQUEsQ0FBc0MsWUFBWTtBQUM5Q0ksMEJBQUFBLFlBQUFBO0FBREosaUJBQUE7QUFHSDtBQUNKO0FBdE1JO0FBbEdhLENBQTFCcEMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBjb21wb25lbnRfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vY29tcG9uZW50XCIpO1xudmFyIHRvdWNoXzEgPSByZXF1aXJlKFwiLi4vbWl4aW5zL3RvdWNoXCIpO1xuY29tcG9uZW50XzEuVmFudENvbXBvbmVudCh7XG4gICAgbWl4aW5zOiBbdG91Y2hfMS50b3VjaF0sXG4gICAgY2xhc3NlczogWyduYXYtY2xhc3MnLCAndGFiLWNsYXNzJywgJ3RhYi1hY3RpdmUtY2xhc3MnLCAnbGluZS1jbGFzcyddLFxuICAgIHJlbGF0aW9uOiB7XG4gICAgICAgIG5hbWU6ICd0YWInLFxuICAgICAgICB0eXBlOiAnZGVzY2VuZGFudCcsXG4gICAgICAgIGxpbmtlZDogZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUYWJzKHRoaXMuZGF0YS50YWJzLmNvbmNhdChjaGlsZC5kYXRhKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHVubGlua2VkOiBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuY2hpbGQuaW5kZXhPZihjaGlsZCk7XG4gICAgICAgICAgICB2YXIgdGFicyA9IHRoaXMuZGF0YS50YWJzO1xuICAgICAgICAgICAgdGFicy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5jaGlsZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUYWJzKHRhYnMpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBwcm9wczoge1xuICAgICAgICBjb2xvcjogU3RyaW5nLFxuICAgICAgICBzdGlja3k6IEJvb2xlYW4sXG4gICAgICAgIGFuaW1hdGVkOiBCb29sZWFuLFxuICAgICAgICBzd2lwZWFibGU6IEJvb2xlYW4sXG4gICAgICAgIGxpbmVXaWR0aDoge1xuICAgICAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICAgICAgdmFsdWU6IC0xXG4gICAgICAgIH0sXG4gICAgICAgIGxpbmVIZWlnaHQ6IHtcbiAgICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgICAgIHZhbHVlOiAtMVxuICAgICAgICB9LFxuICAgICAgICBhY3RpdmU6IHtcbiAgICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIHZhbHVlOiAnbGluZSdcbiAgICAgICAgfSxcbiAgICAgICAgYm9yZGVyOiB7XG4gICAgICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgZHVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgICAgIHZhbHVlOiAwLjNcbiAgICAgICAgfSxcbiAgICAgICAgekluZGV4OiB7XG4gICAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgICAgICB2YWx1ZTogMVxuICAgICAgICB9LFxuICAgICAgICBzd2lwZVRocmVzaG9sZDoge1xuICAgICAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICAgICAgdmFsdWU6IDRcbiAgICAgICAgfSxcbiAgICAgICAgb2Zmc2V0VG9wOiB7XG4gICAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgICAgICB2YWx1ZTogMFxuICAgICAgICB9XG4gICAgfSxcbiAgICBkYXRhOiB7XG4gICAgICAgIHRhYnM6IFtdLFxuICAgICAgICBsaW5lU3R5bGU6ICcnLFxuICAgICAgICBzY3JvbGxMZWZ0OiAwLFxuICAgICAgICBzY3JvbGxhYmxlOiBmYWxzZSxcbiAgICAgICAgdHJhY2tTdHlsZTogJycsXG4gICAgICAgIHdyYXBTdHlsZTogJycsXG4gICAgICAgIHBvc2l0aW9uOiAnJ1xuICAgIH0sXG4gICAgd2F0Y2g6IHtcbiAgICAgICAgc3dpcGVUaHJlc2hvbGQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgICAgICAgICBzY3JvbGxhYmxlOiB0aGlzLmNoaWxkLmxlbmd0aCA+IHRoaXMuZGF0YS5zd2lwZVRocmVzaG9sZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbG9yOiAnc2V0TGluZScsXG4gICAgICAgIGxpbmVXaWR0aDogJ3NldExpbmUnLFxuICAgICAgICBsaW5lSGVpZ2h0OiAnc2V0TGluZScsXG4gICAgICAgIGFjdGl2ZTogJ3NldEFjdGl2ZVRhYicsXG4gICAgICAgIGFuaW1hdGVkOiAnc2V0VHJhY2snLFxuICAgICAgICBvZmZzZXRUb3A6ICdzZXRXcmFwU3R5bGUnXG4gICAgfSxcbiAgICBiZWZvcmVDcmVhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jaGlsZCA9IFtdO1xuICAgIH0sXG4gICAgbW91bnRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnNldExpbmUodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0VHJhY2soKTtcbiAgICAgICAgdGhpcy5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICB0aGlzLmdldFJlY3QoJy52YW4tdGFic19fd3JhcCcpLnRoZW4oZnVuY3Rpb24gKHJlY3QpIHtcbiAgICAgICAgICAgIF90aGlzLm5hdkhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICAgICAgICAgICAgX3RoaXMub2JzZXJ2ZXJDb250ZW50U2Nyb2xsKCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgZGVzdHJveWVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKS5kaXNjb25uZWN0KCk7XG4gICAgfSxcbiAgICBtZXRob2RzOiB7XG4gICAgICAgIHVwZGF0ZVRhYnM6IGZ1bmN0aW9uICh0YWJzKSB7XG4gICAgICAgICAgICB0YWJzID0gdGFicyB8fCB0aGlzLmRhdGEudGFicztcbiAgICAgICAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgICAgICAgICB0YWJzOiB0YWJzLFxuICAgICAgICAgICAgICAgIHNjcm9sbGFibGU6IHRhYnMubGVuZ3RoID4gdGhpcy5kYXRhLnN3aXBlVGhyZXNob2xkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlVGFiKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHRyaWdnZXI6IGZ1bmN0aW9uIChldmVudE5hbWUsIGluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLiRlbWl0KGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5kYXRhLnRhYnNbaW5kZXhdLnRpdGxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25UYXA6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmluZGV4O1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS50YWJzW2luZGV4XS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcignZGlzYWJsZWQnLCBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2NsaWNrJywgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlKGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0QWN0aXZlOiBmdW5jdGlvbiAoYWN0aXZlKSB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlICE9PSB0aGlzLmRhdGEuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2UnLCBhY3RpdmUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KHsgYWN0aXZlOiBhY3RpdmUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVUYWIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0TGluZTogZnVuY3Rpb24gKHNraXBUcmFuc2l0aW9uKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS50eXBlICE9PSAnbGluZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLmRhdGEsIGNvbG9yID0gX2EuY29sb3IsIGFjdGl2ZSA9IF9hLmFjdGl2ZSwgZHVyYXRpb24gPSBfYS5kdXJhdGlvbiwgbGluZVdpZHRoID0gX2EubGluZVdpZHRoLCBsaW5lSGVpZ2h0ID0gX2EubGluZUhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuZ2V0UmVjdCgnLnZhbi10YWInLCB0cnVlKS50aGVuKGZ1bmN0aW9uIChyZWN0cykge1xuICAgICAgICAgICAgICAgIHZhciByZWN0ID0gcmVjdHNbYWN0aXZlXTtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBsaW5lV2lkdGggIT09IC0xID8gbGluZVdpZHRoIDogcmVjdC53aWR0aCAvIDI7XG4gICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IGxpbmVIZWlnaHQgIT09IC0xID8gXCJoZWlnaHQ6IFwiICsgbGluZUhlaWdodCArIFwicHg7XCIgOiAnJztcbiAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IHJlY3RzXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCBhY3RpdmUpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIpIHsgcmV0dXJuIHByZXYgKyBjdXJyLndpZHRoOyB9LCAwKTtcbiAgICAgICAgICAgICAgICBsZWZ0ICs9IChyZWN0LndpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNpdGlvbiA9IHNraXBUcmFuc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICAgICAgOiBcInRyYW5zaXRpb24tZHVyYXRpb246IFwiICsgZHVyYXRpb24gKyBcInM7IC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogXCIgKyBkdXJhdGlvbiArIFwicztcIjtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IFwiXFxuICAgICAgICAgICAgXCIgKyBoZWlnaHQgKyBcIlxcbiAgICAgICAgICAgIHdpZHRoOiBcIiArIHdpZHRoICsgXCJweDtcXG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBcIiArIGNvbG9yICsgXCI7XFxuICAgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoXCIgKyBsZWZ0ICsgXCJweCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKFwiICsgbGVmdCArIFwicHgpO1xcbiAgICAgICAgICAgIFwiICsgdHJhbnNpdGlvbiArIFwiXFxuICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0VHJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLmRhdGEsIGFuaW1hdGVkID0gX2EuYW5pbWF0ZWQsIGFjdGl2ZSA9IF9hLmFjdGl2ZSwgZHVyYXRpb24gPSBfYS5kdXJhdGlvbjtcbiAgICAgICAgICAgIGlmICghYW5pbWF0ZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgdGhpcy5nZXRSZWN0KCcudmFuLXRhYnNfX2NvbnRlbnQnKS50aGVuKGZ1bmN0aW9uIChyZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gcmVjdC53aWR0aDtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICB0cmFja1N0eWxlOiBcIlxcbiAgICAgICAgICAgIHdpZHRoOiBcIiArIHdpZHRoICogX3RoaXMuY2hpbGQubGVuZ3RoICsgXCJweDtcXG4gICAgICAgICAgICBsZWZ0OiBcIiArIC0xICogYWN0aXZlICogd2lkdGggKyBcInB4O1xcbiAgICAgICAgICAgIHRyYW5zaXRpb246IGxlZnQgXCIgKyBkdXJhdGlvbiArIFwicztcXG4gICAgICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHsgd2lkdGg6IHdpZHRoLCBhbmltYXRlZDogYW5pbWF0ZWQgfTtcbiAgICAgICAgICAgICAgICBfdGhpcy5jaGlsZC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KHByb3BzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzZXRBY3RpdmVUYWI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmNoaWxkLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogaW5kZXggPT09IF90aGlzLmRhdGEuYWN0aXZlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5pbml0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hY3RpdmUgIT09IGl0ZW0uZGF0YS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXQoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNldCh7fSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLnNldExpbmUoKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRUcmFjaygpO1xuICAgICAgICAgICAgICAgIF90aGlzLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gc2Nyb2xsIGFjdGl2ZSB0YWIgaW50byB2aWV3XG4gICAgICAgIHNjcm9sbEludG9WaWV3OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5kYXRhLCBhY3RpdmUgPSBfYS5hY3RpdmUsIHNjcm9sbGFibGUgPSBfYS5zY3JvbGxhYmxlO1xuICAgICAgICAgICAgaWYgKCFzY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVjdCgnLnZhbi10YWInLCB0cnVlKSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlY3QoJy52YW4tdGFic19fbmF2JylcbiAgICAgICAgICAgIF0pLnRoZW4oZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhYlJlY3RzID0gX2FbMF0sIG5hdlJlY3QgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICB2YXIgdGFiUmVjdCA9IHRhYlJlY3RzW2FjdGl2ZV07XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldExlZnQgPSB0YWJSZWN0c1xuICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgYWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXJyKSB7IHJldHVybiBwcmV2ICsgY3Vyci53aWR0aDsgfSwgMCk7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogb2Zmc2V0TGVmdCAtIChuYXZSZWN0LndpZHRoIC0gdGFiUmVjdC53aWR0aCkgLyAyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ub3VjaFN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhLnN3aXBlYWJsZSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnRvdWNoU3RhcnQoZXZlbnQpO1xuICAgICAgICB9LFxuICAgICAgICBvblRvdWNoTW92ZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5zd2lwZWFibGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy50b3VjaE1vdmUoZXZlbnQpO1xuICAgICAgICB9LFxuICAgICAgICAvLyB3YXRjaCBzd2lwZSB0b3VjaCBlbmRcbiAgICAgICAgb25Ub3VjaEVuZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEuc3dpcGVhYmxlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMuZGF0YSwgYWN0aXZlID0gX2EuYWN0aXZlLCB0YWJzID0gX2EudGFicztcbiAgICAgICAgICAgIHZhciBfYiA9IHRoaXMsIGRpcmVjdGlvbiA9IF9iLmRpcmVjdGlvbiwgZGVsdGFYID0gX2IuZGVsdGFYLCBvZmZzZXRYID0gX2Iub2Zmc2V0WDtcbiAgICAgICAgICAgIHZhciBtaW5Td2lwZURpc3RhbmNlID0gNTA7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgJiYgb2Zmc2V0WCA+PSBtaW5Td2lwZURpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlbHRhWCA+IDAgJiYgYWN0aXZlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlKGFjdGl2ZSAtIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWx0YVggPCAwICYmIGFjdGl2ZSAhPT0gdGFicy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlKGFjdGl2ZSArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0V3JhcFN0eWxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLmRhdGEsIG9mZnNldFRvcCA9IF9hLm9mZnNldFRvcCwgcG9zaXRpb24gPSBfYS5wb3NpdGlvbjtcbiAgICAgICAgICAgIHZhciB3cmFwU3R5bGU7XG4gICAgICAgICAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgICAgICAgICAgd3JhcFN0eWxlID0gXCJcXG4gICAgICAgICAgICB0b3A6IFwiICsgb2Zmc2V0VG9wICsgXCJweDtcXG4gICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgICAgICAgIFwiO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgICAgICAgICB3cmFwU3R5bGUgPSBcIlxcbiAgICAgICAgICAgIHRvcDogYXV0bztcXG4gICAgICAgICAgICBib3R0b206IDA7XFxuICAgICAgICAgIFwiO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB3cmFwU3R5bGUgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGN1dCBkb3duIGBzZXRgXG4gICAgICAgICAgICBpZiAod3JhcFN0eWxlID09PSB0aGlzLmRhdGEud3JhcFN0eWxlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuc2V0KHsgd3JhcFN0eWxlOiB3cmFwU3R5bGUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9ic2VydmVyQ29udGVudFNjcm9sbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhLnN0aWNreSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvZmZzZXRUb3AgPSB0aGlzLmRhdGEub2Zmc2V0VG9wO1xuICAgICAgICAgICAgdmFyIHdpbmRvd0hlaWdodCA9IHd4LmdldFN5c3RlbUluZm9TeW5jKCkud2luZG93SGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcigpLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKVxuICAgICAgICAgICAgICAgIC5yZWxhdGl2ZVRvVmlld3BvcnQoeyB0b3A6IC0odGhpcy5uYXZIZWlnaHQgKyBvZmZzZXRUb3ApIH0pXG4gICAgICAgICAgICAgICAgLm9ic2VydmUoJy52YW4tdGFicycsIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9wID0gcmVzLmJvdW5kaW5nQ2xpZW50UmVjdC50b3A7XG4gICAgICAgICAgICAgICAgaWYgKHRvcCA+IG9mZnNldFRvcCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBwb3NpdGlvbiA9IHJlcy5pbnRlcnNlY3Rpb25SYXRpbyA+IDAgPyAndG9wJyA6ICdib3R0b20nO1xuICAgICAgICAgICAgICAgIF90aGlzLiRlbWl0KCdzY3JvbGwnLCB7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogdG9wICsgb2Zmc2V0VG9wLFxuICAgICAgICAgICAgICAgICAgICBpc0ZpeGVkOiBwb3NpdGlvbiA9PT0gJ3RvcCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKVxuICAgICAgICAgICAgICAgIC5yZWxhdGl2ZVRvVmlld3BvcnQoeyBib3R0b206IC0od2luZG93SGVpZ2h0IC0gMSAtIG9mZnNldFRvcCkgfSlcbiAgICAgICAgICAgICAgICAub2JzZXJ2ZSgnLnZhbi10YWJzJywgZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IHJlcy5ib3VuZGluZ0NsaWVudFJlY3QsIHRvcCA9IF9hLnRvcCwgYm90dG9tID0gX2EuYm90dG9tO1xuICAgICAgICAgICAgICAgIGlmIChib3R0b20gPCBfdGhpcy5uYXZIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSByZXMuaW50ZXJzZWN0aW9uUmF0aW8gPiAwID8gJ3RvcCcgOiAnJztcbiAgICAgICAgICAgICAgICBfdGhpcy4kZW1pdCgnc2Nyb2xsJywge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IHRvcCArIG9mZnNldFRvcCxcbiAgICAgICAgICAgICAgICAgICAgaXNGaXhlZDogcG9zaXRpb24gPT09ICd0b3AnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2V0UG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFBvc2l0aW9uOiBmdW5jdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICBpZiAocG9zaXRpb24gIT09IHRoaXMuZGF0YS5wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KHsgcG9zaXRpb246IHBvc2l0aW9uIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5zZXRXcmFwU3R5bGUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIl0sImZpbGUiOiJpbmRleC5qcyJ9
|