UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

20,885 lines 1.95 MB
import { Component, Input, HostBinding, NgModule, ViewEncapsulation, TemplateRef, ElementRef, Renderer2, Output, EventEmitter, ViewChild, forwardRef, InjectionToken, Inject, Injectable, Optional, SkipSelf, ApplicationRef, ComponentFactoryResolver, NgZone, HostListener, ContentChildren, ChangeDetectorRef, Directive, ViewContainerRef, Injector, Pipe, Compiler } from '@angular/core';
import { CommonModule, NgSwitch, NgSwitchCase } from '@angular/common';
import { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
import { BehaviorSubject, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { trigger, state, animate, transition, style } from '@angular/animations';
import { coerceBooleanProperty } from '@angular/cdk/coercion';
import { Overlay, OverlayConfig, OverlayModule } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { DomSanitizer } from '@angular/platform-browser';
import { ObserversModule } from '@angular/cdk/observers';

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ActivityIndicator {
    constructor() {
        this.prefixCls = 'am-activity-indicator';
        this.spinnerClass = {};
        this._size = 'small';
        this._toast = false;
        this._animating = true;
        this.clsActIndicator = true;
    }
    /**
     * @return {?}
     */
    get animating() {
        return this._animating;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set animating(v) {
        this._animating = v;
        this.setClass();
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set size(v) {
        this._size = v;
        this.setClass();
    }
    /**
     * @return {?}
     */
    get toast() {
        return this._toast;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set toast(v) {
        this._toast = v;
        this.setClass();
    }
    /**
     * @return {?}
     */
    get text() {
        return this._text;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set text(v) {
        this._text = v;
    }
    /**
     * @return {?}
     */
    setClass() {
        if (this._animating) {
            this.clsActIndicator = true;
            this.clsActIndicatorToast = !!this._toast;
            this.clsActIndicatorLg = this._size === 'large';
            this.clsActIndicatorSm = this._size === 'small';
            this.spinnerClass = {
                [`${this.prefixCls}-spinner`]: true,
                [`${this.prefixCls}-spinner-lg`]: !!this._toast || this._size === 'large'
            };
        }
        else {
            this.clsActIndicator = false;
            this.clsActIndicatorLg = false;
            this.clsActIndicatorSm = false;
            this.clsActIndicatorToast = false;
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.setClass();
    }
}
ActivityIndicator.decorators = [
    { type: Component, args: [{
                selector: 'ActivityIndicator , nzm-ctivity-indicator',
                template: "<div *ngIf=\"animating && toast && text && text.length>0\">\n  <div class=\"{{prefixCls}}-content\">\n    <span [ngClass]=\"spinnerClass\" aria-hidden=\"'true'\"></span>\n    <span class=\"{{prefixCls}}-toast\">{{text}}</span>\n  </div>\n</div>\n<div *ngIf=\"animating && toast && !text\">\n  <div class=\"{{prefixCls}}-content\">\n    <span [ngClass]=\"spinnerClass\" aria-label=\"'Loading'\"></span>\n  </div>\n</div>\n<div *ngIf=\"animating && !toast && text && text.length>0\">\n  <span [ngClass]=\"spinnerClass\" aria-hidden=\"true\"></span>\n  <span class=\"{{prefixCls}}-tip\">{{text}}</span>\n</div>\n<div *ngIf=\"animating &&! toast && !text\">\n  <span [ngClass]=\"spinnerClass\" aria-label=\"'loading'\"></span>\n</div>\n"
            }] }
];
/** @nocollapse */
ActivityIndicator.ctorParameters = () => [];
ActivityIndicator.propDecorators = {
    animating: [{ type: Input }],
    size: [{ type: Input }],
    toast: [{ type: Input }],
    text: [{ type: Input }],
    clsActIndicator: [{ type: HostBinding, args: ['class.am-activity-indicator',] }],
    clsActIndicatorToast: [{ type: HostBinding, args: ['class.am-activity-indicator-toast',] }],
    clsActIndicatorLg: [{ type: HostBinding, args: ['class.am-activity-indicator-lg',] }],
    clsActIndicatorSm: [{ type: HostBinding, args: ['class.am-activity-indicator-sm',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ActivityIndicatorModule {
}
ActivityIndicatorModule.decorators = [
    { type: NgModule, args: [{
                exports: [ActivityIndicator],
                declarations: [ActivityIndicator],
                imports: [CommonModule, FormsModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Card {
    constructor() {
        this.full = false;
        this.cardWrapper = true;
    }
    /**
     * @return {?}
     */
    get cardFull() {
        return this.full;
    }
}
Card.decorators = [
    { type: Component, args: [{
                selector: 'Card, nzm-card',
                template: "<ng-content></ng-content>",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
Card.ctorParameters = () => [];
Card.propDecorators = {
    full: [{ type: Input }],
    cardWrapper: [{ type: HostBinding, args: ['class.am-card',] }],
    cardFull: [{ type: HostBinding, args: ['class.am-card-full',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CardHeader {
    constructor() {
        this.prefixCls = 'am-card-header';
        this.thumb = null;
        this.thumbStyle = null;
        this.title = null;
        this.extra = null;
        this.cardBodyWrapper = true;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    isTemplateRef(value) {
        return value instanceof TemplateRef;
    }
}
CardHeader.decorators = [
    { type: Component, args: [{
                selector: 'CardHeader, nzm-card-header',
                template: "<div class=\"{{prefixCls}}-content\">\n  <img *ngIf='thumb && !isTemplateRef(thumb)' src=\"{{thumb}}\" [ngStyle]=\"thumbStyle\">\n  <ng-container *ngIf=\"thumb && isTemplateRef(thumb)\" [ngTemplateOutlet]=\"thumb\"></ng-container>\n  <ng-container *ngIf=\"!isTemplateRef(title);else titleTemplate\">{{title}}</ng-container>\n</div>\n<div *ngIf=\"extra\" class=\"{{prefixCls}}-extra\">\n  <ng-container *ngIf=\"!isTemplateRef(extra);else extraTemplate\">{{extra}}</ng-container>\n</div>\n<ng-template #titleTemplate>\n  <ng-template [ngTemplateOutlet]=\"title\"></ng-template>\n</ng-template>\n<ng-template #extraTemplate>\n  <ng-template [ngTemplateOutlet]=\"extra\"></ng-template>\n</ng-template>",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
CardHeader.ctorParameters = () => [];
CardHeader.propDecorators = {
    thumb: [{ type: Input }],
    thumbStyle: [{ type: Input }],
    title: [{ type: Input }],
    extra: [{ type: Input }],
    cardBodyWrapper: [{ type: HostBinding, args: ['class.am-card-header',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CardBody {
    constructor() {
        this.cardBodyWrapper = true;
    }
}
CardBody.decorators = [
    { type: Component, args: [{
                selector: 'CardBody, nzm-card-body',
                template: `<ng-content></ng-content>`,
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
CardBody.ctorParameters = () => [];
CardBody.propDecorators = {
    cardBodyWrapper: [{ type: HostBinding, args: ['class.am-card-body',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CardFooter {
    constructor() {
        this.prefixCls = 'am-card-footer';
        this.content = null;
        this.extra = null;
        this.cardFooterWrapper = true;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    isTemplateRef(value) {
        return value instanceof TemplateRef;
    }
}
CardFooter.decorators = [
    { type: Component, args: [{
                selector: 'CardFooter, nzm-card-footer',
                template: "<div class=\"{{prefixCls}}-content\">\n  <ng-container *ngIf=\"!isTemplateRef(content);else contentTemplate\">{{content}}</ng-container>\n</div>\n<div *ngIf=\"extra\" class=\"{{prefixCls}}-extra\">\n  <ng-container *ngIf=\"!isTemplateRef(extra);else extraTemplate\">{{extra}}</ng-container>\n</div>\n<ng-template #contentTemplate>\n  <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n</ng-template>\n<ng-template #extraTemplate>\n  <ng-template [ngTemplateOutlet]=\"extra\"></ng-template>\n</ng-template>",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
CardFooter.ctorParameters = () => [];
CardFooter.propDecorators = {
    content: [{ type: Input }],
    extra: [{ type: Input }],
    cardFooterWrapper: [{ type: HostBinding, args: ['class.am-card-footer',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CardModule {
}
CardModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule],
                declarations: [Card, CardHeader, CardBody, CardFooter],
                exports: [Card, CardHeader, CardBody, CardFooter]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Badge {
    /**
     * @param {?} _ref
     * @param {?} render
     */
    constructor(_ref, render) {
        this._ref = _ref;
        this.render = render;
        this.prefixCls = 'am-badge';
        this.scrollNumberCls = {};
        this.style = {};
        this._size = 'small';
        this._dot = false;
        this._hot = false;
        this._corner = false;
        this._children = false;
        this._overflowCount = 99;
        this.clsBadge = true;
        this.clsBadgeWrp = !this._children;
        this.clsBadgeCornerWrp = this._corner;
        this.clsBadgeHot = !!this._hot;
        this.clsBadgeCornerWrpLg = this._corner && this._size === 'large';
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set size(v) {
        this._size = v;
        this.setCls();
    }
    /**
     * @return {?}
     */
    get text() {
        return this._text;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set text(v) {
        this._text = v;
        this.setCls();
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set corner(v) {
        this._corner = v;
        this.setCls();
    }
    /**
     * @return {?}
     */
    get dot() {
        return this._dot;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set dot(v) {
        this._dot = v;
        if (this._dot) {
            this._text = '';
        }
        this.setCls();
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set overflowCount(v) {
        this._overflowCount = v;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set hot(v) {
        this._hot = v;
        this.setCls();
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set setStyle(v) {
        this.style = v;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set className(v) {
        this._setClass = v;
        /** @type {?} */
        const clsArr = this._setClass.split(' ');
        clsArr.forEach(cls => {
            this.render.addClass(this._ref.nativeElement, cls);
        });
    }
    /**
     * @return {?}
     */
    setCls() {
        this.scrollNumberCls = {
            [`${this.prefixCls}-dot`]: this._dot,
            [`${this.prefixCls}-dot-large`]: this._dot && this._size === 'large',
            [`${this.prefixCls}-text`]: !this._dot && !this._corner,
            [`${this.prefixCls}-corner`]: this._corner,
            [`${this.prefixCls}-corner-large`]: this._corner && this._size === 'large'
        };
        this.clsBadgeWrp = !this._children;
        this.clsBadgeCornerWrp = this._corner;
        this.clsBadgeHot = !!this._hot;
        this.clsBadgeCornerWrpLg = this._corner && this._size === 'large';
    }
    /**
     * @return {?}
     */
    ngOnChanges() {
        if (typeof this._text === 'number' && this._text > this._overflowCount) {
            this._text = this._overflowCount + '+';
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.setCls();
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        setTimeout(() => {
            if (this._ref.nativeElement.children.length > 1) {
                this._children = true;
                this.setCls();
            }
        }, 10);
    }
}
Badge.decorators = [
    { type: Component, args: [{
                selector: 'Badge, nzm-badge',
                template: "<ng-content></ng-content>\n<sup *ngIf=\"dot || text\"\n    [ngClass]=\"scrollNumberCls\"\n    [ngStyle]=\"style\">{{text}}\n</sup>\n"
            }] }
];
/** @nocollapse */
Badge.ctorParameters = () => [
    { type: ElementRef },
    { type: Renderer2 }
];
Badge.propDecorators = {
    size: [{ type: Input }],
    text: [{ type: Input }],
    corner: [{ type: Input }],
    dot: [{ type: Input }],
    overflowCount: [{ type: Input }],
    hot: [{ type: Input }],
    setStyle: [{ type: Input }],
    className: [{ type: Input }],
    clsBadge: [{ type: HostBinding, args: ['class.am-badge',] }],
    clsBadgeWrp: [{ type: HostBinding, args: ['class.am-badge-not-a-wrapper',] }],
    clsBadgeCornerWrp: [{ type: HostBinding, args: ['class.am-badge-corner-wrapper',] }],
    clsBadgeHot: [{ type: HostBinding, args: ['class.am-badge-hot',] }],
    clsBadgeCornerWrpLg: [{ type: HostBinding, args: ['class.am-badge-corner-wrapper-large',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class BadgeModule {
}
BadgeModule.decorators = [
    { type: NgModule, args: [{
                exports: [Badge],
                declarations: [Badge],
                imports: [CommonModule, FormsModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class InputItem {
    /**
     * @param {?} element
     * @param {?} render
     */
    constructor(element, render) {
        this.element = element;
        this.render = render;
        this.prefixCls = 'am-input';
        this.setFocus = {};
        this.pattern = '';
        this.autoFocus = false;
        this.inputType = 'text';
        this._type = 'text';
        this._defaultValue = '';
        this._placeholder = '';
        this._editable = true;
        this._disabled = false;
        this._clear = false;
        this._error = false;
        this._extra = '';
        this._labelNumber = 5;
        this._updatePlaceholder = false;
        this._prefixListCls = 'am-list';
        this._moneyKeyboardAlign = 'right';
        this._focus = false;
        this._isClear = false;
        this.onChange = new EventEmitter();
        this.onBlur = new EventEmitter();
        this.onFocus = new EventEmitter();
        this.onErrorClick = new EventEmitter();
        this.onExtraClick = new EventEmitter();
        this.clsItem = true;
        this.clsDisabled = this._disabled;
        this.clsError = this._error;
        this.clsFocus = this._focus;
        this.clsAndroid = this._focus;
        this._onChange = (_) => { };
        this._el = element.nativeElement;
    }
    /**
     * @return {?}
     */
    get type() {
        return this._type;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set type(value) {
        if (value && value.length > 0) {
            this.inputType = value;
            if (value === 'bankCard' || value === 'phone') {
                this._type = 'tel';
            }
            else if (value === 'password') {
                this._type = 'password';
            }
            else if (value === 'digit') {
                this._type = 'number';
            }
            else if (value !== 'text' && value !== 'number') {
                this._type = value;
            }
            if (value === 'number') {
                this.pattern = '[0-9]*';
            }
        }
    }
    /**
     * @return {?}
     */
    get value() {
        return this._value;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set value(v) {
        if (typeof v === undefined || v === null) {
            this._value = '';
        }
        this._value = v;
    }
    /**
     * @return {?}
     */
    get defaultValue() {
        return this._defaultValue;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set defaultValue(value) {
        this._defaultValue = value;
        this._value = this._defaultValue;
    }
    /**
     * @return {?}
     */
    get placeholder() {
        return this._placeholder;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set placeholder(value) {
        this._placeholder = value;
    }
    /**
     * @return {?}
     */
    get editable() {
        return this._editable;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set editable(value) {
        this._editable = value;
    }
    /**
     * @return {?}
     */
    get disabled() {
        return this._disabled;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        this._disabled = value;
        this.clsDisabled = value;
    }
    /**
     * @return {?}
     */
    get clear() {
        return this._clear;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set clear(value) {
        this._clear = value;
    }
    /**
     * @return {?}
     */
    get maxLength() {
        return this._maxLength;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set maxLength(value) {
        this._maxLength = value;
    }
    /**
     * @return {?}
     */
    get error() {
        return this._error;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set error(value) {
        this._error = value;
        this.clsError = value;
    }
    /**
     * @return {?}
     */
    get extra() {
        return this._extra;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set extra(value) {
        this._extra = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set labelNumber(value) {
        this._labelNumber = value;
        this.setCls();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set updatePlaceholder(value) {
        this._updatePlaceholder = value;
    }
    /**
     * @return {?}
     */
    get prefixListCls() {
        return this._prefixListCls;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set prefixListCls(value) {
        this._prefixListCls = value;
        this.render.addClass(this._el, value + '-item');
        this.render.addClass(this._el, value + '-item-middle');
    }
    /**
     * @return {?}
     */
    get name() {
        return this._name;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set name(value) {
        this._name = value;
    }
    /**
     * @return {?}
     */
    get moneyKeyboardAlign() {
        return this._moneyKeyboardAlign;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set moneyKeyboardAlign(value) {
        this._moneyKeyboardAlign = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set locale(value) {
        this._locale = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set focus(value) {
        if (value && value.focus) {
            this.autoFocus = value.focus;
            if (this._type === 'money') {
                this.setFocus = value;
            }
            else if (this.inputElementRef) {
                this._focus = true;
                this.inputElementRef.nativeElement.focus();
                this.inputFocus('');
            }
        }
    }
    /**
     * @return {?}
     */
    setCls() {
        if (this.lableRef.nativeElement.children.length > 0 ||
            (this.lableRef.nativeElement && this.lableRef.nativeElement.innerText !== '')) {
            this.labelCls = {
                [`${this.prefixCls}-label`]: true,
                [`${this.prefixCls}-label-2`]: this._labelNumber === 2,
                [`${this.prefixCls}-label-3`]: this._labelNumber === 3,
                [`${this.prefixCls}-label-4`]: this._labelNumber === 4,
                [`${this.prefixCls}-label-5`]: this._labelNumber === 5,
                [`${this.prefixCls}-label-6`]: this._labelNumber === 6,
                [`${this.prefixCls}-label-7`]: this._labelNumber === 7
            };
        }
        this.controlCls = { [`${this.prefixCls}-control`]: true };
    }
    /**
     * @param {?} e
     * @return {?}
     */
    inputChange(e) {
        /** @type {?} */
        let value = e;
        switch (this.inputType) {
            case 'text':
                break;
            case 'bankCard':
                value = value.replace(/\D/g, '').replace(/(....)(?=.)/g, '$1 ');
                break;
            case 'phone':
                value = value.replace(/\D/g, '').substring(0, 11);
                /** @type {?} */
                const valueLen = value.length;
                if (valueLen > 3 && valueLen < 8) {
                    value = `${value.substr(0, 3)} ${value.substr(3)}`;
                }
                else if (valueLen >= 8) {
                    value = `${value.substr(0, 3)} ${value.substr(3, 4)} ${value.substr(7)}`;
                }
                break;
            case 'number':
                value = value.replace(/\D/g, '');
                break;
            case 'password':
                break;
            default:
                this._value = value;
                break;
        }
        this._value = value;
        if (this._type !== 'money') {
            this.inputElementRef.nativeElement.value = this._value;
        }
        this._onChange(this._value);
        this.onChange.emit(this._value);
    }
    /**
     * @param {?} value
     * @return {?}
     */
    inputFocus(value) {
        setTimeout(() => {
            this._focus = true;
            this.clsFocus = true;
            this.clsAndroid = true;
        }, 100);
        this.onFocus.emit(value);
    }
    /**
     * @param {?} value
     * @param {?} event
     * @return {?}
     */
    inputBlur(value, event) {
        setTimeout(() => {
            if (!this._isClear) {
                this._focus = false;
                this.clsFocus = false;
                this.clsAndroid = false;
                this.onBlur.emit(value);
            }
            this._isClear = false;
        }, 100);
    }
    /**
     * @return {?}
     */
    clearInput() {
        if (this._type !== 'password' && this._updatePlaceholder) {
            this._placeholder = this._value;
        }
        this._value = '';
        this.onChange.emit('');
        this._isClear = true;
        if (this._type !== 'money') {
            this.inputElementRef.nativeElement.value = this._value;
        }
        this.inputFocus(this._value);
    }
    /**
     * @param {?} e
     * @return {?}
     */
    errorClick(e) {
        if (this.onErrorClick) {
            this.onErrorClick.emit(e);
        }
    }
    /**
     * @param {?} e
     * @return {?}
     */
    extraClick(e) {
        if (this.onExtraClick) {
            this.onExtraClick.emit(e);
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    writeValue(value) {
        if (value) {
            this._value = value;
        }
    }
    /**
     * @param {?} fn
     * @return {?}
     */
    registerOnChange(fn) {
        this._onChange = fn;
    }
    /**
     * @param {?} fn
     * @return {?}
     */
    registerOnTouched(fn) { }
    /**
     * @return {?}
     */
    ngOnChanges() {
        if (this.inputElementRef && this._type !== 'money' && this._value !== undefined) {
            this.inputElementRef.nativeElement.value = this._value;
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.setCls();
        this.render.addClass(this._el, this._prefixListCls + '-item');
        this.render.addClass(this._el, this._prefixListCls + '-item-middle');
    }
}
InputItem.decorators = [
    { type: Component, args: [{
                selector: 'InputItem, nzm-input-item',
                template: "<div class=\"{{prefixListCls}}-line\">\n  <div #lableContent [ngClass]=\"labelCls\">\n    <ng-content></ng-content>\n  </div>\n  <div [ngClass]=\"controlCls\">\n    <CustomInput *ngIf=\"type==='money'\"\n                 [value]=\"value\"\n                 [defaultValue]=\"defaultValue\"\n                 [placeholder]=\"placeholder\"\n                 [disabled]=\"disabled\"\n                 [editable]=\"editable\"\n                 [moneyKeyboardAlign]=\"moneyKeyboardAlign\"\n                 [setFocus]=\"setFocus\"\n                 [maxLength]=\"maxLength\"\n                 (onChange)=\"inputChange($event)\"\n                 (onBlur)=\"inputBlur(value)\"\n                 (onFocus)=\"inputFocus(value)\">\n    </CustomInput>\n    <div *ngIf=\"type!=='money'\">\n      <input #inputElement\n             [type]=\"type\"\n             [name]=\"name\"\n             [(ngModel)]=\"value\"\n             [defaultValue]=\"defaultValue\"\n             [placeholder]=\"placeholder\"\n             [disabled]=\"disabled\"\n             [readOnly]=\"!editable\"\n             [autofocus]=\"autoFocus\"\n             [maxlength]=\"maxLength\"\n             [pattern]=\"pattern\"\n             (ngModelChange)=\"inputChange($event)\"\n             (blur)=\"inputBlur(value , $event)\"\n             (focus)=\"inputFocus(value)\"\n             style=\"outline:none\" />\n    </div>\n  </div>\n  <div  *ngIf=\"clear && editable && !disabled && (value && value.length >0 )\"\n        class=\"{{prefixCls}}-clear\"\n        (click)=\"clearInput()\"\n  ></div>\n  <div *ngIf=\"error\"\n       class=\"{{prefixCls}}-error-extra\"\n       (click)=\"errorClick($event)\"\n  ></div>\n  <div *ngIf=\"extra!==''\"\n       class=\"{{prefixCls}}-extra\"\n       (click)=\"extraClick($event)\"\n  >{{extra}}</div>\n</div>",
                providers: [
                    {
                        provide: NG_VALUE_ACCESSOR,
                        useExisting: forwardRef(() => InputItem),
                        multi: true
                    }
                ]
            }] }
];
/** @nocollapse */
InputItem.ctorParameters = () => [
    { type: ElementRef },
    { type: Renderer2 }
];
InputItem.propDecorators = {
    lableRef: [{ type: ViewChild, args: ['lableContent',] }],
    inputElementRef: [{ type: ViewChild, args: ['inputElement',] }],
    type: [{ type: Input }],
    value: [{ type: Input }],
    defaultValue: [{ type: Input }],
    placeholder: [{ type: Input }],
    editable: [{ type: Input }],
    disabled: [{ type: Input }],
    clear: [{ type: Input }],
    maxLength: [{ type: Input }],
    error: [{ type: Input }],
    extra: [{ type: Input }],
    labelNumber: [{ type: Input }],
    updatePlaceholder: [{ type: Input }],
    prefixListCls: [{ type: Input }],
    name: [{ type: Input }],
    moneyKeyboardAlign: [{ type: Input }],
    locale: [{ type: Input }],
    focus: [{ type: Input }],
    onChange: [{ type: Output }],
    onBlur: [{ type: Output }],
    onFocus: [{ type: Output }],
    onErrorClick: [{ type: Output }],
    onExtraClick: [{ type: Output }],
    clsItem: [{ type: HostBinding, args: ['class.am-input-item',] }],
    clsDisabled: [{ type: HostBinding, args: ['class.am-input-disabled',] }],
    clsError: [{ type: HostBinding, args: ['class.am-input-error',] }],
    clsFocus: [{ type: HostBinding, args: ['class.am-input-focus',] }],
    clsAndroid: [{ type: HostBinding, args: ['class.am-input-android,',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/** @type {?} */
const LOCAL_PROVIDER_TOKEN = new InjectionToken('locale-provider-token');

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var Picker = {
    okText: '确定',
    dismissText: '取消',
    extra: '请选择',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
// import DatePickerLocale from 'rmc-date-picker/lib/locale/zh_CN';
var DatePicker = {
    okText: '确定',
    dismissText: '取消',
    extra: '请选择',
    // DatePickerLocale,
    year: '年',
    month: '月',
    day: '日',
    hour: '时',
    minute: '分',
    am: '上午',
    pm: '下午'
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
// import DatePickerLocale from 'rmc-date-picker/lib/locale/zh_CN';
var DatePickerView = {
    okText: '确定',
    dismissText: '取消',
    extra: '请选择',
    // DatePickerLocale,
    year: '年',
    month: '月',
    day: '日',
    hour: '时',
    minute: '分',
    am: '上午',
    pm: '下午'
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var Menu = {
    okText: '确定',
    cancelText: '取消',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
// 同步自 'rmc-calendar/lib/locale/zh_CN';
var defaultLocale = {
    title: '日期选择',
    today: '今天',
    month: '月',
    year: '年',
    am: '上午',
    pm: '下午',
    dateTimeFormat: 'yyyy年MM月dd日 星期w hh:mm',
    dateFormat: 'yyyy年MM月dd日 星期w',
    noChoose: '未选择',
    week: ['日', '一', '二', '三', '四', '五', '六'],
    clear: '清除',
    selectTime: '选择时间',
    selectStartTime: '选择开始时间',
    selectEndTime: '选择结束时间',
    start: '开始',
    end: '结束',
    begin: '起',
    over: '止',
    begin_over: '起/止',
    confirm: '确认',
    monthTitle: 'yyyy年MM月',
    loadPrevMonth: '加载上一个月',
    yesterday: '昨天',
    lastWeek: '近一周',
    lastMonth: '近一个月'
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var SearchBar = {
    cancelText: '取消',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var InputItem$1 = {
    confirmLabel: '确定',
    backspaceLabel: '退格',
    cancelKeyboardLabel: '收起键盘',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var Pagination = {
    prevText: '上一页',
    nextText: '下一页',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var PullToRefresh = {
    activateText: '松开立即刷新',
    deactivateText: '下拉可以刷新',
    finishText: '完成刷新',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var zh_CN = {
    locale: 'zh_CN',
    Picker,
    DatePicker,
    DatePickerView,
    Menu,
    Calendar: defaultLocale,
    SearchBar,
    InputItem: InputItem$1,
    Pagination,
    PullToRefresh
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class LocaleProviderService {
    /**
     * @param {?} locale
     */
    constructor(locale) {
        this._change = new BehaviorSubject(this._locale);
        this.setLocale(locale || zh_CN);
    }
    /**
     * @return {?}
     */
    get localeChange() {
        return this._change.asObservable();
    }
    /**
     * @param {?} keyPath
     * @return {?}
     */
    getLocaleValue(keyPath) {
        /** @type {?} */
        const content = /** @type {?} */ (this._getObjectPath(this._locale, keyPath));
        if (typeof content === 'string') {
            return content;
        }
        return '';
    }
    /**
     * @param {?} keyPath
     * @return {?}
     */
    getLocaleSubObj(keyPath) {
        /** @type {?} */
        const content = /** @type {?} */ (this._getObjectPath(this._locale, keyPath));
        if (typeof content === 'object') {
            return content;
        }
        return null;
    }
    /**
     * @param {?} locale
     * @return {?}
     */
    setLocale(locale) {
        if (!locale || (this._locale && this._locale.locale === locale.locale)) {
            return;
        }
        this._locale = locale;
        this._change.next(locale);
    }
    /**
     * @return {?}
     */
    getLocaleId() {
        return this._locale && this._locale.locale ? this._locale.locale : '';
    }
    /**
     * @return {?}
     */
    getLocale() {
        return this._locale;
    }
    /**
     * @param {?} obj
     * @param {?} path
     * @return {?}
     */
    _getObjectPath(obj, path) {
        /** @type {?} */
        let res = obj;
        /** @type {?} */
        const paths = path.split('.');
        /** @type {?} */
        const depth = paths.length;
        /** @type {?} */
        let index = 0;
        while (res && index < depth) {
            res = res[paths[index++]];
        }
        return index === depth ? res : null;
    }
}
LocaleProviderService.decorators = [
    { type: Injectable }
];
/** @nocollapse */
LocaleProviderService.ctorParameters = () => [
    { type: undefined, decorators: [{ type: Inject, args: [LOCAL_PROVIDER_TOKEN,] }] }
];
/**
 * @param {?} exist
 * @param {?} locale
 * @return {?}
 */
function LOCALE_PROVIDER_SERVICE_FACTORY(exist, locale) {
    return exist || new LocaleProviderService(locale);
}
/** @type {?} */
const LOCALE_PROVIDER_SERVICE_PROVIDER = {
    provide: LocaleProviderService,
    useFactory: LOCALE_PROVIDER_SERVICE_FACTORY,
    deps: [[new Optional(), new SkipSelf(), LocaleProviderService], LOCAL_PROVIDER_TOKEN]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CustomKeyboard {
    /**
     * @param {?} _localeProvider
     */
    constructor(_localeProvider) {
        this._localeProvider = _localeProvider;
        this.prefixCls = 'am-number-keyboard';
        this.okText = '';
        this._locale = {};
        this._unsubscribe$ = new Subject();
        this.onClick = new EventEmitter();
    }
    /**
     * @param {?} e
     * @return {?}
     */
    tdClick(e) {
        this.onClick.emit(e);
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.wrapCls = {
            [`${this.prefixCls}-item`]: true
        };
        this.wrapperCls = {
            [`${this.prefixCls}-wrapper`]: true
        };
        this._localeProvider.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe(_ => {
            this._locale = this._localeProvider.getLocaleSubObj('InputItem');
            this.okText = this._locale.confirmLabel;
        });
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this._unsubscribe$.next();
        this._unsubscribe$.complete();
    }
}
CustomKeyboard.decorators = [
    { type: Component, args: [{
                selector: 'CustomKeyboard',
                template: "<div [ngClass]=\"wrapperCls\">\n<table>\n  <tbody>\n    <tr>\n      <td [ngClass]=\"wrapCls\" (click)=\"tdClick(1)\">1\n      </td>\n      <td [ngClass]=\"wrapCls\" (click)=\"tdClick(2)\">2\n      </td>\n      <td [ngClass]=\"wrapCls\" (click)=\"tdClick(3)\">3\n      </td>\n      <td class=\"keyboard-delete\" [rowSpan]=\"2\" [ngClass]=\"wrapCls\" (click)=\"tdClick('delete')\">\n      </td>\n    </tr>\n    <tr>\n      <td [ngClass]=\"wrapCls\" (click)=\"tdClick(4)\">4\n      </td>\n      <td [ngClass]=\"wrapCls\" (click)=\"tdClick(5)\">5\n      </td>\n      <td [ngClass]=\"wrapCls\" (click)=\"tdClick(6)\">6\n      </td>\n\n    </tr>\n    <tr>\n      <td [ngClass]=\"wrapCls\" (click)=\"tdClick(7)\">7\n      </td>\n      <td [ngClass]=\"wrapCls\" (click)=\"tdClick(8)\">8\n      </td>\n      <td [ngClass]=\"wrapCls\" (click)=\"tdClick(9)\">9\n      </td>\n      <td class=\"keyboard-confirm\" [rowSpan]=\"2\" [ngClass]=\"wrapCls\" (click)=\"tdClick('confirm')\">{{okText}}\n      </td>\n    </tr>\n    <tr>\n      <td [ngClass]=\"wrapCls\" (click)=\"tdClick('.')\">.\n      </td>\n      <td [ngClass]=\"wrapCls\" (click)=\"tdClick(0)\">0\n      </td>\n      <td class=\"keyboard-hide\" [ngClass]=\"wrapCls\" (click)=\"tdClick('hide')\">\n      </td>\n    </tr>\n  </tbody>\n</table>\n</div>\n\n",
                encapsulation: ViewEncapsulation.None,
                providers: [LocaleProviderService]
            }] }
];
/** @nocollapse */
CustomKeyboard.ctorParameters = () => [
    { type: LocaleProviderService }
];
CustomKeyboard.propDecorators = {
    onClick: [{ type: Output }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CustomInputService {
    /**
     * @param {?} _appRef
     * @param {?} _cfr
     */
    constructor(_appRef, _cfr) {
        this._appRef = _appRef;
        this._cfr = _cfr;
        CustomInputService.appRef = this._appRef;
        CustomInputService._inputCompFactory = this._cfr.resolveComponentFactory(CustomKeyboard);
    }
    /**
     * @return {?}
     */
    static getShowStatus() {
        return CustomInputService.isShow;
    }
    /**
     * @return {?}
     */
    static showKeyboard() {
        if (!this.isShow) {
            if (this.compRef) {
                this.compRef.instance.wrapperCls = {
                    [`am-number-keyboard-wrapper`]: true
                };
            }
            else {
                /** @type {?} */
                let container = document.querySelector(`#${this._keyboardPrefixCls}-container`);
                if (!container) {
                    container = document.createElement('div');
                    container.setAttribute('id', `${this._keyboardPrefixCls}-container`);
                    document.body.appendChild(container);
                    container.appendChild(document.createElement(CustomInputService._inputCompFactory.selector));
                    this.compRef = this.appRef.bootstrap(CustomInputService._inputCompFactory);
                    this.compRef.instance.onClick.subscribe(e => {
                        this.clickValue = e;
                    });
                }
            }
            this.isShow = true;
        }
    }
    /**
     * @return {?}
     */
    static hideKeyboard() {
        if (this.compRef && this.isShow) {
            this.isShow = false;
            this.compRef.instance.wrapperCls = {
                [`am-number-keyboard-wrapper`]: true,
                [`am-number-keyboard-wrapper-hide`]: true
            };
        }
    }
}
CustomInputService.compRef = null;
CustomInputService.appRef = null;
CustomInputService.isShow = false;
CustomInputService.clickValue = null;
CustomInputService._inputCompFactory = null;
CustomInputService._keyboardPrefixCls = 'am-number-keyboard';
CustomInputService.decorators = [
    { type: Injectable }
];
/** @nocollapse */
CustomInputService.ctorParameters = () => [
    { type: ApplicationRef },
    { type: ComponentFactoryResolver }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CustomInput {
    /**
     * @param {?} _ref
     * @param {?} _customInputService
     * @param {?} _ngZone
     */
    constructor(_ref, _customInputService, _ngZone) {
        this._ref = _ref;
        this._customInputService = _customInputService;
        this._ngZone = _ngZone;
        this.keyboardPrefixCls = 'am-number-keyboard';
        this.focus = false;
        this._value = '';
        this._defaultValue = '';
        this._placeholder = '';
        this._editable = true;
        this._disabled = false;
        this._setFocus = false;
        this.onChange = new EventEmitter();
        this.onBlur = new EventEmitter();
        this.onFocus = new EventEmitter();
        this.clsFakeContainer = true;
        this.inputFocus = () => {
            this.removeBlurListener();
            /** @type {?} */
            const focus = this.focus;
            if (!focus || this._setFocus) {
                this.onInputFocus();
            }
            setTimeout(() => {
                this.addBlurListener();
            }, 50);
        };
        this.doBlur = ev => {
            /** @type {?} */
            const value = this._value;
            /** @type {?} */
            let parentFound = false;
            /** @type {?} */
            let isInput = false;
            /** @type {?} */
            let isKeyboard = false;
            /** @type {?} */
            let isClear = false;
            /** @type {?} */
            let target = ev.target;
            while (target && target !== null && !parentFound) {
                if (target === this._ref.nativeElement) {
                    parentFound = true;
                }
                if (target.localName === 'custominput') {
                    isInput = true;
                }
                if (target.localName === 'customkeyboard') {
                    isKeyboard = true;
                }
                if (target.className.indexOf('am-input-clear') >= 0) {
                    isClear = true;
                }
                target = target.parentElement;
            }
            // 当点击目标是本身的时候,获取焦点、不隐藏keyboard
            // 当点击目标不是本身但是其他的custom-input时,失去焦点、不隐藏keyboard
            // 当点击目标是keyboard时,不失去焦点,不隐藏keyboard
            if (parentFound) {
                this.focus = true;
            }
            else if (isInput) {
                this._setFocus = false;
                this.focus = false;
                this.onBlur.emit(this._value);
            }
            if (this.focus && isKeyboard) {
                this.focus = true;
                this.onKeyboardClick(CustomInputService.clickValue);
            }
            if (!parentFound && !isInput && !isKeyboard && !isClear && !this._setFocus) {
                this.focus = false;
                this._setFocus = false;
                this.onBlur.emit(this._value);
                CustomInputService.hideKeyboard();
            }
            this.setFakeInputCls();
        };
        this.removeBlurListener = () => {
            document.removeEventListener('click', this.doBlur, false);
        };
        this.addBlurListener = () => {
            document.addEventListener('click', this.doBlur, false);
        };
        this.onInputBlur = value => {
            this.focus = false;
            this.setFakeInputCls();
            this.onBlur.emit(this._value);
            CustomInputService.hideKeyboard();
        };
        this.onInputFocus = () => {
            this.onFocus.emit(this._value);
            this.focus = true;
            this._setFocus = false;
            this.setFakeInputCls();
            setTimeout(() => {
                CustomInputService.showKeyboard();
            }, 100);
        };
        this.setFakeInputCls = () => {
            this.fakeInputCls = {
                [`fake-input`]: true,
                ['fake-input-disabled']: this._disabled,
                ['focus']: this.focus
            };
        };
        this.setContainerCls = () => {
            this.clsFakeContainerLeft = this._moneyKeyboardAlign === 'left';
        };
        this.onKeyboardClick = keyboardItemValue => {
            /** @type {?} */
            let valueAfterChange;
            // 删除键
            if (keyboardItemValue === 'delete') {
                valueAfterChange = this._value.substring(0, this._value.length - 1);
                this.onChange.emit(valueAfterChange);
                // 确认键
            }
            else if (keyboardItemValue === 'confirm') {
                valueAfterChange = this._value;
                this.onChange.emit(valueAfterChange);
                this.onInputBlur(this._value);
                // 收起键
            }
            else if (keyboardItemValue === 'hide') {
                valueAfterChange = this._value;
                this.onInputBlur(valueAfterChange);
            }
            else {
                if (this._maxLength !== undefined &&
                    +this._maxLength >= 0 &&
                    (this._value + keyboardItemValue).length > this._maxLength) {
                    valueAfterChange = (this._value + keyboardItemValue).substr(0, this._maxLength);
                    this.onChange.emit(valueAfterChange);
                }
                else {
                    valueAfterChange = this._value + keyboardItemValue;
                    this.onChange.emit(valueAfterChange);
                }
            }
            this._ngZone.run(() => {
                this._value = valueAfterChange;
            });
        };
    }
    /**
     * @return {?}
     */
    get value() {
        return this._value;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set value(v) {
        if (typeof v === undefined || v === null) {
            this._value = '';
        }
        else if (this._maxLength !== undefined && this._maxLength >= 0) {
            this._value = v.substr(0, this._maxLength);
        }
        else {
            this._value = v;
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set defaultValue(value) {
        this._defaultValue = value;
        this._value = this._defaultValue;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set maxLength(value) {
        this._maxLength = value;
    }
    /**
     * @return {?}
     */
    get placeholder() {
        return this._placeholder;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set placeholder(value) {
        this._placeholder = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set editable(value) {
        this._editable = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        this._disabled = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set moneyKeyboardAlign(value) {
        this._moneyKeyboardAlign = value;
        this.setContainerCls();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set setFocus(value) {
        if (value) {
            this._setFocus = value.focus;
            if (this._setFocus) {
                this.inputFocus();
            }
        }
    }
    /**
     * @return {?}
     */
    onFakeInputClick() {
        if (this._preventKeyboard) {
            return;
        }
        this.inputFocus();
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this._preventKeyboard = this._disabled || !this._editable;
        this.setFakeInputCls();
        this.setContainerCls();
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this.removeBlurListener();
        if (CustomInputService) {
            CustomInputService.hideKeyboard();
            CustomInputService.compRef = null;
        }
        /** @type {?} */
        const container = document.querySelector(`#${this.keyboardPrefixCls}-container`);
        if (container) {
            container.remove();
        }
    }
}
CustomInput.decorators = [
    { type: Component, args: [{
                selector: 'CustomInput',
                template: "<div *ngIf=\"value===''\" class=\"fake-input-placeholder\">\n  {{placeholder}}\n</div>\n<div [ngClass]=\"fakeInputCls\" (click)=\"onFakeInputClick()\">\n  {{value}}\n</div>\n",
                encapsulation: ViewEncapsulation.None,
                providers: [CustomInputService]
            }] }
];
/** @nocollapse */
CustomInput.ctorParameters = () => [
    { type: ElementRef },
    { type: CustomInputService },
    { type: NgZone }
];
CustomInput.propDecorators = {
    value: [{ type: Input }],
    defaultValue: [{ type: Input }],
    maxLength: [{ type: Input }],
    placeholder: [{ type: Input }],
    editable: [{ type: Input }],
    disabled: [{ type: Input }],
    moneyKeyboardAlign: [{ type: Input }],
    setFocus: [{ type: Input }],
    onChange: [{ type: Output }],
    onBlur: [{ type: Output }],
    onFocus: [{ type: Output }],
    clsFakeContainer: [{ type: HostBinding, args: ['class.fake-input-container',] }],
    clsFakeContainerLeft: [{ type: HostBinding, args: ['class.fake-input-container-left',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class InputItemModule {
}
InputItemModule.decorators = [
    { type: NgModule, args: [{
                exports: [InputItem, CustomKeyboard, CustomInput],
                declarations: [InputItem, CustomKeyboard, CustomInput],
                entryComponents: [CustomKeyboard],
                imports: [CommonModule, FormsModule, ReactiveFormsModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Button {
    /**
     * @param {?} _elementRef
     * @param {?} _render
     */
    constructor(_elementRef, _render) {
        this._elementRef = _elementRef;
        this._render = _render;
        this.prefixCls = 'am-button';
        this.ngTemplate = false;
        this._className = '';
        this._classList = [];
        this._size = 'large';
        this._loading = false;
        this._active = false;
        this._inline = false;
        this._disabled = false;
        this._icon = '';
        this._userAgent = (/** @type {?} */ (navigator)).userAgent || (/** @type {?} */ (navigator)).vendor || (/** @type {?} */ (window)).opera;
        this.onClick = new EventEmitter();
        this._el = this._elementRef.nativeElement;
        this._render.addClass(this._el, this.prefixCls);
        this._className = this._el.className;
    }
    /**
     * @return {?}
     */
    get type() {
        return this._type;
    }
    /**
     * @return {?}
     */
    get size() {
        return this._size;
    }
    /**
     * @return {?}
     */
    get disabled() {
        return this._disabled;
    }
    /**
     * @return {?}
     */
    get loading() {
        return this._loading;
    }
    /**
     * @return {?}
     */
    get inline() {
        return this._inline;
    }
    /**
     * @return {?}
     */
    get icon() {
        return this._icon;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set icon(value) {
        if (value instanceof TemplateRef) {
            this.ngTemplate = true;
            this._icon = value;
        }
        else {
            this.ngTemplate = false;
            this._icon = /** @type {?} */ (value);
            this.setClassMap();
        }
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set className(v) {
        this._className = this._className + ' ' + v;
        this.setClassMap();
    }
    /**
     * @param {?} event
     * @return {?}
     */
    touchStart(event) {
        if (this._disabled) {
            return;
        }
        this._active = true;
        this.setClassMap();
    }
    /**
     * @param {?} event
     * @return {?}
     */
    touchEnd(event) {
        if (this._disabled) {
            return;
        }
        this._active = false;
        this.setClassMap();
    }
    /**
     * @param {?} event
     * @return {?}
     */
    click(event) {
        if (this._disabled) {
            return;
        }
        this.onClick.emit();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    isTemplateRef(value) {
        if (value) {
            return value instanceof TemplateRef;
        }
        return false;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set type(value) {
        this._type = value;
        this.setClassMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        this._disabled = value;
        this.setClassMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set loading(value) {
        this._loading = value;
        if (value) {
            if (this._el.querySelector('icon')) {
                this._el.querySelector('icon').parentNode.removeChild(this._el.querySelector('icon'));
            }
        }
        this.setClassMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set size(value) {
        this._size = value;
        this.setClassMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set inline(value) {
        this._inline = value;
        this.setClassMap();
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        if (this._el.querySelector('img')) {
            /** @type {?} */
            const amSize = this._size === 'small' ? 'am-icon-xxs' : 'am-icon-md';
            this._el.querySelector('img').setAttribute('class', `am-icon ${this.prefixCls}-icon ${amSize}`);
            this._render.addClass(this._el, `${this.prefixCls}-icon`);
        }
    }
    /**
     * @return {?}
     */
    setClassMap() {
        this.iconType = this._loading ? 'loading' : this._icon;
        this._classList = [
            this._type && `${this.prefixCls}-${this._type}`,
            this._size === 'small' && `${this.prefixCls}-${this._size}`,
            this._disabled && `${this.prefixCls}-disabled`,
            this._loading && `${this.prefixCls}-loading`,
            this.iconType && `${this.prefixCls}-icon`,
            this._active && `${this.prefixCls}-active`,
            this._inline && `${this.prefixCls}-inline`
        ].filter(item => {
            return !!item;
        });
        this._el.className = this._className + ' ' + this._classList.join(' ');
    }
}
Button.decorators = [
    { type: Component, args: [{
                selector: '[Button], nzm-button',
                encapsulation: ViewEncapsulation.None,
                template: "<Icon *ngIf=\"!ngTemplate\"\n      class=\"{{prefixCls}}-icon\"\n      [type]=\"iconType\"\n      [size]=\"size ==='small' ? 'xxs' : 'md'\"\n></Icon>\n<ng-template *ngIf=\"ngTemplate\" [ngTemplateOutlet]=\"icon\"></ng-template>\n<ng-content select=\"img\"></ng-content>\n<div class=\"{{prefixCls}}-content\">\n  <span>\n    <ng-content></ng-content>\n  </span>\n</div>"
            }] }
];
/** @nocollapse */
Button.ctorParameters = () => [
    { type: ElementRef },
    { type: Renderer2 }
];
Button.propDecorators = {
    type: [{ type: Input }],
    size: [{ type: Input }],
    disabled: [{ type: Input }],
    loading: [{ type: Input }],
    inline: [{ type: Input }],
    icon: [{ type: Input }],
    className: [{ type: Input }],
    onClick: [{ type: Output }],
    touchStart: [{ type: HostListener, args: ['touchstart', ['$event'],] }, { type: HostListener, args: ['mousedown', ['$event'],] }],
    touchEnd: [{ type: HostListener, args: ['touchend', ['$event'],] }, { type: HostListener, args: ['mouseup', ['$event'],] }, { type: HostListener, args: ['touchmove', ['$event'],] }, { type: HostListener, args: ['mousemove', ['$event'],] }, { type: HostListener, args: ['touchcancel', ['$event'],] }],
    click: [{ type: HostListener, args: ['click', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/** @type {?} */
const svgSprite = contents => `
<svg
  xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  id="__ANTD_MOBILE_SVG_SPRITE_NODE__"
  style="position:absolute;width:0;height:0"
>
  <defs>
    ${contents}
  </defs>
</svg>
`;
class IconHandler {
    constructor() {
        this.contents = [];
        // both minified by https://github.com/svg/svgo
        this.icons = {
            check: '<svg viewBox="0 0 44 44"><path fill-rule="evenodd" d="M34.538 8L38 11.518 17.808 32 8 22.033l3.462-3.518 6.346 6.45z"/></svg>',
            'check-circle': '<svg viewBox="0 0 48 48"><path d="M24 48c13.255 0 24-10.745 24-24S37.255 0 24 0 0 10.745 0 24s10.745 24 24 24zM13.1 23.2l-2.2 2.1 10 9.9L38.1 15l-2.2-2-15.2 17.8-7.6-7.6z" fill-rule="evenodd"/></svg>',
            'check-circle-o': '<svg viewBox="0 0 48 48"><g fill-rule="evenodd"><path d="M24 48c13.255 0 24-10.745 24-24S37.255 0 24 0 0 10.745 0 24s10.745 24 24 24zm0-3c11.598 0 21-9.402 21-21S35.598 3 24 3 3 12.402 3 24s9.402 21 21 21z"/><path d="M12.2 23.2L10 25.3l10 9.9L37.2 15 35 13 19.8 30.8z"/></g></svg>',
            cross: '<svg viewBox="0 0 44 44"><path fill-rule="evenodd" d="M24.008 21.852l8.97-8.968L31.092 11l-8.97 8.968L13.157 11l-1.884 1.884 8.968 8.968-9.24 9.24 1.884 1.885 9.24-9.24 9.24 9.24 1.885-1.884-9.24-9.24z"/></svg>',
            'cross-circle': '<svg viewBox="0 0 48 48"><g fill-rule="evenodd"><path d="M24 48c13.255 0 24-10.745 24-24S37.255 0 24 0 0 10.745 0 24s10.745 24 24 24zm0-3c11.598 0 21-9.402 21-21S35.598 3 24 3 3 12.402 3 24s9.402 21 21 21z"/><path d="M24.34 22.22l-7.775-7.775a1.5 1.5 0 1 0-2.12 2.12l7.773 7.775-7.774 7.775a1.5 1.5 0 1 0 2.12 2.12l7.775-7.773 7.774 7.774a1.5 1.5 0 1 0 2.12-2.12L26.46 24.34l7.774-7.774a1.5 1.5 0 1 0-2.12-2.12l-7.776 7.773z"/></g></svg>',
            'cross-circle-o': '<svg viewBox="0 0 48 48"><path d="M24 48c13.255 0 24-10.745 24-24S37.255 0 24 0 0 10.745 0 24s10.745 24 24 24zm.353-25.77l-7.593-7.593c-.797-.8-1.538-.822-2.263-.207-.724.614-.56 1.617-.124 2.067l7.852 7.847-7.72 7.723c-.727.728-.56 1.646-.066 2.177.493.532 1.553.683 2.31-.174l7.588-7.584 7.644 7.623c.796.798 1.608.724 2.21.145.605-.58.72-1.442-.074-2.24l-7.657-7.67 7.545-7.52c.81-.697.9-1.76.297-2.34-.92-.885-1.85-.338-2.264.078l-7.685 7.667z" fill-rule="evenodd"/></svg>',
            // Todo: simplify direction to 2, use css transform
            left: '<svg viewBox="0 0 44 44"><defs><path id="a" d="M-129-845h24v24h-24z"/></defs><clipPath id="b"><use xlink:href="#a" overflow="visible"/></clipPath><g clip-path="url(#b)"><defs><path id="c" d="M-903-949H947V996H-903z"/></defs></g><path d="M16.247 21.4L28.48 9.165l2.12 2.12-10.117 10.12L30.6 31.524l-2.12 2.12-12.233-12.232.007-.006z"/></svg>',
            right: '<svg viewBox="0 0 44 44"><defs><path id="a" d="M-129-845h24v24h-24z"/></defs><clipPath id="b"><use xlink:href="#a" overflow="visible"/></clipPath><g clip-path="url(#b)"><defs><path id="c" d="M-903-949H947V996H-903z"/></defs></g><path d="M30.6 21.4L18.37 9.165l-2.12 2.12 10.117 10.12-10.118 10.118 2.12 2.12 12.234-12.232-.005-.006z"/></svg>',
            down: '<svg viewBox="0 0 44 44"><path d="M22.355 28.237l-11.483-10.9c-.607-.576-1.714-.396-2.48.41l.674-.71c-.763.802-.73 2.07-.282 2.496l11.37 10.793-.04.04 2.088 2.195L23.3 31.52l12.308-11.682c.447-.425.48-1.694-.282-2.496l.674.71c-.766-.806-1.873-.986-2.48-.41L22.355 28.237z" fill-rule="evenodd"/></svg>',
            up: '<svg viewBox="0 0 44 44"><path fill="none" d="M-1-1h46v46H-1z"/><defs><path id="a" d="M-129-845h24v24h-24z"/></defs><clipPath id="b"><use xlink:href="#a"/></clipPath><g clip-path="url(#b)"><defs><path id="c" d="M-903-949H947V996H-903z"/></defs></g><path d="M23.417 14.23L11.184 26.46l2.12 2.12 10.12-10.117 10.118 10.118 2.12-2.12L23.43 14.228l-.006.005z"/></svg>',
            loading: '<svg viewBox="0 -2 59.75 60.25"><path fill="#ccc" d="M29.69-.527C14.044-.527 1.36 12.158 1.36 27.806S14.043 56.14 29.69 56.14c15.65 0 28.334-12.686 28.334-28.334S45.34-.527 29.69-.527zm.185 53.75c-14.037 0-25.417-11.38-25.417-25.417S15.838 2.39 29.875 2.39s25.417 11.38 25.417 25.417-11.38 25.416-25.417 25.416z"/><path fill="none" stroke="#108ee9" stroke-width="3" stroke-linecap="round" stroke-miterlimit="10" d="M56.587 29.766c.37-7.438-1.658-14.7-6.393-19.552"/></svg>',
            search: '<svg viewBox="0 0 44 44"><path d="M32.98 29.255l8.915 8.293L39.603 40l-8.86-8.242a15.952 15.952 0 0 1-10.753 4.147C11.16 35.905 4 28.763 4 19.952 4 11.142 11.16 4 19.99 4s15.99 7.142 15.99 15.952c0 3.472-1.112 6.685-3 9.303zm.05-9.21c0 7.123-5.7 12.918-12.88 12.918-7.176 0-13.015-5.795-13.015-12.918 0-7.12 5.84-12.917 13.017-12.917 7.178 0 12.88 5.797 12.88 12.917z" fill-rule="evenodd"/></svg>',
            ellipsis: '<svg viewBox="0 0 44 44"><circle cx="21.888" cy="22" r="4.045"/><circle cx="5.913" cy="22" r="4.045"/><circle cx="37.863" cy="22" r="4.045"/></svg>',
            'ellipsis-circle': '<svg viewBox="0 0 44 44"><g fill-rule="evenodd"><path d="M22.13.11C10.05.11.255 9.902.255 21.983S10.05 43.86 22.13 43.86s21.875-9.795 21.875-21.876S34.21.11 22.13.11zm0 40.7c-10.396 0-18.825-8.43-18.825-18.826S11.735 3.16 22.13 3.16c10.396 0 18.825 8.428 18.825 18.824S32.525 40.81 22.13 40.81z"/><circle cx="21.888" cy="22.701" r="2.445"/><circle cx="12.23" cy="22.701" r="2.445"/><circle cx="31.546" cy="22.701" r="2.445"/></g></svg>',
            'exclamation-circle': '<svg viewBox="0 0 64 64"><path d="M59.58 40.89L41.193 9.11C39.135 5.382 35.723 3 31.387 3c-3.11 0-6.52 2.382-8.58 6.11L4.42 40.89c-2.788 4.635-3.126 8.81-1.225 12.22C5.015 56.208 7.572 58 13 58h36.773c5.428 0 9.21-1.792 11.03-4.89 1.9-3.41 1.565-7.583-1.224-12.22zm-2.452 11c-.635 1.694-3.802 2.443-7.354 2.443H13c-3.59 0-5.493-.75-6.13-2.444-1.71-2.41-1.374-5.263 0-8.557l18.387-31.777c2.116-3.168 4.394-4.89 6.13-4.89 2.96 0 5.238 1.722 7.354 4.89l18.387 31.777c1.374 3.294 1.713 6.146 0 8.556zm-25.74-33c-.405 0-1.227.835-1.227 2.443v15.89c0 1.608.823 2.444 1.227 2.444 1.628 0 2.452-.836 2.452-2.445v-15.89c0-1.607-.825-2.443-2.453-2.443zm0 23.22c-.405 0-1.227.79-1.227 1.223v2.445c0 .434.823 1.222 1.227 1.222 1.628 0 2.452-.788 2.452-1.222v-2.445c0-.434-.825-1.222-2.453-1.222z" fill-rule="evenodd"/></svg>',
            'info-circle': '<svg viewBox="0 0 44 44"><circle cx="13.828" cy="19.63" r="1.938"/><circle cx="21.767" cy="19.63" r="1.938"/><circle cx="29.767" cy="19.63" r="1.938"/><path d="M22.102 4.16c-9.918 0-17.958 7.147-17.958 15.962 0 4.935 2.522 9.345 6.48 12.273v5.667l.04.012a2.627 2.627 0 1 0 4.5 1.455h.002l5.026-3.54c.628.06 1.265.094 1.91.094 9.92 0 17.96-7.146 17.96-15.96C40.06 11.306 32.02 4.16 22.1 4.16zm-.04 29.902c-.902 0-1.78-.08-2.642-.207l-5.882 4.234c-.024.024-.055.04-.083.06l-.008.005a.51.51 0 0 1-.284.095.525.525 0 0 1-.525-.525l.005-6.375c-3.91-2.516-6.456-6.544-6.456-11.1 0-7.628 7.107-13.812 15.875-13.812s15.875 6.184 15.875 13.812-7.107 13.812-15.875 13.812z"/></svg>',
            'question-circle': '<svg viewBox="0 0 44 44"><g fill-rule="evenodd"><path d="M21.186 3c-10.853 0-19.36 8.506-19.36 19.358C1.827 32.494 10.334 41 21.187 41c10.133 0 18.64-8.506 18.64-18.642C39.827 11.506 31.32 3 21.187 3m15.64 19c0 8.823-7.178 16-16 16s-16-7.177-16-16 7.178-16 16-16 16 7.177 16 16z"/><path d="M22.827 31.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0m4-15.48c0 .957-.203 1.822-.61 2.593-.427.792-1.117 1.612-2.073 2.457-.867.734-1.453 1.435-1.754 2.096-.302.7-.453 1.693-.453 2.98a.828.828 0 0 1-.823.854.828.828 0 0 1-.584-.22.877.877 0 0 1-.24-.635c0-1.305.168-2.38.506-3.227.336-.883.93-1.682 1.78-2.4 1.01-.883 1.71-1.692 2.1-2.428.336-.645.503-1.38.503-2.21-.02-.935-.3-1.7-.85-2.288-.655-.717-1.62-1.075-2.897-1.075-1.506 0-2.596.535-3.27 1.6-.46.754-.688 1.645-.688 2.677a.92.92 0 0 1-.266.66.747.747 0 0 1-.56.25.73.73 0 0 1-.584-.194c-.16-.164-.24-.393-.24-.69 0-1.82.585-3.272 1.755-4.357C18.645 11.486 19.928 11 21.434 11h.293c1.452 0 2.638.414 3.56 1.24 1.028.903 1.54 2.163 1.54 3.78z"/></g></svg>',
            voice: '<svg viewBox="0 0 38 33"><g fill-rule="evenodd"><path d="M17.838 28.8c-.564-.468-1.192-.983-1.836-1.496-4.244-3.385-5.294-3.67-6.006-3.67-.014 0-.027.005-.04.005-.015 0-.028-.006-.042-.006H3.562c-.734 0-.903-.203-.903-.928v-12.62c0-.49.057-.8.66-.8H9.1c.694 0 1.76-.28 6.4-3.63.83-.596 1.638-1.196 2.337-1.722V28.8zM19.682.19c-.463-.22-1.014-.158-1.417.157-.02.016-1.983 1.552-4.152 3.125C10.34 6.21 9.243 6.664 9.02 6.737H3.676c-.027 0-.053.003-.08.004H1.183c-.608 0-1.1.487-1.1 1.086V25.14c0 .598.492 1.084 1.1 1.084h8.71c.22.08 1.257.55 4.605 3.24 1.947 1.562 3.694 3.088 3.712 3.103.25.22.568.333.89.333.186 0 .373-.038.55-.116.48-.213.79-.684.79-1.204V1.38c0-.506-.294-.968-.758-1.19z" mask="url(#mask-2)"/><path d="M31.42 16.475c0-3.363-1.854-6.297-4.606-7.876-.125-.067-.42-.193-.625-.193-.613 0-1.11.488-1.11 1.09 0 .404.22.764.55.952 2.13 1.19 3.566 3.44 3.566 6.024 0 2.627-1.486 4.913-3.677 6.087-.32.19-.53.54-.53.935 0 .602.495 1.09 1.106 1.09.26.002.568-.15.568-.15 2.835-1.556 4.754-4.538 4.754-7.96" mask="url(#mask-4)"/><path d="M30.14 3.057c-.205-.122-.41-.22-.658-.22-.608 0-1.1.485-1.1 1.084 0 .434.26.78.627.978 4.042 2.323 6.76 6.636 6.76 11.578 0 4.938-2.715 9.248-6.754 11.572-.354.19-.66.55-.66.993 0 .6.494 1.085 1.102 1.085.243 0 .438-.092.65-.213 4.692-2.695 7.848-7.7 7.848-13.435 0-5.723-3.142-10.718-7.817-13.418" mask="url(#mask-6)"/></g></svg>',
            plus: '<svg viewBox="0 0 30 30"><path d="M14 14H0v2h14v14h2V16h14v-2H16V0h-2v14z" fill-rule="evenodd"/></svg>',
            minus: '<svg viewBox="0 0 30 2"><path d="M0 0h30v2H0z" fill-rule="evenodd"/></svg>',
            dislike: '<svg viewBox="0 0 72 72"><g fill="none" fill-rule="evenodd"><path d="M36 72c19.882 0 36-16.118 36-36S55.882 0 36 0 0 16.118 0 36s16.118 36 36 36zm0-2c18.778 0 34-15.222 34-34S54.778 2 36 2 2 17.222 2 36s15.222 34 34 34z" fill="#FFF"/><path fill="#FFF" d="M47 22h2v6h-2zm-24 0h2v6h-2z"/><path d="M21 51s4.6-7 15-7 15 7 15 7" stroke="#FFF" stroke-width="2"/></g></svg>',
            fail: '<svg viewBox="0 0 72 72"><g fill="none" fill-rule="evenodd"><path d="M36 72c19.882 0 36-16.118 36-36S55.882 0 36 0 0 16.118 0 36s16.118 36 36 36zm0-2c18.778 0 34-15.222 34-34S54.778 2 36 2 2 17.222 2 36s15.222 34 34 34z" fill="#FFF"/><path d="M22 22l28.304 28.304m-28.304 0L50.304 22" stroke="#FFF" stroke-width="2"/></g></svg>',
            success: '<svg viewBox="0 0 72 72"><g fill="none" fill-rule="evenodd"><path d="M36 72c19.882 0 36-16.118 36-36S55.882 0 36 0 0 16.118 0 36s16.118 36 36 36zm0-2c18.778 0 34-15.222 34-34S54.778 2 36 2 2 17.222 2 36s15.222 34 34 34z" fill="#FFF"/><path stroke="#FFF" stroke-width="2" d="M19 34.54l11.545 11.923L52.815 24"/></g></svg>'
        };
    }
    /**
     * @return {?}
     */
    renderSvgSprite() {
        /** @type {?} */
        const symbols = Object.keys(this.icons)
            .map(iconName => {
            /** @type {?} */
            const svgContent = this.icons[iconName].split('svg')[1];
            return `<symbol id=${iconName}${svgContent}symbol>`;
        })
            .join('');
        return svgSprite(symbols);
    }
    /**
     * @return {?}
     */
    load() {
        if (!document) {
            return;
        }
        /** @type {?} */
        const existing = document.getElementById('__ANTD_MOBILE_SVG_SPRITE_NODE__');
        /** @type {?} */
        const mountNode = document.body;
        if (!existing) {
            mountNode.insertAdjacentHTML('afterbegin', this.renderSvgSprite());
        }
    }
}
IconHandler.decorators = [
    { type: Injectable }
];
/** @nocollapse */
IconHandler.ctorParameters = () => [];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class IconComponent {
    /**
     * @param {?} _iconHandler
     */
    constructor(_iconHandler) {
        this._iconHandler = _iconHandler;
        this.clsMap = {};
        this._type = '';
        this._size = 'md';
        this._src = '';
        this.color = '';
        this._iconHandler.load();
    }
    /**
     * @return {?}
     */
    get type() {
        return this._type;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set type(value) {
        this._type = value;
        this.setClsMap();
    }
    /**
     * @return {?}
     */
    get src() {
        return this._src;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set src(value) {
        this._src = value;
        this.setClsMap();
    }
    /**
     * @return {?}
     */
    get size() {
        return this._size;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set size(value) {
        this._size = value;
        this.setClsMap();
    }
    /**
     * @return {?}
     */
    setClsMap() {
        this.clsMap = {
            [`am-icon-${this._type}`]: true,
            [`am-icon-${this._size}`]: true
        };
    }
}
IconComponent.decorators = [
    { type: Component, args: [{
                selector: 'Icon, nzm-icon',
                template: "<svg *ngIf=\"type\"\n     class=\"am-icon\"\n     [ngClass]=\"clsMap\"\n     [ngStyle]=\"{color: color}\"\n>\n  <use xmlns:xlink=\"http://www.w3.org/1999/xlink\" attr.xlink:href=\"#{{type}}\"></use>\n</svg>\n<img *ngIf=\"src\" src=\"{{src}}\" class=\"am-icon\" [ngClass]=\"clsMap\">\n<ng-content></ng-content>\n",
                encapsulation: ViewEncapsulation.None,
                providers: [IconHandler]
            }] }
];
/** @nocollapse */
IconComponent.ctorParameters = () => [
    { type: IconHandler }
];
IconComponent.propDecorators = {
    color: [{ type: Input }],
    type: [{ type: Input }],
    src: [{ type: Input }],
    size: [{ type: Input }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class IconModule {
}
IconModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule],
                exports: [IconComponent],
                declarations: [IconComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class WingBlank {
    constructor() {
        this.prefixCls = 'am-wingblank';
        this.size = 'lg';
        this.amWingBlank = true;
    }
    /**
     * @return {?}
     */
    get amWingBlnkSm() {
        return this.size === 'sm';
    }
    /**
     * @return {?}
     */
    get amWingBlnkMd() {
        return this.size === 'md';
    }
    /**
     * @return {?}
     */
    get amWingBlnkLg() {
        return this.size === 'lg';
    }
}
WingBlank.decorators = [
    { type: Component, args: [{
                selector: 'WingBlank, nzm-wingblank',
                template: "<ng-content></ng-content>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
WingBlank.ctorParameters = () => [];
WingBlank.propDecorators = {
    size: [{ type: Input }],
    amWingBlank: [{ type: HostBinding, args: ['class.am-wingblank',] }],
    amWingBlnkSm: [{ type: HostBinding, args: ['class.am-wingblank-sm',] }],
    amWingBlnkMd: [{ type: HostBinding, args: ['class.am-wingblank-md',] }],
    amWingBlnkLg: [{ type: HostBinding, args: ['class.am-wingblank-lg',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class WingBlankModule {
}
WingBlankModule.decorators = [
    { type: NgModule, args: [{
                declarations: [WingBlank],
                exports: [WingBlank],
                imports: [CommonModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class WhiteSpace {
    constructor() {
        this.prefixCls = 'am-whitespace';
        this.size = 'md';
        this.amWhiteSpace = true;
    }
    /**
     * @return {?}
     */
    get amWhitespaceXs() {
        return this.size === 'xs';
    }
    /**
     * @return {?}
     */
    get amWhitespaceSm() {
        return this.size === 'sm';
    }
    /**
     * @return {?}
     */
    get amWhitespaceMd() {
        return this.size === 'md';
    }
    /**
     * @return {?}
     */
    get amWhitespaceLg() {
        return this.size === 'lg';
    }
    /**
     * @return {?}
     */
    get amWhitespaceXl() {
        return this.size === 'xl';
    }
}
WhiteSpace.decorators = [
    { type: Component, args: [{
                selector: 'WhiteSpace, nzm-whitespace',
                template: ``
            }] }
];
/** @nocollapse */
WhiteSpace.ctorParameters = () => [];
WhiteSpace.propDecorators = {
    size: [{ type: Input }],
    amWhiteSpace: [{ type: HostBinding, args: ['class.am-whitespace',] }],
    amWhitespaceXs: [{ type: HostBinding, args: ['class.am-whitespace-xs',] }],
    amWhitespaceSm: [{ type: HostBinding, args: ['class.am-whitespace-sm',] }],
    amWhitespaceMd: [{ type: HostBinding, args: ['class.am-whitespace-md',] }],
    amWhitespaceLg: [{ type: HostBinding, args: ['class.am-whitespace-lg',] }],
    amWhitespaceXl: [{ type: HostBinding, args: ['class.am-whitespace-xl',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class WhiteSpaceModule {
}
WhiteSpaceModule.decorators = [
    { type: NgModule, args: [{
                declarations: [WhiteSpace],
                exports: [WhiteSpace],
                imports: [CommonModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class List {
    constructor() {
        this.defaultProps = {
            prefixCls: 'am-list'
        };
        this._renderHeader = '';
        this._renderFooter = '';
        this._className = '';
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set className(value) {
        this._className = value;
    }
    /**
     * @return {?}
     */
    get renderHeader() {
        return this._renderHeader;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set renderHeader(value) {
        this._renderHeader = value;
    }
    /**
     * @return {?}
     */
    get renderFooter() {
        return this._renderFooter;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set renderFooter(value) {
        this._renderFooter = value;
    }
    /**
     * @return {?}
     */
    get hostClassName() {
        return 'am-list ' + this._className;
    }
}
List.decorators = [
    { type: Component, args: [{
                selector: 'List, nzm-list',
                template: "<div *ngIf=\"renderHeader\" class=\"{{defaultProps.prefixCls}}-header\">\n  {{renderHeader()}}\n</div>\n<div class=\"{{defaultProps.prefixCls}}-body\">\n  <ng-content></ng-content>\n</div>\n<div *ngIf=\"renderFooter\" class=\"{{defaultProps.prefixCls}}-footer\">\n  {{renderFooter()}}\n</div>\n\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
List.ctorParameters = () => [];
List.propDecorators = {
    className: [{ type: Input }],
    renderHeader: [{ type: Input }],
    renderFooter: [{ type: Input }],
    hostClassName: [{ type: HostBinding, args: ['class',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ListItem {
    constructor() {
        this.defaultProps = {
            prefixCls: 'am-list',
            align: 'middle',
            error: false,
            multipleLine: false,
            wrap: false,
            platform: 'ios',
            rippleStyle: {}
        };
        this.arrowCls = {};
        this.lineCls = {};
        this.wrapCls = '';
        this.rippleCls = {};
        this.rippleClicked = false;
        this._thumb_component = false;
        this._thumb_src = '';
        this._extra_component = false;
        this._extra_title = '';
        this._arrow = '';
        this._disabled = false;
        this._className = '';
        this._active = false;
        this.onClick = new EventEmitter();
    }
    /**
     * @return {?}
     */
    get extra() {
        return this._extra;
    }
    /**
     * @return {?}
     */
    get extra_component() {
        return this._extra_component;
    }
    /**
     * @return {?}
     */
    get extra_title() {
        return this._extra_title;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set extra(value) {
        if (value instanceof TemplateRef) {
            this._extra_component = true;
            this._extra = value;
        }
        else {
            this._extra_component = false;
            this._extra_title = /** @type {?} */ (value);
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set className(value) {
        this._className = value;
        this.setClsMap();
    }
    /**
     * @return {?}
     */
    get arrow() {
        return this._arrow;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set arrow(value) {
        this._arrow = value;
        this.setClsMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set multipleLine(value) {
        this.defaultProps.multipleLine = value === '' ? true : value;
        this.setClsMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set error(value) {
        this.defaultProps.error = value === '' ? true : value;
        this.setClsMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set wrap(value) {
        this.defaultProps.wrap = value === '' ? true : value;
        this.setClsMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set align(value) {
        this.defaultProps.align = value;
        this.setClsMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set platform(value) {
        this.defaultProps.platform = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        if (typeof value === 'boolean') {
            this._disabled = value;
        }
        else {
            if (value === 'true') {
                this._disabled = true;
            }
            else {
                this._disabled = false;
            }
        }
        this.setClsMap();
    }
    /**
     * @return {?}
     */
    get thumb() {
        return this._thumb;
    }
    /**
     * @return {?}
     */
    get thumb_component() {
        return this._thumb_component;
    }
    /**
     * @return {?}
     */
    get thumb_src() {
        return this._thumb_src;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set thumb(value) {
        if (value instanceof TemplateRef) {
            this._thumb_component = true;
            this._thumb = value;
        }
        else {
            this._thumb_component = false;
            this._thumb_src = /** @type {?} */ (value);
        }
    }
    /**
     * @return {?}
     */
    get bingClassName() {
        return this.wrapCls;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    click(event) {
        this.onItemClick(event);
    }
    /**
     * @return {?}
     */
    start() {
        if (!this._disabled && this.onClick.observers.length > 0) {
            this._active = true;
            this.setClsMap();
        }
    }
    /**
     * @return {?}
     */
    move() {
        if (!this._disabled && this.onClick.observers.length > 0) {
            this._active = false;
            this.setClsMap();
        }
    }
    /**
     * @return {?}
     */
    end() {
        if (!this._disabled && this.onClick.observers.length > 0) {
            this._active = false;
            this.setClsMap();
        }
    }
    /**
     * @return {?}
     */
    mouse_start() {
        if (!this._disabled && this.onClick.observers.length > 0) {
            this._active = true;
            this.setClsMap();
        }
    }
    /**
     * @return {?}
     */
    mouse_end() {
        if (!this._disabled && this.onClick.observers.length > 0) {
            this._active = false;
            this.setClsMap();
        }
    }
    /**
     * @return {?}
     */
    setClsMap() {
        /** @type {?} */
        const classNameList = this._className.split(' ');
        /** @type {?} */
        let classNameObj = {};
        this.wrapCls = '';
        for (const value of classNameList) {
            if (value) {
                classNameObj = Object.assign({}, classNameObj, { [`${value}`]: true });
            }
        }
        /** @type {?} */
        const wrapClsObj = Object.assign({ [`${this.defaultProps.prefixCls}-item`]: true, [`${this.defaultProps.prefixCls}-item-disabled`]: this._disabled, [`${this.defaultProps.prefixCls}-item-active`]: this._active, [`${this.defaultProps.prefixCls}-item-error`]: this.defaultProps.error, [`${this.defaultProps.prefixCls}-item-top`]: this.defaultProps.align === 'top', [`${this.defaultProps.prefixCls}-item-middle`]: this.defaultProps.align === 'middle', [`${this.defaultProps.prefixCls}-item-bottom`]: this.defaultProps.align === 'bottom' }, classNameObj);
        for (const key in wrapClsObj) {
            if (wrapClsObj[key]) {
                this.wrapCls += ` ${key}`;
            }
        }
        this.rippleCls = {
            [`${this.defaultProps.prefixCls}-ripple`]: true,
            [`${this.defaultProps.prefixCls}-ripple-animate`]: this.rippleClicked
        };
        this.lineCls = {
            [`${this.defaultProps.prefixCls}-line`]: true,
            [`${this.defaultProps.prefixCls}-line-multiple`]: this.defaultProps.multipleLine,
            [`${this.defaultProps.prefixCls}-line-wrap`]: this.defaultProps.wrap
        };
        this.arrowCls = {
            [`${this.defaultProps.prefixCls}-arrow`]: true,
            [`${this.defaultProps.prefixCls}-arrow-horizontal`]: this._arrow === 'horizontal',
            [`${this.defaultProps.prefixCls}-arrow-vertical`]: this._arrow === 'down' || this._arrow === 'up',
            [`${this.defaultProps.prefixCls}-arrow-vertical-up`]: this._arrow === 'up'
        };
    }
    /**
     * @param {?} ev
     * @return {?}
     */
    onItemClick(ev) {
        /** @type {?} */
        const isAndroid = this.defaultProps.platform === 'android';
        if (isAndroid) {
            if (this.debounceTimeout) {
                clearTimeout(this.debounceTimeout);
                this.debounceTimeout = null;
            }
            /** @type {?} */
            const Item = ev.currentTarget;
            /** @type {?} */
            const RippleWidth = Math.max(Item.offsetHeight, Item.offsetWidth);
            /** @type {?} */
            const ClientRect = ev.currentTarget.getBoundingClientRect();
            /** @type {?} */
            const pointX = ev.clientX - ClientRect.left - Item.offsetWidth / 2;
            /** @type {?} */
            const pointY = ev.clientY - ClientRect.top - Item.offsetWidth / 2;
            /** @type {?} */
            const coverRippleStyle = {
                width: `${RippleWidth}px`,
                height: `${RippleWidth}px`,
                left: `${pointX}px`,
                top: `${pointY}px`
            };
            this.defaultProps.rippleStyle = coverRippleStyle;
            this.rippleClicked = true;
            this.setClsMap();
            this.debounceTimeout = setTimeout(() => {
                this.rippleClicked = false;
                this.defaultProps.rippleStyle = { display: 'none' };
                this.setClsMap();
            }, 1000);
        }
        this.onClick.emit(ev);
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.defaultProps.rippleStyle = { display: 'none' };
        this.setClsMap();
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        if (this.debounceTimeout) {
            clearTimeout(this.debounceTimeout);
            this.debounceTimeout = null;
        }
    }
}
ListItem.decorators = [
    { type: Component, args: [{
                selector: 'ListItem, nzm-list-item',
                template: "<div *ngIf=\"thumb_src && !thumb_component\" class=\"{{defaultProps.prefixCls}}-thumb\">\n  <img src={{thumb_src}}/>\n</div>\n<div *ngIf=\"thumb && thumb_component\" class=\"{{defaultProps.prefixCls}}-thumb\">\n  <ng-template [ngTemplateOutlet]=\"thumb\"></ng-template>\n</div>\n<div [ngClass]=\"lineCls\">\n  <div class=\"{{defaultProps.prefixCls}}-content\">\n    <ng-content></ng-content>\n  </div>\n  <div *ngIf=\"extra_title && !extra_component\"\n       class=\"{{defaultProps.prefixCls}}-extra\"\n       [innerHTML]=\"extra_title\"\n  ></div>\n  <div *ngIf=\"extra && extra_component\" class=\"{{defaultProps.prefixCls}}-extra\">\n    <ng-template [ngTemplateOutlet]=\"extra\"></ng-template>\n  </div>\n  <div *ngIf=\"arrow\" [ngClass]=\"arrowCls\" aria-hidden=\"true\"></div>\n</div>\n<div [ngClass]=\"rippleCls\" [ngStyle]=\"defaultProps.rippleStyle\"></div>\n\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
ListItem.ctorParameters = () => [];
ListItem.propDecorators = {
    extra: [{ type: Input }],
    className: [{ type: Input }],
    arrow: [{ type: Input }],
    multipleLine: [{ type: Input }],
    error: [{ type: Input }],
    wrap: [{ type: Input }],
    align: [{ type: Input }],
    platform: [{ type: Input }],
    disabled: [{ type: Input }],
    thumb: [{ type: Input }],
    onClick: [{ type: Output }],
    bingClassName: [{ type: HostBinding, args: ['class',] }],
    click: [{ type: HostListener, args: ['click', ['$event'],] }],
    start: [{ type: HostListener, args: ['touchstart',] }],
    move: [{ type: HostListener, args: ['touchmove',] }],
    end: [{ type: HostListener, args: ['touchend',] }],
    mouse_start: [{ type: HostListener, args: ['mousedown',] }],
    mouse_end: [{ type: HostListener, args: ['mouseup',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Brief {
    constructor() {
        this.defaultProps = {
            prefixCls: 'am-list'
        };
    }
}
Brief.decorators = [
    { type: Component, args: [{
                selector: 'Brief, nzm-brief',
                template: "<div class=\"{{defaultProps.prefixCls}}-brief\">\n  <ng-content></ng-content>\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ListModule {
}
ListModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, FormsModule],
                exports: [List, ListItem, Brief],
                declarations: [List, ListItem, Brief]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/** @type {?} */
const NZ_BUTTON_DIRECTIVES = [Button];
class ButtonModule {
}
ButtonModule.decorators = [
    { type: NgModule, args: [{
                declarations: NZ_BUTTON_DIRECTIVES,
                exports: NZ_BUTTON_DIRECTIVES,
                imports: [CommonModule, IconModule, WingBlankModule, WhiteSpaceModule, ListModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Switch {
    constructor() {
        this.prefixCls = 'am-switch';
        this.wrapCls = 'am-switch';
        this.checkboxCls = {
            'checkbox-disabled': false
        };
        this.colorStyle = {};
        this._color = '';
        this._platform = 'ios';
        this._disabled = false;
        this.onChange = new EventEmitter();
        this.onClick = new EventEmitter();
        this.dispaly = true;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set color(value) {
        this._color = value;
        this.colorStyle = { background: this._color };
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set platform(value) {
        this._platform = value;
        this.wrapCls = value === 'android' ? `${this.prefixCls}-android` : this.prefixCls;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set checked(value) {
        this.switchChecked = value;
        this.colorStyle = { background: value ? this._color : '' };
    }
    /**
     * @return {?}
     */
    get disabled() {
        return this._disabled;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        this._disabled = value;
        this.checkboxCls = {
            'checkbox-disabled': value
        };
    }
    /**
     * @param {?} checkedValue
     * @return {?}
     */
    changeSwitch(checkedValue) {
        this.switchChecked = checkedValue;
        this.colorStyle = { background: checkedValue ? this._color : '' };
        this.onChange.emit(checkedValue);
    }
    /**
     * @return {?}
     */
    click() {
        this.onClick.emit(this.switchChecked);
    }
}
Switch.decorators = [
    { type: Component, args: [{
                selector: 'Switch, nzm-switch',
                template: "<label class=\"{{prefixCls}}\" [ngClass]=\"wrapCls\">\n  <input #switchValue\n         type=\"checkbox\"\n         name=\"name\"\n         class=\"{{prefixCls}}-checkbox\"\n         [checked]=\"switchChecked\"\n         [value]=\"switchChecked\"\n         [disabled]=\"disabled\"\n         (change)=\"changeSwitch(switchValue.checked)\"\n  />\n  <div class=\"checkbox\"\n       [ngClass]=\"checkboxCls\"\n       [ngStyle]=\"colorStyle\"\n       (click)=\"click()\"\n  ></div>\n</label>",
                encapsulation: ViewEncapsulation.None,
                providers: [
                    {
                        provide: NG_VALUE_ACCESSOR,
                        useExisting: forwardRef(() => Switch),
                        multi: true
                    }
                ]
            }] }
];
/** @nocollapse */
Switch.ctorParameters = () => [];
Switch.propDecorators = {
    color: [{ type: Input }],
    name: [{ type: Input }],
    platform: [{ type: Input }],
    checked: [{ type: Input }],
    disabled: [{ type: Input }],
    onChange: [{ type: Output }],
    onClick: [{ type: Output }],
    dispaly: [{ type: HostBinding, args: ['style.display',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SwitchModule {
}
SwitchModule.decorators = [
    { type: NgModule, args: [{
                exports: [Switch],
                declarations: [Switch],
                imports: [CommonModule, WingBlankModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SearchBar$1 {
    /**
     * @param {?} _elementRef
     * @param {?} _localeProvider
     */
    constructor(_elementRef, _localeProvider) {
        this._elementRef = _elementRef;
        this._localeProvider = _localeProvider;
        this.prefixCls = 'am-search';
        this.cancelCls = {
            [`${this.prefixCls}-cancel`]: true
        };
        this._defaultValue = '';
        this._value = '';
        this._placeholder = '';
        this._showCancelButton = false;
        this._disabled = false;
        this._focus = false;
        this._isSubmit = false;
        this._isCustomText = false;
        this._isClearClicking = false;
        this._blurFromOnClear = false;
        this.locale = {};
        this._unsubscribe$ = new Subject();
        this.onSubmit = new EventEmitter();
        this.onChange = new EventEmitter();
        this.onFocus = new EventEmitter();
        this.onBlur = new EventEmitter();
        this.onCancel = new EventEmitter();
        this.onClear = new EventEmitter();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set defaultValue(value) {
        this._defaultValue = value;
        this._value = value;
        this.inputElementRef.nativeElement.value = this._value;
    }
    /**
     * @return {?}
     */
    get value() {
        return this._value;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set value(v) {
        this._value = v || '';
        this.inputElementRef.nativeElement.value = this._value;
        this.setClass();
    }
    /**
     * @return {?}
     */
    get placeholder() {
        return this._placeholder;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set placeholder(value) {
        this._placeholder = value;
    }
    /**
     * @return {?}
     */
    get showCancelButton() {
        return this._showCancelButton;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set showCancelButton(value) {
        this._showCancelButton = value;
        this.setClass();
    }
    /**
     * @return {?}
     */
    get cancelText() {
        return this._cancelText;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set cancelText(value) {
        if (value !== undefined) {
            this._cancelText = value;
            this._isCustomText = true;
        }
    }
    /**
     * @return {?}
     */
    get disabled() {
        return this._disabled;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        this._disabled = value;
    }
    /**
     * @return {?}
     */
    get maxLength() {
        return this._maxLength;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set maxLength(value) {
        this._maxLength = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set setFocus(value) {
        if (value) {
            if (value.focusValue) {
                this._focus = true;
                this.inputElementRef.nativeElement.focus();
                this._blurFromOnClear = true;
                this.onSearchbarFocus();
            }
            else {
                this._blurFromOnClear = false;
                this.onSearchbarBlur();
            }
        }
    }
    /**
     * @return {?}
     */
    setClass() {
        this.wrapCls = {
            [`${this.prefixCls}`]: true,
            [`${this.prefixCls}-start`]: !!(this._focus || (this._value && this._value.length > 0)) && !this._disabled
        };
        this.cancelCls = {
            [`${this.prefixCls}-cancel`]: true,
            [`${this.prefixCls}-cancel-show`]: this._showCancelButton || this._focus || (this._value && this._value.length > 0),
            [`${this.prefixCls}-cancel-anim`]: this._focus
        };
        this.clearCls = {
            [`${this.prefixCls}-clear`]: this._value && this._value.length > 0,
            [`${this.prefixCls}-clear-show`]: this._value && this._value.length > 0 && !this._isSubmit,
            [`${this.prefixCls}-clear-active`]: this._isClearClicking
        };
    }
    /**
     * @return {?}
     */
    setStyle() {
        if (this._inputContainerRef.className.indexOf(`${this.prefixCls}-start`) > -1) {
            /** @type {?} */
            const realWidth = this._syntheticPhContainerRef.getBoundingClientRect().width;
            this._syntheticPhRef.style.width = Math.ceil(realWidth) + 'px';
            if (!this._showCancelButton) {
                this._rightBtnRef.style.marginRight = '0';
            }
        }
        else {
            this._syntheticPhRef.style.width = '100%';
            if (!this._showCancelButton) {
                this._rightBtnInitMarginLeft = window.getComputedStyle(this._rightBtnRef)['margin-left'];
                /** @type {?} */
                const btnMarginRight = this._rightBtnRef.offsetWidth + parseInt(this._rightBtnInitMarginLeft, 10);
                this._rightBtnRef.style.marginRight = '-' + btnMarginRight + 'px';
            }
        }
    }
    /**
     * @return {?}
     */
    onSearchbarBlur() {
        /** @type {?} */
        const self = this;
        setTimeout(() => {
            if (!self._blurFromOnClear && self._value === '' && self._focus) {
                self._focus = false;
                self._value = '';
                self.onBlur.emit();
                self.setClass();
            }
            self._blurFromOnClear = false;
        }, 50);
    }
    /**
     * @return {?}
     */
    onSearchbarFocus() {
        this._focus = true;
        this._isSubmit = false;
        this.onFocus.emit();
        this.setClass();
    }
    /**
     * @param {?} e
     * @return {?}
     */
    onSearchbarChange(e) {
        this._focus = true;
        this.onChange.emit(e);
        this.setClass();
    }
    /**
     * @param {?} e
     * @return {?}
     */
    onSearchSubmit(e) {
        e.preventDefault();
        this._value = e.target[0].value;
        this._isSubmit = true;
        this.onSubmit.emit(this._value);
        this.setClass();
        this._blurFromOnClear = true;
    }
    /**
     * @return {?}
     */
    onSearchbarCancel() {
        this._focus = false;
        this._value = '';
        this.onCancel.emit();
        this.setClass();
    }
    /**
     * @return {?}
     */
    onSearchbarClear() {
        this._blurFromOnClear = true;
        this._isClearClicking = true;
        this.onSearchbarChange('');
        this.inputElementRef.nativeElement.focus();
        this.onClear.emit(this._value);
        this.setClass();
        setTimeout(() => {
            this._value = '';
            this._isClearClicking = false;
            this._blurFromOnClear = false;
            this.setClass();
        }, 100);
        this.onSearchbarFocus();
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.setClass();
        this._localeProvider.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe(_ => {
            this.locale = this._localeProvider.getLocaleSubObj('SearchBar');
            this._cancelText = this._isCustomText ? this._cancelText : this.locale.cancelText;
        });
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        this._syntheticPhContainerRef = this._elementRef.nativeElement.getElementsByClassName(`${this.prefixCls}-synthetic-ph-container`)[0];
        this._syntheticPhRef = this._elementRef.nativeElement.getElementsByClassName(`${this.prefixCls}-synthetic-ph`)[0];
        this._rightBtnRef = this._elementRef.nativeElement.getElementsByClassName('cancel')[0];
        this._inputContainerRef = this._elementRef.nativeElement.getElementsByClassName(`${this.prefixCls}`)[0];
    }
    /**
     * @return {?}
     */
    ngAfterViewChecked() {
        this.setStyle();
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this._unsubscribe$.next();
        this._unsubscribe$.complete();
    }
}
SearchBar$1.decorators = [
    { type: Component, args: [{
                selector: 'SearchBar, nzm-search-bar',
                template: "<form name=\"myForm\"\n      class=\"{{prefixCls}}\"\n      [ngClass]=\"wrapCls\"\n      action=\"#\"\n      (submit)=\"onSearchSubmit($event)\"\n>\n  <div class=\"{{prefixCls}}-input\">\n    <div class=\"{{prefixCls}}-synthetic-ph\"\n         style=\"box-sizing:unset\"\n         [@cancelButtonState]=\"showCancelButton?'visible' : 'hidden'\"\n    >\n      <span class=\"{{prefixCls}}-synthetic-ph-container\">\n        <i class=\"{{prefixCls}}-synthetic-ph-icon\"></i>\n        <span class=\"{{prefixCls}}-synthetic-ph-placeholder\"\n              [ngStyle]=\"{'visibility' : (placeholder && !value) ? 'visible' : 'hidden'}\"\n        >\n          {{placeholder}}\n        </span>\n      </span>\n    </div>\n    <input #search\n           class=\"{{prefixCls}}-value\"\n           style=\"outline:none;\"\n           [name]=\"'search'\"\n           [type]=\"'search'\"\n           [disabled]=\"disabled\"\n           [maxlength]=\"maxLength\"\n           [placeholder]=\"placeholder\"\n           [(ngModel)]=\"value\"\n           (blur)=\"onSearchbarBlur()\"\n           (focus)=\"onSearchbarFocus()\"\n           (ngModelChange)=\"onSearchbarChange($event)\"\n    />\n    <a [ngClass]=\"clearCls\"\n       style=\"box-sizing: content-box;transition: 0s\"\n       (click)=\"onSearchbarClear()\"\n    ></a>\n  </div>\n  <div class=\"cancel\"\n       [ngClass]=\"cancelCls\"\n       (click)=\"onSearchbarCancel()\"\n  >\n    {{cancelText}}\n  </div>\n</form>",
                encapsulation: ViewEncapsulation.None,
                providers: [
                    {
                        provide: NG_VALUE_ACCESSOR,
                        useExisting: forwardRef(() => SearchBar$1),
                        multi: true
                    }
                ],
                animations: [
                    trigger('cancelButtonState', [
                        state('visible', style({ width: '*' })),
                        state('hidden', style({ width: '100%' })),
                        transition('visible =>hidden', [animate(300, style({ width: '100%' }))]),
                        transition('hidden => visible', [animate(300, style({ width: '*' }))])
                    ])
                ]
            }] }
];
/** @nocollapse */
SearchBar$1.ctorParameters = () => [
    { type: ElementRef },
    { type: LocaleProviderService }
];
SearchBar$1.propDecorators = {
    inputElementRef: [{ type: ViewChild, args: ['search',] }],
    defaultValue: [{ type: Input }],
    value: [{ type: Input }],
    placeholder: [{ type: Input }],
    showCancelButton: [{ type: Input }],
    cancelText: [{ type: Input }],
    disabled: [{ type: Input }],
    maxLength: [{ type: Input }],
    setFocus: [{ type: Input }],
    onSubmit: [{ type: Output }],
    onChange: [{ type: Output }],
    onFocus: [{ type: Output }],
    onBlur: [{ type: Output }],
    onCancel: [{ type: Output }],
    onClear: [{ type: Output }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SearchBarModule {
}
SearchBarModule.decorators = [
    { type: NgModule, args: [{
                exports: [SearchBar$1],
                declarations: [SearchBar$1],
                imports: [CommonModule, FormsModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Stepper {
    constructor() {
        this.prefixCls = 'am-stepper';
        this._max = Infinity;
        this._min = -Infinity;
        this._step = 1;
        this._disabled = false;
        this._readOnly = false;
        this._showNumber = false;
        this._upDisabled = false;
        this._downDisabled = false;
        this._isUpClick = false;
        this._isDownClick = false;
        this.onChange = new EventEmitter();
        this.clsStepper = true;
        this.clsStpDisabled = this._disabled;
        this.clsShowNum = this._showNumber;
    }
    /**
     * @return {?}
     */
    get max() {
        return this._max;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set max(value) {
        this._max = value;
    }
    /**
     * @return {?}
     */
    get min() {
        return this._min;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set min(value) {
        this._min = value;
    }
    /**
     * @return {?}
     */
    get value() {
        return this._value;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set value(v) {
        this._value = v;
    }
    /**
     * @return {?}
     */
    get step() {
        return this._step;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set step(value) {
        this._step = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set defaultValue(value) {
        if (value) {
            this._defaultValue = value;
            this._value = value;
        }
    }
    /**
     * @return {?}
     */
    get disabled() {
        return this._disabled;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        if (value) {
            this._disabled = true;
            this._downDisabled = true;
            this._upDisabled = true;
        }
        this.clsStpDisabled = value;
    }
    /**
     * @return {?}
     */
    get readOnly() {
        return this._readOnly;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set readOnly(value) {
        this._readOnly = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set showNumber(value) {
        this._showNumber = value;
        this.clsShowNum = value;
    }
    /**
     * @return {?}
     */
    onIncrease() {
        if (!this._upDisabled) {
            this._value = this._value + this._step;
            this.onChange.emit(this._value);
            if (this._value + this._step > this._max) {
                this._upDisabled = true;
            }
            if (this._value - this._step >= this._min) {
                this._downDisabled = false;
            }
            this._isUpClick = true;
            this.setCls();
            setTimeout(() => {
                this._isUpClick = false;
                this.setCls();
            }, 100);
        }
    }
    /**
     * @return {?}
     */
    onDecrease() {
        if (!this._downDisabled) {
            this._value = this._value - this._step;
            this.onChange.emit(this._value);
            if (this._value - this._step < this._min) {
                this._downDisabled = true;
            }
            if (this._value + this._step <= this._max) {
                this._upDisabled = false;
            }
            this._isDownClick = true;
            this.setCls();
            setTimeout(() => {
                this._isDownClick = false;
                this.setCls();
            }, 100);
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    inputChange(event) {
        /** @type {?} */
        const value = event.target.value;
        this._value = value ? parseInt(value, null) : 0;
        if (value < this._min) {
            this._value = this._min;
        }
        if (value > this._max) {
            this._value = this._max;
        }
        this.onChange.emit(this._value);
    }
    /**
     * @return {?}
     */
    setCls() {
        this.upDisableCls = {
            [`${this.prefixCls}-handler-up-disabled`]: this._upDisabled,
            [`${this.prefixCls}-handler-active`]: this._isUpClick
        };
        this.downDisableCls = {
            [`${this.prefixCls}-handler-down-disabled`]: this._downDisabled,
            [`${this.prefixCls}-handler-active`]: this._isDownClick
        };
    }
    /**
     * @return {?}
     */
    ngOnChanges() {
        if (this._value + this._step > this._max) {
            this._upDisabled = true;
        }
        if (this._value - this._step < this._min) {
            this._downDisabled = true;
        }
        this.setCls();
    }
}
Stepper.decorators = [
    { type: Component, args: [{
                selector: 'Stepper , nzm-stepper',
                template: "<div class=\"{{prefixCls}}-handler-wrap\">\n    <span role=\"button\"\n          class=\"{{prefixCls}}-handler {{prefixCls}}-handler-up\"\n          style=\"line-height:28px;\"\n          [ngClass]=\"upDisableCls\"\n          (click)=\"onIncrease()\">\n          <Icon [type]=\"'plus'\"\n                [size]=\"'xxs'\">\n          </Icon>\n    </span>\n    <span role=\"button\"\n          class=\"{{prefixCls}}-handler {{prefixCls}}-handler-down\"\n          style=\"line-height:28px;\"\n          [ngClass]=\"downDisableCls\"\n          (click)=\"onDecrease()\">\n          <Icon [type]=\"'minus'\"\n                [size]=\"'xxs'\">\n          </Icon>\n    </span>\n</div>\n<div class=\"{{prefixCls}}-input-wrap\">\n    <input class=\"{{prefixCls}}-input\"\n           style=\"outline:none\"\n           [disabled]=\"disabled\"\n           [readonly]=\"readOnly\"\n           [autocomplete]=\"'off'\"\n           [max]=\"max\"\n           [min]=\"min\"\n           [(ngModel)]=\"value\"\n           (change)=\"inputChange($event)\">\n</div>"
            }] }
];
/** @nocollapse */
Stepper.ctorParameters = () => [];
Stepper.propDecorators = {
    max: [{ type: Input }],
    min: [{ type: Input }],
    value: [{ type: Input }],
    step: [{ type: Input }],
    defaultValue: [{ type: Input }],
    disabled: [{ type: Input }],
    readOnly: [{ type: Input }],
    showNumber: [{ type: Input }],
    onChange: [{ type: Output }],
    clsStepper: [{ type: HostBinding, args: ['class.am-stepper',] }],
    clsStpDisabled: [{ type: HostBinding, args: ['class.am-stepper-disabled',] }],
    clsShowNum: [{ type: HostBinding, args: ['class.showNumber',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class StepperModule {
}
StepperModule.decorators = [
    { type: NgModule, args: [{
                exports: [Stepper],
                declarations: [Stepper],
                imports: [CommonModule, FormsModule, IconModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Step {
    /**
     * @param {?} _el
     */
    constructor(_el) {
        this._el = _el;
        this.prefixCls = 'am-steps';
        this.stepItemCls = {};
        this.isIconString = true;
        this.clsStepItem = true;
    }
    /**
     * @return {?}
     */
    get status() {
        return this._status;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set status(value) {
        if (value) {
            this._status = value;
            this.setClass();
        }
    }
    /**
     * @return {?}
     */
    get title() {
        return this._title;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set title(value) {
        this._title = value;
    }
    /**
     * @return {?}
     */
    get description() {
        return this._description;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set description(value) {
        this._description = value;
    }
    /**
     * @return {?}
     */
    get icon() {
        return this._icon;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set icon(value) {
        if (value) {
            if (typeof value !== 'string') {
                this.isIconString = false;
            }
            this._icon = value;
            this.setClass();
        }
    }
    /**
     * @return {?}
     */
    setClass() {
        this.iconCls = {
            [`${this.prefixCls}-icon`]: true
        };
        this.stepItemCls = Object.assign(this.stepItemCls, {
            [`${this.prefixCls}-item-${this.status}`]: true,
            [`${this.prefixCls}-item-custom`]: this.icon
        });
    }
    /**
     * @return {?}
     */
    ngOnInit() {
    }
}
Step.decorators = [
    { type: Component, args: [{
                selector: 'Step, nzm-step',
                template: "<div [ngClass]=\"stepItemCls\">\n  <div class=\"{{prefixCls}}-item-tail\">\n    {{tailContent}}\n  </div>\n  <div class=\"{{prefixCls}}-item-icon\">\n    <span *ngIf=\"!isIconString\" [ngClass]=\"iconCls\">\n      <ng-template [ngTemplateOutlet]=\"icon\"></ng-template>\n    </span>\n    <span *ngIf=\"isIconString && (status=== 'error' || status==='finish' || status==='wait' )\" [ngClass]=\"iconCls\">\n      <Icon [type]=\"icon\" [size]=\"iconSize\">\n      </Icon>\n    </span>\n    <span *ngIf=\"isIconString && !(status=== 'error' || status==='finish' || status==='wait')\" [ngClass]=\"iconCls\">{{stepNumber}}\n    </span>\n  </div>\n  <div class=\"{{prefixCls}}-item-content\">\n    <div class=\"{{prefixCls}}-item-title\">\n      {{title}}\n    </div>\n    <div *ngIf=\"description\" class=\"{{prefixCls}}-item-description\">{{description}}</div>\n  </div>\n</div>\n",
                encapsulation: ViewEncapsulation.None,
                providers: [
                    {
                        provide: NG_VALUE_ACCESSOR,
                        useExisting: forwardRef(() => Step),
                        multi: true
                    }
                ]
            }] }
];
/** @nocollapse */
Step.ctorParameters = () => [
    { type: ElementRef }
];
Step.propDecorators = {
    status: [{ type: Input }],
    title: [{ type: Input }],
    description: [{ type: Input }],
    icon: [{ type: Input }],
    clsStepItem: [{ type: HostBinding, args: ['class.am-steps-item',] }]
};
/** @enum {string} */
const StatusEnum = {
    WAIT: 'wait',
    PROCESS: 'process',
    FINISH: 'finish',
    ERROR: 'error',
};
/** @enum {string} */
const DirectionEnum = {
    VERTICAL: 'vertical',
    HORIZONTAL: 'horizontal',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Steps {
    /**
     * @param {?} _elf
     * @param {?} _render
     */
    constructor(_elf, _render) {
        this._elf = _elf;
        this._render = _render;
        this.prefixCls = 'am-steps';
        this._current = 0;
        this._status = StatusEnum.PROCESS;
        this._direction = DirectionEnum.VERTICAL;
        this.clsSteps = true;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set current(value) {
        if (value >= 0) {
            this._current = value;
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set size(value) {
        this._size = value;
        this.setCls();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set status(value) {
        this._status = value;
        if (this.stepItems) {
            this.setStepStyle();
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set direction(value) {
        this._direction = value;
        this.setCls();
    }
    /**
     * @return {?}
     */
    setStepStyle() {
        /** @type {?} */
        const itemCount = this.stepItems.length;
        /** @type {?} */
        const itemArr = this.stepItems['_results'];
        for (let index = 0; index < itemCount; index++) {
            /** @type {?} */
            const step = itemArr[index];
            step.stepNumber = index + 1;
            if (index < itemCount - 1 && itemArr[index + 1].status === StatusEnum.ERROR) {
                step.stepItemCls = step.stepItemCls
                    ? Object.assign(step.stepItemCls, { 'error-tail': true })
                    : { 'error-tail': true };
            }
            /** @type {?} */
            let icon = step.icon;
            if (!step.status) {
                if (index === this._current) {
                    step.status = this._status;
                }
                else if (index < this._current) {
                    step.status = StatusEnum.FINISH;
                }
                else {
                    step.status = StatusEnum.WAIT;
                }
            }
            if (!icon) {
                if (index < this._current) {
                    icon = 'check-circle-o';
                }
                else if (index > this._current) {
                    icon = 'ellipsis';
                    step.stepItemCls = step.stepItemCls
                        ? Object.assign(step.stepItemCls, { 'ellipsis-item': true })
                        : { 'ellipsis-item': true };
                }
                if ((this._status === StatusEnum.ERROR && index === this._current) || step.status === StatusEnum.ERROR) {
                    icon = 'cross-circle-o';
                }
            }
            step.icon = icon;
            step.iconSize = this._size === 'small' ? (this._status === StatusEnum.WAIT ? 'xxs' : 'xs') : 'md';
            step.setClass();
        }
    }
    /**
     * @return {?}
     */
    setCls() {
        if (this._direction === DirectionEnum.HORIZONTAL) {
            this.clsStepsLabelVtl = true;
            this.clsStepsHztl = true;
            this.clsStepsVtl = false;
        }
        else if (this._direction === DirectionEnum.VERTICAL) {
            this.clsStepsVtl = true;
            this.clsStepsHztl = false;
        }
        if (this._size === 'small') {
            this.clsStepsSmall = true;
        }
        else {
            this.clsStepsSmall = false;
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.setCls();
    }
    /**
     * @return {?}
     */
    ngAfterContentInit() {
        setTimeout(() => {
            this.setStepStyle();
        }, 0);
    }
}
Steps.decorators = [
    { type: Component, args: [{
                selector: 'Steps,nzm-steps',
                template: "<ng-content></ng-content>"
            }] }
];
/** @nocollapse */
Steps.ctorParameters = () => [
    { type: ElementRef },
    { type: Renderer2 }
];
Steps.propDecorators = {
    stepItems: [{ type: ContentChildren, args: [Step,] }],
    current: [{ type: Input }],
    size: [{ type: Input }],
    status: [{ type: Input }],
    direction: [{ type: Input }],
    clsSteps: [{ type: HostBinding, args: ['class.am-steps',] }],
    clsStepsSmall: [{ type: HostBinding, args: ['class.am-steps-small',] }],
    clsStepsLabelVtl: [{ type: HostBinding, args: ['class.am-steps-label-vertical',] }],
    clsStepsVtl: [{ type: HostBinding, args: ['class.am-steps-vertical',] }],
    clsStepsHztl: [{ type: HostBinding, args: ['class.am-steps-horizontal',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class StepsModule {
}
StepsModule.decorators = [
    { type: NgModule, args: [{
                exports: [Steps, Step],
                declarations: [Steps, Step],
                imports: [CommonModule, FormsModule, IconModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CarouselSlideComponent {
    constructor() {
        this.container = true;
        this.height = 'auto';
    }
}
CarouselSlideComponent.decorators = [
    { type: Component, args: [{
                selector: 'CarouselSlide, nzm-carousel-slide',
                template: "<ng-content></ng-content>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
CarouselSlideComponent.propDecorators = {
    container: [{ type: HostBinding, args: ['class.carousel-container',] }],
    width: [{ type: HostBinding, args: ['style.width.px',] }],
    height: [{ type: HostBinding, args: ['style.height',] }],
    left: [{ type: HostBinding, args: ['style.left.px',] }],
    top: [{ type: HostBinding, args: ['style.top.px',] }],
    margin: [{ type: HostBinding, args: ['style.margin',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/**
 * @param {?} event
 * @return {?}
 */
function getEventTarget(event) {
    if (event.type === 'mousedown' || event.type === 'mousemove' || event.type === 'mouseup' || event.type === 'mouseleave') {
        return event;
    }
    else {
        if (event && event.changedTouches && event.changedTouches[0]) {
            return event.changedTouches[0];
        }
        return null;
    }
}

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CarouselComponent {
    /**
     * @param {?} _ele
     */
    constructor(_ele) {
        this._ele = _ele;
        this.style = {
            height: 'auto',
            width: '100%',
            transform: 'translate3d(0px, 0px, 0px)',
            margin: ''
        };
        this._nodeArr = [];
        this._lastIndex = 0;
        this._isMouseDown = false;
        this._rationWidth = 0;
        this._currentSlideWidth = 0;
        this._currentSlideHeight = 0;
        this._transition = '';
        this._spaceWidth = 0;
        this.speed = 500;
        this.selectedIndex = 0;
        this.dots = true;
        this.vertical = false;
        this.autoplay = false;
        this.autoplayInterval = 3000;
        this.infinite = false;
        this.dotStyle = {};
        this.dotActiveStyle = {};
        this.frameOverflow = 'hidden';
        this.cellSpacing = 0;
        this.slideWidth = 1;
        this.swipeSpeed = 12;
        this.dragging = true;
        this.afterChange = new EventEmitter();
        this.beforeChange = new EventEmitter();
        this.carouselWrapper = true;
        this.carouselwrap = true;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panstart(event) {
        event.stopPropagation();
        if (!this.dragging) {
            return;
        }
        this.stopTimer();
        this._isMouseDown = true;
        this.touchObject = {
            startX: getEventTarget(event).pageX,
            startY: getEventTarget(event).pageY,
            direction: this.touchObject.direction
        };
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panmove(event) {
        event.stopPropagation();
        if (!this.dragging && !this._isMouseDown) {
            return;
        }
        const { direction } = this.swipeDirection(this.touchObject.startX, getEventTarget(event).pageX, this.touchObject.startY, getEventTarget(event).pageY);
        if (direction !== 0) {
            event.preventDefault();
        }
        /** @type {?} */
        const length = this.vertical
            ? Math.abs(getEventTarget(event).pageY - this.touchObject.startY)
            : Math.abs(getEventTarget(event).pageX - this.touchObject.startX);
        /** @type {?} */
        const offset = -this.touchObject.direction * length - this.selectedIndex * this._rationWidth;
        this.touchObject = {
            startX: this.touchObject.startX,
            startY: this.touchObject.startY,
            endX: getEventTarget(event).pageX,
            endY: getEventTarget(event).pageY,
            length,
            direction,
            offset
        };
        if (direction !== 0) {
            this.setSlideStyles(this.selectedIndex, this.touchObject.direction);
        }
        this.getListStyles(offset);
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panend(event) {
        event.stopPropagation();
        if (!this.dragging && !this._isMouseDown) {
            return;
        }
        this._isMouseDown = false;
        if (this.touchObject.length > this.swipeSpeed) {
            this.carousel(this.touchObject.direction);
        }
        else {
            this.getListStyles(this.touchObject.direction * this.touchObject.length + this.touchObject.offset);
            this.style['transition'] = this._transition;
        }
        setTimeout(() => {
            this.startTimer();
        }, this.speed);
    }
    /**
     * @return {?}
     */
    cancel() {
        setTimeout(() => {
            this.startTimer();
        }, this.speed);
    }
    /**
     * @return {?}
     */
    initCarouselSize() {
        /** @type {?} */
        const nativeElement = this._ele.nativeElement;
        this.slideHeight = nativeElement.querySelector('carouselslide').clientHeight;
        this._currentSlideHeight = this.slideHeight * this.slideWidth;
        this._currentSlideWidth = nativeElement.clientWidth;
        this._rationWidth = this.vertical ? this._currentSlideWidth : this._currentSlideWidth * this.slideWidth;
        this._spaceWidth = ((this.vertical ? this.slideHeight : this._currentSlideWidth) - this._rationWidth) / 2;
    }
    /**
     * @param {?} items
     * @return {?}
     */
    carouselInit(items) {
        this.infinite = this.infinite || true;
        this._nodeArr = items['_results'];
        this.dragging = this.dragging ? this.dragging : false;
        if (this._nodeArr.length > 1) {
            this._lastIndex = this._nodeArr.length - 1;
            setTimeout(() => {
                this._nodeArr.forEach((v, index) => {
                    v.width = this.vertical ? 'auto' : this._rationWidth - this.cellSpacing;
                    v.left = this.vertical ? 0 : index === this._lastIndex ? -this._rationWidth : index * this._rationWidth;
                    v.top = this.vertical ? (index === this._lastIndex ? -this._rationWidth : index * this._rationWidth) : 0;
                    v.margin = this.vertical ? `${this.cellSpacing / 2}px auto` : `auto ${this.cellSpacing / 2}px`;
                });
                this.startTimer();
            }, 0);
        }
        else if (this._nodeArr.length === 1) {
            setTimeout(() => {
                this._nodeArr.forEach((v) => {
                    v.width = this._rationWidth - this.cellSpacing;
                    v.left = 0;
                    v.top = 0;
                    v.margin = `auto ${this.cellSpacing / 2}px`;
                });
            }, 0);
        }
    }
    /**
     * @return {?}
     */
    startTimer() {
        if (!this.autoplay) {
            return;
        }
        this.stopTimer();
        this._timer = this.autoplayInterval
            ? setInterval(() => {
                this.carousel(1);
            }, this.autoplayInterval)
            : 0;
    }
    /**
     * @return {?}
     */
    stopTimer() {
        clearInterval(this._timer);
    }
    /**
     * @param {?} moveDirection
     * @return {?}
     */
    carousel(moveDirection) {
        if (this.vertical) {
            if (moveDirection === 1) {
                this.moveUp();
            }
            else if (moveDirection === -1) {
                this.moveDown();
            }
        }
        else {
            if (moveDirection === 1) {
                this.moveLeft();
            }
            else if (moveDirection === -1) {
                this.moveRight();
            }
        }
        this.style['transition'] = this._transition;
    }
    /**
     * @return {?}
     */
    moveUp() {
        this.gotoCarousel(this.getAfterNode(false));
    }
    /**
     * @return {?}
     */
    moveDown() {
        this.gotoCarousel(this.getAfterNode(true));
    }
    /**
     * @return {?}
     */
    moveLeft() {
        this.gotoCarousel(this.getAfterNode(false));
    }
    /**
     * @return {?}
     */
    moveRight() {
        this.gotoCarousel(this.getAfterNode(true));
    }
    /**
     * @param {?} pre
     * @return {?}
     */
    getAfterNode(pre) {
        /** @type {?} */
        let nextIndex;
        if (pre) {
            if (this.selectedIndex <= 0) {
                this.getListStyles(this._rationWidth);
                setTimeout(() => {
                    this._nodeArr.forEach((v, tempIndex) => {
                        if (tempIndex === 0) {
                            v.left = this.vertical ? 0 : this._nodeArr.length * this._rationWidth;
                            v.top = this.vertical ? this._nodeArr.length * this._rationWidth : 0;
                        }
                        else {
                            v.left = this.vertical ? 0 : tempIndex * this._rationWidth;
                            v.top = this.vertical ? tempIndex * this._rationWidth : 0;
                        }
                    });
                    this.getListStyles(-this._rationWidth * (this.items.length - 1));
                }, this.speed);
                nextIndex = !this.infinite ? null : this._lastIndex;
                this.beforeChange.emit({ from: this.selectedIndex, to: nextIndex });
                return nextIndex;
            }
            nextIndex = this.selectedIndex - 1;
            this.getListStyles(nextIndex * this._rationWidth * this.touchObject.direction);
            this._nodeArr.forEach((v, tempIndex) => {
                if (0 === tempIndex && nextIndex === this._nodeArr.length - 2) {
                    v.left = 0;
                    v.top = 0;
                }
            });
            this.beforeChange.emit({ from: this.selectedIndex, to: nextIndex });
            return nextIndex;
        }
        else {
            if (this.selectedIndex >= this._lastIndex) {
                this.setSlideStyles(this.selectedIndex, 1);
                this.getListStyles(-(this._lastIndex + 1) * this._rationWidth);
                nextIndex = !this.infinite ? null : 0;
                this.beforeChange.emit({ from: this.selectedIndex, to: nextIndex });
                return nextIndex;
            }
            nextIndex = this.selectedIndex + 1;
            this.setSlideStyles(this.selectedIndex, 1);
            this.getListStyles(-nextIndex * this._rationWidth);
            this.beforeChange.emit({ from: this.selectedIndex, to: nextIndex });
            return nextIndex;
        }
    }
    /**
     * @return {?}
     */
    caculateDirectionLeftCurrentIndex() {
        /** @type {?} */
        const previousIndex = this.selectedIndex;
        this.selectedIndex = (previousIndex + 1) % this.items.length;
    }
    /**
     * @return {?}
     */
    caculateDirectionRightCurrentIndex() {
        if (this.selectedIndex === 0) {
            this.selectedIndex = this.items.length;
        }
        /** @type {?} */
        const previousIndex = this.selectedIndex;
        this.selectedIndex = (previousIndex - 1) % this.items.length;
    }
    /**
     * @param {?} afterIndex
     * @return {?}
     */
    gotoCarousel(afterIndex) {
        if (afterIndex === null) {
            return;
        }
        this.getCurrentIndex();
        if (afterIndex === 0) {
            setTimeout(() => {
                this._nodeArr.forEach((v, index) => {
                    if (index === this._nodeArr.length - 1) {
                        v.left = this.vertical ? 0 : -this._rationWidth;
                        v.top = this.vertical ? -this._rationWidth : 0;
                    }
                    else {
                        v.left = this.vertical ? 0 : index * this._rationWidth;
                        v.top = this.vertical ? index * this._rationWidth : 0;
                    }
                });
                this.startTimer();
                this.getListStyles(0);
            }, this.speed);
        }
        this.selectedIndex = afterIndex;
        this.afterChange.emit(this.selectedIndex);
    }
    /**
     * @return {?}
     */
    getCurrentIndex() {
        if (this.touchObject.direction === 1) {
            this.caculateDirectionLeftCurrentIndex();
        }
        else {
            this.caculateDirectionRightCurrentIndex();
        }
    }
    /**
     * @param {?} index
     * @param {?} direction
     * @param {?=} xDist
     * @return {?}
     */
    setSlideStyles(index, direction, xDist = 0) {
        if (direction === 1) {
            this._nodeArr.forEach((v, tempIndex) => {
                if (index < this._nodeArr.length && index - 1 === tempIndex) {
                    if (xDist === 0 || xDist > this._spaceWidth) {
                        v.left = this.vertical ? 0 : (this._nodeArr.length + tempIndex) * this._rationWidth;
                        v.top = this.vertical ? (this._nodeArr.length + tempIndex) * this._rationWidth : 0;
                    }
                }
                else if (this._nodeArr.length - 1 === tempIndex && index !== 2) {
                    if (xDist === 0 || xDist > this._spaceWidth) {
                        v.left = this.vertical ? 0 : (this._nodeArr.length - 1) * this._rationWidth;
                        v.top = this.vertical ? (this._nodeArr.length - 1) * this._rationWidth : 0;
                    }
                }
                else if (index === this._nodeArr.length - 1 && tempIndex === 1 && this.autoplay) {
                    v.left = this.vertical ? 0 : (this._nodeArr.length + tempIndex) * this._rationWidth;
                    v.top = this.vertical ? tempIndex * this._rationWidth : 0;
                }
                else if (index === this._nodeArr.length - 1 && tempIndex === 0 && !this.autoplay) {
                    v.left = this.vertical ? 0 : (this._nodeArr.length + tempIndex) * this._rationWidth;
                    v.top = this.vertical ? tempIndex * this._rationWidth : 0;
                }
            });
        }
        else if (direction === -1) {
            this._nodeArr.forEach((v, tempIndex) => {
                if (index === 0 && this._nodeArr.length - 1 === tempIndex) {
                    v.left = this.vertical ? 0 : direction * this._rationWidth;
                    v.top = this.vertical ? direction * this._rationWidth : 0;
                }
                else if (index === this._nodeArr.length - 2 && index + 1 === tempIndex) {
                    v.left = this.vertical ? 0 : direction * this._rationWidth;
                    v.top = this.vertical ? direction * this._rationWidth : 0;
                }
                else if (index === 1 && 0 === tempIndex) {
                    v.left = this.vertical ? 0 : direction * this._rationWidth * tempIndex;
                    v.top = this.vertical ? direction * this._rationWidth : 0;
                }
                else if (index > 1) {
                    v.left = this.vertical ? 0 : tempIndex * this._rationWidth;
                    v.top = this.vertical ? tempIndex * this._rationWidth : 0;
                }
            });
        }
    }
    /**
     * @param {?=} offset
     * @return {?}
     */
    getListStyles(offset = 0) {
        /** @type {?} */
        const positionOffset = offset +
            (this.vertical
                ? (this.slideHeight - this._currentSlideHeight) / 2
                : (this._currentSlideWidth - this._rationWidth) / 2) -
            this.cellSpacing;
        this.style = {
            height: this._currentSlideHeight + 'px',
            width: this.items.length * this._rationWidth + 'px',
            transform: this.vertical
                ? `translate3d(0px, ${positionOffset}px, 0px)`
                : `translate3d(${positionOffset}px, 0px, 0px)`,
            margin: this.vertical ? `${(this.cellSpacing / 2) * -1}px 0px` : `0px ${(this.cellSpacing / 2) * -1}px`
        };
    }
    /**
     * @param {?} x1
     * @param {?} x2
     * @param {?} y1
     * @param {?} y2
     * @return {?}
     */
    swipeDirection(x1, x2, y1, y2) {
        /** @type {?} */
        const xDist = x1 - x2;
        /** @type {?} */
        const yDist = y1 - y2;
        /** @type {?} */
        const r = Math.atan2(yDist, xDist);
        /** @type {?} */
        let swipeAngle = Math.round((r * 180) / Math.PI);
        if (swipeAngle < 0) {
            swipeAngle = 360 - Math.abs(swipeAngle);
        }
        if (swipeAngle <= 45 && swipeAngle >= 0) {
            return {
                direction: 1,
                xDist: xDist
            };
        }
        if (swipeAngle <= 360 && swipeAngle >= 315) {
            return {
                direction: 1,
                xDist: xDist
            };
        }
        if (swipeAngle >= 135 && swipeAngle <= 225) {
            return {
                direction: -1,
                xDist: xDist
            };
        }
        if (this.vertical === true) {
            if (swipeAngle >= 35 + 33 && swipeAngle <= 135) {
                return {
                    direction: 1,
                    xDist: xDist
                };
            }
            else {
                return {
                    direction: -1,
                    xDist: xDist
                };
            }
        }
        return {
            direction: 0,
            xDist: xDist
        };
    }
    /**
     * @return {?}
     */
    get page() {
        return this.dots ? this.selectedIndex : 0;
    }
    /**
     * @return {?}
     */
    get pageCount() {
        return this.dots ? this.items.length : 0;
    }
    /**
     * @return {?}
     */
    get dotindicatorStatus() {
        return this.dots ? (this.items.length > 1) : this.dots;
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        this.touchObject = { direction: 1 };
        this._transition = `transform ${this.speed / 1000}s`;
        this.items.changes.subscribe(items => {
            this.carouselInit(items);
        });
        this.initCarouselSize();
        this.getListStyles();
        this.carouselInit(this.items);
        /** @type {?} */
        const nativeElement = this._ele.nativeElement;
        /** @type {?} */
        const targetNode = nativeElement.querySelector('carouselslide');
        /** @type {?} */
        const config = { attributes: true, childList: true, subtree: true };
        /** @type {?} */
        const callback = (mutationsList) => {
            for (const mutation of mutationsList) {
                if (mutation.type == 'attributes') {
                    if (this.slideHeight !== nativeElement.querySelector('carouselslide').clientHeight) {
                        this.initCarouselSize();
                        this.getListStyles();
                    }
                }
            }
        };
        this.observer = new MutationObserver(callback);
        this.observer.observe(targetNode, config);
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this.observer.disconnect();
        this.observer = null;
        this.stopTimer();
    }
}
CarouselComponent.decorators = [
    { type: Component, args: [{
                selector: 'Carousel, nzm-carousel',
                encapsulation: ViewEncapsulation.None,
                template: "<div class=\"slider-frame\" [ngStyle]=\"{overflow: frameOverflow}\">\n  <ul class=\"slider-list\" [ngStyle]=\"style\">\n    <ng-content></ng-content>\n  </ul>\n</div>\n<DotIndicator *ngIf=\"dotindicatorStatus\"\n              class=\"am-carousel-wrap-dot\"\n              [page]=\"page\"\n              [dotStyle]=\"dotStyle\"\n              [pageCount]=\"pageCount\"\n              [dotActiveStyle]=\"dotActiveStyle\"\n></DotIndicator>\n"
            }] }
];
/** @nocollapse */
CarouselComponent.ctorParameters = () => [
    { type: ElementRef }
];
CarouselComponent.propDecorators = {
    items: [{ type: ContentChildren, args: [CarouselSlideComponent,] }],
    speed: [{ type: Input }],
    selectedIndex: [{ type: Input }],
    dots: [{ type: Input }],
    vertical: [{ type: Input }],
    autoplay: [{ type: Input }],
    autoplayInterval: [{ type: Input }],
    infinite: [{ type: Input }],
    dotStyle: [{ type: Input }],
    dotActiveStyle: [{ type: Input }],
    frameOverflow: [{ type: Input }],
    cellSpacing: [{ type: Input }],
    slideWidth: [{ type: Input }],
    swipeSpeed: [{ type: Input }],
    dragging: [{ type: Input }],
    afterChange: [{ type: Output }],
    beforeChange: [{ type: Output }],
    carouselWrapper: [{ type: HostBinding, args: ['class.am-carousel',] }],
    carouselwrap: [{ type: HostBinding, args: ['class.carousel',] }],
    panstart: [{ type: HostListener, args: ['mousedown', ['$event'],] }, { type: HostListener, args: ['touchstart', ['$event'],] }],
    panmove: [{ type: HostListener, args: ['mousemove', ['$event'],] }, { type: HostListener, args: ['touchmove', ['$event'],] }],
    panend: [{ type: HostListener, args: ['mouseleave', ['$event'],] }, { type: HostListener, args: ['mouseup', ['$event'],] }, { type: HostListener, args: ['touchend', ['$event'],] }],
    cancel: [{ type: HostListener, args: ['touchcancel', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class DotIndicatorComponent {
    constructor() {
        this.items = [];
        this._page = 0;
        this._pageCount = 0;
        this.dotStyle = {};
        this.dotActiveStyle = {};
        this.dotColor = 'white';
        this.dotIndicator = true;
    }
    /**
     * @param {?} p
     * @return {?}
     */
    set page(p) {
        this._page = p;
        this.updateSelected();
    }
    /**
     * @param {?} p
     * @return {?}
     */
    set pageCount(p) {
        this._pageCount = p || 0;
        this.updateItems();
    }
    /**
     * @return {?}
     */
    updateItems() {
        this.items = new Array(this._pageCount);
        for (let i = 0; i < this._pageCount; i++) {
            this.items[i] = { active: i == this._page };
        }
    }
    /**
     * @return {?}
     */
    updateSelected() {
        if (this.items.length != this._pageCount) {
            return this.updateItems();
        }
        if (this.items.length == 0) {
            return;
        }
        for (let i = 0; i < this._pageCount; i++) {
            this.items[i].active = false;
        }
        this.items[this._page].active = true;
    }
}
DotIndicatorComponent.decorators = [
    { type: Component, args: [{
                selector: 'DotIndicator, nzm-dot-indicator',
                template: "<div class=\"am-carousel-wrap\">\n  <div *ngFor=\"let item of items\"\n       class=\"am-carousel-wrap-dot\"\n       [class.am-carousel-wrap-dot-active]=\"item.active\"\n  >\n    <span [ngStyle]=\"item.active ? dotActiveStyle : dotStyle\"></span>\n  </div>\n</div>",
                encapsulation: ViewEncapsulation.None
            }] }
];
DotIndicatorComponent.propDecorators = {
    page: [{ type: Input }],
    pageCount: [{ type: Input }],
    dotStyle: [{ type: Input }],
    dotActiveStyle: [{ type: Input }],
    dotColor: [{ type: Input }],
    dotIndicator: [{ type: HostBinding, args: ['class.dot-indicator',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CarouselModule {
}
CarouselModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule],
                declarations: [CarouselComponent, CarouselSlideComponent, DotIndicatorComponent],
                exports: [CarouselComponent, CarouselSlideComponent, DotIndicatorComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/**
 * @param {?} value
 * @return {?}
 */
function toBoolean(value) {
    return coerceBooleanProperty(value);
}

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Checkbox {
    constructor() {
        this.prefixCls = 'am-checkbox';
        this.classMap = {
            [this.prefixCls]: true,
            [`${this.prefixCls}-checked`]: this.checked,
            [`${this.prefixCls}-disabled`]: this.disabled
        };
        this._checked = false;
        this._disabled = false;
        this._ngModelOnChange = Function.prototype;
        this._ngModelOnTouched = Function.prototype;
        this.onChange = new EventEmitter();
        this.checkBoxWrapper = true;
    }
    /**
     * @return {?}
     */
    get checked() {
        return this._checked;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set checked(value) {
        if (!this._disabled) {
            this._checked = value;
            this.updateClassMap();
        }
    }
    /**
     * @return {?}
     */
    get disabled() {
        return this._disabled;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        this._disabled = toBoolean(value);
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onClick(event) {
        event.preventDefault();
        if (!this._disabled) {
            this.updateValue(!this._checked);
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    updateValue(value) {
        this._ngModelOnChange(value);
        this.onChange.emit({ name: this.name, value: this.value, checked: value });
        this.checked = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    writeValue(value) {
        if (null !== value) {
            this.checked = value;
        }
    }
    /**
     * @param {?} fn
     * @return {?}
     */
    registerOnChange(fn) {
        this._ngModelOnChange = fn;
    }
    /**
     * @param {?} fn
     * @return {?}
     */
    registerOnTouched(fn) {
        this._ngModelOnTouched = fn;
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.updateClassMap();
    }
    /**
     * @return {?}
     */
    ngOnChanges() {
        this.updateClassMap();
    }
    /**
     * @return {?}
     */
    updateClassMap() {
        this.classMap = {
            [this.prefixCls]: true,
            [`${this.prefixCls}-checked`]: this.checked,
            [`${this.prefixCls}-disabled`]: this.disabled
        };
    }
}
Checkbox.decorators = [
    { type: Component, args: [{
                selector: '[Checkbox], [nzm-checkbox]',
                template: "<span [ngClass]=\"classMap\">\n  <input type=\"checkbox\"\n         class=\"{{prefixCls}}-input\"\n         [attr.name]=\"name\"\n         [attr.value]=\"value\"\n         [(ngModel)]=\"checked\"\n  >\n  <span class=\"{{prefixCls}}-inner\"></span>\n</span>\n<ng-content></ng-content>\n",
                preserveWhitespaces: false,
                encapsulation: ViewEncapsulation.None,
                providers: [
                    {
                        provide: NG_VALUE_ACCESSOR,
                        useExisting: forwardRef(() => Checkbox),
                        multi: true
                    }
                ]
            }] }
];
/** @nocollapse */
Checkbox.ctorParameters = () => [];
Checkbox.propDecorators = {
    name: [{ type: Input }],
    value: [{ type: Input }],
    checked: [{ type: Input }],
    disabled: [{ type: Input }],
    onChange: [{ type: Output }],
    checkBoxWrapper: [{ type: HostBinding, args: ['class.am-checkbox-wrapper',] }],
    onClick: [{ type: HostListener, args: ['click', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class AgreeItem {
    constructor() {
        this.prefixCls = 'am-checkbox';
        this.checked = false;
        this.disabled = false;
        this.onChange = new EventEmitter();
        this.checkboxAgree = true;
    }
    /**
     * @return {?}
     */
    agree() {
        if (!this.disabled) {
            this.checked = !this.checked;
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    change(event) {
        this.onChange.emit(event);
    }
}
AgreeItem.decorators = [
    { type: Component, args: [{
                selector: 'AgreeItem, nzm-agree-item',
                template: "<label Checkbox\n       class=\"{{prefixCls}}-agree-label\"\n       [name]=\"name\"\n       [value]=\"value\"\n       [checked]=\"checked\"\n       [disabled]=\"disabled\"\n       (click)=\"agree()\"\n       (onChange)=\"change($event)\"\n>\n  <ng-content></ng-content>\n</label>"
            }] }
];
/** @nocollapse */
AgreeItem.ctorParameters = () => [];
AgreeItem.propDecorators = {
    name: [{ type: Input }],
    value: [{ type: Input }],
    checked: [{ type: Input }],
    disabled: [{ type: Input }],
    onChange: [{ type: Output }],
    checkboxAgree: [{ type: HostBinding, args: ['class.am-checkbox-agree',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CheckboxItem {
    constructor() {
        this.prefixCls = 'am-checkbox';
        this.checked = false;
        this.disabled = false;
        this.onChange = new EventEmitter();
        this.onClick = new EventEmitter();
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onCheckboxClick(event) {
        if (!this.disabled) {
            this.checked = !this.checked;
        }
        if (this.onClick.observers.length > 0) {
            this.onClick.emit(event);
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    change(event) {
        this.onChange.emit(event);
    }
}
CheckboxItem.decorators = [
    { type: Component, args: [{
                selector: 'CheckboxItem, nzm-checkbox-item',
                template: "<ListItem [className]=\"'am-checkbox-item ' + (disabled ? 'am-checkbox-item-disabled' : '')\"\n          [disabled]=\"disabled\"\n          [thumb]=\"checkbox\"\n          (onClick)=\"onCheckboxClick($event)\"\n>\n  <ng-content></ng-content>\n</ListItem>\n<ng-template #checkbox>\n  <label Checkbox\n         [name]=\"name\"\n         [value]=\"value\"\n         [checked]=\"checked\"\n         [disabled]=\"disabled\"\n         (onChange)=\"change($event)\"\n  >\n  </label>\n</ng-template>\n"
            }] }
];
/** @nocollapse */
CheckboxItem.ctorParameters = () => [];
CheckboxItem.propDecorators = {
    name: [{ type: Input }],
    value: [{ type: Input }],
    checked: [{ type: Input }],
    disabled: [{ type: Input }],
    onChange: [{ type: Output }],
    onClick: [{ type: Output }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CheckboxModule {
}
CheckboxModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, FormsModule, ListModule],
                declarations: [Checkbox, CheckboxItem, AgreeItem],
                exports: [Checkbox, CheckboxItem, AgreeItem]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Radio {
    constructor() {
        this.prefixCls = 'am-radio';
        this.classMap = {
            [this.prefixCls]: true,
            [`${this.prefixCls}-checked`]: this.checked,
            [`${this.prefixCls}-disabled`]: this.disabled
        };
        this._checked = false;
        this._disabled = false;
        this._ngModelOnChange = Function.prototype;
        this._ngModelOnTouched = Function.prototype;
        this.onChange = new EventEmitter();
        this.radioWrapper = true;
    }
    /**
     * @return {?}
     */
    get checked() {
        return this._checked;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set checked(value) {
        this._checked = value;
        this.updateClassMap();
    }
    /**
     * @return {?}
     */
    get disabled() {
        return this._disabled;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        this._disabled = toBoolean(value);
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onClick(event) {
        event.preventDefault();
        if (!this._disabled && !this._checked) {
            this.updateValue(true);
        }
    }
    /**
     * @param {?} checkValue
     * @return {?}
     */
    updateValue(checkValue) {
        this._ngModelOnChange(checkValue);
        this.onChange.emit({
            name: this.name,
            value: this.value,
            checked: checkValue
        });
        this.checked = checkValue;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    writeValue(value) {
        if (null !== value) {
            this.checked = value;
        }
    }
    /**
     * @param {?} fn
     * @return {?}
     */
    registerOnChange(fn) {
        this._ngModelOnChange = fn;
    }
    /**
     * @param {?} fn
     * @return {?}
     */
    registerOnTouched(fn) {
        this._ngModelOnTouched = fn;
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.updateClassMap();
    }
    /**
     * @return {?}
     */
    ngOnChanges() {
        this.updateClassMap();
    }
    /**
     * @return {?}
     */
    updateClassMap() {
        this.classMap = {
            [this.prefixCls]: true,
            [`${this.prefixCls}-checked`]: this.checked,
            [`${this.prefixCls}-disabled`]: this.disabled
        };
    }
}
Radio.decorators = [
    { type: Component, args: [{
                selector: '[Radio], [nzm-radio]',
                template: "<span [ngClass]=\"classMap\">\n  <input type=\"radio\"\n         class=\"{{prefixCls}}-input\"\n         [attr.name]=\"name\"\n         [attr.value]=\"value\"\n         [(ngModel)]=\"checked\"\n  >\n  <span class=\"{{prefixCls}}-inner\"></span>\n</span>\n<ng-content></ng-content>\n",
                preserveWhitespaces: false,
                encapsulation: ViewEncapsulation.None,
                providers: [
                    {
                        provide: NG_VALUE_ACCESSOR,
                        useExisting: forwardRef(() => Radio),
                        multi: true
                    }
                ]
            }] }
];
/** @nocollapse */
Radio.ctorParameters = () => [];
Radio.propDecorators = {
    name: [{ type: Input }],
    value: [{ type: Input }],
    checked: [{ type: Input }],
    disabled: [{ type: Input }],
    onChange: [{ type: Output }],
    radioWrapper: [{ type: HostBinding, args: ['class.am-radio-wrapper',] }],
    onClick: [{ type: HostListener, args: ['click', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class RadioItem {
    constructor() {
        this.prefixCls = 'am-radio';
        this.checked = false;
        this.disabled = false;
        this.onClick = new EventEmitter();
        this.onChange = new EventEmitter();
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onRadioItemClick(event) {
        if (!this.disabled && !this.checked) {
            this.checked = true;
            this.onChange.emit({
                name: this.name,
                value: this.value,
                checked: true
            });
        }
        if (this.onClick.observers.length > 0) {
            this.onClick.emit(event);
        }
    }
}
RadioItem.decorators = [
    { type: Component, args: [{
                selector: 'RadioItem, nzm-radio-item',
                template: "<ListItem [className]=\"'am-radio-item ' + (disabled ? 'am-radio-item-disabled' : '')\"\n          [extra]=\"radio\"\n          [disabled]=\"disabled\"\n          (onClick)=\"onRadioItemClick($event)\"\n>\n  <ng-content></ng-content>\n</ListItem>\n<ng-template #radio>\n  <label Radio\n         [name]=\"name\"\n         [value]=\"value\"\n         [checked]=\"checked\"\n         [disabled]=\"disabled\"\n  ></label>\n</ng-template>\n"
            }] }
];
/** @nocollapse */
RadioItem.ctorParameters = () => [];
RadioItem.propDecorators = {
    name: [{ type: Input }],
    value: [{ type: Input }],
    checked: [{ type: Input }],
    disabled: [{ type: Input }],
    onClick: [{ type: Output }],
    onChange: [{ type: Output }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class RadioModule {
}
RadioModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, FormsModule, ListModule],
                declarations: [Radio, RadioItem],
                exports: [Radio, RadioItem]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ProgressComponent {
    constructor() {
        this.prefixCls = 'am-progress';
        this._percent = 0;
        this._exceedance = false;
        this.unfilled = true;
        this.position = 'fixed';
        this.barStyle = {};
        this.max = 100;
        this.outer = true;
    }
    /**
     * @return {?}
     */
    get percent() {
        return this._percent;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set percent(value) {
        this._percent = value;
        if (value > 100) {
            this._exceedance = true;
        }
        else {
            this._exceedance = false;
        }
    }
    /**
     * @return {?}
     */
    get value() {
        return this.percent;
    }
    /**
     * @return {?}
     */
    get fixOuter() {
        return 'fixed' === this.position;
    }
    /**
     * @return {?}
     */
    get hideOuter() {
        return !this.unfilled && !this._exceedance;
    }
    /**
     * @return {?}
     */
    get exceedance() {
        return this._exceedance;
    }
}
ProgressComponent.decorators = [
    { type: Component, args: [{
                selector: 'Progress, nzm-progress',
                template: "<div class=\"{{prefixCls}}-bar\" [ngStyle]=\"barStyle\" [style.width.%]=\"percent\"></div>",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
ProgressComponent.ctorParameters = () => [];
ProgressComponent.propDecorators = {
    unfilled: [{ type: Input }],
    position: [{ type: Input }],
    barStyle: [{ type: Input }],
    percent: [{ type: Input }],
    max: [{ type: HostBinding, args: ['attr.max',] }],
    value: [{ type: HostBinding, args: ['attr.value',] }],
    outer: [{ type: HostBinding, args: ['class.am-progress-outer',] }],
    fixOuter: [{ type: HostBinding, args: ['class.am-progress-fixed-outer',] }],
    hideOuter: [{ type: HostBinding, args: ['class.am-progress-hide-outer',] }],
    exceedance: [{ type: HostBinding, args: ['class.am-progress-exceedance',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ProgressModule {
}
ProgressModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule],
                declarations: [ProgressComponent],
                exports: [ProgressComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class AccordionService {
    constructor() {
        this.accordion = false;
    }
    /**
     * @param {?} component
     * @return {?}
     */
    getComponent(component) {
        this.accordion = component.accordion;
        this.component = component;
    }
}
AccordionService.decorators = [
    { type: Injectable }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class AccordionGroupComponent {
    /**
     * @param {?} _accordionService
     * @param {?} _cdr
     */
    constructor(_accordionService, _cdr) {
        this._accordionService = _accordionService;
        this._cdr = _cdr;
        this.isShowChild = true;
        this.isOpened = false;
        this.disabled = false;
        this.onOpen = new EventEmitter();
        this.onClose = new EventEmitter();
        this.onChange = new EventEmitter();
        this._amItem = true;
        this._isActive = this.isOpened;
        this._addon = true;
    }
    /**
     * @return {?}
     */
    checkAndToggle() {
        this.toggle();
    }
    /**
     * @return {?}
     */
    get slide() {
        return this.isOpened ? 'down' : 'up';
    }
    /**
     * @return {?}
     */
    toggle() {
        if (this.disabled) {
            return;
        }
        this.isShowChild = true;
        /** @type {?} */
        const isOpenedBeforeWeChange = this.isOpened;
        if (this._accordionService.accordion) {
            this._accordionService.component.closeAll();
        }
        this.isOpened = !isOpenedBeforeWeChange;
        if (this.isOpened) {
            this.onOpen.emit();
        }
        else {
            this.onClose.emit();
        }
        this.onChange.emit(this.isOpened);
    }
    /**
     * @return {?}
     */
    openOnInitialization() {
        setTimeout(() => {
            this.isOpened = true;
            this._cdr.detectChanges();
        }, 0);
    }
    /**
     * @param {?} event
     * @return {?}
     */
    slideAnimationDoen(event) {
        if (event.fromState === 'down' && event.toState === 'up') {
            this.isShowChild = false;
        }
    }
}
AccordionGroupComponent.decorators = [
    { type: Component, args: [{
                selector: 'AccordionPanel',
                template: "<div role=\"tab\"\n     class=\"am-accordion-header\"\n     data-scale=\"true\"\n     [attr.aria-expanded]=\"isOpened\"\n     (click)=\"checkAndToggle()\"\n>\n  <i class=\"arrow\"></i>\n  {{header}}\n</div>\n<div role=\"tabpanel\"\n     class=\"am-accordion-content\"\n     [ngClass]=\"{'am-accordion-content-active':isOpened}\"\n     [@slide]=\"slide\"\n     (@slide.done)=\"slideAnimationDoen($event)\" \n>\n  <div *ngIf=\"isShowChild\" class=\"am-accordion-content-box\">\n    <ng-content></ng-content>\n  </div>\n</div>\n",
                encapsulation: ViewEncapsulation.None,
                animations: [
                    trigger('slide', [
                        state('up', style({ height: 0 })),
                        state('down', style({ height: '*' })),
                        transition('down => up', [animate(200, style({ height: 0 }))]),
                        transition('up => down', [
                            animate(200, style({
                                height: '*'
                            }))
                        ])
                    ])
                ]
            }] }
];
/** @nocollapse */
AccordionGroupComponent.ctorParameters = () => [
    { type: AccordionService },
    { type: ChangeDetectorRef }
];
AccordionGroupComponent.propDecorators = {
    key: [{ type: Input }],
    header: [{ type: Input }],
    isOpened: [{ type: Input }],
    disabled: [{ type: Input }],
    onOpen: [{ type: Output }],
    onClose: [{ type: Output }],
    onChange: [{ type: Output }],
    _amItem: [{ type: HostBinding, args: ['class.am-accordion-item',] }],
    _isActive: [{ type: HostBinding, args: ['class.am-accordion-item-active',] }],
    _addon: [{ type: HostBinding, args: ['class.addon',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class AccordionComponent {
    /**
     * @param {?} _accordionService
     */
    constructor(_accordionService) {
        this._accordionService = _accordionService;
        this.expandAll = false;
        this.openAnimation = {};
        this.accordion = false;
        this.onChange = new EventEmitter();
        this.amAccordion = true;
        this._accordionService.getComponent(this);
    }
    /**
     * @param {?} event
     * @return {?}
     */
    click(event) {
        /** @type {?} */
        let result = [];
        this.groups.toArray().forEach(group => {
            if (group.isOpened) {
                if (this.accordion) {
                    result = group.key;
                }
                else {
                    result.push(group.key);
                }
            }
        });
        this.onChange.emit(result);
    }
    /**
     * @return {?}
     */
    closeAll() {
        this.groups.toArray().forEach(group => {
            group.isOpened = false;
        });
    }
    /**
     * @return {?}
     */
    init() {
        if (this.expandAll && this.groups && this.groups.length > 0) {
            this._oldGroups = this.groups.toArray();
            this._oldGroups.forEach((group, index) => {
                group.openOnInitialization();
            });
            this._subscription = this.groups.changes.subscribe(change => {
                /** @type {?} */
                const newGroups = this.groups.toArray().filter(group => {
                    return this._oldGroups.indexOf(group) === -1;
                });
                newGroups.forEach(group => {
                    group.openOnInitialization();
                });
                this._oldGroups = this.groups.toArray();
            });
        }
        /** @type {?} */
        let currentActiveKey = [];
        if (this.activeKey !== undefined && this.activeKey.length > 0 && !this.accordion && this.groups && this.groups.length > 0) {
            currentActiveKey = this.toArray(this.activeKey);
            this.groups.forEach((group, index) => {
                currentActiveKey.forEach(key => {
                    if (index === parseInt(key, 0)) {
                        setTimeout(() => {
                            group.isOpened = true;
                        }, 0);
                    }
                });
            });
        }
        else if (this.defaultActiveKey !== undefined && !this.expandAll && !this.accordion && this.groups && this.groups.length > 0) {
            this.groups.forEach((group, index) => {
                if (index === parseInt(this.defaultActiveKey, 0)) {
                    setTimeout(() => {
                        group.isOpened = true;
                    }, 0);
                }
            });
        }
    }
    /**
     * @param {?} activeKey
     * @return {?}
     */
    toArray(activeKey) {
        /** @type {?} */
        let currentActiveKey = activeKey;
        if (!Array.isArray(currentActiveKey)) {
            currentActiveKey = currentActiveKey !== undefined && currentActiveKey !== '' ? [currentActiveKey] : [];
        }
        return currentActiveKey;
    }
    /**
     * @param {?} changes
     * @return {?}
     */
    ngOnChanges(changes) {
        if (changes["accordion"]) {
            this._accordionService.getComponent(this);
        }
        if (changes["expandAll"] || changes["accordion"]) {
            this.init();
        }
    }
    /**
     * @return {?}
     */
    ngAfterContentInit() {
        this.init();
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        if (this._subscription) {
            this._subscription.unsubscribe();
        }
    }
}
AccordionComponent.decorators = [
    { type: Component, args: [{
                selector: 'Accordion, nzm-accordion',
                template: "<ng-content></ng-content>",
                providers: [AccordionService]
            }] }
];
/** @nocollapse */
AccordionComponent.ctorParameters = () => [
    { type: AccordionService }
];
AccordionComponent.propDecorators = {
    groups: [{ type: ContentChildren, args: [forwardRef(() => AccordionGroupComponent),] }],
    expandAll: [{ type: Input }],
    activeKey: [{ type: Input }],
    defaultActiveKey: [{ type: Input }],
    openAnimation: [{ type: Input }],
    accordion: [{ type: Input }],
    onChange: [{ type: Output }],
    amAccordion: [{ type: HostBinding, args: ['class.am-accordion',] }],
    click: [{ type: HostListener, args: ['click', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class AccordionModule {
}
AccordionModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, WhiteSpaceModule],
                declarations: [AccordionComponent, AccordionGroupComponent],
                exports: [AccordionComponent, AccordionGroupComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class NoticeBarComponent {
    /**
     * @param {?} _iconHandler
     */
    constructor(_iconHandler) {
        this._iconHandler = _iconHandler;
        this.isShow = false;
        this.isStopScroll = false;
        this.marqueeScroll = 'scrolling';
        this.style = {};
        this._timer = null;
        this.marqueeProps = { loop: true, leading: 500, trailing: 8000, fps: 200, style: {} };
        this.noticeBarcontent = '';
        this.onClick = new EventEmitter();
        this._iconHandler.load();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set stopScrolling(value) {
        this.isStopScroll = value;
        if (value) {
            this.marqueeScroll = 'scrolling-stop';
            clearTimeout(this._timer);
            this._timer = setTimeout(function () {
                this.marqueeScroll = 'scrolling';
            }, 1000);
        }
    }
    /**
     * @return {?}
     */
    get mode() {
        return this._mode;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set mode(value) {
        this._mode = value;
    }
    /**
     * @return {?}
     */
    get icon() {
        return this._icon;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set icon(value) {
        this._icon = value;
    }
    /**
     * @return {?}
     */
    get action() {
        return this._action;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set action(value) {
        this._action = value;
    }
    /**
     * @return {?}
     */
    click() {
        this.onClick.emit(this._mode);
        if (this._mode === 'closable') {
            this.isShow = false;
        }
    }
    /**
     * @return {?}
     */
    dataProcess() {
        this.isShow = true;
        this.style = {
            width: '200%'
        };
        if (window.innerWidth < this._width) {
            /** @type {?} */
            const count = this.marqueeProps.loop ? 'infinite' : 1;
            this.style = {
                width: this._width * 2 + 'px',
                'animation-delay': `${this.marqueeProps.leading}ms`,
                'animation-duration': `${(1 / this.marqueeProps.fps) * 1000}s`,
                'animation-iteration-count': `${count}`
            };
            scroll.call(this);
        }
        else {
            this.marqueeScroll = 'scrolling-stop';
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        document.addEventListener('touchstart', () => {
            this.marqueeScroll = 'scrolling-stop';
        });
        document.addEventListener('touchend', () => {
            this.marqueeScroll = 'scrolling';
        });
        this._width = getRectWidth(this.noticeBarcontent);
        this.dataProcess();
    }
}
NoticeBarComponent.decorators = [
    { type: Component, args: [{
                selector: 'NoticeBar, nzm-notice-bar',
                template: "<div role=\"alert\" *ngIf=\"isShow\" class=\"am-notice-bar\" (click)=\"click()\">\n  <div *ngIf=\"icon !== null\" class=\"am-notice-bar-icon\">\n    <ng-template [ngTemplateOutlet]=\"icon || voice\"></ng-template>\n  </div>\n  <div class=\"am-notice-bar-content\">\n    <div class=\"marquee\">\n      <div [ngClass]=\"marqueeScroll\" [ngStyle]=\"style\">\n        <span>{{noticeBarcontent}}</span>\n        <span>{{noticeBarcontent}}</span>\n      </div>\n    </div>\n  </div>\n  <div role=\"button\" *ngIf=\"mode && action !== null\" class=\"am-notice-bar-operation\">\n    <ng-template *ngIf=\"mode === 'closable'\" [ngTemplateOutlet]=\"action || cross\"></ng-template>\n    <ng-template *ngIf=\"mode === 'link'\" [ngTemplateOutlet]=\"action || right\"></ng-template>\n  </div>\n</div>\n\n<ng-template #voice>\n  <Icon [type]=\"'voice'\" [size]=\"'xxs'\"></Icon>\n</ng-template>\n<ng-template #cross>\n  <Icon [type]=\"'cross'\" [size]=\"'md'\"></Icon>\n</ng-template>\n<ng-template #right>\n  <Icon [type]=\"'right'\" [size]=\"'md'\"></Icon>\n</ng-template>\n",
                providers: [IconHandler]
            }] }
];
/** @nocollapse */
NoticeBarComponent.ctorParameters = () => [
    { type: IconHandler }
];
NoticeBarComponent.propDecorators = {
    stopScrolling: [{ type: Input }],
    mode: [{ type: Input }],
    icon: [{ type: Input }],
    action: [{ type: Input }],
    marqueeProps: [{ type: Input }],
    noticeBarcontent: [{ type: Input }],
    onClick: [{ type: Output }]
};
/**
 * @return {?}
 */
function scroll() {
    /** @type {?} */
    let styleDom = document.getElementById('notice_bar_animation_cls');
    if (styleDom) {
        return;
    }
    styleDom = document.createElement('style');
    styleDom.setAttribute('id', 'notice_bar_animation_cls');
    styleDom.innerHTML = `@-webkit-keyframes noticebarmarquee{ 0% { left: 0px; } 100% { left: -${this._width}px; }}`;
    document.body.appendChild(styleDom);
}
/**
 * @param {?} text
 * @return {?}
 */
function getRectWidth(text) {
    /** @type {?} */
    const _dom = document.createElement('div');
    _dom.innerHTML = text;
    _dom.style.position = 'absolute';
    _dom.style.left = '-9999';
    _dom.style.whiteSpace = 'nowrap';
    _dom.style.fontSize = '14px';
    document.body.appendChild(_dom);
    /** @type {?} */
    const _w = _dom.clientWidth + 20;
    document.body.removeChild(_dom);
    return _w;
}

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class NoticeBarModule {
}
NoticeBarModule.decorators = [
    { type: NgModule, args: [{
                imports: [IconModule, CommonModule],
                declarations: [NoticeBarComponent],
                exports: [NoticeBarComponent],
                providers: [],
                entryComponents: []
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ToastComponent {
    /**
     * @param {?} _zone
     */
    constructor(_zone) {
        this._zone = _zone;
        this.prefixCls = 'am-toast';
        this.isContentString = true;
        this.transitionName = 'am-fade-enter am-fade-enter-active';
        this._iconType = '';
        this._content = '';
        this.mask = true;
        this.amToast = true;
    }
    /**
     * @return {?}
     */
    get content() {
        return this._content;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set content(value) {
        if (value instanceof TemplateRef) {
            this.isContentString = false;
        }
        else {
            this.isContentString = true;
        }
        this._zone.run(() => {
            this._content = value;
        });
    }
    /**
     * @return {?}
     */
    get iconType() {
        return this._iconType;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set iconType(value) {
        this._zone.run(() => {
            this._iconType = value;
        });
    }
    /**
     * @return {?}
     */
    get amToastMask() {
        return this.mask;
    }
    /**
     * @return {?}
     */
    get amToastNoMask() {
        return !this.mask;
    }
}
ToastComponent.decorators = [
    { type: Component, args: [{
                selector: 'Toast',
                encapsulation: ViewEncapsulation.None,
                template: "<div class=\"{{prefixCls}}-notice {{prefixCls}}-notice-closable {{transitionName}}\">\n  <div class=\"{{prefixCls}}-notice-content\">\n    <div role=\"alert\"\n         *ngIf=\"iconType\"\n         class=\"{{prefixCls}}-text {{prefixCls}}-text-icon\"\n         aria-live=\"assertive\"\n    >\n      <Icon [type]=\"iconType\" [size]=\"'lg'\"></Icon>\n      <div *ngIf=\"isContentString\" class=\"{{prefixCls}}-text-info\">{{content}}</div>\n    </div>\n    <div *ngIf=\"!iconType\" class=\"{{prefixCls}}-text\" role=\"alert\" aria-live=\"assertive\">\n      <div *ngIf=\"isContentString\" class=\"{{prefixCls}}-text-info\">{{content}}</div>\n      <ng-template *ngIf=\"!isContentString\" [ngTemplateOutlet]=\"content\"></ng-template>\n    </div>\n  </div>\n  <a class=\"{{prefixCls}}-notice-close\">\n    <span class=\"{{prefixCls}}-notice-close-x\"></span>\n  </a>\n</div>\n"
            }] }
];
/** @nocollapse */
ToastComponent.ctorParameters = () => [
    { type: NgZone }
];
ToastComponent.propDecorators = {
    mask: [{ type: Input }],
    content: [{ type: Input }],
    iconType: [{ type: Input }],
    amToast: [{ type: HostBinding, args: ['class.am-toast',] }],
    amToastMask: [{ type: HostBinding, args: ['class.am-toast-mask',] }],
    amToastNoMask: [{ type: HostBinding, args: ['class.am-toast-nomask',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ToastModule {
}
ToastModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, IconModule, WingBlankModule],
                exports: [ToastComponent],
                declarations: [ToastComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class BaseOptions {
    constructor() {
        this.visible = false;
        this.focus = true;
        this.closable = false;
        this.maskClosable = true;
        this.transparent = false;
        this.popup = false;
        this.transitionName = 'am-zoom';
        this.maskTransitionName = 'am-fade';
    }
}
class ModalOptions extends BaseOptions {
}
ModalOptions.decorators = [
    { type: Injectable }
];
class AlertOptions extends BaseOptions {
}
AlertOptions.decorators = [
    { type: Injectable }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ModalComponent {
    /**
     * @param {?} _option
     */
    constructor(_option) {
        this._option = _option;
        this.defaultProps = {
            visible: false,
            prefixCls: 'am-modal',
            transparent: false,
            popup: false,
            animationType: 'slide-down',
            animated: true,
            style: {},
            footer: [],
            closable: false,
            maskClosable: false,
            operation: false,
            platform: 'ios',
            className: '',
            wrapClassName: '',
            message: '',
            actions: [],
            callbackOrActions: [],
            type: '',
            defaultValue: '',
            placeholders: []
        };
        this.value = '';
        this.passwordValue = '';
        this.autoFocus = { focus: true, date: new Date() };
        this.transitionName = '';
        this.maskTransitionName = '';
        this.isTitleString = true;
        this.isMessageString = true;
        this.wrapCls = {};
        this.cls = {};
        this.btnGroupClass = {};
        this.data = {};
        this._title = '';
        this._message = '';
        this._focus = true;
        this.onClose = new EventEmitter();
    }
    /**
     * @return {?}
     */
    get title() {
        return this._title;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set title(value) {
        if (value instanceof TemplateRef) {
            this.isTitleString = false;
        }
        else {
            this.isTitleString = true;
        }
        this._title = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set visible(value) {
        if (!value) {
            this.leaveAnimation();
        }
        else {
            this.defaultProps.visible = value;
            if (this.defaultProps.animated) {
                if (this.defaultProps.transparent) {
                    this.transitionName = this.maskTransitionName = 'am-fade-enter am-fade-enter-active';
                }
                else {
                    this.transitionName = this.maskTransitionName = 'am-slide-up-enter am-slide-up-enter-active';
                }
                if (this.defaultProps.popup) {
                    this.transitionName =
                        this.defaultProps.animationType === 'slide-up'
                            ? 'am-slide-up-enter am-slide-up-enter-active'
                            : 'am-slide-down-enter am-slide-down-enter-active';
                    this.maskTransitionName = 'am-fade-enter am-fade-enter-active';
                }
            }
            this.setClassMap();
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set closable(value) {
        this.defaultProps.closable = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set maskClosable(value) {
        this.defaultProps.maskClosable = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set popup(value) {
        this.defaultProps.popup = value;
        this.setClassMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set animationType(value) {
        this.defaultProps.animationType = value;
        this.setClassMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set transparent(value) {
        this.defaultProps.transparent = value;
        this.setClassMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set footer(value) {
        this.defaultProps.footer = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set platform(value) {
        this.defaultProps.platform = value;
        this.setClassMap();
    }
    /**
     * @return {?}
     */
    get message() {
        return this._message;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set message(value) {
        if (value instanceof TemplateRef) {
            this.isMessageString = false;
        }
        else {
            this.isMessageString = true;
        }
        this._message = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set className(value) {
        this.defaultProps.className = value;
        this.setClassMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set wrapClassName(value) {
        this.defaultProps.wrapClassName = value;
        this.setClassMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set actions(value) {
        this.defaultProps.footer = value;
        this.setClassMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set defaultValue(value) {
        this.defaultProps.defaultValue = value !== undefined ? value : '';
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set type(value) {
        this.defaultProps.type = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set placeholders(value) {
        this.defaultProps.placeholders = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set operation(value) {
        this.defaultProps.operation = value;
        this.setClassMap();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set focus(value) {
        if (value) {
            this._focus = value;
        }
    }
    /**
     * @return {?}
     */
    setClassMap() {
        this.wrapCls = {
            [this.defaultProps.wrapClassName]: true,
            [`${this.defaultProps.prefixCls}-wrap-popup`]: this.defaultProps.popup
        };
        this.cls = {
            [this.defaultProps.className]: true,
            [`${this.defaultProps.prefixCls}-transparent`]: this.defaultProps.transparent,
            [`${this.defaultProps.prefixCls}-popup`]: this.defaultProps.popup,
            [`${this.defaultProps.prefixCls}-popup-${this.defaultProps.animationType}`]: this.defaultProps.popup && this.defaultProps.animationType,
            [`${this.defaultProps.prefixCls}-android`]: this.defaultProps.platform === 'android'
        };
        this.btnGroupClass = {
            [`${this.defaultProps.prefixCls}-button-group-${this.defaultProps.footer.length === 2 && !this.defaultProps.operation ? 'h' : 'v'}`]: true,
            [`${this.defaultProps.prefixCls}-button-group-${this.defaultProps.operation ? 'operation' : 'normal'}`]: true
        };
    }
    /**
     * @param {?} type
     * @param {?} value
     * @return {?}
     */
    inputChange(type, value) {
        this.data[type] = value;
    }
    /**
     * @return {?}
     */
    leaveAnimation() {
        if (this.defaultProps.animated) {
            if (this.defaultProps.transparent) {
                this.transitionName = this.maskTransitionName = 'am-fade-leave am-fade-leave-active';
            }
            else {
                this.transitionName = this.maskTransitionName = 'am-slide-up-leave am-slide-up-leave-active';
            }
            if (this.defaultProps.popup) {
                this.transitionName =
                    this.defaultProps.animationType === 'slide-up'
                        ? 'am-slide-up-leave am-slide-up-leave-active'
                        : 'am-slide-down-leave am-slide-down-leave-active';
                this.maskTransitionName = 'am-fade-leave am-fade-leave-active';
            }
        }
        setTimeout(() => {
            this.defaultProps.visible = false;
        }, 200);
    }
    /**
     * @return {?}
     */
    close() {
        if ((!this.defaultProps.closable || !this.defaultProps.maskClosable) && !this.defaultProps.popup) {
            return;
        }
        if (this._option.close) {
            this._option.close();
        }
        else {
            this.leaveAnimation();
            this.onClose.emit();
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.setClassMap();
    }
}
ModalComponent.decorators = [
    { type: Component, args: [{
                selector: 'Modal',
                template: "<div *ngIf=\"defaultProps.visible\">\n  <div class=\"{{defaultProps.prefixCls}}-mask {{maskTransitionName}}\"></div>\n  <div role=\"dialog\"\n       class=\"{{defaultProps.prefixCls}}-wrap {{transitionName}}\"\n       [ngClass]=\"wrapCls\"\n       (click)=\"close()\"\n  >\n    <div role=\"document\"\n         class=\"{{defaultProps.prefixCls}}\"\n         [ngClass]=\"cls\"\n    >\n      <div class=\"{{defaultProps.prefixCls}}-content\">\n        <div *ngIf=\"defaultProps.closable\"\n             class=\"{{defaultProps.prefixCls}}-close\"\n             (click)=\"close()\"\n      >\n          <span class=\"{{defaultProps.prefixCls}}-close-x\"></span>\n        </div>\n        <div class=\"{{defaultProps.prefixCls}}-header\">\n          <div *ngIf=\"isTitleString\" class=\"{{defaultProps.prefixCls}}-title\">{{title}}</div>\n          <ng-template *ngIf=\"!isTitleString\" [ngTemplateOutlet]=\"title\"></ng-template>\n        </div>\n        <div class=\"{{defaultProps.prefixCls}}-body\">\n          <ng-content></ng-content>\n          <div *ngIf=\"isMessageString\" class=\"{{defaultProps.prefixCls}}-alert-content\">{{message}}</div>\n          <ng-template *ngIf=\"!isMessageString\" [ngTemplateOutlet]=\"message\"></ng-template>\n          <ng-template *ngIf=\"defaultProps.type === 'default'\" [ngTemplateOutlet]=\"promptDefault\"></ng-template>\n          <ng-template *ngIf=\"defaultProps.type === 'secure-text'\" [ngTemplateOutlet]=\"promptSecure\"></ng-template>\n          <ng-template *ngIf=\"defaultProps.type === 'login-password'\" [ngTemplateOutlet]=\"promptPassword\"></ng-template>\n        </div>\n        <div class=\"{{defaultProps.prefixCls}}-footer\">\n          <div [ngClass]=\"btnGroupClass\" role=\"group\">\n            <div Button\n                 role=\"button\"\n                 *ngFor=\"let button of defaultProps.footer\"\n                 [className]=\"'am-modal-button'\"\n                 (onClick)=\"button.onPress()\"\n            >\n              {{button.text}}\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n<ng-template #promptPassword>\n  <div class=\"{{defaultProps.prefixCls}}-input-container\">\n    <div class=\"{{defaultProps.prefixCls}}-input\">\n        <input \n          #inputElement \n          autofocus\n          [type]=\"'text'\" \n          [defaultValue]=\"defaultProps.defaultValue || ''\" \n          [placeholder]=\"defaultProps.placeholders[0] || ''\"\n          [(ngModel)]=\"value\" \n          (ngModelChange)=\"inputChange('text', $event)\" \n        >\n    </div>\n    <div className=\"{{defaultProps.prefixCls}}-input\">\n        <input \n          #inputElement \n          [type]=\"'password'\" \n          [defaultValue]=\"defaultProps.defaultValue || ''\" \n          [placeholder]=\"defaultProps.placeholders[0] || ''\"\n          [(ngModel)]=\"passwordValue\" \n          (ngModelChange)=\"inputChange('password', $event)\" \n        >\n    </div>\n  </div>\n</ng-template>\n<ng-template #promptSecure>\n  <div className=\"{{defaultProps.prefixCls}}-input-container\">\n    <div className=\"{{defaultProps.prefixCls}}-input\">\n        <input \n          #inputElement \n          autofocus\n          [type]=\"'password'\" \n          [defaultValue]=\"defaultProps.defaultValue || ''\" \n          [placeholder]=\"defaultProps.placeholders[0] || ''\"\n          [(ngModel)]=\"passwordValue\" \n          (ngModelChange)=\"inputChange('password', $event)\" \n        >\n    </div>\n  </div>\n</ng-template>\n<ng-template #promptDefault>\n  <div className=\"{{defaultProps.prefixCls}}-input-container\">\n    <div className=\"{{defaultProps.prefixCls}}-input\">\n      <input \n        #inputElement \n        autofocus\n        [type]=\"'text'\" \n        [defaultValue]=\"defaultProps.defaultValue || ''\" \n        [placeholder]=\"defaultProps.placeholders[0] || ''\"\n        [(ngModel)]=\"value\" \n        (ngModelChange)=\"inputChange('text', $event)\" \n      >\n    </div>\n  </div>\n</ng-template>",
                encapsulation: ViewEncapsulation.None,
                providers: [NgSwitch, NgSwitchCase, ModalOptions]
            }] }
];
/** @nocollapse */
ModalComponent.ctorParameters = () => [
    { type: ModalOptions }
];
ModalComponent.propDecorators = {
    inputElementRef: [{ type: ViewChild, args: ['inputElement',] }],
    title: [{ type: Input }],
    visible: [{ type: Input }],
    closable: [{ type: Input }],
    maskClosable: [{ type: Input }],
    popup: [{ type: Input }],
    animationType: [{ type: Input }],
    transparent: [{ type: Input }],
    footer: [{ type: Input }],
    platform: [{ type: Input }],
    message: [{ type: Input }],
    className: [{ type: Input }],
    wrapClassName: [{ type: Input }],
    actions: [{ type: Input }],
    defaultValue: [{ type: Input }],
    type: [{ type: Input }],
    placeholders: [{ type: Input }],
    operation: [{ type: Input }],
    focus: [{ type: Input }],
    onClose: [{ type: Output }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ModalModule {
}
ModalModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, ListModule, WingBlankModule, WhiteSpaceModule, ButtonModule, InputItemModule, FormsModule, ReactiveFormsModule],
                exports: [ModalComponent],
                declarations: [ModalComponent],
                providers: [NgSwitch, NgSwitchCase]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PopoverOptions {
    constructor() {
        this.showArrow = false;
        this.mask = false;
        this.placement = 'bottom';
        this.appendToBody = false;
    }
}

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PopoverComponentOptions extends PopoverOptions {
}
PopoverComponentOptions.decorators = [
    { type: Injectable }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PopoverComponent {
    /**
     * @param {?} options
     */
    constructor(options) {
        this.options = options;
        this.defaultProps = {
            prefixCls: 'am-popover'
        };
        this.maskCls = {};
        this.popoverCls = {};
    }
    /**
     * @return {?}
     */
    setClassMap() {
        this.maskCls = {
            [`${this.defaultProps.prefixCls}-mask`]: this.options.mask,
            [`${this.defaultProps.prefixCls}-mask-hidden`]: !this.options.mask
        };
        this.popoverCls = {
            [`${this.defaultProps.prefixCls}`]: true,
            [`${this.defaultProps.prefixCls}-placement-${this.options.placement}`]: true
        };
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.setClassMap();
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        this.options.onAfterViewInit();
    }
}
PopoverComponent.decorators = [
    { type: Component, args: [{
                selector: 'Popover',
                template: "<ng-content></ng-content>\n<div [ngClass]=\"maskCls\" (click)=\"options.hidePopover()\"></div>\n<div [ngClass]=\"popoverCls\" style=\"color: currentcolor;\">\n  <div class=\"{{defaultProps.prefixCls}}-content\">\n    <div *ngIf=\"options.showArrow\" class=\"{{defaultProps.prefixCls}}-arrow\"></div>\n    <div class=\"{{defaultProps.prefixCls}}-inner\">\n      <div class=\"{{defaultProps.prefixCls}}-inner-wrapper\">\n        <ng-template [ngTemplateOutlet]=\"options.overlay\" [ngTemplateOutletContext]=\"{options: options}\">\n        </ng-template>\n      </div>\n    </div>\n  </div>\n</div>",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
PopoverComponent.ctorParameters = () => [
    { type: PopoverComponentOptions }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/**
 * @param {?} element
 * @return {?}
 */
function getAllStyles(element) { return window.getComputedStyle(element); }
/**
 * @param {?} element
 * @param {?} prop
 * @return {?}
 */
function getStyle(element, prop) { return getAllStyles(element)[prop]; }
/**
 * @param {?} element
 * @return {?}
 */
function isStaticPositioned(element) {
    return (getStyle(element, 'position') || 'static') === 'static';
}
/**
 * @param {?} element
 * @return {?}
 */
function getOffsetParent(element) {
    /** @type {?} */
    let offsetParentEl = element.offsetParent || document.documentElement;
    while (offsetParentEl && offsetParentEl !== document.documentElement && isStaticPositioned(offsetParentEl)) {
        offsetParentEl = offsetParentEl.offsetParent;
    }
    return offsetParentEl || document.documentElement;
}
/**
 * @param {?} element
 * @param {?} round
 * @return {?}
 */
function getOffset(element, round) {
    if (round === void 0) {
        round = true;
    }
    /** @type {?} */
    let elBcr = element.getBoundingClientRect();
    /** @type {?} */
    let viewportOffset = {
        top: window.pageYOffset - document.documentElement.clientTop,
        left: window.pageXOffset - document.documentElement.clientLeft
    };
    /** @type {?} */
    let elOffset = {
        height: elBcr.height || element.offsetHeight,
        width: elBcr.width || element.offsetWidth,
        top: elBcr.top + viewportOffset.top,
        bottom: elBcr.bottom + viewportOffset.top,
        left: elBcr.left + viewportOffset.left,
        right: elBcr.right + viewportOffset.left
    };
    if (round) {
        elOffset.height = Math.round(elOffset.height);
        elOffset.width = Math.round(elOffset.width);
        elOffset.top = Math.round(elOffset.top);
        elOffset.bottom = Math.round(elOffset.bottom);
        elOffset.left = Math.round(elOffset.left);
        elOffset.right = Math.round(elOffset.right);
    }
    return elOffset;
}
/**
 * @param {?} element
 * @param {?} round
 * @return {?}
 */
function getPosition(element, round) {
    if (round === void 0) {
        round = true;
    }
    /** @type {?} */
    let elPosition;
    /** @type {?} */
    let parentOffset = { width: 0, height: 0, top: 0, bottom: 0, left: 0, right: 0 };
    if (getStyle(element, 'position') === 'fixed') {
        elPosition = element.getBoundingClientRect();
    }
    else {
        /** @type {?} */
        let offsetParentEl = getOffsetParent(element);
        elPosition = getOffset(element, false);
        if (offsetParentEl !== document.documentElement) {
            parentOffset = getOffset(offsetParentEl, false);
        }
        parentOffset.top += offsetParentEl.clientTop;
        parentOffset.left += offsetParentEl.clientLeft;
    }
    elPosition.top -= parentOffset.top;
    elPosition.bottom -= parentOffset.top;
    elPosition.left -= parentOffset.left;
    elPosition.right -= parentOffset.left;
    if (round) {
        elPosition.top = Math.round(elPosition.top);
        elPosition.bottom = Math.round(elPosition.bottom);
        elPosition.left = Math.round(elPosition.left);
        elPosition.right = Math.round(elPosition.right);
    }
    return elPosition;
}
/**
 * @param {?} hostElement
 * @param {?} targetElement
 * @param {?} placement
 * @param {?} appendToBody
 * @return {?}
 */
function getPositionElements(hostElement, targetElement, placement, appendToBody) {
    /** @type {?} */
    let hostElPosition = appendToBody ? getOffset(hostElement, false) : getPosition(hostElement, false);
    /** @type {?} */
    let targetElStyles = getAllStyles(targetElement);
    /** @type {?} */
    let targetElBCR = targetElement.getBoundingClientRect();
    /** @type {?} */
    let placementPrimary = placement.split('-')[0] || 'top';
    /** @type {?} */
    let placementSecondary = placement.split('-')[1] || 'center';
    /** @type {?} */
    let targetElPosition = {
        'height': targetElBCR.height || targetElement.offsetHeight,
        'width': targetElBCR.width || targetElement.offsetWidth,
        'top': 0,
        'bottom': targetElBCR.height || targetElement.offsetHeight,
        'left': 0,
        'right': targetElBCR.width || targetElement.offsetWidth
    };
    switch (placementPrimary) {
        case 'top':
            targetElPosition.top =
                hostElPosition.top - (targetElement.offsetHeight + parseFloat(targetElStyles.marginBottom));
            break;
        case 'bottom':
            targetElPosition.top = hostElPosition.top + hostElPosition.height;
            break;
        case 'left':
            targetElPosition.left =
                hostElPosition.left - (targetElement.offsetWidth + parseFloat(targetElStyles.marginRight));
            break;
        case 'right':
            targetElPosition.left = hostElPosition.left + hostElPosition.width;
            break;
    }
    switch (placementSecondary) {
        case 'top':
            targetElPosition.top = hostElPosition.top;
            break;
        case 'bottom':
            targetElPosition.top = hostElPosition.top + hostElPosition.height - targetElement.offsetHeight;
            break;
        case 'left':
            targetElPosition.left = hostElPosition.left;
            break;
        case 'right':
            targetElPosition.left = hostElPosition.left + hostElPosition.width - targetElement.offsetWidth;
            break;
        case 'center':
            if (placementPrimary === 'top' || placementPrimary === 'bottom') {
                targetElPosition.left = hostElPosition.left + hostElPosition.width / 2 - targetElement.offsetWidth / 2;
            }
            else {
                targetElPosition.top = hostElPosition.top + hostElPosition.height / 2 - targetElement.offsetHeight / 2;
            }
            break;
    }
    targetElPosition.top = Math.round(targetElPosition.top);
    targetElPosition.bottom = Math.round(targetElPosition.bottom);
    targetElPosition.left = Math.round(targetElPosition.left);
    targetElPosition.right = Math.round(targetElPosition.right);
    return targetElPosition;
}

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PopoverDirective {
    /**
     * @param {?} _viewContainerRef
     * @param {?} _elm
     * @param {?} _defaultOptions
     * @param {?} _cfr
     * @param {?} _renderer
     */
    constructor(_viewContainerRef, _elm, _defaultOptions, _cfr, _renderer) {
        this._viewContainerRef = _viewContainerRef;
        this._elm = _elm;
        this._defaultOptions = _defaultOptions;
        this._cfr = _cfr;
        this._renderer = _renderer;
        this._eventListeners = [];
        this.onVisibleChange = new EventEmitter(true);
        this.onSelect = new EventEmitter();
    }
    /**
     * @return {?}
     */
    togglePopover() {
        if (!this.popover) {
            this.showPopover();
        }
        else {
            this.hidePopover();
        }
    }
    /**
     * @param {?} placement
     * @return {?}
     */
    positionMap(placement) {
        switch (placement) {
            case 'topLeft':
                return 'top-left';
            case 'topRight':
                return 'top-right';
            case 'bottomLeft':
                return 'bottom-left';
            case 'bottomRight':
                return 'bottom-right';
            case 'leftTop':
                return 'left-top';
            case 'leftBottom':
                return 'left-bottom';
            case 'rightTop':
                return 'right-top';
            case 'rightBottom':
                return 'right-bottom';
            case 'fullScreen':
            case 'landScape':
                return 'bottom';
            default:
                return placement;
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        if (this.visible) {
            setTimeout(() => {
                this.showPopover();
            }, 0);
        }
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this.hidePopover();
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onDocumentClick(event) {
        if (this.popover &&
            !this._elm.nativeElement.contains(event.target) &&
            !this.popover.location.nativeElement.contains(event.target)) {
            this.hidePopover();
        }
    }
    /**
     * @return {?}
     */
    showPopover() {
        if (!this.popover) {
            setTimeout(() => {
                this._eventListeners = [
                    this._renderer.listen('document', 'click', (event) => this.onDocumentClick(event)),
                    this._renderer.listen('document', 'touchend', (event) => this.onDocumentClick(event)),
                    this._renderer.listen('window', 'resize', () => this.positionPopover())
                ];
            });
            /** @type {?} */
            const options = new PopoverComponentOptions();
            options.placement = this.placement;
            Object.assign(options, this._defaultOptions, {
                hidePopover: (event) => {
                    this.hidePopover();
                },
                onAfterViewInit: () => {
                    this.positionPopover();
                    /** @type {?} */
                    const children = document.getElementsByClassName('am-popover-inner-wrapper')[0].children;
                    if (children.length > 0) {
                        // 首先我们检查它是否包含子节点
                        for (let i = 0; i < children.length; i++) {
                            children[i].id = `${i}`;
                            children[i].addEventListener('click', () => {
                                if (this.onSelect) {
                                    this.onSelect.emit(children[i]);
                                    this.hidePopover();
                                }
                            }, false);
                        }
                    }
                }
            });
            /** @type {?} */
            const optionalParams = [
                'mask',
                'showArrow',
                'placement',
                'appendToBody',
                'overlay'
            ];
            optionalParams.forEach(param => {
                if (typeof this[param] !== 'undefined') {
                    (/** @type {?} */ (options))[param] = this[param];
                }
            });
            /** @type {?} */
            const componentFactory = this._cfr.resolveComponentFactory(PopoverComponent);
            /** @type {?} */
            const childInjector = Injector.create([
                {
                    provide: PopoverComponentOptions,
                    useValue: options
                }
            ], this._viewContainerRef.parentInjector);
            this.popover = this._viewContainerRef.createComponent(componentFactory, this._viewContainerRef.length, childInjector);
            if (options.appendToBody) {
                document.body.appendChild(this.popover.location.nativeElement);
            }
            this.onVisibleChange.emit(true);
        }
    }
    /**
     * @return {?}
     */
    positionPopover() {
        if (this.popover) {
            /** @type {?} */
            const popoverElement = this.popover.location.nativeElement.children[1];
            /** @type {?} */
            const popoverPosition = getPositionElements(this._elm.nativeElement, popoverElement, this.positionMap(this.placement) || this._defaultOptions.placement, this.appendToBody || this._defaultOptions.appendToBody);
            if (this.placement === 'landScape') {
                this._renderer.setStyle(popoverElement, 'top', `${popoverPosition.top}px`);
                this._renderer.setStyle(popoverElement, 'left', `0px`);
                this._renderer.setStyle(popoverElement, 'width', `${window.innerWidth}px`);
                this._renderer.setStyle(popoverElement, 'max-height', `${window.innerHeight - popoverPosition.height}px`);
            }
            else if (this.placement === 'fullScreen') {
                this._renderer.setStyle(popoverElement, 'top', `${0}px`);
                this._renderer.setStyle(popoverElement, 'left', `0px`);
                this._renderer.setStyle(popoverElement, 'width', `${window.innerWidth}px`);
                this._renderer.setStyle(popoverElement, 'max-height', `${window.innerHeight - popoverPosition.height}px`);
            }
            else {
                this._renderer.setStyle(popoverElement, 'top', `${popoverPosition.top}px`);
                this._renderer.setStyle(popoverElement, 'left', `${popoverPosition.left}px`);
            }
        }
    }
    /**
     * @return {?}
     */
    hidePopover() {
        if (this.popover) {
            this.popover.destroy();
            delete this.popover;
            this.onVisibleChange.emit(false);
            this._eventListeners.forEach(fn => fn());
            this._eventListeners = [];
        }
    }
}
PopoverDirective.decorators = [
    { type: Directive, args: [{
                selector: '[Popover], [nzm-popover]',
                providers: [PopoverOptions]
            },] }
];
/** @nocollapse */
PopoverDirective.ctorParameters = () => [
    { type: ViewContainerRef },
    { type: ElementRef },
    { type: PopoverOptions },
    { type: ComponentFactoryResolver },
    { type: Renderer2 }
];
PopoverDirective.propDecorators = {
    mask: [{ type: Input }],
    showArrow: [{ type: Input }],
    visible: [{ type: Input }],
    placement: [{ type: Input }],
    overlay: [{ type: Input }],
    onVisibleChange: [{ type: Output }],
    onSelect: [{ type: Output }],
    appendToBody: [{ type: Input }],
    togglePopover: [{ type: HostListener, args: ['click',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PopoverModule {
}
PopoverModule.decorators = [
    { type: NgModule, args: [{
                declarations: [PopoverDirective, PopoverComponent],
                imports: [CommonModule],
                exports: [PopoverDirective, PopoverComponent],
                entryComponents: [PopoverComponent],
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class NavBarComponent {
    constructor() {
        this.defaultProps = {
            prefixCls: 'am-navbar',
            mode: 'dark',
            onLeftClick: () => { }
        };
        this.navbarCls = {};
        this.isIconString = true;
        this.isLeftContentString = true;
        this.isRightContentString = true;
        this.onLeftClick = new EventEmitter();
        this._amNavbar = true;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set mode(value) {
        this.defaultProps.mode = value;
        this._amNavbarLight = this.defaultProps.mode === 'light';
        this._amNavbardark = this.defaultProps.mode === 'dark';
    }
    /**
     * @return {?}
     */
    get icon() {
        return this._icon;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set icon(value) {
        if (value instanceof TemplateRef) {
            this.isIconString = false;
        }
        else {
            this.isIconString = true;
        }
        this._icon = value;
    }
    /**
     * @return {?}
     */
    get leftContent() {
        return this._leftContent;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set leftContent(value) {
        if (value instanceof TemplateRef) {
            this.isLeftContentString = false;
        }
        else {
            this.isLeftContentString = true;
        }
        this._leftContent = value;
    }
    /**
     * @return {?}
     */
    get rightContent() {
        return this._rightContent;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set rightContent(value) {
        if (value instanceof TemplateRef) {
            this.isRightContentString = false;
        }
        else {
            this.isRightContentString = true;
        }
        this._rightContent = value;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    click(event) {
        this.onLeftClick.emit(event);
    }
}
NavBarComponent.decorators = [
    { type: Component, args: [{
                selector: 'Navbar, nzm-nav-bar',
                template: "<div role=\"button\" class=\"{{defaultProps.prefixCls}}-left\" (click)=\"click($event)\">\n  <ng-template *ngIf=\"!isLeftContentString\" [ngTemplateOutlet]=\"leftContent\"></ng-template>\n  <span *ngIf=\"icon\" class=\"{{defaultProps.prefixCls}}-left-icon\" aria-hidden=\"true\">\n    <Icon *ngIf=\"isIconString\" [type]=\"icon\"></Icon>\n    <ng-template *ngIf=\"!isIconString\" [ngTemplateOutlet]=\"icon\"></ng-template>\n  </span>\n  {{isLeftContentString ? leftContent: null}}\n</div>\n<div class=\"{{defaultProps.prefixCls}}-title\">\n  <ng-content></ng-content>\n</div>\n<div class=\"{{defaultProps.prefixCls}}-right\">\n  {{isRightContentString ? rightContent: null}}\n  <ng-template *ngIf=\"!isRightContentString\" [ngTemplateOutlet]=\"rightContent\"></ng-template>\n</div>"
            }] }
];
/** @nocollapse */
NavBarComponent.ctorParameters = () => [];
NavBarComponent.propDecorators = {
    mode: [{ type: Input }],
    icon: [{ type: Input }],
    leftContent: [{ type: Input }],
    rightContent: [{ type: Input }],
    onLeftClick: [{ type: Output }],
    _amNavbar: [{ type: HostBinding, args: ['class.am-navbar',] }],
    _amNavbarLight: [{ type: HostBinding, args: ['class.am-navbar-light',] }],
    _amNavbardark: [{ type: HostBinding, args: ['class.am-navbar-dark',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class NavBarModule {
}
NavBarModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, IconModule],
                exports: [NavBarComponent],
                declarations: [NavBarComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
// 同步自 'rmc-calendar/lib/locale/en_US';
var Calendar = {
    title: 'Calendar',
    today: 'Today',
    month: 'Month',
    year: 'Year',
    am: 'AM',
    pm: 'PM',
    dateTimeFormat: 'MM/dd/yyyy w hh:mm',
    dateFormat: 'yyyy/MM/dd w',
    noChoose: 'No Choose',
    week: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fir', 'Sat'],
    clear: 'Clear',
    selectTime: 'Select Time',
    selectStartTime: 'Select Start Time',
    selectEndTime: 'Select End Time',
    start: 'Start',
    end: 'End',
    begin: 'Start',
    over: 'End',
    begin_over: 'S/E',
    confirm: 'Confirm',
    monthTitle: 'yyyy/MM',
    loadPrevMonth: 'Load Prev Month',
    yesterday: 'Yesterday',
    lastWeek: 'Last Week',
    lastMonth: 'Last Month'
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/** @type {?} */
const mergeDateTime = (date, time) => {
    date = date || new Date();
    if (!time)
        return date;
    return new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds());
};
/** @type {?} */
const formatDate = (date, format, locale) => {
    /** @type {?} */
    const week = locale && locale.week;
    /** @type {?} */
    let o = {
        'M+': date.getMonth() + 1,
        'd+': date.getDate(),
        'h+': date.getHours(),
        'm+': date.getMinutes(),
        's+': date.getSeconds(),
        'q+': Math.floor((date.getMonth() + 3) / 3),
        'w+': week && week[date.getDay()],
        S: date.getMilliseconds()
    };
    if (/(y+)/.test(format))
        format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
    for (let k in o) {
        if (new RegExp('(' + k + ')').test(format)) {
            format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
        }
    }
    return format;
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CalendarComponent {
    /**
     * @param {?} _localeProviderService
     */
    constructor(_localeProviderService) {
        this._localeProviderService = _localeProviderService;
        this.isShow = false;
        this.showClear = false;
        this.props = /** @type {?} */ ({
            visible: false,
            showHeader: true,
            locale: defaultLocale,
            pickTime: false,
            showShortcut: false,
            prefixCls: 'rmc-calendar',
            type: 'range',
            defaultTimeValue: new Date(2000, 0, 1, 8)
        });
        this.state = /** @type {?} */ ({
            showTimePicker: false,
            timePickerTitle: '',
            startDate: undefined,
            endDate: undefined,
            disConfirmBtn: true,
            clientHight: 0
        });
        this._unsubscribe$ = new Subject();
        this.onCancel = new EventEmitter();
        this.onConfirm = new EventEmitter();
        this.onSelectHasDisableDate = new EventEmitter();
        this.class = 'am-calendar';
        this.selectDate = (date, useDateTime = false, oldState = {}, props = this.props) => {
            if (!date) {
                return /** @type {?} */ ({});
            }
            /** @type {?} */
            let newState = /** @type {?} */ ({});
            const { type, pickTime, defaultTimeValue, locale = /** @type {?} */ ({}) } = props;
            /** @type {?} */
            const newDate = pickTime && !useDateTime ? mergeDateTime(date, defaultTimeValue) : date;
            const { startDate, endDate } = oldState;
            switch (type) {
                case 'one':
                    newState = Object.assign({}, newState, { startDate: newDate, disConfirmBtn: false });
                    if (pickTime) {
                        newState = Object.assign({}, newState, { timePickerTitle: locale.selectTime, showTimePicker: true });
                    }
                    break;
                case 'range':
                    if (!startDate || endDate) {
                        newState = Object.assign({}, newState, { startDate: newDate, endDate: undefined, disConfirmBtn: true });
                        if (pickTime) {
                            newState = Object.assign({}, newState, { timePickerTitle: locale.selectStartTime, showTimePicker: true });
                        }
                    }
                    else {
                        newState = Object.assign({}, newState, { timePickerTitle: +newDate >= +startDate ? locale.selectEndTime : locale.selectStartTime, disConfirmBtn: false, endDate: pickTime && !useDateTime && +newDate >= +startDate
                                ? new Date(+mergeDateTime(newDate, startDate) + 3600000)
                                : newDate });
                    }
                    break;
            }
            return newState;
        };
        this.onSelectedDate = (date) => {
            const { startDate, endDate } = this.state;
            const { onSelect } = this.props;
            if (onSelect) {
                /** @type {?} */
                const value = onSelect(date, [startDate, endDate]);
                if (value) {
                    this.shortcutSelect(value[0], value[1]);
                    return;
                }
            }
            this.state = Object.assign({}, this.state, this.selectDate(date, false, { startDate, endDate }));
            this.showClear = !!this.state.startDate;
        };
        this.triggerSelectHasDisableDate = (date) => {
            this.triggerClear();
            this.onSelectHasDisableDate && this.onSelectHasDisableDate.emit(date);
        };
        this.onClose = () => {
            this.state = /** @type {?} */ ({
                showTimePicker: false,
                timePickerTitle: '',
                startDate: undefined,
                endDate: undefined,
                disConfirmBtn: true,
                clientHight: 0
            });
            this.showClear = !!this.state.startDate;
        };
        this.triggerConfirm = () => {
            const { startDate, endDate } = this.state;
            if (startDate && endDate && +startDate > +endDate) {
                this.onClose();
                return this.onConfirm && this.onConfirm.emit({ startDate: endDate, endDate: startDate });
            }
            this.onConfirm && this.onConfirm.emit({ startDate, endDate });
            this.onClose();
        };
        this.triggerClear = () => {
            // 清除数据做延迟,否则同步刷新数据导致报错
            setTimeout(() => {
                this.state = Object.assign({}, this.state, { startDate: undefined, endDate: undefined, showTimePicker: false });
                this.props.onClear && this.props.onClear();
                this.showClear = !!this.state.startDate;
            }, 0);
        };
        this.onTimeChange = (date) => {
            const { startDate, endDate } = this.state;
            if (endDate) {
                this.state.endDate = date;
            }
            else if (startDate) {
                this.state.startDate = date;
            }
        };
        this.shortcutSelect = (startDate, endDate, props = this.props) => {
            this.state = Object.assign({}, this.state, { startDate, showTimePicker: false }, this.selectDate(endDate, true, { startDate }, props));
            this.showClear = !!this.state.startDate;
        };
        this.setClientHeight = (height) => {
            this.state.clientHight = height;
        };
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set locale(value) {
        if (value === 'enUS') {
            this.props.locale = Calendar;
        }
        else if (value === 'zhCN') {
            this.props.locale = defaultLocale;
        }
        this._unsubscribe$.next();
        this._unsubscribe$.complete();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set defaultTimeValue(value) {
        if (value) {
            this.props.defaultTimeValue = value;
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set prefixCls(value) {
        if (value) {
            this.props.prefixCls = value;
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set enterDirection(value) {
        this._enterDirection = value;
        if (this._enterDirection === 'horizontal') {
            this.contentAnimateClass = 'slideH-enter slideH-enter-active';
        }
        else {
            this.contentAnimateClass = 'slideV-enter slideV-enter-active';
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set visible(value) {
        this.props.visible = value;
        if (value === true || value === 'true') {
            this.showAnimation();
            this.isShow = true;
        }
        else {
            this.hideAnimation();
            setTimeout(() => {
                this.isShow = false;
            }, 300);
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set getDateExtra(value) {
        this.props.getDateExtra = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set defaultDate(value) {
        this.props.defaultDate = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set minDate(value) {
        this.props.minDate = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set maxDate(value) {
        this.props.maxDate = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set pickTime(value) {
        this.props.pickTime = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set type(value) {
        this.props.type = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set showShortcut(value) {
        this.props.showShortcut = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set rowSize(value) {
        this.props.rowSize = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set infinite(value) { }
    /**
     * @param {?} value
     * @return {?}
     */
    set defaultValue(value) {
        this.props.defaultValue = value;
        if (value) {
            this.receiveProps(this.props);
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set onSelect(value) {
        this.props.onSelect = value;
    }
    /**
     * @param {?} nextProps
     * @return {?}
     */
    receiveProps(nextProps) {
        if (nextProps.visible && nextProps.defaultValue) {
            this.shortcutSelect(nextProps.defaultValue[0], nextProps.defaultValue[1], nextProps);
        }
    }
    /**
     * @return {?}
     */
    showAnimation() {
        if (this._enterDirection === 'horizontal') {
            this.contentAnimateClass = 'slideH-enter slideH-enter-active';
        }
        else {
            this.contentAnimateClass = 'slideV-enter slideV-enter-active';
        }
        this.maskAnimateClass = 'fade-enter fade-enter-active';
    }
    /**
     * @return {?}
     */
    hideAnimation() {
        if (this._enterDirection === 'horizontal') {
            this.contentAnimateClass = 'slideH-leave slideH-leave-active';
        }
        else {
            this.contentAnimateClass = 'slideV-leave slideV-leave-active';
        }
        this.maskAnimateClass = 'fade-leave fade-leave-active';
    }
    /**
     * @return {?}
     */
    triggerCancel() {
        this.props.onCancel && this.props.onCancel();
        this.onClose();
        this.onCancel && this.onCancel.emit();
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        /** @type {?} */
        const defaultValue = this.props.defaultValue;
        if (defaultValue) {
            this.state = Object.assign({}, this.state, this.selectDate(defaultValue[1], true, { startDate: defaultValue[0] }, this.props));
        }
        this._localeProviderService.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe(_ => {
            this.props.locale = /** @type {?} */ (Object.assign({}, this._localeProviderService.getLocaleSubObj('Calendar')));
        });
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this._unsubscribe$.next();
        this._unsubscribe$.complete();
    }
}
CalendarComponent.decorators = [
    { type: Component, args: [{
                selector: 'Calendar, nzm-calendar',
                template: "<span *ngIf=\"isShow\">\n  <div class=\"{{'mask ' + maskAnimateClass}}\"></div>\n</span>\n<span *ngIf=\"isShow\">\n  <div class=\"{{'content animate ' + contentAnimateClass}}\">\n    <CalendarHeader [locale]=\"props.locale\"\n                    [closeIcon]=\"closeIconHtml\"\n                    [showClear]=\"showClear\"\n                    (onCancel)=\"triggerCancel()\"\n                    (onClear)=\"triggerClear()\"\n    ></CalendarHeader>\n    <CalendarDatePicker [propsData]=\"props\"\n                        [endDate]=\"state.endDate\"\n                        [startDate]=\"state.startDate\"\n                        [onCellClick]=\"onSelectedDate\"\n                        [onSelectHasDisableDate]=\"triggerSelectHasDisableDate\"\n                        [onLayout]=\"setClientHeight\"\n    ></CalendarDatePicker>\n    <CalendarTimePicker *ngIf=\"state.showTimePicker\"\n                        [propsData]=\"props\"\n                        [title]=\"state.timePickerTitle\"\n                        [clientHeight]=\"state.clientHight\"\n                        [prefixCls]=\"props.timePickerPrefixCls\"\n                        [defaultValue]=\"props.defaultTimeValue\"\n                        [pickerPrefixCls]=\"props.timePickerPickerPrefixCls\"\n                        [value]=\"state.endDate ? state.endDate : state.startDate\"\n                        [onValueChange]=\"onTimeChange\"\n    ></CalendarTimePicker>\n    <CalendarShortcutPanel *ngIf=\"props.showShortcut && !state.showTimePicker\"\n                           [locale]=\"props.locale\"\n                           [onSelect]=\"shortcutSelect\"\n    ></CalendarShortcutPanel>\n    <CalendarConfirmPanel *ngIf=\"state.startDate\"\n                          [startDateTime]=\"state.startDate\"\n                          [endDateTime]=\"state.endDate\"\n                          [propsData]=\"props\"\n                          [disableBtn]=\"state.disConfirmBtn\"\n                          [formatStr]=\"props.pickTime ? props.locale.dateTimeFormat : props.locale.dateFormat\"\n                          [onConfirm]=\"triggerConfirm\"\n    ></CalendarConfirmPanel>\n  </div>\n</span>\n<ng-template #closeIconHtml>\n  <Icon [type]=\"'cross'\"></Icon>\n</ng-template>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
CalendarComponent.ctorParameters = () => [
    { type: LocaleProviderService }
];
CalendarComponent.propDecorators = {
    locale: [{ type: Input }],
    defaultTimeValue: [{ type: Input }],
    prefixCls: [{ type: Input }],
    enterDirection: [{ type: Input }],
    visible: [{ type: Input }],
    getDateExtra: [{ type: Input }],
    defaultDate: [{ type: Input }],
    minDate: [{ type: Input }],
    maxDate: [{ type: Input }],
    pickTime: [{ type: Input }],
    type: [{ type: Input }],
    showShortcut: [{ type: Input }],
    rowSize: [{ type: Input }],
    infinite: [{ type: Input }],
    defaultValue: [{ type: Input }],
    onSelect: [{ type: Input }],
    onCancel: [{ type: Output }],
    onConfirm: [{ type: Output }],
    onSelectHasDisableDate: [{ type: Output }],
    class: [{ type: HostBinding, args: ['class',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class HeaderComponent {
    constructor() {
        this.closeIcon_component = false;
        this._closeIcon = 'X';
        this.onCancel = new EventEmitter();
        this.onClear = new EventEmitter();
        this.header = true;
    }
    /**
     * @return {?}
     */
    get locale() {
        return this._locale;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set locale(value) {
        this._locale = value;
    }
    /**
     * @return {?}
     */
    get closeIcon() {
        return this._closeIcon;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set closeIcon(value) {
        if (value instanceof TemplateRef) {
            this._closeIcon = value;
            this.closeIcon_component = true;
        }
        else {
            this._closeIcon = /** @type {?} */ (value);
            this.closeIcon_component = false;
        }
    }
    /**
     * @return {?}
     */
    get showClear() {
        return this._showClear;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set showClear(value) {
        this._showClear = value;
    }
    /**
     * @return {?}
     */
    triggerCancel() {
        this.onCancel && this.onCancel.emit();
    }
    /**
     * @return {?}
     */
    triggerClear() {
        this.onClear && this.onClear.emit();
    }
}
HeaderComponent.decorators = [
    { type: Component, args: [{
                selector: 'CalendarHeader, nzm-calendar-header',
                template: "<span *ngIf=\"!closeIcon_component\" class=\"left\" (click)=\"triggerCancel()\" [innerHTML]=\"closeIcon\"></span>\n<span *ngIf=\"closeIcon_component\" class=\"left\" (click)=\"triggerCancel()\">\n  <ng-template [ngTemplateOutlet]=\"closeIcon\"></ng-template>\n</span>\n<span class=\"title\">{{title || locale.title}}</span>\n<span *ngIf=\"showClear\" class=\"right\" (click)=\"triggerClear()\">{{clearIcon || locale.clear}}</span>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
HeaderComponent.ctorParameters = () => [];
HeaderComponent.propDecorators = {
    locale: [{ type: Input }],
    closeIcon: [{ type: Input }],
    showClear: [{ type: Input }],
    onCancel: [{ type: Output }],
    onClear: [{ type: Output }],
    header: [{ type: HostBinding, args: ['class.header',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var Models;
(function (Models) {
    let SelectType;
    (function (SelectType) {
        SelectType[SelectType["None"] = 0] = "None";
        SelectType[SelectType["Single"] = 1] = "Single";
        SelectType[SelectType["All"] = 2] = "All";
        SelectType[SelectType["Only"] = 3] = "Only";
        SelectType[SelectType["Start"] = 4] = "Start";
        SelectType[SelectType["Middle"] = 5] = "Middle";
        SelectType[SelectType["End"] = 6] = "End";
    })(SelectType = Models.SelectType || (Models.SelectType = {}));
    /**
     * @record
     */
    function Locale() { }
    Models.Locale = Locale;
    /** @type {?} */
    Locale.prototype.title;
    /** @type {?} */
    Locale.prototype.today;
    /** @type {?} */
    Locale.prototype.month;
    /** @type {?} */
    Locale.prototype.year;
    /** @type {?} */
    Locale.prototype.am;
    /** @type {?} */
    Locale.prototype.pm;
    /** @type {?} */
    Locale.prototype.dateFormat;
    /** @type {?} */
    Locale.prototype.dateTimeFormat;
    /** @type {?} */
    Locale.prototype.noChoose;
    /** @type {?} */
    Locale.prototype.week;
    /** @type {?} */
    Locale.prototype.clear;
    /** @type {?} */
    Locale.prototype.selectTime;
    /** @type {?} */
    Locale.prototype.selectStartTime;
    /** @type {?} */
    Locale.prototype.selectEndTime;
    /** @type {?} */
    Locale.prototype.start;
    /** @type {?} */
    Locale.prototype.end;
    /** @type {?} */
    Locale.prototype.begin;
    /** @type {?} */
    Locale.prototype.over;
    /** @type {?} */
    Locale.prototype.begin_over;
    /** @type {?} */
    Locale.prototype.confirm;
    /** @type {?} */
    Locale.prototype.monthTitle;
    /** @type {?} */
    Locale.prototype.loadPrevMonth;
    /** @type {?} */
    Locale.prototype.yesterday;
    /** @type {?} */
    Locale.prototype.lastWeek;
    /** @type {?} */
    Locale.prototype.lastMonth;
    /**
     * @record
     */
    function CellData() { }
    Models.CellData = CellData;
    /** @type {?} */
    CellData.prototype.tick;
    /** @type {?} */
    CellData.prototype.dayOfMonth;
    /** @type {?} */
    CellData.prototype.selected;
    /** @type {?} */
    CellData.prototype.isFirstOfMonth;
    /** @type {?} */
    CellData.prototype.isLastOfMonth;
    /** @type {?} */
    CellData.prototype.outOfDate;
    /**
     * @record
     */
    function ExtraData() { }
    Models.ExtraData = ExtraData;
    /** @type {?|undefined} */
    ExtraData.prototype.info;
    /** @type {?|undefined} */
    ExtraData.prototype.disable;
    /** @type {?|undefined} */
    ExtraData.prototype.cellCls;
    /** @type {?|undefined} */
    ExtraData.prototype.cellRender;
    /**
     * @record
     */
    function MonthData() { }
    Models.MonthData = MonthData;
    /** @type {?} */
    MonthData.prototype.title;
    /** @type {?} */
    MonthData.prototype.firstDate;
    /** @type {?} */
    MonthData.prototype.lastDate;
    /** @type {?} */
    MonthData.prototype.weeks;
    /** @type {?|undefined} */
    MonthData.prototype.component;
    /** @type {?|undefined} */
    MonthData.prototype.height;
    /** @type {?|undefined} */
    MonthData.prototype.y;
    /** @type {?|undefined} */
    MonthData.prototype.updateLayout;
    /** @type {?|undefined} */
    MonthData.prototype.componentRef;
})(Models || (Models = {}));

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class DatePicker$1 {
    constructor() {
        this.props = /** @type {?} */ ({
            prefixCls: 'rmc-calendar',
            infinite: false,
            infiniteOpt: false,
            defaultDate: new Date(),
            initalMonths: 6,
            locale: defaultLocale
        });
        this.state = {
            months: []
        };
        this.visibleMonth = [];
        this.getDateWithoutTime = (date) => {
            if (!date)
                return 0;
            return +new Date(date.getFullYear(), date.getMonth(), date.getDate());
        };
        this.genWeekData = (firstDate) => {
            /** @type {?} */
            const minDateTime = this.getDateWithoutTime(this.props.minDate);
            /** @type {?} */
            const maxDateTime = this.getDateWithoutTime(this.props.maxDate) || Number.POSITIVE_INFINITY;
            /** @type {?} */
            const weeks = [];
            /** @type {?} */
            const nextMonth = this.getMonthDate(firstDate, 1).firstDate;
            /** @type {?} */
            let currentDay = firstDate;
            /** @type {?} */
            let currentWeek = [];
            weeks.push(currentWeek);
            /** @type {?} */
            let startWeekday = currentDay.getDay();
            if (startWeekday > 0) {
                for (let i = 0; i < startWeekday; i++) {
                    currentWeek.push(/** @type {?} */ ({}));
                }
            }
            while (currentDay < nextMonth) {
                if (currentWeek.length === 7) {
                    currentWeek = [];
                    weeks.push(currentWeek);
                }
                /** @type {?} */
                const dayOfMonth = currentDay.getDate();
                /** @type {?} */
                const tick = +currentDay;
                currentWeek.push({
                    tick,
                    dayOfMonth,
                    selected: Models.SelectType.None,
                    isFirstOfMonth: dayOfMonth === 1,
                    isLastOfMonth: false,
                    outOfDate: tick < minDateTime || tick > maxDateTime
                });
                currentDay = new Date(currentDay.getTime() + 3600 * 24 * 1000);
            }
            currentWeek[currentWeek.length - 1].isLastOfMonth = true;
            return weeks;
        };
        this.selectDateRange = (startDate, endDate, clear = false) => {
            const { getDateExtra, type, onSelectHasDisableDate } = this.props;
            if (type === 'one') {
                endDate = undefined;
            }
            /** @type {?} */
            const time1 = this.getDateWithoutTime(startDate);
            /** @type {?} */
            const time2 = this.getDateWithoutTime(endDate);
            /** @type {?} */
            const startDateTick = !time2 || time1 < time2 ? time1 : time2;
            /** @type {?} */
            const endDateTick = time2 && time1 > time2 ? time1 : time2;
            /** @type {?} */
            const startMonthDate = this.getMonthDate(new Date(startDateTick)).firstDate;
            /** @type {?} */
            const endMonthDate = endDateTick ? new Date(endDateTick) : this.getMonthDate(new Date(startDateTick)).lastDate;
            /** @type {?} */
            let unuseable = [];
            /** @type {?} */
            let needUpdate = false;
            this.state.months
                .filter(m => {
                return m.firstDate >= startMonthDate && m.firstDate <= endMonthDate;
            })
                .forEach(m => {
                m.weeks.forEach(w => w
                    .filter(d => {
                    if (!endDateTick) {
                        return d.tick && this.inDate(startDateTick, d.tick);
                    }
                    else {
                        return d.tick && d.tick >= startDateTick && d.tick <= endDateTick;
                    }
                })
                    .forEach(d => {
                    /** @type {?} */
                    const oldValue = d.selected;
                    if (clear) {
                        d.selected = Models.SelectType.None;
                    }
                    else {
                        /** @type {?} */
                        const info = (getDateExtra && getDateExtra(new Date(d.tick))) || {};
                        if (d.outOfDate || info.disable) {
                            unuseable.push(d.tick);
                        }
                        if (this.inDate(startDateTick, d.tick)) {
                            if (type === 'one') {
                                d.selected = Models.SelectType.Single;
                            }
                            else if (!endDateTick) {
                                d.selected = Models.SelectType.Only;
                            }
                            else if (startDateTick !== endDateTick) {
                                d.selected = Models.SelectType.Start;
                            }
                            else {
                                d.selected = Models.SelectType.All;
                            }
                        }
                        else if (this.inDate(endDateTick, d.tick)) {
                            d.selected = Models.SelectType.End;
                        }
                        else {
                            d.selected = Models.SelectType.Middle;
                        }
                    }
                    needUpdate = needUpdate || d.selected !== oldValue;
                }));
                if (needUpdate && m.componentRef) {
                    m.componentRef.updateWeeks();
                }
            });
            if (unuseable.length > 0) {
                if (onSelectHasDisableDate) {
                    onSelectHasDisableDate(unuseable.map(tick => new Date(tick)));
                }
                else {
                    console.warn('Unusable date. You can handle by onSelectHasDisableDate.', unuseable);
                }
            }
        };
        this.computeVisible = (clientHeight, scrollTop) => {
            /** @type {?} */
            let needUpdate = false;
            /** @type {?} */
            const MAX_VIEW_PORT = clientHeight * 2;
            /** @type {?} */
            const MIN_VIEW_PORT = clientHeight;
            /** @type {?} */
            const filterFunc = (vm) => vm.y &&
                vm.height &&
                (vm.y + vm.height > scrollTop - MAX_VIEW_PORT && vm.y < scrollTop + clientHeight + MAX_VIEW_PORT);
            if (this.props.infiniteOpt && this.visibleMonth.length > 12) {
                this.visibleMonth = this.visibleMonth.filter(filterFunc).sort((a, b) => +a.firstDate - +b.firstDate);
            }
            // 当小缓冲区不满时填充
            if (this.visibleMonth.length > 0) {
                /** @type {?} */
                const last = this.visibleMonth[this.visibleMonth.length - 1];
                if (last.y !== undefined && last.height && last.y + last.height < scrollTop + clientHeight + MIN_VIEW_PORT) {
                    /** @type {?} */
                    const lastIndex = this.state.months.indexOf(last);
                    for (let i = 1; i <= 2; i++) {
                        /** @type {?} */
                        const index = lastIndex + i;
                        if (index < this.state.months.length && this.visibleMonth.indexOf(this.state.months[index]) < 0) {
                            this.visibleMonth.push(this.state.months[index]);
                        }
                        else {
                            this.canLoadNext() && this.genMonthData(undefined, 1);
                        }
                    }
                    needUpdate = true;
                }
                /** @type {?} */
                const first = this.visibleMonth[0];
                if (first.y !== undefined && first.height && first.y > scrollTop - MIN_VIEW_PORT) {
                    /** @type {?} */
                    const firstIndex = this.state.months.indexOf(first);
                    for (let i = 1; i <= 2; i++) {
                        /** @type {?} */
                        const index = firstIndex - i;
                        if (index >= 0 && this.visibleMonth.indexOf(this.state.months[index]) < 0) {
                            this.visibleMonth.unshift(this.state.months[index]);
                            needUpdate = true;
                        }
                    }
                }
            }
            else if (this.state.months.length > 0) {
                this.visibleMonth = this.state.months.filter(filterFunc);
                needUpdate = true;
            }
            return needUpdate;
        };
        this.createOnScroll = () => {
            /** @type {?} */
            let clientHeight = 0;
            /** @type {?} */
            let scrollTop = 0;
            return (data) => {
                const { client, top } = data;
                clientHeight = client;
                scrollTop = top;
                this.computeVisible(clientHeight, scrollTop);
                // 以上方法目前无问题,如果后续有性能问题,改用如下方法,但以下方法会导致刷新稍微延迟现象
                // if (timer) {
                //   return;
                // }
                //
                // timer = setTimeout(() => {
                //   timer = undefined;
                //
                //   if (this.computeVisible(clientHeight, scrollTop)) {
                //     console.log('update dom');
                //   }
                // }, 50);
            };
        };
        this.baseOnCellClick = (day) => {
            if (!day.tick)
                return;
            this.props.onCellClick && this.props.onCellClick(new Date(day.tick));
        };
    }
    /**
     * @return {?}
     */
    init() {
        const { initalMonths = 6, defaultDate } = this.props;
        for (let i = 0; i < initalMonths; i++) {
            this.canLoadNext() && this.genMonthData(defaultDate, i);
        }
        this.visibleMonth = [...this.state.months];
    }
    /**
     * @param {?} oldValue
     * @param {?} newValue
     * @return {?}
     */
    receiveProps(oldValue, newValue) {
        if (oldValue && newValue) {
            if (oldValue.startDate !== newValue.startDate || oldValue.endDate !== newValue.endDate) {
                if (oldValue.startDate) {
                    this.selectDateRange(oldValue.startDate, oldValue.endDate, true);
                }
                if (newValue.startDate) {
                    this.selectDateRange(newValue.startDate, newValue.endDate);
                }
            }
        }
    }
    /**
     * @param {?=} date
     * @param {?=} addMonth
     * @return {?}
     */
    getMonthDate(date = new Date(), addMonth = 0) {
        /** @type {?} */
        const y = date.getFullYear();
        /** @type {?} */
        const m = date.getMonth();
        return {
            firstDate: new Date(y, m + addMonth, 1),
            lastDate: new Date(y, m + 1 + addMonth, 0)
        };
    }
    /**
     * @return {?}
     */
    canLoadPrev() {
        const { minDate } = this.props;
        return (!minDate ||
            this.state.months.length <= 0 ||
            +this.getMonthDate(minDate).firstDate < +this.state.months[0].firstDate);
    }
    /**
     * @return {?}
     */
    canLoadNext() {
        const { maxDate } = this.props;
        return (!maxDate ||
            this.state.months.length <= 0 ||
            +this.getMonthDate(maxDate).firstDate > +this.state.months[this.state.months.length - 1].firstDate);
    }
    /**
     * @param {?=} date
     * @param {?=} addMonth
     * @return {?}
     */
    genMonthData(date, addMonth = 0) {
        if (!date) {
            date = addMonth >= 0 ? this.state.months[this.state.months.length - 1].firstDate : this.state.months[0].firstDate;
        }
        if (!date) {
            date = new Date();
        }
        const { locale } = this.props;
        const { firstDate, lastDate } = this.getMonthDate(date, addMonth);
        /** @type {?} */
        const weeks = this.genWeekData(firstDate);
        /** @type {?} */
        const title = formatDate(firstDate, locale ? locale.monthTitle : 'yyyy/MM', this.props.locale);
        /** @type {?} */
        const data = /** @type {?} */ ({
            title,
            firstDate,
            lastDate,
            weeks
        });
        data.component = this.genMonthComponent(data);
        if (addMonth >= 0) {
            this.state.months.push(data);
        }
        else {
            this.state.months.unshift(data);
        }
        const { startDate, endDate } = this.props;
        if (startDate) {
            this.selectDateRange(startDate, endDate);
        }
        return data;
    }
    /**
     * @param {?} date
     * @param {?} tick
     * @return {?}
     */
    inDate(date, tick) {
        return date <= tick && tick < date + 24 * 3600000;
    }
}

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class DatePickerComponent extends DatePicker$1 {
    constructor() {
        super();
        this.transform = '';
        this._initDelta = 0;
        this._lastY = 0;
        this._delta = this._initDelta;
        this.amCalendar = true;
        this.datePicker = true;
        this.genMonthComponent = (data) => {
            if (!data)
                return;
            return {
                monthData: data,
                locale: this.props.locale,
                rowSize: this.props.rowSize,
                onCellClick: this.baseOnCellClick,
                getDateExtra: this.props.getDateExtra,
                ref: dom => {
                    data.componentRef = dom || data.componentRef || undefined;
                    data.updateLayout = () => {
                        this.computeHeight(data, dom);
                    };
                    data.updateLayout();
                }
            };
        };
        this.computeHeight = (data, singleMonth) => {
            if (singleMonth && singleMonth.wrapperDivDOM) {
                if (!data.height && !singleMonth.wrapperDivDOM.clientHeight) {
                    setTimeout(() => this.computeHeight(data, singleMonth), 500);
                    return;
                }
                data.height = singleMonth.wrapperDivDOM.clientHeight || data.height || 0;
                data.y = singleMonth.wrapperDivDOM.offsetTop || data.y || 0;
            }
        };
        this.setLayout = (dom) => {
            if (dom) {
                const { onLayout } = this.props;
                onLayout && onLayout(dom.clientHeight);
                /** @type {?} */
                const scrollHandler = this.createOnScroll();
                dom.onscroll = evt => {
                    scrollHandler({
                        client: dom.clientHeight,
                        full: (/** @type {?} */ (evt.currentTarget)).clientHeight,
                        top: (/** @type {?} */ (evt.currentTarget)).scrollTop
                    });
                };
            }
        };
        this.setPanel = (dom) => {
            this._panel = dom;
        };
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set onCellClick(value) {
        this.props.onCellClick = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set endDate(value) {
        /** @type {?} */
        const oldProps = Object.assign({}, this.props);
        this.props.endDate = value;
        this.receiveProps(oldProps, this.props);
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set startDate(value) {
        /** @type {?} */
        const oldProps = Object.assign({}, this.props);
        this.props.startDate = value;
        this.receiveProps(oldProps, this.props);
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set propsData(value) {
        this.props = Object.assign({}, this.props, value);
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set onSelectHasDisableDate(value) {
        this.props.onSelectHasDisableDate = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set onLayout(value) {
        this.props.onLayout = value;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onTouchStart(event) {
        this._lastY = event.touches[0].screenY;
        this._delta = this._initDelta;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onTouchMove(event) {
        /** @type {?} */
        const ele = event.currentTarget;
        /** @type {?} */
        const isReachTop = ele.scrollTop === 0;
        if (isReachTop) {
            this._delta = event.touches[0].screenY - this._lastY;
            if (this._delta > 0) {
                event.preventDefault();
                if (this._delta > 80) {
                    this._delta = 80;
                }
            }
            else {
                this._delta = 0;
            }
            this.setTransform(this._panel.style, `translate3d(0,${this._delta}px,0)`);
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onTouchEnd(event) {
        this.onFinish();
    }
    /**
     * @return {?}
     */
    onFinish() {
        if (this._delta > 40 && this.canLoadPrev()) {
            this.genMonthData(this.state.months[0].firstDate, -1);
            this.visibleMonth = this.state.months.slice(0, this.props.initalMonths);
            this.state.months.forEach(m => {
                m.updateLayout && m.updateLayout();
            });
        }
        this.setTransform(this._panel.style, `translate3d(0,0,0)`);
        this.setTransition(this._panel.style, '.3s');
        setTimeout(() => {
            this._panel && this.setTransition(this._panel.style, '');
        }, 300);
    }
    /**
     * @param {?} nodeStyle
     * @param {?} value
     * @return {?}
     */
    setTransform(nodeStyle, value) {
        this.transform = value;
        nodeStyle.transform = value;
        nodeStyle.webkitTransform = value;
    }
    /**
     * @param {?} nodeStyle
     * @param {?} value
     * @return {?}
     */
    setTransition(nodeStyle, value) {
        nodeStyle.transition = value;
        nodeStyle.webkitTransition = value;
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.init();
        this.setLayout(this.layoutDom.nativeElement);
        this.setPanel(this.panelDom.nativeElement);
    }
}
DatePickerComponent.decorators = [
    { type: Component, args: [{
                selector: 'CalendarDatePicker, nzm-calendar-date-picker',
                template: "<CalendarWeekPanel [locale]=\"props.locale\"></CalendarWeekPanel>\n<div #layout\n     class=\"wrapper\"\n     style=\"overflow-x:hidden;overflow-y:visible;-webkit-overflow-scrolling:touch;\"\n     (touchstart)=\"onTouchStart($event)\"\n     (touchmove)=\"onTouchMove($event)\"\n     (touchend)=\"onTouchEnd($event)\"\n>\n  <div #panel [ngStyle]=\"{transform: transform}\">\n    <div *ngIf=\"canLoadPrev()\" class=\"load-tip\">{{props.locale.loadPrevMonth}}</div>\n    <div class=\"months\">\n      <SingleMonth *ngFor=\"let item of visibleMonth;let i = index;\"\n                   style=\"display: block;\"\n                   [data]=\"item.component\"\n      ></SingleMonth>\n    </div>\n  </div>\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
DatePickerComponent.ctorParameters = () => [];
DatePickerComponent.propDecorators = {
    layoutDom: [{ type: ViewChild, args: ['layout',] }],
    panelDom: [{ type: ViewChild, args: ['panel',] }],
    onCellClick: [{ type: Input }],
    endDate: [{ type: Input }],
    startDate: [{ type: Input }],
    propsData: [{ type: Input }],
    onSelectHasDisableDate: [{ type: Input }],
    onLayout: [{ type: Input }],
    amCalendar: [{ type: HostBinding, args: ['class.am-calendar',] }],
    datePicker: [{ type: HostBinding, args: ['class.date-picker',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var Picker$1 = {
    okText: 'Ok',
    dismissText: 'Cancel',
    extra: 'please select',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
// import  DatePickerLocale from 'rmc-date-picker/lib/locale/en_US';
var DatePicker$2 = {
    okText: 'OK',
    dismissText: 'Cancel',
    extra: 'please select',
    // DatePickerLocale,
    year: '',
    month: '',
    day: '',
    hour: '',
    minute: '',
    am: 'AM',
    pm: 'PM'
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
// import  DatePickerLocale from 'rmc-date-picker/lib/locale/en_US';
var DatePickerView$1 = {
    okText: 'OK',
    dismissText: 'Cancel',
    extra: 'please select',
    // DatePickerLocale,
    year: '',
    month: '',
    day: '',
    hour: '',
    minute: '',
    am: 'AM',
    pm: 'PM'
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var Menu$1 = {
    okText: 'Ok',
    cancelText: 'Cancel',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var SearchBar$2 = {
    cancelText: 'Cancel',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var InputItem$2 = {
    confirmLabel: 'Done',
    backspaceLabel: 'Backspace',
    cancelKeyboardLabel: 'CancelKeyboard',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var Pagination$1 = {
    prevText: 'Prev',
    nextText: 'Next',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var PullToRefresh$1 = {
    activateText: 'Refresh immediately after release',
    deactivateText: 'Pull down to refresh',
    finishText: 'Finish refresh',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var en_US = {
    locale: 'en_US',
    Picker: Picker$1,
    DatePicker: DatePicker$2,
    DatePickerView: DatePickerView$1,
    Menu: Menu$1,
    Calendar,
    SearchBar: SearchBar$2,
    InputItem: InputItem$2,
    Pagination: Pagination$1,
    PullToRefresh: PullToRefresh$1
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var Picker$2 = {
    okText: 'Ок',
    dismissText: 'Отмена',
    extra: '',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
// import DatePickerLocale from 'rmc-date-picker/lib/locale/en_US';
var DatePicker$3 = {
    okText: 'Ок',
    dismissText: 'Отмена',
    extra: '',
    // DatePickerLocale,
    year: '',
    month: '',
    day: '',
    hour: '',
    minute: '',
    am: 'AM',
    pm: 'PM'
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
// import DatePickerLocale from 'rmc-date-picker/lib/locale/en_US';
var DatePickerView$2 = {
    okText: 'Ок',
    dismissText: 'Отмена',
    extra: '',
    // DatePickerLocale,
    year: '',
    month: '',
    day: '',
    hour: '',
    minute: '',
    am: 'AM',
    pm: 'PM'
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var Menu$2 = {
    okText: 'Ок',
    cancelText: 'Отмена',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var SearchBar$3 = {
    cancelText: 'Отмена',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var InputItem$3 = {
    confirmLabel: 'Ок',
    backspaceLabel: 'возврат на одну позицию',
    cancelKeyboardLabel: 'Отменить клавиатуру',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var Pagination$2 = {
    prevText: 'Назад',
    nextText: 'Вперёд',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var PullToRefresh$2 = {
    activateText: 'Обновить сразу после выпуска',
    deactivateText: 'Потяните вниз, чтобы обновить',
    finishText: 'Завершить обновление',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var ru_RU = {
    locale: 'ru_RU',
    Picker: Picker$2,
    DatePicker: DatePicker$3,
    DatePickerView: DatePickerView$2,
    Menu: Menu$2,
    // Calendar,
    SearchBar: SearchBar$3,
    InputItem: InputItem$3,
    Pagination: Pagination$2,
    PullToRefresh: PullToRefresh$2
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var Picker$3 = {
    okText: 'Ok',
    dismissText: 'Avbryt',
    extra: 'vänligen välj',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
// import DatePickerLocale from 'rmc-date-picker/lib/locale/en_US';
var DatePicker$4 = {
    okText: 'Ok',
    dismissText: 'Avbryt',
    extra: 'vänligen välj',
    // DatePickerLocale,
    year: '',
    month: '',
    day: '',
    hour: '',
    minute: '',
    am: 'AM',
    pm: 'PM'
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
// import DatePickerLocale from 'rmc-date-picker/lib/locale/en_US';
var DatePickerView$3 = {
    okText: 'Ok',
    dismissText: 'Avbryt',
    extra: 'vänligen välj',
    // DatePickerLocale,
    year: '',
    month: '',
    day: '',
    hour: '',
    minute: '',
    am: 'AM',
    pm: 'PM'
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var Menu$3 = {
    okText: 'Ok',
    cancelText: 'Avbryt',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var SearchBar$4 = {
    cancelText: 'Avbryt',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var InputItem$4 = {
    confirmLabel: 'Ok',
    backspaceLabel: 'Backspace',
    cancelKeyboardLabel: 'CancelKeyboard',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var Pagination$3 = {
    prevText: 'Föreg',
    nextText: 'Nästa',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var PullToRefresh$3 = {
    activateText: 'Uppdatera omedelbart efter utsläpp',
    deactivateText: 'Dra ner för att uppdatera',
    finishText: 'Avsluta uppdateringen',
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var sv_SE = {
    locale: 'sv_SE',
    Picker: Picker$3,
    DatePicker: DatePicker$4,
    DatePickerView: DatePickerView$3,
    Menu: Menu$3,
    // Calendar,
    SearchBar: SearchBar$4,
    InputItem: InputItem$4,
    Pagination: Pagination$3,
    PullToRefresh: PullToRefresh$3
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class TimePickerComponent {
    constructor() {
        this.defaultProps = /** @type {?} */ ({
            minDate: new Date(0, 0, 0, 0, 0),
            maxDate: new Date(9999, 11, 31, 23, 59, 59),
            defaultValue: new Date(2000, 1, 1, 8),
            mode: 'time',
            datePickerViewLocale: zh_CN
        });
        this.props = /** @type {?} */ ({
            minDate: new Date(0, 0, 0, 0, 0),
            maxDate: new Date(9999, 11, 31, 23, 59, 59),
            defaultValue: new Date(2000, 1, 1, 8),
            mode: 'time',
            datePickerViewLocale: zh_CN
        });
        this.timePicker = true;
        this.onDateChange = (date) => {
            const { onValueChange } = this.props;
            onValueChange && onValueChange(date);
        };
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set propsData(value) {
        this.props = Object.assign({}, this.props, value);
        if (this.props.locale && this.props.locale.today === 'Today') {
            this.props.datePickerViewLocale = en_US;
        }
        else {
            this.props.datePickerViewLocale = zh_CN;
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set title(value) {
        this.props.title = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set value(value) {
        this.props.value = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set prefixCls(value) {
        this.props.prefixCls = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set defaultValue(value) {
        this.props.defaultValue = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set pickerPrefixCls(value) {
        this.props.pickerPrefixCls = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set clientHeight(value) {
        this.props.clientHeight = value;
        /** @type {?} */
        const height = (value && (value * 3) / 8 - 52) || Number.POSITIVE_INFINITY;
        this.selfHeight = (height > 164 || height < 0 ? 164 : height) + 'px';
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set onValueChange(value) {
        this.props.onValueChange = value;
    }
    /**
     * @param {?=} date
     * @return {?}
     */
    getMinTime(date) {
        /** @type {?} */
        const minDate = /** @type {?} */ (this.props.minDate);
        if (!date ||
            date.getFullYear() > minDate.getFullYear() ||
            date.getMonth() > minDate.getMonth() ||
            date.getDate() > minDate.getDate()) {
            return this.defaultProps.minDate;
        }
        return minDate;
    }
    /**
     * @param {?=} date
     * @return {?}
     */
    getMaxTime(date) {
        /** @type {?} */
        const maxDate = /** @type {?} */ (this.props.maxDate);
        if (!date ||
            date.getFullYear() < maxDate.getFullYear() ||
            date.getMonth() < maxDate.getMonth() ||
            date.getDate() < maxDate.getDate()) {
            return this.defaultProps.maxDate;
        }
        return maxDate;
    }
}
TimePickerComponent.decorators = [
    { type: Component, args: [{
                selector: 'CalendarTimePicker, nzm-calendar-time-picker',
                template: "<div class=\"title\">{{props.title}}</div>\n<DatePickerView [ngStyle]=\"{height: selfHeight, overflow: 'hidden'}\"\n                [mode]=\"props.mode\"\n                [value]=\"props.value\"\n                [locale]=\"props.datePickerViewLocale\"\n                [minDate]=\"getMinTime(props.value || props.defaultValue || undefined)\"\n                [maxDate]=\"getMaxTime(props.value || props.defaultValue || undefined)\"\n                (onValueChange)=\"onDateChange($event)\"\n></DatePickerView>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
TimePickerComponent.ctorParameters = () => [];
TimePickerComponent.propDecorators = {
    propsData: [{ type: Input }],
    title: [{ type: Input }],
    value: [{ type: Input }],
    prefixCls: [{ type: Input }],
    defaultValue: [{ type: Input }],
    pickerPrefixCls: [{ type: Input }],
    clientHeight: [{ type: Input }],
    onValueChange: [{ type: Input }],
    timePicker: [{ type: HostBinding, args: ['class.time-picker',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class WeekPanelComponent {
    constructor() {
        this.week = ['日', '一', '二', '三', '四', '五', '六'];
        this.weekPanel = true;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set locale(value) {
        this._locale = value;
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.week = this._locale.week;
    }
}
WeekPanelComponent.decorators = [
    { type: Component, args: [{
                selector: 'CalendarWeekPanel, nzm-calendar-week-panel',
                template: "<div class=\"cell cell-grey\">{{week[0]}}</div>\n<div class=\"cell\">{{week[1]}}</div>\n<div class=\"cell\">{{week[2]}}</div>\n<div class=\"cell\">{{week[3]}}</div>\n<div class=\"cell\">{{week[4]}}</div>\n<div class=\"cell\">{{week[5]}}</div>\n<div class=\"cell cell-grey\">{{week[6]}}</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
WeekPanelComponent.ctorParameters = () => [];
WeekPanelComponent.propDecorators = {
    locale: [{ type: Input }],
    weekPanel: [{ type: HostBinding, args: ['class.week-panel',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ConfirmPanelComponent {
    constructor() {
        this.props = /** @type {?} */ ({
            formatStr: 'yyyy-MM-dd hh:mm'
        });
        this.confirmPane = true;
        this.triggerConfirm = () => {
            const { onConfirm, disableBtn } = this.props;
            !disableBtn && onConfirm();
        };
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set propsData(value) {
        this.props = Object.assign({}, this.props, value);
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disableBtn(value) {
        this.props.disableBtn = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set formatStr(value) {
        this.props.formatStr = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set startDateTime(value) {
        this.props.startDateTime = value;
        this.formatTime();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set endDateTime(value) {
        this.props.endDateTime = value;
        this.formatTime();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set onConfirm(value) {
        this.props.onConfirm = value;
    }
    /**
     * @return {?}
     */
    formatTime() {
        const { type, locale, disableBtn } = this.props;
        let { startDateTime, endDateTime } = this.props;
        if (startDateTime && endDateTime && +startDateTime > +endDateTime) {
            /** @type {?} */
            const tmp = startDateTime;
            startDateTime = endDateTime;
            endDateTime = tmp;
        }
        this.startTimeStr = startDateTime ? this.selfFormatDate(startDateTime) : locale.noChoose;
        this.endTimeStr = endDateTime ? this.selfFormatDate(endDateTime) : locale.noChoose;
        /** @type {?} */
        let btnCls = disableBtn ? 'button button-disable' : 'button';
        if (type === 'one') {
            btnCls += ' button-full';
        }
        this.btnCls = btnCls;
    }
    /**
     * @param {?} date
     * @return {?}
     */
    selfFormatDate(date) {
        const { formatStr = '', locale } = this.props;
        return formatDate(date, formatStr, locale);
    }
}
ConfirmPanelComponent.decorators = [
    { type: Component, args: [{
                selector: 'CalendarConfirmPanel, nzm-calendar-confirm-panel',
                template: "<div *ngIf=\"props.type === 'range'\" class=\"info\">\n  <p>{{props.locale.start}}: <span class=\"{{!props.startDateTime ? 'grey' : ''}}\">{{startTimeStr}}</span></p>\n  <p>{{props.locale.end}}: <span class=\"{{!props.endDateTime ? 'grey' : ''}}\">{{endTimeStr}}</span></p>\n</div>\n<div [ngClass]=\"btnCls\" (click)=\"triggerConfirm()\">\n  {{props.locale.confirm}}\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
ConfirmPanelComponent.ctorParameters = () => [];
ConfirmPanelComponent.propDecorators = {
    propsData: [{ type: Input }],
    disableBtn: [{ type: Input }],
    formatStr: [{ type: Input }],
    startDateTime: [{ type: Input }],
    endDateTime: [{ type: Input }],
    onConfirm: [{ type: Input }],
    confirmPane: [{ type: HostBinding, args: ['class.confirm-panel',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SingleMonthComponent {
    /**
     * @param {?} _elementRef
     */
    constructor(_elementRef) {
        this._elementRef = _elementRef;
        this.props = /** @type {?} */ ({
            rowSize: 'normal'
        });
        this.state = {
            weekComponents: []
        };
        this.singleMonth = true;
        this.genWeek = (weeksData, index) => {
            const { getDateExtra, monthData, onCellClick, locale, rowSize } = this.props;
            /** @type {?} */
            let rowCls = 'row';
            /** @type {?} */
            let weeksDataList = [];
            if (rowSize === 'xl') {
                rowCls += ' row-xl';
            }
            weeksData.forEach((day, dayOfWeek) => {
                /** @type {?} */
                const extra = (getDateExtra && getDateExtra(new Date(day.tick))) || {};
                /** @type {?} */
                let info = extra.info;
                /** @type {?} */
                const disable = extra.disable || day.outOfDate;
                /** @type {?} */
                let cls = 'date';
                /** @type {?} */
                let lCls = 'left';
                /** @type {?} */
                let rCls = 'right';
                /** @type {?} */
                let infoCls = 'info';
                if (dayOfWeek === 0 || dayOfWeek === 6) {
                    cls += ' grey';
                }
                if (disable) {
                    cls += ' disable';
                }
                else if (info) {
                    cls += ' important';
                }
                if (day.selected) {
                    cls += ' date-selected';
                    /** @type {?} */
                    let styleType = day.selected;
                    switch (styleType) {
                        case Models.SelectType.Only:
                            info = locale.begin;
                            infoCls += ' date-selected';
                            break;
                        case Models.SelectType.All:
                            info = locale.begin_over;
                            infoCls += ' date-selected';
                            break;
                        case Models.SelectType.Start:
                            info = locale.begin;
                            infoCls += ' date-selected';
                            if (dayOfWeek === 6 || day.isLastOfMonth) {
                                styleType = Models.SelectType.All;
                            }
                            break;
                        case Models.SelectType.Middle:
                            if (dayOfWeek === 0 || day.isFirstOfMonth) {
                                if (day.isLastOfMonth || dayOfWeek === 6) {
                                    styleType = Models.SelectType.All;
                                }
                                else {
                                    styleType = Models.SelectType.Start;
                                }
                            }
                            else if (dayOfWeek === 6 || day.isLastOfMonth) {
                                styleType = Models.SelectType.End;
                            }
                            break;
                        case Models.SelectType.End:
                            info = locale.over;
                            infoCls += ' date-selected';
                            if (dayOfWeek === 0 || day.isFirstOfMonth) {
                                styleType = Models.SelectType.All;
                            }
                            break;
                    }
                    switch (styleType) {
                        case Models.SelectType.Single:
                        case Models.SelectType.Only:
                        case Models.SelectType.All:
                            cls += ' selected-single';
                            break;
                        case Models.SelectType.Start:
                            cls += ' selected-start';
                            rCls += ' date-selected';
                            break;
                        case Models.SelectType.Middle:
                            cls += ' selected-middle';
                            lCls += ' date-selected';
                            rCls += ' date-selected';
                            break;
                        case Models.SelectType.End:
                            cls += ' selected-end';
                            lCls += ' date-selected';
                            break;
                    }
                }
                weeksDataList[dayOfWeek] = {
                    lCls,
                    cls,
                    day,
                    rCls,
                    infoCls,
                    info,
                    extra,
                    disable,
                    onCellClick: onCellClick,
                    monthData
                };
            });
            this.state.weekComponents[index] = {
                index: index,
                rowCls,
                weeksDataList
            };
        };
        this.updateWeeks = (monthData) => {
            (monthData || this.props.monthData).weeks.forEach((week, index) => {
                this.genWeek(week, index);
            });
        };
        this.setWarpper = (dom) => {
            this.wrapperDivDOM = dom;
        };
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set data(value) {
        this.props = Object.assign({}, this.props, value);
    }
    /**
     * @param {?} item
     * @return {?}
     */
    onClickCell(item) {
        !item.disable && item.onCellClick && item.onCellClick(item.day, item.monthData);
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.setWarpper(this._elementRef.nativeElement);
        this.props.monthData.weeks.forEach((week, index) => {
            this.genWeek(week, index);
        });
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        this.ref = this.props.ref;
        this.ref(this);
    }
}
SingleMonthComponent.decorators = [
    { type: Component, args: [{
                selector: 'SingleMonth, nzm-single-month',
                template: "<div class=\"month-title\">\n  {{props.monthData.title}}\n</div>\n<div class=\"date\">\n  <div *ngFor=\"let row of state.weekComponents;let i = index;\" [ngClass]=\"row.rowCls\">\n    <div *ngFor=\"let cell of row.weeksDataList;let j = index;\"\n         class=\"{{'cell ' + (row.extra && row.extra.cellCls || '')}}\"\n         (click)=\"onClickCell(cell)\"\n    >\n      <div *ngIf=\"row.extra && row.extra.cellRender\">test</div>\n      <div *ngIf=\"!row.extra || (row.extra && row.extra.cellRender)\" class=\"date-wrapper\">\n        <span [ngClass]=\"cell.lCls\"></span>\n        <div [ngClass]=\"cell.cls\">\n          {{cell.day && cell.day.dayOfMonth || ''}}\n        </div>\n        <span [ngClass]=\"cell.rCls\"></span>\n      </div>\n      <div *ngIf=\"!row.extra || (row.extra && row.extra.cellRender)\" [ngClass]=\"cell.infoCls\">\n        {{cell.info}}\n      </div>\n    </div>\n  </div>\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
SingleMonthComponent.ctorParameters = () => [
    { type: ElementRef }
];
SingleMonthComponent.propDecorators = {
    data: [{ type: Input }],
    singleMonth: [{ type: HostBinding, args: ['class.single-month',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ShortcutPanelComponent {
    constructor() {
        this.props = /** @type {?} */ ({});
        this.shortcutPanel = true;
        this.onClick = (type) => {
            const { onSelect } = this.props;
            /** @type {?} */
            const today = new Date();
            switch (type) {
                case 'today':
                    onSelect(new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0), new Date(today.getFullYear(), today.getMonth(), today.getDate(), 12));
                    break;
                case 'yesterday':
                    onSelect(new Date(today.getFullYear(), today.getMonth(), today.getDate() - 1, 0), new Date(today.getFullYear(), today.getMonth(), today.getDate() - 1, 12));
                    break;
                case 'lastweek':
                    onSelect(new Date(today.getFullYear(), today.getMonth(), today.getDate() - 6, 0), new Date(today.getFullYear(), today.getMonth(), today.getDate(), 12));
                    break;
                case 'lastmonth':
                    onSelect(new Date(today.getFullYear(), today.getMonth(), today.getDate() - 29, 0), new Date(today.getFullYear(), today.getMonth(), today.getDate(), 12));
                    break;
            }
        };
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set locale(value) {
        this.props.locale = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set onSelect(value) {
        this.props.onSelect = value;
    }
}
ShortcutPanelComponent.decorators = [
    { type: Component, args: [{
                selector: 'CalendarShortcutPanel, nzm-calendar-shortcut-panel',
                template: "<div class=\"item\" (click)=\"onClick('today')\">{{props.locale.today}}</div>\n<div class=\"item\" (click)=\"onClick('yesterday')\">{{props.locale.yesterday}}</div>\n<div class=\"item\" (click)=\"onClick('lastweek')\">{{props.locale.lastWeek}}</div>\n<div class=\"item\" (click)=\"onClick('lastmonth')\">{{props.locale.lastMonth}}</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
ShortcutPanelComponent.ctorParameters = () => [];
ShortcutPanelComponent.propDecorators = {
    locale: [{ type: Input }],
    onSelect: [{ type: Input }],
    shortcutPanel: [{ type: HostBinding, args: ['class.shortcut-panel',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class DatePickerOptions {
    constructor() {
        this.mode = 'date';
        this.value = new Date();
        this.minDate = new Date(2000, 6, 1, 0, 0, 0);
        this.maxDate = new Date(2030, 1, 1, 23, 59, 59);
        this.use12Hours = false;
        this.minuteStep = 1;
        this.data = [];
        this.mask = true;
        this.title = '';
        this.okText = '确定';
        this.dismissText = '取消';
        this.disabled = false;
        this.appendToBody = false;
        this.onOk = new EventEmitter();
        this.onDismiss = new EventEmitter();
        this.onValueChange = new EventEmitter();
        this.onChange = new EventEmitter();
    }
}

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/**
 * @return {?}
 */
function getVelocity() {
    return ((minInterval = 30, maxInterval = 100) => {
        /** @type {?} */
        let _time = 0;
        /** @type {?} */
        let _y = 0;
        /** @type {?} */
        let _velocity = 0;
        /** @type {?} */
        const recorder = {
            record: (y) => {
                /** @type {?} */
                const now = +new Date();
                _velocity = (y - _y) / (now - _time);
                if (now - _time >= minInterval) {
                    _velocity = now - _time <= maxInterval ? _velocity : 0;
                    _y = y;
                    _time = now;
                }
            },
            getVelocity: (y) => {
                if (y !== _y) {
                    recorder.record(y);
                }
                return _velocity;
            },
        };
        return recorder;
    })();
}

var velocity = /*#__PURE__*/Object.freeze({
    getVelocity: getVelocity
});

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class DatePickerComponent$1 {
    /**
     * @param {?} elementRef
     * @param {?} options
     * @param {?} localeProviderService
     */
    constructor(elementRef, options, localeProviderService) {
        this.elementRef = elementRef;
        this.options = options;
        this.localeProviderService = localeProviderService;
        this.transitionName = 'am-slide-up-enter am-slide-up-enter-active';
        this.maskTransitionName = 'am-fade-enter am-fade-enter-active';
        this.modeSwitch = [1, 1, 1, 1, 1, 1];
        this.localMinDate = [];
        this.localMaxDate = [];
        this.currentTime = [];
        this.indexArray = [];
        this.min_date = [];
        this.max_date = [];
        this.current_time = [
            new Date().getFullYear(),
            new Date().getMonth() + 1,
            new Date().getDate(),
            new Date().getHours(),
            new Date().getMinutes()
        ];
        this.clos = 0;
        this.resultArr = [];
        this.data = [];
        this.dataWithStr = [];
        this.startY = 0;
        this.differY = 0;
        this.currentY = 0;
        this.len = 0;
        this.dom = null;
        this.index = 0;
        this.maxY = 0;
        this.lineHeight = 34;
        this.selectedTarget = [];
        this.isMouseDown = false;
        this.localeNew = {};
        this.unsubscribe$ = new Subject();
        this.Velocity = getVelocity();
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panstart(event) {
        if (!event.target.classList.contains('am-picker-col-mask')) {
            return;
        }
        this.isMouseDown = true;
        event.preventDefault();
        this.dom = event.target.parentElement.children[2];
        this.len = this.dom.children.length;
        this.maxY = -(this.len - 1);
        if (this.dom.style.transform === 'translateY(0px)') {
            this.currentY = 0;
            this.maxY = -(this.len - 1);
        }
        else if (this.selectedTarget.length > 0) {
            this.selectedTarget.forEach(item => {
                if (item.targetId === event.target.id) {
                    this.currentY = item.currentY;
                }
            });
        }
        /** @type {?} */
        const ev = this.getEventTarget(event);
        this.startY = ev.clientY;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panmove(event) {
        if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown) {
            return;
        }
        event.preventDefault();
        /** @type {?} */
        const ev = this.getEventTarget(event);
        this.differY = ev.clientY - this.startY;
        this.Velocity.record(this.differY);
        this.dom.style.transition = 'transform 0s';
        this.dom.style.transform = `translateY(${this.currentY * this.lineHeight + this.differY}px)`;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panend(event) {
        if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown) {
            return;
        }
        this.isMouseDown = false;
        event.preventDefault();
        /** @type {?} */
        const ev = this.getEventTarget(event);
        this.differY = ev.clientY - this.startY;
        /** @type {?} */
        let time = 0.3;
        /** @type {?} */
        const velocityTemp = this.Velocity.getVelocity(this.differY) * 4;
        if (velocityTemp) {
            this.differY = velocityTemp * 40 + this.differY;
            time = Math.abs(velocityTemp) * 0.1;
        }
        this.dom.style.transition = 'transform ' + (time < 0.3 ? 0.3 : time) + 's';
        if (this.differY <= -this.lineHeight / 2) {
            this.currentY += Math.floor(this.differY / this.lineHeight);
            if (this.currentY <= this.maxY) {
                this.currentY = this.maxY;
            }
        }
        else if (this.differY >= this.lineHeight / 2) {
            this.currentY += Math.floor(this.differY / this.lineHeight);
            if (this.currentY >= 0) {
                this.currentY = 0;
            }
        }
        if (this.selectedTarget.length > 0) {
            /** @type {?} */
            let hasKey = false;
            this.selectedTarget.forEach(item => {
                if (item.targetId === event.target.id) {
                    hasKey = true;
                    item.targetId = event.target.id;
                    item.currentY = this.currentY;
                }
            });
            if (!hasKey) {
                this.selectedTarget.push({ targetId: event.target.id, currentY: this.currentY });
            }
        }
        else {
            this.selectedTarget.push({ targetId: event.target.id, currentY: this.currentY });
        }
        this.dom.style.transform = `translateY(${this.currentY * this.lineHeight}px)`;
        this.index = Math.floor(Math.abs(this.currentY / 1)); // 记录当前位移在数组中的索引,必须取整,否则会出现浮点数
        this.current_time[this.indexArray[parseInt(event.target.id, 0)]] = this.resultArr[this.indexArray[parseInt(event.target.id, 0)]] = this.data[parseInt(event.target.id, 0)][this.index];
        if (this.judgeTime(this.current_time, this.max_date)) {
            this.currentTime = this.current_time = this.max_date.slice(0, this.indexArray.length);
            this.resultArr = this.current_time;
            this.options.onValueChange.emit(this.handleReslut());
            this.init();
        }
        else if (this.judgeTime(this.min_date, this.current_time)) {
            this.currentTime = this.current_time = this.min_date.slice(0, this.indexArray.length);
            this.resultArr = this.currentTime;
            this.options.onValueChange.emit(this.handleReslut());
            this.init();
        }
        else {
            this.setCurrentSelected(0, this.differY < 0, this.index);
            this.options.onValueChange.emit(this.handleReslut());
        }
    }
    /**
     * @return {?}
     */
    init() {
        this.initResult();
        this.checkTime();
        this.initReady();
        this.getInitValueIndex();
    }
    /**
     * @return {?}
     */
    reloadPicker() {
        if (!this.picker || this.picker === undefined) {
            return;
        }
        this.currentPicker = this.picker.element.nativeElement;
        if (this.currentPicker && this.currentPicker.children.length > 0) {
            /** @type {?} */
            const self = this;
            setTimeout(() => {
                self.selectedTarget.forEach((item, i) => {
                    self.currentPicker.children[i].children[2].style.transition = 'transform .3s';
                    /** @type {?} */
                    const index = parseInt(item.currentY, 0);
                    self.currentPicker.children[i].children[2].style.transform = `translateY(${index * self.lineHeight}px)`;
                });
            }, 0);
        }
    }
    /**
     * @return {?}
     */
    localeProvider() {
        /** @type {?} */
        const self = this;
        if (self.options.locale || self.options.locale !== undefined) {
            self.localeProviderService.setLocale(self.options.locale);
        }
        self.localeProviderService.localeChange.pipe(takeUntil(self.unsubscribe$)).subscribe(_ => {
            self.options.locale = self.localeProviderService.getLocale();
            self.localeNew = self.localeProviderService.getLocaleSubObj('DatePicker');
            self.options.okText = self.localeNew.okText;
            self.options.dismissText = self.localeNew.dismissText;
            self.init();
        });
    }
    /**
     * @param {?} date
     * @return {?}
     */
    transformDateFormat(date) {
        if (!date || date === '') {
            return '';
        }
        else {
            return 'yyyy-mm-dd-HH-MM'
                .replace('yyyy', date.getFullYear() + '')
                .replace('mm', date.getMonth() + 1 + '')
                .replace('dd', date.getDate() + '')
                .replace('HH', date.getHours() + '')
                .replace('MM', date.getMinutes() + '');
        }
    }
    /**
     * @param {?} val
     * @return {?}
     */
    preZero(val) {
        return val < 10 ? '0' + val : val + '';
    }
    /**
     * @return {?}
     */
    getInitValueIndex() {
        this.selectedTarget = [];
        this.indexArray.map((index, i) => {
            this.data.forEach((item, j) => {
                item.forEach((item1, k) => {
                    if (this.currentTime[index] === item1 && i === j) {
                        this.selectedTarget.push({ targetId: `${i}`, currentY: -k });
                    }
                });
            });
        });
        this.reloadPicker();
    }
    /**
     * @param {?} mode
     * @return {?}
     */
    checkMode(mode) {
        this.modeSwitch = [1, 1, 1, 1, 1, 1];
        switch (mode) {
            case 'date':
                this.modeSwitch = [1, 1, 1, 0, 0, 0];
                break;
            case 'time':
                if (this.options.use12Hours) {
                    this.modeSwitch = [0, 0, 0, 1, 1, 1];
                }
                else {
                    this.modeSwitch = [0, 0, 0, 1, 1, 0];
                }
                break;
            case 'datetime':
                if (this.options.use12Hours) {
                    this.modeSwitch = [1, 1, 1, 1, 1, 1];
                }
                else {
                    this.modeSwitch = [1, 1, 1, 1, 1, 0];
                }
                break;
            case 'year':
                this.modeSwitch = [1, 0, 0, 0, 0];
                break;
            case 'month':
                this.modeSwitch = [1, 1, 0, 0, 0];
                break;
            default:
                break;
        }
        /** @type {?} */
        const tempIndexArray = [];
        for (let i = 0; i < this.modeSwitch.length; i++) {
            if (this.modeSwitch[i] > 0) {
                tempIndexArray.push(i);
            }
        }
        this.clos = tempIndexArray[tempIndexArray.length - 1] - tempIndexArray[0] + 1;
        this.indexArray = tempIndexArray;
    }
    /**
     * @return {?}
     */
    initResult() {
        this.resultArr = [];
        if (this.currentTime.length > 0) {
            this.current_time = this.currentTime;
        }
        for (let i = 0; i < this.clos; i++) {
            /** @type {?} */
            const res = this.currentTime[i];
            if (this.options.mode === 'time') {
                this.resultArr = this.currentTime;
            }
            else {
                this.resultArr.push(res);
            }
        }
    }
    /**
     * @return {?}
     */
    checkTime() {
        /** @type {?} */
        const min_Date = this.transformDateFormat(this.options.minDate).split('-');
        if (min_Date.length > 0) {
            this.min_date = min_Date.map(item => {
                return parseInt(item, 0);
            });
        }
        /** @type {?} */
        const max_Date = this.transformDateFormat(this.options.maxDate).split('-');
        if (max_Date.length > 0) {
            this.max_date = max_Date.map(item => {
                return parseInt(item, 0);
            });
        }
        /** @type {?} */
        const min_date = this.min_date;
        /** @type {?} */
        const max_date = this.max_date;
        /** @type {?} */
        const current_time = this.current_time;
        this.localMinDate = [];
        if (this.localMinDate.length === 0) {
            for (let index = 0; index < this.indexArray.length; index++) {
                this.localMinDate.push(min_date[this.indexArray[index]]);
            }
        }
        this.localMaxDate = [];
        if (this.localMaxDate.length === 0) {
            for (let index = 0; index < this.indexArray.length; index++) {
                this.localMaxDate.push(max_date[this.indexArray[index]]);
            }
        }
        if (this.indexArray.length === this.localMinDate.length &&
            this.localMinDate.length === this.localMaxDate.length &&
            this.localMaxDate.length === this.currentTime.length) {
            /** @type {?} */
            let _indexArrayIndex = 0;
            for (let i = 0; i < this.modeSwitch.length; i++) {
                if (this.modeSwitch[i] === 0) {
                    switch (i) {
                        case 0:
                            min_date[i] = new Date().getFullYear();
                            max_date[i] = new Date().getFullYear();
                            break;
                        case 1:
                            min_date[i] = new Date().getMonth() + 1;
                            max_date[i] = new Date().getMonth() + 1;
                            break;
                        case 2:
                            min_date[i] = new Date().getDate();
                            max_date[i] = new Date().getDate();
                            break;
                        case 3:
                            min_date[i] = new Date().getHours();
                            max_date[i] = new Date().getHours();
                            break;
                        case 4:
                            min_date[i] = new Date().getMinutes();
                            max_date[i] = new Date().getMinutes();
                            break;
                        case 5:
                            min_date[i] = 0;
                            max_date[i] = 1;
                            break;
                    }
                }
                else {
                    switch (i) {
                        case 0:
                            this.localMinDate[_indexArrayIndex] = min_date[i] =
                                this.localMinDate[_indexArrayIndex] >= 1900
                                    ? this.localMinDate[_indexArrayIndex]
                                    : new Date().getFullYear();
                            this.localMaxDate[_indexArrayIndex] = max_date[i] =
                                this.localMaxDate[_indexArrayIndex] >= 1900
                                    ? this.localMaxDate[_indexArrayIndex]
                                    : new Date().getFullYear() + 1;
                            current_time[i] = this.currentTime[_indexArrayIndex];
                            break;
                        case 1:
                            this.localMinDate[_indexArrayIndex] = min_date[i] =
                                this.localMinDate[_indexArrayIndex] > 0 && this.localMinDate[_indexArrayIndex] <= 12
                                    ? this.localMinDate[_indexArrayIndex]
                                    : 1;
                            this.localMaxDate[_indexArrayIndex] = max_date[i] =
                                this.localMaxDate[_indexArrayIndex] > 0 && this.localMaxDate[_indexArrayIndex] <= 12
                                    ? this.localMaxDate[_indexArrayIndex]
                                    : 12;
                            current_time[i] = this.currentTime[_indexArrayIndex];
                            break;
                        case 2:
                            this.localMinDate[_indexArrayIndex] = min_date[i] =
                                this.localMinDate[_indexArrayIndex] > 0 &&
                                    this.localMinDate[_indexArrayIndex] <= new Date(min_date[0], min_date[1], 0).getDate()
                                    ? this.localMinDate[_indexArrayIndex]
                                    : 1;
                            this.localMaxDate[_indexArrayIndex] = max_date[i] =
                                this.localMaxDate[_indexArrayIndex] > 0 &&
                                    this.localMaxDate[_indexArrayIndex] <= new Date(max_date[0], max_date[1], 0).getDate()
                                    ? this.localMaxDate[_indexArrayIndex]
                                    : new Date(max_date[0], max_date[1], 0).getDate();
                            current_time[i] = this.currentTime[_indexArrayIndex];
                            break;
                        case 3:
                            this.localMinDate[_indexArrayIndex] = min_date[i] =
                                this.localMinDate[_indexArrayIndex] >= 0 && this.localMinDate[_indexArrayIndex] <= 23
                                    ? this.localMinDate[_indexArrayIndex]
                                    : 0;
                            if (this.options.use12Hours) {
                                this.localMaxDate[_indexArrayIndex] = max_date[i] =
                                    this.localMaxDate[_indexArrayIndex] >= 0 && this.localMaxDate[_indexArrayIndex] <= 11
                                        ? this.localMaxDate[_indexArrayIndex]
                                        : 11;
                            }
                            else {
                                this.localMaxDate[_indexArrayIndex] = max_date[i] =
                                    this.localMaxDate[_indexArrayIndex] >= 0 && this.localMaxDate[_indexArrayIndex] <= 23
                                        ? this.localMaxDate[_indexArrayIndex]
                                        : 23;
                            }
                            current_time[i] = this.currentTime[_indexArrayIndex];
                            break;
                        case 4:
                            this.localMinDate[_indexArrayIndex] = min_date[i] =
                                this.localMinDate[_indexArrayIndex] >= 0 && this.localMinDate[_indexArrayIndex] <= 59
                                    ? this.localMinDate[_indexArrayIndex]
                                    : 0;
                            this.localMaxDate[_indexArrayIndex] = max_date[i] =
                                this.localMaxDate[_indexArrayIndex] >= 0 && this.localMaxDate[_indexArrayIndex] <= 59
                                    ? this.localMaxDate[_indexArrayIndex]
                                    : 59;
                            current_time[i] = this.currentTime[_indexArrayIndex];
                            break;
                    }
                    _indexArrayIndex++;
                }
            }
            /** @type {?} */
            const minT = new Date(min_date[0], min_date[1], min_date[2], min_date[3], min_date[4]).getTime();
            /** @type {?} */
            const maxT = new Date(max_date[0], max_date[1], max_date[2], max_date[3], max_date[4]).getTime();
            /** @type {?} */
            const curT = new Date(current_time[0], current_time[1], current_time[2], current_time[3], current_time[4]).getTime();
            return minT <= curT && curT <= maxT;
        }
        else {
            return false;
        }
    }
    /**
     * @param {?} arr1
     * @param {?} arr2
     * @return {?}
     */
    judgeTime(arr1, arr2) {
        /** @type {?} */
        let date1;
        /** @type {?} */
        let date2;
        date1 = arr1.slice(0, 3).join('-') + ' ' + arr1.slice(3, 5).join(':');
        date2 = arr2.slice(0, 3).join('-') + ' ' + arr2.slice(3, 5).join(':');
        return new Date(date1).getTime() >= new Date(date2).getTime();
    }
    /**
     * @param {?} arr1
     * @param {?} arr2
     * @param {?} length
     * @return {?}
     */
    judgeEqualArray(arr1, arr2, length) {
        /** @type {?} */
        let status = true;
        for (let i = 0; i < length; i++) {
            if (arr1[i] != arr2[i]) {
                status = false;
            }
        }
        return status;
    }
    /**
     * @return {?}
     */
    initReady() {
        /** @type {?} */
        let realIdx = 0;
        for (let i = 0; i < this.clos; i++) {
            realIdx = this.indexArray[i];
            /** @type {?} */
            let min = 0;
            /** @type {?} */
            let max = 0;
            /** @type {?} */
            const tempArray = [];
            switch (realIdx) {
                case 0:
                    this.initData(tempArray, this.localMinDate[i], this.localMaxDate[i], this.localeNew.year, i);
                    break;
                case 1:
                    min = this.judgeEqualArray(this.min_date, this.current_time, 1) ? this.localMinDate[i] : 1;
                    max = this.judgeEqualArray(this.max_date, this.current_time, 1) ? this.localMaxDate[i] : 12;
                    this.initData(tempArray, min, max, this.localeNew.month, i);
                    break;
                case 2:
                    min = this.judgeEqualArray(this.min_date, this.current_time, 2) ? this.localMinDate[i] : 1;
                    max = this.judgeEqualArray(this.max_date, this.current_time, 2)
                        ? this.localMaxDate[i]
                        : new Date(this.current_time[0], this.current_time[1], 0).getDate();
                    this.initData(tempArray, min, max, this.localeNew.day, i);
                    break;
                case 3:
                    min = this.judgeEqualArray(this.min_date, this.current_time, 3) ? this.localMinDate[i] : 0;
                    max = this.judgeEqualArray(this.max_date, this.current_time, 3) ? this.localMaxDate[i] : 23;
                    this.initData(tempArray, min, max, this.localeNew.hour, i);
                    break;
                case 4:
                    min = this.judgeEqualArray(this.min_date, this.current_time, 4) ? this.localMinDate[i] : 0;
                    max = this.judgeEqualArray(this.max_date, this.current_time, 4) ? this.localMaxDate[i] : 59;
                    this.initData(tempArray, min, max, this.localeNew.minute, i);
                    break;
                case 5:
                    min = 0;
                    max = 1;
                    this.initData(tempArray, min, max, 'use12Hours', i);
                    break;
            }
        }
    }
    /**
     * @param {?} tempArr
     * @param {?} min
     * @param {?} max
     * @param {?} str
     * @param {?} idx
     * @return {?}
     */
    initData(tempArr, min, max, str, idx) {
        /** @type {?} */
        const dataWithStr = [];
        for (min; min < max + 1; min++) {
            tempArr.push(min);
            dataWithStr.push(min + str);
        }
        if (this.data.length > this.indexArray.length) {
            this.data = [];
            this.dataWithStr = [];
        }
        if (this.data.length > idx && this.data[idx].toString() !== tempArr.toString()) {
            this.data[idx] = tempArr;
        }
        else if (this.data.length > idx && this.data[idx].toString() === tempArr.toString()) {
            this.data[idx] = tempArr;
        }
        else {
            this.data.push(tempArr);
        }
        if (this.options.locale === undefined || this.options.locale.locale === 'zh_CN') {
            if (this.dataWithStr.length > idx && this.dataWithStr[idx].toString() !== dataWithStr.toString()) {
                this.dataWithStr[idx] = dataWithStr;
            }
            else if (this.dataWithStr.length > idx && this.dataWithStr[idx].toString() === dataWithStr.toString()) {
                this.dataWithStr[idx] = dataWithStr;
            }
            else {
                this.dataWithStr.push(dataWithStr);
            }
        }
        else {
            this.dataWithStr = this.data;
        }
    }
    /**
     * @return {?}
     */
    ok() {
        this.options.onOk.emit(this.handleReslut());
        this.setTransitionName();
    }
    /**
     * @return {?}
     */
    handleReslut() {
        /** @type {?} */
        let result = '';
        if (this.options.mode === 'datetime' || this.options.mode === 'time') {
            /** @type {?} */
            const temp = this.resultArr;
            result = temp.slice(0, 3).join('-') + ' ' + temp.slice(3, 5).join(':');
        }
        else {
            result = this.resultArr.map(v => v).join('-');
        }
        this.resultDate = new Date(result.replace(/-/g, '/'));
        if (this.options.minDate.getTime() > this.resultDate.getTime()) {
            if (this.resultArr.length > 0) {
                for (let index = 0; index < this.resultArr.length; index++) {
                    this.resultArr = this.min_date;
                    this.currentTime = this.resultArr;
                    this.current_time = this.currentTime;
                }
            }
            this.resultDate = this.options.minDate;
        }
        return this.resultDate;
    }
    /**
     * @return {?}
     */
    cancel() {
        this.options.onDismiss.emit();
        this.setTransitionName();
    }
    /**
     * @return {?}
     */
    setTransitionName() {
        this.transitionName = 'am-slide-up-leave am-slide-up-leave-active';
        this.maskTransitionName = 'am-fade-leave am-fade-leave-active';
        setTimeout(() => {
            this.options.hidePicker();
        }, 200);
    }
    /**
     * @param {?} checkIdx
     * @param {?} sta
     * @param {?} indexT
     * @return {?}
     */
    setCurrentSelected(checkIdx, sta, indexT) {
        if (checkIdx >= this.clos - 1) {
            return;
        }
        /** @type {?} */
        let status = null;
        if (sta) {
            status = this.judgeEqualArray(this.min_date, this.resultArr, checkIdx + 1);
        }
        else {
            status = this.judgeEqualArray(this.max_date, this.resultArr, checkIdx + 1);
        }
        if (!status) {
            /** @type {?} */
            let min = 0;
            /** @type {?} */
            let max = 0;
            /** @type {?} */
            let str = '';
            /** @type {?} */
            const realIdx = this.indexArray[checkIdx];
            switch (realIdx) {
                case 0:
                    min = 1;
                    max = 12;
                    str = '月';
                    break;
                case 1:
                    min = 1;
                    max = new Date(this.current_time[0], this.current_time[1], 0).getDate();
                    str = '日';
                    break;
                case 2:
                    min = 0;
                    max = 23;
                    str = '时';
                    break;
                case 3:
                    min = 0;
                    max = 59;
                    str = '分';
                    break;
            }
            this.initRangeArr(min, max, indexT, checkIdx + 1, str);
        }
        this.setCurrentSelected(checkIdx + 1, sta, indexT);
    }
    /**
     * @param {?} min
     * @param {?} max
     * @param {?} indexT
     * @param {?} checkIdx
     * @param {?} str
     * @return {?}
     */
    initRangeArr(min, max, indexT, checkIdx, str) {
        /** @type {?} */
        const realIdx = this.indexArray[checkIdx];
        /** @type {?} */
        const arr = [];
        /** @type {?} */
        let targetLong = 0;
        for (let index = min; index < max + 1; index++) {
            arr.push(index);
        }
        if (arr.indexOf(this.resultArr[checkIdx]) == -1) {
            if (-this.selectedTarget[checkIdx].currentY > max - min) {
                indexT = max - min;
                this.selectedTarget[checkIdx].currentY = -indexT;
            }
            targetLong = -arr.length * this.lineHeight;
        }
        else {
            targetLong = -arr.indexOf(this.resultArr[checkIdx]) * this.lineHeight;
            this.selectedTarget[checkIdx].currentY = -arr.indexOf(this.resultArr[checkIdx]);
        }
        if (this.data[checkIdx].toString() !== arr.toString()) {
            this.current_time[realIdx] = -targetLong / this.lineHeight + 1;
            this.resultArr[checkIdx] = -targetLong / this.lineHeight + 1;
            this.data[checkIdx] = arr;
            this.dataWithStr[checkIdx] =
                this.options.locale.locale === 'zh_CN'
                    ? arr.map(item => {
                        return item + str;
                    })
                    : arr;
            setTimeout(() => {
                this.selectedTarget.forEach((item, i) => {
                    if (i >= checkIdx) {
                        this.currentPicker.children[i].children[2].style.transition = '';
                        /** @type {?} */
                        const index = parseInt(item.currentY, 0);
                        this.currentPicker.children[i].children[2].style.transform = `translateY(${index * this.lineHeight}px)`;
                    }
                });
            }, 0);
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    getEventTarget(event) {
        if (event.type === 'mousedown' ||
            event.type === 'mousemove' ||
            event.type === 'mouseup' ||
            event.type === 'mouseleave') {
            return event;
        }
        else {
            if (event && event.changedTouches && event.changedTouches[0]) {
                return event.changedTouches[0];
            }
            return null;
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.localeProvider();
        this.checkMode(this.options.mode);
        /** @type {?} */
        const value = this.transformDateFormat(this.options.value).split('-');
        if (value.length > 0) {
            this.currentTime = value.map(item => {
                return parseInt(item, 0);
            });
        }
        this.init();
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        this.reloadPicker();
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this.unsubscribe$.next();
        this.unsubscribe$.complete();
    }
}
DatePickerComponent$1.decorators = [
    { type: Component, args: [{
                selector: 'DatePicker, nzm-date-picker',
                template: "<div *ngIf=\"options.mask\" class=\"am-picker-popup-mask {{maskTransitionName}}\" (click)=\"cancel()\"></div>\n<div class=\"am-picker-popup {{transitionName}}\" style=\"z-index: 1001\">\n  <div class=\"am-picker-popup-content\">\n    <div class=\"am-picker-popup-body\">\n      <div>\n        <div class=\"am-picker-popup-header\">\n          <div class=\"am-picker-popup-item am-picker-popup-header-left\"\n               (click)=\"cancel()\"\n          >\n            {{options.dismissText}}\n          </div>\n          <div class=\"am-picker-popup-item am-picker-popup-title\">{{options.title}}</div>\n          <div class=\"am-picker-popup-item am-picker-popup-header-right\"\n               (click)=\"ok()\"\n          >\n            {{options.okText}}\n          </div>\n        </div>\n        <div #picker\n             class=\"am-picker\"\n             style=\"flex-direction: row; align-items: center;\"\n        >\n          <div *ngFor=\"let item of dataWithStr; let i = index\" class=\"am-picker-col\">\n            <div class=\"am-picker-col-indicator \" style=\"top: 102px;\"></div>\n            <div id={{i}}\n                 class=\"am-picker-col-mask\"\n                 style=\"background-size: 100% 102px;\"\n            ></div>\n            <div class=\"am-picker-col-content\">\n              <div id={{i}}\n                   class=\"am-picker-col-item\"\n                   *ngFor=\"let val of item; let i = index\"\n              >{{val.label?val.label:val}}</div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
DatePickerComponent$1.ctorParameters = () => [
    { type: ElementRef },
    { type: DatePickerOptions },
    { type: LocaleProviderService }
];
DatePickerComponent$1.propDecorators = {
    picker: [{ type: ViewChild, args: ['picker', { read: ViewContainerRef },] }],
    panstart: [{ type: HostListener, args: ['mousedown', ['$event'],] }, { type: HostListener, args: ['touchstart', ['$event'],] }],
    panmove: [{ type: HostListener, args: ['mousemove', ['$event'],] }, { type: HostListener, args: ['touchmove', ['$event'],] }],
    panend: [{ type: HostListener, args: ['mouseleave', ['$event'],] }, { type: HostListener, args: ['mouseup', ['$event'],] }, { type: HostListener, args: ['touchend', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class DatePickerViewComponent extends DatePickerComponent$1 {
    constructor() {
        super(...arguments);
        this.mode = 'date';
        this.minDate = new Date(2000, 5, 1, 0, 0, 0);
        this.maxDate = new Date(2030, 1, 1, 23, 59, 59);
        this.value = new Date();
        this.disabled = false;
        this.indicatorStyle = {};
        this.onValueChange = new EventEmitter();
        this.amPicker = true;
    }
    /**
     * @return {?}
     */
    get locale() {
        return this.options.locale;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set locale(value) {
        this.options.locale = value;
        this.unsubscribe$.next();
        this.unsubscribe$.complete();
    }
    /**
     * @return {?}
     */
    init() {
        this.options.mode = this.mode;
        this.options.minDate = this.minDate;
        this.options.maxDate = this.maxDate;
        this.options.disabled = this.disabled;
        this.options.locale = this.locale;
        this.options.value = this.value;
        this.options.onValueChange = this.onValueChange;
        this.checkMode(this.options.mode);
        /** @type {?} */
        const value = this.transformDateFormat(this.options.value).split('-');
        if (value.length > 0) {
            this.currentTime = value.map(item => {
                return parseInt(item, 0);
            });
        }
        this.initResult();
        this.checkTime();
        this.initReady();
        this.getInitValueIndex();
    }
    /**
     * @return {?}
     */
    reloadPicker() {
        if (this.currentPicker) {
            /** @type {?} */
            const self = this;
            setTimeout(() => {
                self.selectedTarget.forEach((item, i) => {
                    self.currentPicker.children[i].children[2].style.transition = 'transform .3s';
                    /** @type {?} */
                    const index = parseInt(item.currentY, 0);
                    self.currentPicker.children[i].children[2].style.transform = `translateY(${index * self.lineHeight}px)`;
                });
            }, 0);
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.localeProvider();
        this.init();
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        this.currentPicker = this.elementRef.nativeElement;
        this.reloadPicker();
    }
    /**
     * @param {?} changes
     * @return {?}
     */
    ngOnChanges(changes) {
        if (changes["value"]) {
            this.options.value = changes["value"].currentValue;
            /** @type {?} */
            const value = this.transformDateFormat(this.options.value).split('-');
            if (value.length > 0) {
                this.currentTime = value.map(item => {
                    return parseInt(item, 0);
                });
            }
            if (!this.judgeEqualArray(this.currentTime, this.resultArr, this.resultArr.length) ||
                this.judgeEqualArray(this.currentTime, this.min_date, this.currentTime.length) ||
                this.judgeTime(this.currentTime, this.max_date)) {
                this.init();
            }
        }
        if (changes["mode"] || changes["minDate"] || changes["maxDate"] || changes["disabled"] || changes["locale"]) {
            this.init();
        }
    }
}
DatePickerViewComponent.decorators = [
    { type: Component, args: [{
                selector: 'DatePickerView, nzm-date-picker-view',
                template: "<div *ngFor=\"let item of dataWithStr; let i = index\" class=\"am-picker-col\">\n  <div class=\"am-picker-col-indicator \" style=\"top: 102px;\" [ngStyle]=\"indicatorStyle\"></div>\n  <div id={{i}} class=\"am-picker-col-mask\" style=\"background-size: 100% 102px;\"></div>\n  <div class=\"am-picker-col-content\">\n    <div id={{i}} *ngFor=\"let val of item; let i = index\" class=\"am-picker-col-item\">{{val.label?val.label:val}}</div>\n  </div>\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
DatePickerViewComponent.propDecorators = {
    mode: [{ type: Input }],
    minDate: [{ type: Input }],
    maxDate: [{ type: Input }],
    value: [{ type: Input }],
    disabled: [{ type: Input }],
    indicatorStyle: [{ type: Input }],
    locale: [{ type: Input }],
    onValueChange: [{ type: Output }],
    amPicker: [{ type: HostBinding, args: ['class.am-picker',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class LocaleProviderPipe {
    /**
     * @param {?} _locale
     */
    constructor(_locale) {
        this._locale = _locale;
    }
    /**
     * @param {?} keyPath
     * @return {?}
     */
    transform(keyPath) {
        return this._locale.getLocaleValue(keyPath);
    }
}
LocaleProviderPipe.decorators = [
    { type: Pipe, args: [{
                name: 'localeProvider'
            },] }
];
/** @nocollapse */
LocaleProviderPipe.ctorParameters = () => [
    { type: LocaleProviderService }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
const ɵ0$1 = zh_CN;
class LocaleProviderModule {
}
LocaleProviderModule.decorators = [
    { type: NgModule, args: [{
                imports: [],
                declarations: [LocaleProviderPipe],
                exports: [LocaleProviderPipe],
                providers: [{ provide: LOCAL_PROVIDER_TOKEN, useValue: ɵ0$1 }, LOCALE_PROVIDER_SERVICE_PROVIDER]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class DatePickerDirective {
    /**
     * @param {?} _viewContainerRef
     * @param {?} _elm
     * @param {?} _defaultOptions
     * @param {?} _cfr
     */
    constructor(_viewContainerRef, _elm, _defaultOptions, _cfr) {
        this._viewContainerRef = _viewContainerRef;
        this._elm = _elm;
        this._defaultOptions = _defaultOptions;
        this._cfr = _cfr;
        this._eventListeners = [];
        this.value = new Date();
        this.onVisibleChange = new EventEmitter(true);
        this.onValueChange = new EventEmitter();
        this.onOk = new EventEmitter();
        this.onDismiss = new EventEmitter();
    }
    /**
     * @return {?}
     */
    togglePicker() {
        if (!this.picker) {
            this.showPicker();
        }
        else {
            this.hidePicker();
        }
    }
    /**
     * @return {?}
     */
    showPicker() {
        if (!this.picker) {
            setTimeout(() => {
                this._eventListeners = [];
            });
            /** @type {?} */
            const options = new DatePickerOptions();
            Object.assign(options, this._defaultOptions, {
                hidePicker: (event) => {
                    this.hidePicker();
                }
            });
            /** @type {?} */
            const optionalParams = [
                'mode',
                'minDate',
                'maxDate',
                'value',
                'mask',
                'title',
                'okText',
                'dismissText',
                'disabled',
                'locale',
                'appendToBody',
                'onOk',
                'onDismiss',
                'onValueChange'
            ];
            optionalParams.forEach(param => {
                if (typeof this[param] !== 'undefined') {
                    (/** @type {?} */ (options))[param] = this[param];
                }
            });
            /** @type {?} */
            const componentFactory = this._cfr.resolveComponentFactory(DatePickerComponent$1);
            /** @type {?} */
            const childInjector = Injector.create([
                {
                    provide: DatePickerOptions,
                    useValue: options
                }
            ]);
            this.picker = this._viewContainerRef.createComponent(componentFactory, this._viewContainerRef.length, childInjector);
            if (options.appendToBody) {
                document.body.appendChild(this.picker.location.nativeElement);
            }
            this.onVisibleChange.emit(true);
        }
    }
    /**
     * @return {?}
     */
    hidePicker() {
        if (this.picker) {
            this.picker.destroy();
            delete this.picker;
            this.onVisibleChange.emit(false);
            this._eventListeners.forEach(fn => fn());
            this._eventListeners = [];
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.onVisibleChange.emit(false);
    }
    /**
     * @param {?} changes
     * @return {?}
     */
    ngOnChanges(changes) {
        if (changes["isOpen"]) {
            if (changes["isOpen"].currentValue === true) {
                this.showPicker();
            }
            else {
                this.hidePicker();
            }
        }
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this.hidePicker();
    }
}
DatePickerDirective.decorators = [
    { type: Directive, args: [{
                selector: '[DatePicker]'
            },] }
];
/** @nocollapse */
DatePickerDirective.ctorParameters = () => [
    { type: ViewContainerRef },
    { type: ElementRef },
    { type: DatePickerOptions },
    { type: ComponentFactoryResolver }
];
DatePickerDirective.propDecorators = {
    isOpen: [{ type: Input }],
    mode: [{ type: Input }],
    minDate: [{ type: Input }],
    maxDate: [{ type: Input }],
    use12Hours: [{ type: Input }],
    value: [{ type: Input }],
    mask: [{ type: Input }],
    title: [{ type: Input }],
    okText: [{ type: Input }],
    dismissText: [{ type: Input }],
    disabled: [{ type: Input }],
    locale: [{ type: Input }],
    appendToBody: [{ type: Input }],
    onVisibleChange: [{ type: Output }],
    onValueChange: [{ type: Output }],
    onOk: [{ type: Output }],
    onDismiss: [{ type: Output }],
    togglePicker: [{ type: HostListener, args: ['click',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class DatePickerModule {
}
DatePickerModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, LocaleProviderModule],
                exports: [DatePickerComponent$1, DatePickerDirective],
                declarations: [DatePickerComponent$1, DatePickerDirective],
                entryComponents: [DatePickerComponent$1],
                providers: [DatePickerOptions, LocaleProviderModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class DatePickerViewModule {
}
DatePickerViewModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, DatePickerModule, LocaleProviderModule],
                exports: [DatePickerViewComponent],
                declarations: [DatePickerViewComponent],
                providers: [LocaleProviderModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CalendarModule {
}
CalendarModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, IconModule, DatePickerViewModule],
                declarations: [
                    CalendarComponent,
                    HeaderComponent,
                    DatePickerComponent,
                    WeekPanelComponent,
                    SingleMonthComponent,
                    ConfirmPanelComponent,
                    TimePickerComponent,
                    ShortcutPanelComponent
                ],
                exports: [
                    CalendarComponent,
                    HeaderComponent,
                    DatePickerComponent,
                    WeekPanelComponent,
                    SingleMonthComponent,
                    ConfirmPanelComponent,
                    TimePickerComponent,
                    ShortcutPanelComponent
                ]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PopoverItemComponent {
    /**
     * @param {?} _elementRef
     */
    constructor(_elementRef) {
        this._elementRef = _elementRef;
        this.defaultProps = {
            prefixCls: 'am-popover',
            disabled: false
        };
        this.isActive = false;
        this.select = new EventEmitter();
        this.amPopoverItem = true;
    }
    /**
     * @return {?}
     */
    get icon() {
        return this._icon;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set icon(value) {
        this._icon = value;
    }
    /**
     * @return {?}
     */
    get style() {
        return this._style;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set style(value) {
        this._style = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        this.defaultProps.disabled = value;
    }
    /**
     * @return {?}
     */
    get amPopoverItemActive() {
        return this.isActive;
    }
    /**
     * @return {?}
     */
    get amPopoverItemDisabled() {
        return this.defaultProps.disabled;
    }
    /**
     * @param {?} e
     * @return {?}
     */
    touchStart(e) {
        this.select.emit();
        this.isActive = true;
    }
    /**
     * @return {?}
     */
    ngAfterContentInit() { }
}
PopoverItemComponent.decorators = [
    { type: Component, args: [{
                selector: 'PopoverItem, nzm-popover-item',
                template: "<div class=\"{{defaultProps.prefixCls}}-item-container\">\n  <span class=\"{{defaultProps.prefixCls}}-item-icon\" aria-hidden=\"true\">\n    <ng-template [ngTemplateOutlet]=\"icon\"></ng-template>\n  </span>\n  <span class=\"{{defaultProps.prefixCls}}-item-content\">\n    <ng-content></ng-content>\n  </span>\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
PopoverItemComponent.ctorParameters = () => [
    { type: ElementRef }
];
PopoverItemComponent.propDecorators = {
    icon: [{ type: Input }],
    style: [{ type: Input }],
    disabled: [{ type: Input }],
    select: [{ type: Output }],
    amPopoverItem: [{ type: HostBinding, args: ['class.am-popover-item',] }],
    amPopoverItemActive: [{ type: HostBinding, args: ['class.am-popover-item-active',] }],
    amPopoverItemDisabled: [{ type: HostBinding, args: ['class.am-popover-item-disabled',] }],
    touchStart: [{ type: HostListener, args: ['touchstart', ['$event'],] }, { type: HostListener, args: ['mousedown', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PopoverItemModule {
}
PopoverItemModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, IconModule],
                exports: [PopoverItemComponent],
                declarations: [PopoverItemComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class FlexComponent {
    constructor() {
        this.defaultProps = {
            prefixCls: 'am-flexbox',
            align: 'center'
        };
        this._direction = '';
        this._justify = '';
        this._alignContent = '';
        this.amFlexbox = true;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set direction(value) {
        this._direction = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set wrap(value) {
        this._wrap = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set justify(value) {
        this._justify = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set align(value) {
        this.defaultProps.align = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set alignContent(value) {
        this._alignContent = value;
    }
    /**
     * @return {?}
     */
    get amFlexboxDirRow() {
        return this._direction === 'row';
    }
    /**
     * @return {?}
     */
    get amFlexboxDirRowReverse() {
        return this._direction === 'row-reverse';
    }
    /**
     * @return {?}
     */
    get amFlexboxDirColumn() {
        return this._direction === 'column';
    }
    /**
     * @return {?}
     */
    get amFlexboxDirColumnReverse() {
        return this._direction === 'column-reverse';
    }
    /**
     * @return {?}
     */
    get amFlexboxNowrap() {
        return this._wrap === 'nowrap';
    }
    /**
     * @return {?}
     */
    get amFlexboxWrap() {
        return this._wrap === 'wrap';
    }
    /**
     * @return {?}
     */
    get amFlexboxWrapReverse() {
        return this._wrap === 'wrap-reverse';
    }
    /**
     * @return {?}
     */
    get amFlexboxJustifyStart() {
        return this._justify === 'start';
    }
    /**
     * @return {?}
     */
    get amFlexboxJustifyCenter() {
        return this._justify === 'center';
    }
    /**
     * @return {?}
     */
    get amFlexboxJustifyEnd() {
        return this._justify === 'end';
    }
    /**
     * @return {?}
     */
    get amFlexboxJustifyBetween() {
        return this._justify === 'between';
    }
    /**
     * @return {?}
     */
    get amFlexboxAlignAround() {
        return this._justify === 'around';
    }
    /**
     * @return {?}
     */
    get amFlexboxAlignStart() {
        return this.defaultProps.align === 'start';
    }
    /**
     * @return {?}
     */
    get amFlexboxAlignCenter() {
        return this.defaultProps.align === 'center';
    }
    /**
     * @return {?}
     */
    get amFlexboxAlignEnd() {
        return this.defaultProps.align === 'end';
    }
    /**
     * @return {?}
     */
    get amFlexboxAlignBaseline() {
        return this.defaultProps.align === 'baseline';
    }
    /**
     * @return {?}
     */
    get amFlexboxAlignStretch() {
        return this.defaultProps.align === 'stretch';
    }
    /**
     * @return {?}
     */
    get amFlexboxAlignContentStart() {
        return this._alignContent === 'start';
    }
    /**
     * @return {?}
     */
    get amFlexboxAlignCotentCenter() {
        return this._alignContent === 'center';
    }
    /**
     * @return {?}
     */
    get amFlexboxAlignContentEnd() {
        return this._alignContent === 'end';
    }
    /**
     * @return {?}
     */
    get amFlexboxAlignContentBetween() {
        return this._alignContent === 'between';
    }
    /**
     * @return {?}
     */
    get amFlexboxAlignContentAround() {
        return this._alignContent === 'around';
    }
    /**
     * @return {?}
     */
    get amFlexboxAlignContentStretch() {
        return this._alignContent === 'stretch';
    }
}
FlexComponent.decorators = [
    { type: Component, args: [{
                selector: 'Flex, nzm-flex',
                template: "<ng-content></ng-content>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
FlexComponent.ctorParameters = () => [];
FlexComponent.propDecorators = {
    direction: [{ type: Input }],
    wrap: [{ type: Input }],
    justify: [{ type: Input }],
    align: [{ type: Input }],
    alignContent: [{ type: Input }],
    amFlexbox: [{ type: HostBinding, args: ['class.am-flexbox',] }],
    amFlexboxDirRow: [{ type: HostBinding, args: ['class.am-flexbox-dir-row',] }],
    amFlexboxDirRowReverse: [{ type: HostBinding, args: ['class.am-flexbox-dir-row-reverse',] }],
    amFlexboxDirColumn: [{ type: HostBinding, args: ['class.am-flexbox-dir-column',] }],
    amFlexboxDirColumnReverse: [{ type: HostBinding, args: ['class.am-flexbox-dir-column-reverse',] }],
    amFlexboxNowrap: [{ type: HostBinding, args: ['class.am-flexbox-nowrap',] }],
    amFlexboxWrap: [{ type: HostBinding, args: ['class.am-flexbox-wrap',] }],
    amFlexboxWrapReverse: [{ type: HostBinding, args: ['class.am-flexbox-wrap-reverse',] }],
    amFlexboxJustifyStart: [{ type: HostBinding, args: ['class.am-flexbox-justify-start',] }],
    amFlexboxJustifyCenter: [{ type: HostBinding, args: ['class.am-flexbox-justify-center',] }],
    amFlexboxJustifyEnd: [{ type: HostBinding, args: ['class.am-flexbox-justify-end',] }],
    amFlexboxJustifyBetween: [{ type: HostBinding, args: ['class.am-flexbox-justify-between',] }],
    amFlexboxAlignAround: [{ type: HostBinding, args: ['class.am-flexbox-justify-around',] }],
    amFlexboxAlignStart: [{ type: HostBinding, args: ['class.am-flexbox-align-start',] }],
    amFlexboxAlignCenter: [{ type: HostBinding, args: ['class.am-flexbox-align-center',] }],
    amFlexboxAlignEnd: [{ type: HostBinding, args: ['class.am-flexbox-align-end',] }],
    amFlexboxAlignBaseline: [{ type: HostBinding, args: ['class.am-flexbox-align-baseline',] }],
    amFlexboxAlignStretch: [{ type: HostBinding, args: ['class.am-flexbox-align-stretch',] }],
    amFlexboxAlignContentStart: [{ type: HostBinding, args: ['class.am-flexbox-align-content-start',] }],
    amFlexboxAlignCotentCenter: [{ type: HostBinding, args: ['class.am-flexbox-align-content-center',] }],
    amFlexboxAlignContentEnd: [{ type: HostBinding, args: ['class.am-flexbox-align-content-end',] }],
    amFlexboxAlignContentBetween: [{ type: HostBinding, args: ['class.am-flexbox-align-content-between',] }],
    amFlexboxAlignContentAround: [{ type: HostBinding, args: ['class.am-flexbox-align-content-around',] }],
    amFlexboxAlignContentStretch: [{ type: HostBinding, args: ['class.am-flexbox-align-content-stretch',] }]
};
class FlexItemComponent {
    constructor() {
        this.defaultProps = {
            prefixCls: 'am-flexbox',
            align: 'center'
        };
        this.flexboxItem = true;
    }
}
FlexItemComponent.decorators = [
    { type: Component, args: [{
                selector: 'FlexItem, nzm-flex-item',
                template: `
    <ng-content></ng-content>
  `,
                encapsulation: ViewEncapsulation.None
            }] }
];
FlexItemComponent.propDecorators = {
    flexboxItem: [{ type: HostBinding, args: ['class.am-flexbox-item',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class FlexModule {
}
FlexModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule],
                exports: [FlexComponent, FlexItemComponent],
                declarations: [FlexComponent, FlexItemComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class GridComponent {
    constructor() {
        this.wrapCls = {};
        this.itemCls = {};
        this.carouselProps = {
            dots: false,
            dragging: false
        };
        this.defaultProps = {
            data: [],
            hasLine: true,
            isCarousel: false,
            columnNum: 4,
            carouselMaxRow: 2,
            prefixCls: 'am-grid',
            square: true,
            itemStyle: {}
        };
        this.carouselData = [];
        this.carouselDataTmp = [];
        this.gridData = [];
        this._data = [];
        this.columnNum = 4;
        this.carouselMaxRow = 2;
        this.itemStyle = {};
        this.square = true;
        this.hasLine = true;
        this.activeStyle = true;
        this.OnClick = new EventEmitter();
        this.amGrid = true;
    }
    /**
     * @return {?}
     */
    get isCarousel() {
        return this.defaultProps.isCarousel;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set isCarousel(value) {
        this.defaultProps.isCarousel = value;
        this.init();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set data(value) {
        this._data = value;
        this.init();
    }
    /**
     * @return {?}
     */
    get amGridSquare() {
        return true === this.square;
    }
    /**
     * @return {?}
     */
    get amGridLine() {
        return true === this.hasLine;
    }
    /**
     * @return {?}
     */
    get amGridCarousel() {
        return true === this.isCarousel;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    isTemplateRef(value) {
        return value instanceof TemplateRef;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    isURL(value) {
        if (value) {
            return value.indexOf('http') >= 0;
        }
        else {
            return false;
        }
    }
    /**
     * @return {?}
     */
    init() {
        /** @type {?} */
        const dataLength = (this._data && this._data.length) || 0;
        /** @type {?} */
        let rowCount = Math.ceil(dataLength / this.columnNum);
        /** @type {?} */
        let rowsArr;
        if (this.defaultProps.isCarousel) {
            if (rowCount % this.carouselMaxRow !== 0) {
                rowCount = rowCount + this.carouselMaxRow - (rowCount % this.carouselMaxRow);
            }
            /** @type {?} */
            const pageCount = Math.ceil(rowCount / this.carouselMaxRow);
            rowsArr = this.getRows(rowCount, dataLength);
            if (pageCount <= 1) {
                this.carouselProps = {
                    dots: false,
                    dragging: false
                };
            }
            else {
                this.carouselProps = {
                    dots: true,
                    dragging: true
                };
            }
            this.carouselDataTmp = this.getCarouselData(rowsArr, pageCount, rowCount);
        }
        else {
            this.gridData = this.getRows(rowCount, dataLength);
        }
    }
    /**
     * @param {?} rowsArr
     * @param {?} pageCount
     * @param {?} rowCount
     * @return {?}
     */
    getCarouselData(rowsArr, pageCount, rowCount) {
        /** @type {?} */
        const pagesArr = [];
        for (let pageIndex = 0; pageIndex < pageCount; pageIndex++) {
            /** @type {?} */
            const pageRows = [];
            for (let ii = 0; ii < this.carouselMaxRow; ii++) {
                /** @type {?} */
                const rowIndex = pageIndex * this.carouselMaxRow + ii;
                if (rowIndex < rowCount) {
                    pageRows.push(rowsArr[rowIndex]);
                }
                else {
                    // 空节点为了确保末尾页的最后未到底的行有底线(样式中last-child会没线)
                    pageRows.push(null);
                }
            }
            pagesArr.push(pageRows);
        }
        return pagesArr;
    }
    /**
     * @param {?} rowCount
     * @param {?} dataLength
     * @return {?}
     */
    getRows(rowCount, dataLength) {
        /** @type {?} */
        const columnNum = this.columnNum;
        /** @type {?} */
        const rowArr = new Array();
        for (let i = 0; i < rowCount; i++) {
            rowArr[i] = new Array();
            for (let j = 0; j < columnNum; j++) {
                /** @type {?} */
                const dataIndex = i * columnNum + j;
                if (dataIndex < dataLength) {
                    rowArr[i][j] = this._data[dataIndex];
                }
                else {
                    rowArr[i][j] = null;
                }
            }
        }
        return rowArr;
    }
    /**
     * @param {?} data
     * @param {?} index
     * @return {?}
     */
    click(data, index) {
        /** @type {?} */
        const outputData = {
            data: data,
            index: index
        };
        this.OnClick.emit(outputData);
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.itemCls = {
            [`${this.defaultProps.prefixCls}-item`]: true,
            [`${this.defaultProps.prefixCls}-active-item`]: false
        };
    }
}
GridComponent.decorators = [
    { type: Component, args: [{
                selector: 'Grid, nzm-grid',
                template: "<ng-container *ngIf=\"!isCarousel\">\n  <Flex *ngFor=\"let item of gridData; let i = index;\"\n        [justify]=\"'center'\"\n        [align]=\"'stretch'\"\n  >\n    <FlexItem TouchFeedback\n              *ngFor=\"let subItem of item; let j = index;\"\n              [ngClass]=\"itemCls\"\n              [ngStyle]=\"itemStyle\"\n              [className]=\"['am-grid-item-active']\"\n              [activeStyle]=\"activeStyle\"\n    >\n      <div *ngIf=\"subItem !== null\"\n           class=\"{{defaultProps.prefixCls}}-item-content\"\n           (click)=\"click(subItem,i * columnNum + j)\"\n      >\n        <div class=\"{{defaultProps.prefixCls}}-item-inner-content column-num-{{columnNum}}\">\n          <img *ngIf=\"subItem.icon && isURL(subItem.icon)\"\n               src=\"{{subItem.icon}}\"\n               class=\"{{defaultProps.prefixCls}}-icon\"\n          >\n          <Icon *ngIf=\"subItem.icon && !isURL(subItem.icon)\"\n                [type]=\"subItem.icon\"\n                [size]=\"subItem.size\"\n          ></Icon>\n          <div class=\"{{defaultProps.prefixCls}}-text\">{{subItem.text}}</div>\n        </div>\n      </div>\n      <div *ngIf=\"subItem === null\" class=\"{{defaultProps.prefixCls}}-null-item\"></div>\n    </FlexItem>\n    <ng-content></ng-content>\n  </Flex>\n</ng-container>\n\n<Carousel *ngIf=\"isCarousel && carouselDataTmp.length > 0\"\n          [autoplay]=\"false\"\n          [infinite]=\"true\"\n          [selectedIndex]=\"0\"\n          [autoplayInterval]='3000'\n          [dots]=\"carouselProps.dots\"\n          [dragging]=\"carouselProps.dragging\"\n>\n  <CarouselSlide *ngFor=\"let gridData of carouselDataTmp\"\n                 class=\"{{defaultProps.prefixCls}}-carousel-page\"\n                 style=\"display: block;\"\n  >\n    <Flex *ngFor=\"let item of gridData; let i = index;\"\n          [justify]=\"'center'\"\n          [align]=\"'stretch'\"\n    >\n      <FlexItem TouchFeedback\n                *ngFor=\"let subItem of item; let j = index;\"\n                class=\"{{defaultProps.prefixCls}}-item\"\n                [ngStyle]=\"itemStyle\"\n                [className]=\"['am-grid-item-active']\"\n      >\n        <div *ngIf=\"subItem !== null\"\n             class=\"{{defaultProps.prefixCls}}-item-content\"\n             (click)=\"click(subItem,i * columnNum + j)\"\n        >\n          <div class=\"{{defaultProps.prefixCls}}-item-inner-content column-num-4\">\n            <img class=\"{{defaultProps.prefixCls}}-icon\" src=\"{{subItem.icon}}\">\n            <div class=\"{{defaultProps.prefixCls}}-text\">{{subItem.text}}</div>\n          </div>\n        </div>\n        <div *ngIf=\"subItem === null\" class=\"{{defaultProps.prefixCls}}-null-item\"></div>\n      </FlexItem>\n    </Flex>\n  </CarouselSlide>\n</Carousel>"
            }] }
];
/** @nocollapse */
GridComponent.ctorParameters = () => [];
GridComponent.propDecorators = {
    columnNum: [{ type: Input }],
    carouselMaxRow: [{ type: Input }],
    itemStyle: [{ type: Input }],
    square: [{ type: Input }],
    hasLine: [{ type: Input }],
    isCarousel: [{ type: Input }],
    activeStyle: [{ type: Input }],
    data: [{ type: Input }],
    OnClick: [{ type: Output }],
    amGrid: [{ type: HostBinding, args: ['class.am-grid',] }],
    amGridSquare: [{ type: HostBinding, args: ['class.am-grid-square',] }],
    amGridLine: [{ type: HostBinding, args: ['class.am-grid-line',] }],
    amGridCarousel: [{ type: HostBinding, args: ['class.am-grid-carousel',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/** @type {?} */
const INTERFACE_TOKEN = new InjectionToken('InterfaceToken');
class TouchFeedbackDirective {
    /**
     * @param {?} _elementRef
     * @param {?} _renderer
     */
    constructor(_elementRef, _renderer) {
        this._elementRef = _elementRef;
        this._renderer = _renderer;
        this.activeStyle = true;
        this.clickStart = new EventEmitter();
        this.clickEnd = new EventEmitter();
    }
    /**
     * @param {?} className
     * @return {?}
     */
    addClass(className) {
        this._renderer.addClass(this._elementRef.nativeElement, className);
    }
    /**
     * @param {?} className
     * @return {?}
     */
    removeClass(className) {
        this._renderer.removeClass(this._elementRef.nativeElement, className);
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this._className = this.className;
    }
    /**
     * @return {?}
     */
    touchStart() {
        if (this.activeStyle) {
            this.addClass(this._className);
            this.clickStart.emit();
        }
    }
    /**
     * @return {?}
     */
    touchEnd() {
        if (this.activeStyle) {
            this.removeClass(this._className);
            this.clickEnd.emit();
        }
    }
}
TouchFeedbackDirective.decorators = [
    { type: Directive, args: [{
                selector: '[TouchFeedback]'
            },] }
];
/** @nocollapse */
TouchFeedbackDirective.ctorParameters = () => [
    { type: ElementRef },
    { type: Renderer2 }
];
TouchFeedbackDirective.propDecorators = {
    className: [{ type: Input }],
    activeStyle: [{ type: Input }],
    clickStart: [{ type: Output }],
    clickEnd: [{ type: Output }],
    touchStart: [{ type: HostListener, args: ['touchstart', ['$event'],] }, { type: HostListener, args: ['mousedown', ['$event'],] }],
    touchEnd: [{ type: HostListener, args: ['touchend', ['$event'],] }, { type: HostListener, args: ['mouseup', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class TouchFeedBackComponent {
    /**
     * @param {?} _ele
     * @param {?} _render
     */
    constructor(_ele, _render) {
        this._ele = _ele;
        this._render = _render;
        this.activeClassName = '';
        this.activeStyle = true;
    }
    /**
     * @return {?}
     */
    touchStart() {
        if (this.activeStyle) {
            this._render.addClass(this._ele.nativeElement, this.activeClassName);
        }
    }
    /**
     * @return {?}
     */
    touchEnd() {
        if (this.activeStyle) {
            this._render.removeClass(this._ele.nativeElement, this.activeClassName);
        }
    }
}
TouchFeedBackComponent.decorators = [
    { type: Component, args: [{
                selector: 'TouchFeedBack',
                template: '<ng-content></ng-content>',
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
TouchFeedBackComponent.ctorParameters = () => [
    { type: ElementRef },
    { type: Renderer2 }
];
TouchFeedBackComponent.propDecorators = {
    activeClassName: [{ type: Input }],
    activeStyle: [{ type: Input }],
    touchStart: [{ type: HostListener, args: ['touchstart', ['$event'],] }, { type: HostListener, args: ['mousedown', ['$event'],] }],
    touchEnd: [{ type: HostListener, args: ['touchend', ['$event'],] }, { type: HostListener, args: ['mouseup', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PopupService {
    /**
     * @param {?} _overlay
     * @param {?} _viewContainerRef
     */
    constructor(_overlay, _viewContainerRef) {
        this._overlay = _overlay;
        this._viewContainerRef = _viewContainerRef;
        PopupService.viewContainerRef = this._viewContainerRef;
        PopupService.overlay = this._overlay;
    }
    /**
     * @param {?} component
     * @param {?=} childInjector
     * @return {?}
     */
    static showPopup(component, childInjector) {
        /** @type {?} */
        let overlayConfig = new OverlayConfig();
        overlayConfig.hasBackdrop = true;
        PopupService.overlayRef = PopupService.overlay.create(overlayConfig);
        PopupService.overlayRef.backdropClick().subscribe(() => {
            PopupService.overlayRef.dispose();
        });
        PopupService.overlayRef.attach(new ComponentPortal(component, PopupService.viewContainerRef, childInjector));
    }
    /**
     * @return {?}
     */
    static hidePopup() {
        if (PopupService.overlayRef) {
            PopupService.overlayRef.dispose();
        }
    }
}
PopupService.viewContainerRef = null;
PopupService.overlay = null;
PopupService.overlayRef = null;
PopupService.decorators = [
    { type: Injectable }
];
/** @nocollapse */
PopupService.ctorParameters = () => [
    { type: Overlay },
    { type: ViewContainerRef }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CoreModule {
}
CoreModule.decorators = [
    { type: NgModule, args: [{
                imports: [
                    CommonModule,
                    OverlayModule
                ],
                exports: [TouchFeedbackDirective, TouchFeedBackComponent],
                declarations: [TouchFeedbackDirective, TouchFeedBackComponent],
                providers: [PopupService]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class GridModule {
}
GridModule.decorators = [
    { type: NgModule, args: [{
                imports: [FlexModule, IconModule, CommonModule, CarouselModule, CoreModule],
                exports: [GridComponent],
                declarations: [GridComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SafeHTMLPipe {
    /**
     * @param {?} _sanitized
     */
    constructor(_sanitized) {
        this._sanitized = _sanitized;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    transform(value) {
        return this._sanitized.bypassSecurityTrustHtml(value);
    }
}
SafeHTMLPipe.decorators = [
    { type: Pipe, args: [{ name: 'safeHTML' },] }
];
/** @nocollapse */
SafeHTMLPipe.ctorParameters = () => [
    { type: DomSanitizer }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class NgZorroAntdMobilePipesModule {
}
NgZorroAntdMobilePipesModule.decorators = [
    { type: NgModule, args: [{
                imports: [],
                declarations: [
                    SafeHTMLPipe
                ],
                exports: [SafeHTMLPipe]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ActionSheetComponent {
    constructor() {
        this.props = {
            prefixCls: 'am-action-sheet',
            cancelButtonText: '取消'
        };
        this.flag = '';
        this.title = '';
        this.message = '';
        this.transitionName = '';
        this.maskTransitionName = '';
        this.activeClassName = [`${this.props.prefixCls}-button-list-item-active`];
    }
    /**
     * @param {?} flag
     * @return {?}
     */
    showShare(flag) {
        /** @type {?} */
        const cls = { [`${this.props.prefixCls}-share`]: flag === 'SHARE' };
        return cls;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    isTemplateRef(value) {
        if (value) {
            return value instanceof TemplateRef;
        }
        return false;
    }
    /**
     * @param {?} options
     * @param {?} value
     * @return {?}
     */
    isArray(options, value) {
        if (options.length > 0 && value) {
            return value instanceof Array;
        }
        return false;
    }
}
ActionSheetComponent.decorators = [
    { type: Component, args: [{
                selector: 'ActionSheet',
                template: "<div class=\"{{props.prefixCls}}-mask {{maskTransitionName}}\"></div>\n<div class=\"{{props.prefixCls}}-wrap {{transitionName}}\" (click)=\"onPress(-1, 0, $event)\">\n  <div role=\"document\"\n       class=\"{{props.prefixCls}}\"\n       [ngClass]=\"showShare(flag)\">\n    <div class=\"{{props.prefixCls}}-content\">\n      <button aria-label=\"Close\" class=\"{{props.prefixCls}}-close\">\n        <span class=\"{{props.prefixCls}}-close-x\"></span>\n      </button>\n      <div class=\"{{props.prefixCls}}-body\">\n        <div>\n          <ng-template *ngIf=\"isTemplateRef(title)\" [ngTemplateOutlet]=\"title\"></ng-template>\n          <h3 *ngIf=\"!isTemplateRef(title)\" class=\"{{props.prefixCls}}-title\">{{title}}</h3>\n          <ng-template *ngIf=\"isTemplateRef(message)\" [ngTemplateOutlet]=\"message\"></ng-template>\n          <div *ngIf=\"!isTemplateRef(message)\" class=\"{{props.prefixCls}}-message\">{{message}}</div>\n          <ng-container [ngSwitch]=\"flag\">\n            <div *ngSwitchCase=\"'NORMAL'\" class=\"{{props.prefixCls}}-button-list\" role=\"group\">\n              <ng-container *ngFor=\"let item of options; let i = index;\">\n                  <TouchFeedBack class=\"{{props.prefixCls}}-button-list-item\" [activeClassName]=\"activeClassName\" >\n                      <div *ngIf=\"destructiveButtonIndex !== i && cancelButtonIndex !== i\"\n                           class=\"{{props.prefixCls}}-button-list-item\"\n                           (click)=\"onPress(i, 0, $event)\"\n                      >\n                        {{item}}\n                      </div>\n                      <div *ngIf=\"destructiveButtonIndex === i\"\n                           class=\"{{props.prefixCls}}-button-list-item {{props.prefixCls}}-destructive-button\"\n                           (click)=\"onPress(i, 0, $event)\"\n                      >\n                        {{item}}\n                      </div>\n                      <div *ngIf=\"cancelButtonIndex === i\"\n                           class=\"{{props.prefixCls}}-button-list-item {{props.prefixCls}}-cancel-button\"\n                           (click)=\"onPress(i, 0, $event)\"\n                      >\n                        {{item}}\n                        <span class=\"{{props.prefixCls}}-cancel-button-mask\"></span>\n                      </div>\n                  </TouchFeedBack>\n              </ng-container>\n            </div>\n            <div *ngSwitchCase=\"'SHARE'\" class=\"{{props.prefixCls}}-share {{props.prefixCls}}-share-content\">\n              <div *ngIf=\"!isArray(options, options[0])\" class=\"{{props.prefixCls}}-share-list\">\n                <ng-container *ngFor=\"let item of options; let i = index;\">\n                  <div class=\"{{props.prefixCls}}-share-list-item\" (click)=\"onPress(i, 0, $event)\">\n                    <div class=\"{{props.prefixCls}}-share-list-item-icon\">\n                      <ng-template *ngIf=\"isTemplateRef(item.icon)\" [ngTemplateOutlet]=\"item.icon\"></ng-template>\n                      <div *ngIf=\"!isTemplateRef(item.icon)\" [innerHTML]=\"item.icon | safeHTML\"></div>\n                    </div>\n                    <div class=\"{{props.prefixCls}}-share-list-item-title\">{{item.title}}</div>\n                  </div>\n                </ng-container>\n              </div>\n              <ng-container *ngIf=\"isArray(options, options[0])\">\n                <div *ngFor=\"let items of options; let rowIndex = index\" class=\"{{props.prefixCls}}-share-list\">\n                  <ng-container *ngFor=\"let item of items; let i = index;\">\n                    <div class=\"{{props.prefixCls}}-share-list-item\" (click)=\"onPress(i, rowIndex, $event)\">\n                      <div class=\"{{props.prefixCls}}-share-list-item-icon\">\n                        <ng-template *ngIf=\"isTemplateRef(item.icon)\" [ngTemplateOutlet]=\"item.icon\"></ng-template>\n                        <div *ngIf=\"!isTemplateRef(item.icon)\" [innerHTML]=\"item.icon | safeHTML\"></div>\n                      </div>\n                      <div class=\"{{props.prefixCls}}-share-list-item-title\">{{item.title}}</div>\n                    </div>\n                  </ng-container>\n                </div>\n              </ng-container>\n              <div class=\"{{props.prefixCls}}-share-cancel-button\">{{props.cancelButtonText}}</div>\n            </div>\n          </ng-container>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
ActionSheetComponent.ctorParameters = () => [];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ActionSheetModule {
}
ActionSheetModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, NgZorroAntdMobilePipesModule, ListModule, WhiteSpaceModule, WingBlankModule, CoreModule],
                declarations: [
                    ActionSheetComponent
                ],
                exports: [
                    ActionSheetComponent
                ],
                entryComponents: [ActionSheetComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SegmentedControlComponent {
    constructor() {
        this.prefixCls = 'am-segment';
        this.tintColor = '#2DB7F5';
        this.disabled = false;
        this.selectedIndex = 0;
        this.onChange = new EventEmitter();
        this.role = 'tablist';
        this.amSegment = true;
    }
    /**
     * @return {?}
     */
    get amDisabled() {
        return this.disabled;
    }
    /**
     * @param {?} index
     * @param {?} value
     * @return {?}
     */
    onClick(index, value) {
        if (!this.disabled && index !== this.selectedIndex) {
            this.selectedIndex = index;
            this.onChange.emit({ selectedIndex: index, value: value });
        }
    }
}
SegmentedControlComponent.decorators = [
    { type: Component, args: [{
                selector: 'SegmentedControl, nz-segmented-control',
                template: "<div role=\"tab\"\n     *ngFor=\"let value of values; let i = index;\"\n     class=\"{{prefixCls}}-item\"\n     [ngClass]=\"{'am-segment-item-selected' : i === selectedIndex}\"\n     [ngStyle]=\"{'border-color': tintColor, 'color': i === selectedIndex ? '#fff' : tintColor, 'background-color': i === selectedIndex ? tintColor : 'transparent'}\"\n     (click)=\"onClick(i, value)\"\n>\n  <div class=\"{{prefixCls}}-item-inner\"\n       [ngStyle]=\"{'background-color': i === selectedIndex ? tintColor : 'transparent'}\"\n  ></div>\n  {{value}}\n</div>\n"
            }] }
];
/** @nocollapse */
SegmentedControlComponent.ctorParameters = () => [];
SegmentedControlComponent.propDecorators = {
    tintColor: [{ type: Input }],
    disabled: [{ type: Input }],
    selectedIndex: [{ type: Input }],
    values: [{ type: Input }],
    onChange: [{ type: Output }],
    role: [{ type: HostBinding, args: ['attr.role',] }],
    amSegment: [{ type: HostBinding, args: ['class.am-segment',] }],
    amDisabled: [{ type: HostBinding, args: ['class.am-segment-disabled',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SegmentedControlModule {
}
SegmentedControlModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule],
                declarations: [SegmentedControlComponent],
                exports: [SegmentedControlComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class TextareaItem {
    constructor() {
        this.prefixCls = 'am-textarea';
        this.isTitleString = true;
        this.maxLength = Infinity;
        this._prefixListCls = 'am-list';
        this._defaultValue = '';
        this._placeholder = '';
        this._editable = true;
        this._disabled = false;
        this._clear = false;
        this._rows = 1;
        this._error = false;
        this._labelNumber = 5;
        this._name = '';
        this._focus = false;
        this._autoFocus = false;
        this._isClear = false;
        this._isClickingClear = false;
        this.onChange = new EventEmitter();
        this.onBlur = new EventEmitter();
        this.onFocus = new EventEmitter();
        this.onErrorClick = new EventEmitter();
    }
    /**
     * @return {?}
     */
    get value() {
        return this._value;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set value(v) {
        if (typeof v === undefined || v === null) {
            this._value = '';
        }
        this._value = v;
        this.textRef.nativeElement.value = this._value;
    }
    /**
     * @return {?}
     */
    get defaultValue() {
        return this._defaultValue;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set defaultValue(value) {
        this._defaultValue = value;
        this._value = this._defaultValue;
        this.textRef.nativeElement.value = this._value;
    }
    /**
     * @return {?}
     */
    get placeholder() {
        return this._placeholder;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set placeholder(value) {
        this._placeholder = value;
    }
    /**
     * @return {?}
     */
    get editable() {
        return this._editable;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set editable(value) {
        this._editable = value;
    }
    /**
     * @return {?}
     */
    get disabled() {
        return this._disabled;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        this._disabled = value;
        this.setCls();
    }
    /**
     * @return {?}
     */
    get clear() {
        return this._clear;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set clear(value) {
        this._clear = value;
    }
    /**
     * @return {?}
     */
    get rows() {
        return this._rows;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set rows(value) {
        this._rows = value;
        this.setCls();
    }
    /**
     * @return {?}
     */
    get error() {
        return this._error;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set error(value) {
        this._error = value;
        this.setCls();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set labelNumber(value) {
        this._labelNumber = value;
        this.setCls();
    }
    /**
     * @return {?}
     */
    get count() {
        return this._count;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set count(value) {
        this._count = value;
        this.setCls();
        this.setCharacterLength();
    }
    /**
     * @return {?}
     */
    get prefixListCls() {
        return this._prefixListCls;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set prefixListCls(value) {
        this._prefixListCls = value;
        this.setCls();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set name(value) {
        this._name = value;
        this.textRef.nativeElement.name = this._name;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set autoHeight(value) {
        this._autoHeight = value;
    }
    /**
     * @return {?}
     */
    get title() {
        return this._title;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set title(value) {
        this._title = value;
        this.isTitleString = true;
        if (typeof value !== 'string') {
            this.isTitleString = false;
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set focus(value) {
        if (value && value.focus) {
            this.textRef.nativeElement.focus();
            this.inputFocus('');
        }
    }
    /**
     * @return {?}
     */
    get autoFocus() {
        return this._autoFocus;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set autoFocus(value) {
        this._autoFocus = value;
    }
    /**
     * @return {?}
     */
    setCls() {
        this.hasCount = this._count > 0 && this._rows > 1;
        this.wrapCls = {
            [`${this._prefixListCls}-item`]: true,
            [`${this.prefixCls}-item`]: true,
            [`${this.prefixCls}-disabled`]: this._disabled,
            [`${this.prefixCls}-error`]: this._error,
            [`${this.prefixCls}-focus`]: this._focus,
            [`${this.prefixCls}-item-single-line`]: this._rows === 1 && !this._autoHeight,
            [`${this.prefixCls}-has-count`]: this.hasCount
        };
        this.labelCls = {
            [`${this.prefixCls}-label`]: true,
            [`${this.prefixCls}-label-2`]: this._labelNumber === 2,
            [`${this.prefixCls}-label-3`]: this._labelNumber === 3,
            [`${this.prefixCls}-label-4`]: this._labelNumber === 4,
            [`${this.prefixCls}-label-5`]: this._labelNumber === 5,
            [`${this.prefixCls}-label-6`]: this._labelNumber === 6,
            [`${this.prefixCls}-label-7`]: this._labelNumber === 7
        };
        this.controlCls = { [`${this.prefixCls}-control`]: true };
        this.clearCls = {
            [`${this.prefixCls}-clear-active`]: this._isClickingClear
        };
    }
    /**
     * @return {?}
     */
    setCharacterLength() {
        this.characterLength = this.countSymbols(this._value);
        if (this._count > 0) {
            this.maxLength = this._count - this.characterLength + (this._value ? this._value.length : 0);
        }
    }
    /**
     * @param {?} e
     * @return {?}
     */
    inputChange(e) {
        this._value = e;
        this.textRef.nativeElement.value = this._value;
        this.setCharacterLength();
        this.onChange.emit(this._value);
    }
    /**
     * @param {?} value
     * @return {?}
     */
    inputFocus(value) {
        this._focus = true;
        this.setCls();
        if (value !== undefined) {
            this.onFocus.emit(value);
        }
    }
    /**
     * @param {?} value
     * @param {?} event
     * @return {?}
     */
    inputBlur(value, event) {
        setTimeout(() => {
            this._focus = false;
            this.setCls();
            this.onBlur.emit(value);
            this._isClear = false;
        }, 100);
    }
    /**
     * @return {?}
     */
    clearInput() {
        this._isClickingClear = true;
        this.setCls();
        setTimeout(() => {
            this._value = '';
            this.inputChange('');
            this.inputFocus(this._value);
            this._isClickingClear = false;
            this.setCls();
        }, 100);
    }
    /**
     * @param {?} e
     * @return {?}
     */
    errorClick(e) {
        if (this.onErrorClick) {
            this.onErrorClick.emit(e);
        }
    }
    /**
     * @return {?}
     */
    reAlignHeight() {
        /** @type {?} */
        const textareaDom = this.textRef.nativeElement;
        textareaDom.style.height = '';
        textareaDom.style.height = `${textareaDom.scrollHeight}px`;
    }
    /**
     * @param {?=} text
     * @return {?}
     */
    countSymbols(text = '') {
        /** @type {?} */
        const regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]|\n/g;
        return text.replace(regexAstralSymbols, '_').length;
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.setCls();
        this.setCharacterLength();
        this.textRef.nativeElement.value = this._value;
    }
    /**
     * @return {?}
     */
    ngAfterContentChecked() {
        if (this._autoHeight && this._focus) {
            this.reAlignHeight();
        }
    }
}
TextareaItem.decorators = [
    { type: Component, args: [{
                selector: 'TextareaItem , nzm-textarea-item',
                template: "<div [ngClass]=\"wrapCls\">\n  <div *ngIf=\"title &&  isTitleString\" [ngClass]=\"labelCls\">{{title}}</div>\n  <div *ngIf=\"title &&  !isTitleString\" [ngClass]=\"labelCls\">\n    <ng-template [ngTemplateOutlet]=\"title\"></ng-template>\n  </div>\n  <div [ngClass]=\"controlCls\">\n    <textarea #text\n              [rows]=\"rows\"\n              [maxlength]=\"maxLength\"\n              [(ngModel)]=\"value\"\n              [defaultValue]=\"defaultValue\"\n              [placeholder]=\"placeholder\"\n              [disabled]=\"disabled\"\n              [readOnly]=\"!editable\"\n              [autofocus]=\"autoFocus\"\n              (ngModelChange)=\"inputChange($event)\"\n              (blur)=\"inputBlur(value , $event)\"\n              (focus)=\"inputFocus(value)\"\n    ></textarea>\n  </div>\n  <div *ngIf=\"clear && editable && !disabled && (value && value.length >0 )\"\n       class=\"{{prefixCls}}-clear\"\n       [ngClass]=\"clearCls\"\n       (click)=\"clearInput()\"\n  ></div>\n  <div *ngIf=\"error\" class=\"{{prefixCls}}-error-extra\" (click)=\"errorClick($event)\"></div>\n  <span *ngIf=\"hasCount\" class=\"{{prefixCls}}-count\">\n    <span>{{characterLength}}</span>/{{count}}\n  </span>\n</div>\n",
                providers: [
                    {
                        provide: NG_VALUE_ACCESSOR,
                        useExisting: forwardRef(() => TextareaItem),
                        multi: true
                    }
                ]
            }] }
];
/** @nocollapse */
TextareaItem.ctorParameters = () => [];
TextareaItem.propDecorators = {
    textRef: [{ type: ViewChild, args: ['text',] }],
    value: [{ type: Input }],
    defaultValue: [{ type: Input }],
    placeholder: [{ type: Input }],
    editable: [{ type: Input }],
    disabled: [{ type: Input }],
    clear: [{ type: Input }],
    rows: [{ type: Input }],
    error: [{ type: Input }],
    labelNumber: [{ type: Input }],
    count: [{ type: Input }],
    prefixListCls: [{ type: Input }],
    name: [{ type: Input }],
    autoHeight: [{ type: Input }],
    title: [{ type: Input }],
    focus: [{ type: Input }],
    autoFocus: [{ type: Input }],
    onChange: [{ type: Output }],
    onBlur: [{ type: Output }],
    onFocus: [{ type: Output }],
    onErrorClick: [{ type: Output }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class TextareaItemModule {
}
TextareaItemModule.decorators = [
    { type: NgModule, args: [{
                exports: [TextareaItem],
                declarations: [TextareaItem],
                imports: [CommonModule, FormsModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class TabPane {
    constructor() {
        this.prefixCls = 'am-tabs-pane';
        this.tintColor = '#108ee9';
        this.unselectedTintColor = '#888';
        this.active = true;
        this.isTitleString = true;
        this.showTabPanelContent = false;
        this.paneWrap = true;
    }
    /**
     * @return {?}
     */
    get title() {
        return this._title;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set title(value) {
        this.isTitleString = !(value instanceof TemplateRef);
        this._title = value;
    }
    /**
     * @return {?}
     */
    get wrapActive() {
        return this.active;
    }
    /**
     * @return {?}
     */
    get wrapInactive() {
        return !this.active;
    }
    /**
     * @param {?} e
     * @return {?}
     */
    onTranslateTabStarted(e) {
        if ((e.toState == 'center-with-animation' ||
            e.toState == 'center-without-animation' ||
            e.toState == 'left-with-animation-with-higher-zindex' ||
            e.toState == 'right-with-animation-with-higher-zindex' ||
            e.toState == 'top-with-animation-with-higher-zindex' ||
            e.toState == 'bottom-with-animation-with-higher-zindex') &&
            (this.position == 'center-with-animation' ||
                this.position == 'center-without-animation' ||
                this.position == 'left-with-animation-with-higher-zindex' ||
                this.position == 'right-with-animation-with-higher-zindex' ||
                this.position == 'top-with-animation-with-higher-zindex' ||
                this.position == 'bottom-with-animation-with-higher-zindex')) {
            this.showTabPanelContent = true;
        }
    }
    /**
     * @param {?} e
     * @return {?}
     */
    onTranslateTabComplete(e) {
        if (e.toState !== 'center-with-animation' &&
            e.toState !== 'center-without-animation' &&
            e.toState !== 'left-with-animation-with-higher-zindex' &&
            e.toState !== 'right-with-animation-with-higher-zindex' &&
            e.toState !== 'top-with-animation-with-higher-zindex' &&
            e.toState !== 'bottom-with-animation-with-higher-zindex' &&
            this.position !== 'center-with-animation' &&
            this.position !== 'center-without-animation' &&
            this.position !== 'left-with-animation-with-higher-zindex' &&
            this.position !== 'right-with-animation-with-higher-zindex' &&
            this.position !== 'top-with-animation-with-higher-zindex' &&
            this.position !== 'bottom-with-animation-with-higher-zindex') {
            this.showTabPanelContent = false;
        }
    }
}
TabPane.decorators = [
    { type: Component, args: [{
                selector: 'TabPane, nzm-tab-pane',
                template: "<ng-content *ngIf=\"showTabPanelContent\"></ng-content>",
                host: {
                    '[@translateTabPane]': 'position',
                    '(@translateTabPane.start)': 'onTranslateTabStarted($event)',
                    '(@translateTabPane.done)': 'onTranslateTabComplete($event)'
                },
                animations: [
                    trigger('translateTabPane', [
                        state('left-with-animation', style({
                            transform: 'translate3d(-100%, 0, 0)',
                            transition: '.3s cubic-bezier(0.35, 0, 0.25, 1)'
                        })),
                        state('left-with-animation-with-higher-zindex', style({
                            'z-index': 100,
                            transform: 'translate3d(-100%, 0, 0)',
                            transition: '.3s cubic-bezier(0.35, 0, 0.25, 1)'
                        })),
                        state('left-without-animation', style({ transform: 'translate3d(-100%, 0, 0)' })),
                        state('right-with-animation', style({
                            transform: 'translate3d(100%, 0, 0)',
                            transition: '.3s cubic-bezier(0.35, 0, 0.25, 1)'
                        })),
                        state('right-with-animation-with-higher-zindex', style({
                            'z-index': 100,
                            transform: 'translate3d(100%, 0, 0)',
                            transition: '.3s cubic-bezier(0.35, 0, 0.25, 1)'
                        })),
                        state('right-without-animation', style({ transform: 'translate3d(100%, 0, 0)' })),
                        state('top-with-animation', style({
                            transform: 'translate3d(0, -100%, 0)',
                            transition: '.3s cubic-bezier(0.35, 0, 0.25, 1)'
                        })),
                        state('top-with-animation-with-higher-zindex', style({
                            'z-index': 100,
                            transform: 'translate3d(0, -100%, 0)',
                            transition: '.3s cubic-bezier(0.35, 0, 0.25, 1)'
                        })),
                        state('top-without-animation', style({ transform: 'translate3d(0, -100%, 0)' })),
                        state('bottom-with-animation', style({
                            transform: 'translate3d(0, 100%, 0)',
                            transition: '.3s cubic-bezier(0.35, 0, 0.25, 1)'
                        })),
                        state('bottom-with-animation-with-higher-zindex', style({
                            'z-index': 100,
                            transform: 'translate3d(0, 100%, 0)',
                            transition: '.3s cubic-bezier(0.35, 0, 0.25, 1)'
                        })),
                        state('bottom-without-animation', style({ transform: 'translate3d(0, 100%, 0)' })),
                        state('center-with-animation', style({
                            'z-index': 100,
                            transform: 'translate3d(0, 0, 0)',
                            transition: '.3s cubic-bezier(0.35, 0, 0.25, 1)'
                        })),
                        state('center-without-animation', style({ transform: 'translate3d(0, 0, 0)' }))
                    ])
                ],
                styles: [`:host {touch-action: auto}`]
            }] }
];
/** @nocollapse */
TabPane.ctorParameters = () => [];
TabPane.propDecorators = {
    title: [{ type: Input }],
    paneWrap: [{ type: HostBinding, args: ['class.am-tabs-pane-wrap',] }],
    wrapActive: [{ type: HostBinding, args: ['class.am-tabs-pane-wrap-active',] }],
    wrapInactive: [{ type: HostBinding, args: ['class.am-tabs-pane-wrap-inactive',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Tabs {
    constructor() {
        this.prefixCls = 'am-tabs';
        this.selectedKey = 0;
        this.keyToSelect = 0;
        this.paneMoveStyle = '';
        this._startTime = 0;
        this._startPosition = 0;
        this._velocityThreshold = 0.3;
        this._tabDirection = 'horizontal';
        this._tabBarPosition = 'top';
        this.page = 5;
        this.swipeable = true;
        this.useOnPan = true;
        this.animated = true;
        this.distanceToChangeTab = 0.3;
        this.tabBarActiveTextColor = '';
        this.tabBarInactiveTextColor = '';
        this.renderTabBar = null;
        this.tabBarBackgroundColor = '#FFF';
        this.tabBarTextStyle = {};
        /**
         * should be removed when https://github.com/angular/angular/issues/20810 resolved *
         */
        this.tabPanesComponent = null;
        this.onChange = new EventEmitter();
        this.onTabClick = new EventEmitter();
        this.amTabs = true;
        this.amTabsTop = true;
        this.amTabsLeft = false;
        this.amTabsRight = false;
        this.amTabsBottom = false;
        this.amTabsVertical = false;
        this.amTabsHorizontal = true;
    }
    /**
     * @return {?}
     */
    get activeTab() {
        return this.selectedKey;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set activeTab(value) {
        this.keyToSelect = value;
    }
    /**
     * @return {?}
     */
    get tabBarPosition() {
        return this._tabBarPosition;
    }
    /**
     * @param {?} position
     * @return {?}
     */
    set tabBarPosition(position) {
        this._tabBarPosition = position;
        switch (position) {
            case 'top':
                this.amTabsTop = true;
                this.amTabsLeft = false;
                this.amTabsRight = false;
                this.amTabsBottom = false;
                break;
            case 'left':
                this.amTabsTop = false;
                this.amTabsLeft = true;
                this.amTabsRight = false;
                this.amTabsBottom = false;
                break;
            case 'bottom':
                this.amTabsTop = false;
                this.amTabsLeft = false;
                this.amTabsRight = false;
                this.amTabsBottom = true;
                break;
            case 'right':
                this.amTabsTop = false;
                this.amTabsLeft = false;
                this.amTabsRight = true;
                this.amTabsBottom = false;
                break;
            default:
                break;
        }
    }
    /**
     * @return {?}
     */
    get tabDirection() {
        return this._tabDirection;
    }
    /**
     * @param {?} direction
     * @return {?}
     */
    set tabDirection(direction) {
        this._tabDirection = direction;
        switch (direction) {
            case 'horizontal':
                this.amTabsHorizontal = true;
                this.amTabsVertical = false;
                break;
            case 'vertical':
                this.amTabsHorizontal = false;
                this.amTabsVertical = true;
                break;
            default:
                break;
        }
    }
    /**
     * @param {?} index
     * @return {?}
     */
    clickTab(index) {
        if (this.selectedKey !== index) {
            this.keyToSelect = index;
            this.onTabClick.emit({ index: this.keyToSelect });
        }
    }
    /**
     * @return {?}
     */
    getCurrentTabPanes() {
        return this.tabPanesComponent || this.tabPanes;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onTouchStart(event) {
        this._startTime = event.timeStamp;
        if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) {
            if ('horizontal' === this._tabDirection) {
                this._startPosition =
                    event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientX;
            }
            else if ('vertical' === this._tabDirection) {
                this._startPosition =
                    event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientY;
            }
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onTouchMove(event) {
        if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) {
            if ('horizontal' === this._tabDirection) {
                /** @type {?} */
                const distance = event.changedTouches[0].clientX - this._startPosition;
                if (distance < 0 && this.activeTab === this.getCurrentTabPanes().length - 1) {
                    return;
                }
                else if (distance > 0 && this.activeTab === 0) {
                    return;
                }
                // velocity 小于阈值才认为是pan操作
                if (this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold &&
                    this.useOnPan &&
                    this.swipeable &&
                    this.animated) {
                    this.paneMoveStyle = 'translate3d(' + distance + 'px, 0, 0 )';
                }
            }
            else if ('vertical' === this._tabDirection) {
                /** @type {?} */
                const distance = event.changedTouches[0].clientY - this._startPosition;
                if (distance < 0 && this.activeTab === this.getCurrentTabPanes().length - 1) {
                    return;
                }
                else if (distance > 0 && this.activeTab === 0) {
                    return;
                }
                if (this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold &&
                    this.useOnPan &&
                    this.swipeable &&
                    this.animated) {
                    this.paneMoveStyle = 'translate3d(0, ' + distance + 'px, 0 )';
                }
            }
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onTouchEnd(event) {
        if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) {
            if ('horizontal' === this._tabDirection) {
                /** @type {?} */
                const distance = event.changedTouches[0].clientX - this._startPosition;
                /** @type {?} */
                const distanceToChangeTabPx = this.tabContent.nativeElement.offsetWidth * this.distanceToChangeTab;
                if ((this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold &&
                    (this.useOnPan && this.swipeable && Math.abs(distance) > distanceToChangeTabPx)) ||
                    (this.getVelocity(distance, event.timeStamp - this._startTime) > this._velocityThreshold &&
                        (this.swipeable && Math.abs(distance) > distanceToChangeTabPx / 2))) {
                    if (distance < 0 && this.activeTab < this.getCurrentTabPanes().length - 1) {
                        this.keyToSelect++;
                    }
                    else if (distance > 0 && this.activeTab > 0) {
                        this.keyToSelect--;
                    }
                }
                this.paneMoveStyle = 'translate3d(0, 0, 0 )';
            }
            else if ('vertical' === this._tabDirection) {
                /** @type {?} */
                const distance = event.changedTouches[0].clientY - this._startPosition;
                /** @type {?} */
                const distanceToChangeTabPx = this.tabContent.nativeElement.offsetHeight * this.distanceToChangeTab;
                if ((this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold &&
                    (this.useOnPan && this.swipeable && Math.abs(distance) > distanceToChangeTabPx)) ||
                    (this.getVelocity(distance, event.timeStamp - this._startTime) > this._velocityThreshold &&
                        (this.swipeable && Math.abs(distance) > distanceToChangeTabPx / 2))) {
                    if (distance < 0 && this.activeTab < this.getCurrentTabPanes().length - 1) {
                        this.keyToSelect++;
                    }
                    else if (distance > 0 && this.activeTab > 0) {
                        this.keyToSelect--;
                    }
                }
                this.paneMoveStyle = 'translate3d(0, 0, 0 )';
            }
        }
    }
    /**
     * @return {?}
     */
    ngAfterContentInit() {
        this.selectTabPane(this.keyToSelect);
        this.selectedKey = this.keyToSelect;
    }
    /**
     * @return {?}
     */
    ngDoCheck() {
        if (this.keyToSelect !== this.selectedKey && this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) {
            this.selectTabPane(this.keyToSelect);
            this.selectedKey = this.keyToSelect;
            this.onChange.emit({ index: this.selectedKey });
        }
    }
    /**
     * @param {?} index
     * @return {?}
     */
    selectTabPane(index) {
        /** @type {?} */
        const keyToSelect = Math.min(this.getCurrentTabPanes().length - 1, Math.max(index || 0, 0));
        this.getCurrentTabPanes().forEach((tabPane, indexKey) => {
            if (keyToSelect < indexKey) {
                if (this.animated) {
                    if ('horizontal' === this._tabDirection) {
                        if (keyToSelect === indexKey - 1) {
                            tabPane.position = 'right-with-animation-with-higher-zindex';
                        }
                        else {
                            tabPane.position = 'right-with-animation';
                        }
                    }
                    else if ('vertical' === this._tabDirection) {
                        if (keyToSelect === indexKey - 1) {
                            tabPane.position = 'bottom-with-animation-with-higher-zindex';
                        }
                        else {
                            tabPane.position = 'bottom-with-animation';
                        }
                    }
                }
                else {
                    if ('horizontal' === this._tabDirection) {
                        tabPane.position = 'right-without-animation';
                    }
                    else if ('vertical' === this._tabDirection) {
                        tabPane.position = 'bottom-without-animation';
                    }
                }
            }
            else if (keyToSelect > indexKey) {
                if (this.animated) {
                    if ('horizontal' === this._tabDirection) {
                        if (keyToSelect === indexKey + 1) {
                            tabPane.position = 'left-with-animation-with-higher-zindex';
                        }
                        else {
                            tabPane.position = 'left-with-animation';
                        }
                    }
                    else if ('vertical' === this._tabDirection) {
                        if (keyToSelect === indexKey + 1) {
                            tabPane.position = 'top-with-animation-with-higher-zindex';
                        }
                        else {
                            tabPane.position = 'top-with-animation';
                        }
                    }
                }
                else {
                    if ('horizontal' === this._tabDirection) {
                        tabPane.position = 'left-without-animation';
                    }
                    else if ('vertical' === this._tabDirection) {
                        tabPane.position = 'top-without-animation';
                    }
                }
            }
            else {
                if (this.animated) {
                    tabPane.position = 'center-with-animation';
                }
                else {
                    tabPane.position = 'center-without-animation';
                }
            }
            if (keyToSelect !== indexKey) {
                tabPane.active = false;
            }
            else {
                tabPane.active = true;
            }
        });
    }
    /**
     * @param {?} deltaDistance
     * @param {?} deltaTime
     * @return {?}
     */
    getVelocity(deltaDistance, deltaTime) {
        return Math.abs(deltaDistance / deltaTime);
    }
}
Tabs.decorators = [
    { type: Component, args: [{
                selector: 'Tabs, nzm-tabs',
                template: "<ng-container>\n  <ng-template *ngIf=\"'top' === tabBarPosition || 'left' === tabBarPosition\"\n               [ngTemplateOutlet]=\"renderTabBar || renderDefaultTabBar\">\n  </ng-template>\n  <div #TabContent\n       class=\"{{prefixCls}}-content-wrap\"\n       [ngClass]=\"{'am-tabs-content-wrap-animated': animated}\"\n       [ngStyle]=\"{'transform': paneMoveStyle, 'webkitTransform': paneMoveStyle}\"\n       (touchstart)=\"onTouchStart($event)\"\n       (touchmove)=\"onTouchMove($event)\"\n       (touchend)=\"onTouchEnd($event)\"\n  >\n    <ng-content></ng-content>\n  </div>\n  <ng-template *ngIf=\"'bottom' === tabBarPosition || 'right' === tabBarPosition\"\n               [ngTemplateOutlet]=\"renderTabBar || renderDefaultTabBar\"\n  ></ng-template>\n</ng-container>\n\n<ng-template #renderDefaultTabBar>\n  <DefaultTabBar #DefaultTabBar\n                 [page]=\"page\"\n                 [animated]=\"animated\"\n                 [activeTab]=\"selectedKey\"\n                 [tabBarPosition]=\"tabBarPosition\"\n                 [tabBarBackgroundColor]=\"tabBarBackgroundColor\"\n                 [tabBarUnderlineStyle]=\"tabBarUnderlineStyle\"\n  >\n    <div #TabTitle\n         *ngFor=\"let tabPane of getCurrentTabPanes(); let i = index\"\n         class=\"{{prefixCls}}-default-bar-tab\"\n         [ngClass]=\"{'am-tabs-default-bar-tab-active': tabPane.active, 'am-tabs-default-bar-tab-disabled': tabPane.disabled}\"\n         [ngStyle]=\"tabBarTextStyle\"\n         [style.color]=\"tabPane.active ? tabBarActiveTextColor : tabBarInactiveTextColor\"\n         (click)=\"clickTab(i)\"\n    >\n      <ng-container *ngIf=\"tabPane.isTitleString; else titleTemplate\">\n        {{tabPane.title}}\n      </ng-container>\n      <ng-template #titleTemplate>\n        <ng-template [ngTemplateOutlet]=\"tabPane.title\"></ng-template>\n      </ng-template>\n    </div>\n  </DefaultTabBar>\n</ng-template>",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
Tabs.ctorParameters = () => [];
Tabs.propDecorators = {
    tabPanes: [{ type: ContentChildren, args: [TabPane, { descendants: true },] }],
    tabContent: [{ type: ViewChild, args: ['TabContent',] }],
    tabsBarSwipe: [{ type: ViewChild, args: ['TabsBarSwipe',] }],
    defaultTabBar: [{ type: ViewChild, args: ['DefaultTabBar',] }],
    tabsBarContainer: [{ type: ViewChild, args: ['TabsBarContainer',] }],
    page: [{ type: Input }],
    swipeable: [{ type: Input }],
    useOnPan: [{ type: Input }],
    animated: [{ type: Input }],
    tabBarUnderlineStyle: [{ type: Input }],
    distanceToChangeTab: [{ type: Input }],
    tabBarActiveTextColor: [{ type: Input }],
    tabBarInactiveTextColor: [{ type: Input }],
    renderTabBar: [{ type: Input }],
    tabBarBackgroundColor: [{ type: Input }],
    tabBarTextStyle: [{ type: Input }],
    tabPanesComponent: [{ type: Input }],
    activeTab: [{ type: Input }],
    tabBarPosition: [{ type: Input }],
    tabDirection: [{ type: Input }],
    onChange: [{ type: Output }],
    onTabClick: [{ type: Output }],
    amTabs: [{ type: HostBinding, args: ['class.am-tabs',] }],
    amTabsTop: [{ type: HostBinding, args: ['class.am-tabs-top',] }],
    amTabsLeft: [{ type: HostBinding, args: ['class.am-tabs-left',] }],
    amTabsRight: [{ type: HostBinding, args: ['class.am-tabs-right',] }],
    amTabsBottom: [{ type: HostBinding, args: ['class.am-tabs-bottom',] }],
    amTabsVertical: [{ type: HostBinding, args: ['class.am-tabs-vertical',] }],
    amTabsHorizontal: [{ type: HostBinding, args: ['class.am-tabs-horizontal',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class DefaultTabBarComponent {
    /**
     * @param {?} _renderer
     */
    constructor(_renderer) {
        this._renderer = _renderer;
        this.prefixCls = 'am-tabs-default-bar';
        this.inkBarStyle = {};
        this.tabsBarStyle = {};
        this.showPrev = false;
        this.showNext = false;
        this.selectedKey = 0;
        this.inkBarOffSet = 0;
        this.inkBarLength = 0;
        this.tabBarNavSwipedPosition = 0;
        this.tabBarNavSwipingPosition = 0;
        this._startPosition = 0;
        this.page = 5;
        this.animated = true;
        this.tabBarBackgroundColor = '#FFF';
        this.tabBarPosition = 'top';
        this.tabBarWrap = true;
        this.getTabSize = (page, tabLength) => 100 / Math.min(page, tabLength);
    }
    /**
     * @return {?}
     */
    get activeTab() {
        return this.selectedKey;
    }
    /**
     * @param {?} index
     * @return {?}
     */
    set activeTab(index) {
        if (index !== this.selectedKey) {
            this.selectedKey = index;
            if (this.tabTitles && this.tabTitles.length > 0) {
                this.setTabBarStyleCenter();
                this.setInkBarStatus(this.selectedKey);
            }
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onTouchStart(event) {
        if ('top' === this.tabBarPosition || 'bottom' === this.tabBarPosition) {
            this._startPosition = event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientX;
        }
        else {
            this._startPosition = event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientY;
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onTouchMove(event) {
        event.preventDefault();
        event.stopPropagation();
        if ('top' === this.tabBarPosition || 'bottom' === this.tabBarPosition) {
            this.setTabBarNavSwipingPosition(event.changedTouches[0].clientX - this._startPosition, this.tabTitles.first.nativeElement.offsetWidth, this.tabsBarSwipe.nativeElement.offsetWidth);
            this.tabsBarStyle = {
                transition: '0ms',
                transform: 'translate3d(' + this.tabBarNavSwipingPosition + 'px, 0px, 0px)',
                webkitTransform: 'translate3d(' + this.tabBarNavSwipingPosition + 'px, 0px, 0px)'
            };
        }
        else {
            this.setTabBarNavSwipingPosition(event.changedTouches[0].clientY - this._startPosition, this.tabTitles.first.nativeElement.offsetHeight, this.tabsBarSwipe.nativeElement.offsetHeight);
            this.tabsBarStyle = {
                transition: '0ms',
                transform: 'translate3d(0, ' + this.tabBarNavSwipingPosition + 'px, 0px)',
                webkitTransform: 'translate3d(0, ' + this.tabBarNavSwipingPosition + 'px, 0px)'
            };
        }
    }
    /**
     * @return {?}
     */
    onTouchEnd() {
        this.tabBarNavSwipedPosition = this.tabBarNavSwipingPosition;
    }
    /**
     * @return {?}
     */
    onContentChange() {
        this.setTabsStyle();
        this.setInkBarStatus(this.activeTab);
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        this.setTabsStyle();
        if (this.selectedKey > 0) {
            this.setTabBarStyleCenter();
        }
        this.setInkBarStatus(this.selectedKey);
    }
    /**
     * @return {?}
     */
    setTabsStyle() {
        if (this.tabTitles && this.tabTitles.length > 0) {
            if ('top' === this.tabBarPosition || 'bottom' === this.tabBarPosition) {
                this.tabTitles.forEach((tabTitle) => {
                    this._renderer.setStyle(tabTitle.nativeElement, 'width', this.getTabSize(this.page, this.tabTitles.length) + '%');
                });
            }
            else {
                this.tabTitles.forEach((tabTitle) => {
                    this._renderer.setStyle(tabTitle.nativeElement, 'height', this.getTabSize(this.page, this.tabTitles.length) + '%');
                });
            }
        }
    }
    /**
     * @return {?}
     */
    setTabBarStyleCenter() {
        if ('top' === this.tabBarPosition || 'bottom' === this.tabBarPosition) {
            this.setTabBarNavSwipedPosition(this.tabTitles.first.nativeElement.offsetWidth, this.tabsBarSwipe.nativeElement.offsetWidth);
            this.tabsBarStyle = {
                transform: 'translate3d(' + this.tabBarNavSwipedPosition + 'px, 0px, 0px)',
                webkitTransform: 'translate3d(' + this.tabBarNavSwipedPosition + ', 0px, 0px)'
            };
        }
        else {
            this.setTabBarNavSwipedPosition(this.tabTitles.first.nativeElement.offsetHeight, this.tabsBarSwipe.nativeElement.offsetHeight);
            this.tabsBarStyle = {
                transform: 'translate3d(0, ' + this.tabBarNavSwipedPosition + 'px, 0px)',
                webkitTransform: 'translate3d(0, ' + this.tabBarNavSwipedPosition + 'px, 0px)'
            };
        }
    }
    /**
     * @param {?} key
     * @return {?}
     */
    setInkBarStatus(key) {
        if (this.tabTitles && this.tabTitles.length > 0) {
            if ('top' === this.tabBarPosition || 'bottom' === this.tabBarPosition) {
                this.inkBarOffSet = this.tabTitles.toArray()[key].nativeElement.offsetLeft;
                this.inkBarLength = this.tabTitles.toArray()[key].nativeElement.style.width;
                this.inkBarStyle = {
                    width: this.inkBarLength,
                    left: (this.selectedKey * 100) / this.page + '%'
                };
                Object.assign(this.inkBarStyle, this.tabBarUnderlineStyle);
            }
            else {
                this.inkBarOffSet = this.tabTitles.toArray()[key].nativeElement.offsetTop;
                this.inkBarLength = this.tabTitles.toArray()[key].nativeElement.style.height;
                this.inkBarStyle = {
                    height: this.inkBarLength,
                    top: (this.selectedKey * 100) / this.page + '%'
                };
                Object.assign(this.inkBarStyle, this.tabBarUnderlineStyle);
            }
        }
    }
    /**
     * @param {?} swipingDistance
     * @param {?} swipingItemLength
     * @param {?} viewportLength
     * @return {?}
     */
    setTabBarNavSwipingPosition(swipingDistance, swipingItemLength, viewportLength) {
        if (this.tabBarNavSwipedPosition + swipingDistance > 0) {
            this.tabBarNavSwipingPosition = 0;
        }
        else if (this.tabBarNavSwipedPosition + swipingDistance <
            viewportLength - swipingItemLength * this.tabTitles.length) {
            this.tabBarNavSwipingPosition = viewportLength - swipingItemLength * this.tabTitles.length;
            this.showNext = false;
        }
        else {
            this.tabBarNavSwipingPosition = this.tabBarNavSwipedPosition + swipingDistance;
            this.showNext = true;
        }
        if (this.tabBarNavSwipingPosition < 0) {
            this.showPrev = true;
        }
        else {
            this.showPrev = false;
        }
    }
    /**
     * @param {?} swipingItemLength
     * @param {?} viewportLength
     * @return {?}
     */
    setTabBarNavSwipedPosition(swipingItemLength, viewportLength) {
        if (this.selectedKey >= Math.floor(this.page / 2) &&
            this.selectedKey <= this.tabTitles.length - 1 - Math.floor(this.page / 2)) {
            this.tabBarNavSwipedPosition = viewportLength / 2 - swipingItemLength * (this.selectedKey + 1 / 2);
        }
        else if (this.selectedKey < Math.floor(this.page / 2)) {
            this.tabBarNavSwipedPosition = 0;
        }
        else {
            this.tabBarNavSwipedPosition = viewportLength - swipingItemLength * this.tabTitles.length;
        }
        if (this.tabBarNavSwipedPosition < 0) {
            this.showPrev = true;
        }
        else {
            this.showPrev = false;
        }
        if (this.tabBarNavSwipedPosition + swipingItemLength * this.tabTitles.length - viewportLength > 0) {
            this.showNext = true;
        }
        else {
            this.showNext = false;
        }
    }
}
DefaultTabBarComponent.decorators = [
    { type: Component, args: [{
                selector: 'DefaultTabBar, nzm-default-tab-bar',
                template: "<div class=\"{{prefixCls}} {{prefixCls}}-{{tabBarPosition}}\"\n     [ngClass]=\"{'am-tabs-default-bar-animated' : animated}\"\n     [ngStyle]=\"{backgroundColor: tabBarBackgroundColor || '#FFF'}\"\n>\n  <div *ngIf=\"showPrev\" class=\"{{prefixCls}}-prevpage\"></div>\n  <div #TabsBarSwipe\n       class=\"{{prefixCls}}-content\"\n       [ngStyle]=\"tabsBarStyle\"\n       (touchstart)=\"onTouchStart($event)\"\n       (touchmove)=\"onTouchMove($event)\"\n       (touchend)=\"onTouchEnd()\"\n       (cdkObserveContent)=\"onContentChange()\"\n  >\n    <ng-content></ng-content>\n    <div class=\"{{prefixCls}}-underline\" [ngStyle]=\"inkBarStyle\">\n    </div>\n  </div>\n  <div *ngIf=\"showNext\" class=\"{{prefixCls}}-nextpage\"></div>\n</div>"
            }] }
];
/** @nocollapse */
DefaultTabBarComponent.ctorParameters = () => [
    { type: Renderer2 }
];
DefaultTabBarComponent.propDecorators = {
    tabTitles: [{ type: ContentChildren, args: ['TabTitle',] }],
    tabsBarSwipe: [{ type: ViewChild, args: ['TabsBarSwipe',] }],
    page: [{ type: Input }],
    animated: [{ type: Input }],
    tabBarUnderlineStyle: [{ type: Input }],
    tabBarBackgroundColor: [{ type: Input }],
    tabBarPosition: [{ type: Input }],
    activeTab: [{ type: Input }],
    tabBarWrap: [{ type: HostBinding, args: ['class.am-tabs-tab-bar-wrap',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class TabsModule {
}
TabsModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, ObserversModule],
                declarations: [TabPane, Tabs, DefaultTabBarComponent],
                exports: [TabPane, Tabs, DefaultTabBarComponent],
                providers: []
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class TabBarTab {
    /**
     * @param {?} tabPane
     */
    constructor(tabPane) {
        this.tabPane = tabPane;
        this.prefixCls = 'am-tab-bar-tab';
        this.selected = false;
        this.tintColor = '#108ee9';
        this.unselectedTintColor = '#888';
        this.key = '';
        this.title = '';
        this.dot = false;
        this.badge = null;
        this.icon = null;
        this.selectedIcon = null;
        this.onPress = new EventEmitter();
        this.tabBarTab = true;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    isTemplateRef(value) {
        return value instanceof TemplateRef;
    }
    /**
     * @return {?}
     */
    ngAfterContentInit() {
        if (this.tabPane.active) {
            this.selected = true;
        }
        else {
            this.selected = false;
        }
        this.tintColor = this.tabPane.tintColor;
        this.unselectedTintColor = this.tabPane.unselectedTintColor;
    }
}
TabBarTab.decorators = [
    { type: Component, args: [{
                selector: 'TabBarTab, nzm-tab-bar-tab',
                template: "<div class=\"{{prefixCls}}-icon\" [style.color]=\"selected ? tintColor : unselectedTintColor\">\n  <Badge *ngIf=\"badge\" className=\"{{prefixCls}}-badge tab-badge\" [text]=\"badge\">\n    <ng-container *ngIf=\"isTemplateRef(selected ? selectedIcon : icon); then domTemplate; else imgTemplate\">\n    </ng-container>\n  </Badge>\n  <Badge className=\"{{prefixCls}}-badge tab-badge\" [dot]=\"dot\" *ngIf=\"dot\">\n    <ng-container *ngIf=\"isTemplateRef(selected ? selectedIcon : icon); then domTemplate; else imgTemplate\">\n    </ng-container>\n  </Badge>\n  <ng-container *ngIf=\"!badge && !dot\" >\n    <ng-container *ngIf=\"isTemplateRef(selected ? selectedIcon : icon); then domTemplate; else imgTemplate\">\n    </ng-container>\n  </ng-container>\n</div>\n<p class=\"{{prefixCls}}-title\" [style.color]=\"selected ? tintColor : unselectedTintColor\">\n  {{title}}\n</p>\n\n<ng-template #domTemplate>\n  <ng-template [ngTemplateOutlet]=\"(selected ? selectedIcon : icon)\"></ng-template>\n</ng-template>\n<ng-template #imgTemplate >\n  <img src=\"{{selected ? selectedIcon : icon}}\" alt=\"{{title}}\">\n</ng-template>"
            }] }
];
/** @nocollapse */
TabBarTab.ctorParameters = () => [
    { type: TabPane, decorators: [{ type: Optional }] }
];
TabBarTab.propDecorators = {
    key: [{ type: Input }],
    title: [{ type: Input }],
    dot: [{ type: Input }],
    badge: [{ type: Input }],
    icon: [{ type: Input }],
    selectedIcon: [{ type: Input }],
    onPress: [{ type: Output }],
    tabBarTab: [{ type: HostBinding, args: ['class.am-tab-bar-tab',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class TabBar {
    constructor() {
        this.prefixCls = 'am-tab-bar';
        this._tintColor = '#108ee9';
        this._unselectedTintColor = '#888';
        this.hidden = false;
        this.activeTab = 0;
        this.barTintColor = 'white';
        this.tabBarPosition = 'bottom';
        this.tabBar = true;
    }
    /**
     * @return {?}
     */
    get tintColor() {
        return this._tintColor;
    }
    /**
     * @param {?} color
     * @return {?}
     */
    set tintColor(color) {
        this._tintColor = color;
        if (this.tabBarTabs && this.tabBarTabs.length > 0) {
            this.tabBarTabs.forEach((tabBarTab) => {
                tabBarTab.tintColor = this._tintColor;
            });
        }
    }
    /**
     * @return {?}
     */
    get unselectedTintColor() {
        return this._unselectedTintColor;
    }
    /**
     * @param {?} color
     * @return {?}
     */
    set unselectedTintColor(color) {
        this._unselectedTintColor = color;
        if (this.tabBarTabs && this.tabBarTabs.length > 0) {
            this.tabBarTabs.forEach((tabBarTab) => {
                tabBarTab.unselectedTintColor = this._unselectedTintColor;
            });
        }
    }
    /**
     * @param {?} index
     * @return {?}
     */
    selectTabPane(index) {
        this.tabPanes.forEach((tabPane, indexKey) => {
            if (index < indexKey) {
                tabPane.position = 'right-without-animation';
            }
            else if (index > indexKey) {
                tabPane.position = 'left-without-animation';
            }
            else {
                tabPane.position = 'center-without-animation';
            }
            if (index !== indexKey) {
                tabPane.active = false;
            }
            else {
                tabPane.active = true;
            }
        });
        if (this.tabBarTabs && this.tabBarTabs.length > 0) {
            this.tabBarTabs.forEach((tabBarTab) => {
                tabBarTab.selected = false;
            });
            this.tabBarTabs.toArray()[index].selected = true;
            this.tabBarTabs.toArray()[index].onPress.emit({
                title: this.tabBarTabs.toArray()[index].title,
                key: this.tabBarTabs.toArray()[index].key
            });
        }
    }
    /**
     * @return {?}
     */
    ngAfterContentInit() {
        this.selectTabPane(this.activeTab);
        this.tabPanes.forEach((tabPane) => {
            tabPane.tintColor = this.tintColor;
            tabPane.unselectedTintColor = this.unselectedTintColor;
        });
    }
}
TabBar.decorators = [
    { type: Component, args: [{
                selector: 'TabBar, nzm-tab-bar',
                template: "<Tabs [activeTab]=\"activeTab\"\n      [swipeable]=\"false\"\n      [useOnPan]=\"false\"\n      [animated]=\"false\"\n      [tabDirection]=\"'horizontal'\"\n      [tabBarPosition]='tabBarPosition'\n      [renderTabBar]=\"TabBarBar\"\n      [tabPanesComponent]=\"tabPanes\"\n>\n  <ng-content></ng-content>\n</Tabs>\n\n<ng-template #TabBarBar>\n  <div class=\"am-tabs-tab-bar-wrap\">\n    <div class=\"{{prefixCls}}-bar\"\n         [ngClass]=\"{'am-tab-bar-bar-hidden-top': 'top' === tabBarPosition && hidden, 'am-tab-bar-bar-hidden-bottom': 'bottom' === tabBarPosition && hidden}\"\n         [style.background-color]=\"barTintColor\">\n      <div *ngFor=\"let tabPane of tabPanes; let i = index;\" (click)=\"selectTabPane(i)\">\n        <ng-container [ngTemplateOutlet]=\"tabPane.title\"></ng-container>\n      </div>\n    </div>\n  </div>\n</ng-template>"
            }] }
];
/** @nocollapse */
TabBar.ctorParameters = () => [];
TabBar.propDecorators = {
    tabPanes: [{ type: ContentChildren, args: [TabPane, { descendants: true },] }],
    tabBarTabs: [{ type: ContentChildren, args: [TabBarTab, { descendants: true },] }],
    hidden: [{ type: Input }],
    activeTab: [{ type: Input }],
    barTintColor: [{ type: Input }],
    tabBarPosition: [{ type: Input }],
    tintColor: [{ type: Input }],
    unselectedTintColor: [{ type: Input }],
    tabBar: [{ type: HostBinding, args: ['class.am-tab-bar',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class TabBarModule {
}
TabBarModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, TabsModule, BadgeModule],
                exports: [TabBar, TabBarTab],
                declarations: [TabBar, TabBarTab],
                providers: []
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PickerOptions {
    constructor() {
        this.data = [];
        this.value = [];
        this.cols = 3;
        this.mask = true;
        this.title = '';
        this.okText = '确定';
        this.dismissText = '取消';
        this.disabled = false;
        this.cascade = true;
        this.appendToBody = false;
        this.onOk = new EventEmitter();
        this.onDismiss = new EventEmitter();
        this.onPickerChange = new EventEmitter();
        this.indicatorStyle = {};
    }
}

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/**
 * @return {?}
 */
function getData() {
    return [
        {
            label: '北京',
            children: [
                {
                    label: '北京市',
                    children: [
                        '东城区',
                        '西城区',
                        '崇文区',
                        '宣武区',
                        '朝阳区',
                        '丰台区',
                        '石景山区',
                        '海淀区',
                        '门头沟区',
                        '房山区',
                        '通州区',
                        '顺义区',
                        '昌平区',
                        '大兴区',
                        '平谷区',
                        '怀柔区',
                        '密云县',
                        '延庆县'
                    ]
                }
            ]
        },
        {
            label: '天津市',
            children: [
                {
                    label: '天津市',
                    children: [
                        '和平区',
                        '河东区',
                        '河西区',
                        '南开区',
                        '河北区',
                        '红桥区',
                        '塘沽区',
                        '汉沽区',
                        '大港区',
                        '东丽区',
                        '西青区',
                        '津南区',
                        '北辰区',
                        '武清区',
                        '宝坻区',
                        '宁河县',
                        '静海县',
                        '蓟  县'
                    ]
                }
            ]
        },
        {
            label: '河北省',
            children: [
                {
                    label: '石家庄市',
                    children: [
                        '长安区',
                        '桥东区',
                        '桥西区',
                        '新华区',
                        '郊  区',
                        '井陉矿区',
                        '井陉县',
                        '正定县',
                        '栾城县',
                        '行唐县',
                        '灵寿县',
                        '高邑县',
                        '深泽县',
                        '赞皇县',
                        '无极县',
                        '平山县',
                        '元氏县',
                        '赵  县',
                        '辛集市',
                        '藁',
                        '晋州市',
                        '新乐市',
                        '鹿泉市'
                    ]
                },
                {
                    label: '唐山市',
                    children: [
                        '路南区',
                        '路北区',
                        '古冶区',
                        '开平区',
                        '新  区',
                        '丰润县',
                        '滦  县',
                        '滦南县',
                        '乐亭县',
                        '迁西县',
                        '玉田县',
                        '唐海县',
                        '遵化市',
                        '丰南市',
                        '迁安市'
                    ]
                },
                {
                    label: '秦皇岛市',
                    children: ['海港区', '山海关区', '北戴河区', '青龙满族自治县', '昌黎县', '抚宁县', '卢龙县']
                },
                {
                    label: '邯郸市',
                    children: [
                        '邯山区',
                        '丛台区',
                        '复兴区',
                        '峰峰矿区',
                        '邯郸县',
                        '临漳县',
                        '成安县',
                        '大名县',
                        '涉  县',
                        '磁  县',
                        '肥乡县',
                        '永年县',
                        '邱  县',
                        '鸡泽县',
                        '广平县',
                        '馆陶县',
                        '魏  县',
                        '曲周县',
                        '武安市'
                    ]
                },
                {
                    label: '邢台市',
                    children: [
                        '桥东区',
                        '桥西区',
                        '邢台县',
                        '临城县',
                        '内丘县',
                        '柏乡县',
                        '隆尧县',
                        '任  县',
                        '南和县',
                        '宁晋县',
                        '巨鹿县',
                        '新河县',
                        '广宗县',
                        '平乡县',
                        '威  县',
                        '清河县',
                        '临西县',
                        '南宫市',
                        '沙河市'
                    ]
                },
                {
                    label: '保定市',
                    children: [
                        '新市区',
                        '北市区',
                        '南市区',
                        '满城县',
                        '清苑县',
                        '涞水县',
                        '阜平县',
                        '徐水县',
                        '定兴县',
                        '唐  县',
                        '高阳县',
                        '容城县',
                        '涞源县',
                        '望都县',
                        '安新县',
                        '易  县',
                        '曲阳县',
                        '蠡  县',
                        '顺平县',
                        '博野',
                        '雄县',
                        '涿州市',
                        '定州市',
                        '安国市',
                        '高碑店市'
                    ]
                },
                {
                    label: '张家口',
                    children: [
                        '桥东区',
                        '桥西区',
                        '宣化区',
                        '下花园区',
                        '宣化县',
                        '张北县',
                        '康保县',
                        '沽源县',
                        '尚义县',
                        '蔚  县',
                        '阳原县',
                        '怀安县',
                        '万全县',
                        '怀来县',
                        '涿鹿县',
                        '赤城县',
                        '崇礼县'
                    ]
                },
                {
                    label: '承德市',
                    children: [
                        '双桥区',
                        '双滦区',
                        '鹰手营子矿区',
                        '承德县',
                        '兴隆县',
                        '平泉县',
                        '滦平县',
                        '隆化县',
                        '丰宁满族自治县',
                        '宽城满族自治县',
                        '围场满族蒙古族自治县'
                    ]
                },
                {
                    label: '沧州市',
                    children: [
                        '新华区',
                        '运河区',
                        '沧  县',
                        '青  县',
                        '东光县',
                        '海兴县',
                        '盐山县',
                        '肃宁县',
                        '南皮县',
                        '吴桥县',
                        '献  县',
                        '孟村回族自治县',
                        '泊头市',
                        '任丘市',
                        '黄骅市',
                        '河间市'
                    ]
                },
                {
                    label: '廊坊市',
                    children: ['安次区', '固安县', '永清县', '香河县', '大城县', '文安县', '大厂回族自治县', '霸州市', '三河市']
                },
                {
                    label: '衡水市',
                    children: [
                        '桃城区',
                        '枣强县',
                        '武邑县',
                        '武强县',
                        '饶阳县',
                        '安平县',
                        '故城县',
                        '景  县',
                        '阜城县',
                        '冀州市',
                        '深州市'
                    ]
                }
            ]
        },
        {
            label: '山西省',
            children: [
                {
                    label: '太原市',
                    children: [
                        '小店区',
                        '迎泽区',
                        '杏花岭区',
                        '尖草坪区',
                        '万柏林区',
                        '晋源区',
                        '清徐县',
                        '阳曲县',
                        '娄烦县',
                        '古交市'
                    ]
                },
                {
                    label: '大同市',
                    children: [
                        '城  区',
                        '矿  区',
                        '南郊区',
                        '新荣区',
                        '阳高县',
                        '天镇县',
                        '广灵县',
                        '灵丘县',
                        '浑源县',
                        '左云县',
                        '大同县'
                    ]
                },
                {
                    label: '阳泉市',
                    children: ['城  区', '矿  区', '郊  区', '平定县', '盂  县']
                },
                {
                    label: '长治市',
                    children: [
                        '城  区',
                        '郊  区',
                        '长治县',
                        '襄垣县',
                        '屯留县',
                        '平顺县',
                        '黎城县',
                        '壶关县',
                        '长子县',
                        '武乡县',
                        '沁  县',
                        '沁源县',
                        '潞城市'
                    ]
                },
                {
                    label: '晋城市',
                    children: ['城  区', '沁水县', '阳城县', '陵川县', '泽州县', '高平市']
                },
                {
                    label: '朔州市',
                    children: ['朔城区', '平鲁区', '山阴县', '应  县', '右玉县', '怀仁县']
                },
                {
                    label: '忻州市',
                    children: [
                        '忻府区',
                        '原平市',
                        '定襄县',
                        '五台县',
                        '代  县',
                        '繁峙县',
                        '宁武县',
                        '静乐县',
                        '神池县',
                        '五寨县',
                        '岢岚县',
                        '河曲县',
                        '保德县',
                        '偏关县'
                    ]
                },
                {
                    label: '吕梁市',
                    children: [
                        '离石区',
                        '孝义市',
                        '汾阳市',
                        '文水县',
                        '交城县',
                        '兴  县',
                        '临  县',
                        '柳林县',
                        '石楼县',
                        '岚  县',
                        '方山县',
                        '中阳县',
                        '交口县'
                    ]
                },
                {
                    label: '晋中市',
                    children: [
                        '榆次市',
                        '介休市',
                        '榆社县',
                        '左权县',
                        '和顺县',
                        '昔阳县',
                        '寿阳县',
                        '太谷县',
                        '祁  县',
                        '平遥县',
                        '灵石县'
                    ]
                },
                {
                    label: '临汾市',
                    children: [
                        '临汾市',
                        '侯马市',
                        '霍州市',
                        '曲沃县',
                        '翼城县',
                        '襄汾县',
                        '洪洞县',
                        '古  县',
                        '安泽县',
                        '浮山县',
                        '吉  县',
                        '乡宁县',
                        '蒲  县',
                        '大宁县',
                        '永和县',
                        '隰  县',
                        '汾西县'
                    ]
                },
                {
                    label: '运城市',
                    children: [
                        '运城市',
                        '永济市',
                        '河津市',
                        '芮城县',
                        '临猗县',
                        '万荣县',
                        '新绛县',
                        '稷山县',
                        '闻喜县',
                        '夏  县',
                        '绛  县',
                        '平陆县',
                        '垣曲县'
                    ]
                }
            ]
        },
        {
            label: '内蒙古',
            children: [
                {
                    label: '呼和浩特市',
                    children: [
                        '新城区',
                        '回民区',
                        '玉泉区',
                        '郊  区',
                        '土默特左旗',
                        '托克托县',
                        '和林格尔县',
                        '清水河县',
                        '武川县'
                    ]
                },
                {
                    label: '包头市',
                    children: [
                        '东河区',
                        '昆都伦区',
                        '青山区',
                        '石拐矿区',
                        '白云矿区',
                        '郊  区',
                        '土默特右旗',
                        '固阳县',
                        '达尔罕茂明安联合旗'
                    ]
                },
                {
                    label: '乌海市',
                    children: ['海勃湾区', '海南区', '乌达区']
                },
                {
                    label: '赤峰市',
                    children: [
                        '红山区',
                        '元宝山区',
                        '松山区',
                        '阿鲁科尔沁旗',
                        '巴林左旗',
                        '巴林右旗',
                        '林西县',
                        '克什克腾旗',
                        '翁牛特旗',
                        '喀喇沁旗',
                        '宁城县',
                        '敖汉旗'
                    ]
                },
                {
                    label: '呼伦贝尔市',
                    children: [
                        '海拉尔市',
                        '满洲里市',
                        '扎兰屯市',
                        '牙克石市',
                        '根河市',
                        '额尔古纳市',
                        '阿荣旗',
                        '莫力达瓦达斡尔族自治旗',
                        '鄂伦春自治旗',
                        '鄂温克族自治旗',
                        '新巴尔虎右旗',
                        '新巴尔虎左旗',
                        '陈巴尔虎旗'
                    ]
                },
                {
                    label: '兴安盟',
                    children: ['乌兰浩特市', '阿尔山市', '科尔沁右翼前旗', '科尔沁右翼中旗', '扎赉特旗', '突泉县']
                },
                {
                    label: '通辽市',
                    children: [
                        '科尔沁区',
                        '霍林郭勒市',
                        '科尔沁左翼中旗',
                        '科尔沁左翼后旗',
                        '开鲁县',
                        '库伦旗',
                        '奈曼旗',
                        '扎鲁特旗'
                    ]
                },
                {
                    label: '锡林郭勒盟',
                    children: [
                        '二连浩特市',
                        '锡林浩特市',
                        '阿巴嘎旗',
                        '苏尼特左旗',
                        '苏尼特右旗',
                        '东乌珠穆沁旗',
                        '西乌珠穆沁旗',
                        '太仆寺旗',
                        '镶黄旗',
                        '正镶白旗',
                        '正蓝旗',
                        '多伦县'
                    ]
                },
                {
                    label: '乌兰察布盟',
                    children: [
                        '集宁市',
                        '丰镇市',
                        '卓资县',
                        '化德县',
                        '商都县',
                        '兴和县',
                        '凉城县',
                        '察哈尔右翼前旗',
                        '察哈尔右翼中旗',
                        '察哈尔右翼后旗',
                        '四子王旗'
                    ]
                },
                {
                    label: '伊克昭盟',
                    children: ['东胜市', '达拉特旗', '准格尔旗', '鄂托克前旗', '鄂托克旗', '杭锦旗', '乌审旗', '伊金霍洛旗']
                },
                {
                    label: '巴彦淖尔盟',
                    children: ['临河市', '五原县', '磴口县', '乌拉特前旗', '乌拉特中旗', '乌拉特后旗', '杭锦后旗']
                },
                {
                    label: '阿拉善盟',
                    children: ['阿拉善左旗', '阿拉善右旗', '额济纳旗']
                }
            ]
        },
        {
            label: '辽宁省',
            children: [
                {
                    label: '沈阳市',
                    children: [
                        '沈河区',
                        '皇姑区',
                        '和平区',
                        '大东区',
                        '铁西区',
                        '苏家屯区',
                        '东陵区',
                        '于洪区',
                        '新民市',
                        '法库县',
                        '辽中县',
                        '康平县',
                        '新城子区',
                        '其他'
                    ]
                },
                {
                    label: '大连市',
                    children: [
                        '西岗区',
                        '中山区',
                        '沙河口区',
                        '甘井子区',
                        '旅顺口区',
                        '金州区',
                        '瓦房店市',
                        '普兰店市',
                        '庄河市',
                        '长海县',
                        '其他'
                    ]
                },
                {
                    label: '鞍山市',
                    children: ['铁东区', '铁西区', '立山区', '千山区', '海城市', '台安县', '岫岩满族自治县', '其他']
                },
                {
                    label: '抚顺市',
                    children: ['顺城区', '新抚区', '东洲区', '望花区', '抚顺县', '清原满族自治县', '新宾满族自治县', '其他']
                },
                {
                    label: '本溪市',
                    children: ['平山区', '明山区', '溪湖区', '南芬区', '本溪满族自治县', '桓仁满族自治县', '其他']
                },
                {
                    label: '丹东市',
                    children: ['振兴区', '元宝区', '振安区', '东港市', '凤城市', '宽甸满族自治县', '其他']
                },
                {
                    label: '锦州市',
                    children: ['太和区', '古塔区', '凌河区', '凌海市', '黑山县', '义县', '北宁市', '其他']
                },
                {
                    label: '营口市',
                    children: ['站前区', '西市区', '鲅鱼圈区', '老边区', '大石桥市', '盖州市', '其他']
                },
                {
                    label: '阜新市',
                    children: ['海州区', '新邱区', '太平区', '清河门区', '细河区', '彰武县', '阜新蒙古族自治县', '其他']
                },
                {
                    label: '辽阳市',
                    children: ['白塔区', '文圣区', '宏伟区', '太子河区', '弓长岭区', '灯塔市', '辽阳县', '其他']
                },
                {
                    label: '盘锦',
                    children: ['双台子区', '兴隆台区', '盘山县', '大洼县', '其他']
                },
                {
                    label: '铁岭市',
                    children: ['银州区', '清河区', '调兵山市', '开原市', '铁岭县', '昌图县', '西丰县', '其他']
                },
                {
                    label: '朝阳市',
                    children: ['双塔区', '龙城区', '凌源市', '北票市', '朝阳县', '建平县', '喀喇沁左翼蒙古族自治县', '其他']
                },
                {
                    label: '葫芦岛市',
                    children: ['龙港区', '南票区', '连山区', '兴城市', '绥中县', '建昌县', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '吉林省',
            children: [
                {
                    label: '长春市',
                    children: [
                        '朝阳区',
                        '宽城区',
                        '二道区',
                        '南关区',
                        '绿园区',
                        '双阳区',
                        '九台市',
                        '榆树市',
                        '德惠市',
                        '农安县',
                        '其他'
                    ]
                },
                {
                    label: '吉林市',
                    children: ['船营区', '昌邑区', '龙潭区', '丰满区', '舒兰市', '桦甸市', '蛟河市', '磐石市', '永吉县', '其他']
                },
                {
                    label: '四平',
                    children: ['铁西区', '铁东区', '公主岭市', '双辽市', '梨树县', '伊通满族自治县', '其他']
                },
                {
                    label: '辽源市',
                    children: ['龙山区', '西安区', '东辽县', '东丰县', '其他']
                },
                {
                    label: '通化市',
                    children: ['东昌区', '二道江区', '梅河口市', '集安市', '通化县', '辉南县', '柳河县', '其他']
                },
                {
                    label: '白山市',
                    children: ['八道江区', '江源区', '临江市', '靖宇县', '抚松县', '长白朝鲜族自治县', '其他']
                },
                {
                    label: '松原市',
                    children: ['宁江区', '乾安县', '长岭县', '扶余县', '前郭尔罗斯蒙古族自治县', '其他']
                },
                {
                    label: '白城市',
                    children: ['洮北区', '大安市', '洮南市', '镇赉县', '通榆县', '其他']
                },
                {
                    label: '延边朝鲜族自治州',
                    children: ['延吉市', '图们市', '敦化市', '龙井市', '珲春市', '和龙市', '安图县', '汪清县', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '黑龙江省',
            children: [
                {
                    label: '哈尔滨市',
                    children: [
                        '松北区',
                        '道里区',
                        '南岗区',
                        '平房区',
                        '香坊区',
                        '道外区',
                        '呼兰区',
                        '阿城区',
                        '双城市',
                        '尚志市',
                        '五常市',
                        '宾县',
                        '方正县',
                        '通河县',
                        '巴彦县',
                        '延寿县',
                        '木兰县',
                        '依兰县',
                        '其他'
                    ]
                },
                {
                    label: '齐齐哈尔市',
                    children: [
                        '龙沙区',
                        '昂昂溪区',
                        '铁锋区',
                        '建华区',
                        '富拉尔基区',
                        '碾子山区',
                        '梅里斯达斡尔族区',
                        '讷河市',
                        '富裕县',
                        '拜泉县',
                        '甘南县',
                        '依安县',
                        '克山县',
                        '泰来县',
                        '克东县',
                        '龙江县',
                        '其他'
                    ]
                },
                {
                    label: '鹤岗市',
                    children: ['兴山区', '工农区', '南山区', '兴安区', '向阳区', '东山区', '萝北县', '绥滨县', '其他']
                },
                {
                    label: '双鸭山',
                    children: ['尖山区', '岭东区', '四方台区', '宝山区', '集贤县', '宝清县', '友谊县', '饶河县', '其他']
                },
                {
                    label: '鸡西市',
                    children: ['鸡冠区', '恒山区', '城子河区', '滴道区', '梨树区', '麻山区', '密山市', '虎林市', '鸡东县', '其他']
                },
                {
                    label: '大庆市',
                    children: [
                        '萨尔图区',
                        '红岗区',
                        '龙凤区',
                        '让胡路区',
                        '大同区',
                        '林甸县',
                        '肇州县',
                        '肇源县',
                        '杜尔伯特蒙古族自治县',
                        '其他'
                    ]
                },
                {
                    label: '伊春市',
                    children: [
                        '伊春区',
                        '带岭区',
                        '南岔区',
                        '金山屯区',
                        '西林区',
                        '美溪区',
                        '乌马河区',
                        '翠峦区',
                        '友好区',
                        '上甘岭区',
                        '五营区',
                        '红星区',
                        '新青区',
                        '汤旺河区',
                        '乌伊岭区',
                        '铁力市',
                        '嘉荫县',
                        '其他'
                    ]
                },
                {
                    label: '牡丹江市',
                    children: [
                        '爱民区',
                        '东安区',
                        '阳明区',
                        '西安区',
                        '绥芬河市',
                        '宁安市',
                        '海林市',
                        '穆棱市',
                        '林口县',
                        '东宁县',
                        '其他'
                    ]
                },
                {
                    label: '佳木斯市',
                    children: [
                        '向阳区',
                        '前进区',
                        '东风区',
                        '郊区',
                        '同江市',
                        '富锦市',
                        '桦川县',
                        '抚远县',
                        '桦南县',
                        '汤原县',
                        '其他'
                    ]
                },
                {
                    label: '七台河市',
                    children: ['桃山区', '新兴区', '茄子河区', '勃利县', '其他']
                },
                {
                    label: '黑河市',
                    children: ['爱辉区', '北安市', '五大连池市', '逊克县', '嫩江县', '孙吴县', '其他']
                },
                {
                    label: '绥化市',
                    children: [
                        '北林区',
                        '安达市',
                        '肇东市',
                        '海伦市',
                        '绥棱县',
                        '兰西县',
                        '明水县',
                        '青冈县',
                        '庆安县',
                        '望奎县',
                        '其他'
                    ]
                },
                {
                    label: '大兴安岭地区',
                    children: ['呼玛县', '塔河县', '漠河县', '大兴安岭辖区', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '上海',
            children: [
                {
                    label: '上海市',
                    children: [
                        '黄浦区',
                        '卢湾区',
                        '徐汇区',
                        '长宁区',
                        '静安区',
                        '普陀区',
                        '闸北区',
                        '虹口区',
                        '杨浦区',
                        '宝山区',
                        '闵行区',
                        '嘉定区',
                        '松江区',
                        '金山区',
                        '青浦区',
                        '南汇区',
                        '奉贤区',
                        '浦东新区',
                        '崇明县',
                        '其他'
                    ]
                }
            ]
        },
        {
            label: '江苏省',
            children: [
                {
                    label: '南京市',
                    children: [
                        '玄武区',
                        '白下区',
                        '秦淮区',
                        '建邺区',
                        '鼓楼区',
                        '下关区',
                        '栖霞区',
                        '雨花台区',
                        '浦口区',
                        '江宁区',
                        '六合区',
                        '溧水县',
                        '高淳县',
                        '其他'
                    ]
                },
                {
                    label: '苏州市',
                    children: [
                        '金阊区',
                        '平江区',
                        '沧浪区',
                        '虎丘区',
                        '吴中区',
                        '相城区',
                        '常熟市',
                        '张家港市',
                        '昆山市',
                        '吴江市',
                        '太仓市',
                        '其他'
                    ]
                },
                {
                    label: '无锡市',
                    children: ['崇安区', '南长区', '北塘区', '滨湖区', '锡山区', '惠山区', '江阴市', '宜兴市', '其他']
                },
                {
                    label: '常州市',
                    children: ['钟楼区', '天宁区', '戚墅堰区', '新北区', '武进区', '金坛市', '溧阳市', '其他']
                },
                {
                    label: '镇江市',
                    children: ['京口区', '润州区', '丹徒区', '丹阳市', '扬中市', '句容市', '其他']
                },
                {
                    label: '南通市',
                    children: ['崇川区', '港闸区', '通州市', '如皋市', '海门市', '启东市', '海安县', '如东县', '其他']
                },
                {
                    label: '泰州市',
                    children: ['海陵区', '高港区', '姜堰市', '泰兴市', '靖江市', '兴化市', '其他']
                },
                {
                    label: '扬州市',
                    children: ['广陵区', '维扬区', '邗江区', '江都市', '仪征市', '高邮市', '宝应县', '其他']
                },
                {
                    label: '盐城市',
                    children: ['亭湖区', '盐都区', '大丰市', '东台市', '建湖县', '射阳县', '阜宁县', '滨海县', '响水县', '其他']
                },
                {
                    label: '连云港市',
                    children: ['新浦区', '海州区', '连云区', '东海县', '灌云县', '赣榆县', '灌南县', '其他']
                },
                {
                    label: '徐州市',
                    children: [
                        '云龙区',
                        '鼓楼区',
                        '九里区',
                        '泉山区',
                        '贾汪区',
                        '邳州市',
                        '新沂市',
                        '铜山县',
                        '睢宁县',
                        '沛县',
                        '丰县',
                        '其他'
                    ]
                },
                {
                    label: '淮安市',
                    children: ['清河区', '清浦区', '楚州区', '淮阴区', '涟水县', '洪泽县', '金湖县', '盱眙县', '其他']
                },
                {
                    label: '宿迁市',
                    children: ['宿城区', '宿豫区', '沭阳县', '泗阳县', '泗洪县', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '浙江省',
            children: [
                {
                    label: '杭州市',
                    children: [
                        '拱墅区',
                        '西湖区',
                        '上城区',
                        '下城区',
                        '江干区',
                        '滨江区',
                        '余杭区',
                        '萧山区',
                        '建德市',
                        '富阳市',
                        '临安市',
                        '桐庐县',
                        '淳安县',
                        '其他'
                    ]
                },
                {
                    label: '宁波市',
                    children: [
                        '海曙区',
                        '江东区',
                        '江北区',
                        '镇海区',
                        '北仑区',
                        '鄞州区',
                        '余姚市',
                        '慈溪市',
                        '奉化市',
                        '宁海县',
                        '象山县',
                        '其他'
                    ]
                },
                {
                    label: '温州市',
                    children: [
                        '鹿城区',
                        '龙湾区',
                        '瓯海区',
                        '瑞安市',
                        '乐清市',
                        '永嘉县',
                        '洞头县',
                        '平阳县',
                        '苍南县',
                        '文成县',
                        '泰顺县',
                        '其他'
                    ]
                },
                {
                    label: '嘉兴市',
                    children: ['秀城区', '秀洲区', '海宁市', '平湖市', '桐乡市', '嘉善县', '海盐县', '其他']
                },
                {
                    label: '湖州市',
                    children: ['吴兴区', '南浔区', '长兴县', '德清县', '安吉县', '其他']
                },
                {
                    label: '绍兴市',
                    children: ['越城区', '诸暨市', '上虞市', '嵊州市', '绍兴县', '新昌县', '其他']
                },
                {
                    label: '金华市',
                    children: ['婺城区', '金东区', '兰溪市', '义乌市', '东阳市', '永康市', '武义县', '浦江县', '磐安县', '其他']
                },
                {
                    label: '衢州市',
                    children: ['柯城区', '衢江区', '江山市', '龙游县', '常山县', '开化县', '其他']
                },
                {
                    label: '舟山市',
                    children: ['定海区', '普陀区', '岱山县', '嵊泗县', '其他']
                },
                {
                    label: '台州市',
                    children: ['椒江区', '黄岩区', '路桥区', '临海市', '温岭市', '玉环县', '天台县', '仙居县', '三门县', '其他']
                },
                {
                    label: '丽水市',
                    children: [
                        '莲都区',
                        '龙泉市',
                        '缙云县',
                        '青田县',
                        '云和县',
                        '遂昌县',
                        '松阳县',
                        '庆元县',
                        '景宁畲族自治县',
                        '其他'
                    ]
                },
                {
                    label: '其他市',
                    children: ['其他']
                }
            ]
        },
        {
            label: '安徽省',
            children: [
                {
                    label: '合肥市',
                    children: ['庐阳区', '瑶海区', '蜀山区', '包河区', '长丰县', '肥东县', '肥西县', '其他']
                },
                {
                    label: '芜湖市',
                    children: ['镜湖区', '弋江区', '鸠江区', '三山区', '芜湖县', '南陵县', '繁昌县', '其他']
                },
                {
                    label: '蚌埠市',
                    children: ['蚌山区', '龙子湖区', '禹会区', '淮上区', '怀远县', '固镇县', '五河县', '其他']
                },
                {
                    label: '淮南市',
                    children: ['田家庵区', '大通区', '谢家集区', '八公山区', '潘集区', '凤台县', '其他']
                },
                {
                    label: '马鞍山市',
                    children: ['雨山区', '花山区', '金家庄区', '当涂县', '其他']
                },
                {
                    label: '淮北市',
                    children: ['相山区', '杜集区', '烈山区', '濉溪县', '其他']
                },
                {
                    label: '铜陵市',
                    children: ['铜官山区', '狮子山区', '郊区', '铜陵县', '其他']
                },
                {
                    label: '安庆市',
                    children: [
                        '迎江区',
                        '大观区',
                        '宜秀区',
                        '桐城市',
                        '宿松县',
                        '枞阳县',
                        '太湖县',
                        '怀宁县',
                        '岳西县',
                        '望江县',
                        '潜山县',
                        '其他'
                    ]
                },
                {
                    label: '黄山市',
                    children: ['屯溪区', '黄山区', '徽州区', '休宁县', '歙县', '祁门县', '黟县', '其他']
                },
                {
                    label: '滁州市',
                    children: ['琅琊区', '南谯区', '天长市', '明光市', '全椒县', '来安县', '定远县', '凤阳县', '其他']
                },
                {
                    label: '阜阳市',
                    children: ['颍州区', '颍东区', '颍泉区', '界首市', '临泉县', '颍上县', '阜南县', '太和县', '其他']
                },
                {
                    label: '宿州市',
                    children: ['埇桥区', '萧县', '泗县', '砀山县', '灵璧县', '其他']
                },
                {
                    label: '巢湖市',
                    children: ['居巢区', '含山县', '无为县', '庐江县', '和县', '其他']
                },
                {
                    label: '六安市',
                    children: ['金安区', '裕安区', '寿县', '霍山县', '霍邱县', '舒城县', '金寨县', '其他']
                },
                {
                    label: '亳州市',
                    children: ['谯城区', '利辛县', '涡阳县', '蒙城县', '其他']
                },
                {
                    label: '池州市',
                    children: ['贵池区', '东至县', '石台县', '青阳县', '其他']
                },
                {
                    label: '宣城市',
                    children: ['宣州区', '宁国市', '广德县', '郎溪县', '泾县', '旌德县', '绩溪县', '其他']
                },
                {
                    label: '其他市',
                    children: ['其他']
                }
            ]
        },
        {
            label: '福建省',
            children: [
                {
                    label: '福州市',
                    children: [
                        '鼓楼区',
                        '台江区',
                        '仓山区',
                        '马尾区',
                        '晋安区',
                        '福清市',
                        '长乐市',
                        '闽侯县',
                        '闽清县',
                        '永泰县',
                        '连江县',
                        '罗源县',
                        '平潭县',
                        '其他'
                    ]
                },
                {
                    label: '厦门市',
                    children: ['思明区', '海沧区', '湖里区', '集美区', '同安区', '翔安区', '其他']
                },
                {
                    label: '莆田市',
                    children: ['城厢区', '涵江区', '荔城区', '秀屿区', '仙游县', '其他']
                },
                {
                    label: '三明市',
                    children: [
                        '梅列区',
                        '三元区',
                        '永安市',
                        '明溪县',
                        '将乐县',
                        '大田县',
                        '宁化县',
                        '建宁县',
                        '沙县',
                        '尤溪县',
                        '清流县',
                        '泰宁县',
                        '其他'
                    ]
                },
                {
                    label: '泉州市',
                    children: [
                        '鲤城区',
                        '丰泽区',
                        '洛江区',
                        '泉港区',
                        '石狮市',
                        '晋江市',
                        '南安市',
                        '惠安县',
                        '永春县',
                        '安溪县',
                        '德化县',
                        '金门县',
                        '其他'
                    ]
                },
                {
                    label: '漳州市',
                    children: [
                        '芗城区',
                        '龙文区',
                        '龙海市',
                        '平和县',
                        '南靖县',
                        '诏安县',
                        '漳浦县',
                        '华安县',
                        '东山县',
                        '长泰县',
                        '云霄县',
                        '其他'
                    ]
                },
                {
                    label: '南平市',
                    children: [
                        '延平区',
                        '建瓯市',
                        '邵武市',
                        '武夷山市',
                        '建阳市',
                        '松溪县',
                        '光泽县',
                        '顺昌县',
                        '浦城县',
                        '政和县',
                        '其他'
                    ]
                },
                {
                    label: '龙岩市',
                    children: ['新罗区', '漳平市', '长汀县', '武平县', '上杭县', '永定县', '连城县', '其他']
                },
                {
                    label: '宁德市',
                    children: ['蕉城区', '福安市', '福鼎市', '寿宁县', '霞浦县', '柘荣县', '屏南县', '古田县', '周宁县', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '江西省',
            children: [
                {
                    label: '南昌市',
                    children: [
                        '东湖区',
                        '西湖区',
                        '青云谱区',
                        '湾里区',
                        '青山湖区',
                        '新建县',
                        '南昌县',
                        '进贤县',
                        '安义县',
                        '其他'
                    ]
                },
                {
                    label: '景德镇市',
                    children: ['珠山区', '昌江区', '乐平市', '浮梁县', '其他']
                },
                {
                    label: '萍乡市',
                    children: ['安源区', '湘东区', '莲花县', '上栗县', '芦溪县', '其他']
                },
                {
                    label: '九江市',
                    children: [
                        '浔阳区',
                        '庐山区',
                        '瑞昌市',
                        '九江县',
                        '星子县',
                        '武宁县',
                        '彭泽县',
                        '永修县',
                        '修水县',
                        '湖口县',
                        '德安县',
                        '都昌县',
                        '其他'
                    ]
                },
                {
                    label: '新余市',
                    children: ['渝水区', '分宜县', '其他']
                },
                {
                    label: '鹰潭市',
                    children: ['月湖区', '贵溪市', '余江县', '其他']
                },
                {
                    label: '赣州市',
                    children: [
                        '章贡区',
                        '瑞金市',
                        '南康市',
                        '石城县',
                        '安远县',
                        '赣县',
                        '宁都县',
                        '寻乌县',
                        '兴国县',
                        '定南县',
                        '上犹县',
                        '于都县',
                        '龙南县',
                        '崇义县',
                        '信丰县',
                        '全南县',
                        '大余县',
                        '会昌县',
                        '其他'
                    ]
                },
                {
                    label: '吉安市',
                    children: [
                        '吉州区',
                        '青原区',
                        '井冈山市',
                        '吉安县',
                        '永丰县',
                        '永新县',
                        '新干县',
                        '泰和县',
                        '峡江县',
                        '遂川县',
                        '安福县',
                        '吉水县',
                        '万安县',
                        '其他'
                    ]
                },
                {
                    label: '宜春市',
                    children: [
                        '袁州区',
                        '丰城市',
                        '樟树市',
                        '高安市',
                        '铜鼓县',
                        '靖安县',
                        '宜丰县',
                        '奉新县',
                        '万载县',
                        '上高县',
                        '其他'
                    ]
                },
                {
                    label: '抚州市',
                    children: [
                        '临川区',
                        '南丰县',
                        '乐安县',
                        '金溪县',
                        '南城县',
                        '东乡县',
                        '资溪县',
                        '宜黄县',
                        '广昌县',
                        '黎川县',
                        '崇仁县',
                        '其他'
                    ]
                },
                {
                    label: '上饶市',
                    children: [
                        '信州区',
                        '德兴市',
                        '上饶县',
                        '广丰县',
                        '鄱阳县',
                        '婺源县',
                        '铅山县',
                        '余干县',
                        '横峰县',
                        '弋阳县',
                        '玉山县',
                        '万年县',
                        '其他'
                    ]
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '山东省',
            children: [
                {
                    label: '济南市',
                    children: [
                        '市中区',
                        '历下区',
                        '天桥区',
                        '槐荫区',
                        '历城区',
                        '长清区',
                        '章丘市',
                        '平阴县',
                        '济阳县',
                        '商河县',
                        '其他'
                    ]
                },
                {
                    label: '青岛市',
                    children: [
                        '市南区',
                        '市北区',
                        '城阳区',
                        '四方区',
                        '李沧区',
                        '黄岛区',
                        '崂山区',
                        '胶南市',
                        '胶州市',
                        '平度市',
                        '莱西市',
                        '即墨市',
                        '其他'
                    ]
                },
                {
                    label: '淄博市',
                    children: ['张店区', '临淄区', '淄川区', '博山区', '周村区', '桓台县', '高青县', '沂源县', '其他']
                },
                {
                    label: '枣庄市',
                    children: ['市中区', '山亭区', '峄城区', '台儿庄区', '薛城区', '滕州市', '其他']
                },
                {
                    label: '东营市',
                    children: ['东营区', '河口区', '垦利县', '广饶县', '利津县', '其他']
                },
                {
                    label: '烟台市',
                    children: [
                        '芝罘区',
                        '福山区',
                        '牟平区',
                        '莱山区',
                        '龙口市',
                        '莱阳市',
                        '莱州市',
                        '招远市',
                        '蓬莱市',
                        '栖霞市',
                        '海阳市',
                        '长岛县',
                        '其他'
                    ]
                },
                {
                    label: '潍坊市',
                    children: [
                        '潍城区',
                        '寒亭区',
                        '坊子区',
                        '奎文区',
                        '青州市',
                        '诸城市',
                        '寿光市',
                        '安丘市',
                        '高密市',
                        '昌邑市',
                        '昌乐县',
                        '临朐县',
                        '其他'
                    ]
                },
                {
                    label: '济宁市',
                    children: [
                        '市中区',
                        '任城区',
                        '曲阜市',
                        '兖州市',
                        '邹城市',
                        '鱼台县',
                        '金乡县',
                        '嘉祥县',
                        '微山县',
                        '汶上县',
                        '泗水县',
                        '梁山县',
                        '其他'
                    ]
                },
                {
                    label: '泰安市',
                    children: ['泰山区', '岱岳区', '新泰市', '肥城市', '宁阳县', '东平县', '其他']
                },
                {
                    label: '威海市',
                    children: ['环翠区', '乳山市', '文登市', '荣成市', '其他']
                },
                {
                    label: '日照市',
                    children: ['东港区', '岚山区', '五莲县', '莒县', '其他']
                },
                {
                    label: '莱芜市',
                    children: ['莱城区', '钢城区', '其他']
                },
                {
                    label: '临沂市',
                    children: [
                        '兰山区',
                        '罗庄区',
                        '河东区',
                        '沂南县',
                        '郯城县',
                        '沂水县',
                        '苍山县',
                        '费县',
                        '平邑县',
                        '莒南县',
                        '蒙阴县',
                        '临沭县',
                        '其他'
                    ]
                },
                {
                    label: '德州市',
                    children: [
                        '德城区',
                        '乐陵市',
                        '禹城市',
                        '陵县',
                        '宁津县',
                        '齐河县',
                        '武城县',
                        '庆云县',
                        '平原县',
                        '夏津县',
                        '临邑县',
                        '其他'
                    ]
                },
                {
                    label: '聊城市',
                    children: ['东昌府区', '临清市', '高唐县', '阳谷县', '茌平县', '莘县', '东阿县', '冠县', '其他']
                },
                {
                    label: '滨州市',
                    children: ['滨城区', '邹平县', '沾化县', '惠民县', '博兴县', '阳信县', '无棣县', '其他']
                },
                {
                    label: '菏泽市',
                    children: ['牡丹区', '鄄城县', '单县', '郓城县', '曹县', '定陶县', '巨野县', '东明县', '成武县', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '河南省',
            children: [
                {
                    label: '郑州市',
                    children: [
                        '中原区',
                        '金水区',
                        '二七区',
                        '管城回族区',
                        '上街区',
                        '惠济区',
                        '巩义市',
                        '新郑市',
                        '新密市',
                        '登封市',
                        '荥阳市',
                        '中牟县',
                        '其他'
                    ]
                },
                {
                    label: '开封市',
                    children: [
                        '鼓楼区',
                        '龙亭区',
                        '顺河回族区',
                        '禹王台区',
                        '金明区',
                        '开封县',
                        '尉氏县',
                        '兰考县',
                        '杞县',
                        '通许县',
                        '其他'
                    ]
                },
                {
                    label: '洛阳市',
                    children: [
                        '西工区',
                        '老城区',
                        '涧西区',
                        '瀍河回族区',
                        '洛龙区',
                        '吉利区',
                        '偃师市',
                        '孟津县',
                        '汝阳县',
                        '伊川县',
                        '洛宁县',
                        '嵩县',
                        '宜阳县',
                        '新安县',
                        '栾川县',
                        '其他'
                    ]
                },
                {
                    label: '平顶山市',
                    children: [
                        '新华区',
                        '卫东区',
                        '湛河区',
                        '石龙区',
                        '汝州市',
                        '舞钢市',
                        '宝丰县',
                        '叶县',
                        '郏县',
                        '鲁山县',
                        '其他'
                    ]
                },
                {
                    label: '安阳市',
                    children: ['北关区', '文峰区', '殷都区', '龙安区', '林州市', '安阳县', '滑县', '内黄县', '汤阴县', '其他']
                },
                {
                    label: '鹤壁市',
                    children: ['淇滨区', '山城区', '鹤山区', '浚县', '淇县', '其他']
                },
                {
                    label: '新乡市',
                    children: [
                        '卫滨区',
                        '红旗区',
                        '凤泉区',
                        '牧野区',
                        '卫辉市',
                        '辉县市',
                        '新乡县',
                        '获嘉县',
                        '原阳县',
                        '长垣县',
                        '封丘县',
                        '延津县',
                        '其他'
                    ]
                },
                {
                    label: '焦作市',
                    children: [
                        '解放区',
                        '中站区',
                        '马村区',
                        '山阳区',
                        '沁阳市',
                        '孟州市',
                        '修武县',
                        '温县',
                        '武陟县',
                        '博爱县',
                        '其他'
                    ]
                },
                {
                    label: '濮阳市',
                    children: ['华龙区', '濮阳县', '南乐县', '台前县', '清丰县', '范县', '其他']
                },
                {
                    label: '许昌市',
                    children: ['魏都区', '禹州市', '长葛市', '许昌县', '鄢陵县', '襄城县', '其他']
                },
                {
                    label: '漯河市',
                    children: ['源汇区', '郾城区', '召陵区', '临颍县', '舞阳县', '其他']
                },
                {
                    label: '三门峡市',
                    children: ['湖滨区', '义马市', '灵宝市', '渑池县', '卢氏县', '陕县', '其他']
                },
                {
                    label: '南阳市',
                    children: [
                        '卧龙区',
                        '宛城区',
                        '邓州市',
                        '桐柏县',
                        '方城县',
                        '淅川县',
                        '镇平县',
                        '唐河县',
                        '南召县',
                        '内乡县',
                        '新野县',
                        '社旗县',
                        '西峡县',
                        '其他'
                    ]
                },
                {
                    label: '商丘市',
                    children: ['梁园区', '睢阳区', '永城市', '宁陵县', '虞城县', '民权县', '夏邑县', '柘城县', '睢县', '其他']
                },
                {
                    label: '信阳市',
                    children: [
                        '浉河区',
                        '平桥区',
                        '潢川县',
                        '淮滨县',
                        '息县',
                        '新县',
                        '商城县',
                        '固始县',
                        '罗山县',
                        '光山县',
                        '其他'
                    ]
                },
                {
                    label: '周口市',
                    children: [
                        '川汇区',
                        '项城市',
                        '商水县',
                        '淮阳县',
                        '太康县',
                        '鹿邑县',
                        '西华县',
                        '扶沟县',
                        '沈丘县',
                        '郸城县',
                        '其他'
                    ]
                },
                {
                    label: '驻马店市',
                    children: [
                        '驿城区',
                        '确山县',
                        '新蔡县',
                        '上蔡县',
                        '西平县',
                        '泌阳县',
                        '平舆县',
                        '汝南县',
                        '遂平县',
                        '正阳县',
                        '其他'
                    ]
                },
                {
                    label: '焦作市',
                    children: ['济源市', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '湖北省',
            children: [
                {
                    label: '武汉市',
                    children: [
                        '江岸区',
                        '武昌区',
                        '江汉区',
                        '硚口区',
                        '汉阳区',
                        '青山区',
                        '洪山区',
                        '东西湖区',
                        '汉南区',
                        '蔡甸区',
                        '江夏区',
                        '黄陂区',
                        '新洲区',
                        '其他'
                    ]
                },
                {
                    label: '黄石市',
                    children: ['黄石港区', '西塞山区', '下陆区', '铁山区', '大冶市', '阳新县', '其他']
                },
                {
                    label: '十堰市',
                    children: ['张湾区', '茅箭区', '丹江口市', '郧县', '竹山县', '房县', '郧西县', '竹溪县', '其他']
                },
                {
                    label: '荆州市',
                    children: ['沙市区', '荆州区', '洪湖市', '石首市', '松滋市', '监利县', '公安县', '江陵县', '其他']
                },
                {
                    label: '宜昌市',
                    children: [
                        '西陵区',
                        '伍家岗区',
                        '点军区',
                        '猇亭区',
                        '夷陵区',
                        '宜都市',
                        '当阳市',
                        '枝江市',
                        '秭归县',
                        '远安县',
                        '兴山县',
                        '五峰土家族自治县',
                        '长阳土家族自治县',
                        '其他'
                    ]
                },
                {
                    label: '襄樊市',
                    children: ['襄城区', '樊城区', '襄阳区', '老河口市', '枣阳市', '宜城市', '南漳县', '谷城县', '保康县', '其他']
                },
                {
                    label: '鄂州市',
                    children: ['鄂城区', '华容区', '梁子湖区', '其他']
                },
                {
                    label: '荆门市',
                    children: ['东宝区', '掇刀区', '钟祥市', '京山县', '沙洋县', '其他']
                },
                {
                    label: '孝感市',
                    children: ['孝南区', '应城市', '安陆市', '汉川市', '云梦县', '大悟县', '孝昌县', '其他']
                },
                {
                    label: '黄冈市',
                    children: [
                        '黄州区',
                        '麻城市',
                        '武穴市',
                        '红安县',
                        '罗田县',
                        '浠水县',
                        '蕲春县',
                        '黄梅县',
                        '英山县',
                        '团风县',
                        '其他'
                    ]
                },
                {
                    label: '咸宁市',
                    children: ['咸安区', '赤壁市', '嘉鱼县', '通山县', '崇阳县', '通城县', '其他']
                },
                {
                    label: '随州市',
                    children: ['曾都区', '广水市', '其他']
                },
                {
                    label: '恩施土家族苗族自治州',
                    children: ['恩施市', '利川市', '建始县', '来凤县', '巴东县', '鹤峰县', '宣恩县', '咸丰县', '其他']
                },
                {
                    label: '仙桃市',
                    children: ['仙桃']
                },
                {
                    label: '天门市',
                    children: ['天门']
                },
                {
                    label: '潜江市',
                    children: ['潜江']
                },
                {
                    label: '神农架林区',
                    children: ['神农架林区']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '湖南省',
            children: [
                {
                    label: '长沙市',
                    children: ['岳麓区', '芙蓉区', '天心区', '开福区', '雨花区', '浏阳市', '长沙县', '望城县', '宁乡县', '其他']
                },
                {
                    label: '株洲市',
                    children: ['天元区', '荷塘区', '芦淞区', '石峰区', '醴陵市', '株洲县', '炎陵县', '茶陵县', '攸县', '其他']
                },
                {
                    label: '湘潭市',
                    children: ['岳塘区', '雨湖区', '湘乡市', '韶山市', '湘潭县', '其他']
                },
                {
                    label: '衡阳市',
                    children: [
                        '雁峰区',
                        '珠晖区',
                        '石鼓区',
                        '蒸湘区',
                        '南岳区',
                        '耒阳市',
                        '常宁市',
                        '衡阳县',
                        '衡东县',
                        '衡山县',
                        '衡南县',
                        '祁东县',
                        '其他'
                    ]
                },
                {
                    label: '邵阳市',
                    children: [
                        '双清区',
                        '大祥区',
                        '北塔区',
                        '武冈市',
                        '邵东县',
                        '洞口县',
                        '新邵县',
                        '绥宁县',
                        '新宁县',
                        '邵阳县',
                        '隆回县',
                        '城步苗族自治县',
                        '其他'
                    ]
                },
                {
                    label: '岳阳市',
                    children: ['岳阳楼区', '云溪区', '君山区', '临湘市', '汨罗市', '岳阳县', '湘阴县', '平江县', '华容县', '其他']
                },
                {
                    label: '常德市',
                    children: ['武陵区', '鼎城区', '津市市', '澧县', '临澧县', '桃源县', '汉寿县', '安乡县', '石门县', '其他']
                },
                {
                    label: '张家界市',
                    children: ['永定区', '武陵源区', '慈利县', '桑植县', '其他']
                },
                {
                    label: '益阳市',
                    children: ['赫山区', '资阳区', '沅江市', '桃江县', '南县', '安化县', '其他']
                },
                {
                    label: '郴州市',
                    children: [
                        '北湖区',
                        '苏仙区',
                        '资兴市',
                        '宜章县',
                        '汝城县',
                        '安仁县',
                        '嘉禾县',
                        '临武县',
                        '桂东县',
                        '永兴县',
                        '桂阳县',
                        '其他'
                    ]
                },
                {
                    label: '永州市',
                    children: [
                        '冷水滩区',
                        '零陵区',
                        '祁阳县',
                        '蓝山县',
                        '宁远县',
                        '新田县',
                        '东安县',
                        '江永县',
                        '道县',
                        '双牌县',
                        '江华瑶族自治县',
                        '其他'
                    ]
                },
                {
                    label: '怀化市',
                    children: [
                        '鹤城区',
                        '洪江市',
                        '会同县',
                        '沅陵县',
                        '辰溪县',
                        '溆浦县',
                        '中方县',
                        '新晃侗族自治县',
                        '芷江侗族自治县',
                        '通道侗族自治县',
                        '靖州苗族侗族自治县',
                        '麻阳苗族自治县',
                        '其他'
                    ]
                },
                {
                    label: '娄底市',
                    children: ['娄星区', '冷水江市', '涟源市', '新化县', '双峰县', '其他']
                },
                {
                    label: '湘西土家族苗族自治州',
                    children: ['吉首市', '古丈县', '龙山县', '永顺县', '凤凰县', '泸溪县', '保靖县', '花垣县', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '广东省',
            children: [
                {
                    label: '广州市',
                    children: [
                        '越秀区',
                        '荔湾区',
                        '海珠区',
                        '天河区',
                        '白云区',
                        '黄埔区',
                        '番禺区',
                        '花都区',
                        '南沙区',
                        '萝岗区',
                        '增城市',
                        '从化市',
                        '其他'
                    ]
                },
                {
                    label: '深圳市',
                    children: ['福田区', '罗湖区', '南山区', '宝安区', '龙岗区', '盐田区', '其他']
                },
                {
                    label: '东莞市',
                    children: ['莞城', '常平', '塘厦', '塘厦', '塘厦', '其他']
                },
                {
                    label: '中山市',
                    children: ['中山']
                },
                {
                    label: '潮州市',
                    children: ['湘桥区', '潮安县', '饶平县', '其他']
                },
                {
                    label: '揭阳市',
                    children: ['榕城区', '揭东县', '揭西县', '惠来县', '普宁市', '其他']
                },
                {
                    label: '云浮市',
                    children: ['云城区', '新兴县', '郁南县', '云安县', '罗定市', '其他']
                },
                {
                    label: '珠海市',
                    children: ['香洲区', '斗门区', '金湾区', '其他']
                },
                {
                    label: '汕头市',
                    children: ['金平区', '濠江区', '龙湖区', '潮阳区', '潮南区', '澄海区', '南澳县', '其他']
                },
                {
                    label: '韶关市',
                    children: [
                        '浈江区',
                        '武江区',
                        '曲江区',
                        '乐昌市',
                        '南雄市',
                        '始兴县',
                        '仁化县',
                        '翁源县',
                        '新丰县',
                        '乳源瑶族自治县',
                        '其他'
                    ]
                },
                {
                    label: '佛山市',
                    children: ['禅城区', '南海区', '顺德区', '三水区', '高明区', '其他']
                },
                {
                    label: '江门市',
                    children: ['蓬江区', '江海区', '新会区', '恩平市', '台山市', '开平市', '鹤山市', '其他']
                },
                {
                    label: '湛江市',
                    children: ['赤坎区', '霞山区', '坡头区', '麻章区', '吴川市', '廉江市', '雷州市', '遂溪县', '徐闻县', '其他']
                },
                {
                    label: '茂名市',
                    children: ['茂南区', '茂港区', '化州市', '信宜市', '高州市', '电白县', '其他']
                },
                {
                    label: '肇庆市',
                    children: ['端州区', '鼎湖区', '高要市', '四会市', '广宁县', '怀集县', '封开县', '德庆县', '其他']
                },
                {
                    label: '惠州市',
                    children: ['惠城区', '惠阳区', '博罗县', '惠东县', '龙门县', '其他']
                },
                {
                    label: '梅州市',
                    children: ['梅江区', '兴宁市', '梅县', '大埔县', '丰顺县', '五华县', '平远县', '蕉岭县', '其他']
                },
                {
                    label: '汕尾市',
                    children: ['城区', '陆丰市', '海丰县', '陆河县', '其他']
                },
                {
                    label: '河源市',
                    children: ['源城区', '紫金县', '龙川县', '连平县', '和平县', '东源县', '其他']
                },
                {
                    label: '阳江市',
                    children: ['江城区', '阳春市', '阳西县', '阳东县', '其他']
                },
                {
                    label: '清远市',
                    children: [
                        '清城区',
                        '英德市',
                        '连州市',
                        '佛冈县',
                        '阳山县',
                        '清新县',
                        '连山壮族瑶族自治县',
                        '连南瑶族自治县',
                        '其他'
                    ]
                }
            ]
        },
        {
            label: '广西',
            children: [
                {
                    label: '南宁市',
                    children: [
                        '青秀区',
                        '兴宁区',
                        '西乡塘区',
                        '良庆区',
                        '江南区',
                        '邕宁区',
                        '武鸣县',
                        '隆安县',
                        '马山县',
                        '上林县',
                        '宾阳县',
                        '横县',
                        '其他'
                    ]
                },
                {
                    label: '柳州市',
                    children: [
                        '城中区',
                        '鱼峰区',
                        '柳北区',
                        '柳南区',
                        '柳江县',
                        '柳城县',
                        '鹿寨县',
                        '融安县',
                        '融水苗族自治县',
                        '三江侗族自治县',
                        '其他'
                    ]
                },
                {
                    label: '桂林市',
                    children: [
                        '象山区',
                        '秀峰区',
                        '叠彩区',
                        '七星区',
                        '雁山区',
                        '阳朔县',
                        '临桂县',
                        '灵川县',
                        '全州县',
                        '平乐县',
                        '兴安县',
                        '灌阳县',
                        '荔浦县',
                        '资源县',
                        '永福县',
                        '龙胜各族自治县',
                        '恭城瑶族自治县',
                        '其他'
                    ]
                },
                {
                    label: '梧州市',
                    children: ['万秀区', '蝶山区', '长洲区', '岑溪市', '苍梧县', '藤县', '蒙山县', '其他']
                },
                {
                    label: '北海市',
                    children: ['海城区', '银海区', '铁山港区', '合浦县', '其他']
                },
                {
                    label: '防城港市',
                    children: ['港口区', '防城区', '东兴市', '上思县', '其他']
                },
                {
                    label: '钦州市',
                    children: ['钦南区', '钦北区', '灵山县', '浦北县', '其他']
                },
                {
                    label: '贵港市',
                    children: ['港北区', '港南区', '覃塘区', '桂平市', '平南县', '其他']
                },
                {
                    label: '玉林市',
                    children: ['玉州区', '北流市', '容县', '陆川县', '博白县', '兴业县', '其他']
                },
                {
                    label: '百色市',
                    children: [
                        '右江区',
                        '凌云县',
                        '平果县',
                        '西林县',
                        '乐业县',
                        '德保县',
                        '田林县',
                        '田阳县',
                        '靖西县',
                        '田东县',
                        '那坡县',
                        '隆林各族自治县',
                        '其他'
                    ]
                },
                {
                    label: '贺州市',
                    children: ['八步区', '钟山县', '昭平县', '富川瑶族自治县', '其他']
                },
                {
                    label: '河池市',
                    children: [
                        '金城江区',
                        '宜州市',
                        '天峨县',
                        '凤山县',
                        '南丹县',
                        '东兰县',
                        '都安瑶族自治县',
                        '罗城仫佬族自治县',
                        '巴马瑶族自治县',
                        '环江毛南族自治县',
                        '大化瑶族自治县',
                        '其他'
                    ]
                },
                {
                    label: '来宾市',
                    children: ['兴宾区', '合山市', '象州县', '武宣县', '忻城县', '金秀瑶族自治县', '其他']
                },
                {
                    label: '崇左市',
                    children: ['江州区', '凭祥市', '宁明县', '扶绥县', '龙州县', '大新县', '天等县', '其他']
                },
                {
                    label: '其他市',
                    children: ['其他']
                }
            ]
        },
        {
            label: '海南省',
            children: [
                {
                    label: '海口市',
                    children: ['龙华区', '秀英区', '琼山区', '美兰区', '其他']
                },
                {
                    label: '三亚市',
                    children: ['三亚市', '其他']
                },
                {
                    label: '五指山市',
                    children: ['五指山']
                },
                {
                    label: '琼海市',
                    children: ['琼海']
                },
                {
                    label: '儋州市',
                    children: ['儋州']
                },
                {
                    label: '文昌市',
                    children: ['文昌']
                },
                {
                    label: '万宁市',
                    children: ['万宁']
                },
                {
                    label: '东方市',
                    children: ['东方']
                },
                {
                    label: '澄迈县',
                    children: ['澄迈县']
                },
                {
                    label: '定安县',
                    children: ['定安县']
                },
                {
                    label: '屯昌县',
                    children: ['屯昌县']
                },
                {
                    label: '临高县',
                    children: ['临高县']
                },
                {
                    label: '白沙黎族自治县',
                    children: ['白沙黎族自治县']
                },
                {
                    label: '昌江黎族自治县',
                    children: ['昌江黎族自治县']
                },
                {
                    label: '乐东黎族自治县',
                    children: ['乐东黎族自治县']
                },
                {
                    label: '陵水黎族自治县',
                    children: ['陵水黎族自治县']
                },
                {
                    label: '保亭黎族苗族自治县',
                    children: ['保亭黎族苗族自治县']
                },
                {
                    label: '琼中黎族苗族自治县',
                    children: ['琼中黎族苗族自治县']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '重庆市',
            children: [
                {
                    label: '重庆市',
                    children: [
                        '渝中区',
                        '大渡口区',
                        '江北区',
                        '南岸区',
                        '北碚区',
                        '渝北区',
                        '巴南区',
                        '长寿区',
                        '双桥区',
                        '沙坪坝区',
                        '万盛区',
                        '万州区',
                        '涪陵区',
                        '黔江区',
                        '永川区',
                        '合川区',
                        '江津区',
                        '九龙坡区',
                        '南川区',
                        '綦江县',
                        '潼南县',
                        '荣昌县',
                        '璧山县',
                        '大足县',
                        '铜梁县',
                        '梁平县',
                        '开县',
                        '忠县',
                        '城口县',
                        '垫江县',
                        '武隆县',
                        '丰都县',
                        '奉节县',
                        '云阳县',
                        '巫溪县',
                        '巫山县',
                        '石柱土家族自治县',
                        '秀山土家族苗族自治县',
                        '酉阳土家族苗族自治县',
                        '彭水苗族土家族自治县',
                        '其他'
                    ]
                }
            ]
        },
        {
            label: '四川省',
            children: [
                {
                    label: '成都市',
                    children: [
                        '青羊区',
                        '锦江区',
                        '金牛区',
                        '武侯区',
                        '成华区',
                        '龙泉驿区',
                        '青白江区',
                        '新都区',
                        '温江区',
                        '都江堰市',
                        '彭州市',
                        '邛崃市',
                        '崇州市',
                        '金堂县',
                        '郫县',
                        '新津县',
                        '双流县',
                        '蒲江县',
                        '大邑县',
                        '其他'
                    ]
                },
                {
                    label: '自贡市',
                    children: ['大安区', '自流井区', '贡井区', '沿滩区', '荣县', '富顺县', '其他']
                },
                {
                    label: '攀枝花市',
                    children: ['仁和区', '米易县', '盐边县', '东区', '西区', '其他']
                },
                {
                    label: '泸州市',
                    children: ['江阳区', '纳溪区', '龙马潭区', '泸县', '合江县', '叙永县', '古蔺县', '其他']
                },
                {
                    label: '德阳市',
                    children: ['旌阳区', '广汉市', '什邡市', '绵竹市', '罗江县', '中江县', '其他']
                },
                {
                    label: '绵阳市',
                    children: [
                        '涪城区',
                        '游仙区',
                        '江油市',
                        '盐亭县',
                        '三台县',
                        '平武县',
                        '安县',
                        '梓潼县',
                        '北川羌族自治县',
                        '其他'
                    ]
                },
                {
                    label: '广元市',
                    children: ['元坝区', '朝天区', '青川县', '旺苍县', '剑阁县', '苍溪县', '市中区', '其他']
                },
                {
                    label: '遂宁市',
                    children: ['船山区', '安居区', '射洪县', '蓬溪县', '大英县', '其他']
                },
                {
                    label: '内江市',
                    children: ['市中区', '东兴区', '资中县', '隆昌县', '威远县', '其他']
                },
                {
                    label: '乐山市',
                    children: [
                        '市中区',
                        '五通桥区',
                        '沙湾区',
                        '金口河区',
                        '峨眉山市',
                        '夹江县',
                        '井研县',
                        '犍为县',
                        '沐川县',
                        '马边彝族自治县',
                        '峨边彝族自治县',
                        '其他'
                    ]
                },
                {
                    label: '南充',
                    children: ['顺庆区', '高坪区', '嘉陵区', '阆中市', '营山县', '蓬安县', '仪陇县', '南部县', '西充县', '其他']
                },
                {
                    label: '眉山市',
                    children: ['东坡区', '仁寿县', '彭山县', '洪雅县', '丹棱县', '青神县', '其他']
                },
                {
                    label: '宜宾市',
                    children: [
                        '翠屏区',
                        '宜宾县',
                        '兴文县',
                        '南溪县',
                        '珙县',
                        '长宁县',
                        '高县',
                        '江安县',
                        '筠连县',
                        '屏山县',
                        '其他'
                    ]
                },
                {
                    label: '广安市',
                    children: ['广安区', '华蓥市', '岳池县', '邻水县', '武胜县', '其他']
                },
                {
                    label: '达州市',
                    children: ['通川区', '万源市', '达县', '渠县', '宣汉县', '开江县', '大竹县', '其他']
                },
                {
                    label: '雅安市',
                    children: ['雨城区', '芦山县', '石棉县', '名山县', '天全县', '荥经县', '宝兴县', '汉源县', '其他']
                },
                {
                    label: '巴中市',
                    children: ['巴州区', '南江县', '平昌县', '通江县', '其他']
                },
                {
                    label: '资阳市',
                    children: ['雁江区', '简阳市', '安岳县', '乐至县', '其他']
                },
                {
                    label: '阿坝藏族羌族自治州',
                    children: [
                        '马尔康县',
                        '九寨沟县',
                        '红原县',
                        '汶川县',
                        '阿坝县',
                        '理县',
                        '若尔盖县',
                        '小金县',
                        '黑水县',
                        '金川县',
                        '松潘县',
                        '壤塘县',
                        '茂县',
                        '其他'
                    ]
                },
                {
                    label: '甘孜藏族自治州',
                    children: [
                        '康定县',
                        '丹巴县',
                        '炉霍县',
                        '九龙县',
                        '甘孜县',
                        '雅江县',
                        '新龙县',
                        '道孚县',
                        '白玉县',
                        '理塘县',
                        '德格县',
                        '乡城县',
                        '石渠县',
                        '稻城县',
                        '色达县',
                        '巴塘县',
                        '泸定县',
                        '得荣县',
                        '其他'
                    ]
                },
                {
                    label: '凉山彝族自治州',
                    children: [
                        '西昌市',
                        '美姑县',
                        '昭觉县',
                        '金阳县',
                        '甘洛县',
                        '布拖县',
                        '雷波县',
                        '普格县',
                        '宁南县',
                        '喜德县',
                        '会东县',
                        '越西县',
                        '会理县',
                        '盐源县',
                        '德昌县',
                        '冕宁县',
                        '木里藏族自治县',
                        '其他'
                    ]
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '贵州省',
            children: [
                {
                    label: '贵阳市',
                    children: [
                        '南明区',
                        '云岩区',
                        '花溪区',
                        '乌当区',
                        '白云区',
                        '小河区',
                        '清镇市',
                        '开阳县',
                        '修文县',
                        '息烽县',
                        '其他'
                    ]
                },
                {
                    label: '六盘水市',
                    children: ['钟山区', '水城县', '盘县', '六枝特区', '其他']
                },
                {
                    label: '遵义市',
                    children: [
                        '红花岗区',
                        '汇川区',
                        '赤水市',
                        '仁怀市',
                        '遵义县',
                        '绥阳县',
                        '桐梓县',
                        '习水县',
                        '凤冈县',
                        '正安县',
                        '余庆县',
                        '湄潭县',
                        '道真仡佬族苗族自治县',
                        '务川仡佬族苗族自治县',
                        '其他'
                    ]
                },
                {
                    label: '安顺市',
                    children: [
                        '西秀区',
                        '普定县',
                        '平坝县',
                        '镇宁布依族苗族自治县',
                        '紫云苗族布依族自治县',
                        '关岭布依族苗族自治县',
                        '其他'
                    ]
                },
                {
                    label: '铜仁地区',
                    children: [
                        '铜仁市',
                        '德江县',
                        '江口县',
                        '思南县',
                        '石阡县',
                        '玉屏侗族自治县',
                        '松桃苗族自治县',
                        '印江土家族苗族自治县',
                        '沿河土家族自治县',
                        '万山特区',
                        '其他'
                    ]
                },
                {
                    label: '毕节地区',
                    children: [
                        '毕节市',
                        '黔西县',
                        '大方县',
                        '织金县',
                        '金沙县',
                        '赫章县',
                        '纳雍县',
                        '威宁彝族回族苗族自治县',
                        '其他'
                    ]
                },
                {
                    label: '黔西南布依族苗族自治州',
                    children: ['兴义市', '望谟县', '兴仁县', '普安县', '册亨县', '晴隆县', '贞丰县', '安龙县', '其他']
                },
                {
                    label: '黔东南苗族侗族自治州',
                    children: [
                        '凯里市',
                        '施秉县',
                        '从江县',
                        '锦屏县',
                        '镇远县',
                        '麻江县',
                        '台江县',
                        '天柱县',
                        '黄平县',
                        '榕江县',
                        '剑河县',
                        '三穗县',
                        '雷山县',
                        '黎平县',
                        '岑巩县',
                        '丹寨县',
                        '其他'
                    ]
                },
                {
                    label: '黔南布依族苗族自治州',
                    children: [
                        '都匀市',
                        '福泉市',
                        '贵定县',
                        '惠水县',
                        '罗甸县',
                        '瓮安县',
                        '荔波县',
                        '龙里县',
                        '平塘县',
                        '长顺县',
                        '独山县',
                        '三都水族自治县',
                        '其他'
                    ]
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '云南省',
            children: [
                {
                    label: '昆明市',
                    children: [
                        '盘龙区',
                        '五华区',
                        '官渡区',
                        '西山区',
                        '东川区',
                        '安宁市',
                        '呈贡县',
                        '晋宁县',
                        '富民县',
                        '宜良县',
                        '嵩明县',
                        '石林彝族自治县',
                        '禄劝彝族苗族自治县',
                        '寻甸回族彝族自治县',
                        '其他'
                    ]
                },
                {
                    label: '曲靖市',
                    children: ['麒麟区', '宣威市', '马龙县', '沾益县', '富源县', '罗平县', '师宗县', '陆良县', '会泽县', '其他']
                },
                {
                    label: '玉溪市',
                    children: [
                        '红塔区',
                        '江川县',
                        '澄江县',
                        '通海县',
                        '华宁县',
                        '易门县',
                        '峨山彝族自治县',
                        '新平彝族傣族自治县',
                        '元江哈尼族彝族傣族自治县',
                        '其他'
                    ]
                },
                {
                    label: '保山市',
                    children: ['隆阳区', '施甸县', '腾冲县', '龙陵县', '昌宁县', '其他']
                },
                {
                    label: '昭通市',
                    children: [
                        '昭阳区',
                        '鲁甸县',
                        '巧家县',
                        '盐津县',
                        '大关县',
                        '永善县',
                        '绥江县',
                        '镇雄县',
                        '彝良县',
                        '威信县',
                        '水富县',
                        '其他'
                    ]
                },
                {
                    label: '丽江市',
                    children: ['古城区', '永胜县', '华坪县', '玉龙纳西族自治县', '宁蒗彝族自治县', '其他']
                },
                {
                    label: '普洱市',
                    children: [
                        '思茅区',
                        '普洱哈尼族彝族自治县',
                        '墨江哈尼族自治县',
                        '景东彝族自治县',
                        '景谷傣族彝族自治县',
                        '镇沅彝族哈尼族拉祜族自治县',
                        '江城哈尼族彝族自治县',
                        '孟连傣族拉祜族佤族自治县',
                        '澜沧拉祜族自治县',
                        '西盟佤族自治县',
                        '其他'
                    ]
                },
                {
                    label: '临沧市',
                    children: [
                        '临翔区',
                        '凤庆县',
                        '云县',
                        '永德县',
                        '镇康县',
                        '双江拉祜族佤族布朗族傣族自治县',
                        '耿马傣族佤族自治县',
                        '沧源佤族自治县',
                        '其他'
                    ]
                },
                {
                    label: '德宏傣族景颇族自治州',
                    children: ['潞西市', '瑞丽市', '梁河县', '盈江县', '陇川县', '其他']
                },
                {
                    label: '怒江傈僳族自治州',
                    children: ['泸水县', '福贡县', '贡山独龙族怒族自治县', '兰坪白族普米族自治县', '其他']
                },
                {
                    label: '迪庆藏族自治州',
                    children: ['香格里拉县', '德钦县', '维西傈僳族自治县', '其他']
                },
                {
                    label: '大理白族自治州',
                    children: [
                        '大理市',
                        '祥云县',
                        '宾川县',
                        '弥渡县',
                        '永平县',
                        '云龙县',
                        '洱源县',
                        '剑川县',
                        '鹤庆县',
                        '漾濞彝族自治县',
                        '南涧彝族自治县',
                        '巍山彝族回族自治县',
                        '其他'
                    ]
                },
                {
                    label: '楚雄彝族自治州',
                    children: [
                        '楚雄市',
                        '双柏县',
                        '牟定县',
                        '南华县',
                        '姚安县',
                        '大姚县',
                        '永仁县',
                        '元谋县',
                        '武定县',
                        '禄丰县',
                        '其他'
                    ]
                },
                {
                    label: '红河哈尼族彝族自治州',
                    children: [
                        '蒙自县',
                        '个旧市',
                        '开远市',
                        '绿春县',
                        '建水县',
                        '石屏县',
                        '弥勒县',
                        '泸西县',
                        '元阳县',
                        '红河县',
                        '金平苗族瑶族傣族自治县',
                        '河口瑶族自治县',
                        '屏边苗族自治县',
                        '其他'
                    ]
                },
                {
                    label: '文山壮族苗族自治州',
                    children: ['文山县', '砚山县', '西畴县', '麻栗坡县', '马关县', '丘北县', '广南县', '富宁县', '其他']
                },
                {
                    label: '西双版纳傣族自治州',
                    children: ['景洪市', '勐海县', '勐腊县', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '西藏',
            children: [
                {
                    label: '拉萨市',
                    children: ['城关区', '林周县', '当雄县', '尼木县', '曲水县', '堆龙德庆县', '达孜县', '墨竹工卡县', '其他']
                },
                {
                    label: '那曲地区',
                    children: [
                        '那曲县',
                        '嘉黎县',
                        '比如县',
                        '聂荣县',
                        '安多县',
                        '申扎县',
                        '索县',
                        '班戈县',
                        '巴青县',
                        '尼玛县',
                        '其他'
                    ]
                },
                {
                    label: '昌都地区',
                    children: [
                        '昌都县',
                        '江达县',
                        '贡觉县',
                        '类乌齐县',
                        '丁青县',
                        '察雅县',
                        '八宿县',
                        '左贡县',
                        '芒康县',
                        '洛隆县',
                        '边坝县',
                        '其他'
                    ]
                },
                {
                    label: '林芝地区',
                    children: ['林芝县', '工布江达县', '米林县', '墨脱县', '波密县', '察隅县', '朗县', '其他']
                },
                {
                    label: '山南地区',
                    children: [
                        '乃东县',
                        '扎囊县',
                        '贡嘎县',
                        '桑日县',
                        '琼结县',
                        '曲松县',
                        '措美县',
                        '洛扎县',
                        '加查县',
                        '隆子县',
                        '错那县',
                        '浪卡子县',
                        '其他'
                    ]
                },
                {
                    label: '日喀则地区',
                    children: [
                        '日喀则市',
                        '南木林县',
                        '江孜县',
                        '定日县',
                        '萨迦县',
                        '拉孜县',
                        '昂仁县',
                        '谢通门县',
                        '白朗县',
                        '仁布县',
                        '康马县',
                        '定结县',
                        '仲巴县',
                        '亚东县',
                        '吉隆县',
                        '聂拉木县',
                        '萨嘎县',
                        '岗巴县',
                        '其他'
                    ]
                },
                {
                    label: '阿里地区',
                    children: ['噶尔县', '普兰县', '札达县', '日土县', '革吉县', '改则县', '措勤县', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '陕西省',
            children: [
                {
                    label: '西安市',
                    children: [
                        '莲湖区',
                        '新城区',
                        '碑林区',
                        '雁塔区',
                        '灞桥区',
                        '未央区',
                        '阎良区',
                        '临潼区',
                        '长安区',
                        '高陵县',
                        '蓝田县',
                        '户县',
                        '周至县',
                        '其他'
                    ]
                },
                {
                    label: '铜川市',
                    children: ['耀州区', '王益区', '印台区', '宜君县', '其他']
                },
                {
                    label: '宝鸡市',
                    children: [
                        '渭滨区',
                        '金台区',
                        '陈仓区',
                        '岐山县',
                        '凤翔县',
                        '陇县',
                        '太白县',
                        '麟游县',
                        '扶风县',
                        '千阳县',
                        '眉县',
                        '凤县',
                        '其他'
                    ]
                },
                {
                    label: '咸阳市',
                    children: [
                        '秦都区',
                        '渭城区',
                        '杨陵区',
                        '兴平市',
                        '礼泉县',
                        '泾阳县',
                        '永寿县',
                        '三原县',
                        '彬县',
                        '旬邑县',
                        '长武县',
                        '乾县',
                        '武功县',
                        '淳化县',
                        '其他'
                    ]
                },
                {
                    label: '渭南市',
                    children: [
                        '临渭区',
                        '韩城市',
                        '华阴市',
                        '蒲城县',
                        '潼关县',
                        '白水县',
                        '澄城县',
                        '华县',
                        '合阳县',
                        '富平县',
                        '大荔县',
                        '其他'
                    ]
                },
                {
                    label: '延安市',
                    children: [
                        '宝塔区',
                        '安塞县',
                        '洛川县',
                        '子长县',
                        '黄陵县',
                        '延川县',
                        '富县',
                        '延长县',
                        '甘泉县',
                        '宜川县',
                        '志丹县',
                        '黄龙县',
                        '吴起县',
                        '其他'
                    ]
                },
                {
                    label: '汉中市',
                    children: [
                        '汉台区',
                        '留坝县',
                        '镇巴县',
                        '城固县',
                        '南郑县',
                        '洋县',
                        '宁强县',
                        '佛坪县',
                        '勉县',
                        '西乡县',
                        '略阳县',
                        '其他'
                    ]
                },
                {
                    label: '榆林市',
                    children: [
                        '榆阳区',
                        '清涧县',
                        '绥德县',
                        '神木县',
                        '佳县',
                        '府谷县',
                        '子洲县',
                        '靖边县',
                        '横山县',
                        '米脂县',
                        '吴堡县',
                        '定边县',
                        '其他'
                    ]
                },
                {
                    label: '安康市',
                    children: [
                        '汉滨区',
                        '紫阳县',
                        '岚皋县',
                        '旬阳县',
                        '镇坪县',
                        '平利县',
                        '石泉县',
                        '宁陕县',
                        '白河县',
                        '汉阴县',
                        '其他'
                    ]
                },
                {
                    label: '商洛市',
                    children: ['商州区', '镇安县', '山阳县', '洛南县', '商南县', '丹凤县', '柞水县', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '甘肃省',
            children: [
                {
                    label: '兰州市',
                    children: ['城关区', '七里河区', '西固区', '安宁区', '红古区', '永登县', '皋兰县', '榆中县', '其他']
                },
                {
                    label: '嘉峪关市',
                    children: ['嘉峪关市', '其他']
                },
                {
                    label: '金昌市',
                    children: ['金川区', '永昌县', '其他']
                },
                {
                    label: '白银市',
                    children: ['白银区', '平川区', '靖远县', '会宁县', '景泰县', '其他']
                },
                {
                    label: '天水市',
                    children: ['清水县', '秦安县', '甘谷县', '武山县', '张家川回族自治县', '北道区', '秦城区', '其他']
                },
                {
                    label: '武威市',
                    children: ['凉州区', '民勤县', '古浪县', '天祝藏族自治县', '其他']
                },
                {
                    label: '酒泉市',
                    children: [
                        '肃州区',
                        '玉门市',
                        '敦煌市',
                        '金塔县',
                        '肃北蒙古族自治县',
                        '阿克塞哈萨克族自治县',
                        '安西县',
                        '其他'
                    ]
                },
                {
                    label: '张掖市',
                    children: ['甘州区', '民乐县', '临泽县', '高台县', '山丹县', '肃南裕固族自治县', '其他']
                },
                {
                    label: '庆阳市',
                    children: ['西峰区', '庆城县', '环县', '华池县', '合水县', '正宁县', '宁县', '镇原县', '其他']
                },
                {
                    label: '平凉市',
                    children: ['崆峒区', '泾川县', '灵台县', '崇信县', '华亭县', '庄浪县', '静宁县', '其他']
                },
                {
                    label: '定西市',
                    children: ['安定区', '通渭县', '临洮县', '漳县', '岷县', '渭源县', '陇西县', '其他']
                },
                {
                    label: '陇南市',
                    children: ['武都区', '成县', '宕昌县', '康县', '文县', '西和县', '礼县', '两当县', '徽县', '其他']
                },
                {
                    label: '临夏回族自治州',
                    children: [
                        '临夏市',
                        '临夏县',
                        '康乐县',
                        '永靖县',
                        '广河县',
                        '和政县',
                        '东乡族自治县',
                        '积石山保安族东乡族撒拉族自治县',
                        '其他'
                    ]
                },
                {
                    label: '甘南藏族自治州',
                    children: ['合作市', '临潭县', '卓尼县', '舟曲县', '迭部县', '玛曲县', '碌曲县', '夏河县', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '青海省',
            children: [
                {
                    label: '西宁市',
                    children: ['城中区', '城东区', '城西区', '城北区', '湟源县', '湟中县', '大通回族土族自治县', '其他']
                },
                {
                    label: '海东地区',
                    children: [
                        '平安县',
                        '乐都县',
                        '民和回族土族自治县',
                        '互助土族自治县',
                        '化隆回族自治县',
                        '循化撒拉族自治县',
                        '其他'
                    ]
                },
                {
                    label: '海北藏族自治州',
                    children: ['海晏县', '祁连县', '刚察县', '门源回族自治县', '其他']
                },
                {
                    label: '海南藏族自治州',
                    children: ['共和县', '同德县', '贵德县', '兴海县', '贵南县', '其他']
                },
                {
                    label: '黄南藏族自治州',
                    children: ['同仁县', '尖扎县', '泽库县', '河南蒙古族自治县', '其他']
                },
                {
                    label: '果洛藏族自治州',
                    children: ['玛沁县', '班玛县', '甘德县', '达日县', '久治县', '玛多县', '其他']
                },
                {
                    label: '玉树藏族自治州',
                    children: ['玉树县', '杂多县', '称多县', '治多县', '囊谦县', '曲麻莱县', '其他']
                },
                {
                    label: '海西蒙古族藏族自治州',
                    children: ['德令哈市', '格尔木市', '乌兰县', '都兰县', '天峻县', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '宁夏',
            children: [
                {
                    label: '银川市',
                    children: ['兴庆区', '西夏区', '金凤区', '灵武市', '永宁县', '贺兰县', '其他']
                },
                {
                    label: '石嘴山市',
                    children: ['大武口区', '惠农区', '平罗县', '其他']
                },
                {
                    label: '吴忠市',
                    children: ['利通区', '青铜峡市', '盐池县', '同心县', '其他']
                },
                {
                    label: '固原市',
                    children: ['原州区', '西吉县', '隆德县', '泾源县', '彭阳县', '其他']
                },
                {
                    label: '中卫市',
                    children: ['沙坡头区', '中宁县', '海原县', '其他']
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '新疆',
            children: [
                {
                    label: '乌鲁木齐市',
                    children: [
                        '天山区',
                        '沙依巴克区',
                        '新市区',
                        '水磨沟区',
                        '头屯河区',
                        '达坂城区',
                        '东山区',
                        '乌鲁木齐县',
                        '其他'
                    ]
                },
                {
                    label: '克拉玛依市',
                    children: ['克拉玛依区', '独山子区', '白碱滩区', '乌尔禾区', '其他']
                },
                {
                    label: '吐鲁番地区',
                    children: ['吐鲁番市', '托克逊县', '鄯善县', '其他']
                },
                {
                    label: '哈密地区',
                    children: ['哈密市', '伊吾县', '巴里坤哈萨克自治县', '其他']
                },
                {
                    label: '和田地区',
                    children: ['和田市', '和田县', '洛浦县', '民丰县', '皮山县', '策勒县', '于田县', '墨玉县', '其他']
                },
                {
                    label: '阿克苏地区',
                    children: [
                        '阿克苏市',
                        '温宿县',
                        '沙雅县',
                        '拜城县',
                        '阿瓦提县',
                        '库车县',
                        '柯坪县',
                        '新和县',
                        '乌什县',
                        '其他'
                    ]
                },
                {
                    label: '喀什地区',
                    children: [
                        '喀什市',
                        '巴楚县',
                        '泽普县',
                        '伽师县',
                        '叶城县',
                        '岳普湖县',
                        '疏勒县',
                        '麦盖提县',
                        '英吉沙县',
                        '莎车县',
                        '疏附县',
                        '塔什库尔干塔吉克自治县',
                        '其他'
                    ]
                },
                {
                    label: '克孜勒苏柯尔克孜自治州',
                    children: ['阿图什市', '阿合奇县', '乌恰县', '阿克陶县', '其他']
                },
                {
                    label: '巴音郭楞蒙古自治州',
                    children: [
                        '库尔勒市',
                        '和静县',
                        '尉犁县',
                        '和硕县',
                        '且末县',
                        '博湖县',
                        '轮台县',
                        '若羌县',
                        '焉耆回族自治县',
                        '其他'
                    ]
                },
                {
                    label: '昌吉回族自治州',
                    children: [
                        '昌吉市',
                        '阜康市',
                        '奇台县',
                        '玛纳斯县',
                        '吉木萨尔县',
                        '呼图壁县',
                        '木垒哈萨克自治县',
                        '米泉市',
                        '其他'
                    ]
                },
                {
                    label: '博尔塔拉蒙古自治州',
                    children: ['博乐市', '精河县', '温泉县', '其他']
                },
                {
                    label: '石河子',
                    children: ['石河子']
                },
                {
                    label: '阿拉尔',
                    children: ['阿拉尔']
                },
                {
                    label: '图木舒克',
                    children: ['图木舒克']
                },
                {
                    label: '五家渠',
                    children: ['五家渠']
                },
                {
                    label: '伊犁哈萨克自治州',
                    children: [
                        '伊宁市',
                        '奎屯市',
                        '伊宁县',
                        '特克斯县',
                        '尼勒克县',
                        '昭苏县',
                        '新源县',
                        '霍城县',
                        '巩留县',
                        '察布查尔锡伯自治县',
                        '塔城地区',
                        '阿勒泰地区',
                        '其他'
                    ]
                },
                {
                    label: '其他',
                    children: ['其他']
                }
            ]
        },
        {
            label: '台湾省',
            children: [
                {
                    label: '台北市',
                    children: [
                        '内湖区',
                        '南港区',
                        '中正区',
                        '万华区',
                        '大同区',
                        '中山区',
                        '松山区',
                        '大安区',
                        '信义区',
                        '文山区',
                        '士林区',
                        '北投区'
                    ]
                },
                {
                    label: '新北市',
                    children: ['板桥区', '汐止区', '新店区', '其他']
                },
                {
                    label: '桃园市',
                    children: ['其他']
                },
                {
                    label: '台中市',
                    children: ['其他']
                },
                {
                    label: '台南市',
                    children: ['其他']
                },
                {
                    label: '高雄市',
                    children: ['其他']
                }
            ]
        },
        {
            label: '澳门',
            children: [
                {
                    label: '澳门',
                    children: [
                        '花地玛堂区',
                        '圣安多尼堂区',
                        '大堂区',
                        '望德堂区',
                        '风顺堂区',
                        '嘉模堂区',
                        '圣方济各堂区',
                        '路凼',
                        '其他'
                    ]
                }
            ]
        },
        {
            label: '香港',
            children: [
                {
                    label: '香港',
                    children: [
                        '深水埗区',
                        '油尖旺区',
                        '九龙城区',
                        '黄大仙区',
                        '观塘区',
                        '北区',
                        '大埔区',
                        '沙田区',
                        '西贡区',
                        '元朗区',
                        '屯门区',
                        '荃湾区',
                        '葵青区',
                        '离岛区',
                        '中西区',
                        '湾仔区',
                        '东区',
                        '南区',
                        '其他'
                    ]
                }
            ]
        }
    ];
}

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PickerComponent {
    /**
     * @param {?} elementRef
     * @param {?} options
     * @param {?} _localeProviderService
     */
    constructor(elementRef, options, _localeProviderService) {
        this.elementRef = elementRef;
        this.options = options;
        this._localeProviderService = _localeProviderService;
        this.transitionName = 'am-slide-up-enter am-slide-up-enter-active';
        this.maskTransitionName = 'am-fade-enter am-fade-enter-active';
        this.address = getData();
        this.startY = 0;
        this.differY = 0;
        this.currentY = 0;
        this.len = 0;
        this.dom = null;
        this.index = 0;
        this.maxY = 0;
        this.lineHeight = 34;
        this.data = [];
        this.selectedTarget = [];
        this.isMouseDown = false;
        this.Velocity = getVelocity();
        this._unsubscribe$ = new Subject();
        this.onChange = new EventEmitter();
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panstart(event) {
        if (!event.target.classList.contains('am-picker-col-mask')) {
            return;
        }
        this.isMouseDown = true;
        event.preventDefault();
        this.dom = getEventTarget(event).target.parentElement.children[2];
        this.len = this.dom.children.length;
        this.maxY = -(this.len - 1);
        if (this.dom.style.transform === 'translateY(0px)') {
            this.currentY = 0;
            this.maxY = -(this.len - 1);
        }
        else if (this.selectedTarget.length > 0) {
            this.selectedTarget.forEach(item => {
                if (item.targetId === event.target.id) {
                    this.currentY = item.currentY;
                }
            });
        }
        this.startY = getEventTarget(event).clientY;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panmove(event) {
        if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown) {
            return;
        }
        event.preventDefault();
        /** @type {?} */
        const ev = getEventTarget(event);
        this.differY = ev.clientY - this.startY;
        this.Velocity.record(this.differY);
        this.dom.style.transition = 'transform 0s';
        this.dom.style.transform = `translateY(${this.currentY * this.lineHeight + this.differY}px)`;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panend(event) {
        if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown) {
            return;
        }
        this.isMouseDown = false;
        event.preventDefault();
        /** @type {?} */
        const ev = getEventTarget(event);
        this.differY = ev.clientY - this.startY;
        /** @type {?} */
        let time = 0.3;
        /** @type {?} */
        const velocityTemp = this.Velocity.getVelocity(this.differY) * 4;
        if (velocity) {
            this.differY = velocityTemp * 40 + this.differY;
            time = Math.abs(velocityTemp) * 0.1;
        }
        this.dom.style.transition = 'transform ' + (time < 0.3 ? 0.3 : time) + 's';
        if (this.differY <= -this.lineHeight / 2) {
            this.currentY += Math.floor(this.differY / this.lineHeight);
            if (this.currentY <= this.maxY) {
                this.currentY = this.maxY;
            }
        }
        else if (this.differY >= this.lineHeight / 2) {
            this.currentY += Math.floor(this.differY / this.lineHeight);
            if (this.currentY >= 0) {
                this.currentY = 0;
            }
        }
        if (this.selectedTarget.length > 0) {
            /** @type {?} */
            let hasKey = false;
            this.selectedTarget.forEach(item => {
                if (item.targetId === event.target.id) {
                    hasKey = true;
                    item.targetId = event.target.id;
                    item.currentY = this.currentY;
                }
                else if (parseInt(item.targetId, 0) > parseInt(event.target.id, 0) && this.options.cascade) {
                    item.currentY = 0;
                }
            });
            if (!hasKey) {
                this.selectedTarget.push({ targetId: event.target.id, currentY: this.currentY });
            }
        }
        else {
            this.selectedTarget.push({ targetId: event.target.id, currentY: this.currentY });
        }
        this.dom.style.transform = `translateY(${this.currentY * this.lineHeight}px)`;
        this.index = Math.floor(Math.abs(this.currentY / 1));
        this.setCurrentSelected(parseInt(event.target.id, 0), this.index);
        this.onChange.emit(this.combineReslut());
        this.options.onPickerChange.emit(this.combineReslut());
    }
    /**
     * @return {?}
     */
    init() {
        if (this.options.data.length > 0) {
            this.address = this.options.data;
        }
        if (this.data.length > 0) {
            this.selectedTarget = [];
            this.data = [];
        }
        this.data.push(this.generateArrayData(this.address));
        if (this.options.value.length > 0) {
            this.getInitValueIndex(this.data);
        }
        else {
            this.checkArrayDeep(this.address[0]);
            for (let index = 0; index < this.data.length; index++) {
                this.selectedTarget.push({ targetId: `${index}`, currentY: 0 });
            }
        }
    }
    /**
     * @param {?} dataTemp
     * @return {?}
     */
    getInitValueIndex(dataTemp) {
        this.selectedTarget = [];
        this.options.value.forEach((element, i) => {
            dataTemp.forEach((item, j) => {
                item.forEach((item1, k) => {
                    if (element === (item1.label || item1) && i === j) {
                        this.checkArrayDeep(this.data[i][k], false);
                        this.selectedTarget.push({ targetId: `${i}`, currentY: -k });
                    }
                });
            });
        });
    }
    /**
     * @return {?}
     */
    reloadPicker() {
        if (!this._picker || this._picker === undefined) {
            return;
        }
        this.currentPicker = this._picker.element.nativeElement;
        if (this.currentPicker && this.currentPicker.children.length > 0) {
            /** @type {?} */
            const self = this;
            setTimeout(() => {
                self.selectedTarget.forEach((item, i) => {
                    self.currentPicker.children[i].children[2].style.transition = 'transform .3s';
                    /** @type {?} */
                    const index = parseInt(item.currentY, 0);
                    self.currentPicker.children[i].children[2].style.transform = `translateY(${index * self.lineHeight}px)`;
                });
            }, 0);
        }
    }
    /**
     * @param {?} targetArr
     * @return {?}
     */
    generateArrayData(targetArr) {
        /** @type {?} */
        const tempArr = [];
        if (targetArr instanceof Array) {
            targetArr.forEach((item, i) => {
                if (item instanceof Array) {
                    /** @type {?} */
                    const keys = Object.keys(item);
                    /** @type {?} */
                    const element = {};
                    keys.forEach(key => {
                        element[key] = targetArr[i][key] || targetArr[i];
                    });
                    tempArr.push(element);
                }
                else {
                    tempArr.push(item);
                }
            });
            return tempArr;
        }
        return [];
    }
    /**
     * @param {?} parent
     * @param {?=} init
     * @return {?}
     */
    checkArrayDeep(parent, init = true) {
        if (parent instanceof Object && parent.children && parent.children.length > 0) {
            if (this.generateArrayData(parent.children).length > 0 && this.data.length < this.options.cols) {
                this.data.push(this.generateArrayData(parent.children));
                if (init) {
                    this.checkArrayDeep(parent.children[0]);
                }
            }
        }
    }
    /**
     * @return {?}
     */
    ok() {
        this.options.onOk.emit(this.combineReslut());
        if (this.options.confirm) {
            this.options.confirm(this.combineReslut());
        }
        this.setTransitionName();
    }
    /**
     * @return {?}
     */
    combineReslut() {
        /** @type {?} */
        const result = [];
        this.selectedTarget.forEach(item => {
            result.push(this.data[parseInt(item.targetId, 0)][-item.currentY]);
        });
        return result;
    }
    /**
     * @return {?}
     */
    cancel() {
        this.setTransitionName();
        this.options.onDismiss.emit();
        if (this.options.cancel) {
            this.options.cancel();
        }
    }
    /**
     * @return {?}
     */
    setTransitionName() {
        this.transitionName = 'am-slide-up-leave am-slide-up-leave-active';
        this.maskTransitionName = 'am-fade-leave am-fade-leave-active';
        setTimeout(() => {
            this.options.hidePicker();
        }, 200);
    }
    /**
     * @param {?} target
     * @param {?} index
     * @return {?}
     */
    setCurrentSelected(target, index) {
        if (!this.options.cascade) {
            return;
        }
        /** @type {?} */
        const a = this.data.slice(0, target + 1);
        this.data = a;
        this.checkArrayDeep(this.data[target][index]);
        setTimeout(() => {
            this.data.forEach((item, i) => {
                if (target !== `${i}` && i > target) {
                    this._picker.element.nativeElement.children[i].children[2].style.transition = 'transform .3s';
                    this._picker.element.nativeElement.children[i].children[2].style.transform = 'translateY(0px)';
                }
            });
        }, 0);
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.init();
        this._localeProviderService.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe(_ => {
            /** @type {?} */
            const locale = this._localeProviderService.getLocaleSubObj('Picker');
            this.options.okText = locale.okText;
            this.options.dismissText = locale.dismissText;
        });
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        this.reloadPicker();
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this._unsubscribe$.next();
        this._unsubscribe$.complete();
    }
}
PickerComponent.decorators = [
    { type: Component, args: [{
                selector: 'Picker',
                template: "<div *ngIf=\"options.mask\" class=\"am-picker-popup-mask {{maskTransitionName}}\" (click)=\"cancel()\"></div>\n<div class=\"am-picker-popup {{transitionName}}\" style=\"z-index: 1001\">\n  <div class=\"am-picker-popup-content\">\n    <div class=\"am-picker-popup-body\">\n      <div>\n        <div class=\"am-picker-popup-header\">\n          <div class=\"am-picker-popup-item am-picker-popup-header-left\" (click)=\"cancel()\">{{options.dismissText}}</div>\n          <div class=\"am-picker-popup-item am-picker-popup-title\">{{options.title}}</div>\n          <div class=\"am-picker-popup-item am-picker-popup-header-right\" (click)=\"ok()\">{{options.okText}}</div>\n        </div>\n        <div class=\"am-picker\" style=\"flex-direction: row; align-items: center;\" #picker>\n          <div *ngFor=\"let item of data; let i = index\" class=\"am-picker-col\">\n            <div class=\"am-picker-col-indicator \" style=\"top: 102px;\" [ngStyle]=\"options.indicatorStyle\"></div>\n            <div class=\"am-picker-col-mask\" style=\"background-size: 100% 102px;\" id={{i}}></div>\n            <div class=\"am-picker-col-content\">\n              <div *ngFor=\"let val of item; let i = index\" class=\"am-picker-col-item\" id={{i}}>{{val.label?val.label:val}}</div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
PickerComponent.ctorParameters = () => [
    { type: ElementRef },
    { type: PickerOptions },
    { type: LocaleProviderService }
];
PickerComponent.propDecorators = {
    _picker: [{ type: ViewChild, args: ['picker', { read: ViewContainerRef },] }],
    onChange: [{ type: Output }],
    panstart: [{ type: HostListener, args: ['mousedown', ['$event'],] }, { type: HostListener, args: ['touchstart', ['$event'],] }],
    panmove: [{ type: HostListener, args: ['mousemove', ['$event'],] }, { type: HostListener, args: ['touchmove', ['$event'],] }],
    panend: [{ type: HostListener, args: ['mouseup', ['$event'],] }, { type: HostListener, args: ['mouseleave', ['$event'],] }, { type: HostListener, args: ['touchend', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PickerDirective {
    /**
     * @param {?} _viewContainerRef
     * @param {?} _elm
     * @param {?} _defaultOptions
     * @param {?} _cfr
     * @param {?} _renderer
     */
    constructor(_viewContainerRef, _elm, _defaultOptions, _cfr, _renderer) {
        this._viewContainerRef = _viewContainerRef;
        this._elm = _elm;
        this._defaultOptions = _defaultOptions;
        this._cfr = _cfr;
        this._renderer = _renderer;
        this._eventListeners = [];
        this.onVisibleChange = new EventEmitter(true);
        this.onPickerChange = new EventEmitter();
        this.onOk = new EventEmitter();
        this.onDismiss = new EventEmitter();
    }
    /**
     * @return {?}
     */
    togglePicker() {
        if (!this.picker) {
            this.showPicker();
        }
        else {
            this.hidePicker();
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.onVisibleChange.emit(false);
    }
    /**
     * @param {?} changes
     * @return {?}
     */
    ngOnChanges(changes) {
        if (changes["isOpen"]) {
            if (changes["isOpen"].currentValue === true) {
                this.showPicker();
            }
            else {
                this.hidePicker();
            }
        }
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this.hidePicker();
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onDocumentClick(event) {
        if (this.picker &&
            !this._elm.nativeElement.contains(event.target) &&
            !this.picker.location.nativeElement.contains(event.target)) {
            this.hidePicker();
        }
    }
    /**
     * @return {?}
     */
    showPicker() {
        if (!this.picker) {
            setTimeout(() => {
                this._eventListeners = [
                    this._renderer.listen('document', 'click', (event) => this.onDocumentClick(event)),
                    this._renderer.listen('document', 'touchend', (event) => this.onDocumentClick(event))
                ];
            });
            /** @type {?} */
            const options = new PickerOptions();
            Object.assign(options, this._defaultOptions, {
                hidePicker: (event) => {
                    this.hidePicker();
                }
            });
            /** @type {?} */
            const optionalParams = [
                'data',
                'value',
                'cols',
                'mask',
                'title',
                'okText',
                'dismissText',
                'disabled',
                'cascade',
                'appendToBody',
                'indicatorStyle',
                'onOk',
                'onPickerChange'
            ];
            optionalParams.forEach(param => {
                if (typeof this[param] !== 'undefined') {
                    (/** @type {?} */ (options))[param] = this[param];
                }
            });
            /** @type {?} */
            const componentFactory = this._cfr.resolveComponentFactory(PickerComponent);
            /** @type {?} */
            const childInjector = Injector.create([
                {
                    provide: PickerOptions,
                    useValue: options
                }
            ]);
            this.picker = this._viewContainerRef.createComponent(componentFactory, this._viewContainerRef.length, childInjector);
            if (options.appendToBody) {
                document.body.appendChild(this.picker.location.nativeElement);
            }
            this.onVisibleChange.emit(true);
        }
    }
    /**
     * @return {?}
     */
    hidePicker() {
        if (this.picker) {
            this.picker.destroy();
            delete this.picker;
            this.onVisibleChange.emit(false);
            this._eventListeners.forEach(fn => fn());
            this._eventListeners = [];
        }
    }
}
PickerDirective.decorators = [
    { type: Directive, args: [{
                selector: '[Picker], [nzm-picker]'
            },] }
];
/** @nocollapse */
PickerDirective.ctorParameters = () => [
    { type: ViewContainerRef },
    { type: ElementRef },
    { type: PickerOptions },
    { type: ComponentFactoryResolver },
    { type: Renderer2 }
];
PickerDirective.propDecorators = {
    data: [{ type: Input }],
    value: [{ type: Input }],
    cols: [{ type: Input }],
    mask: [{ type: Input }],
    title: [{ type: Input }],
    visible: [{ type: Input }],
    okText: [{ type: Input }],
    dismissText: [{ type: Input }],
    disabled: [{ type: Input }],
    cascade: [{ type: Input }],
    appendToBody: [{ type: Input }],
    indicatorStyle: [{ type: Input }],
    onVisibleChange: [{ type: Output }],
    onPickerChange: [{ type: Output }],
    onOk: [{ type: Output }],
    onDismiss: [{ type: Output }],
    togglePicker: [{ type: HostListener, args: ['click',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PickerModule {
}
PickerModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, CoreModule],
                exports: [PickerComponent, PickerDirective],
                declarations: [PickerComponent, PickerDirective],
                providers: [PickerOptions],
                entryComponents: [PickerComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PickerViewComponent extends PickerComponent {
    constructor() {
        super(...arguments);
        this.data = [];
        this.value = [];
        this.cols = 3;
        this.indicatorStyle = {};
        this.itemStyle = {};
        this.onChange = new EventEmitter();
    }
    /**
     * @return {?}
     */
    pickerViewInit() {
        this.options.data = this.data;
        this.options.value = this.value;
        this.options.cols = this.cols;
        this.options.cascade = this.cascade;
        this.init();
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.pickerViewInit();
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        this.currentPicker = this.elementRef.nativeElement;
        this.reloadPicker();
    }
}
PickerViewComponent.decorators = [
    { type: Component, args: [{
                selector: 'PickerView, nzm-picker-view',
                template: "<div #picker class=\"am-picker\" style=\"flex-direction: row; align-items: center;\">\n  <div *ngFor=\"let item of data; let i = index\" class=\"am-picker-col\">\n    <div #indicator class=\"am-picker-col-indicator \" [ngStyle]=\"indicatorStyle\"></div>\n    <div id={{i}} class=\"am-picker-col-mask\" style=\"background-size: 100% 102px;\"></div>\n    <div class=\"am-picker-col-content\">\n      <div *ngFor=\"let val of item; let i = index\"\n           id={{i}}\n           class=\"am-picker-col-item\"\n           [ngStyle]=\"itemStyle\"\n      >\n        {{val.label?val.label:val}}\n      </div>\n    </div>\n  </div>\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
PickerViewComponent.propDecorators = {
    data: [{ type: Input }],
    value: [{ type: Input }],
    cols: [{ type: Input }],
    cascade: [{ type: Input }],
    indicatorStyle: [{ type: Input }],
    itemStyle: [{ type: Input }],
    onChange: [{ type: Output }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PickerViewModule {
}
PickerViewModule.decorators = [
    { type: NgModule, args: [{
                imports: [
                    CommonModule
                ],
                exports: [PickerViewComponent],
                declarations: [PickerViewComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ImagePicker {
    constructor() {
        this.prefixCls = 'am-image-picker';
        this.flexEl = [];
        this._accept = 'image/*';
        this._count = 4;
        this._selectable = true;
        this._files = [];
        this._multiple = false;
        this.onFail = new EventEmitter();
        this.onChange = new EventEmitter();
        this.onImageClick = new EventEmitter();
        this.onAddImageClick = new EventEmitter();
    }
    /**
     * @return {?}
     */
    get files() {
        return this._files;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set files(value) {
        this._files = value;
        this.sortItem();
    }
    /**
     * @return {?}
     */
    get accept() {
        return this._accept;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set accept(value) {
        this._accept = value;
        this.sortItem();
    }
    /**
     * @return {?}
     */
    get length() {
        return this._count;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set length(value) {
        if (value > 0) {
            this._count = value;
        }
        else {
            this._count = 4;
        }
        this.sortItem();
    }
    /**
     * @return {?}
     */
    get multiple() {
        return this._multiple;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set multiple(value) {
        this._multiple = value;
        this.sortItem();
    }
    /**
     * @return {?}
     */
    get selectable() {
        return this._selectable;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set selectable(value) {
        this._selectable = value;
        this.sortItem();
    }
    /**
     * @return {?}
     */
    sortItem() {
        if (!this._files) {
            return;
        }
        /** @type {?} */
        let count = parseInt('' + this._count, 10);
        if (count <= 0) {
            count = 4;
        }
        /** @type {?} */
        let allEl = this._files.map(item => {
            return {
                type: 'img',
                backgroundImage: 'url(' + item.url + ')',
                transform: 'rotate(' + this.getRotation(item.orientation) + ')deg'
            };
        });
        if (this._selectable) {
            allEl.push({
                type: 'select',
                backgroundImage: '',
                transform: ''
            });
        }
        /** @type {?} */
        const length = allEl.length;
        if (length !== 0 && length % count !== 0) {
            /** @type {?} */
            const blankCount = count - (length % count);
            /** @type {?} */
            const fillBlankEl = [];
            for (let i = 0; i < blankCount; i++) {
                fillBlankEl.push({
                    type: 'white',
                    backgroundImage: '',
                    transform: ''
                });
            }
            allEl = allEl.concat(fillBlankEl);
        }
        this.flexEl = [];
        for (let i = 0; i < allEl.length / count; i++) {
            /** @type {?} */
            const rowEl = allEl.slice(i * count, i * count + count);
            this.flexEl.push(rowEl);
        }
    }
    /**
     * @param {?} imgItem
     * @return {?}
     */
    addImage(imgItem) {
        this._files.push({
            type: 'img',
            url: imgItem.url,
            orientation: imgItem.orientation
        });
        this.sortItem();
        this.onChange.emit({
            files: this._files,
            operationType: 'add',
            index: this._files.length - 1
        });
    }
    /**
     * @param {?} index
     * @return {?}
     */
    removeImage(index) {
        this._files.splice(index, 1);
        this.sortItem();
        this.onChange.emit({
            files: this._files,
            operationType: 'remove',
            index: index
        });
    }
    /**
     * @param {?} index
     * @return {?}
     */
    imageClick(index) {
        this.onImageClick.emit({
            index: index,
            files: this._files
        });
    }
    /**
     * @param {?} e
     * @return {?}
     */
    addImageClick(e) {
        this.onAddImageClick.emit(e);
    }
    /**
     * @param {?} file
     * @param {?} index
     * @return {?}
     */
    parseFile(file, index) {
        /** @type {?} */
        const reader = new FileReader();
        reader.onload = e => {
            /** @type {?} */
            const dataURL = (/** @type {?} */ (e.target)).result;
            if (!dataURL) {
                this.onFail.emit(`Fail to get the ${index} image`);
                return;
            }
            /** @type {?} */
            let orientation = 1;
            this.getOrientation(file, res => {
                // -2: not jpeg , -1: not defined
                if (res > 0) {
                    orientation = res;
                }
                this.addImage({
                    url: dataURL,
                    orientation,
                    file
                });
            });
        };
        reader.readAsDataURL(file);
    }
    /**
     * @param {?} event
     * @return {?}
     */
    fileChange(event) {
        /** @type {?} */
        const fileList = event.target.files;
        if (fileList && fileList.length) {
            for (let i = 0; i < fileList.length; i++) {
                this.parseFile(fileList[i], i);
            }
        }
    }
    /**
     * @param {?=} orientation
     * @return {?}
     */
    getRotation(orientation = 1) {
        /** @type {?} */
        let imgRotation = 0;
        switch (orientation) {
            case 3:
                imgRotation = 180;
                break;
            case 6:
                imgRotation = 90;
                break;
            case 8:
                imgRotation = 270;
                break;
            default:
        }
        return imgRotation;
    }
    /**
     * @param {?} file
     * @param {?} callback
     * @return {?}
     */
    getOrientation(file, callback) {
        /** @type {?} */
        const reader = new FileReader();
        reader.onload = e => {
            /** @type {?} */
            const view = new DataView((/** @type {?} */ (e.target)).result);
            if (view.getUint16(0, false) !== 0xffd8) {
                return callback(-2);
            }
            /** @type {?} */
            const length = view.byteLength;
            /** @type {?} */
            let offset = 2;
            while (offset < length) {
                /** @type {?} */
                const marker = view.getUint16(offset, false);
                offset += 2;
                if (marker === 0xffe1) {
                    /** @type {?} */
                    const tmp = view.getUint32((offset += 2), false);
                    if (tmp !== 0x45786966) {
                        return callback(-1);
                    }
                    /** @type {?} */
                    const little = view.getUint16((offset += 6), false) === 0x4949;
                    offset += view.getUint32(offset + 4, little);
                    /** @type {?} */
                    const tags = view.getUint16(offset, little);
                    offset += 2;
                    for (let i = 0; i < tags; i++) {
                        if (view.getUint16(offset + i * 12, little) === 0x0112) {
                            return callback(view.getUint16(offset + i * 12 + 8, little));
                        }
                    }
                }
                else if ((marker & 0xff00) !== 0xff00) {
                    break;
                }
                else {
                    offset += view.getUint16(offset, false);
                }
            }
            return callback(-1);
        };
        reader.readAsArrayBuffer(file.slice(0, 64 * 1024));
    }
}
ImagePicker.decorators = [
    { type: Component, args: [{
                selector: 'ImagePicker, nzm-image-picker',
                template: "<div class=\"{{prefixCls}}-list\" role=\"group\">\n  <Flex *ngFor=\"let rowItem of flexEl;let i = index;\">\n    <FlexItem *ngFor=\"let item of rowItem;let j =index;\">\n      <div *ngIf=\"item && 'img' === item.type && item.backgroundImage\" class=\"{{prefixCls}}-item\">\n        <div role=\"button\"\n             aria-label=\"Click and Remove this image\"\n             class=\"{{prefixCls}}-item-remove\"\n             (click)=\"removeImage(i * length + j)\"\n        ></div>\n        <div role=\"button\"\n             aria-label=\"Image can be clicked\"\n             class=\"{{prefixCls}}-item-content\"\n             [ngStyle]=\"{'background-image': item.backgroundImage, 'transform': item.transform}\"\n             (click)=\"imageClick(i * length + j)\"\n        ></div>\n      </div>\n      <div role=\"button\"\n           aria-label=\"Choose and add image\"\n           *ngIf=\"item && 'select' === item.type\"\n           class=\"{{prefixCls}}-item {{prefixCls}}-upload-btn\"\n           (click)=\"addImageClick($event)\"\n      >\n        <input #fileSelectorInput\n               type=\"file\"\n               [accept]=\"accept\"\n               [multiple]=\"multiple\"\n               (change)=\"fileChange($event)\"\n        />\n      </div>\n      <div *ngIf=\"item && 'white' === item.type\" class=\"{{prefixCls}}-item-white\">\n      </div>\n    </FlexItem>\n  </Flex>\n</div>\n"
            }] }
];
/** @nocollapse */
ImagePicker.ctorParameters = () => [];
ImagePicker.propDecorators = {
    _fileSelectorInput: [{ type: ViewChild, args: ['fileSelectorInput', { read: ViewContainerRef },] }],
    files: [{ type: Input }],
    accept: [{ type: Input }],
    length: [{ type: Input }],
    multiple: [{ type: Input }],
    selectable: [{ type: Input }],
    onFail: [{ type: Output }],
    onChange: [{ type: Output }],
    onImageClick: [{ type: Output }],
    onAddImageClick: [{ type: Output }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ImagePickerModule {
}
ImagePickerModule.decorators = [
    { type: NgModule, args: [{
                declarations: [ImagePicker],
                exports: [ImagePicker],
                imports: [CommonModule, FlexModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Result {
    constructor() {
        this.prefixCls = 'am-result';
        this.isTitleString = true;
        this.isMessageString = true;
        this.onButtonClick = new EventEmitter();
        this.role = 'alert';
        this.amResult = true;
    }
    /**
     * @return {?}
     */
    get title() {
        return this._title;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set title(value) {
        if (this.isTemplateRef(value)) {
            this.isTitleString = false;
        }
        else {
            this.isTitleString = true;
        }
        this._title = value;
    }
    /**
     * @return {?}
     */
    get message() {
        return this._message;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set message(value) {
        if (this.isTemplateRef(value)) {
            this.isMessageString = false;
        }
        else {
            this.isMessageString = true;
        }
        this._message = value;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    buttonClick(event) {
        this.onButtonClick.emit(event);
    }
    /**
     * @param {?} value
     * @return {?}
     */
    isTemplateRef(value) {
        if (value) {
            return value instanceof TemplateRef;
        }
        return false;
    }
}
Result.decorators = [
    { type: Component, args: [{
                selector: 'Result, nzm-result',
                template: "<div *ngIf=\"img\" class=\"{{prefixCls}}-pic\">\n  <ng-template [ngTemplateOutlet]=\"img\"></ng-template>\n</div>\n<div *ngIf=\"!img && imgUrl\"\n     class=\"{{prefixCls}}-pic\"\n     [ngStyle]=\"{ backgroundImage: 'url('+ imgUrl +')' }\"\n></div>\n<div *ngIf=\"title\" class=\"{{prefixCls}}-title\">\n  <ng-template *ngIf=\"!isTitleString\" [ngTemplateOutlet]=\"title\"></ng-template>\n  <span *ngIf=\"isTitleString\">{{title}}</span>\n</div>\n<div [ngClass]=\"prefixCls+'-message'\">\n  <ng-template *ngIf=\"!isMessageString\" [ngTemplateOutlet]=\"message\"></ng-template>\n  <span *ngIf=\"isMessageString\">{{message}}</span>\n</div>\n<div *ngIf=\"buttonText\" class=\"{{prefixCls}}-button\">\n  <a Button [type]=\"buttonType\" (click)=\"buttonClick($event)\">\n    {{buttonText}}\n  </a>\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
Result.ctorParameters = () => [];
Result.propDecorators = {
    title: [{ type: Input }],
    imgUrl: [{ type: Input }],
    buttonText: [{ type: Input }],
    buttonType: [{ type: Input }],
    img: [{ type: Input }],
    message: [{ type: Input }],
    onButtonClick: [{ type: Output }],
    role: [{ type: HostBinding, args: ['attr.role',] }],
    amResult: [{ type: HostBinding, args: ['class.am-result',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ResultModule {
}
ResultModule.decorators = [
    { type: NgModule, args: [{
                declarations: [Result],
                exports: [Result],
                imports: [CommonModule, IconModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Range {
    /**
     * @param {?} _elf
     */
    constructor(_elf) {
        this._elf = _elf;
        this.prefixCls = 'am-slider';
        this.offset = [];
        this.length = [];
        this._min = 0;
        this._max = 100;
        this._step = 1;
        this._defaultValue = [0, 0, 0];
        this._disabled = false;
        this._marks = {};
        this._dots = false;
        this._included = true;
        this._count = 1;
        this._allowCross = true;
        this._handleStyle = [];
        this._trackStyle = [];
        this.onChange = new EventEmitter();
        this.onAfterChange = new EventEmitter();
        this.amWrapper = true;
    }
    /**
     * @return {?}
     */
    get min() {
        return this._min;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set min(value) {
        this._min = value;
    }
    /**
     * @return {?}
     */
    get max() {
        return this._max;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set max(value) {
        this._max = value;
    }
    /**
     * @return {?}
     */
    get step() {
        return this._step;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set step(value) {
        this._step = value;
    }
    /**
     * @return {?}
     */
    get value() {
        return this._value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set value(value) {
        this._value = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set defaultValue(value) {
        this._defaultValue = value;
        this._value = this._defaultValue;
    }
    /**
     * @return {?}
     */
    get disabled() {
        return this._disabled;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        this._disabled = value;
    }
    /**
     * @return {?}
     */
    get marks() {
        return this._marks;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set marks(value) {
        this._marks = value;
    }
    /**
     * @return {?}
     */
    get dots() {
        return this._dots;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set dots(value) {
        this._dots = value;
    }
    /**
     * @return {?}
     */
    get included() {
        return this._included;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set included(value) {
        this._included = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set count(value) {
        this._count = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set allowCross(value) {
        this._allowCross = value;
        this.setValueBound();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set pushable(value) {
        this._pushable = value;
        if (this.verifyPushable()) {
            this.setValueBound();
        }
    }
    /**
     * @return {?}
     */
    get handleStyle() {
        return this._handleStyle;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set handleStyle(value) {
        this._handleStyle = value;
    }
    /**
     * @return {?}
     */
    get trackStyle() {
        return this._trackStyle;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set trackStyle(value) {
        this._trackStyle = value;
    }
    /**
     * @return {?}
     */
    get railStyle() {
        return this._railStyle;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set railStyle(value) {
        this._railStyle = value;
    }
    /**
     * @return {?}
     */
    setCls() {
        this.sliderCls = {
            [`${this.prefixCls}-disabled`]: this._disabled
        };
    }
    /**
     * @return {?}
     */
    initialValue() {
        /** @type {?} */
        const minTemp = this._min;
        /** @type {?} */
        const initialValue = Array.apply(null, Array(this._count + 1)).map(function () {
            return minTemp;
        });
        this._defaultValue = this._defaultValue !== undefined ? this._defaultValue : initialValue;
        this._value = this._value !== undefined ? this._value : this._defaultValue;
        if (this._count > 0) {
            this.upperBound = Math.max(...this._value);
            this.lowerBound = Math.min(...this._value);
        }
    }
    /**
     * @param {?} e
     * @param {?} i
     * @return {?}
     */
    handleChange(e, i) {
        /** @type {?} */
        let temp = [...this._value];
        if (typeof this._pushable === 'boolean' && this._pushable) {
            /** @type {?} */
            const diff = e - this._value[i];
            temp = temp.map(v => (v = v + diff));
        }
        else {
            temp[i] = e;
        }
        this.upperBound = Math.max(...temp);
        this.lowerBound = Math.min(...temp);
        this.setTrackStyle(temp);
        this.onChange.emit(temp);
    }
    /**
     * @param {?} e
     * @param {?} i
     * @return {?}
     */
    handleAfterChange(e, i) {
        setTimeout(() => {
            this._value[i] = e;
            this.upperBound = Math.max(...this._value);
            this.lowerBound = Math.min(...this._value);
            this.setTrackStyle(this._value);
            this.onAfterChange.emit(this._value);
            this.setValueBound();
        }, 0);
    }
    /**
     * @param {?} value
     * @return {?}
     */
    setTrackStyle(value) {
        if (value && value.length === this._count + 1) {
            value.sort((a, b) => a - b);
            for (let i = 0; i < this._count; i++) {
                this.offset[i] = (value[i] * 100) / (this._max - this._min);
                this.length[i] = ((value[i + 1] - value[i]) * 100) / (this._max - this._min);
            }
        }
    }
    /**
     * @return {?}
     */
    setValueBound() {
        this.maxBound = [];
        this.minBound = [];
        if (this._allowCross || this._handleCount <= 1) {
            for (let i = 0; i < this._handleCount; i++) {
                this.maxBound[i] = this._max;
                this.minBound[i] = this._min;
            }
        }
        else {
            if (typeof this._pushable !== 'number' || (typeof this._pushable === 'boolean' && this._pushable)) {
                this._pushable = 0;
            }
            for (let i = 0; i < this._handleCount; i++) {
                this.maxBound[i] = i === this._handleCount - 1 ? this._max : this._value[i + 1] - this._pushable;
                this.minBound[i] = i === 0 ? this._min : this._value[i - 1] + this._pushable;
            }
        }
    }
    /**
     * @return {?}
     */
    verifyPushable() {
        if (typeof this._pushable === 'number') {
            for (let i = 1; i < this._handleCount; i++) {
                /** @type {?} */
                const diff = this._value[i] - this._value[i - 1];
                if (diff < this._pushable) {
                    return false;
                }
            }
        }
        return true;
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        if (this._max === undefined || this._min === undefined) {
            return;
        }
        if (this.verifyPushable()) {
            this.setValueBound();
            this._handleCount = this._count + 1;
            this.setCls();
            /** @type {?} */
            const sliderCoords = this._elf.nativeElement.getElementsByClassName('am-slider')[0].getBoundingClientRect();
            this.sliderLength = sliderCoords.width;
            this.sliderStart = sliderCoords.left;
            this.initialValue();
        }
    }
}
Range.decorators = [
    { type: Component, args: [{
                selector: 'Range , nzm-range',
                template: "<div class=\"am-slider\" [ngClass]=\"sliderCls\">\n  <div class=\"am-slider-rail\" [ngStyle]=\"railStyle\"></div>\n  <SliderTrack *ngFor=\"let off of offset ; let i = index\"\n               [className]=\"'am-slider-track'\"\n               [included]=\"included\"\n               [style]=\"trackStyle[i]\"\n               [offset]=\"off\"\n               [length]=\"length[i]\"\n  ></SliderTrack>\n  <SliderSteps [max]=\"max\"\n               [min]=\"min\"\n               [dots]=\"dots\"\n               [step]=\"step\"\n               [marks]=\"marks\"\n               [upperBound]=\"upperBound\"\n               [lowerBound]=\"lowerBound\"\n  ></SliderSteps>\n  <SliderHandle *ngFor=\"let val of value ; let i = index\"\n                [max]=\"max\"\n                [min]=\"min\"\n                [maxBound]=\"maxBound[i]\"\n                [minBound]=\"minBound[i]\"\n                [value]=\"val\"\n                [step]=\"step\"\n                [disabled]=\"disabled\"\n                [sliderLength]=\"sliderLength\"\n                [sliderStart]=\"sliderStart\"\n                [handleStyle]=\"handleStyle[i]\"\n                (onChange)=\"handleChange($event , i)\"\n                (onAfterChange)=\"handleAfterChange($event , i)\"\n  ></SliderHandle>\n  <SliderMarks [max]=\"max\"\n               [min]=\"min\"\n               [marks]=\"marks\"\n               [upperBound]=\"upperBound\"\n               [lowerBound]=\"lowerBound\"\n  ></SliderMarks>\n</div>\n"
            }] }
];
/** @nocollapse */
Range.ctorParameters = () => [
    { type: ElementRef }
];
Range.propDecorators = {
    min: [{ type: Input }],
    max: [{ type: Input }],
    step: [{ type: Input }],
    value: [{ type: Input }],
    defaultValue: [{ type: Input }],
    disabled: [{ type: Input }],
    marks: [{ type: Input }],
    dots: [{ type: Input }],
    included: [{ type: Input }],
    count: [{ type: Input }],
    allowCross: [{ type: Input }],
    pushable: [{ type: Input }],
    handleStyle: [{ type: Input }],
    trackStyle: [{ type: Input }],
    railStyle: [{ type: Input }],
    onChange: [{ type: Output }],
    onAfterChange: [{ type: Output }],
    amWrapper: [{ type: HostBinding, args: ['class.am-slider-wrapper',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Slider {
    /**
     * @param {?} _elf
     */
    constructor(_elf) {
        this._elf = _elf;
        this.prefixCls = 'am-slider';
        this.offset = 0;
        this.length = 0;
        this._min = 0;
        this._max = 100;
        this._step = 1;
        this._value = 10;
        this._disabled = false;
        this._marks = {};
        this._dots = false;
        this._included = true;
        this._trackStyle = {};
        this.onChange = new EventEmitter();
        this.onAfterChange = new EventEmitter();
        this.amSliderWrapper = true;
    }
    /**
     * @return {?}
     */
    get min() {
        return this._min;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set min(value) {
        this._min = value;
    }
    /**
     * @return {?}
     */
    get max() {
        return this._max;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set max(value) {
        this._max = value;
    }
    /**
     * @return {?}
     */
    get step() {
        return this._step;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set step(value) {
        this._step = value;
    }
    /**
     * @return {?}
     */
    get value() {
        return this._value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set value(value) {
        this._value = value;
        this.valueRange();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set defaultValue(value) {
        this._defaultValue = value;
        this._value = this._defaultValue;
    }
    /**
     * @return {?}
     */
    get disabled() {
        return this._disabled;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        this._disabled = value;
        this.setCls();
    }
    /**
     * @return {?}
     */
    get marks() {
        return this._marks;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set marks(value) {
        this._marks = value;
    }
    /**
     * @return {?}
     */
    get dots() {
        return this._dots;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set dots(value) {
        this._dots = value;
    }
    /**
     * @return {?}
     */
    get included() {
        return this._included;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set included(value) {
        this._included = value;
    }
    /**
     * @return {?}
     */
    get handleStyle() {
        return this._handleStyle;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set handleStyle(value) {
        this._handleStyle = value;
    }
    /**
     * @return {?}
     */
    get trackStyle() {
        return this._trackStyle;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set trackStyle(value) {
        this._trackStyle = value;
    }
    /**
     * @return {?}
     */
    get railStyle() {
        return this._railStyle;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set railStyle(value) {
        this._railStyle = value;
    }
    /**
     * @return {?}
     */
    setCls() {
        this.sliderCls = {
            [`${this.prefixCls}-disabled`]: this._disabled
        };
    }
    /**
     * @param {?} e
     * @return {?}
     */
    handleChange(e) {
        setTimeout(() => {
            this.offset = 0;
            this.length = ((e - this._min) * 100) / (this._max - this._min);
            this._value = e;
        }, 10);
        this.onChange.emit(e);
    }
    /**
     * @param {?} e
     * @return {?}
     */
    handleAfterChange(e) {
        setTimeout(() => {
            this.offset = 0;
            this.length = ((e - this._min) * 100) / (this._max - this._min);
            this._value = e;
        }, 10);
        this.onAfterChange.emit(e);
    }
    /**
     * @return {?}
     */
    valueRange() {
        if (this._value < this._min) {
            this._value = this._min;
        }
        if (this._value > this._max) {
            this._value = this._max;
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.setCls();
        this.valueRange();
        /** @type {?} */
        const sliderCoords = this._elf.nativeElement.getElementsByClassName('am-slider')[0].getBoundingClientRect();
        this.sliderLength = sliderCoords.width;
        this.sliderStart = sliderCoords.left;
    }
}
Slider.decorators = [
    { type: Component, args: [{
                selector: 'Slider , nzm-slider',
                template: "<div class=\"am-slider\" [ngClass]=\"sliderCls\">\n  <div class=\"am-slider-rail\" [ngStyle]=\"railStyle\"></div>\n  <SliderTrack [className]=\"'am-slider-track'\"\n               [style]=\"trackStyle\"\n               [offset]=\"offset\"\n               [length]=\"length\"\n               [included]=\"included\"\n  ></SliderTrack>\n  <SliderSteps [max]=\"max\"\n               [min]=\"min\"\n               [dots]=\"dots\"\n               [step]=\"step\"\n               [marks]=\"marks\"\n               [lowerBound]=\"min\"\n               [upperBound]=\"value\"\n               [included]=\"included\"\n  ></SliderSteps>\n  <SliderHandle [max]=\"max\"\n                [min]=\"min\"\n                [value]=\"value\"\n                [step]=\"step\"\n                [disabled]=\"disabled\"\n                [handleStyle]=\"handleStyle\"\n                [sliderStart]=\"sliderStart\"\n                [sliderLength]=\"sliderLength\"\n                (onChange)=\"handleChange($event)\"\n                (onAfterChange)=\"handleAfterChange($event)\"\n  ></SliderHandle>\n  <SliderMarks [max]=\"max\"\n               [min]=\"min\"\n               [marks]=\"marks\"\n               [lowerBound]=\"min\"\n               [upperBound]=\"value\"\n               [included]=\"included\"\n  ></SliderMarks>\n</div>",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
Slider.ctorParameters = () => [
    { type: ElementRef }
];
Slider.propDecorators = {
    min: [{ type: Input }],
    max: [{ type: Input }],
    step: [{ type: Input }],
    value: [{ type: Input }],
    defaultValue: [{ type: Input }],
    disabled: [{ type: Input }],
    marks: [{ type: Input }],
    dots: [{ type: Input }],
    included: [{ type: Input }],
    handleStyle: [{ type: Input }],
    trackStyle: [{ type: Input }],
    railStyle: [{ type: Input }],
    onChange: [{ type: Output }],
    onAfterChange: [{ type: Output }],
    amSliderWrapper: [{ type: HostBinding, args: ['class.am-slider-wrapper',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SliderHandle {
    /**
     * @param {?} _elf
     * @param {?} _sanitizer
     */
    constructor(_elf, _sanitizer) {
        this._elf = _elf;
        this._sanitizer = _sanitizer;
        this._disabled = false;
        this._marks = {};
        this._isDraging = false;
        this.onChange = new EventEmitter();
        this.onAfterChange = new EventEmitter();
        this.mouseDown = event => {
            if (!this._disabled && this.isMouseTarget(event)) {
                this._startX = event.clientX;
                this._handleStatus = 'start';
                this._isDraging = true;
                document.addEventListener('mousemove', this.mouseMove, false);
                document.addEventListener('mouseup', this.mouseUp, false);
                this.pauseEvent(event);
            }
        };
        this.mouseMove = event => {
            if (!this._disabled && this._isDraging) {
                this.pauseEvent(event);
                /** @type {?} */
                const pos = event.clientX;
                this._value = Math.round(this.calcValueByPos(pos));
                this.left = this.calcOffset(this._value);
                if (this._oldValue !== this._value) {
                    this._oldValue = this._value;
                    this.onChange.emit(this._value);
                }
            }
        };
        this.mouseUp = event => {
            if (!this._disabled && this._isDraging) {
                this._handleStatus = 'end';
                this._isDraging = false;
                /** @type {?} */
                const pos = event.clientX;
                this._value = Math.round(this.calcValueByPos(pos));
                this.left = this.calcOffset(this._value);
                this.onAfterChange.emit(this._value);
            }
        };
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set min(value) {
        this._min = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set max(value) {
        this._max = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set minBound(value) {
        this._minBound = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set maxBound(value) {
        this._maxBound = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set step(value) {
        this._step = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set value(value) {
        this._value = value;
        if (this._value) {
            this.left = this.calcOffset(this._value);
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set disabled(value) {
        this._disabled = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set sliderLength(value) {
        this._sliderLength = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set sliderStart(value) {
        this._sliderStart = value;
    }
    /**
     * @return {?}
     */
    get handleStyle() {
        return this._handleStyle;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set handleStyle(value) {
        this._handleStyle = value;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panstart(event) {
        event.preventDefault();
        if (!this._disabled) {
            this._startX = event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientX;
            this._handleStatus = 'start';
            this._isDraging = true;
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panmove(event) {
        event.preventDefault();
        if (!this._disabled && this._isDraging) {
            /** @type {?} */
            const pos = event.changedTouches[0].clientX;
            this._value = Math.round(this.calcValueByPos(pos));
            this.left = this.calcOffset(this._value);
            if (this._oldValue !== this._value) {
                this._oldValue = this._value;
                this.onChange.emit(this._value);
            }
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panend(event) {
        event.preventDefault();
        if (!this._disabled && this._isDraging) {
            this._handleStatus = 'end';
            this._isDraging = false;
            /** @type {?} */
            const pos = event.changedTouches[0].clientX;
            this._value = Math.round(this.calcValueByPos(pos));
            this.left = this.calcOffset(this._value);
            this.onAfterChange.emit(this._value);
        }
    }
    /**
     * @param {?} pos
     * @return {?}
     */
    calcValueByPos(pos) {
        /** @type {?} */
        const offset = pos - this._sliderStart;
        /** @type {?} */
        let value = this.calcValue(offset);
        if (value <= this._minBound) {
            value = this._minBound;
        }
        if (value >= this._maxBound) {
            value = this._maxBound;
        }
        /** @type {?} */
        const closestPoint = this.getClosestPoint(value);
        return this._step === null ? closestPoint : parseFloat(closestPoint.toFixed(this.getPrecision(this._step)));
    }
    /**
     * @param {?} offset
     * @return {?}
     */
    calcValue(offset) {
        /** @type {?} */
        const ratio = Math.abs(Math.max(offset, 0) / this._sliderLength);
        /** @type {?} */
        const value = ratio * (this._max - this._min) + this._min;
        return value;
    }
    /**
     * @param {?} val
     * @return {?}
     */
    getClosestPoint(val) {
        /** @type {?} */
        const points = Object.keys(this._marks).map(parseFloat);
        if (this._step !== null) {
            /** @type {?} */
            const closestStep = Math.round((val - this._min) / this._step) * this._step + this._min;
            points.push(closestStep);
        }
        /** @type {?} */
        const diffs = points.map(function (point) {
            return Math.abs(val - point);
        });
        return points[diffs.indexOf(Math.min.apply(Math, this.toConsumableArray(diffs)))];
    }
    /**
     * @param {?} step
     * @return {?}
     */
    getPrecision(step) {
        /** @type {?} */
        const stepString = step.toString();
        /** @type {?} */
        let precision = 0;
        if (stepString.indexOf('.') >= 0) {
            precision = stepString.length - stepString.indexOf('.') - 1;
        }
        return precision;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    calcOffset(value) {
        /** @type {?} */
        const ratio = (value - this._min) / (this._max - this._min);
        return ratio * 100;
    }
    /**
     * @param {?} e
     * @return {?}
     */
    pauseEvent(e) {
        e.stopPropagation();
        e.preventDefault();
    }
    /**
     * @param {?} event
     * @return {?}
     */
    isMouseTarget(event) {
        /** @type {?} */
        let target = event.target;
        /** @type {?} */
        let parentFound = false;
        while (target !== null && !parentFound) {
            if (target === this._elf.nativeElement) {
                parentFound = true;
            }
            target = target.parentElement;
        }
        return parentFound;
    }
    /**
     * @param {?} arr
     * @return {?}
     */
    toConsumableArray(arr) {
        if (Array.isArray(arr)) {
            /** @type {?} */
            const arr2 = Array(arr.length);
            for (let i = 0; i < arr.length; i++) {
                arr2[i] = arr[i];
            }
            return arr2;
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this._elf.nativeElement.addEventListener('mousedown', this.mouseDown, false);
        this._handleOffsetX = this._elf.nativeElement.getBoundingClientRect().x;
        this.left = this.calcOffset(this._value);
        this._minBound = this._minBound === undefined ? this._min : this._minBound;
        this._maxBound = this._maxBound === undefined ? this._max : this._maxBound;
        this.onAfterChange.emit(this._value);
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        document.removeEventListener('mousemove', this.mouseMove, false);
        document.removeEventListener('mouseup', this.mouseUp, false);
    }
}
SliderHandle.decorators = [
    { type: Component, args: [{
                selector: 'SliderHandle, nzm-slider-handle',
                template: "<div role=\"slider\"\n     class=\"am-slider-handle\"\n     [ngStyle]=\"handleStyle\"\n     [style.left.%]=\"left\">\n</div>",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
SliderHandle.ctorParameters = () => [
    { type: ElementRef },
    { type: DomSanitizer }
];
SliderHandle.propDecorators = {
    min: [{ type: Input }],
    max: [{ type: Input }],
    minBound: [{ type: Input }],
    maxBound: [{ type: Input }],
    step: [{ type: Input }],
    value: [{ type: Input }],
    disabled: [{ type: Input }],
    sliderLength: [{ type: Input }],
    sliderStart: [{ type: Input }],
    handleStyle: [{ type: Input }],
    onChange: [{ type: Output }],
    onAfterChange: [{ type: Output }],
    panstart: [{ type: HostListener, args: ['touchstart', ['$event'],] }],
    panmove: [{ type: HostListener, args: ['touchmove', ['$event'],] }],
    panend: [{ type: HostListener, args: ['touchend', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SliderMarks {
    /**
     * @param {?} _elf
     */
    constructor(_elf) {
        this._elf = _elf;
        this.markArray = [];
        this._min = 0;
        this._max = 100;
        this._marks = {};
        this._included = true;
        this._className = 'am-slider-mark';
        this.onChange = new EventEmitter();
        this.onAfterChange = new EventEmitter();
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set min(value) {
        if (value && value <= this._max) {
            this._min = value;
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set max(value) {
        if (value && value >= this._min) {
            this._max = value;
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set marks(value) {
        this._marks = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set included(value) {
        this._included = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set upperBound(value) {
        if (value && value !== this._upperBound) {
            this._upperBound = value;
            this.setActiveCls();
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set lowerBound(value) {
        if (value && value !== this.lowerBound) {
            this._lowerBound = value;
            this.setActiveCls();
        }
    }
    /**
     * @return {?}
     */
    get class() {
        return this._className;
    }
    /**
     * @param {?} marksKeys
     * @return {?}
     */
    getMarks(marksKeys) {
        this.markArray = [];
        marksKeys
            .map(parseFloat)
            .sort((a, b) => a - b)
            .map(point => {
            /** @type {?} */
            const markItem = {
                markLabel: '',
                point: '',
                className: {},
                style: {}
            };
            /** @type {?} */
            const markPoint = this._marks[point];
            /** @type {?} */
            const markPointIsObject = typeof markPoint === 'object';
            /** @type {?} */
            const markLabel = markPointIsObject ? markPoint.label : markPoint;
            if (!markLabel && markLabel !== 0) {
                return null;
            }
            /** @type {?} */
            const isActive = (!this._included && point === this._upperBound) ||
                (this._included && point <= this._upperBound && point >= this._lowerBound);
            /** @type {?} */
            const markClassName = {
                [`${this._className}-text`]: true,
                [`${this._className}-text-active`]: isActive
            };
            /** @type {?} */
            const bottomStyle = {
                marginBottom: '-50%',
                bottom: `${((point - this._min) / this._range) * 100}%`
            };
            /** @type {?} */
            const leftStyle = {
                width: `${this._markWidth}%`,
                marginLeft: `${-this._markWidth / 2}%`,
                left: `${((point - this._min) / this._range) * 100}%`
            };
            /** @type {?} */
            const style$$1 = leftStyle;
            /** @type {?} */
            const markStyle = markPointIsObject ? Object.assign({}, style$$1, markPoint.style) : style$$1;
            markItem.markLabel = markLabel;
            markItem.point = point;
            markItem.className = Object.keys(markClassName).join(' ');
            markItem.style = markStyle;
            this.markArray.push(markItem);
        });
    }
    /**
     * @return {?}
     */
    setActiveCls() {
        for (let i = 0; i < this.markArray.length; i++) {
            /** @type {?} */
            const point = this.markArray[i].point;
            /** @type {?} */
            const isActive = (!this._included && point === this._upperBound) ||
                (this._included && point <= this._upperBound && point >= this._lowerBound);
            this.markArray[i].className = {
                [`${this._className}-text`]: true,
                [`${this._className}-text-active`]: isActive
            };
        }
    }
    /**
     * @return {?}
     */
    setMarksLable() {
        for (let i = 0; i < this.markArray.length; i++) {
            /** @type {?} */
            const markEle = this._elf.nativeElement.getElementsByClassName(this._className + '-text')[i];
            markEle.innerHTML = this.markArray[i].markLabel;
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        /** @type {?} */
        const marksKeys = Object.keys(this._marks);
        /** @type {?} */
        const marksCount = marksKeys.length;
        /** @type {?} */
        const unit = marksCount > 1 ? 100 / (marksCount - 1) : 100;
        this._markWidth = unit * 0.9;
        this._range = this._max - this._min;
        this.getMarks(marksKeys);
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        this.setMarksLable();
    }
}
SliderMarks.decorators = [
    { type: Component, args: [{
                selector: 'SliderMarks, nzm-slider-marks',
                template: "<span *ngFor=\"let item of markArray\"\n      [ngClass]=\"item.className\"\n      [ngStyle]=\"item.style\"\n      (onMouseDown)=\"onClickLabel($event, point)\"\n      (onTouchStart)=\"onClickLabel($events, point)\">\n</span>",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
SliderMarks.ctorParameters = () => [
    { type: ElementRef }
];
SliderMarks.propDecorators = {
    min: [{ type: Input }],
    max: [{ type: Input }],
    marks: [{ type: Input }],
    included: [{ type: Input }],
    upperBound: [{ type: Input }],
    lowerBound: [{ type: Input }],
    onChange: [{ type: Output }],
    onAfterChange: [{ type: Output }],
    class: [{ type: HostBinding }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SliderSteps {
    /**
     * @param {?} _elf
     */
    constructor(_elf) {
        this._elf = _elf;
        this.prefixCls = 'am-slider';
        this.stepArray = [];
        this._min = 0;
        this._max = 100;
        this._marks = {};
        this._included = true;
        this._dots = false;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set min(value) {
        if (value && value <= this._max) {
            this._min = value;
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set max(value) {
        if (value && value >= this._min) {
            this._max = value;
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set marks(value) {
        this._marks = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set step(value) {
        this._step = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set included(value) {
        this._included = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set dots(value) {
        this._dots = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set upperBound(value) {
        if (value !== undefined && value !== this._upperBound) {
            this._upperBound = value;
            this.setActiveCls();
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set lowerBound(value) {
        if (value !== undefined && value !== this.lowerBound) {
            this._lowerBound = value;
            this.setActiveCls();
        }
    }
    /**
     * @return {?}
     */
    get class() {
        return 'am-slider-step';
    }
    /**
     * @return {?}
     */
    calPoints() {
        /** @type {?} */
        const points = Object.keys(this._marks).map(parseFloat);
        if (this._dots) {
            for (let i = this._min; i <= this._max; i = i + this._step) {
                if (points.indexOf(i) < 0) {
                    points.push(i);
                }
            }
        }
        return points;
    }
    /**
     * @param {?} points
     * @return {?}
     */
    getSteps(points) {
        /** @type {?} */
        const range = this._max - this._min;
        this.stepArray = [];
        points.map(point => {
            /** @type {?} */
            const stepItem = {
                stepStyle: {},
                stepClass: {},
                point: null
            };
            /** @type {?} */
            const offset = `${(Math.abs(point - this._min) / range) * 100}%`;
            /** @type {?} */
            const isActived = (!this._included && point === this._upperBound) ||
                (this._included && point <= this._upperBound && point >= this._lowerBound);
            /** @type {?} */
            let style$$1 = Object.assign({ left: offset }, this._dotStyle);
            if (isActived) {
                style$$1 = Object.assign({}, style$$1, this._activeDotStyle);
            }
            /** @type {?} */
            const pointClassName = {
                [`${this.prefixCls}-dot`]: true,
                [`${this.prefixCls}-dot-active`]: isActived
            };
            stepItem.point = point;
            stepItem.stepStyle = style$$1;
            stepItem.stepClass = pointClassName;
            this.stepArray.push(stepItem);
        });
    }
    /**
     * @return {?}
     */
    setActiveCls() {
        for (let i = 0; i < this.stepArray.length; i++) {
            /** @type {?} */
            const point = this.stepArray[i].point;
            /** @type {?} */
            const isActived = (!this._included && point === this._upperBound) ||
                (this._included && point <= this._upperBound && point >= this._lowerBound);
            this.stepArray[i].stepClass = {
                [`${this.prefixCls}-dot`]: true,
                [`${this.prefixCls}-dot-active`]: isActived
            };
        }
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        /** @type {?} */
        const points = this.calPoints();
        this.getSteps(points);
    }
}
SliderSteps.decorators = [
    { type: Component, args: [{
                selector: 'SliderSteps, nzm-slider-steps',
                template: "<span *ngFor=\"let item of stepArray\"\n      [ngClass]=\"item.stepClass\"\n      [ngStyle]=\"item.stepStyle\">\n</span>",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
SliderSteps.ctorParameters = () => [
    { type: ElementRef }
];
SliderSteps.propDecorators = {
    min: [{ type: Input }],
    max: [{ type: Input }],
    marks: [{ type: Input }],
    step: [{ type: Input }],
    included: [{ type: Input }],
    dots: [{ type: Input }],
    upperBound: [{ type: Input }],
    lowerBound: [{ type: Input }],
    class: [{ type: HostBinding }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SliderTrack {
    /**
     * @param {?} _elf
     * @param {?} _sanitizer
     */
    constructor(_elf, _sanitizer) {
        this._elf = _elf;
        this._sanitizer = _sanitizer;
        this.prefixCls = 'am-slider';
        this._included = true;
    }
    /**
     * @return {?}
     */
    get className() {
        return this._className;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set className(value) {
        this._className = value;
    }
    /**
     * @return {?}
     */
    get included() {
        return this._included;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set included(value) {
        this._included = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set offset(value) {
        this._offset = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set length(value) {
        this._length = value;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set style(value) {
        this._style = value;
    }
    /**
     * @return {?}
     */
    ngOnChanges() {
        /** @type {?} */
        const positonStyle = {
            left: `${this._offset}%`,
            width: `${this._length}%`
        };
        this.elStyle = Object.assign({}, this._style, positonStyle);
    }
}
SliderTrack.decorators = [
    { type: Component, args: [{
                selector: 'SliderTrack, nzm-slider-track',
                template: "<div *ngIf=\"included\" \n     [ngClass]=\"className\" \n     [ngStyle]=\"elStyle\" >\n</div>",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
SliderTrack.ctorParameters = () => [
    { type: ElementRef },
    { type: DomSanitizer }
];
SliderTrack.propDecorators = {
    className: [{ type: Input }],
    included: [{ type: Input }],
    offset: [{ type: Input }],
    length: [{ type: Input }],
    style: [{ type: Input }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SliderModule {
}
SliderModule.decorators = [
    { type: NgModule, args: [{
                exports: [Slider, SliderHandle, SliderMarks, SliderSteps, SliderTrack],
                declarations: [Slider, SliderHandle, SliderMarks, SliderSteps, SliderTrack],
                imports: [CommonModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class RangeModule {
}
RangeModule.decorators = [
    { type: NgModule, args: [{
                exports: [Range],
                declarations: [Range],
                imports: [CommonModule, SliderModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PaginationComponent {
    /**
     * @param {?} _localeProviderService
     */
    constructor(_localeProviderService) {
        this._localeProviderService = _localeProviderService;
        this.prefixCls = 'am-pagination';
        this._locale = {};
        this._unsubscribe$ = new Subject();
        this.mode = 'button';
        this.current = 1;
        this.total = 0;
        this.simple = false;
        this.disabled = false;
        this.onChange = new EventEmitter();
    }
    /**
     * @return {?}
     */
    get locale() {
        return this._locale;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set locale(v) {
        this._locale = v;
        this._unsubscribe$.next();
        this._unsubscribe$.complete();
    }
    /**
     * @param {?} key
     * @return {?}
     */
    isTemplateRef(key) {
        return /** @type {?} */ (key) instanceof TemplateRef;
    }
    /**
     * @param {?} p
     * @return {?}
     */
    onClick(p) {
        this.current = p;
        this.onChange.emit(p);
    }
    /**
     * @param {?} p
     * @return {?}
     */
    getNumber(p) {
        return new Array(p);
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this._localeProviderService.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe(_ => {
            this._locale = this._localeProviderService.getLocaleSubObj('Pagination');
        });
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this._unsubscribe$.next();
        this._unsubscribe$.complete();
    }
}
PaginationComponent.decorators = [
    { type: Component, args: [{
                selector: 'Pagination, nzm-pagination',
                template: "<div class=\"{{prefixCls}} {{prefixCls}}-align-center\">\n  <Flex *ngIf=\"mode === 'button'\">\n    <FlexItem class=\"{{prefixCls}}-wrap-btn {{prefixCls}}-wrap-btn-prev\">\n      <a Button [inline]=\"true\" [disabled]=\"current <= 1\" (onClick)=\"onClick(current - 1)\">\n        <ng-container *ngIf=\"!isTemplateRef(locale.prevText)\">\n          {{locale.prevText}}\n        </ng-container>\n        <ng-template *ngIf=\"isTemplateRef(locale.prevText)\" [ngTemplateOutlet]=\"locale.prevText\"></ng-template>\n      </a>\n    </FlexItem>\n    <FlexItem class=\"{{prefixCls}}-wrap\" aria-live=\"assertive\" *ngIf=\"!simple\">\n      <span class=\"active\">{{current}}</span>/\n      <span>{{total}}</span>\n    </FlexItem>\n    <FlexItem class=\"{{prefixCls}}-wrap-btn {{prefixCls}}-wrap-btn-next\">\n      <a Button [inline]=\"true\" [disabled]=\"current>= total\" (onClick)=\"onClick(current + 1)\">\n        <ng-container *ngIf=\"!isTemplateRef(locale.nextText)\">\n          {{locale.nextText}}\n        </ng-container>\n        <ng-template *ngIf=\"isTemplateRef(locale.nextText)\" [ngTemplateOutlet]=\"locale.nextText\"></ng-template>\n      </a>\n    </FlexItem>\n  </Flex>\n\n  <div class=\"{{prefixCls}}-wrap\" *ngIf=\"mode === 'number'\">\n    <span class=\"active\">{{current}}</span>/<span>{{total}}</span>\n  </div>\n\n  <div class=\"{{prefixCls}}-wrap\" *ngIf=\"mode === 'pointer'\">\n    <div *ngFor=\"let number of getNumber(total); let i = index\" class=\"{{prefixCls}}-wrap-dot {{current === i+1 ? (prefixCls + '-wrap-dot-active') : ''}}\">\n      <span></span>\n    </div>\n  </div>\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
PaginationComponent.ctorParameters = () => [
    { type: LocaleProviderService }
];
PaginationComponent.propDecorators = {
    mode: [{ type: Input }],
    current: [{ type: Input }],
    total: [{ type: Input }],
    simple: [{ type: Input }],
    disabled: [{ type: Input }],
    locale: [{ type: Input }],
    onChange: [{ type: Output }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PaginationModule {
}
PaginationModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, ButtonModule, FlexModule, IconModule],
                declarations: [PaginationComponent],
                exports: [PaginationComponent],
                providers: [LocaleProviderModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class TagComponent {
    constructor() {
        this.prefixCls = 'am-tag';
        this.closed = false;
        this.wrapCls = {};
        this._small = false;
        this._closable = false;
        this._selected = false;
        this._disabled = false;
        this.onChange = new EventEmitter();
        this.onClose = new EventEmitter();
        this.afterClose = new EventEmitter();
    }
    /**
     * @return {?}
     */
    get small() {
        return this._small;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set small(v) {
        this._small = v;
        this.setClassMap();
    }
    /**
     * @return {?}
     */
    get closable() {
        return this._closable;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set closable(v) {
        this._closable = v;
        this.setClassMap();
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set selected(v) {
        this._selected = v;
        this.setClassMap();
    }
    /**
     * @return {?}
     */
    get disabled() {
        return this._disabled;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set disabled(v) {
        this._disabled = v;
        this.setClassMap();
    }
    /**
     * @return {?}
     */
    onClick() {
        if (this._disabled) {
            return;
        }
        this._selected = !this._selected;
        this.onChange.emit(this._selected);
        this.setClassMap();
    }
    /**
     * @return {?}
     */
    onTagClose() {
        this.onClose.emit();
        this.closed = true;
        this.afterClose.emit();
    }
    /**
     * @return {?}
     */
    setClassMap() {
        this.wrapCls = {
            [this.prefixCls]: true,
            [`${this.prefixCls}-normal`]: !this._disabled && (!this._selected || this._small || this._closable),
            [`${this.prefixCls}-small`]: this._small,
            [`${this.prefixCls}-active`]: this._selected && !this._disabled && !this._small && !this._closable,
            [`${this.prefixCls}-disabled`]: this._disabled,
            [`${this.prefixCls}-closable`]: this._closable
        };
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.setClassMap();
    }
}
TagComponent.decorators = [
    { type: Component, args: [{
                selector: 'Tag, nzm-tag',
                template: "<div *ngIf=\"!closed\" [ngClass]=\"wrapCls\" (click)=\"onClick()\">\n  <div class=\"{{prefixCls}}-text\">\n    <ng-content></ng-content>\n  </div>\n  <div *ngIf=\"closable && !disabled && !small\"\n       role=\"button\"\n       class=\"{{prefixCls}}-close\"\n       aria-label=\"remove tag\"\n       (click)=\"onTagClose()\">\n    <Icon aria-hidden=\"true\" [type]=\"'cross-circle'\" [size]=\"'xs'\"></Icon>\n  </div>\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
TagComponent.ctorParameters = () => [];
TagComponent.propDecorators = {
    small: [{ type: Input }],
    closable: [{ type: Input }],
    selected: [{ type: Input }],
    disabled: [{ type: Input }],
    onChange: [{ type: Output }],
    onClose: [{ type: Output }],
    afterClose: [{ type: Output }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class TagModule {
}
TagModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, IconModule],
                declarations: [TagComponent],
                exports: [TagComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class MenuComponent {
    /**
     * @param {?} _localeProviderService
     */
    constructor(_localeProviderService) {
        this._localeProviderService = _localeProviderService;
        this.prefixCls = 'am-menu';
        this.subMenuPrefixCls = 'am-sub-menu';
        this.radioPrefixCls = 'am-radio';
        this.multiSelectMenuBtnsCls = 'am-multi-select-btns';
        this.menuSelectContanerPrefixCls = 'am-menu-select-container';
        this.locale = {};
        this._data = [];
        this._unsubscribe$ = new Subject();
        this.level = 2;
        this.value = [];
        this.height = document.documentElement.clientHeight / 2;
        this.multiSelect = false;
        this.onChange = new EventEmitter();
        this.onOk = new EventEmitter();
        this.onCancel = new EventEmitter();
    }
    /**
     * @return {?}
     */
    get data() {
        return this._data;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set data(v) {
        this._data = v;
        this.initData();
    }
    /**
     * @return {?}
     */
    onMenuOk() {
        this.onOk.emit(this.value);
    }
    /**
     * @return {?}
     */
    onMenuCancel() {
        this.onCancel.emit();
    }
    /**
     * @return {?}
     */
    getNewFsv() {
        /** @type {?} */
        let firstValue = '';
        if (this.value && this.value.length) {
            firstValue = /** @type {?} */ (this.value[0]);
        }
        else if (this._data && this._data.length && !this._data[0].isLeaf) {
            firstValue = this._data[0].value;
        }
        return firstValue;
    }
    /**
     * @param {?} dataItem
     * @return {?}
     */
    onClickFirstLevelItem(dataItem) {
        this.firstLevelSelectValue = dataItem.value;
        if (dataItem.isLeaf && this.onChange) {
            this.onChange.emit([dataItem.value]);
        }
        this.initData();
    }
    /**
     * @param {?} dataItem
     * @return {?}
     */
    onClickSubMenuItem(dataItem) {
        this.value = this.getSelectValue(dataItem);
        this.initData();
        setTimeout(() => {
            this.onChange.emit(this.value);
        }, 300);
    }
    /**
     * @param {?} dataItem
     * @return {?}
     */
    getSelectValue(dataItem) {
        if (this.multiSelect) {
            if (this.value && this.value.length > 0) {
                if (this.level === 2 && this.value[0] !== this.firstLevelSelectValue) {
                    return [this.firstLevelSelectValue, [dataItem.value]];
                }
                else {
                    if (this.level == 1) {
                        /** @type {?} */
                        const chosenValues = Array.from(this.value);
                        /** @type {?} */
                        const existIndex = chosenValues.indexOf(dataItem.value);
                        if (existIndex === -1) {
                            chosenValues.push(dataItem.value);
                        }
                        else {
                            chosenValues.splice(existIndex, 1);
                        }
                        return chosenValues;
                    }
                    else {
                        /** @type {?} */
                        const chosenValues = Array.from(this.value[1]);
                        /** @type {?} */
                        const existIndex = chosenValues.indexOf(dataItem.value);
                        if (existIndex === -1) {
                            chosenValues.push(dataItem.value);
                        }
                        else {
                            chosenValues.splice(existIndex, 1);
                        }
                        return [this.firstLevelSelectValue, chosenValues];
                    }
                }
            }
            else {
                return this.level === 2 ? [this.firstLevelSelectValue, [dataItem.value]] : [dataItem.value];
            }
        }
        return this.level === 2 ? [this.firstLevelSelectValue, dataItem.value] : [dataItem.value];
    }
    /**
     * @return {?}
     */
    initData() {
        this.subMenuData = this._data;
        if (this.level === 2) {
            /** @type {?} */
            let parent = this._data;
            if (this.firstLevelSelectValue && this.firstLevelSelectValue !== '') {
                parent = this._data.filter(dataItem => dataItem.value === this.firstLevelSelectValue);
            }
            if (parent[0] && parent[0].children && parent[0].isLeaf !== true) {
                this.subMenuData = parent[0].children;
            }
            else {
                this.subMenuData = [];
            }
        }
        /** @type {?} */
        let subValue = (this.value && this.value.length > 0 && [...this.value]) || [];
        if (this.level === 2 && subValue.length > 1) {
            subValue.shift();
            if (this.multiSelect) {
                subValue = /** @type {?} */ (subValue[0]);
            }
        }
        this.subSelInitItem = this.subMenuData.filter(dataItem => subValue.indexOf(dataItem.value) !== -1).map(item => {
            return item.value;
        });
        /** @type {?} */
        const parentValue = this.value && this.value.length > 1 && this.level === 2 ? this.value[0] : null;
        this.showSelect = true;
        if (this.level === 2 && parentValue !== this.firstLevelSelectValue) {
            this.showSelect = false;
        }
    }
    /**
     * @param {?} dataItem
     * @return {?}
     */
    getClass(dataItem) {
        return this.dataItemSelected(dataItem) ? this.prefixCls + '-selected' : '';
    }
    /**
     * @param {?} dataItem
     * @return {?}
     */
    dataItemSelected(dataItem) {
        return dataItem.value === this.firstLevelSelectValue;
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this._localeProviderService.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe(_ => {
            this.locale = this._localeProviderService.getLocaleSubObj('Menu');
        });
        this.firstLevelSelectValue = this.getNewFsv();
        this.heightStyle = {
            height: this.height + 'px'
        };
        this.initData();
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this._unsubscribe$.next();
        this._unsubscribe$.complete();
    }
}
MenuComponent.decorators = [
    { type: Component, args: [{
                selector: 'Menu, nzm-menu',
                template: "<Flex class=\"{{prefixCls}}\"\n      [ngStyle]=\"heightStyle\"\n      [direction]=\"'column'\"\n      [align]=\"'stretch'\"\n>\n  <Flex class=\"{{menuSelectContanerPrefixCls}}\" [align]=\"'start'\">\n    <FlexItem *ngIf=\"level == 2\">\n      <List role=\"tablist\">\n        <ListItem role=\"tab\"\n                  *ngFor=\"let dataItem of data, let i = index\"\n                  [className]=\"getClass(dataItem)\"\n                  (click)=\"onClickFirstLevelItem(dataItem)\"\n        >\n          {{dataItem.label}}\n        </ListItem>\n      </List>\n    </FlexItem>\n\n    <FlexItem role=\"tabpanel\" aria-hidden=\"false\" class=\"{{menuSelectContanerPrefixCls}}-submenu\">\n      <SubMenu [subMenuPrefixCls]=\"subMenuPrefixCls\"\n               [radioPrefixCls]=\"radioPrefixCls\"\n               [subMenuData]=\"subMenuData\"\n               [selItem]=\"subSelInitItem\"\n               [showSelect]=\"showSelect\"\n               [multiSelect]=\"multiSelect\"\n               (onSel)=\"onClickSubMenuItem($event)\">\n      </SubMenu>\n    </FlexItem>\n  </Flex>\n\n  <div *ngIf=\"multiSelect\" class=\"{{multiSelectMenuBtnsCls}}\">\n    <a Button\n       [className]=\"'am-multi-select-btns-btn'\"\n       [inline]=\"true\"\n       (onClick)=\"onMenuCancel()\"\n    >\n      {{locale.cancelText}}\n    </a>\n    <a Button\n       [className]=\"'am-multi-select-btns-btn'\"\n       [inline]=\"true\" [type]=\"'primary'\"\n       (onClick)=\"onMenuOk()\"\n    >\n      {{locale.okText}}\n    </a>\n  </div>\n</Flex>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
MenuComponent.ctorParameters = () => [
    { type: LocaleProviderService }
];
MenuComponent.propDecorators = {
    data: [{ type: Input }],
    level: [{ type: Input }],
    value: [{ type: Input }],
    height: [{ type: Input }],
    multiSelect: [{ type: Input }],
    onChange: [{ type: Output }],
    onOk: [{ type: Output }],
    onCancel: [{ type: Output }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SubMenuComponent {
    constructor() {
        this.prefixCls = 'am-sub-menu';
        this.onSel = new EventEmitter();
    }
    /**
     * @return {?}
     */
    get subMenuPrefixCls() {
        return this._subMenuPrefixCls;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set subMenuPrefixCls(v) {
        this._subMenuPrefixCls = v;
    }
    /**
     * @return {?}
     */
    get radioPrefixCls() {
        return this._radioPrefixCls;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set radioPrefixCls(v) {
        this._radioPrefixCls = v;
    }
    /**
     * @return {?}
     */
    get subMenuData() {
        return this._subMenuData;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set subMenuData(v) {
        this._subMenuData = v;
    }
    /**
     * @return {?}
     */
    get showSelect() {
        return this._showSelect;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set showSelect(v) {
        this._showSelect = v;
    }
    /**
     * @return {?}
     */
    get selItem() {
        return this._selItem;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set selItem(v) {
        this._selItem = v;
    }
    /**
     * @return {?}
     */
    get multiSelect() {
        return this._multiSelect;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set multiSelect(v) {
        this._multiSelect = v;
    }
    /**
     * @param {?} dataItem
     * @return {?}
     */
    onClick(dataItem) {
        this.onSel.emit(dataItem);
    }
    /**
     * @param {?} dataItem
     * @return {?}
     */
    selected(dataItem) {
        return this._showSelect && (this._selItem.length > 0 && this._selItem.indexOf(dataItem.value) !== -1);
    }
    /**
     * @param {?} dataItem
     * @return {?}
     */
    getClass(dataItem) {
        /** @type {?} */
        let name = this._radioPrefixCls + '-item ';
        name += this.selected(dataItem) ? this._subMenuPrefixCls + '-item-selected' : '';
        name += dataItem.disabled ? this._subMenuPrefixCls + '-item-disabled' : '';
        return name;
    }
}
SubMenuComponent.decorators = [
    { type: Component, args: [{
                selector: 'SubMenu, nzm-sub-menu',
                template: "<List class=\"{{subMenuPrefixCls}}\" style=\"padding: 0\">\n  <ListItem *ngFor=\"let dataItem of subMenuData; let i = index;\"\n            key=\"i\"\n            [className]=\"getClass(dataItem)\"\n            [extra]=\"extra\"\n  >\n    {{dataItem.label}}\n\n    <ng-template #extra>\n      <label Radio\n             *ngIf=\"!multiSelect\"\n             [checked]=\"selected(dataItem)\"\n             [disabled]=\"dataItem.disabled\"\n             (onChange)=\"onClick(dataItem)\"\n      >\n      </label>\n      <label Checkbox\n             *ngIf=\"multiSelect\"\n             [checked]=\"selected(dataItem)\"\n             [disabled]=\"dataItem.disabled\"\n             (onChange)=\"onClick(dataItem)\"\n      >\n      </label>\n    </ng-template>\n  </ListItem>\n</List>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
SubMenuComponent.ctorParameters = () => [];
SubMenuComponent.propDecorators = {
    onSel: [{ type: Output }],
    subMenuPrefixCls: [{ type: Input }],
    radioPrefixCls: [{ type: Input }],
    subMenuData: [{ type: Input }],
    showSelect: [{ type: Input }],
    selItem: [{ type: Input }],
    multiSelect: [{ type: Input }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class MenuModule {
}
MenuModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, FlexModule, ListModule, RadioModule, CheckboxModule, ButtonModule],
                exports: [MenuComponent, SubMenuComponent],
                declarations: [MenuComponent, SubMenuComponent],
                providers: [LocaleProviderModule]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class DrawerComponent {
    /**
     * @param {?} _el
     */
    constructor(_el) {
        this._el = _el;
        this.prefixCls = 'am-drawer';
        this.sidebarStyleFinal = {};
        this.contentStyleFinal = {};
        this.overlayStyleFinal = {};
        this.sidebarWidth = 0;
        this.sidebarHeight = 0;
        this.sidebarTop = 0;
        this.dragHandleTop = 0;
        this.touchIdentifier = null;
        this.touchStartX = null;
        this.touchStartY = null;
        this.touchCurrentX = null;
        this.touchCurrentY = null;
        this.touchSupported = typeof window === 'object' && 'ontouchstart' in window;
        this._docked = false;
        this._open = false;
        this._position = 'left';
        this.sidebarStyle = {};
        this.contentStyle = {};
        this.overlayStyle = {};
        this.dragHandleStyle = {};
        this.transitions = true;
        this.touch = true;
        this.enableDragHandle = true;
        this.dragToggleDistance = 30;
        this.onOpenChange = new EventEmitter();
        this.am = true;
        this.left = this._position === 'left';
        this.right = this._position === 'right';
        this.top = this._position == 'top';
        this.bottom = this._position == 'bottom';
        this.dockedCls = this._docked;
        this.openCls = this._open;
    }
    /**
     * @return {?}
     */
    get docked() {
        return this._docked;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set docked(v) {
        this._docked = v;
        this.dockedCls = v;
    }
    /**
     * @return {?}
     */
    get open() {
        return this._open;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set open(v) {
        this._open = v;
        this.openCls = v;
    }
    /**
     * @param {?} v
     * @return {?}
     */
    set position(v) {
        this._position = v;
        this.right = false;
        this.left = false;
        this.top = false;
        this.bottom = false;
        switch (v) {
            case 'right':
                this.right = true;
                break;
            case 'left':
                this.left = true;
                break;
            case 'top':
                this.top = true;
                break;
            case 'bottom':
                this.bottom = true;
                break;
        }
    }
    /**
     * @return {?}
     */
    onOverlayClicked() {
        if (this._open) {
            this.onOpenChange.emit(true);
        }
    }
    /**
     * @return {?}
     */
    isTouching() {
        return this.touchIdentifier !== null;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onTouchStart(event) {
        /** @type {?} */
        const touch = event.changedTouches[0];
        this.touchIdentifier = touch.identifier;
        this.touchStartX = touch.clientX;
        this.touchStartY = touch.clientY;
        this.touchCurrentX = touch.clientX;
        this.touchCurrentY = touch.clientY;
    }
    /**
     * @param {?} ev
     * @return {?}
     */
    onTouchMove(ev) {
        for (let ind = 0; ind < ev.changedTouches.length; ind++) {
            if (ev.changedTouches[ind].identifier === this.touchIdentifier) {
                this.touchCurrentX = ev.changedTouches[ind].clientX;
                this.touchCurrentY = ev.changedTouches[ind].clientY;
                break;
            }
        }
        this.update();
    }
    /**
     * @return {?}
     */
    onTouchEnd() {
        /** @type {?} */
        const touchWidth = this.touchSidebarWidth();
        if ((this._open && touchWidth < this.sidebarWidth - this.dragToggleDistance) ||
            (!this._open && touchWidth > this.dragToggleDistance)) {
            this.onOpenChange.emit(!this._open);
        }
        /** @type {?} */
        const touchHeight = this.touchSidebarHeight();
        if ((this._open && touchHeight < this.sidebarHeight - this.dragToggleDistance) ||
            (!this._open && touchHeight > this.dragToggleDistance)) {
            this.onOpenChange.emit(!this._open);
        }
        this.touchIdentifier = null;
        this.touchStartX = null;
        this.touchStartY = null;
        this.touchCurrentX = null;
        this.touchCurrentY = null;
        this.update();
    }
    /**
     * @return {?}
     */
    saveSidebarSize() {
        /** @type {?} */
        const sidebar = this._el.nativeElement.querySelector('#sidebar');
        /** @type {?} */
        const dragHandle = this._el.nativeElement.querySelector('#dragHandle');
        /** @type {?} */
        const width = sidebar.offsetWidth;
        /** @type {?} */
        const height = sidebar.offsetHeight;
        /** @type {?} */
        const sidebarTop = this.getOffset(sidebar).top;
        /** @type {?} */
        const dragHandleTop = this.getOffset(dragHandle).top;
        if (width !== this.sidebarWidth) {
            this.sidebarWidth = width;
        }
        if (height !== this.sidebarHeight) {
            this.sidebarHeight = height;
        }
        if (sidebarTop !== this.sidebarTop) {
            this.sidebarTop = sidebarTop;
        }
        if (dragHandleTop !== this.dragHandleTop) {
            this.dragHandleTop = dragHandleTop;
        }
    }
    /**
     * @return {?}
     */
    touchSidebarWidth() {
        if (this._position === 'right') {
            if (this._open && window.innerWidth - this.touchStartX < this.sidebarWidth) {
                if (this.touchCurrentX > this.touchStartX) {
                    return this.sidebarWidth + this.touchStartX - this.touchCurrentX;
                }
                return this.sidebarWidth;
            }
            return Math.min(window.innerWidth - this.touchCurrentX, this.sidebarWidth);
        }
        if (this._position === 'left') {
            if (this._open && this.touchStartX < this.sidebarWidth) {
                if (this.touchCurrentX > this.touchStartX) {
                    return this.sidebarWidth;
                }
                return this.sidebarWidth - this.touchStartX + this.touchCurrentX;
            }
            return Math.min(this.touchCurrentX, this.sidebarWidth);
        }
    }
    /**
     * @return {?}
     */
    touchSidebarHeight() {
        if (this._position === 'bottom') {
            if (this._open &&
                this._el.nativeElement.offsetHeight - this.touchStartY + this._el.nativeElement.offsetTop < this.sidebarHeight) {
                if (this.touchCurrentY > this.touchStartY) {
                    return this.sidebarHeight + this.touchStartY - this.touchCurrentY;
                }
                return this.sidebarHeight;
            }
            return Math.min(this._el.nativeElement.offsetHeight - this.touchCurrentY + this._el.nativeElement.offsetTop, this.sidebarHeight);
        }
        if (this._position === 'top') {
            /** @type {?} */
            const touchStartOffsetY = this.touchStartY - this.sidebarTop;
            if (this._open && touchStartOffsetY < this.sidebarHeight) {
                if (this.touchCurrentY > this.touchStartY) {
                    return this.sidebarHeight;
                }
                return this.sidebarHeight - this.touchStartY + this.touchCurrentY;
            }
            return Math.min(this.touchCurrentY - this.dragHandleTop, this.sidebarHeight);
        }
    }
    /**
     * @param {?} __0
     * @return {?}
     */
    renderStyle({ sidebarStyle, isTouching, overlayStyle, contentStyle }) {
        if (this._position === 'right' || this._position === 'left') {
            sidebarStyle.transform = `translateX(0%)`;
            sidebarStyle.WebkitTransform = `translateX(0%)`;
            if (isTouching) {
                /** @type {?} */
                const percentage = this.touchSidebarWidth() / this.sidebarWidth;
                // slide open to what we dragged
                if (this._position === 'right') {
                    sidebarStyle.transform = `translateX(${(1 - percentage) * 100}%)`;
                    sidebarStyle.WebkitTransform = `translateX(${(1 - percentage) * 100}%)`;
                }
                if (this._position === 'left') {
                    sidebarStyle.transform = `translateX(-${(1 - percentage) * 100}%)`;
                    sidebarStyle.WebkitTransform = `translateX(-${(1 - percentage) * 100}%)`;
                }
                overlayStyle.opacity = percentage;
                overlayStyle.visibility = 'visible';
            }
            if (contentStyle) {
                contentStyle[this._position] = `${this.sidebarWidth}px`;
            }
        }
        if (this._position === 'top' || this._position === 'bottom') {
            sidebarStyle.transform = `translateY(0%)`;
            sidebarStyle.WebkitTransform = `translateY(0%)`;
            if (isTouching) {
                /** @type {?} */
                const percentage = this.touchSidebarHeight() / this.sidebarHeight;
                if (this._position === 'bottom') {
                    sidebarStyle.transform = `translateY(${(1 - percentage) * 100}%)`;
                    sidebarStyle.WebkitTransform = `translateY(${(1 - percentage) * 100}%)`;
                }
                if (this._position === 'top') {
                    sidebarStyle.transform = `translateY(-${(1 - percentage) * 100}%)`;
                    sidebarStyle.WebkitTransform = `translateY(-${(1 - percentage) * 100}%)`;
                }
                overlayStyle.opacity = percentage;
                overlayStyle.visibility = 'visible';
            }
            if (contentStyle) {
                contentStyle[this._position] = `${this.sidebarHeight}px`;
            }
        }
    }
    /**
     * @return {?}
     */
    update() {
        /** @type {?} */
        const sidebarStyle = Object.assign({}, this.sidebarStyle);
        /** @type {?} */
        const contentStyle = Object.assign({}, this.contentStyle);
        /** @type {?} */
        const overlayStyle = Object.assign({}, this.overlayStyle);
        if (this.isTouching()) {
            this.renderStyle({
                sidebarStyle: sidebarStyle,
                isTouching: true,
                contentStyle: undefined,
                overlayStyle: overlayStyle
            });
        }
        else if (this._docked) {
            this.dockedCls = true;
            this.renderStyle({
                sidebarStyle: sidebarStyle,
                isTouching: undefined,
                contentStyle: contentStyle,
                overlayStyle: undefined
            });
        }
        else if (this._open) {
            this.openCls = true;
            this.renderStyle({
                sidebarStyle: sidebarStyle,
                isTouching: undefined,
                contentStyle: undefined,
                overlayStyle: undefined
            });
            overlayStyle["opacity"] = 1;
            overlayStyle["visibility"] = 'visible';
        }
        if (this.isTouching() || !this.transitions) {
            sidebarStyle["transition"] = 'none';
            sidebarStyle["WebkitTransition"] = 'none';
            contentStyle["transition"] = 'none';
            overlayStyle["transition"] = 'none';
        }
        this.sidebarStyleFinal = sidebarStyle;
        this.contentStyleFinal = contentStyle;
        this.overlayStyleFinal = overlayStyle;
    }
    /**
     * @param {?} ele
     * @return {?}
     */
    getOffset(ele) {
        /** @type {?} */
        let el = ele;
        /** @type {?} */
        let _x = 0;
        /** @type {?} */
        let _y = 0;
        while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) {
            _x += el.offsetLeft - el.scrollLeft;
            _y += el.offsetTop - el.scrollTop;
            el = el.offsetParent;
        }
        return { top: _y, left: _x };
    }
    /**
     * @return {?}
     */
    ngAfterViewChecked() {
        if (!this.isTouching()) {
            this.saveSidebarSize();
        }
    }
    /**
     * @return {?}
     */
    ngOnChanges() {
        this.update();
    }
}
DrawerComponent.decorators = [
    { type: Component, args: [{
                selector: 'Drawer, nzm-drawer',
                template: "<div class=\"{{prefixCls}}-sidebar\"\n     [ngStyle]=\"sidebarStyleFinal\"\n     id=\"sidebar\">\n  <ng-template [ngTemplateOutlet]=\"sidebar\"></ng-template>\n</div>\n<div class=\"{{prefixCls}}-overlay\"\n     [ngStyle]=\"overlayStyleFinal\"\n     role=\"presentation\"\n     ref=\"overlay\"\n     (click)=\"onOverlayClicked()\"\n></div>\n<div class=\"{{prefixCls}}-content\"\n     [ngStyle]=\"contentStyleFinal\"\n     ref=\"content\">\n  <div *ngIf=\"touch && touchSupported && !open && !docked && enableDragHandle\"\n       id=\"dragHandle\"\n       class=\"{{prefixCls}}-draghandle\"\n       [ngStyle]=\"dragHandleStyle\"\n       (touchstart)=\"onTouchStart($event)\"\n       (touchmove)=\"onTouchMove($event)\"\n       (touchend)=\"onTouchEnd()\"\n       (touchcancle)=\"onTouchEnd()\"\n  ></div>\n  <ng-content></ng-content>\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
DrawerComponent.ctorParameters = () => [
    { type: ElementRef }
];
DrawerComponent.propDecorators = {
    sidebar: [{ type: Input }],
    sidebarStyle: [{ type: Input }],
    contentStyle: [{ type: Input }],
    overlayStyle: [{ type: Input }],
    dragHandleStyle: [{ type: Input }],
    transitions: [{ type: Input }],
    touch: [{ type: Input }],
    enableDragHandle: [{ type: Input }],
    dragToggleDistance: [{ type: Input }],
    docked: [{ type: Input }],
    open: [{ type: Input }],
    position: [{ type: Input }],
    onOpenChange: [{ type: Output }],
    am: [{ type: HostBinding, args: ['class.am-drawer',] }],
    left: [{ type: HostBinding, args: ['class.am-drawer-left',] }],
    right: [{ type: HostBinding, args: ['class.am-drawer-right',] }],
    top: [{ type: HostBinding, args: ['class.am-drawer-top',] }],
    bottom: [{ type: HostBinding, args: ['class.am-drawer-bottom',] }],
    dockedCls: [{ type: HostBinding, args: ['class.am-drawer-docked',] }],
    openCls: [{ type: HostBinding, args: ['class.am-drawer-open',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class DrawerModule {
}
DrawerModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule],
                declarations: [DrawerComponent],
                exports: [DrawerComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SwipeAction {
    constructor() {
        this.prefixCls = 'am-swipe';
        this.wrapCls = {};
        this._swiping = false;
        this._openedLeft = false;
        this._openedRight = false;
        this.left = [];
        this.right = [];
        this.autoClose = false;
        this.disabled = false;
        this.onOpen = new EventEmitter();
        this.onClose = new EventEmitter();
        this.onCloseSwipe = () => {
            if (!(this._openedLeft || this._openedRight)) {
                return;
            }
            this.close();
        };
        this.onTouchStart = e => {
            this._startX = e.changedTouches[0].clientX;
            this._swiping = true;
        };
    }
    /**
     * @return {?}
     */
    setClassMap() {
        this.wrapCls = {
            [this.prefixCls]: true,
            [`${this.prefixCls}-swiping`]: this._swiping
        };
    }
    /**
     * @return {?}
     */
    close() {
        if (this._openedLeft || this._openedRight) {
            this.onClose.emit();
        }
        this.setBtnStyle(0);
        this._openedLeft = false;
        this._openedRight = false;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    setBtnStyle(value) {
        /** @type {?} */
        const limit = value > 0 ? this._btnsLeftWidth : -this._btnsRightWidth;
        /** @type {?} */
        const contentLeft = this.getContentEasing(value, limit);
        this.content.nativeElement.style.left = `${contentLeft}px`;
        this.cover.nativeElement.style.display = Math.abs(value) > 0 ? 'block' : 'none';
        this.cover.nativeElement.style.left = `${contentLeft}px`;
    }
    /**
     * @param {?} value
     * @param {?} limit
     * @return {?}
     */
    getContentEasing(value, limit) {
        return Math.abs(value) - Math.abs(limit) > 0 ? limit : value;
    }
    /**
     * @param {?} e
     * @return {?}
     */
    onTouchMove(e) {
        /** @type {?} */
        const deltaX = e.changedTouches[0].clientX - this._startX;
        e.preventDefault();
        this._needShowRight = deltaX < 0 && this.right.length > 0;
        this._needShowLeft = deltaX > 0 && this.left.length > 0;
        if (this.leftBtnRef) {
            this.leftBtnRef.nativeElement.style.visibility = this._needShowRight ? 'hidden' : 'visible';
        }
        if (this.rightBtnRef) {
            this.rightBtnRef.nativeElement.style.visibility = this._needShowLeft ? 'hidden' : 'visible';
        }
        this.setBtnStyle(deltaX);
    }
    /**
     * @param {?} e
     * @return {?}
     */
    onTouchEnd(e) {
        /** @type {?} */
        const deltaX = e.changedTouches[0].clientX - this._startX;
        /** @type {?} */
        const needOpenRight = this._needShowRight && Math.abs(deltaX) > this._btnsRightWidth / 2;
        /** @type {?} */
        const needOpenLeft = this._needShowLeft && Math.abs(deltaX) > this._btnsLeftWidth / 2;
        if (needOpenRight) {
            this.doOpenRight();
        }
        else if (needOpenLeft) {
            this.doOpenLeft();
        }
        else {
            this.close();
        }
        this._swiping = false;
        this._needShowLeft = false;
        this._needShowRight = false;
    }
    /**
     * @return {?}
     */
    doOpenLeft() {
        this.open(this._btnsLeftWidth, true, false);
    }
    /**
     * @return {?}
     */
    doOpenRight() {
        this.open(-this._btnsRightWidth, false, true);
    }
    /**
     * @param {?} ev
     * @param {?} btn
     * @return {?}
     */
    onBtnClick(ev, btn) {
        /** @type {?} */
        const onPress = btn.onPress;
        if (onPress) {
            onPress(ev);
        }
        if (this.autoClose) {
            this.close();
        }
    }
    /**
     * @param {?} value
     * @param {?} openedLeft
     * @param {?} openedRight
     * @return {?}
     */
    open(value, openedLeft, openedRight) {
        this.onOpen.emit();
        this._openedLeft = openedLeft;
        this._openedRight = openedRight;
        this.setBtnStyle(value);
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.setClassMap();
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        this._btnsLeftWidth = this.leftBtnRef ? this.leftBtnRef.nativeElement.offsetWidth : 0;
        this._btnsRightWidth = this.rightBtnRef ? this.rightBtnRef.nativeElement.offsetWidth : 0;
        document.body.addEventListener('touchstart', this.onCloseSwipe, true);
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        document.body.removeEventListener('touchstart', this.onCloseSwipe, true);
    }
}
SwipeAction.decorators = [
    { type: Component, args: [{
                selector: 'SwipeAction, nzm-swipe-action',
                template: "<div *ngIf=\"(left.length != 0 || right.length != 0) && !disabled\" [ngClass]=\"wrapCls\">\n  <div class=\"{{prefixCls}}-cover\" #coverRef></div>\n  <div *ngIf=\"left && left.length > 0\"\n       class=\"{{prefixCls}}-actions {{prefixCls}}-actions-left\"\n       #leftBtnRef>\n    <div *ngFor=\"let btn of left\"\n         class=\"{{prefixCls}}-btn\"\n         [ngStyle]=\"btn.style\"\n         role=\"button\"\n         (click)=\"onBtnClick($event, btn)\">\n      <div class=\"{{prefixCls}}-btn-text\">\n        {{btn.text || 'Click'}}\n      </div>\n    </div>\n  </div>\n  <div *ngIf=\"right && right.length > 0\"\n       class=\"{{prefixCls}}-actions {{prefixCls}}-actions-right\"\n       #rightBtnRef>\n    <div *ngFor=\"let btn of right\"\n         class=\"{{prefixCls}}-btn\"\n         [ngStyle]=\"btn.style\"\n         role=\"button\"\n         (click)=\"onBtnClick($event, btn)\"\n         >\n      <div class=\"{{prefixCls}}-btn-text\">\n        {{btn.text || 'Click'}}\n      </div>\n    </div>\n  </div>\n  <div class=\"{{prefixCls}}-content\"\n       #contentRef\n       (touchstart)=\"onTouchStart($event)\"\n       (touchmove)=\"onTouchMove($event)\"\n       (touchend)=\"onTouchEnd($event)\">\n    <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n  </div>\n</div>\n<div *ngIf=\"!((left.length != 0 || right.length != 0) && !disabled)\"\n     class=\"{{prefixCls}}-content\"\n     #contentRef>\n  <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n</div>\n\n<ng-template #content>\n  <ng-content></ng-content>\n</ng-template>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
SwipeAction.ctorParameters = () => [];
SwipeAction.propDecorators = {
    leftBtnRef: [{ type: ViewChild, args: ['leftBtnRef',] }],
    rightBtnRef: [{ type: ViewChild, args: ['rightBtnRef',] }],
    content: [{ type: ViewChild, args: ['contentRef',] }],
    cover: [{ type: ViewChild, args: ['coverRef',] }],
    left: [{ type: Input }],
    right: [{ type: Input }],
    autoClose: [{ type: Input }],
    disabled: [{ type: Input }],
    onOpen: [{ type: Output }],
    onClose: [{ type: Output }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class SwipeActionModule {
}
SwipeActionModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule],
                exports: [SwipeAction],
                declarations: [SwipeAction],
                providers: [],
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PullToRefreshComponent {
    constructor() {
        this.transtionCls = {};
        this.style = {
            '-webkit-transform': 'translate3d( 0, 0, 0 )',
            transform: 'translate3d( 0, 0, 0 )'
        };
        this.state = {
            currSt: 'deactivate',
            drag: false
        };
        this._indicator = {
            activate: '松开立即刷新',
            deactivate: '下拉可以刷新',
            release: '刷新中。。。',
            finish: '完成刷新'
        };
        this._direction = 'down';
        this._clientHeight = 0;
        this._currentContentHeight = 0;
        this._footerHeight = 54;
        this._lastcontentOffset = 0;
        this._viewHeight = Math.max(window.innerHeight, window.innerWidth);
        this.scrollRefresh = false;
        this.distanceToRefresh = 25;
        this.damping = 100;
        this.footerRefresh = new EventEmitter();
        this.onRefresh = new EventEmitter();
        this.refresh = true;
        this.container = true;
        this.refreshUp = false;
        this.refreshDown = true;
    }
    /**
     * @return {?}
     */
    get direction() {
        return this._direction;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set direction(value) {
        this._direction = value;
        this.refreshUp = this._direction === 'up';
        this.refreshDown = this._direction === 'down';
    }
    /**
     * @return {?}
     */
    get indicator() {
        return this._indicator;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set indicator(value) {
        this._indicator.activate = value.activate ? value.activate : this._indicator.activate;
        this._indicator.deactivate = value.deactivate ? value.deactivate : this._indicator.deactivate;
        this._indicator.release = value.release ? value.release : this._indicator.release;
        this._indicator.finish = value.finish ? value.finish : this._indicator.finish;
    }
    /**
     * @param {?} e
     * @return {?}
     */
    touchstart(e) {
        if (this._direction === 'down') {
            if (document.getElementsByTagName('pulltorefresh')[0].scrollTop > 0) {
                this.startY = undefined;
                return;
            }
            this.startY = e && e.changedTouches && e.changedTouches[0] && e.changedTouches[0].clientY;
            this.state.drag = undefined;
        }
        else {
            this.startY = e && e.changedTouches && e.changedTouches[0] && e.changedTouches[0].clientY;
            this._clientHeight = this._pullToRefresh.element.nativeElement.clientHeight;
            this._currentContentHeight = document.getElementsByTagName('pulltorefresh')[0].clientHeight;
        }
        this.transtionCls = '';
    }
    /**
     * @param {?} e
     * @return {?}
     */
    touchmove(e) {
        if (this._direction === 'down') {
            if (!this.startY) {
                return;
            }
            /** @type {?} */
            let distanceY = e.changedTouches[0].clientY - this.startY;
            if (distanceY < 0) {
                // 滚动
                this.state.drag = false;
            }
            else {
                // 下拉
                this.state.drag = true;
            }
            if (this.state.drag) {
                // 禁止滚动
                e.preventDefault();
            }
            else {
                return;
            }
            if (distanceY > this.damping) {
                //当超过设定阈值是,缓慢增加
                distanceY = (distanceY / (distanceY + this.damping)) * this.damping * 2;
            }
            else if (distanceY < 0) {
                distanceY = 0;
            }
            if (distanceY > this.distanceToRefresh) {
                this.state.currSt = 'activate';
            }
            this.style = {
                '-webkit-transform': 'translate3d( 0, ' + distanceY + 'px, 0 )',
                transform: 'translate3d( 0, ' + distanceY + 'px, 0 )'
            };
        }
        else {
            /** @type {?} */
            let distanceY = e.changedTouches[0].clientY - this.startY;
            //向上拉动的时候,如果当前窗口内容没有滚到最后,则不实现拖动的动作;向下滚动不实现拖动动作
            if (Math.abs(this._lastcontentOffset) <= this._clientHeight - this._currentContentHeight - this.distanceToRefresh ||
                distanceY > 0) {
                // 滚动
                this.state.drag = false;
            }
            else {
                // 上拉
                this.state.drag = true;
            }
            if (this.state.drag) {
                // 禁止滚动
                e.preventDefault();
            }
            else {
                return;
            }
            //如果滑动到底部了,滑动距离随着拉动的距离增加缓慢增加
            distanceY = -(distanceY / (distanceY - this.damping)) * this.damping;
            if (Math.abs(distanceY) > this.distanceToRefresh) {
                this.state.currSt = 'activate';
            }
            this.style = {
                '-webkit-transform': 'translate3d( 0, ' + distanceY + 'px, 0 )',
                transform: 'translate3d( 0, ' + distanceY + 'px, 0 )'
            };
        }
    }
    /**
     * @param {?} e
     * @return {?}
     */
    touchend(e) {
        if (!this.startY || this.state.drag === false) {
            return;
        }
        /** @type {?} */
        const distanceY = e.changedTouches[0].clientY - this.startY;
        if (Math.abs(distanceY) >= this.distanceToRefresh) {
            this.state.currSt = 'release';
            if (this._direction === 'down') {
                this.translateY(this.distanceToRefresh + 1);
            }
            else {
                this.translateY(-this.distanceToRefresh - 1);
            }
            setTimeout(() => {
                this.state.currSt = 'finish';
                this.onRefresh.emit();
                setTimeout(() => {
                    this.state.currSt = 'deactivate';
                    this.translateY(0);
                }, 0);
            }, 500);
        }
        else {
            this.translateY(0);
        }
    }
    /**
     * @param {?} evt
     * @return {?}
     */
    touchcancel(evt) {
        this.translateY(0);
    }
    /**
     * @param {?} evt
     * @return {?}
     */
    scroll(evt) {
        /** @type {?} */
        const contentOffset = evt.target.scrollTop;
        /** @type {?} */
        const offset = contentOffset - this._lastcontentOffset;
        this._lastcontentOffset = contentOffset;
        if (!this.scrollRefresh) {
            return;
        }
        if (offset > 0 &&
            contentOffset > 0 &&
            evt.target.scrollTop + this._viewHeight > evt.target.scrollHeight - this._footerHeight / 2) {
            setTimeout(() => {
                this.footerRefresh.emit('finished');
            }, 500);
        }
    }
    /**
     * @param {?} value
     * @return {?}
     */
    isTemplateRef(value) {
        if (value) {
            return value instanceof TemplateRef;
        }
    }
    /**
     * @param {?} distanceY
     * @return {?}
     */
    translateY(distanceY) {
        this.transtionCls = 'am-pull-to-refresh-transition';
        this.style = {
            '-webkit-transform': 'translate3d( 0, ' + distanceY + 'px, 0 )',
            transform: 'translate3d( 0, ' + distanceY + 'px, 0 )'
        };
    }
}
PullToRefreshComponent.decorators = [
    { type: Component, args: [{
                selector: 'PullToRefresh, nzm-pull-to-refresh',
                template: "<div class=\"am-pull-to-refresh-content-wrapper\">\n  <div class=\"am-pull-to-refresh-content\" [ngClass]=\"transtionCls\" [ngStyle]=\"style\">\n    <div *ngIf=\"direction === 'down'\" class=\"am-pull-to-refresh-indicator\">\n      <ng-template *ngIf=\"isTemplateRef(indicator[state.currSt])\" [ngTemplateOutlet]=\"indicator[state.currSt]\"></ng-template>\n      <ng-container *ngIf=\"!isTemplateRef(indicator[state.currSt])\">{{indicator[state.currSt]}}</ng-container>\n    </div>\n    <div #pullToRefresh>\n      <ng-content></ng-content>\n    </div>\n    <div *ngIf=\"direction === 'up'\" class=\"am-pull-to-refresh-indicator\">\n      <ng-template *ngIf=\"isTemplateRef(indicator[state.currSt])\" [ngTemplateOutlet]=\"indicator[state.currSt]\"></ng-template>\n      <ng-container *ngIf=\"!isTemplateRef(indicator[state.currSt])\">{{indicator[state.currSt]}}</ng-container>\n    </div>\n  </div>\n</div>\n",
                encapsulation: ViewEncapsulation.None
            }] }
];
/** @nocollapse */
PullToRefreshComponent.ctorParameters = () => [];
PullToRefreshComponent.propDecorators = {
    _pullToRefresh: [{ type: ViewChild, args: ['pullToRefresh', { read: ViewContainerRef },] }],
    scrollRefresh: [{ type: Input }],
    distanceToRefresh: [{ type: Input }],
    damping: [{ type: Input }],
    direction: [{ type: Input }],
    indicator: [{ type: Input }],
    footerRefresh: [{ type: Output }],
    onRefresh: [{ type: Output }],
    refresh: [{ type: HostBinding, args: ['class.am-pull-to-refresh',] }],
    container: [{ type: HostBinding, args: ['class.super-container',] }],
    refreshUp: [{ type: HostBinding, args: ['class.am-pull-to-refresh-up',] }],
    refreshDown: [{ type: HostBinding, args: ['class.am-pull-to-refresh-down',] }],
    touchstart: [{ type: HostListener, args: ['touchstart', ['$event'],] }],
    touchmove: [{ type: HostListener, args: ['touchmove', ['$event'],] }],
    touchend: [{ type: HostListener, args: ['touchend', ['$event'],] }],
    touchcancel: [{ type: HostListener, args: ['touchcancel', ['$event'],] }],
    scroll: [{ type: HostListener, args: ['scroll', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PullToRefreshModule {
}
PullToRefreshModule.decorators = [
    { type: NgModule, args: [{
                imports: [CommonModule, IconModule],
                exports: [PullToRefreshComponent],
                declarations: [PullToRefreshComponent]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ToastOptions {
}
ToastOptions.decorators = [
    { type: Injectable }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Toast {
    /**
     * @param {?} _appRef
     * @param {?} _compiler
     * @param {?} _cfr
     * @param {?} _zone
     */
    constructor(_appRef, _compiler, _cfr, _zone) {
        this._appRef = _appRef;
        this._compiler = _compiler;
        this._cfr = _cfr;
        this._zone = _zone;
        Toast._zone = this._zone;
        Toast._appRef = this._appRef;
        Toast._toastCompFactory = this._cfr.resolveComponentFactory(ToastComponent);
    }
    /**
     * @param {?} config
     * @param {?} options
     * @return {?}
     */
    static _initConfig(config, options) {
        /** @type {?} */
        const props = {};
        /** @type {?} */
        const optionalParams = ['content', 'iconType', 'mask'];
        config = Object.assign(options, config);
        optionalParams.forEach(key => {
            if (config[key] !== undefined) {
                props[key] = config[key];
            }
        });
        /** @type {?} */
        const iconType = {
            info: '',
            success: 'success',
            fail: 'fail',
            offline: 'dislike',
            loading: 'loading'
        }[options.iconType];
        props['iconType'] = iconType;
        props['mask'] = options.mask;
        return props;
    }
    /**
     * @param {?} config
     * @param {?} type
     * @param {?=} timeInterval
     * @param {?=} onClose
     * @param {?=} mask
     * @return {?}
     */
    static notice(config, type, timeInterval = 2000, onClose, mask = true) {
        // 如果已经存在,在没有遮罩层的情况下,会响应别的toast,需要清除原来的
        if (Toast.compRef) {
            Toast.hide();
        }
        /** @type {?} */
        const options = new ToastOptions();
        options.iconType = type;
        options.mask = mask;
        /** @type {?} */
        const props = Toast._initConfig(config, options);
        document.body.insertBefore(document.createElement(Toast._toastCompFactory.selector), document.body.firstChild);
        /** @type {?} */
        let instance;
        /** @type {?} */
        let subject;
        Toast.compRef = Toast._appRef.bootstrap(Toast._toastCompFactory);
        instance = Toast.compRef.instance;
        subject = instance.subject;
        if (timeInterval) {
            Toast.timeout = setTimeout(() => {
                if (onClose) {
                    onClose();
                }
                Toast.hide();
            }, timeInterval);
        }
        Object.assign(instance, props);
        return subject;
    }
    /**
     * Open info dialog
     * @param {?=} content
     * @param {?=} timeInterval
     * @param {?=} onClose
     * @param {?=} mask
     * @return {?}
     */
    static info(content, timeInterval, onClose, mask) {
        /** @type {?} */
        const config = Object.assign({
            iconType: 'info',
            content: content
        });
        return Toast.notice(config, 'info', timeInterval, onClose, mask);
    }
    /**
     * Open success dialog
     * @param {?=} content
     * @param {?=} timeInterval
     * @param {?=} onClose
     * @param {?=} mask
     * @return {?}
     */
    static success(content, timeInterval, onClose, mask) {
        /** @type {?} */
        const config = Object.assign({
            iconType: 'success',
            content: content
        });
        return Toast.notice(config, 'success', timeInterval, onClose, mask);
    }
    /**
     * @param {?=} content
     * @param {?=} timeInterval
     * @param {?=} mask
     * @return {?}
     */
    static show(content, timeInterval, mask) {
        /** @type {?} */
        const config = Object.assign({
            iconType: 'info',
            content: content
        });
        return Toast.notice(config, 'info', timeInterval, () => { }, mask);
    }
    /**
     * @param {?=} content
     * @param {?=} timeInterval
     * @param {?=} onClose
     * @param {?=} mask
     * @return {?}
     */
    static fail(content, timeInterval, onClose, mask) {
        /** @type {?} */
        const config = Object.assign({
            iconType: 'fail',
            content: content
        });
        return Toast.notice(config, 'fail', timeInterval, onClose, mask);
    }
    /**
     * @param {?=} content
     * @param {?=} timeInterval
     * @param {?=} onClose
     * @param {?=} mask
     * @return {?}
     */
    static offline(content, timeInterval, onClose, mask) {
        /** @type {?} */
        const config = Object.assign({
            iconType: 'offline',
            content: content
        });
        return Toast.notice(config, 'offline', timeInterval, onClose, mask);
    }
    /**
     * @param {?=} content
     * @param {?=} timeInterval
     * @param {?=} onClose
     * @param {?=} mask
     * @return {?}
     */
    static loading(content, timeInterval, onClose, mask) {
        /** @type {?} */
        const config = Object.assign({
            iconType: 'loading',
            content: content
        });
        return Toast.notice(config, 'loading', timeInterval, onClose, mask);
    }
    /**
     * @return {?}
     */
    static hide() {
        if (Toast.timeout) {
            clearTimeout(Toast.timeout);
        }
        if (Toast.compRef) {
            Toast._zone.run(() => {
                Toast.compRef.destroy();
            });
            Toast.compRef = null;
        }
    }
}
Toast.timeout = null;
Toast._zone = null;
Toast.compRef = null;
Toast._toastCompFactory = null;
Toast._appRef = null;
Toast.decorators = [
    { type: Injectable }
];
/** @nocollapse */
Toast.ctorParameters = () => [
    { type: ApplicationRef },
    { type: Compiler },
    { type: ComponentFactoryResolver },
    { type: NgZone }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Modal {
    /**
     * @param {?} _appRef
     * @param {?} _compiler
     * @param {?} _cfr
     */
    constructor(_appRef, _compiler, _cfr) {
        this._appRef = _appRef;
        this._compiler = _compiler;
        this._cfr = _cfr;
        Modal.appRef = this._appRef;
        Modal._modalCompFactory = this._cfr.resolveComponentFactory(ModalComponent);
    }
    /**
     * @param {?} config
     * @param {?} options
     * @return {?}
     */
    static _initConfig(config, options) {
        /** @type {?} */
        const props = new BaseOptions();
        /** @type {?} */
        const optionalParams = [
            'visible',
            'focus',
            'closable',
            'maskClosable',
            'onClose',
            'transparent',
            'popup',
            'animationType',
            'title',
            'footer',
            'platform',
            'className',
            'wrapClassName',
            'message',
            'actions',
            'callbackOrActions',
            'type',
            'defaultValue',
            'placeholders',
            'operation',
            'transitionName',
            'maskTransitionName',
            'close'
        ];
        options.transitionName = `${options.transitionName}-enter ${options.transitionName}-enter-active`;
        options.maskTransitionName = `${options.maskTransitionName}-enter ${options.maskTransitionName}-enter-active`;
        config = Object.assign(options, config, {
            close: () => {
                if (config.maskClosable || config.closable) {
                    Modal.closeWithAnimation();
                }
            }
        });
        optionalParams.forEach(key => {
            if (config[key] !== undefined) {
                props[key] = config[key];
            }
        });
        return props;
    }
    /**
     * @param {?} props
     * @param {?} factory
     * @return {?}
     */
    static _open(props, factory) {
        document.body.insertBefore(document.createElement(factory.selector), document.body.firstChild);
        /** @type {?} */
        let subject;
        Modal.compRef = Modal.appRef.bootstrap(factory);
        Modal.instance = Modal.compRef.instance;
        subject = Modal.instance.subject;
        Object.assign(Modal.instance, props);
        return subject;
    }
    /**
     * @return {?}
     */
    static closeWithAnimation() {
        /** @type {?} */
        const options = new BaseOptions();
        Modal.instance.transitionName = `${options.transitionName}-leave ${options.transitionName}-leave-active`;
        Modal.instance.maskTransitionName = `${options.maskTransitionName}-leave ${options.maskTransitionName}-leave-active`;
        setTimeout(() => {
            Modal.close();
        }, 200);
    }
    /**
     * @param {?} config
     * @return {?}
     */
    static open(config) {
        /** @type {?} */
        const options = new ModalOptions();
        /** @type {?} */
        const props = Modal._initConfig(config, options);
        return Modal._open(props, Modal._modalCompFactory);
    }
    /**
     * @param {?=} title
     * @param {?=} message
     * @param {?=} actions
     * @param {?=} platform
     * @return {?}
     */
    static alert(title, message, actions, platform) {
        /** @type {?} */
        const options = new AlertOptions();
        options.visible = true;
        options.transparent = true;
        options.closable = false;
        options.maskClosable = false;
        options.platform = 'ios';
        /** @type {?} */
        const footer = getFooter(actions);
        /** @type {?} */
        const config = Object.assign({
            title: title,
            message: message,
            actions: footer ? footer : [{ text: '确定' }],
            platform: platform ? platform : 'ios'
        });
        /** @type {?} */
        const props = Modal._initConfig(config, options);
        return Modal._open(props, this._modalCompFactory);
    }
    /**
     * @param {?=} title
     * @param {?=} message
     * @param {?=} callbackOrActions
     * @param {?=} type
     * @param {?=} defaultValue
     * @param {?=} placeholders
     * @param {?=} platform
     * @return {?}
     */
    static prompt(title, message, callbackOrActions, type, defaultValue, placeholders, platform) {
        /** @type {?} */
        const options = new AlertOptions();
        options.visible = true;
        options.transparent = true;
        options.closable = false;
        options.maskClosable = false;
        options.className = 'am-modal-alert-content';
        options.defaultValue = defaultValue;
        options.placeholders = placeholders;
        (options.type = type ? type : 'default'), (options.platform = platform ? platform : 'ios');
        /**
         * @param {?} self
         * @param {?} func
         * @return {?}
         */
        function getArgs(self, func) {
            /** @type {?} */
            const text = self.instance.data.text || defaultValue || '';
            /** @type {?} */
            const password = self.instance.data.password || '';
            if (type === 'login-password') {
                return func(text, password);
            }
            else if (type === 'secure-text') {
                return func(password || defaultValue);
            }
            return func(text);
        }
        /** @type {?} */
        let actions;
        if (typeof callbackOrActions === 'function') {
            actions = [
                { text: '取消' },
                {
                    text: '确定',
                    onPress: () => {
                        getArgs(this, callbackOrActions);
                    }
                }
            ];
        }
        else {
            actions = callbackOrActions.map(item => {
                return {
                    text: item.text,
                    onPress: () => {
                        if (item.onPress) {
                            return getArgs(this, item.onPress);
                        }
                    }
                };
            });
        }
        /** @type {?} */
        const footer = getFooter(actions);
        /** @type {?} */
        const config = Object.assign({
            title: title,
            message: message,
            type: type ? type : 'default',
            actions: footer ? footer : [{ text: '确定' }],
            platform: platform ? platform : 'ios'
        });
        /** @type {?} */
        const props = Modal._initConfig(config, options);
        return Modal._open(props, this._modalCompFactory);
    }
    /**
     * @param {?=} actions
     * @param {?=} platform
     * @return {?}
     */
    static operation(actions, platform) {
        /** @type {?} */
        const options = new BaseOptions();
        options.visible = true;
        options.transparent = true;
        options.closable = false;
        options.maskClosable = false;
        options.operation = true;
        options.className = 'am-modal-operation';
        /** @type {?} */
        const footer = getFooter(actions);
        /** @type {?} */
        const config = Object.assign({
            actions: footer ? footer : [{ text: '确定' }],
            platform: platform ? platform : 'ios'
        });
        /** @type {?} */
        const props = Modal._initConfig(config, options);
        return Modal._open(props, this._modalCompFactory);
    }
    /**
     * @return {?}
     */
    static close() {
        if (Modal.compRef) {
            Modal.compRef.destroy();
            Modal.compRef = null;
        }
    }
}
Modal.compRef = null;
Modal._modalCompFactory = null;
Modal.appRef = null;
Modal.instance = null;
Modal.decorators = [
    { type: Injectable }
];
/** @nocollapse */
Modal.ctorParameters = () => [
    { type: ApplicationRef },
    { type: Compiler },
    { type: ComponentFactoryResolver }
];
/**
 * @param {?} actions
 * @return {?}
 */
function getFooter(actions) {
    return actions.map((button) => {
        /** @type {?} */
        const orginPress = button.onPress || function () { };
        button.onPress = () => {
            /** @type {?} */
            const res = orginPress();
            if (res && res.then) {
                res.then(() => {
                    Modal.closeWithAnimation();
                });
            }
            else {
                Modal.closeWithAnimation();
            }
        };
        return button;
    });
}

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class ActionSheetOptions {
    constructor() {
        this.transitionName = 'am-slide-up';
        this.maskTransitionName = 'am-fade';
    }
}
ActionSheetOptions.decorators = [
    { type: Injectable }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/** @type {?} */
const NORMAL = 'NORMAL';
/** @type {?} */
const SHARE = 'SHARE';
/**
 * @return {?}
 */
function noop() { }
class ActionSheet {
    /**
     * @param {?} _appRef
     * @param {?} _cfr
     */
    constructor(_appRef, _cfr) {
        this._appRef = _appRef;
        this._cfr = _cfr;
        ActionSheet.appRef = this._appRef;
        ActionSheet._actionSheetCompFactory = this._cfr.resolveComponentFactory(ActionSheetComponent);
    }
    /**
     * @param {?} config
     * @param {?=} options
     * @return {?}
     */
    static _initConfig(config, options = {}) {
        /** @type {?} */
        const props = new ActionSheetOptions();
        /** @type {?} */
        const optionalParams = [
            'prefixCls',
            'maskClosable',
            'cancelButtonIndex',
            'destructiveButtonIndex',
            'title',
            'message',
            'className',
            'transitionName',
            'maskTransitionName',
            'options'
        ];
        config = Object.assign(options, config);
        optionalParams.forEach(key => {
            if (config[key] !== undefined) {
                props[key] = config[key];
            }
        });
        return props;
    }
    /**
     * @param {?} props
     * @param {?} factory
     * @return {?}
     */
    static _open(props, factory) {
        document.body.insertBefore(document.createElement(factory.selector), document.body.firstChild);
        /** @type {?} */
        let subject;
        ActionSheet.compRef = ActionSheet.appRef.bootstrap(factory);
        ActionSheet.instance = ActionSheet.compRef.instance;
        subject = ActionSheet.instance.subject;
        Object.assign(ActionSheet.instance, props);
        return subject;
    }
    /**
     * @param {?} flag
     * @param {?} config
     * @param {?} callback
     * @return {?}
     */
    static createActionSheet(flag, config, callback) {
        /** @type {?} */
        const options = new ActionSheetOptions();
        /** @type {?} */
        const transitionName = config.transitionName ? config.transitionName : options.transitionName;
        options.transitionName = `${transitionName}-enter ${transitionName}-enter-active`;
        /** @type {?} */
        const maskTransitionName = config.maskTransitionName ? config.maskTransitionName : options.maskTransitionName;
        options.maskTransitionName = `${maskTransitionName}-enter ${maskTransitionName}-enter-active`;
        /** @type {?} */
        const props = ActionSheet._initConfig(config, options);
        Object.assign(props, { onPress: cb }, { flag: flag });
        /**
         * @param {?} index
         * @param {?=} rowIndex
         * @param {?=} event
         * @return {?}
         */
        function cb(index, rowIndex = 0, event) {
            event.stopPropagation();
            /** @type {?} */
            const res = callback(index, rowIndex);
            if (res && res.then) {
                res.then(() => {
                    ActionSheet.closeWithAnimation(transitionName, maskTransitionName);
                });
            }
            else {
                ActionSheet.closeWithAnimation(transitionName, maskTransitionName);
            }
        }
        return ActionSheet._open(props, ActionSheet._actionSheetCompFactory);
    }
    /**
     * @param {?} transitionName
     * @param {?} maskTransitionName
     * @return {?}
     */
    static closeWithAnimation(transitionName, maskTransitionName) {
        ActionSheet.instance.transitionName = `${transitionName}-leave ${transitionName}-leave-active`;
        ActionSheet.instance.maskTransitionName = `${maskTransitionName}-leave ${maskTransitionName}-leave-active`;
        setTimeout(() => {
            ActionSheet.close();
        }, 200);
    }
    /**
     * @param {?} config
     * @param {?=} callback
     * @return {?}
     */
    static showActionSheetWithOptions(config, callback = noop) {
        ActionSheet.createActionSheet(NORMAL, config, callback);
    }
    /**
     * @param {?} config
     * @param {?=} callback
     * @return {?}
     */
    static showShareActionSheetWithOptions(config, callback = noop) {
        ActionSheet.createActionSheet(SHARE, config, callback);
    }
    /**
     * @return {?}
     */
    static close() {
        if (ActionSheet.compRef) {
            ActionSheet.compRef.destroy();
            ActionSheet.compRef = null;
        }
    }
}
ActionSheet.compRef = null;
ActionSheet._actionSheetCompFactory = null;
ActionSheet.appRef = null;
ActionSheet.instance = null;
ActionSheet.decorators = [
    { type: Injectable }
];
/** @nocollapse */
ActionSheet.ctorParameters = () => [
    { type: ApplicationRef },
    { type: ComponentFactoryResolver }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class Picker$4 extends PopupService {
    /**
     * @param {?=} config
     * @param {?=} confirmCallback
     * @param {?=} cancelCallback
     * @return {?}
     */
    static showPicker(config = Picker$4.defaultOptions, confirmCallback, cancelCallback) {
        /** @type {?} */
        const options = new PickerOptions();
        Object.assign(options, config, {
            hidePicker: (event) => {
                this.hidePicker();
            },
            confirm: (event) => {
                if (confirmCallback) {
                    confirmCallback(event);
                }
            },
            cancel: () => {
                if (cancelCallback) {
                    cancelCallback();
                }
            }
        });
        /** @type {?} */
        const optionalParams = [
            'data',
            'value',
            'cols',
            'mask',
            'title',
            'okText',
            'dismissText',
            'disabled',
            'cascade',
            'onOk',
            'onPickerChange',
            'indicatorStyle'
        ];
        optionalParams.forEach(param => {
            if (typeof this[param] !== 'undefined') {
                (/** @type {?} */ (options))[param] = this[param];
            }
        });
        /** @type {?} */
        const childInjector = Injector.create([
            {
                provide: PickerOptions,
                useValue: options
            }
        ]);
        Picker$4.showPopup(PickerComponent, childInjector);
    }
    /**
     * @return {?}
     */
    static hidePicker() {
        Picker$4.hidePopup();
    }
}
Picker$4.defaultOptions = new PickerOptions();
Picker$4.decorators = [
    { type: Injectable }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class NgZorroAntdMobileModule {
    /**
     * @return {?}
     */
    static forRoot() {
        return {
            ngModule: NgZorroAntdMobileModule,
            providers: [ActionSheet, Toast, Modal, Picker$4]
        };
    }
}
NgZorroAntdMobileModule.decorators = [
    { type: NgModule, args: [{
                providers: [],
                exports: [
                    ActivityIndicatorModule,
                    CardModule,
                    TabsModule,
                    TabBarModule,
                    ButtonModule,
                    SwitchModule,
                    SearchBarModule,
                    StepperModule,
                    StepsModule,
                    CheckboxModule,
                    ProgressModule,
                    SegmentedControlModule,
                    BadgeModule,
                    CarouselModule,
                    ActionSheetModule,
                    AccordionModule,
                    NoticeBarModule,
                    IconModule,
                    ToastModule,
                    RadioModule,
                    ModalModule,
                    PopoverModule,
                    PopoverItemModule,
                    NavBarModule,
                    ListModule,
                    CalendarModule,
                    InputItemModule,
                    FlexModule,
                    GridModule,
                    RangeModule,
                    SliderModule,
                    TextareaItemModule,
                    NgZorroAntdMobilePipesModule,
                    PickerModule,
                    PickerViewModule,
                    ImagePickerModule,
                    ResultModule,
                    WhiteSpaceModule,
                    WingBlankModule,
                    LocaleProviderModule,
                    NgZorroAntdMobilePipesModule,
                    PaginationModule,
                    TagModule,
                    MenuModule,
                    DatePickerModule,
                    DatePickerViewModule,
                    DrawerModule,
                    PullToRefreshModule,
                    SwipeActionModule
                ]
            },] }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */

export { ActivityIndicatorModule, CardModule, ResultModule, WhiteSpaceModule, WingBlankModule, TabsModule, TabBarModule, BadgeModule, InputItemModule, ButtonModule, SwitchModule, SearchBarModule, StepperModule, StepsModule, CarouselModule, CheckboxModule, RadioModule, ProgressModule, AccordionModule, NoticeBarModule, IconModule, ToastModule, ModalModule, PopoverModule, NavBarModule, ListModule, PopoverItemModule, FlexModule, GridModule, ActionSheetModule, SegmentedControlModule, TextareaItemModule, NgZorroAntdMobilePipesModule, RangeModule, SliderModule, PaginationModule, TagModule, MenuModule, PickerModule, PickerViewModule, ImagePickerModule, DatePickerModule, DatePickerViewModule, DrawerModule, SwipeActionModule, PullToRefreshModule, LocaleProviderModule, LocaleProviderService, LOCAL_PROVIDER_TOKEN, LocaleProviderPipe, Toast, ToastComponent, Modal, ModalComponent, ActionSheet, ActionSheetComponent, Picker$4 as Picker, PickerComponent, NgZorroAntdMobileModule, en_US, ru_RU, sv_SE, zh_CN, AccordionGroupComponent as ɵbq, AccordionComponent as ɵbo, AccordionService as ɵbp, ActivityIndicator as ɵd, Badge as ɵl, Button as ɵo, NZ_BUTTON_DIRECTIVES as ɵa, CalendarComponent as ɵcl, CalendarModule as ɵcg, ConfirmPanelComponent as ɵcq, DatePickerComponent as ɵcn, HeaderComponent as ɵcm, ShortcutPanelComponent as ɵcs, SingleMonthComponent as ɵcp, TimePickerComponent as ɵcr, WeekPanelComponent as ɵco, CardBody as ɵg, CardFooter as ɵh, CardHeader as ɵf, Card as ɵe, CarouselSlideComponent as ɵbh, CarouselComponent as ɵbg, DotIndicatorComponent as ɵbi, AgreeItem as ɵbd, CheckboxItem as ɵbc, Checkbox as ɵbb, CoreModule as ɵbk, TouchFeedBackComponent as ɵbn, TouchFeedbackDirective as ɵbm, PopupService as ɵbl, IconHandler as ɵq, DatePickerViewComponent as ɵck, DatePickerOptions as ɵci, DatePickerComponent$1 as ɵch, DatePickerDirective as ɵcj, DrawerComponent as ɵdm, FlexComponent as ɵct, FlexItemComponent as ɵcu, GridComponent as ɵcv, IconComponent as ɵp, ImagePicker as ɵdg, CustomInput as ɵbw, CustomInputService as ɵbx, CustomKeyboard as ɵbv, InputItem as ɵbu, Brief as ɵv, ListItem as ɵu, List as ɵt, LOCALE_PROVIDER_SERVICE_FACTORY as ɵb, LOCALE_PROVIDER_SERVICE_PROVIDER as ɵc, MenuComponent as ɵdk, SubMenuComponent as ɵdl, BaseOptions as ɵby, ModalOptions as ɵbz, NavBarComponent as ɵcf, NoticeBarComponent as ɵbr, PaginationComponent as ɵdi, PickerViewComponent as ɵdf, PickerOptions as ɵdd, PickerDirective as ɵde, SafeHTMLPipe as ɵbj, PopoverComponentOptions as ɵcd, PopoverItemComponent as ɵce, PopoverOptions as ɵcb, PopoverComponent as ɵcc, PopoverDirective as ɵca, ProgressComponent as ɵbe, PullToRefreshComponent as ɵdn, RadioItem as ɵbt, Radio as ɵbs, Range as ɵcw, Result as ɵdh, SearchBar$1 as ɵx, SegmentedControlComponent as ɵbf, SliderHandle as ɵcy, SliderMarks as ɵcz, SliderSteps as ɵda, SliderTrack as ɵdb, Slider as ɵcx, Stepper as ɵy, Step as ɵba, Steps as ɵz, SwipeAction as ɵdo, Switch as ɵw, TabBarTab as ɵn, TabBar as ɵm, DefaultTabBarComponent as ɵk, TabPane as ɵi, Tabs as ɵj, TagComponent as ɵdj, TextareaItem as ɵdc, WhiteSpace as ɵs, WingBlank as ɵr };

//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctem9ycm8tYW50ZC1tb2JpbGUuanMubWFwIiwic291cmNlcyI6WyJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2FjdGl2aXR5LWluZGljYXRvci9hY3Rpdml0eS1pbmRpY2F0b3IuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9hY3Rpdml0eS1pbmRpY2F0b3IvYWN0aXZpdHktaW5kaWNhdG9yLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvY2FyZC9jYXJkLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvY2FyZC9jYXJkLWhlYWRlci5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2NhcmQvY2FyZC1ib2R5LmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvY2FyZC9jYXJkLWZvb3Rlci5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2NhcmQvY2FyZC5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2JhZGdlL2JhZGdlLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvYmFkZ2UvYmFkZ2UubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9pbnB1dC1pdGVtL2lucHV0LWl0ZW0uY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9sb2NhbGUtcHJvdmlkZXIvbG9jYWxlLXByb3ZpZGVyLnRva2VuLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9waWNrZXIvbG9jYWxlL3poX0NOLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9kYXRlLXBpY2tlci9sb2NhbGUvemhfQ04udHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2RhdGUtcGlja2VyLXZpZXcvbG9jYWxlL3poX0NOLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9tZW51L2xvY2FsZS96aF9DTi50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvY2FsZW5kYXIvbG9jYWxlL3poX0NOLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9zZWFyY2gtYmFyL2xvY2FsZS96aF9DTi50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvaW5wdXQtaXRlbS9sb2NhbGUvemhfQ04udHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3BhZ2luYXRpb24vbG9jYWxlL3poX0NOLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9wdWxsLXRvLXJlZnJlc2gvbG9jYWxlL3poX0NOLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9sb2NhbGUtcHJvdmlkZXIvbGFuZ3VhZ2VzL3poX0NOLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9sb2NhbGUtcHJvdmlkZXIvbG9jYWxlLXByb3ZpZGVyLnNlcnZpY2UudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2lucHV0LWl0ZW0vY3VzdG9tLWtleWJvYXJkL2N1c3RvbS1rZXlib2FyZC5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2lucHV0LWl0ZW0vY3VzdG9tLWlucHV0L2N1c3RvbS1pbnB1dC5zZXJ2aWNlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9pbnB1dC1pdGVtL2N1c3RvbS1pbnB1dC9jdXN0b20taW5wdXQuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9pbnB1dC1pdGVtL2lucHV0LWl0ZW0ubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9idXR0b24vYnV0dG9uLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvY29yZS91dGlsL2ljb24udHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2ljb24vaWNvbi5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2ljb24vaWNvbi5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3dpbmctYmxhbmsvd2luZy1ibGFuay5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3dpbmctYmxhbmsvd2luZy1ibGFuay5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3doaXRlLXNwYWNlL3doaXRlLXNwYWNlLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvd2hpdGUtc3BhY2Uvd2hpdGUtc3BhY2UubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9saXN0L2xpc3QuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9saXN0L2xpc3QtaXRlbS9saXN0LWl0ZW0uY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9saXN0L2JyaWVmL2JyaWVmLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvbGlzdC9saXN0Lm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvYnV0dG9uL2J1dHRvbi5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3N3aXRjaC9zd2l0Y2guY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9zd2l0Y2gvc3dpdGNoLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvc2VhcmNoLWJhci9zZWFyY2gtYmFyLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvc2VhcmNoLWJhci9zZWFyY2gtYmFyLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvc3RlcHBlci9zdGVwcGVyLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvc3RlcHBlci9zdGVwcGVyLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvc3RlcHMvc3RlcC9zdGVwLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvc3RlcHMvc3RlcHMuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9zdGVwcy9zdGVwcy5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2Nhcm91c2VsL2Nhcm91c2VsLXNsaWRlL2Nhcm91c2VsLXNsaWRlLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvY29yZS91dGlsL3RvdWNoLWV2ZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jYXJvdXNlbC9jYXJvdXNlbC5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2Nhcm91c2VsL2RvdGluZGljYXRvci9kb3RpbmRpY2F0b3IuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jYXJvdXNlbC9jYXJvdXNlbC5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2NvcmUvdXRpbC9jb252ZXJ0LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2NoZWNrYm94L2FncmVlLWl0ZW0uY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jaGVja2JveC9jaGVja2JveC1pdGVtLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvY2hlY2tib3gvY2hlY2tib3gubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9yYWRpby9yYWRpby5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3JhZGlvL3JhZGlvLWl0ZW0uY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9yYWRpby9yYWRpby5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3Byb2dyZXNzL3Byb2dyZXNzLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcHJvZ3Jlc3MvcHJvZ3Jlc3MubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9hY2NvcmRpb24vYWNjb3JkaW9uLnNlcnZpY2UudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2FjY29yZGlvbi9hY2NvcmRpb24tZ3JvdXAvYWNjb3JkaW9uLWdyb3VwLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvYWNjb3JkaW9uL2FjY29yZGlvbi5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2FjY29yZGlvbi9hY2NvcmRpb24ubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9ub3RpY2UtYmFyL25vdGljZS1iYXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9ub3RpY2UtYmFyL25vdGljZS1iYXIubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS90b2FzdC90b2FzdC5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3RvYXN0L3RvYXN0Lm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvbW9kYWwvbW9kYWwtb3B0aW9ucy5wcm92aWRlci50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvbW9kYWwvbW9kYWwuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9tb2RhbC9tb2RhbC5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3BvcG92ZXIvcG9wb3Zlci1vcHRpb25zLnByb3ZpZGVyLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9wb3BvdmVyL3BvcG92ZXItY29tcG9uZW50LW9wdGlvbnMucHJvdmlkZXIudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2NvcmUvdXRpbC9wb3NpdGlvbi50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcG9wb3Zlci9wb3BvdmVyLmRpcmVjdGl2ZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcG9wb3Zlci9wb3BvdmVyLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvbmF2LWJhci9uYXYtYmFyLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvbmF2LWJhci9uYXYtYmFyLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvY2FsZW5kYXIvbG9jYWxlL2VuX1VTLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jYWxlbmRhci91dGlsL2luZGV4LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2NhbGVuZGFyL2hlYWRlci9oZWFkZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jYWxlbmRhci9kYXRlL0RhdGFUeXBlcy50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvY2FsZW5kYXIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmJhc2UuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jYWxlbmRhci9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9waWNrZXIvbG9jYWxlL2VuX1VTLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9kYXRlLXBpY2tlci9sb2NhbGUvZW5fVVMudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2RhdGUtcGlja2VyLXZpZXcvbG9jYWxlL2VuX1VTLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9tZW51L2xvY2FsZS9lbl9VUy50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvc2VhcmNoLWJhci9sb2NhbGUvZW5fVVMudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2lucHV0LWl0ZW0vbG9jYWxlL2VuX1VTLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9wYWdpbmF0aW9uL2xvY2FsZS9lbl9VUy50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcHVsbC10by1yZWZyZXNoL2xvY2FsZS9lbl9VUy50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvbG9jYWxlLXByb3ZpZGVyL2xhbmd1YWdlcy9lbl9VUy50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcGlja2VyL2xvY2FsZS9ydV9SVS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvZGF0ZS1waWNrZXIvbG9jYWxlL3J1X1JVLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9kYXRlLXBpY2tlci12aWV3L2xvY2FsZS9ydV9SVS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvbWVudS9sb2NhbGUvcnVfUlUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3NlYXJjaC1iYXIvbG9jYWxlL3J1X1JVLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9pbnB1dC1pdGVtL2xvY2FsZS9ydV9SVS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcGFnaW5hdGlvbi9sb2NhbGUvcnVfUlUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3B1bGwtdG8tcmVmcmVzaC9sb2NhbGUvcnVfUlUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2xvY2FsZS1wcm92aWRlci9sYW5ndWFnZXMvcnVfUlUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3BpY2tlci9sb2NhbGUvc3ZfU0UudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2RhdGUtcGlja2VyL2xvY2FsZS9zdl9TRS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvZGF0ZS1waWNrZXItdmlldy9sb2NhbGUvc3ZfU0UudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL21lbnUvbG9jYWxlL3N2X1NFLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9zZWFyY2gtYmFyL2xvY2FsZS9zdl9TRS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvaW5wdXQtaXRlbS9sb2NhbGUvc3ZfU0UudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3BhZ2luYXRpb24vbG9jYWxlL3N2X1NFLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9wdWxsLXRvLXJlZnJlc2gvbG9jYWxlL3N2X1NFLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9sb2NhbGUtcHJvdmlkZXIvbGFuZ3VhZ2VzL3N2X1NFLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jYWxlbmRhci90aW1lcGlja2VyL3RpbWVwaWNrZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jYWxlbmRhci93ZWVrLXBhbmVsL3dlZWstcGFuZWwuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jYWxlbmRhci9jb25maXJtLXBhbmVsL2NvbmZpcm0tcGFuZWwuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jYWxlbmRhci9zaW5nbGUtbW9udGgvc2luZ2xlLW1vbnRoLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvY2FsZW5kYXIvc2hvcnRjdXQtcGFuZWwvc2hvcnRjdXQtcGFuZWwuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci1vcHRpb25zLnByb3ZpZGVyLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jb3JlL3V0aWwvdmVsb2NpdHkudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvZGF0ZS1waWNrZXItdmlldy9kYXRlLXBpY2tlci12aWV3LmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvbG9jYWxlLXByb3ZpZGVyL2xvY2FsZS1wcm92aWRlci5waXBlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9sb2NhbGUtcHJvdmlkZXIvbG9jYWxlLXByb3ZpZGVyLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2RhdGUtcGlja2VyLXZpZXcvZGF0ZS1waWNrZXItdmlldy5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2NhbGVuZGFyL2NhbGVuZGFyLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcG9wb3Zlci9wb3BvdmVyLWl0ZW0vcG9wb3Zlci1pdGVtLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcG9wb3Zlci9wb3BvdmVyLWl0ZW0vcG9wb3Zlci1pdGVtLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvZmxleC9mbGV4LmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvZmxleC9mbGV4Lm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvZ3JpZC9ncmlkLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvY29yZS9kaXJlY3RpdmUvdG91Y2gtZmVlZGJhY2suZGlyZWN0aXZlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9jb3JlL2RpcmVjdGl2ZS90b3VjaC1mZWVkYmFjay5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2NvcmUvc2VydmljZXMvcG9wdXAuc2VydmljZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvY29yZS9jb3JlLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvZ3JpZC9ncmlkLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcGlwZXMvc2F2ZS1odG1sLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9waXBlcy9uZy16b3Jyby1hbnRkLW1vYmlsZS5waXBlcy5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2FjdGlvbi1zaGVldC9hY3Rpb24tc2hlZXQuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9hY3Rpb24tc2hlZXQvYWN0aW9uLXNoZWV0Lm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvc2VnbWVudGVkLWNvbnRyb2wvc2VnbWVudGVkLWNvbnRyb2wuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9zZWdtZW50ZWQtY29udHJvbC9zZWdtZW50ZWQtY29udHJvbC5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3RleHRhcmVhLWl0ZW0vdGV4dGFyZWEtaXRlbS5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3RleHRhcmVhLWl0ZW0vdGV4dGFyZWEtaXRlbS5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3RhYnMvdGFiLXBhbmUuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS90YWJzL3RhYnMuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS90YWJzL2RlZmF1bHQtdGFiLWJhci5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3RhYnMvdGFicy5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3RhYi1iYXIvdGFiLWJhci10YWIuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS90YWItYmFyL3RhYi1iYXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS90YWItYmFyL3RhYi1iYXIubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9waWNrZXIvcGlja2VyLW9wdGlvbnMucHJvdmlkZXIudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3BpY2tlci9kZW1vLWRhdGEvYWRkcmVzcy1kYXRhLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9waWNrZXIvcGlja2VyLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcGlja2VyL3BpY2tlci5kaXJlY3RpdmUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3BpY2tlci9waWNrZXIubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9waWNrZXItdmlldy9waWNrZXItdmlldy5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3BpY2tlci12aWV3L3BpY2tlci12aWV3Lm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvaW1hZ2UtcGlja2VyL2ltYWdlLXBpY2tlci5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2ltYWdlLXBpY2tlci9pbWFnZS1waWNrZXIubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9yZXN1bHQvcmVzdWx0LmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcmVzdWx0L3Jlc3VsdC5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3JhbmdlL3JhbmdlLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvc2xpZGVyL3NsaWRlci5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3NsaWRlci9zbGlkZXItaGFuZGxlL3NsaWRlci1oYW5kbGUuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9zbGlkZXIvc2xpZGVyLW1hcmtzL3NsaWRlci1tYXJrcy5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3NsaWRlci9zbGlkZXItc3RlcHMvc2xpZGVyLXN0ZXBzLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvc2xpZGVyL3NsaWRlci10cmFjay9zbGlkZXItdHJhY2suY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9zbGlkZXIvc2xpZGVyLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcmFuZ2UvcmFuZ2UubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9wYWdpbmF0aW9uL3BhZ2luYXRpb24ubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS90YWcvdGFnLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvdGFnL3RhZy5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL21lbnUvbWVudS5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL21lbnUvc3ViLW1lbnUvc3ViLW1lbnUuY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9tZW51L21lbnUubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9kcmF3ZXIvZHJhd2VyLmNvbXBvbmVudC50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvZHJhd2VyL2RyYXdlci5tb2R1bGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3N3aXBlLWFjdGlvbi9zd2lwZS1hY3Rpb24uY29tcG9uZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9zd2lwZS1hY3Rpb24vc3dpcGUtYWN0aW9uLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcHVsbC10by1yZWZyZXNoL3B1bGwtdG8tcmVmcmVzaC5jb21wb25lbnQudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL3B1bGwtdG8tcmVmcmVzaC9wdWxsLXRvLXJlZnJlc2gubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS90b2FzdC90b2FzdC1vcHRpb25zLnByb3ZpZGVyLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS90b2FzdC90b2FzdC5zZXJ2aWNlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9tb2RhbC9tb2RhbC5zZXJ2aWNlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9hY3Rpb24tc2hlZXQvYWN0aW9uLXNoZWV0LW9wdGlvbnMucHJvdmlkZXIudHMiLCJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlL2FjdGlvbi1zaGVldC9hY3Rpb24tc2hlZXQuc2VydmljZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvcGlja2VyL3BpY2tlci5zZXJ2aWNlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS9uZy16b3Jyby1hbnRkLW1vYmlsZS5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBIb3N0QmluZGluZyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdBY3Rpdml0eUluZGljYXRvciAsIG56bS1jdGl2aXR5LWluZGljYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hY3Rpdml0eS1pbmRpY2F0b3IuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEFjdGl2aXR5SW5kaWNhdG9yIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tYWN0aXZpdHktaW5kaWNhdG9yJztcbiAgc3Bpbm5lckNsYXNzOiBvYmplY3QgPSB7fTtcblxuICBwcml2YXRlIF90ZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgX3NpemU6IHN0cmluZyA9ICdzbWFsbCc7XG4gIHByaXZhdGUgX3RvYXN0OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2FuaW1hdGluZzogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgZ2V0IGFuaW1hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYW5pbWF0aW5nO1xuICB9XG4gIHNldCBhbmltYXRpbmcodjogYm9vbGVhbikge1xuICAgIHRoaXMuX2FuaW1hdGluZyA9IHY7XG4gICAgdGhpcy5zZXRDbGFzcygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzaXplKHY6IHN0cmluZykge1xuICAgIHRoaXMuX3NpemUgPSB2O1xuICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdG9hc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RvYXN0O1xuICB9XG4gIHNldCB0b2FzdCh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5fdG9hc3QgPSB2O1xuICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90ZXh0O1xuICB9XG4gIHNldCB0ZXh0KHY6IHN0cmluZykge1xuICAgIHRoaXMuX3RleHQgPSB2O1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1hY3Rpdml0eS1pbmRpY2F0b3InKVxuICBjbHNBY3RJbmRpY2F0b3I6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWFjdGl2aXR5LWluZGljYXRvci10b2FzdCcpXG4gIGNsc0FjdEluZGljYXRvclRvYXN0O1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWFjdGl2aXR5LWluZGljYXRvci1sZycpXG4gIGNsc0FjdEluZGljYXRvckxnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWFjdGl2aXR5LWluZGljYXRvci1zbScpXG4gIGNsc0FjdEluZGljYXRvclNtO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBzZXRDbGFzcygpIHtcbiAgICBpZiAodGhpcy5fYW5pbWF0aW5nKSB7XG4gICAgICB0aGlzLmNsc0FjdEluZGljYXRvciA9IHRydWU7XG4gICAgICB0aGlzLmNsc0FjdEluZGljYXRvclRvYXN0ID0gISF0aGlzLl90b2FzdDtcbiAgICAgIHRoaXMuY2xzQWN0SW5kaWNhdG9yTGcgPSB0aGlzLl9zaXplID09PSAnbGFyZ2UnO1xuICAgICAgdGhpcy5jbHNBY3RJbmRpY2F0b3JTbSA9IHRoaXMuX3NpemUgPT09ICdzbWFsbCc7XG4gICAgICB0aGlzLnNwaW5uZXJDbGFzcyA9IHtcbiAgICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1zcGlubmVyYF06IHRydWUsXG4gICAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tc3Bpbm5lci1sZ2BdOiAhIXRoaXMuX3RvYXN0IHx8IHRoaXMuX3NpemUgPT09ICdsYXJnZSdcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xzQWN0SW5kaWNhdG9yID0gZmFsc2U7XG4gICAgICB0aGlzLmNsc0FjdEluZGljYXRvckxnID0gZmFsc2U7XG4gICAgICB0aGlzLmNsc0FjdEluZGljYXRvclNtID0gZmFsc2U7XG4gICAgICB0aGlzLmNsc0FjdEluZGljYXRvclRvYXN0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXRDbGFzcygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZpdHlJbmRpY2F0b3IgfSBmcm9tICcuL2FjdGl2aXR5LWluZGljYXRvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5ATmdNb2R1bGUoe1xuICBleHBvcnRzOiBbQWN0aXZpdHlJbmRpY2F0b3JdLFxuICBkZWNsYXJhdGlvbnM6IFtBY3Rpdml0eUluZGljYXRvcl0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUluZGljYXRvck1vZHVsZSB7fVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgSW5wdXQsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0NhcmQsIG56bS1jYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhcmQuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIENhcmQge1xuICBASW5wdXQoKVxuICBmdWxsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1jYXJkJylcbiAgY2FyZFdyYXBwZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWNhcmQtZnVsbCcpXG4gIGdldCBjYXJkRnVsbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mdWxsO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7fVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgSW5wdXQsIEhvc3RCaW5kaW5nLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdDYXJkSGVhZGVyLCBuem0tY2FyZC1oZWFkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FyZC1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIENhcmRIZWFkZXIge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1jYXJkLWhlYWRlcic7XG5cbiAgQElucHV0KClcbiAgdGh1bWI6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+ID0gbnVsbDtcbiAgQElucHV0KClcbiAgdGh1bWJTdHlsZTogb2JqZWN0ID0gbnVsbDtcbiAgQElucHV0KClcbiAgdGl0bGU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+ID0gbnVsbDtcbiAgQElucHV0KClcbiAgZXh0cmE6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+ID0gbnVsbDtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWNhcmQtaGVhZGVyJylcbiAgY2FyZEJvZHlXcmFwcGVyOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgaXNUZW1wbGF0ZVJlZih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuICB9XG5cbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0NhcmRCb2R5LCBuem0tY2FyZC1ib2R5JyxcbiAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBDYXJkQm9keSB7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1jYXJkLWJvZHknKSBjYXJkQm9keVdyYXBwZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgSW5wdXQsIEhvc3RCaW5kaW5nLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdDYXJkRm9vdGVyLCBuem0tY2FyZC1mb290ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FyZC1mb290ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIENhcmRGb290ZXIge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1jYXJkLWZvb3Rlcic7XG5cbiAgQElucHV0KClcbiAgY29udGVudDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD4gPSBudWxsO1xuICBASW5wdXQoKVxuICBleHRyYTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD4gPSBudWxsO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tY2FyZC1mb290ZXInKVxuICBjYXJkRm9vdGVyV3JhcHBlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGlzVGVtcGxhdGVSZWYodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDYXJkIH0gZnJvbSAnLi9jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDYXJkSGVhZGVyIH0gZnJvbSAnLi9jYXJkLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2FyZEJvZHkgfSBmcm9tICcuL2NhcmQtYm9keS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2FyZEZvb3RlciB9IGZyb20gJy4vY2FyZC1mb290ZXIuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0NhcmQsIENhcmRIZWFkZXIsIENhcmRCb2R5LCBDYXJkRm9vdGVyXSxcbiAgZXhwb3J0czogW0NhcmQsIENhcmRIZWFkZXIsIENhcmRCb2R5LCBDYXJkRm9vdGVyXVxufSlcbmV4cG9ydCBjbGFzcyBDYXJkTW9kdWxlIHt9XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEhvc3RCaW5kaW5nLCBPbkNoYW5nZXMsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdCYWRnZSwgbnptLWJhZGdlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JhZGdlLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBCYWRnZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tYmFkZ2UnO1xuICBzY3JvbGxOdW1iZXJDbHM6IG9iamVjdCA9IHt9O1xuICBzdHlsZTogb2JqZWN0ID0ge307XG5cbiAgcHJpdmF0ZSBfdGV4dDogc3RyaW5nO1xuICBwcml2YXRlIF9zZXRDbGFzczogc3RyaW5nO1xuICBwcml2YXRlIF9zaXplOiBzdHJpbmcgPSAnc21hbGwnO1xuICBwcml2YXRlIF9kb3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaG90OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2Nvcm5lcjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9jaGlsZHJlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9vdmVyZmxvd0NvdW50OiBudW1iZXIgPSA5OTtcblxuICBASW5wdXQoKVxuICBzZXQgc2l6ZSh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zaXplID0gdjtcbiAgICB0aGlzLnNldENscygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RleHQ7XG4gIH1cbiAgc2V0IHRleHQodjogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGV4dCA9IHY7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgY29ybmVyKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9jb3JuZXIgPSB2O1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGRvdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZG90O1xuICB9XG4gIHNldCBkb3QodjogYm9vbGVhbikge1xuICAgIHRoaXMuX2RvdCA9IHY7XG4gICAgaWYgKHRoaXMuX2RvdCkge1xuICAgICAgdGhpcy5fdGV4dCA9ICcnO1xuICAgIH1cbiAgICB0aGlzLnNldENscygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBvdmVyZmxvd0NvdW50KHY6IG51bWJlcikge1xuICAgIHRoaXMuX292ZXJmbG93Q291bnQgPSB2O1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBob3QodjogYm9vbGVhbikge1xuICAgIHRoaXMuX2hvdCA9IHY7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc2V0U3R5bGUodjogb2JqZWN0KSB7XG4gICAgdGhpcy5zdHlsZSA9IHY7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGNsYXNzTmFtZSh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zZXRDbGFzcyA9IHY7XG4gICAgY29uc3QgY2xzQXJyID0gdGhpcy5fc2V0Q2xhc3Muc3BsaXQoJyAnKTtcbiAgICBjbHNBcnIuZm9yRWFjaChjbHMgPT4ge1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3ModGhpcy5fcmVmLm5hdGl2ZUVsZW1lbnQsIGNscyk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWJhZGdlJylcbiAgY2xzQmFkZ2U6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWJhZGdlLW5vdC1hLXdyYXBwZXInKVxuICBjbHNCYWRnZVdycDogYm9vbGVhbiA9ICF0aGlzLl9jaGlsZHJlbjtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1iYWRnZS1jb3JuZXItd3JhcHBlcicpXG4gIGNsc0JhZGdlQ29ybmVyV3JwOiBib29sZWFuID0gdGhpcy5fY29ybmVyO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWJhZGdlLWhvdCcpXG4gIGNsc0JhZGdlSG90OiBib29sZWFuID0gISF0aGlzLl9ob3Q7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tYmFkZ2UtY29ybmVyLXdyYXBwZXItbGFyZ2UnKVxuICBjbHNCYWRnZUNvcm5lcldycExnOiBib29sZWFuID0gdGhpcy5fY29ybmVyICYmIHRoaXMuX3NpemUgPT09ICdsYXJnZSc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcjogUmVuZGVyZXIyKSB7fVxuXG4gIHNldENscygpIHtcbiAgICB0aGlzLnNjcm9sbE51bWJlckNscyA9IHtcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tZG90YF06IHRoaXMuX2RvdCxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tZG90LWxhcmdlYF06IHRoaXMuX2RvdCAmJiB0aGlzLl9zaXplID09PSAnbGFyZ2UnLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS10ZXh0YF06ICF0aGlzLl9kb3QgJiYgIXRoaXMuX2Nvcm5lcixcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY29ybmVyYF06IHRoaXMuX2Nvcm5lcixcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY29ybmVyLWxhcmdlYF06IHRoaXMuX2Nvcm5lciAmJiB0aGlzLl9zaXplID09PSAnbGFyZ2UnXG4gICAgfTtcbiAgICB0aGlzLmNsc0JhZGdlV3JwID0gIXRoaXMuX2NoaWxkcmVuO1xuICAgIHRoaXMuY2xzQmFkZ2VDb3JuZXJXcnAgPSB0aGlzLl9jb3JuZXI7XG4gICAgdGhpcy5jbHNCYWRnZUhvdCA9ICEhdGhpcy5faG90O1xuICAgIHRoaXMuY2xzQmFkZ2VDb3JuZXJXcnBMZyA9IHRoaXMuX2Nvcm5lciAmJiB0aGlzLl9zaXplID09PSAnbGFyZ2UnO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl90ZXh0ID09PSAnbnVtYmVyJyAmJiB0aGlzLl90ZXh0ID4gdGhpcy5fb3ZlcmZsb3dDb3VudCkge1xuICAgICAgdGhpcy5fdGV4dCA9IHRoaXMuX292ZXJmbG93Q291bnQgKyAnKyc7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9yZWYubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRoaXMuX2NoaWxkcmVuID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXRDbHMoKTtcbiAgICAgIH1cbiAgICB9LCAxMCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYWRnZSB9IGZyb20gJy4vYmFkZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQE5nTW9kdWxlKHtcbiAgZXhwb3J0czogW0JhZGdlXSxcbiAgZGVjbGFyYXRpb25zOiBbQmFkZ2VdLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgQmFkZ2VNb2R1bGUge31cbiIsImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdDaGlsZCxcbiAgT25DaGFuZ2VzLFxuICBIb3N0QmluZGluZyxcbiAgUmVuZGVyZXIyLFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdJbnB1dEl0ZW0sIG56bS1pbnB1dC1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IElucHV0SXRlbSksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgSW5wdXRJdGVtIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0taW5wdXQnO1xuICB3cmFwQ2xzOiBvYmplY3Q7XG4gIGxhYmVsQ2xzOiBvYmplY3Q7XG4gIGNvbnRyb2xDbHM6IG9iamVjdDtcbiAgc2V0Rm9jdXM6IG9iamVjdCA9IHt9O1xuICBwYXR0ZXJuOiBzdHJpbmcgPSAnJztcbiAgYXV0b0ZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gIGlucHV0VHlwZTogc3RyaW5nID0gJ3RleHQnO1xuXG4gIHByaXZhdGUgX2VsOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfdHlwZTogc3RyaW5nID0gJ3RleHQnO1xuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2VkaXRhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY2xlYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbWF4TGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgX2Vycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2V4dHJhOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfbGFiZWxOdW1iZXI6IG51bWJlciA9IDU7XG4gIHByaXZhdGUgX3VwZGF0ZVBsYWNlaG9sZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3ByZWZpeExpc3RDbHM6IHN0cmluZyA9ICdhbS1saXN0JztcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF9tb25leUtleWJvYXJkQWxpZ246IHN0cmluZyA9ICdyaWdodCc7XG4gIHByaXZhdGUgX2xvY2FsZTtcbiAgcHJpdmF0ZSBfZm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNDbGVhcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2xhYmxlQ29udGVudCcpXG4gIGxhYmxlUmVmO1xuICBAVmlld0NoaWxkKCdpbnB1dEVsZW1lbnQnKVxuICBpbnB1dEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KClcbiAgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuICBzZXQgdHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaW5wdXRUeXBlID0gdmFsdWU7XG4gICAgICBpZiAodmFsdWUgPT09ICdiYW5rQ2FyZCcgfHwgdmFsdWUgPT09ICdwaG9uZScpIHtcbiAgICAgICAgdGhpcy5fdHlwZSA9ICd0ZWwnO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICB0aGlzLl90eXBlID0gJ3Bhc3N3b3JkJztcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdkaWdpdCcpIHtcbiAgICAgICAgdGhpcy5fdHlwZSA9ICdudW1iZXInO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gJ3RleHQnICYmIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aGlzLl90eXBlID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMucGF0dGVybiA9ICdbMC05XSonO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHY6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZGVmYXVsdFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgfVxuICBzZXQgZGVmYXVsdFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gIH1cbiAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IGVkaXRhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lZGl0YWJsZTtcbiAgfVxuICBzZXQgZWRpdGFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lZGl0YWJsZSA9IHZhbHVlO1xuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICAgIHRoaXMuY2xzRGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgY2xlYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsZWFyO1xuICB9XG4gIHNldCBjbGVhcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2NsZWFyID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9tYXhMZW5ndGg7XG4gIH1cbiAgc2V0IG1heExlbmd0aCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGVycm9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgfVxuICBzZXQgZXJyb3IodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lcnJvciA9IHZhbHVlO1xuICAgIHRoaXMuY2xzRXJyb3IgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZXh0cmEoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZXh0cmE7XG4gIH1cbiAgc2V0IGV4dHJhKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9leHRyYSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBsYWJlbE51bWJlcih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbGFiZWxOdW1iZXIgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENscygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCB1cGRhdGVQbGFjZWhvbGRlcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3VwZGF0ZVBsYWNlaG9sZGVyID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHByZWZpeExpc3RDbHMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZml4TGlzdENscztcbiAgfVxuICBzZXQgcHJlZml4TGlzdENscyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcHJlZml4TGlzdENscyA9IHZhbHVlO1xuICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKHRoaXMuX2VsLCB2YWx1ZSArICctaXRlbScpO1xuICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKHRoaXMuX2VsLCB2YWx1ZSArICctaXRlbS1taWRkbGUnKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG4gIHNldCBuYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IG1vbmV5S2V5Ym9hcmRBbGlnbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9tb25leUtleWJvYXJkQWxpZ247XG4gIH1cbiAgc2V0IG1vbmV5S2V5Ym9hcmRBbGlnbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbW9uZXlLZXlib2FyZEFsaWduID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGxvY2FsZSh2YWx1ZSkge1xuICAgIHRoaXMuX2xvY2FsZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBmb2N1cyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5mb2N1cykge1xuICAgICAgdGhpcy5hdXRvRm9jdXMgPSB2YWx1ZS5mb2N1cztcbiAgICAgIGlmICh0aGlzLl90eXBlID09PSAnbW9uZXknKSB7XG4gICAgICAgIHRoaXMuc2V0Rm9jdXMgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pbnB1dEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5fZm9jdXMgPSB0cnVlO1xuICAgICAgICB0aGlzLmlucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIHRoaXMuaW5wdXRGb2N1cygnJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25CbHVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25Gb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uRXJyb3JDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uRXh0cmFDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWlucHV0LWl0ZW0nKVxuICBjbHNJdGVtOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1pbnB1dC1kaXNhYmxlZCcpXG4gIGNsc0Rpc2FibGVkOiBib29sZWFuID0gdGhpcy5fZGlzYWJsZWQ7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0taW5wdXQtZXJyb3InKVxuICBjbHNFcnJvcjogYm9vbGVhbiA9IHRoaXMuX2Vycm9yO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWlucHV0LWZvY3VzJylcbiAgY2xzRm9jdXM6IGJvb2xlYW4gPSB0aGlzLl9mb2N1cztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1pbnB1dC1hbmRyb2lkLCcpXG4gIGNsc0FuZHJvaWQ6IGJvb2xlYW4gPSB0aGlzLl9mb2N1cztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyOiBSZW5kZXJlcjIpIHtcbiAgICB0aGlzLl9lbCA9IGVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIF9vbkNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xuXG4gIHNldENscygpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmxhYmxlUmVmLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCB8fFxuICAgICAgKHRoaXMubGFibGVSZWYubmF0aXZlRWxlbWVudCAmJiB0aGlzLmxhYmxlUmVmLm5hdGl2ZUVsZW1lbnQuaW5uZXJUZXh0ICE9PSAnJylcbiAgICApIHtcbiAgICAgIHRoaXMubGFiZWxDbHMgPSB7XG4gICAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tbGFiZWxgXTogdHJ1ZSxcbiAgICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1sYWJlbC0yYF06IHRoaXMuX2xhYmVsTnVtYmVyID09PSAyLFxuICAgICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWxhYmVsLTNgXTogdGhpcy5fbGFiZWxOdW1iZXIgPT09IDMsXG4gICAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tbGFiZWwtNGBdOiB0aGlzLl9sYWJlbE51bWJlciA9PT0gNCxcbiAgICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1sYWJlbC01YF06IHRoaXMuX2xhYmVsTnVtYmVyID09PSA1LFxuICAgICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWxhYmVsLTZgXTogdGhpcy5fbGFiZWxOdW1iZXIgPT09IDYsXG4gICAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tbGFiZWwtN2BdOiB0aGlzLl9sYWJlbE51bWJlciA9PT0gN1xuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5jb250cm9sQ2xzID0geyBbYCR7dGhpcy5wcmVmaXhDbHN9LWNvbnRyb2xgXTogdHJ1ZSB9O1xuICB9XG5cbiAgaW5wdXRDaGFuZ2UoZSkge1xuICAgIGxldCB2YWx1ZSA9IGU7XG4gICAgc3dpdGNoICh0aGlzLmlucHV0VHlwZSkge1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYmFua0NhcmQnOlxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcRC9nLCAnJykucmVwbGFjZSgvKC4uLi4pKD89LikvZywgJyQxICcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Bob25lJzpcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXEQvZywgJycpLnN1YnN0cmluZygwLCAxMSk7XG4gICAgICAgIGNvbnN0IHZhbHVlTGVuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICBpZiAodmFsdWVMZW4gPiAzICYmIHZhbHVlTGVuIDwgOCkge1xuICAgICAgICAgIHZhbHVlID0gYCR7dmFsdWUuc3Vic3RyKDAsIDMpfSAke3ZhbHVlLnN1YnN0cigzKX1gO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlTGVuID49IDgpIHtcbiAgICAgICAgICB2YWx1ZSA9IGAke3ZhbHVlLnN1YnN0cigwLCAzKX0gJHt2YWx1ZS5zdWJzdHIoMywgNCl9ICR7dmFsdWUuc3Vic3RyKDcpfWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncGFzc3dvcmQnOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHRoaXMuX3R5cGUgIT09ICdtb25leScpIHtcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLl92YWx1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgfVxuXG4gIGlucHV0Rm9jdXModmFsdWUpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2ZvY3VzID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2xzRm9jdXMgPSB0cnVlO1xuICAgICAgdGhpcy5jbHNBbmRyb2lkID0gdHJ1ZTtcbiAgICB9LCAxMDApO1xuICAgIHRoaXMub25Gb2N1cy5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIGlucHV0Qmx1cih2YWx1ZSwgZXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5faXNDbGVhcikge1xuICAgICAgICB0aGlzLl9mb2N1cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNsc0ZvY3VzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2xzQW5kcm9pZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uQmx1ci5lbWl0KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lzQ2xlYXIgPSBmYWxzZTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgY2xlYXJJbnB1dCgpIHtcbiAgICBpZiAodGhpcy5fdHlwZSAhPT0gJ3Bhc3N3b3JkJyAmJiB0aGlzLl91cGRhdGVQbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoJycpO1xuICAgIHRoaXMuX2lzQ2xlYXIgPSB0cnVlO1xuICAgIGlmICh0aGlzLl90eXBlICE9PSAnbW9uZXknKSB7XG4gICAgICB0aGlzLmlucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHRoaXMuaW5wdXRGb2N1cyh0aGlzLl92YWx1ZSk7XG4gIH1cblxuICBlcnJvckNsaWNrKGUpIHtcbiAgICBpZiAodGhpcy5vbkVycm9yQ2xpY2spIHtcbiAgICAgIHRoaXMub25FcnJvckNsaWNrLmVtaXQoZSk7XG4gICAgfVxuICB9XG5cbiAgZXh0cmFDbGljayhlKSB7XG4gICAgaWYgKHRoaXMub25FeHRyYUNsaWNrKSB7XG4gICAgICB0aGlzLm9uRXh0cmFDbGljay5lbWl0KGUpO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHt9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKHRoaXMuaW5wdXRFbGVtZW50UmVmICYmIHRoaXMuX3R5cGUgIT09ICdtb25leScgJiYgdGhpcy5fdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pbnB1dEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3ModGhpcy5fZWwsIHRoaXMuX3ByZWZpeExpc3RDbHMgKyAnLWl0ZW0nKTtcbiAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyh0aGlzLl9lbCwgdGhpcy5fcHJlZml4TGlzdENscyArICctaXRlbS1taWRkbGUnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNvbnN0IExPQ0FMX1BST1ZJREVSX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuPGFueT4oJ2xvY2FsZS1wcm92aWRlci10b2tlbicpO1xuIiwiZXhwb3J0IGRlZmF1bHQge1xuICBva1RleHQ6ICfDp8Khwq7DpcKuwponLFxuICBkaXNtaXNzVGV4dDogJ8Olwo/ClsOmwrbCiCcsXG4gIGV4dHJhOiAnw6jCr8K3w6nCgMKJw6bCi8KpJyxcbn07XG4iLCIvLyBpbXBvcnQgRGF0ZVBpY2tlckxvY2FsZSBmcm9tICdybWMtZGF0ZS1waWNrZXIvbGliL2xvY2FsZS96aF9DTic7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgb2tUZXh0OiAnw6fCocKuw6XCrsKaJyxcbiAgZGlzbWlzc1RleHQ6ICfDpcKPwpbDpsK2wognLFxuICBleHRyYTogJ8Oowq/Ct8OpwoDCicOmwovCqScsXG4gIC8vIERhdGVQaWNrZXJMb2NhbGUsXG4gIHllYXI6ICfDpcK5wrQnLFxuICBtb250aDogJ8OmwpzCiCcsXG4gIGRheTogJ8OmwpfCpScsXG4gIGhvdXI6ICfDpsKXwrYnLFxuICBtaW51dGU6ICfDpcKIwoYnLFxuICBhbTogJ8OkwrjCisOlwo3CiCcsXG4gIHBtOiAnw6TCuMKLw6XCjcKIJ1xufTtcbiIsIi8vIGltcG9ydCBEYXRlUGlja2VyTG9jYWxlIGZyb20gJ3JtYy1kYXRlLXBpY2tlci9saWIvbG9jYWxlL3poX0NOJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBva1RleHQ6ICfDp8Khwq7DpcKuwponLFxuICBkaXNtaXNzVGV4dDogJ8Olwo/ClsOmwrbCiCcsXG4gIGV4dHJhOiAnw6jCr8K3w6nCgMKJw6bCi8KpJyxcbiAgLy8gRGF0ZVBpY2tlckxvY2FsZSxcbiAgeWVhcjogJ8OlwrnCtCcsXG4gIG1vbnRoOiAnw6bCnMKIJyxcbiAgZGF5OiAnw6bCl8KlJyxcbiAgaG91cjogJ8OmwpfCticsXG4gIG1pbnV0ZTogJ8OlwojChicsXG4gIGFtOiAnw6TCuMKKw6XCjcKIJyxcbiAgcG06ICfDpMK4wovDpcKNwognXG59OyIsImV4cG9ydCBkZWZhdWx0IHtcbiAgb2tUZXh0OiAnw6fCocKuw6XCrsKaJyxcbiAgY2FuY2VsVGV4dDogJ8Olwo/ClsOmwrbCiCcsXG59O1xuIiwiLy8gw6XCkMKMw6bCrcKlw6jCh8KqICdybWMtY2FsZW5kYXIvbGliL2xvY2FsZS96aF9DTic7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgdGl0bGU6ICfDpsKXwqXDpsKcwp/DqcKAwonDpsKLwqknLFxuICB0b2RheTogJ8OkwrvCisOlwqTCqScsXG4gIG1vbnRoOiAnw6bCnMKIJyxcbiAgeWVhcjogJ8OlwrnCtCcsXG4gIGFtOiAnw6TCuMKKw6XCjcKIJyxcbiAgcG06ICfDpMK4wovDpcKNwognLFxuICBkYXRlVGltZUZvcm1hdDogJ3l5eXnDpcK5wrRNTcOmwpzCiGRkw6bCl8KlIMOmwpjCn8OmwpzCn3cgaGg6bW0nLFxuICBkYXRlRm9ybWF0OiAneXl5ecOlwrnCtE1Nw6bCnMKIZGTDpsKXwqUgw6bCmMKfw6bCnMKfdycsXG4gIG5vQ2hvb3NlOiAnw6bCnMKqw6nCgMKJw6bCi8KpJyxcbiAgd2VlazogWyfDpsKXwqUnLCAnw6TCuMKAJywgJ8OkwrrCjCcsICfDpMK4woknLCAnw6XCm8KbJywgJ8OkwrrClCcsICfDpcKFwq0nXSxcbiAgY2xlYXI6ICfDpsK4woXDqcKZwqQnLFxuICBzZWxlY3RUaW1lOiAnw6nCgMKJw6bCi8Kpw6bCl8K2w6nCl8K0JyxcbiAgc2VsZWN0U3RhcnRUaW1lOiAnw6nCgMKJw6bCi8Kpw6XCvMKAw6XCp8KLw6bCl8K2w6nCl8K0JyxcbiAgc2VsZWN0RW5kVGltZTogJ8OpwoDCicOmwovCqcOnwrvCk8Omwp3Cn8OmwpfCtsOpwpfCtCcsXG4gIHN0YXJ0OiAnw6XCvMKAw6XCp8KLJyxcbiAgZW5kOiAnw6fCu8KTw6bCncKfJyxcbiAgYmVnaW46ICfDqMK1wrcnLFxuICBvdmVyOiAnw6bCrcKiJyxcbiAgYmVnaW5fb3ZlcjogJ8OowrXCty/DpsKtwqInLFxuICBjb25maXJtOiAnw6fCocKuw6jCrsKkJyxcbiAgbW9udGhUaXRsZTogJ3l5eXnDpcK5wrRNTcOmwpzCiCcsXG4gIGxvYWRQcmV2TW9udGg6ICfDpcKKwqDDqMK9wr3DpMK4worDpMK4woDDpMK4wqrDpsKcwognLFxuICB5ZXN0ZXJkYXk6ICfDpsKYwqjDpcKkwqknLFxuICBsYXN0V2VlazogJ8Oowr/CkcOkwrjCgMOlwpHCqCcsXG4gIGxhc3RNb250aDogJ8Oowr/CkcOkwrjCgMOkwrjCqsOmwpzCiCdcbn07XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIGNhbmNlbFRleHQ6ICfDpcKPwpbDpsK2wognLFxufTtcbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgY29uZmlybUxhYmVsOiAnw6fCocKuw6XCrsKaJyxcbiAgYmFja3NwYWNlTGFiZWw6ICfDqcKAwoDDpsKgwrwnLFxuICBjYW5jZWxLZXlib2FyZExhYmVsOiAnw6bClMK2w6jCtcK3w6nClMKuw6fCm8KYJyxcbn07XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIHByZXZUZXh0OiAnw6TCuMKKw6TCuMKAw6nCocK1JyxcbiAgbmV4dFRleHQ6ICfDpMK4wovDpMK4woDDqcKhwrUnLFxufTtcbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgYWN0aXZhdGVUZXh0OiAnw6bCncK+w6XCvMKAw6fCq8KLw6XCjcKzw6XCiMK3w6bClsKwJyxcbiAgZGVhY3RpdmF0ZVRleHQ6ICfDpMK4wovDpsKLwonDpcKPwq/DpMK7wqXDpcKIwrfDpsKWwrAnLFxuICBmaW5pc2hUZXh0OiAnw6XCrsKMw6bCiMKQw6XCiMK3w6bClsKwJyxcbn07XG4iLCJpbXBvcnQgUGlja2VyIGZyb20gJy4uLy4uL3BpY2tlci9sb2NhbGUvemhfQ04nO1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSAnLi4vLi4vZGF0ZS1waWNrZXIvbG9jYWxlL3poX0NOJztcbmltcG9ydCBEYXRlUGlja2VyVmlldyBmcm9tICcuLi8uLi9kYXRlLXBpY2tlci12aWV3L2xvY2FsZS96aF9DTic7XG5pbXBvcnQgTWVudSBmcm9tICcuLi8uLi9tZW51L2xvY2FsZS96aF9DTic7XG5pbXBvcnQgQ2FsZW5kYXIgZnJvbSAnLi4vLi4vY2FsZW5kYXIvbG9jYWxlL3poX0NOJztcbmltcG9ydCBTZWFyY2hCYXIgZnJvbSAnLi4vLi4vc2VhcmNoLWJhci9sb2NhbGUvemhfQ04nO1xuaW1wb3J0IElucHV0SXRlbSBmcm9tICcuLi8uLi9pbnB1dC1pdGVtL2xvY2FsZS96aF9DTic7XG5pbXBvcnQgUGFnaW5hdGlvbiBmcm9tICcuLi8uLi9wYWdpbmF0aW9uL2xvY2FsZS96aF9DTic7XG5pbXBvcnQgUHVsbFRvUmVmcmVzaCBmcm9tICcuLi8uLi9wdWxsLXRvLXJlZnJlc2gvbG9jYWxlL3poX0NOJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBsb2NhbGU6ICd6aF9DTicsXG4gIFBpY2tlcixcbiAgRGF0ZVBpY2tlcixcbiAgRGF0ZVBpY2tlclZpZXcsXG4gIE1lbnUsXG4gIENhbGVuZGFyLFxuICBTZWFyY2hCYXIsXG4gIElucHV0SXRlbSxcbiAgUGFnaW5hdGlvbixcbiAgUHVsbFRvUmVmcmVzaFxufTsiLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFByb3ZpZGVyLCBPcHRpb25hbCwgU2tpcFNlbGYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExPQ0FMX1BST1ZJREVSX1RPS0VOIH0gZnJvbSAnLi9sb2NhbGUtcHJvdmlkZXIudG9rZW4nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgemhfQ04gZnJvbSAnLi9sYW5ndWFnZXMvemhfQ04nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTG9jYWxlUHJvdmlkZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfbG9jYWxlOiBhbnk7XG4gIHByaXZhdGUgX2NoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih0aGlzLl9sb2NhbGUpO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTE9DQUxfUFJPVklERVJfVE9LRU4pIGxvY2FsZTogYW55KSB7XG4gICAgdGhpcy5zZXRMb2NhbGUobG9jYWxlIHx8IHpoX0NOKTtcbiAgfVxuXG4gIGdldCBsb2NhbGVDaGFuZ2UoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0TG9jYWxlVmFsdWUoa2V5UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fZ2V0T2JqZWN0UGF0aCh0aGlzLl9sb2NhbGUsIGtleVBhdGgpIGFzIHN0cmluZztcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgZ2V0TG9jYWxlU3ViT2JqKGtleVBhdGg6IHN0cmluZyk6IG9iamVjdCB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuX2dldE9iamVjdFBhdGgodGhpcy5fbG9jYWxlLCBrZXlQYXRoKSBhcyBvYmplY3Q7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc2V0TG9jYWxlKGxvY2FsZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFsb2NhbGUgfHwgKHRoaXMuX2xvY2FsZSAmJiB0aGlzLl9sb2NhbGUubG9jYWxlID09PSBsb2NhbGUubG9jYWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9sb2NhbGUgPSBsb2NhbGU7XG4gICAgdGhpcy5fY2hhbmdlLm5leHQobG9jYWxlKTtcbiAgfVxuXG4gIGdldExvY2FsZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZSAmJiB0aGlzLl9sb2NhbGUubG9jYWxlID8gdGhpcy5fbG9jYWxlLmxvY2FsZSA6ICcnO1xuICB9XG5cbiAgZ2V0TG9jYWxlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE9iamVjdFBhdGgob2JqOiBvYmplY3QsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG9iamVjdCB8IGFueSB7XG4gICAgbGV0IHJlcyA9IG9iajtcbiAgICBjb25zdCBwYXRocyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICBjb25zdCBkZXB0aCA9IHBhdGhzLmxlbmd0aDtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIHdoaWxlIChyZXMgJiYgaW5kZXggPCBkZXB0aCkge1xuICAgICAgcmVzID0gcmVzW3BhdGhzW2luZGV4KytdXTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4ID09PSBkZXB0aCA/IHJlcyA6IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExPQ0FMRV9QUk9WSURFUl9TRVJWSUNFX0ZBQ1RPUlkoZXhpc3Q6IExvY2FsZVByb3ZpZGVyU2VydmljZSwgbG9jYWxlOiBhbnkpOiBMb2NhbGVQcm92aWRlclNlcnZpY2Uge1xuICByZXR1cm4gZXhpc3QgfHwgbmV3IExvY2FsZVByb3ZpZGVyU2VydmljZShsb2NhbGUpO1xufVxuXG5leHBvcnQgY29uc3QgTE9DQUxFX1BST1ZJREVSX1NFUlZJQ0VfUFJPVklERVI6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlICAgOiBMb2NhbGVQcm92aWRlclNlcnZpY2UsXG4gIHVzZUZhY3Rvcnk6IExPQ0FMRV9QUk9WSURFUl9TRVJWSUNFX0ZBQ1RPUlksXG4gIGRlcHMgICAgICA6IFsgWyBuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIExvY2FsZVByb3ZpZGVyU2VydmljZSBdLCBMT0NBTF9QUk9WSURFUl9UT0tFTl1cbn07XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdFbmNhcHN1bGF0aW9uLCBPbkRlc3Ryb3ksIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMb2NhbGVQcm92aWRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9sb2NhbGUtcHJvdmlkZXIvbG9jYWxlLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdDdXN0b21LZXlib2FyZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jdXN0b20ta2V5Ym9hcmQuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtMb2NhbGVQcm92aWRlclNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbUtleWJvYXJkIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1udW1iZXIta2V5Ym9hcmQnO1xuICB3cmFwQ2xzOiBvYmplY3Q7XG4gIG9rVGV4dDogc3RyaW5nID0gJyc7XG4gIHdyYXBwZXJDbHM6IG9iamVjdDtcblxuICBwcml2YXRlIF9sb2NhbGU6IGFueSA9IHt9O1xuICBwcml2YXRlIF91bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9jYWxlUHJvdmlkZXI6IExvY2FsZVByb3ZpZGVyU2VydmljZSkge31cblxuICB0ZENsaWNrKGUpIHtcbiAgICB0aGlzLm9uQ2xpY2suZW1pdChlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMud3JhcENscyA9IHtcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30taXRlbWBdOiB0cnVlXG4gICAgfTtcbiAgICB0aGlzLndyYXBwZXJDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LXdyYXBwZXJgXTogdHJ1ZVxuICAgIH07XG4gICAgdGhpcy5fbG9jYWxlUHJvdmlkZXIubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlJCkpLnN1YnNjcmliZShfID0+IHtcbiAgICAgIHRoaXMuX2xvY2FsZSA9IHRoaXMuX2xvY2FsZVByb3ZpZGVyLmdldExvY2FsZVN1Yk9iaignSW5wdXRJdGVtJyk7XG4gICAgICB0aGlzLm9rVGV4dCA9IHRoaXMuX2xvY2FsZS5jb25maXJtTGFiZWw7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl91bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBDb21wb25lbnRSZWYsXG4gIENvbXBvbmVudEZhY3RvcnksXG4gIEFwcGxpY2F0aW9uUmVmLFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDdXN0b21LZXlib2FyZCB9IGZyb20gJy4uL2N1c3RvbS1rZXlib2FyZC9jdXN0b20ta2V5Ym9hcmQuY29tcG9uZW50JztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEN1c3RvbUlucHV0U2VydmljZSB7XG4gIHN0YXRpYyBjb21wUmVmOiBDb21wb25lbnRSZWY8YW55PiA9IG51bGw7XG4gIHN0YXRpYyBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmID0gbnVsbDtcbiAgc3RhdGljIGlzU2hvdyA9IGZhbHNlO1xuICBzdGF0aWMgY2xpY2tWYWx1ZSA9IG51bGw7XG4gIHN0YXRpYyBfaW5wdXRDb21wRmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxDdXN0b21LZXlib2FyZD4gPSBudWxsO1xuICBzdGF0aWMgX2tleWJvYXJkUHJlZml4Q2xzID0gJ2FtLW51bWJlci1rZXlib2FyZCc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfYXBwUmVmOiBBcHBsaWNhdGlvblJlZiwgcHJpdmF0ZSBfY2ZyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpIHtcbiAgICBDdXN0b21JbnB1dFNlcnZpY2UuYXBwUmVmID0gdGhpcy5fYXBwUmVmO1xuICAgIEN1c3RvbUlucHV0U2VydmljZS5faW5wdXRDb21wRmFjdG9yeSA9IHRoaXMuX2Nmci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShDdXN0b21LZXlib2FyZCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0U2hvd1N0YXR1cygpIHtcbiAgICByZXR1cm4gQ3VzdG9tSW5wdXRTZXJ2aWNlLmlzU2hvdztcbiAgfVxuXG4gIHN0YXRpYyBzaG93S2V5Ym9hcmQoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2hvdykge1xuICAgICAgaWYgKHRoaXMuY29tcFJlZikge1xuICAgICAgICB0aGlzLmNvbXBSZWYuaW5zdGFuY2Uud3JhcHBlckNscyA9IHtcbiAgICAgICAgICBbYGFtLW51bWJlci1rZXlib2FyZC13cmFwcGVyYF06IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHt0aGlzLl9rZXlib2FyZFByZWZpeENsc30tY29udGFpbmVyYCk7XG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBgJHt0aGlzLl9rZXlib2FyZFByZWZpeENsc30tY29udGFpbmVyYCk7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KEN1c3RvbUlucHV0U2VydmljZS5faW5wdXRDb21wRmFjdG9yeS5zZWxlY3RvcikpO1xuICAgICAgICAgIHRoaXMuY29tcFJlZiA9IHRoaXMuYXBwUmVmLmJvb3RzdHJhcChDdXN0b21JbnB1dFNlcnZpY2UuX2lucHV0Q29tcEZhY3RvcnkpO1xuICAgICAgICAgIHRoaXMuY29tcFJlZi5pbnN0YW5jZS5vbkNsaWNrLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tWYWx1ZSA9IGU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuaXNTaG93ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgaGlkZUtleWJvYXJkKCkge1xuICAgIGlmICh0aGlzLmNvbXBSZWYgJiYgdGhpcy5pc1Nob3cpIHtcbiAgICAgIHRoaXMuaXNTaG93ID0gZmFsc2U7XG4gICAgICB0aGlzLmNvbXBSZWYuaW5zdGFuY2Uud3JhcHBlckNscyA9IHtcbiAgICAgICAgW2BhbS1udW1iZXIta2V5Ym9hcmQtd3JhcHBlcmBdOiB0cnVlLFxuICAgICAgICBbYGFtLW51bWJlci1rZXlib2FyZC13cmFwcGVyLWhpZGVgXTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIEhvc3RCaW5kaW5nLFxuICBOZ1pvbmVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDdXN0b21JbnB1dFNlcnZpY2UgfSBmcm9tICcuL2N1c3RvbS1pbnB1dC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnQ3VzdG9tSW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY3VzdG9tLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbQ3VzdG9tSW5wdXRTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBDdXN0b21JbnB1dCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAga2V5Ym9hcmRQcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1udW1iZXIta2V5Ym9hcmQnO1xuICBmYWtlSW5wdXRDbHM6IG9iamVjdDtcbiAgZm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfbWF4TGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgX2VkaXRhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2V0Rm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcHJldmVudEtleWJvYXJkOiBib29sZWFuO1xuICBwcml2YXRlIF9tb25leUtleWJvYXJkQWxpZ246IHN0cmluZztcblxuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHY6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9tYXhMZW5ndGggIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9tYXhMZW5ndGggPj0gMCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2LnN1YnN0cigwLCB0aGlzLl9tYXhMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtYXhMZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heExlbmd0aCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjtcbiAgfVxuICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGVkaXRhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZWRpdGFibGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtb25leUtleWJvYXJkQWxpZ24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX21vbmV5S2V5Ym9hcmRBbGlnbiA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q29udGFpbmVyQ2xzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHNldEZvY3VzKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl9zZXRGb2N1cyA9IHZhbHVlLmZvY3VzO1xuICAgICAgaWYgKHRoaXMuX3NldEZvY3VzKSB7XG4gICAgICAgIHRoaXMuaW5wdXRGb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmFrZS1pbnB1dC1jb250YWluZXInKVxuICBjbHNGYWtlQ29udGFpbmVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mYWtlLWlucHV0LWNvbnRhaW5lci1sZWZ0JylcbiAgY2xzRmFrZUNvbnRhaW5lckxlZnQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIF9jdXN0b21JbnB1dFNlcnZpY2U6IEN1c3RvbUlucHV0U2VydmljZSwgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUpIHt9XG5cbiAgb25GYWtlSW5wdXRDbGljaygpIHtcbiAgICBpZiAodGhpcy5fcHJldmVudEtleWJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW5wdXRGb2N1cygpO1xuICB9XG5cbiAgaW5wdXRGb2N1cyA9ICgpID0+IHtcbiAgICB0aGlzLnJlbW92ZUJsdXJMaXN0ZW5lcigpO1xuICAgIGNvbnN0IGZvY3VzID0gdGhpcy5mb2N1cztcbiAgICBpZiAoIWZvY3VzIHx8IHRoaXMuX3NldEZvY3VzKSB7XG4gICAgICB0aGlzLm9uSW5wdXRGb2N1cygpO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuYWRkQmx1ckxpc3RlbmVyKCk7XG4gICAgfSwgNTApO1xuICB9O1xuXG4gIGRvQmx1ciA9IGV2ID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgIC8vIMOnwoLCucOlwofCu8OmwpjCr8OlwpDCpsOmwpjCr8OnwrvChMOkwrvCtsOmwpzCrMOowrrCq1xuICAgIGxldCBwYXJlbnRGb3VuZCA9IGZhbHNlO1xuICAgIC8vIMOnwoLCucOlwofCu8OnwpvCrsOmwqDCh8OmwpjCr8OlwpDCpsOmwpjCr2N1c3RvbS1pbnB1dFxuICAgIGxldCBpc0lucHV0ID0gZmFsc2U7XG4gICAgLy8gw6fCgsK5w6XCh8K7w6fCm8Kuw6bCoMKHw6bCmMKvw6XCkMKmw6bCmMKvY3VzdG9tLWtleWJvYXJkXG4gICAgbGV0IGlzS2V5Ym9hcmQgPSBmYWxzZTtcbiAgICBsZXQgaXNDbGVhciA9IGZhbHNlO1xuICAgIGxldCB0YXJnZXQgPSBldi50YXJnZXQ7XG4gICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQgIT09IG51bGwgJiYgIXBhcmVudEZvdW5kKSB7XG4gICAgICBpZiAodGFyZ2V0ID09PSB0aGlzLl9yZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICBwYXJlbnRGb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0LmxvY2FsTmFtZSA9PT0gJ2N1c3RvbWlucHV0Jykge1xuICAgICAgICBpc0lucHV0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXQubG9jYWxOYW1lID09PSAnY3VzdG9ta2V5Ym9hcmQnKSB7XG4gICAgICAgIGlzS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRhcmdldC5jbGFzc05hbWUuaW5kZXhPZignYW0taW5wdXQtY2xlYXInKSA+PSAwKSB7XG4gICAgICAgIGlzQ2xlYXIgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuICAgIC8vIMOlwr3Ck8OnwoLCucOlwofCu8OnwpvCrsOmwqDCh8OmwpjCr8OmwpzCrMOowrrCq8OnwprChMOmwpfCtsOlwoDCmcOvwrzCjMOowo7Ct8Olwo/ClsOnwoTCpsOnwoLCucOjwoDCgcOkwrjCjcOpwprCkMOowpfCj2tleWJvYXJkXG4gICAgLy8gw6XCvcKTw6fCgsK5w6XCh8K7w6fCm8Kuw6bCoMKHw6TCuMKNw6bCmMKvw6bCnMKsw6jCusKrw6TCvcKGw6bCmMKvw6XChcK2w6TCu8KWw6fCmsKEY3VzdG9tLWlucHV0w6bCl8K2w6/CvMKMw6XCpMKxw6XCjsK7w6fChMKmw6fCgsK5w6PCgMKBw6TCuMKNw6nCmsKQw6jCl8KPa2V5Ym9hcmRcbiAgICAvLyDDpcK9wpPDp8KCwrnDpcKHwrvDp8Kbwq7DpsKgwofDpsKYwq9rZXlib2FyZMOmwpfCtsOvwrzCjMOkwrjCjcOlwqTCscOlwo7Cu8OnwoTCpsOnwoLCucOvwrzCjMOkwrjCjcOpwprCkMOowpfCj2tleWJvYXJkXG4gICAgaWYgKHBhcmVudEZvdW5kKSB7XG4gICAgICB0aGlzLmZvY3VzID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGlzSW5wdXQpIHtcbiAgICAgIHRoaXMuX3NldEZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLm9uQmx1ci5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9jdXMgJiYgaXNLZXlib2FyZCkge1xuICAgICAgdGhpcy5mb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLm9uS2V5Ym9hcmRDbGljayhDdXN0b21JbnB1dFNlcnZpY2UuY2xpY2tWYWx1ZSk7XG4gICAgfVxuICAgIGlmICghcGFyZW50Rm91bmQgJiYgIWlzSW5wdXQgJiYgIWlzS2V5Ym9hcmQgJiYgIWlzQ2xlYXIgJiYgIXRoaXMuX3NldEZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLl9zZXRGb2N1cyA9IGZhbHNlO1xuICAgICAgdGhpcy5vbkJsdXIuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgICBDdXN0b21JbnB1dFNlcnZpY2UuaGlkZUtleWJvYXJkKCk7XG4gICAgfVxuICAgIHRoaXMuc2V0RmFrZUlucHV0Q2xzKCk7XG4gIH07XG5cbiAgcmVtb3ZlQmx1ckxpc3RlbmVyID0gKCkgPT4ge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5kb0JsdXIsIGZhbHNlKTtcbiAgfTtcblxuICBhZGRCbHVyTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmRvQmx1ciwgZmFsc2UpO1xuICB9O1xuXG4gIG9uSW5wdXRCbHVyID0gdmFsdWUgPT4ge1xuICAgIHRoaXMuZm9jdXMgPSBmYWxzZTtcbiAgICB0aGlzLnNldEZha2VJbnB1dENscygpO1xuICAgIHRoaXMub25CbHVyLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIEN1c3RvbUlucHV0U2VydmljZS5oaWRlS2V5Ym9hcmQoKTtcbiAgfTtcblxuICBvbklucHV0Rm9jdXMgPSAoKSA9PiB7XG4gICAgdGhpcy5vbkZvY3VzLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIHRoaXMuZm9jdXMgPSB0cnVlO1xuICAgIHRoaXMuX3NldEZvY3VzID0gZmFsc2U7XG4gICAgdGhpcy5zZXRGYWtlSW5wdXRDbHMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIEN1c3RvbUlucHV0U2VydmljZS5zaG93S2V5Ym9hcmQoKTtcbiAgICB9LCAxMDApO1xuICB9O1xuXG4gIHNldEZha2VJbnB1dENscyA9ICgpID0+IHtcbiAgICB0aGlzLmZha2VJbnB1dENscyA9IHtcbiAgICAgIFtgZmFrZS1pbnB1dGBdOiB0cnVlLFxuICAgICAgWydmYWtlLWlucHV0LWRpc2FibGVkJ106IHRoaXMuX2Rpc2FibGVkLFxuICAgICAgWydmb2N1cyddOiB0aGlzLmZvY3VzXG4gICAgfTtcbiAgfTtcblxuICBzZXRDb250YWluZXJDbHMgPSAoKSA9PiB7XG4gICAgdGhpcy5jbHNGYWtlQ29udGFpbmVyTGVmdCA9IHRoaXMuX21vbmV5S2V5Ym9hcmRBbGlnbiA9PT0gJ2xlZnQnO1xuICB9O1xuXG4gIG9uS2V5Ym9hcmRDbGljayA9IGtleWJvYXJkSXRlbVZhbHVlID0+IHtcbiAgICBsZXQgdmFsdWVBZnRlckNoYW5nZTtcbiAgICAvLyDDpcKIwqDDqcKZwqTDqcKUwq5cbiAgICBpZiAoa2V5Ym9hcmRJdGVtVmFsdWUgPT09ICdkZWxldGUnKSB7XG4gICAgICB2YWx1ZUFmdGVyQ2hhbmdlID0gdGhpcy5fdmFsdWUuc3Vic3RyaW5nKDAsIHRoaXMuX3ZhbHVlLmxlbmd0aCAtIDEpO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHZhbHVlQWZ0ZXJDaGFuZ2UpO1xuICAgICAgLy8gw6fCocKuw6jCrsKkw6nClMKuXG4gICAgfSBlbHNlIGlmIChrZXlib2FyZEl0ZW1WYWx1ZSA9PT0gJ2NvbmZpcm0nKSB7XG4gICAgICB2YWx1ZUFmdGVyQ2hhbmdlID0gdGhpcy5fdmFsdWU7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodmFsdWVBZnRlckNoYW5nZSk7XG4gICAgICB0aGlzLm9uSW5wdXRCbHVyKHRoaXMuX3ZhbHVlKTtcbiAgICAgIC8vIMOmwpTCtsOowrXCt8OpwpTCrlxuICAgIH0gZWxzZSBpZiAoa2V5Ym9hcmRJdGVtVmFsdWUgPT09ICdoaWRlJykge1xuICAgICAgdmFsdWVBZnRlckNoYW5nZSA9IHRoaXMuX3ZhbHVlO1xuICAgICAgdGhpcy5vbklucHV0Qmx1cih2YWx1ZUFmdGVyQ2hhbmdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9tYXhMZW5ndGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICArdGhpcy5fbWF4TGVuZ3RoID49IDAgJiZcbiAgICAgICAgKHRoaXMuX3ZhbHVlICsga2V5Ym9hcmRJdGVtVmFsdWUpLmxlbmd0aCA+IHRoaXMuX21heExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHZhbHVlQWZ0ZXJDaGFuZ2UgPSAodGhpcy5fdmFsdWUgKyBrZXlib2FyZEl0ZW1WYWx1ZSkuc3Vic3RyKDAsIHRoaXMuX21heExlbmd0aCk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh2YWx1ZUFmdGVyQ2hhbmdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlQWZ0ZXJDaGFuZ2UgPSB0aGlzLl92YWx1ZSArIGtleWJvYXJkSXRlbVZhbHVlO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodmFsdWVBZnRlckNoYW5nZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZUFmdGVyQ2hhbmdlO1xuICAgIH0pO1xuICB9O1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX3ByZXZlbnRLZXlib2FyZCA9IHRoaXMuX2Rpc2FibGVkIHx8ICF0aGlzLl9lZGl0YWJsZTtcbiAgICB0aGlzLnNldEZha2VJbnB1dENscygpO1xuICAgIHRoaXMuc2V0Q29udGFpbmVyQ2xzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZUJsdXJMaXN0ZW5lcigpO1xuICAgIGlmIChDdXN0b21JbnB1dFNlcnZpY2UpIHtcbiAgICAgIEN1c3RvbUlucHV0U2VydmljZS5oaWRlS2V5Ym9hcmQoKTtcbiAgICAgIEN1c3RvbUlucHV0U2VydmljZS5jb21wUmVmID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7dGhpcy5rZXlib2FyZFByZWZpeENsc30tY29udGFpbmVyYCk7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgY29udGFpbmVyLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElucHV0SXRlbSB9IGZyb20gJy4vaW5wdXQtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3VzdG9tS2V5Ym9hcmQgfSBmcm9tICcuL2N1c3RvbS1rZXlib2FyZC9jdXN0b20ta2V5Ym9hcmQuY29tcG9uZW50JztcbmltcG9ydCB7IEN1c3RvbUlucHV0IH0gZnJvbSAnLi9jdXN0b20taW5wdXQvY3VzdG9tLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBOZ01vZHVsZSh7XG4gIGV4cG9ydHM6IFtJbnB1dEl0ZW0sIEN1c3RvbUtleWJvYXJkLCBDdXN0b21JbnB1dF0sXG4gIGRlY2xhcmF0aW9uczogW0lucHV0SXRlbSwgQ3VzdG9tS2V5Ym9hcmQsIEN1c3RvbUlucHV0XSxcbiAgZW50cnlDb21wb25lbnRzOiBbQ3VzdG9tS2V5Ym9hcmRdLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgSW5wdXRJdGVtTW9kdWxlIHt9XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEV2ZW50RW1pdHRlcixcbiAgUmVuZGVyZXIyLFxuICBUZW1wbGF0ZVJlZixcbiAgQWZ0ZXJWaWV3SW5pdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW0J1dHRvbl0sIG56bS1idXR0b24nLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZVVybDogJy4vYnV0dG9uLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBCdXR0b24gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tYnV0dG9uJztcbiAgbmdUZW1wbGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpY29uVHlwZTogYW55O1xuXG4gIHByaXZhdGUgX2VsOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfY2xhc3NOYW1lID0gJyc7XG4gIHByaXZhdGUgX2NsYXNzTGlzdDogYW55ID0gW107XG4gIHByaXZhdGUgX3R5cGU6IHN0cmluZztcbiAgcHJpdmF0ZSBfc2l6ZSA9ICdsYXJnZSc7XG4gIHByaXZhdGUgX2xvYWRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfYWN0aXZlID0gZmFsc2U7XG4gIHByaXZhdGUgX2lubGluZSA9IGZhbHNlO1xuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9pY29uOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+ID0gJyc7XG4gIHByaXZhdGUgX3VzZXJBZ2VudCA9ICg8YW55Pm5hdmlnYXRvcikudXNlckFnZW50IHx8ICg8YW55Pm5hdmlnYXRvcikudmVuZG9yIHx8ICg8YW55PndpbmRvdykub3BlcmE7XG5cbiAgQElucHV0KClcbiAgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgc2l6ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRpbmc7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGlubGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5saW5lO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBpY29uKCk6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9pY29uO1xuICB9XG4gIHNldCBpY29uKHZhbHVlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcbiAgICAgIHRoaXMubmdUZW1wbGF0ZSA9IHRydWU7XG4gICAgICB0aGlzLl9pY29uID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmdUZW1wbGF0ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5faWNvbiA9IDxzdHJpbmc+dmFsdWU7XG4gICAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBjbGFzc05hbWUodikge1xuICAgIHRoaXMuX2NsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZSArICcgJyArIHY7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgdG91Y2hTdGFydChldmVudCkge1xuICAgIGlmICh0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hlbmQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdtb3VzZXVwJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCBbJyRldmVudCddKVxuICB0b3VjaEVuZChldmVudCkge1xuICAgIGlmICh0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIGNsaWNrKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub25DbGljay5lbWl0KCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIF9yZW5kZXI6IFJlbmRlcmVyMikge1xuICAgIHRoaXMuX2VsID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuX3JlbmRlci5hZGRDbGFzcyh0aGlzLl9lbCwgdGhpcy5wcmVmaXhDbHMpO1xuICAgIHRoaXMuX2NsYXNzTmFtZSA9IHRoaXMuX2VsLmNsYXNzTmFtZTtcbiAgfVxuXG4gIGlzVGVtcGxhdGVSZWYodmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzZXQgdHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdHlwZSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgfVxuXG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG5cbiAgc2V0IGxvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9sb2FkaW5nID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5fZWwucXVlcnlTZWxlY3RvcignaWNvbicpKSB7XG4gICAgICAgIHRoaXMuX2VsLnF1ZXJ5U2VsZWN0b3IoJ2ljb24nKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2VsLnF1ZXJ5U2VsZWN0b3IoJ2ljb24nKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgfVxuXG4gIHNldCBzaXplKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zaXplID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG5cbiAgc2V0IGlubGluZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lubGluZSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5fZWwucXVlcnlTZWxlY3RvcignaW1nJykpIHtcbiAgICAgIGNvbnN0IGFtU2l6ZSA9IHRoaXMuX3NpemUgPT09ICdzbWFsbCcgPyAnYW0taWNvbi14eHMnIDogJ2FtLWljb24tbWQnO1xuICAgICAgdGhpcy5fZWwucXVlcnlTZWxlY3RvcignaW1nJykuc2V0QXR0cmlidXRlKCdjbGFzcycsIGBhbS1pY29uICR7dGhpcy5wcmVmaXhDbHN9LWljb24gJHthbVNpemV9YCk7XG4gICAgICB0aGlzLl9yZW5kZXIuYWRkQ2xhc3ModGhpcy5fZWwsIGAke3RoaXMucHJlZml4Q2xzfS1pY29uYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDbGFzc01hcCgpOiB2b2lkIHtcbiAgICB0aGlzLmljb25UeXBlID0gdGhpcy5fbG9hZGluZyA/ICdsb2FkaW5nJyA6IHRoaXMuX2ljb247XG4gICAgdGhpcy5fY2xhc3NMaXN0ID0gW1xuICAgICAgdGhpcy5fdHlwZSAmJiBgJHt0aGlzLnByZWZpeENsc30tJHt0aGlzLl90eXBlfWAsXG4gICAgICB0aGlzLl9zaXplID09PSAnc21hbGwnICYmIGAke3RoaXMucHJlZml4Q2xzfS0ke3RoaXMuX3NpemV9YCxcbiAgICAgIHRoaXMuX2Rpc2FibGVkICYmIGAke3RoaXMucHJlZml4Q2xzfS1kaXNhYmxlZGAsXG4gICAgICB0aGlzLl9sb2FkaW5nICYmIGAke3RoaXMucHJlZml4Q2xzfS1sb2FkaW5nYCxcbiAgICAgIHRoaXMuaWNvblR5cGUgJiYgYCR7dGhpcy5wcmVmaXhDbHN9LWljb25gLFxuICAgICAgdGhpcy5fYWN0aXZlICYmIGAke3RoaXMucHJlZml4Q2xzfS1hY3RpdmVgLFxuICAgICAgdGhpcy5faW5saW5lICYmIGAke3RoaXMucHJlZml4Q2xzfS1pbmxpbmVgXG4gICAgXS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICByZXR1cm4gISFpdGVtO1xuICAgIH0pO1xuICAgIHRoaXMuX2VsLmNsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZSArICcgJyArIHRoaXMuX2NsYXNzTGlzdC5qb2luKCcgJyk7XG4gIH1cbn1cbiIsIi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLy8gaW5zcHJpZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2tpc2Vua2Evc3ZnLXNwcml0ZS1sb2FkZXIvYmxvYi9tYXN0ZXIvcnVudGltZS9icm93c2VyLXNwcml0ZS5qc1xuLy8gTXVjaCBzaW1wbGlmaWVkLCBkbyBtYWtlIHN1cmUgcnVuIHRoaXMgYWZ0ZXIgZG9jdW1lbnQgcmVhZHlcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuY29uc3Qgc3ZnU3ByaXRlID0gY29udGVudHMgPT4gYFxuPHN2Z1xuICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbiAgaWQ9XCJfX0FOVERfTU9CSUxFX1NWR19TUFJJVEVfTk9ERV9fXCJcbiAgc3R5bGU9XCJwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDowO2hlaWdodDowXCJcbj5cbiAgPGRlZnM+XG4gICAgJHtjb250ZW50c31cbiAgPC9kZWZzPlxuPC9zdmc+XG5gO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSWNvbkhhbmRsZXIge1xuICBjb25zdHJ1Y3RvcigpIHt9XG4gIGNvbnRlbnRzID0gW107XG4gIC8vIGJvdGggbWluaWZpZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL3N2Zy9zdmdvXG4gIGljb25zID0ge1xuICAgIGNoZWNrOlxuICAgICAgJzxzdmcgdmlld0JveD1cIjAgMCA0NCA0NFwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTM0LjUzOCA4TDM4IDExLjUxOCAxNy44MDggMzIgOCAyMi4wMzNsMy40NjItMy41MTggNi4zNDYgNi40NXpcIi8+PC9zdmc+JyxcbiAgICAnY2hlY2stY2lyY2xlJzpcbiAgICAgICc8c3ZnIHZpZXdCb3g9XCIwIDAgNDggNDhcIj48cGF0aCBkPVwiTTI0IDQ4YzEzLjI1NSAwIDI0LTEwLjc0NSAyNC0yNFMzNy4yNTUgMCAyNCAwIDAgMTAuNzQ1IDAgMjRzMTAuNzQ1IDI0IDI0IDI0ek0xMy4xIDIzLjJsLTIuMiAyLjEgMTAgOS45TDM4LjEgMTVsLTIuMi0yLTE1LjIgMTcuOC03LjYtNy42elwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIi8+PC9zdmc+JyxcbiAgICAnY2hlY2stY2lyY2xlLW8nOlxuICAgICAgJzxzdmcgdmlld0JveD1cIjAgMCA0OCA0OFwiPjxnIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj48cGF0aCBkPVwiTTI0IDQ4YzEzLjI1NSAwIDI0LTEwLjc0NSAyNC0yNFMzNy4yNTUgMCAyNCAwIDAgMTAuNzQ1IDAgMjRzMTAuNzQ1IDI0IDI0IDI0em0wLTNjMTEuNTk4IDAgMjEtOS40MDIgMjEtMjFTMzUuNTk4IDMgMjQgMyAzIDEyLjQwMiAzIDI0czkuNDAyIDIxIDIxIDIxelwiLz48cGF0aCBkPVwiTTEyLjIgMjMuMkwxMCAyNS4zbDEwIDkuOUwzNy4yIDE1IDM1IDEzIDE5LjggMzAuOHpcIi8+PC9nPjwvc3ZnPicsXG5cbiAgICBjcm9zczpcbiAgICAgICc8c3ZnIHZpZXdCb3g9XCIwIDAgNDQgNDRcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0yNC4wMDggMjEuODUybDguOTctOC45NjhMMzEuMDkyIDExbC04Ljk3IDguOTY4TDEzLjE1NyAxMWwtMS44ODQgMS44ODQgOC45NjggOC45NjgtOS4yNCA5LjI0IDEuODg0IDEuODg1IDkuMjQtOS4yNCA5LjI0IDkuMjQgMS44ODUtMS44ODQtOS4yNC05LjI0elwiLz48L3N2Zz4nLFxuICAgICdjcm9zcy1jaXJjbGUnOlxuICAgICAgJzxzdmcgdmlld0JveD1cIjAgMCA0OCA0OFwiPjxnIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj48cGF0aCBkPVwiTTI0IDQ4YzEzLjI1NSAwIDI0LTEwLjc0NSAyNC0yNFMzNy4yNTUgMCAyNCAwIDAgMTAuNzQ1IDAgMjRzMTAuNzQ1IDI0IDI0IDI0em0wLTNjMTEuNTk4IDAgMjEtOS40MDIgMjEtMjFTMzUuNTk4IDMgMjQgMyAzIDEyLjQwMiAzIDI0czkuNDAyIDIxIDIxIDIxelwiLz48cGF0aCBkPVwiTTI0LjM0IDIyLjIybC03Ljc3NS03Ljc3NWExLjUgMS41IDAgMSAwLTIuMTIgMi4xMmw3Ljc3MyA3Ljc3NS03Ljc3NCA3Ljc3NWExLjUgMS41IDAgMSAwIDIuMTIgMi4xMmw3Ljc3NS03Ljc3MyA3Ljc3NCA3Ljc3NGExLjUgMS41IDAgMSAwIDIuMTItMi4xMkwyNi40NiAyNC4zNGw3Ljc3NC03Ljc3NGExLjUgMS41IDAgMSAwLTIuMTItMi4xMmwtNy43NzYgNy43NzN6XCIvPjwvZz48L3N2Zz4nLFxuICAgICdjcm9zcy1jaXJjbGUtbyc6XG4gICAgICAnPHN2ZyB2aWV3Qm94PVwiMCAwIDQ4IDQ4XCI+PHBhdGggZD1cIk0yNCA0OGMxMy4yNTUgMCAyNC0xMC43NDUgMjQtMjRTMzcuMjU1IDAgMjQgMCAwIDEwLjc0NSAwIDI0czEwLjc0NSAyNCAyNCAyNHptLjM1My0yNS43N2wtNy41OTMtNy41OTNjLS43OTctLjgtMS41MzgtLjgyMi0yLjI2My0uMjA3LS43MjQuNjE0LS41NiAxLjYxNy0uMTI0IDIuMDY3bDcuODUyIDcuODQ3LTcuNzIgNy43MjNjLS43MjcuNzI4LS41NiAxLjY0Ni0uMDY2IDIuMTc3LjQ5My41MzIgMS41NTMuNjgzIDIuMzEtLjE3NGw3LjU4OC03LjU4NCA3LjY0NCA3LjYyM2MuNzk2Ljc5OCAxLjYwOC43MjQgMi4yMS4xNDUuNjA1LS41OC43Mi0xLjQ0Mi0uMDc0LTIuMjRsLTcuNjU3LTcuNjcgNy41NDUtNy41MmMuODEtLjY5Ny45LTEuNzYuMjk3LTIuMzQtLjkyLS44ODUtMS44NS0uMzM4LTIuMjY0LjA3OGwtNy42ODUgNy42Njd6XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiLz48L3N2Zz4nLFxuXG4gICAgLy8gVG9kbzogc2ltcGxpZnkgZGlyZWN0aW9uIHRvIDIsIHVzZSBjc3MgdHJhbnNmb3JtXG4gICAgbGVmdDpcbiAgICAgICc8c3ZnIHZpZXdCb3g9XCIwIDAgNDQgNDRcIj48ZGVmcz48cGF0aCBpZD1cImFcIiBkPVwiTS0xMjktODQ1aDI0djI0aC0yNHpcIi8+PC9kZWZzPjxjbGlwUGF0aCBpZD1cImJcIj48dXNlIHhsaW5rOmhyZWY9XCIjYVwiIG92ZXJmbG93PVwidmlzaWJsZVwiLz48L2NsaXBQYXRoPjxnIGNsaXAtcGF0aD1cInVybCgjYilcIj48ZGVmcz48cGF0aCBpZD1cImNcIiBkPVwiTS05MDMtOTQ5SDk0N1Y5OTZILTkwM3pcIi8+PC9kZWZzPjwvZz48cGF0aCBkPVwiTTE2LjI0NyAyMS40TDI4LjQ4IDkuMTY1bDIuMTIgMi4xMi0xMC4xMTcgMTAuMTJMMzAuNiAzMS41MjRsLTIuMTIgMi4xMi0xMi4yMzMtMTIuMjMyLjAwNy0uMDA2elwiLz48L3N2Zz4nLFxuICAgIHJpZ2h0OlxuICAgICAgJzxzdmcgdmlld0JveD1cIjAgMCA0NCA0NFwiPjxkZWZzPjxwYXRoIGlkPVwiYVwiIGQ9XCJNLTEyOS04NDVoMjR2MjRoLTI0elwiLz48L2RlZnM+PGNsaXBQYXRoIGlkPVwiYlwiPjx1c2UgeGxpbms6aHJlZj1cIiNhXCIgb3ZlcmZsb3c9XCJ2aXNpYmxlXCIvPjwvY2xpcFBhdGg+PGcgY2xpcC1wYXRoPVwidXJsKCNiKVwiPjxkZWZzPjxwYXRoIGlkPVwiY1wiIGQ9XCJNLTkwMy05NDlIOTQ3Vjk5NkgtOTAzelwiLz48L2RlZnM+PC9nPjxwYXRoIGQ9XCJNMzAuNiAyMS40TDE4LjM3IDkuMTY1bC0yLjEyIDIuMTIgMTAuMTE3IDEwLjEyLTEwLjExOCAxMC4xMTggMi4xMiAyLjEyIDEyLjIzNC0xMi4yMzItLjAwNS0uMDA2elwiLz48L3N2Zz4nLFxuICAgIGRvd246XG4gICAgICAnPHN2ZyB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCI+PHBhdGggZD1cIk0yMi4zNTUgMjguMjM3bC0xMS40ODMtMTAuOWMtLjYwNy0uNTc2LTEuNzE0LS4zOTYtMi40OC40MWwuNjc0LS43MWMtLjc2My44MDItLjczIDIuMDctLjI4MiAyLjQ5NmwxMS4zNyAxMC43OTMtLjA0LjA0IDIuMDg4IDIuMTk1TDIzLjMgMzEuNTJsMTIuMzA4LTExLjY4MmMuNDQ3LS40MjUuNDgtMS42OTQtLjI4Mi0yLjQ5NmwuNjc0LjcxYy0uNzY2LS44MDYtMS44NzMtLjk4Ni0yLjQ4LS40MUwyMi4zNTUgMjguMjM3elwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIi8+PC9zdmc+JyxcbiAgICB1cDpcbiAgICAgICc8c3ZnIHZpZXdCb3g9XCIwIDAgNDQgNDRcIj48cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNLTEtMWg0NnY0NkgtMXpcIi8+PGRlZnM+PHBhdGggaWQ9XCJhXCIgZD1cIk0tMTI5LTg0NWgyNHYyNGgtMjR6XCIvPjwvZGVmcz48Y2xpcFBhdGggaWQ9XCJiXCI+PHVzZSB4bGluazpocmVmPVwiI2FcIi8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9XCJ1cmwoI2IpXCI+PGRlZnM+PHBhdGggaWQ9XCJjXCIgZD1cIk0tOTAzLTk0OUg5NDdWOTk2SC05MDN6XCIvPjwvZGVmcz48L2c+PHBhdGggZD1cIk0yMy40MTcgMTQuMjNMMTEuMTg0IDI2LjQ2bDIuMTIgMi4xMiAxMC4xMi0xMC4xMTcgMTAuMTE4IDEwLjExOCAyLjEyLTIuMTJMMjMuNDMgMTQuMjI4bC0uMDA2LjAwNXpcIi8+PC9zdmc+JyxcblxuICAgIGxvYWRpbmc6XG4gICAgICAnPHN2ZyB2aWV3Qm94PVwiMCAtMiA1OS43NSA2MC4yNVwiPjxwYXRoIGZpbGw9XCIjY2NjXCIgZD1cIk0yOS42OS0uNTI3QzE0LjA0NC0uNTI3IDEuMzYgMTIuMTU4IDEuMzYgMjcuODA2UzE0LjA0MyA1Ni4xNCAyOS42OSA1Ni4xNGMxNS42NSAwIDI4LjMzNC0xMi42ODYgMjguMzM0LTI4LjMzNFM0NS4zNC0uNTI3IDI5LjY5LS41Mjd6bS4xODUgNTMuNzVjLTE0LjAzNyAwLTI1LjQxNy0xMS4zOC0yNS40MTctMjUuNDE3UzE1LjgzOCAyLjM5IDI5Ljg3NSAyLjM5czI1LjQxNyAxMS4zOCAyNS40MTcgMjUuNDE3LTExLjM4IDI1LjQxNi0yNS40MTcgMjUuNDE2elwiLz48cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMxMDhlZTlcIiBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMTBcIiBkPVwiTTU2LjU4NyAyOS43NjZjLjM3LTcuNDM4LTEuNjU4LTE0LjctNi4zOTMtMTkuNTUyXCIvPjwvc3ZnPicsXG4gICAgc2VhcmNoOlxuICAgICAgJzxzdmcgdmlld0JveD1cIjAgMCA0NCA0NFwiPjxwYXRoIGQ9XCJNMzIuOTggMjkuMjU1bDguOTE1IDguMjkzTDM5LjYwMyA0MGwtOC44Ni04LjI0MmExNS45NTIgMTUuOTUyIDAgMCAxLTEwLjc1MyA0LjE0N0MxMS4xNiAzNS45MDUgNCAyOC43NjMgNCAxOS45NTIgNCAxMS4xNDIgMTEuMTYgNCAxOS45OSA0czE1Ljk5IDcuMTQyIDE1Ljk5IDE1Ljk1MmMwIDMuNDcyLTEuMTEyIDYuNjg1LTMgOS4zMDN6bS4wNS05LjIxYzAgNy4xMjMtNS43IDEyLjkxOC0xMi44OCAxMi45MTgtNy4xNzYgMC0xMy4wMTUtNS43OTUtMTMuMDE1LTEyLjkxOCAwLTcuMTIgNS44NC0xMi45MTcgMTMuMDE3LTEyLjkxNyA3LjE3OCAwIDEyLjg4IDUuNzk3IDEyLjg4IDEyLjkxN3pcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIvPjwvc3ZnPicsXG5cbiAgICBlbGxpcHNpczpcbiAgICAgICc8c3ZnIHZpZXdCb3g9XCIwIDAgNDQgNDRcIj48Y2lyY2xlIGN4PVwiMjEuODg4XCIgY3k9XCIyMlwiIHI9XCI0LjA0NVwiLz48Y2lyY2xlIGN4PVwiNS45MTNcIiBjeT1cIjIyXCIgcj1cIjQuMDQ1XCIvPjxjaXJjbGUgY3g9XCIzNy44NjNcIiBjeT1cIjIyXCIgcj1cIjQuMDQ1XCIvPjwvc3ZnPicsXG4gICAgJ2VsbGlwc2lzLWNpcmNsZSc6XG4gICAgICAnPHN2ZyB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCI+PGcgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPjxwYXRoIGQ9XCJNMjIuMTMuMTFDMTAuMDUuMTEuMjU1IDkuOTAyLjI1NSAyMS45ODNTMTAuMDUgNDMuODYgMjIuMTMgNDMuODZzMjEuODc1LTkuNzk1IDIxLjg3NS0yMS44NzZTMzQuMjEuMTEgMjIuMTMuMTF6bTAgNDAuN2MtMTAuMzk2IDAtMTguODI1LTguNDMtMTguODI1LTE4LjgyNlMxMS43MzUgMy4xNiAyMi4xMyAzLjE2YzEwLjM5NiAwIDE4LjgyNSA4LjQyOCAxOC44MjUgMTguODI0UzMyLjUyNSA0MC44MSAyMi4xMyA0MC44MXpcIi8+PGNpcmNsZSBjeD1cIjIxLjg4OFwiIGN5PVwiMjIuNzAxXCIgcj1cIjIuNDQ1XCIvPjxjaXJjbGUgY3g9XCIxMi4yM1wiIGN5PVwiMjIuNzAxXCIgcj1cIjIuNDQ1XCIvPjxjaXJjbGUgY3g9XCIzMS41NDZcIiBjeT1cIjIyLjcwMVwiIHI9XCIyLjQ0NVwiLz48L2c+PC9zdmc+JyxcblxuICAgICdleGNsYW1hdGlvbi1jaXJjbGUnOlxuICAgICAgJzxzdmcgdmlld0JveD1cIjAgMCA2NCA2NFwiPjxwYXRoIGQ9XCJNNTkuNTggNDAuODlMNDEuMTkzIDkuMTFDMzkuMTM1IDUuMzgyIDM1LjcyMyAzIDMxLjM4NyAzYy0zLjExIDAtNi41MiAyLjM4Mi04LjU4IDYuMTFMNC40MiA0MC44OWMtMi43ODggNC42MzUtMy4xMjYgOC44MS0xLjIyNSAxMi4yMkM1LjAxNSA1Ni4yMDggNy41NzIgNTggMTMgNThoMzYuNzczYzUuNDI4IDAgOS4yMS0xLjc5MiAxMS4wMy00Ljg5IDEuOS0zLjQxIDEuNTY1LTcuNTgzLTEuMjI0LTEyLjIyem0tMi40NTIgMTFjLS42MzUgMS42OTQtMy44MDIgMi40NDMtNy4zNTQgMi40NDNIMTNjLTMuNTkgMC01LjQ5My0uNzUtNi4xMy0yLjQ0NC0xLjcxLTIuNDEtMS4zNzQtNS4yNjMgMC04LjU1N2wxOC4zODctMzEuNzc3YzIuMTE2LTMuMTY4IDQuMzk0LTQuODkgNi4xMy00Ljg5IDIuOTYgMCA1LjIzOCAxLjcyMiA3LjM1NCA0Ljg5bDE4LjM4NyAzMS43NzdjMS4zNzQgMy4yOTQgMS43MTMgNi4xNDYgMCA4LjU1NnptLTI1Ljc0LTMzYy0uNDA1IDAtMS4yMjcuODM1LTEuMjI3IDIuNDQzdjE1Ljg5YzAgMS42MDguODIzIDIuNDQ0IDEuMjI3IDIuNDQ0IDEuNjI4IDAgMi40NTItLjgzNiAyLjQ1Mi0yLjQ0NXYtMTUuODljMC0xLjYwNy0uODI1LTIuNDQzLTIuNDUzLTIuNDQzem0wIDIzLjIyYy0uNDA1IDAtMS4yMjcuNzktMS4yMjcgMS4yMjN2Mi40NDVjMCAuNDM0LjgyMyAxLjIyMiAxLjIyNyAxLjIyMiAxLjYyOCAwIDIuNDUyLS43ODggMi40NTItMS4yMjJ2LTIuNDQ1YzAtLjQzNC0uODI1LTEuMjIyLTIuNDUzLTEuMjIyelwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIi8+PC9zdmc+JyxcbiAgICAnaW5mby1jaXJjbGUnOlxuICAgICAgJzxzdmcgdmlld0JveD1cIjAgMCA0NCA0NFwiPjxjaXJjbGUgY3g9XCIxMy44MjhcIiBjeT1cIjE5LjYzXCIgcj1cIjEuOTM4XCIvPjxjaXJjbGUgY3g9XCIyMS43NjdcIiBjeT1cIjE5LjYzXCIgcj1cIjEuOTM4XCIvPjxjaXJjbGUgY3g9XCIyOS43NjdcIiBjeT1cIjE5LjYzXCIgcj1cIjEuOTM4XCIvPjxwYXRoIGQ9XCJNMjIuMTAyIDQuMTZjLTkuOTE4IDAtMTcuOTU4IDcuMTQ3LTE3Ljk1OCAxNS45NjIgMCA0LjkzNSAyLjUyMiA5LjM0NSA2LjQ4IDEyLjI3M3Y1LjY2N2wuMDQuMDEyYTIuNjI3IDIuNjI3IDAgMSAwIDQuNSAxLjQ1NWguMDAybDUuMDI2LTMuNTRjLjYyOC4wNiAxLjI2NS4wOTQgMS45MS4wOTQgOS45MiAwIDE3Ljk2LTcuMTQ2IDE3Ljk2LTE1Ljk2QzQwLjA2IDExLjMwNiAzMi4wMiA0LjE2IDIyLjEgNC4xNnptLS4wNCAyOS45MDJjLS45MDIgMC0xLjc4LS4wOC0yLjY0Mi0uMjA3bC01Ljg4MiA0LjIzNGMtLjAyNC4wMjQtLjA1NS4wNC0uMDgzLjA2bC0uMDA4LjAwNWEuNTEuNTEgMCAwIDEtLjI4NC4wOTUuNTI1LjUyNSAwIDAgMS0uNTI1LS41MjVsLjAwNS02LjM3NWMtMy45MS0yLjUxNi02LjQ1Ni02LjU0NC02LjQ1Ni0xMS4xIDAtNy42MjggNy4xMDctMTMuODEyIDE1Ljg3NS0xMy44MTJzMTUuODc1IDYuMTg0IDE1Ljg3NSAxMy44MTItNy4xMDcgMTMuODEyLTE1Ljg3NSAxMy44MTJ6XCIvPjwvc3ZnPicsXG4gICAgJ3F1ZXN0aW9uLWNpcmNsZSc6XG4gICAgICAnPHN2ZyB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCI+PGcgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPjxwYXRoIGQ9XCJNMjEuMTg2IDNjLTEwLjg1MyAwLTE5LjM2IDguNTA2LTE5LjM2IDE5LjM1OEMxLjgyNyAzMi40OTQgMTAuMzM0IDQxIDIxLjE4NyA0MWMxMC4xMzMgMCAxOC42NC04LjUwNiAxOC42NC0xOC42NDJDMzkuODI3IDExLjUwNiAzMS4zMiAzIDIxLjE4NyAzbTE1LjY0IDE5YzAgOC44MjMtNy4xNzggMTYtMTYgMTZzLTE2LTcuMTc3LTE2LTE2IDcuMTc4LTE2IDE2LTE2IDE2IDcuMTc3IDE2IDE2elwiLz48cGF0aCBkPVwiTTIyLjgyNyAzMS41YTEuNSAxLjUgMCAxIDEtMyAwIDEuNSAxLjUgMCAwIDEgMyAwbTQtMTUuNDhjMCAuOTU3LS4yMDMgMS44MjItLjYxIDIuNTkzLS40MjcuNzkyLTEuMTE3IDEuNjEyLTIuMDczIDIuNDU3LS44NjcuNzM0LTEuNDUzIDEuNDM1LTEuNzU0IDIuMDk2LS4zMDIuNy0uNDUzIDEuNjkzLS40NTMgMi45OGEuODI4LjgyOCAwIDAgMS0uODIzLjg1NC44MjguODI4IDAgMCAxLS41ODQtLjIyLjg3Ny44NzcgMCAwIDEtLjI0LS42MzVjMC0xLjMwNS4xNjgtMi4zOC41MDYtMy4yMjcuMzM2LS44ODMuOTMtMS42ODIgMS43OC0yLjQgMS4wMS0uODgzIDEuNzEtMS42OTIgMi4xLTIuNDI4LjMzNi0uNjQ1LjUwMy0xLjM4LjUwMy0yLjIxLS4wMi0uOTM1LS4zLTEuNy0uODUtMi4yODgtLjY1NS0uNzE3LTEuNjItMS4wNzUtMi44OTctMS4wNzUtMS41MDYgMC0yLjU5Ni41MzUtMy4yNyAxLjYtLjQ2Ljc1NC0uNjg4IDEuNjQ1LS42ODggMi42NzdhLjkyLjkyIDAgMCAxLS4yNjYuNjYuNzQ3Ljc0NyAwIDAgMS0uNTYuMjUuNzMuNzMgMCAwIDEtLjU4NC0uMTk0Yy0uMTYtLjE2NC0uMjQtLjM5My0uMjQtLjY5IDAtMS44Mi41ODUtMy4yNzIgMS43NTUtNC4zNTdDMTguNjQ1IDExLjQ4NiAxOS45MjggMTEgMjEuNDM0IDExaC4yOTNjMS40NTIgMCAyLjYzOC40MTQgMy41NiAxLjI0IDEuMDI4LjkwMyAxLjU0IDIuMTYzIDEuNTQgMy43OHpcIi8+PC9nPjwvc3ZnPicsXG5cbiAgICB2b2ljZTpcbiAgICAgICc8c3ZnIHZpZXdCb3g9XCIwIDAgMzggMzNcIj48ZyBmaWxsLXJ1bGU9XCJldmVub2RkXCI+PHBhdGggZD1cIk0xNy44MzggMjguOGMtLjU2NC0uNDY4LTEuMTkyLS45ODMtMS44MzYtMS40OTYtNC4yNDQtMy4zODUtNS4yOTQtMy42Ny02LjAwNi0zLjY3LS4wMTQgMC0uMDI3LjAwNS0uMDQuMDA1LS4wMTUgMC0uMDI4LS4wMDYtLjA0Mi0uMDA2SDMuNTYyYy0uNzM0IDAtLjkwMy0uMjAzLS45MDMtLjkyOHYtMTIuNjJjMC0uNDkuMDU3LS44LjY2LS44SDkuMWMuNjk0IDAgMS43Ni0uMjggNi40LTMuNjMuODMtLjU5NiAxLjYzOC0xLjE5NiAyLjMzNy0xLjcyMlYyOC44ek0xOS42ODIuMTljLS40NjMtLjIyLTEuMDE0LS4xNTgtMS40MTcuMTU3LS4wMi4wMTYtMS45ODMgMS41NTItNC4xNTIgMy4xMjVDMTAuMzQgNi4yMSA5LjI0MyA2LjY2NCA5LjAyIDYuNzM3SDMuNjc2Yy0uMDI3IDAtLjA1My4wMDMtLjA4LjAwNEgxLjE4M2MtLjYwOCAwLTEuMS40ODctMS4xIDEuMDg2VjI1LjE0YzAgLjU5OC40OTIgMS4wODQgMS4xIDEuMDg0aDguNzFjLjIyLjA4IDEuMjU3LjU1IDQuNjA1IDMuMjQgMS45NDcgMS41NjIgMy42OTQgMy4wODggMy43MTIgMy4xMDMuMjUuMjIuNTY4LjMzMy44OS4zMzMuMTg2IDAgLjM3My0uMDM4LjU1LS4xMTYuNDgtLjIxMy43OS0uNjg0Ljc5LTEuMjA0VjEuMzhjMC0uNTA2LS4yOTQtLjk2OC0uNzU4LTEuMTl6XCIgbWFzaz1cInVybCgjbWFzay0yKVwiLz48cGF0aCBkPVwiTTMxLjQyIDE2LjQ3NWMwLTMuMzYzLTEuODU0LTYuMjk3LTQuNjA2LTcuODc2LS4xMjUtLjA2Ny0uNDItLjE5My0uNjI1LS4xOTMtLjYxMyAwLTEuMTEuNDg4LTEuMTEgMS4wOSAwIC40MDQuMjIuNzY0LjU1Ljk1MiAyLjEzIDEuMTkgMy41NjYgMy40NCAzLjU2NiA2LjAyNCAwIDIuNjI3LTEuNDg2IDQuOTEzLTMuNjc3IDYuMDg3LS4zMi4xOS0uNTMuNTQtLjUzLjkzNSAwIC42MDIuNDk1IDEuMDkgMS4xMDYgMS4wOS4yNi4wMDIuNTY4LS4xNS41NjgtLjE1IDIuODM1LTEuNTU2IDQuNzU0LTQuNTM4IDQuNzU0LTcuOTZcIiBtYXNrPVwidXJsKCNtYXNrLTQpXCIvPjxwYXRoIGQ9XCJNMzAuMTQgMy4wNTdjLS4yMDUtLjEyMi0uNDEtLjIyLS42NTgtLjIyLS42MDggMC0xLjEuNDg1LTEuMSAxLjA4NCAwIC40MzQuMjYuNzguNjI3Ljk3OCA0LjA0MiAyLjMyMyA2Ljc2IDYuNjM2IDYuNzYgMTEuNTc4IDAgNC45MzgtMi43MTUgOS4yNDgtNi43NTQgMTEuNTcyLS4zNTQuMTktLjY2LjU1LS42Ni45OTMgMCAuNi40OTQgMS4wODUgMS4xMDIgMS4wODUuMjQzIDAgLjQzOC0uMDkyLjY1LS4yMTMgNC42OTItMi42OTUgNy44NDgtNy43IDcuODQ4LTEzLjQzNSAwLTUuNzIzLTMuMTQyLTEwLjcxOC03LjgxNy0xMy40MThcIiBtYXNrPVwidXJsKCNtYXNrLTYpXCIvPjwvZz48L3N2Zz4nLFxuXG4gICAgcGx1czogJzxzdmcgdmlld0JveD1cIjAgMCAzMCAzMFwiPjxwYXRoIGQ9XCJNMTQgMTRIMHYyaDE0djE0aDJWMTZoMTR2LTJIMTZWMGgtMnYxNHpcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIvPjwvc3ZnPicsXG4gICAgbWludXM6ICc8c3ZnIHZpZXdCb3g9XCIwIDAgMzAgMlwiPjxwYXRoIGQ9XCJNMCAwaDMwdjJIMHpcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIvPjwvc3ZnPicsXG5cbiAgICBkaXNsaWtlOlxuICAgICAgJzxzdmcgdmlld0JveD1cIjAgMCA3MiA3MlwiPjxnIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPjxwYXRoIGQ9XCJNMzYgNzJjMTkuODgyIDAgMzYtMTYuMTE4IDM2LTM2UzU1Ljg4MiAwIDM2IDAgMCAxNi4xMTggMCAzNnMxNi4xMTggMzYgMzYgMzZ6bTAtMmMxOC43NzggMCAzNC0xNS4yMjIgMzQtMzRTNTQuNzc4IDIgMzYgMiAyIDE3LjIyMiAyIDM2czE1LjIyMiAzNCAzNCAzNHpcIiBmaWxsPVwiI0ZGRlwiLz48cGF0aCBmaWxsPVwiI0ZGRlwiIGQ9XCJNNDcgMjJoMnY2aC0yem0tMjQgMGgydjZoLTJ6XCIvPjxwYXRoIGQ9XCJNMjEgNTFzNC42LTcgMTUtNyAxNSA3IDE1IDdcIiBzdHJva2U9XCIjRkZGXCIgc3Ryb2tlLXdpZHRoPVwiMlwiLz48L2c+PC9zdmc+JyxcbiAgICBmYWlsOlxuICAgICAgJzxzdmcgdmlld0JveD1cIjAgMCA3MiA3MlwiPjxnIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPjxwYXRoIGQ9XCJNMzYgNzJjMTkuODgyIDAgMzYtMTYuMTE4IDM2LTM2UzU1Ljg4MiAwIDM2IDAgMCAxNi4xMTggMCAzNnMxNi4xMTggMzYgMzYgMzZ6bTAtMmMxOC43NzggMCAzNC0xNS4yMjIgMzQtMzRTNTQuNzc4IDIgMzYgMiAyIDE3LjIyMiAyIDM2czE1LjIyMiAzNCAzNCAzNHpcIiBmaWxsPVwiI0ZGRlwiLz48cGF0aCBkPVwiTTIyIDIybDI4LjMwNCAyOC4zMDRtLTI4LjMwNCAwTDUwLjMwNCAyMlwiIHN0cm9rZT1cIiNGRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIvPjwvZz48L3N2Zz4nLFxuICAgIHN1Y2Nlc3M6XG4gICAgICAnPHN2ZyB2aWV3Qm94PVwiMCAwIDcyIDcyXCI+PGcgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+PHBhdGggZD1cIk0zNiA3MmMxOS44ODIgMCAzNi0xNi4xMTggMzYtMzZTNTUuODgyIDAgMzYgMCAwIDE2LjExOCAwIDM2czE2LjExOCAzNiAzNiAzNnptMC0yYzE4Ljc3OCAwIDM0LTE1LjIyMiAzNC0zNFM1NC43NzggMiAzNiAyIDIgMTcuMjIyIDIgMzZzMTUuMjIyIDM0IDM0IDM0elwiIGZpbGw9XCIjRkZGXCIvPjxwYXRoIHN0cm9rZT1cIiNGRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgZD1cIk0xOSAzNC41NGwxMS41NDUgMTEuOTIzTDUyLjgxNSAyNFwiLz48L2c+PC9zdmc+J1xuICB9O1xuXG4gIHJlbmRlclN2Z1Nwcml0ZSgpIHtcbiAgICBjb25zdCBzeW1ib2xzID0gT2JqZWN0LmtleXModGhpcy5pY29ucylcbiAgICAgIC5tYXAoaWNvbk5hbWUgPT4ge1xuICAgICAgICBjb25zdCBzdmdDb250ZW50ID0gdGhpcy5pY29uc1tpY29uTmFtZV0uc3BsaXQoJ3N2ZycpWzFdO1xuICAgICAgICByZXR1cm4gYDxzeW1ib2wgaWQ9JHtpY29uTmFtZX0ke3N2Z0NvbnRlbnR9c3ltYm9sPmA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJycpO1xuICAgIHJldHVybiBzdmdTcHJpdGUoc3ltYm9scyk7XG4gIH1cblxuICBsb2FkKCkge1xuICAgIGlmICghZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX19BTlREX01PQklMRV9TVkdfU1BSSVRFX05PREVfXycpO1xuICAgIGNvbnN0IG1vdW50Tm9kZSA9IGRvY3VtZW50LmJvZHk7XG5cbiAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICBtb3VudE5vZGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywgdGhpcy5yZW5kZXJTdmdTcHJpdGUoKSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWNvbkhhbmRsZXIgfSBmcm9tICcuLi9jb3JlL3V0aWwvaWNvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0ljb24sIG56bS1pY29uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ljb24uY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtJY29uSGFuZGxlcl1cbn0pXG5leHBvcnQgY2xhc3MgSWNvbkNvbXBvbmVudCB7XG4gIGNsc01hcDogb2JqZWN0ID0ge307XG5cbiAgcHJpdmF0ZSBfdHlwZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX3NpemU6IHN0cmluZyA9ICdtZCc7XG4gIHByaXZhdGUgX3NyYzogc3RyaW5nID0gJyc7XG5cbiAgQElucHV0KClcbiAgY29sb3I6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKVxuICBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG4gIHNldCB0eXBlKHZhbHVlKSB7XG4gICAgdGhpcy5fdHlwZSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xzTWFwKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHNyYygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zcmM7XG4gIH1cbiAgc2V0IHNyYyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc3JjID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbHNNYXAoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgc2l6ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG4gIHNldCBzaXplKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zaXplID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbHNNYXAoKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ljb25IYW5kbGVyOiBJY29uSGFuZGxlcikge1xuICAgIHRoaXMuX2ljb25IYW5kbGVyLmxvYWQoKTtcbiAgfVxuXG4gIHNldENsc01hcCgpIHtcbiAgICB0aGlzLmNsc01hcCA9IHtcbiAgICAgIFtgYW0taWNvbi0ke3RoaXMuX3R5cGV9YF06IHRydWUsXG4gICAgICBbYGFtLWljb24tJHt0aGlzLl9zaXplfWBdOiB0cnVlXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSAnLi9pY29uLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbSWNvbkNvbXBvbmVudF0sXG4gIGRlY2xhcmF0aW9uczogW0ljb25Db21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIEljb25Nb2R1bGUge31cbiIsImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIEhvc3RCaW5kaW5nLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgdHlwZSBzaXplVHlwZSA9ICdzbScgfCAnbWQnIHwgJ2xnJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnV2luZ0JsYW5rLCBuem0td2luZ2JsYW5rJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpbmctYmxhbmsuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFdpbmdCbGFuayB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLXdpbmdibGFuayc7XG5cbiAgQElucHV0KClcbiAgc2l6ZTogc2l6ZVR5cGUgPSAnbGcnO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0td2luZ2JsYW5rJylcbiAgYW1XaW5nQmxhbms6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXdpbmdibGFuay1zbScpXG4gIGdldCBhbVdpbmdCbG5rU20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSA9PT0gJ3NtJztcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXdpbmdibGFuay1tZCcpXG4gIGdldCBhbVdpbmdCbG5rTWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSA9PT0gJ21kJztcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXdpbmdibGFuay1sZycpXG4gIGdldCBhbVdpbmdCbG5rTGcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSA9PT0gJ2xnJztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge31cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBXaW5nQmxhbmsgfSBmcm9tICcuL3dpbmctYmxhbmsuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1dpbmdCbGFua10sXG4gIGV4cG9ydHM6IFtXaW5nQmxhbmtdLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBXaW5nQmxhbmtNb2R1bGUge31cbiIsImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCB0eXBlIHNpemVUeXBlID0gJ3hzJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1doaXRlU3BhY2UsIG56bS13aGl0ZXNwYWNlJyxcbiAgdGVtcGxhdGU6IGBgXG59KVxuZXhwb3J0IGNsYXNzIFdoaXRlU3BhY2Uge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS13aGl0ZXNwYWNlJztcblxuICBASW5wdXQoKVxuICBzaXplOiBzaXplVHlwZSA9ICdtZCc7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS13aGl0ZXNwYWNlJylcbiAgYW1XaGl0ZVNwYWNlOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS13aGl0ZXNwYWNlLXhzJylcbiAgZ2V0IGFtV2hpdGVzcGFjZVhzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNpemUgPT09ICd4cyc7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS13aGl0ZXNwYWNlLXNtJylcbiAgZ2V0IGFtV2hpdGVzcGFjZVNtKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNpemUgPT09ICdzbSc7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS13aGl0ZXNwYWNlLW1kJylcbiAgZ2V0IGFtV2hpdGVzcGFjZU1kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNpemUgPT09ICdtZCc7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS13aGl0ZXNwYWNlLWxnJylcbiAgZ2V0IGFtV2hpdGVzcGFjZUxnKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNpemUgPT09ICdsZyc7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS13aGl0ZXNwYWNlLXhsJylcbiAgZ2V0IGFtV2hpdGVzcGFjZVhsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNpemUgPT09ICd4bCc7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHt9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgV2hpdGVTcGFjZSB9IGZyb20gJy4vd2hpdGUtc3BhY2UuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1doaXRlU3BhY2VdLFxuICBleHBvcnRzOiBbV2hpdGVTcGFjZV0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIFdoaXRlU3BhY2VNb2R1bGUge31cbiIsImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIElucHV0LCBIb3N0QmluZGluZyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdMaXN0LCBuem0tbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBMaXN0IHtcbiAgZGVmYXVsdFByb3BzOiBhbnkgPSB7XG4gICAgcHJlZml4Q2xzOiAnYW0tbGlzdCdcbiAgfTtcblxuICBwcml2YXRlIF9yZW5kZXJIZWFkZXI6IGFueSA9ICcnO1xuICBwcml2YXRlIF9yZW5kZXJGb290ZXI6IGFueSA9ICcnO1xuICBwcml2YXRlIF9jbGFzc05hbWU6IHN0cmluZyA9ICcnO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBjbGFzc05hbWUodmFsdWUpIHtcbiAgICB0aGlzLl9jbGFzc05hbWUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgcmVuZGVySGVhZGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJIZWFkZXI7XG4gIH1cbiAgc2V0IHJlbmRlckhlYWRlcih2YWx1ZSkge1xuICAgIHRoaXMuX3JlbmRlckhlYWRlciA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCByZW5kZXJGb290ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbmRlckZvb3RlcjtcbiAgfVxuICBzZXQgcmVuZGVyRm9vdGVyKHZhbHVlKSB7XG4gICAgdGhpcy5fcmVuZGVyRm9vdGVyID0gdmFsdWU7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGhvc3RDbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2FtLWxpc3QgJyArIHRoaXMuX2NsYXNzTmFtZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge31cbn1cbiIsImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIE91dHB1dCxcbiAgT25EZXN0cm95LFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdMaXN0SXRlbSwgbnptLWxpc3QtaXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnLi9saXN0LWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIExpc3RJdGVtIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBkZWZhdWx0UHJvcHMgPSB7XG4gICAgcHJlZml4Q2xzOiAnYW0tbGlzdCcsXG4gICAgYWxpZ246ICdtaWRkbGUnLFxuICAgIGVycm9yOiBmYWxzZSxcbiAgICBtdWx0aXBsZUxpbmU6IGZhbHNlLFxuICAgIHdyYXA6IGZhbHNlLFxuICAgIHBsYXRmb3JtOiAnaW9zJyxcbiAgICByaXBwbGVTdHlsZToge31cbiAgfTtcbiAgYXJyb3dDbHM6IGFueSA9IHt9O1xuICBsaW5lQ2xzOiBhbnkgPSB7fTtcbiAgd3JhcENsczogc3RyaW5nID0gJyc7XG4gIHJpcHBsZUNsczogYW55ID0ge307XG4gIHJpcHBsZUNsaWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGVib3VuY2VUaW1lb3V0OiBhbnk7XG5cbiAgcHJpdmF0ZSBfdGh1bWJfY29tcG9uZW50OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3RodW1iOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBwcml2YXRlIF90aHVtYl9zcmM6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9leHRyYV9jb21wb25lbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfZXh0cmE6IFRlbXBsYXRlUmVmPGFueT47XG4gIHByaXZhdGUgX2V4dHJhX3RpdGxlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfYXJyb3c6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9jbGFzc05hbWU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9hY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBnZXQgZXh0cmEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dHJhO1xuICB9XG4gIGdldCBleHRyYV9jb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dHJhX2NvbXBvbmVudDtcbiAgfVxuICBnZXQgZXh0cmFfdGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dHJhX3RpdGxlO1xuICB9XG4gIHNldCBleHRyYSh2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICB0aGlzLl9leHRyYV9jb21wb25lbnQgPSB0cnVlO1xuICAgICAgdGhpcy5fZXh0cmEgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZXh0cmFfY29tcG9uZW50ID0gZmFsc2U7XG4gICAgICB0aGlzLl9leHRyYV90aXRsZSA9IDxzdHJpbmc+dmFsdWU7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBjbGFzc05hbWUodmFsdWUpIHtcbiAgICB0aGlzLl9jbGFzc05hbWUgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsc01hcCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBhcnJvdygpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyb3c7XG4gIH1cbiAgc2V0IGFycm93KHZhbHVlKSB7XG4gICAgdGhpcy5fYXJyb3cgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsc01hcCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtdWx0aXBsZUxpbmUodmFsdWUpIHtcbiAgICB0aGlzLmRlZmF1bHRQcm9wcy5tdWx0aXBsZUxpbmUgPSB2YWx1ZSA9PT0gJycgPyB0cnVlIDogdmFsdWU7XG4gICAgdGhpcy5zZXRDbHNNYXAoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZXJyb3IodmFsdWUpIHtcbiAgICB0aGlzLmRlZmF1bHRQcm9wcy5lcnJvciA9IHZhbHVlID09PSAnJyA/IHRydWUgOiB2YWx1ZTtcbiAgICB0aGlzLnNldENsc01hcCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCB3cmFwKHZhbHVlKSB7XG4gICAgdGhpcy5kZWZhdWx0UHJvcHMud3JhcCA9IHZhbHVlID09PSAnJyA/IHRydWUgOiB2YWx1ZTtcbiAgICB0aGlzLnNldENsc01hcCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBhbGlnbih2YWx1ZSkge1xuICAgIHRoaXMuZGVmYXVsdFByb3BzLmFsaWduID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbHNNYXAoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcGxhdGZvcm0odmFsdWUpIHtcbiAgICB0aGlzLmRlZmF1bHRQcm9wcy5wbGF0Zm9ybSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkaXNhYmxlZCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZXRDbHNNYXAoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdGh1bWIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RodW1iO1xuICB9XG4gIGdldCB0aHVtYl9jb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RodW1iX2NvbXBvbmVudDtcbiAgfVxuICBnZXQgdGh1bWJfc3JjKCkge1xuICAgIHJldHVybiB0aGlzLl90aHVtYl9zcmM7XG4gIH1cbiAgc2V0IHRodW1iKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcbiAgICAgIHRoaXMuX3RodW1iX2NvbXBvbmVudCA9IHRydWU7XG4gICAgICB0aGlzLl90aHVtYiA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90aHVtYl9jb21wb25lbnQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3RodW1iX3NyYyA9IDxzdHJpbmc+dmFsdWU7XG4gICAgfVxuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgYmluZ0NsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLndyYXBDbHM7XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICBjbGljayhldmVudCkge1xuICAgIHRoaXMub25JdGVtQ2xpY2soZXZlbnQpO1xuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoc3RhcnQnKVxuICBzdGFydCgpIHtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkICYmIHRoaXMub25DbGljay5vYnNlcnZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2V0Q2xzTWFwKCk7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNobW92ZScpXG4gIG1vdmUoKSB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLm9uQ2xpY2sub2JzZXJ2ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXRDbHNNYXAoKTtcbiAgICB9XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hlbmQnKVxuICBlbmQoKSB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLm9uQ2xpY2sub2JzZXJ2ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXRDbHNNYXAoKTtcbiAgICB9XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJylcbiAgbW91c2Vfc3RhcnQoKSB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLm9uQ2xpY2sub2JzZXJ2ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICB0aGlzLnNldENsc01hcCgpO1xuICAgIH1cbiAgfVxuICBASG9zdExpc3RlbmVyKCdtb3VzZXVwJylcbiAgbW91c2VfZW5kKCkge1xuICAgIGlmICghdGhpcy5fZGlzYWJsZWQgJiYgdGhpcy5vbkNsaWNrLm9ic2VydmVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0Q2xzTWFwKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHNldENsc01hcCgpIHtcbiAgICBjb25zdCBjbGFzc05hbWVMaXN0ID0gdGhpcy5fY2xhc3NOYW1lLnNwbGl0KCcgJyk7XG4gICAgbGV0IGNsYXNzTmFtZU9iaiA9IHt9O1xuICAgIHRoaXMud3JhcENscyA9ICcnO1xuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjbGFzc05hbWVMaXN0KSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgY2xhc3NOYW1lT2JqID0ge1xuICAgICAgICAgIC4uLmNsYXNzTmFtZU9iaixcbiAgICAgICAgICAuLi57IFtgJHt2YWx1ZX1gXTogdHJ1ZSB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd3JhcENsc09iaiA9IHtcbiAgICAgIFtgJHt0aGlzLmRlZmF1bHRQcm9wcy5wcmVmaXhDbHN9LWl0ZW1gXTogdHJ1ZSxcbiAgICAgIFtgJHt0aGlzLmRlZmF1bHRQcm9wcy5wcmVmaXhDbHN9LWl0ZW0tZGlzYWJsZWRgXTogdGhpcy5fZGlzYWJsZWQsXG4gICAgICBbYCR7dGhpcy5kZWZhdWx0UHJvcHMucHJlZml4Q2xzfS1pdGVtLWFjdGl2ZWBdOiB0aGlzLl9hY3RpdmUsXG4gICAgICBbYCR7dGhpcy5kZWZhdWx0UHJvcHMucHJlZml4Q2xzfS1pdGVtLWVycm9yYF06IHRoaXMuZGVmYXVsdFByb3BzLmVycm9yLFxuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30taXRlbS10b3BgXTogdGhpcy5kZWZhdWx0UHJvcHMuYWxpZ24gPT09ICd0b3AnLFxuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30taXRlbS1taWRkbGVgXTogdGhpcy5kZWZhdWx0UHJvcHMuYWxpZ24gPT09ICdtaWRkbGUnLFxuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30taXRlbS1ib3R0b21gXTogdGhpcy5kZWZhdWx0UHJvcHMuYWxpZ24gPT09ICdib3R0b20nLFxuICAgICAgLi4uY2xhc3NOYW1lT2JqXG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIHdyYXBDbHNPYmopIHtcbiAgICAgIGlmICh3cmFwQ2xzT2JqW2tleV0pIHtcbiAgICAgICAgdGhpcy53cmFwQ2xzICs9IGAgJHtrZXl9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnJpcHBsZUNscyA9IHtcbiAgICAgIFtgJHt0aGlzLmRlZmF1bHRQcm9wcy5wcmVmaXhDbHN9LXJpcHBsZWBdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30tcmlwcGxlLWFuaW1hdGVgXTogdGhpcy5yaXBwbGVDbGlja2VkXG4gICAgfTtcblxuICAgIHRoaXMubGluZUNscyA9IHtcbiAgICAgIFtgJHt0aGlzLmRlZmF1bHRQcm9wcy5wcmVmaXhDbHN9LWxpbmVgXTogdHJ1ZSxcbiAgICAgIFtgJHt0aGlzLmRlZmF1bHRQcm9wcy5wcmVmaXhDbHN9LWxpbmUtbXVsdGlwbGVgXTogdGhpcy5kZWZhdWx0UHJvcHMubXVsdGlwbGVMaW5lLFxuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30tbGluZS13cmFwYF06IHRoaXMuZGVmYXVsdFByb3BzLndyYXBcbiAgICB9O1xuXG4gICAgdGhpcy5hcnJvd0NscyA9IHtcbiAgICAgIFtgJHt0aGlzLmRlZmF1bHRQcm9wcy5wcmVmaXhDbHN9LWFycm93YF06IHRydWUsXG4gICAgICBbYCR7dGhpcy5kZWZhdWx0UHJvcHMucHJlZml4Q2xzfS1hcnJvdy1ob3Jpem9udGFsYF06IHRoaXMuX2Fycm93ID09PSAnaG9yaXpvbnRhbCcsXG4gICAgICBbYCR7dGhpcy5kZWZhdWx0UHJvcHMucHJlZml4Q2xzfS1hcnJvdy12ZXJ0aWNhbGBdOiB0aGlzLl9hcnJvdyA9PT0gJ2Rvd24nIHx8IHRoaXMuX2Fycm93ID09PSAndXAnLFxuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30tYXJyb3ctdmVydGljYWwtdXBgXTogdGhpcy5fYXJyb3cgPT09ICd1cCdcbiAgICB9O1xuICB9XG5cbiAgb25JdGVtQ2xpY2soZXYpIHtcbiAgICBjb25zdCBpc0FuZHJvaWQgPSB0aGlzLmRlZmF1bHRQcm9wcy5wbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnO1xuICAgIGlmIChpc0FuZHJvaWQpIHtcbiAgICAgIGlmICh0aGlzLmRlYm91bmNlVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWJvdW5jZVRpbWVvdXQpO1xuICAgICAgICB0aGlzLmRlYm91bmNlVGltZW91dCA9IG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBJdGVtID0gZXYuY3VycmVudFRhcmdldDtcbiAgICAgIGNvbnN0IFJpcHBsZVdpZHRoID0gTWF0aC5tYXgoSXRlbS5vZmZzZXRIZWlnaHQsIEl0ZW0ub2Zmc2V0V2lkdGgpO1xuICAgICAgY29uc3QgQ2xpZW50UmVjdCA9IGV2LmN1cnJlbnRUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBwb2ludFggPSBldi5jbGllbnRYIC0gQ2xpZW50UmVjdC5sZWZ0IC0gSXRlbS5vZmZzZXRXaWR0aCAvIDI7XG4gICAgICBjb25zdCBwb2ludFkgPSBldi5jbGllbnRZIC0gQ2xpZW50UmVjdC50b3AgLSBJdGVtLm9mZnNldFdpZHRoIC8gMjtcbiAgICAgIGNvbnN0IGNvdmVyUmlwcGxlU3R5bGUgPSB7XG4gICAgICAgIHdpZHRoOiBgJHtSaXBwbGVXaWR0aH1weGAsXG4gICAgICAgIGhlaWdodDogYCR7UmlwcGxlV2lkdGh9cHhgLFxuICAgICAgICBsZWZ0OiBgJHtwb2ludFh9cHhgLFxuICAgICAgICB0b3A6IGAke3BvaW50WX1weGBcbiAgICAgIH07XG4gICAgICB0aGlzLmRlZmF1bHRQcm9wcy5yaXBwbGVTdHlsZSA9IGNvdmVyUmlwcGxlU3R5bGU7XG4gICAgICB0aGlzLnJpcHBsZUNsaWNrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRDbHNNYXAoKTtcbiAgICAgIHRoaXMuZGVib3VuY2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmlwcGxlQ2xpY2tlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlZmF1bHRQcm9wcy5yaXBwbGVTdHlsZSA9IHsgZGlzcGxheTogJ25vbmUnIH07XG4gICAgICAgIHRoaXMuc2V0Q2xzTWFwKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9XG4gICAgdGhpcy5vbkNsaWNrLmVtaXQoZXYpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kZWZhdWx0UHJvcHMucmlwcGxlU3R5bGUgPSB7IGRpc3BsYXk6ICdub25lJyB9O1xuICAgIHRoaXMuc2V0Q2xzTWFwKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZWJvdW5jZVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlYm91bmNlVGltZW91dCk7XG4gICAgICB0aGlzLmRlYm91bmNlVGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0JyaWVmLCBuem0tYnJpZWYnLFxuICB0ZW1wbGF0ZVVybDogJy4vYnJpZWYuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEJyaWVmIHtcbiAgZGVmYXVsdFByb3BzID0ge1xuICAgIHByZWZpeENsczogJ2FtLWxpc3QnXG4gIH07XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTGlzdCB9IGZyb20gJy4vbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICcuL2xpc3QtaXRlbS9saXN0LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IEJyaWVmIH0gZnJvbSAnLi9icmllZi9icmllZi5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG4gIGV4cG9ydHM6IFtMaXN0LCBMaXN0SXRlbSwgQnJpZWZdLFxuICBkZWNsYXJhdGlvbnM6IFtMaXN0LCBMaXN0SXRlbSwgQnJpZWZdXG59KVxuZXhwb3J0IGNsYXNzIExpc3RNb2R1bGUge31cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEljb25Nb2R1bGUgfSBmcm9tICcuLi9pY29uL2ljb24ubW9kdWxlJztcbmltcG9ydCB7IFdpbmdCbGFua01vZHVsZSB9IGZyb20gJy4uL3dpbmctYmxhbmsvd2luZy1ibGFuay5tb2R1bGUnO1xuaW1wb3J0IHsgV2hpdGVTcGFjZU1vZHVsZSB9IGZyb20gJy4uL3doaXRlLXNwYWNlL3doaXRlLXNwYWNlLm1vZHVsZSc7XG5pbXBvcnQgeyBMaXN0TW9kdWxlIH0gZnJvbSAnLi4vbGlzdC9saXN0Lm1vZHVsZSc7XG5leHBvcnQgY29uc3QgTlpfQlVUVE9OX0RJUkVDVElWRVM6IEFycmF5PGFueT4gPSBbQnV0dG9uXTtcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBOWl9CVVRUT05fRElSRUNUSVZFUyxcbiAgZXhwb3J0czogTlpfQlVUVE9OX0RJUkVDVElWRVMsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEljb25Nb2R1bGUsIFdpbmdCbGFua01vZHVsZSwgV2hpdGVTcGFjZU1vZHVsZSwgTGlzdE1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgQnV0dG9uTW9kdWxlIHt9XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1N3aXRjaCwgbnptLXN3aXRjaCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zd2l0Y2guY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFN3aXRjaCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTd2l0Y2gge1xuICBwcmVmaXhDbHMgPSAnYW0tc3dpdGNoJztcbiAgd3JhcENscyA9ICdhbS1zd2l0Y2gnO1xuICBjaGVja2JveENscyA9IHtcbiAgICAnY2hlY2tib3gtZGlzYWJsZWQnOiBmYWxzZVxuICB9O1xuICBjb2xvclN0eWxlID0ge307XG4gIHN3aXRjaENoZWNrZWQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfY29sb3I6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9wbGF0Zm9ybTogc3RyaW5nID0gJ2lvcyc7XG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IGNvbG9yKHZhbHVlKSB7XG4gICAgdGhpcy5fY29sb3IgPSB2YWx1ZTtcbiAgICB0aGlzLmNvbG9yU3R5bGUgPSB7IGJhY2tncm91bmQ6IHRoaXMuX2NvbG9yIH07XG4gIH1cblxuICBASW5wdXQoKVxuICBuYW1lOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgc2V0IHBsYXRmb3JtKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wbGF0Zm9ybSA9IHZhbHVlO1xuICAgIHRoaXMud3JhcENscyA9IHZhbHVlID09PSAnYW5kcm9pZCcgPyBgJHt0aGlzLnByZWZpeENsc30tYW5kcm9pZGAgOiB0aGlzLnByZWZpeENscztcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgY2hlY2tlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc3dpdGNoQ2hlY2tlZCA9IHZhbHVlO1xuICAgIHRoaXMuY29sb3JTdHlsZSA9IHsgYmFja2dyb3VuZDogdmFsdWUgPyB0aGlzLl9jb2xvciA6ICcnIH07XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICAgIHRoaXMuY2hlY2tib3hDbHMgPSB7XG4gICAgICAnY2hlY2tib3gtZGlzYWJsZWQnOiB2YWx1ZVxuICAgIH07XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KClcbiAgb25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKVxuICBkaXNwYWx5OiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgY2hhbmdlU3dpdGNoKGNoZWNrZWRWYWx1ZSkge1xuICAgIHRoaXMuc3dpdGNoQ2hlY2tlZCA9IGNoZWNrZWRWYWx1ZTtcbiAgICB0aGlzLmNvbG9yU3R5bGUgPSB7IGJhY2tncm91bmQ6IGNoZWNrZWRWYWx1ZSA/IHRoaXMuX2NvbG9yIDogJycgfTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoY2hlY2tlZFZhbHVlKTtcbiAgfVxuXG4gIGNsaWNrKCkge1xuICAgIHRoaXMub25DbGljay5lbWl0KHRoaXMuc3dpdGNoQ2hlY2tlZCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTd2l0Y2ggfSBmcm9tICcuL3N3aXRjaC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFdpbmdCbGFua01vZHVsZSB9IGZyb20gJy4uL3dpbmctYmxhbmsvd2luZy1ibGFuay5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoe1xuICBleHBvcnRzOiBbU3dpdGNoXSxcbiAgZGVjbGFyYXRpb25zOiBbU3dpdGNoXSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgV2luZ0JsYW5rTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBTd2l0Y2hNb2R1bGUge31cbiIsImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBBZnRlclZpZXdDaGVja2VkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgZm9yd2FyZFJlZixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRyaWdnZXIsIHN0YXRlLCBhbmltYXRlLCB0cmFuc2l0aW9uLCBzdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgTG9jYWxlUHJvdmlkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vbG9jYWxlLXByb3ZpZGVyL2xvY2FsZS1wcm92aWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdTZWFyY2hCYXIsIG56bS1zZWFyY2gtYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC1iYXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlYXJjaEJhciksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2NhbmNlbEJ1dHRvblN0YXRlJywgW1xuICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IHdpZHRoOiAnKicgfSkpLFxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgd2lkdGg6ICcxMDAlJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+aGlkZGVuJywgW2FuaW1hdGUoMzAwLCBzdHlsZSh7IHdpZHRoOiAnMTAwJScgfSkpXSksXG4gICAgICB0cmFuc2l0aW9uKCdoaWRkZW4gPT4gdmlzaWJsZScsIFthbmltYXRlKDMwMCwgc3R5bGUoeyB3aWR0aDogJyonIH0pKV0pXG4gICAgXSlcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTZWFyY2hCYXIgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLXNlYXJjaCc7XG4gIGNsZWFyQ2xzOiBvYmplY3Q7XG4gIHdyYXBDbHM6IG9iamVjdDtcbiAgY2FuY2VsQ2xzOiBvYmplY3QgPSB7XG4gICAgW2Ake3RoaXMucHJlZml4Q2xzfS1jYW5jZWxgXTogdHJ1ZVxuICB9O1xuXG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9zaG93Q2FuY2VsQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2NhbmNlbFRleHQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbWF4TGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgX2ZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzU3VibWl0OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzQ3VzdG9tVGV4dDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9pc0NsZWFyQ2xpY2tpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3ludGhldGljUGhDb250YWluZXJSZWY6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9zeW50aGV0aWNQaFJlZjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3JpZ2h0QnRuUmVmOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfaW5wdXRDb250YWluZXJSZWY6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9yaWdodEJ0bkluaXRNYXJnaW5MZWZ0OiBzdHJpbmc7XG4gIHByaXZhdGUgX2JsdXJGcm9tT25DbGVhcjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGxvY2FsZTogYW55ID0ge307XG4gIHByaXZhdGUgX3Vuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnc2VhcmNoJylcbiAgaW5wdXRFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5pbnB1dEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodjogc3RyaW5nKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2IHx8ICcnO1xuICAgIHRoaXMuaW5wdXRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICB9XG4gIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgc2hvd0NhbmNlbEJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd0NhbmNlbEJ1dHRvbjtcbiAgfVxuICBzZXQgc2hvd0NhbmNlbEJ1dHRvbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3Nob3dDYW5jZWxCdXR0b24gPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGNhbmNlbFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2FuY2VsVGV4dDtcbiAgfVxuICBzZXQgY2FuY2VsVGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2NhbmNlbFRleHQgPSB2YWx1ZTtcbiAgICAgIHRoaXMuX2lzQ3VzdG9tVGV4dCA9IHRydWU7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heExlbmd0aDtcbiAgfVxuICBzZXQgbWF4TGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhMZW5ndGggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc2V0Rm9jdXModmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZS5mb2N1c1ZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB0aGlzLl9ibHVyRnJvbU9uQ2xlYXIgPSB0cnVlO1xuICAgICAgICB0aGlzLm9uU2VhcmNoYmFyRm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2JsdXJGcm9tT25DbGVhciA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uU2VhcmNoYmFyQmx1cigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBAT3V0cHV0KClcbiAgb25TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkNsZWFyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBfbG9jYWxlUHJvdmlkZXI6IExvY2FsZVByb3ZpZGVyU2VydmljZSkge31cblxuICBzZXRDbGFzcygpIHtcbiAgICB0aGlzLndyYXBDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9YF06IHRydWUsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LXN0YXJ0YF06ICEhKHRoaXMuX2ZvY3VzIHx8ICh0aGlzLl92YWx1ZSAmJiB0aGlzLl92YWx1ZS5sZW5ndGggPiAwKSkgJiYgIXRoaXMuX2Rpc2FibGVkXG4gICAgfTtcbiAgICB0aGlzLmNhbmNlbENscyA9IHtcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY2FuY2VsYF06IHRydWUsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWNhbmNlbC1zaG93YF06XG4gICAgICAgIHRoaXMuX3Nob3dDYW5jZWxCdXR0b24gfHwgdGhpcy5fZm9jdXMgfHwgKHRoaXMuX3ZhbHVlICYmIHRoaXMuX3ZhbHVlLmxlbmd0aCA+IDApLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1jYW5jZWwtYW5pbWBdOiB0aGlzLl9mb2N1c1xuICAgIH07XG4gICAgdGhpcy5jbGVhckNscyA9IHtcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY2xlYXJgXTogdGhpcy5fdmFsdWUgJiYgdGhpcy5fdmFsdWUubGVuZ3RoID4gMCxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY2xlYXItc2hvd2BdOiB0aGlzLl92YWx1ZSAmJiB0aGlzLl92YWx1ZS5sZW5ndGggPiAwICYmICF0aGlzLl9pc1N1Ym1pdCxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY2xlYXItYWN0aXZlYF06IHRoaXMuX2lzQ2xlYXJDbGlja2luZ1xuICAgIH07XG4gIH1cblxuICBzZXRTdHlsZSgpIHtcbiAgICBpZiAodGhpcy5faW5wdXRDb250YWluZXJSZWYuY2xhc3NOYW1lLmluZGV4T2YoYCR7dGhpcy5wcmVmaXhDbHN9LXN0YXJ0YCkgPiAtMSkge1xuICAgICAgY29uc3QgcmVhbFdpZHRoID0gdGhpcy5fc3ludGhldGljUGhDb250YWluZXJSZWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICB0aGlzLl9zeW50aGV0aWNQaFJlZi5zdHlsZS53aWR0aCA9IE1hdGguY2VpbChyZWFsV2lkdGgpICsgJ3B4JztcbiAgICAgIGlmICghdGhpcy5fc2hvd0NhbmNlbEJ1dHRvbikge1xuICAgICAgICB0aGlzLl9yaWdodEJ0blJlZi5zdHlsZS5tYXJnaW5SaWdodCA9ICcwJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3ludGhldGljUGhSZWYuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICBpZiAoIXRoaXMuX3Nob3dDYW5jZWxCdXR0b24pIHtcbiAgICAgICAgdGhpcy5fcmlnaHRCdG5Jbml0TWFyZ2luTGVmdCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX3JpZ2h0QnRuUmVmKVsnbWFyZ2luLWxlZnQnXTtcbiAgICAgICAgY29uc3QgYnRuTWFyZ2luUmlnaHQgPSB0aGlzLl9yaWdodEJ0blJlZi5vZmZzZXRXaWR0aCArIHBhcnNlSW50KHRoaXMuX3JpZ2h0QnRuSW5pdE1hcmdpbkxlZnQsIDEwKTtcbiAgICAgICAgdGhpcy5fcmlnaHRCdG5SZWYuc3R5bGUubWFyZ2luUmlnaHQgPSAnLScgKyBidG5NYXJnaW5SaWdodCArICdweCc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25TZWFyY2hiYXJCbHVyKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFzZWxmLl9ibHVyRnJvbU9uQ2xlYXIgJiYgc2VsZi5fdmFsdWUgPT09ICcnICYmIHNlbGYuX2ZvY3VzKSB7XG4gICAgICAgIHNlbGYuX2ZvY3VzID0gZmFsc2U7XG4gICAgICAgIHNlbGYuX3ZhbHVlID0gJyc7XG4gICAgICAgIHNlbGYub25CbHVyLmVtaXQoKTtcbiAgICAgICAgc2VsZi5zZXRDbGFzcygpO1xuICAgICAgfVxuICAgICAgc2VsZi5fYmx1ckZyb21PbkNsZWFyID0gZmFsc2U7XG4gICAgfSwgNTApO1xuICB9XG5cbiAgb25TZWFyY2hiYXJGb2N1cygpIHtcbiAgICB0aGlzLl9mb2N1cyA9IHRydWU7XG4gICAgdGhpcy5faXNTdWJtaXQgPSBmYWxzZTtcbiAgICB0aGlzLm9uRm9jdXMuZW1pdCgpO1xuICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgfVxuXG4gIG9uU2VhcmNoYmFyQ2hhbmdlKGUpIHtcbiAgICB0aGlzLl9mb2N1cyA9IHRydWU7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KGUpO1xuICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgfVxuXG4gIG9uU2VhcmNoU3VibWl0KGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5fdmFsdWUgPSBlLnRhcmdldFswXS52YWx1ZTtcbiAgICB0aGlzLl9pc1N1Ym1pdCA9IHRydWU7XG4gICAgdGhpcy5vblN1Ym1pdC5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gICAgdGhpcy5fYmx1ckZyb21PbkNsZWFyID0gdHJ1ZTtcbiAgfVxuXG4gIG9uU2VhcmNoYmFyQ2FuY2VsKCkge1xuICAgIHRoaXMuX2ZvY3VzID0gZmFsc2U7XG4gICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgICB0aGlzLm9uQ2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gIH1cblxuICBvblNlYXJjaGJhckNsZWFyKCkge1xuICAgIHRoaXMuX2JsdXJGcm9tT25DbGVhciA9IHRydWU7XG4gICAgdGhpcy5faXNDbGVhckNsaWNraW5nID0gdHJ1ZTtcbiAgICB0aGlzLm9uU2VhcmNoYmFyQ2hhbmdlKCcnKTtcbiAgICB0aGlzLmlucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy5vbkNsZWFyLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gICAgICB0aGlzLl9pc0NsZWFyQ2xpY2tpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2JsdXJGcm9tT25DbGVhciA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXRDbGFzcygpO1xuICAgIH0sIDEwMCk7XG4gICAgdGhpcy5vblNlYXJjaGJhckZvY3VzKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gICAgdGhpcy5fbG9jYWxlUHJvdmlkZXIubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlJCkpLnN1YnNjcmliZShfID0+IHtcbiAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5fbG9jYWxlUHJvdmlkZXIuZ2V0TG9jYWxlU3ViT2JqKCdTZWFyY2hCYXInKTtcbiAgICAgIHRoaXMuX2NhbmNlbFRleHQgPSB0aGlzLl9pc0N1c3RvbVRleHQgPyB0aGlzLl9jYW5jZWxUZXh0IDogdGhpcy5sb2NhbGUuY2FuY2VsVGV4dDtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9zeW50aGV0aWNQaENvbnRhaW5lclJlZiA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgYCR7dGhpcy5wcmVmaXhDbHN9LXN5bnRoZXRpYy1waC1jb250YWluZXJgXG4gICAgKVswXTtcbiAgICB0aGlzLl9zeW50aGV0aWNQaFJlZiA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGAke3RoaXMucHJlZml4Q2xzfS1zeW50aGV0aWMtcGhgKVswXTtcbiAgICB0aGlzLl9yaWdodEJ0blJlZiA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjYW5jZWwnKVswXTtcbiAgICB0aGlzLl9pbnB1dENvbnRhaW5lclJlZiA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGAke3RoaXMucHJlZml4Q2xzfWApWzBdO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIHRoaXMuc2V0U3R5bGUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZWFyY2hCYXIgfSBmcm9tICcuL3NlYXJjaC1iYXIuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQE5nTW9kdWxlKHtcbiAgZXhwb3J0czogW1NlYXJjaEJhcl0sXG4gIGRlY2xhcmF0aW9uczogW1NlYXJjaEJhcl0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBTZWFyY2hCYXJNb2R1bGUge31cbiIsImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1N0ZXBwZXIgLCBuem0tc3RlcHBlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwcGVyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTdGVwcGVyIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tc3RlcHBlcic7XG4gIHVwRGlzYWJsZUNsczogb2JqZWN0O1xuICBkb3duRGlzYWJsZUNsczogb2JqZWN0O1xuICBzdGVwcGVyQ2xzOiBvYmplY3Q7XG5cbiAgcHJpdmF0ZSBfbWF4OiBudW1iZXIgPSBJbmZpbml0eTtcbiAgcHJpdmF0ZSBfbWluOiBudW1iZXIgPSAtSW5maW5pdHk7XG4gIHByaXZhdGUgX3ZhbHVlOiBudW1iZXI7XG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlciA9IDE7XG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZTogbnVtYmVyO1xuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9yZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zaG93TnVtYmVyOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3VwRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfZG93bkRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzVXBDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9pc0Rvd25DbGljazogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBtYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG4gIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBtaW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG4gIHNldCBtaW4odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbiA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodjogbnVtYmVyKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2O1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBzdGVwKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3N0ZXA7XG4gIH1cbiAgc2V0IHN0ZXAodmFsdWUpIHtcbiAgICB0aGlzLl9zdGVwID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRlZmF1bHRWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fZGVmYXVsdFZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fZG93bkRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3VwRGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmNsc1N0cERpc2FibGVkID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkT25seTtcbiAgfVxuICBzZXQgcmVhZE9ubHkodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9yZWFkT25seSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzaG93TnVtYmVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd051bWJlciA9IHZhbHVlO1xuICAgIHRoaXMuY2xzU2hvd051bSA9IHZhbHVlO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tc3RlcHBlcicpXG4gIGNsc1N0ZXBwZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXN0ZXBwZXItZGlzYWJsZWQnKVxuICBjbHNTdHBEaXNhYmxlZDogYm9vbGVhbiA9IHRoaXMuX2Rpc2FibGVkO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNob3dOdW1iZXInKVxuICBjbHNTaG93TnVtOiBib29sZWFuID0gdGhpcy5fc2hvd051bWJlcjtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgb25JbmNyZWFzZSgpIHtcbiAgICBpZiAoIXRoaXMuX3VwRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fdmFsdWUgKyB0aGlzLl9zdGVwO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIGlmICh0aGlzLl92YWx1ZSArIHRoaXMuX3N0ZXAgPiB0aGlzLl9tYXgpIHtcbiAgICAgICAgdGhpcy5fdXBEaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fdmFsdWUgLSB0aGlzLl9zdGVwID49IHRoaXMuX21pbikge1xuICAgICAgICB0aGlzLl9kb3duRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lzVXBDbGljayA9IHRydWU7XG4gICAgICB0aGlzLnNldENscygpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2lzVXBDbGljayA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldENscygpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICBvbkRlY3JlYXNlKCkge1xuICAgIGlmICghdGhpcy5fZG93bkRpc2FibGVkKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX3ZhbHVlIC0gdGhpcy5fc3RlcDtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgICBpZiAodGhpcy5fdmFsdWUgLSB0aGlzLl9zdGVwIDwgdGhpcy5fbWluKSB7XG4gICAgICAgIHRoaXMuX2Rvd25EaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fdmFsdWUgKyB0aGlzLl9zdGVwIDw9IHRoaXMuX21heCkge1xuICAgICAgICB0aGlzLl91cERpc2FibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLl9pc0Rvd25DbGljayA9IHRydWU7XG4gICAgICB0aGlzLnNldENscygpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2lzRG93bkNsaWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIGlucHV0Q2hhbmdlKGV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZSA/IHBhcnNlSW50KHZhbHVlLCBudWxsKSA6IDA7XG4gICAgaWYgKHZhbHVlIDwgdGhpcy5fbWluKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX21pbjtcbiAgICB9XG4gICAgaWYgKHZhbHVlID4gdGhpcy5fbWF4KSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX21heDtcbiAgICB9XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgfVxuXG4gIHNldENscygpIHtcbiAgICB0aGlzLnVwRGlzYWJsZUNscyA9IHtcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30taGFuZGxlci11cC1kaXNhYmxlZGBdOiB0aGlzLl91cERpc2FibGVkLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1oYW5kbGVyLWFjdGl2ZWBdOiB0aGlzLl9pc1VwQ2xpY2tcbiAgICB9O1xuICAgIHRoaXMuZG93bkRpc2FibGVDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWhhbmRsZXItZG93bi1kaXNhYmxlZGBdOiB0aGlzLl9kb3duRGlzYWJsZWQsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWhhbmRsZXItYWN0aXZlYF06IHRoaXMuX2lzRG93bkNsaWNrXG4gICAgfTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmICh0aGlzLl92YWx1ZSArIHRoaXMuX3N0ZXAgPiB0aGlzLl9tYXgpIHtcbiAgICAgIHRoaXMuX3VwRGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdmFsdWUgLSB0aGlzLl9zdGVwIDwgdGhpcy5fbWluKSB7XG4gICAgICB0aGlzLl9kb3duRGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnNldENscygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RlcHBlciB9IGZyb20gJy4vc3RlcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSWNvbk1vZHVsZSB9IGZyb20gJy4uL2ljb24vaWNvbi5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoe1xuICBleHBvcnRzOiBbU3RlcHBlcl0sXG4gIGRlY2xhcmF0aW9uczogW1N0ZXBwZXJdLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgSWNvbk1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcHBlck1vZHVsZSB7fVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBFbGVtZW50UmVmLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1N0ZXAsIG56bS1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFN0ZXApLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByZWZpeENscyA9ICdhbS1zdGVwcyc7XG4gIHN0ZXBJdGVtQ2xzID0ge307XG4gIGljb25DbHM6IG9iamVjdDtcbiAgdGFpbENvbnRlbnQ6IHN0cmluZztcbiAgc3RlcE51bWJlcjogbnVtYmVyO1xuICBpc0ljb25TdHJpbmc6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgX3N0YXR1czogU3RhdHVzRW51bTtcbiAgcHJpdmF0ZSBfdGl0bGU6IHN0cmluZztcbiAgcHJpdmF0ZSBfZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfaWNvbjogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcblxuICBASW5wdXQoKVxuICBnZXQgc3RhdHVzKCk6IFN0YXR1c0VudW0ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XG4gIH1cbiAgc2V0IHN0YXR1cyh2YWx1ZTogU3RhdHVzRW51bSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fc3RhdHVzID0gdmFsdWU7XG4gICAgICB0aGlzLnNldENsYXNzKCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgfVxuICBzZXQgdGl0bGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3RpdGxlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uO1xuICB9XG4gIHNldCBkZXNjcmlwdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgaWNvbigpOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5faWNvbjtcbiAgfVxuICBzZXQgaWNvbih2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5pc0ljb25TdHJpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ljb24gPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgICB9XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXN0ZXBzLWl0ZW0nKVxuICBjbHNTdGVwSXRlbTogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgc2V0Q2xhc3MoKSB7XG4gICAgdGhpcy5pY29uQ2xzID0ge1xuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1pY29uYF06IHRydWVcbiAgICB9O1xuICAgIHRoaXMuc3RlcEl0ZW1DbHMgPSBPYmplY3QuYXNzaWduKHRoaXMuc3RlcEl0ZW1DbHMsXG4gICAgICB7XG4gICAgICAgIFtgJHt0aGlzLnByZWZpeENsc30taXRlbS0ke3RoaXMuc3RhdHVzfWBdOiB0cnVlLFxuICAgICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWl0ZW0tY3VzdG9tYF06IHRoaXMuaWNvblxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgfVxufVxuXG5leHBvcnQgZW51bSBTdGF0dXNFbnVtIHtcbiAgV0FJVCA9ICd3YWl0JyxcbiAgUFJPQ0VTUyA9ICdwcm9jZXNzJyxcbiAgRklOSVNIID0gJ2ZpbmlzaCcsXG4gIEVSUk9SID0gJ2Vycm9yJ1xufVxuZXhwb3J0IGVudW0gRGlyZWN0aW9uRW51bSB7XG4gIFZFUlRJQ0FMID0gJ3ZlcnRpY2FsJyxcbiAgSE9SSVpPTlRBTCA9ICdob3Jpem9udGFsJ1xufVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIElucHV0LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFF1ZXJ5TGlzdCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgSG9zdEJpbmRpbmcsXG4gIFJlbmRlcmVyMixcbiAgRWxlbWVudFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0YXR1c0VudW0sIERpcmVjdGlvbkVudW0gfSBmcm9tICcuL3N0ZXAvc3RlcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3RlcCB9IGZyb20gJy4vc3RlcC9zdGVwLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1N0ZXBzLG56bS1zdGVwcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwcy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgU3RlcHMgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1zdGVwcyc7XG5cbiAgcHJpdmF0ZSBfY3VycmVudDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfc2l6ZTogc3RyaW5nO1xuICBwcml2YXRlIF9zdGF0dXM6IFN0YXR1c0VudW0gPSBTdGF0dXNFbnVtLlBST0NFU1M7XG4gIHByaXZhdGUgX2RpcmVjdGlvbjogRGlyZWN0aW9uRW51bSA9IERpcmVjdGlvbkVudW0uVkVSVElDQUw7XG4gIHByaXZhdGUgX3N0ZXBzQ2xzOiBvYmplY3Q7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTdGVwKVxuICBzdGVwSXRlbXM6IFF1ZXJ5TGlzdDxTdGVwPjtcblxuICBASW5wdXQoKVxuICBzZXQgY3VycmVudCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA+PSAwKSB7XG4gICAgICB0aGlzLl9jdXJyZW50ID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzaXplKHZhbHVlKSB7XG4gICAgdGhpcy5fc2l6ZSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHN0YXR1cyh2YWx1ZTogU3RhdHVzRW51bSkge1xuICAgIHRoaXMuX3N0YXR1cyA9IHZhbHVlO1xuICAgIGlmICh0aGlzLnN0ZXBJdGVtcykge1xuICAgICAgdGhpcy5zZXRTdGVwU3R5bGUoKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRpcmVjdGlvbih2YWx1ZTogRGlyZWN0aW9uRW51bSkge1xuICAgIHRoaXMuX2RpcmVjdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXN0ZXBzJylcbiAgY2xzU3RlcHM6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXN0ZXBzLXNtYWxsJylcbiAgY2xzU3RlcHNTbWFsbDogYm9vbGVhbjtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1zdGVwcy1sYWJlbC12ZXJ0aWNhbCcpXG4gIGNsc1N0ZXBzTGFiZWxWdGw6IGJvb2xlYW47XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tc3RlcHMtdmVydGljYWwnKVxuICBjbHNTdGVwc1Z0bDogYm9vbGVhbjtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1zdGVwcy1ob3Jpem9udGFsJylcbiAgY2xzU3RlcHNIenRsOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VsZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBfcmVuZGVyOiBSZW5kZXJlcjIpIHt9XG5cbiAgc2V0U3RlcFN0eWxlKCkge1xuICAgIGNvbnN0IGl0ZW1Db3VudCA9IHRoaXMuc3RlcEl0ZW1zLmxlbmd0aDtcbiAgICBjb25zdCBpdGVtQXJyID0gdGhpcy5zdGVwSXRlbXNbJ19yZXN1bHRzJ107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGl0ZW1Db3VudDsgaW5kZXgrKykge1xuICAgICAgY29uc3Qgc3RlcCA9IGl0ZW1BcnJbaW5kZXhdO1xuICAgICAgc3RlcC5zdGVwTnVtYmVyID0gaW5kZXggKyAxO1xuICAgICAgaWYgKGluZGV4IDwgaXRlbUNvdW50IC0gMSAmJiBpdGVtQXJyW2luZGV4ICsgMV0uc3RhdHVzID09PSBTdGF0dXNFbnVtLkVSUk9SKSB7XG4gICAgICAgIHN0ZXAuc3RlcEl0ZW1DbHMgPSBzdGVwLnN0ZXBJdGVtQ2xzXG4gICAgICAgICAgPyBPYmplY3QuYXNzaWduKHN0ZXAuc3RlcEl0ZW1DbHMsIHsgJ2Vycm9yLXRhaWwnOiB0cnVlIH0pXG4gICAgICAgICAgOiB7ICdlcnJvci10YWlsJzogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgbGV0IGljb24gPSBzdGVwLmljb247XG4gICAgICBpZiAoIXN0ZXAuc3RhdHVzKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy5fY3VycmVudCkge1xuICAgICAgICAgIHN0ZXAuc3RhdHVzID0gdGhpcy5fc3RhdHVzO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4IDwgdGhpcy5fY3VycmVudCkge1xuICAgICAgICAgIHN0ZXAuc3RhdHVzID0gU3RhdHVzRW51bS5GSU5JU0g7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RlcC5zdGF0dXMgPSBTdGF0dXNFbnVtLldBSVQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaWNvbikge1xuICAgICAgICBpZiAoaW5kZXggPCB0aGlzLl9jdXJyZW50KSB7XG4gICAgICAgICAgaWNvbiA9ICdjaGVjay1jaXJjbGUtbyc7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPiB0aGlzLl9jdXJyZW50KSB7XG4gICAgICAgICAgaWNvbiA9ICdlbGxpcHNpcyc7XG4gICAgICAgICAgc3RlcC5zdGVwSXRlbUNscyA9IHN0ZXAuc3RlcEl0ZW1DbHNcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihzdGVwLnN0ZXBJdGVtQ2xzLCB7ICdlbGxpcHNpcy1pdGVtJzogdHJ1ZSB9KVxuICAgICAgICAgICAgOiB7ICdlbGxpcHNpcy1pdGVtJzogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICgodGhpcy5fc3RhdHVzID09PSBTdGF0dXNFbnVtLkVSUk9SICYmIGluZGV4ID09PSB0aGlzLl9jdXJyZW50KSB8fCBzdGVwLnN0YXR1cyA9PT0gU3RhdHVzRW51bS5FUlJPUikge1xuICAgICAgICAgIGljb24gPSAnY3Jvc3MtY2lyY2xlLW8nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGVwLmljb24gPSBpY29uO1xuICAgICAgc3RlcC5pY29uU2l6ZSA9IHRoaXMuX3NpemUgPT09ICdzbWFsbCcgPyAodGhpcy5fc3RhdHVzID09PSBTdGF0dXNFbnVtLldBSVQgPyAneHhzJyA6ICd4cycpIDogJ21kJztcbiAgICAgIHN0ZXAuc2V0Q2xhc3MoKTtcbiAgICB9XG4gIH1cblxuICBzZXRDbHMoKSB7XG4gICAgaWYgKHRoaXMuX2RpcmVjdGlvbiA9PT0gRGlyZWN0aW9uRW51bS5IT1JJWk9OVEFMKSB7XG4gICAgICB0aGlzLmNsc1N0ZXBzTGFiZWxWdGwgPSB0cnVlO1xuICAgICAgdGhpcy5jbHNTdGVwc0h6dGwgPSB0cnVlO1xuICAgICAgdGhpcy5jbHNTdGVwc1Z0bCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fZGlyZWN0aW9uID09PSBEaXJlY3Rpb25FbnVtLlZFUlRJQ0FMKSB7XG4gICAgICB0aGlzLmNsc1N0ZXBzVnRsID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2xzU3RlcHNIenRsID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zaXplID09PSAnc21hbGwnKSB7XG4gICAgICB0aGlzLmNsc1N0ZXBzU21hbGwgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsc1N0ZXBzU21hbGwgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldENscygpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGVwU3R5bGUoKTtcbiAgICB9LCAwKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0ZXBzIH0gZnJvbSAnLi9zdGVwcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSWNvbk1vZHVsZSB9IGZyb20gJy4uL2ljb24vaWNvbi5tb2R1bGUnO1xuaW1wb3J0IHsgU3RlcCB9IGZyb20gJy4vc3RlcC9zdGVwLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGV4cG9ydHM6IFtTdGVwcywgU3RlcF0sXG4gIGRlY2xhcmF0aW9uczogW1N0ZXBzLCBTdGVwXSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIEljb25Nb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBzTW9kdWxlIHt9XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdDYXJvdXNlbFNsaWRlLCBuem0tY2Fyb3VzZWwtc2xpZGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2Fyb3VzZWwtc2xpZGUuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIENhcm91c2VsU2xpZGVDb21wb25lbnQge1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmNhcm91c2VsLWNvbnRhaW5lcicpXG4gIGNvbnRhaW5lciA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnc3R5bGUud2lkdGgucHgnKVxuICB3aWR0aDtcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5oZWlnaHQnKVxuICBoZWlnaHQgPSAnYXV0byc7XG4gIEBIb3N0QmluZGluZygnc3R5bGUubGVmdC5weCcpXG4gIGxlZnQ7XG4gIEBIb3N0QmluZGluZygnc3R5bGUudG9wLnB4JylcbiAgdG9wO1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLm1hcmdpbicpXG4gIG1hcmdpbjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBnZXRFdmVudFRhcmdldChldmVudCkge1xuICAgIGlmIChldmVudC50eXBlID09PSAnbW91c2Vkb3duJyB8fCBldmVudC50eXBlID09PSAnbW91c2Vtb3ZlJyB8fCBldmVudC50eXBlID09PSAnbW91c2V1cCcgfHwgZXZlbnQudHlwZSA9PT0gJ21vdXNlbGVhdmUnKSB7XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChldmVudCAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSkge1xuICAgICAgICByZXR1cm4gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEhvc3RMaXN0ZW5lcixcbiAgUXVlcnlMaXN0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uRGVzdHJveSxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDYXJvdXNlbFNsaWRlQ29tcG9uZW50IH0gZnJvbSAnLi9jYXJvdXNlbC1zbGlkZS9jYXJvdXNlbC1zbGlkZS5jb21wb25lbnQnO1xuaW1wb3J0ICogYXMgdG91Y2hFdmVudCBmcm9tICcuLi9jb3JlL3V0aWwvdG91Y2gtZXZlbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdDYXJvdXNlbCwgbnptLWNhcm91c2VsJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgdGVtcGxhdGVVcmw6ICcuL2Nhcm91c2VsLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHNsaWRlSGVpZ2h0OiBudW1iZXI7XG4gIHRvdWNoT2JqZWN0O1xuICBzdHlsZSA9IHtcbiAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICB3aWR0aDogJzEwMCUnLFxuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDBweCwgMHB4LCAwcHgpJyxcbiAgICBtYXJnaW46ICcnXG4gIH07XG5cbiAgcHJpdmF0ZSBfdGltZXI6IGFueTtcbiAgcHJpdmF0ZSBfbm9kZUFycjogQXJyYXk8YW55PiA9IFtdO1xuICBwcml2YXRlIF9sYXN0SW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2lzTW91c2VEb3duOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3JhdGlvbldpZHRoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9jdXJyZW50U2xpZGVXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfY3VycmVudFNsaWRlSGVpZ2h0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF90cmFuc2l0aW9uOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfc3BhY2VXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcblxuICBAQ29udGVudENoaWxkcmVuKENhcm91c2VsU2xpZGVDb21wb25lbnQpXG4gIGl0ZW1zOiBRdWVyeUxpc3Q8Q2Fyb3VzZWxTbGlkZUNvbXBvbmVudD47XG5cbiAgQElucHV0KClcbiAgc3BlZWQ6IG51bWJlciA9IDUwMDtcbiAgQElucHV0KClcbiAgc2VsZWN0ZWRJbmRleDogbnVtYmVyID0gMDtcbiAgQElucHV0KClcbiAgZG90czogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGF1dG9wbGF5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGF1dG9wbGF5SW50ZXJ2YWw6IGFueSA9IDMwMDA7XG4gIEBJbnB1dCgpXG4gIGluZmluaXRlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGRvdFN0eWxlOiBvYmplY3QgPSB7fTtcbiAgQElucHV0KClcbiAgZG90QWN0aXZlU3R5bGU6IG9iamVjdCA9IHt9O1xuICBASW5wdXQoKVxuICBmcmFtZU92ZXJmbG93OiBzdHJpbmcgPSAnaGlkZGVuJztcbiAgQElucHV0KClcbiAgY2VsbFNwYWNpbmc6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpXG4gIHNsaWRlV2lkdGg6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpXG4gIHN3aXBlU3BlZWQ6IG51bWJlciA9IDEyO1xuICBASW5wdXQoKVxuICBkcmFnZ2luZzogYm9vbGVhbiA9IHRydWU7XG4gIEBPdXRwdXQoKVxuICBhZnRlckNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKVxuICBiZWZvcmVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tY2Fyb3VzZWwnKVxuICBjYXJvdXNlbFdyYXBwZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmNhcm91c2VsJylcbiAgY2Fyb3VzZWx3cmFwOiBib29sZWFuID0gdHJ1ZTtcblxuICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgcGFuc3RhcnQoZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdG9wVGltZXIoKTtcbiAgICB0aGlzLl9pc01vdXNlRG93biA9IHRydWU7XG4gICAgdGhpcy50b3VjaE9iamVjdCA9IHtcbiAgICAgIHN0YXJ0WDogdG91Y2hFdmVudC5nZXRFdmVudFRhcmdldChldmVudCkucGFnZVgsXG4gICAgICBzdGFydFk6IHRvdWNoRXZlbnQuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpLnBhZ2VZLFxuICAgICAgZGlyZWN0aW9uOiB0aGlzLnRvdWNoT2JqZWN0LmRpcmVjdGlvblxuICAgIH07XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtb3VzZW1vdmUnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaG1vdmUnLCBbJyRldmVudCddKVxuICBwYW5tb3ZlKGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nICYmICF0aGlzLl9pc01vdXNlRG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGRpcmVjdGlvbiB9ID0gdGhpcy5zd2lwZURpcmVjdGlvbihcbiAgICAgIHRoaXMudG91Y2hPYmplY3Quc3RhcnRYLFxuICAgICAgdG91Y2hFdmVudC5nZXRFdmVudFRhcmdldChldmVudCkucGFnZVgsXG4gICAgICB0aGlzLnRvdWNoT2JqZWN0LnN0YXJ0WSxcbiAgICAgIHRvdWNoRXZlbnQuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpLnBhZ2VZXG4gICAgKTtcblxuICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy52ZXJ0aWNhbFxuICAgICAgPyBNYXRoLmFicyh0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KS5wYWdlWSAtIHRoaXMudG91Y2hPYmplY3Quc3RhcnRZKVxuICAgICAgOiBNYXRoLmFicyh0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KS5wYWdlWCAtIHRoaXMudG91Y2hPYmplY3Quc3RhcnRYKTtcbiAgICBjb25zdCBvZmZzZXQgPSAtdGhpcy50b3VjaE9iamVjdC5kaXJlY3Rpb24gKiBsZW5ndGggLSB0aGlzLnNlbGVjdGVkSW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aDtcbiAgICB0aGlzLnRvdWNoT2JqZWN0ID0ge1xuICAgICAgc3RhcnRYOiB0aGlzLnRvdWNoT2JqZWN0LnN0YXJ0WCxcbiAgICAgIHN0YXJ0WTogdGhpcy50b3VjaE9iamVjdC5zdGFydFksXG4gICAgICBlbmRYOiB0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KS5wYWdlWCxcbiAgICAgIGVuZFk6IHRvdWNoRXZlbnQuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpLnBhZ2VZLFxuICAgICAgbGVuZ3RoLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgb2Zmc2V0XG4gICAgfTtcbiAgICBpZiAoZGlyZWN0aW9uICE9PSAwKSB7XG4gICAgICB0aGlzLnNldFNsaWRlU3R5bGVzKHRoaXMuc2VsZWN0ZWRJbmRleCwgdGhpcy50b3VjaE9iamVjdC5kaXJlY3Rpb24pO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0TGlzdFN0eWxlcyhvZmZzZXQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNldXAnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaGVuZCcsIFsnJGV2ZW50J10pXG4gIHBhbmVuZChldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghdGhpcy5kcmFnZ2luZyAmJiAhdGhpcy5faXNNb3VzZURvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICBpZiAodGhpcy50b3VjaE9iamVjdC5sZW5ndGggPiB0aGlzLnN3aXBlU3BlZWQpIHtcbiAgICAgIHRoaXMuY2Fyb3VzZWwodGhpcy50b3VjaE9iamVjdC5kaXJlY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldExpc3RTdHlsZXModGhpcy50b3VjaE9iamVjdC5kaXJlY3Rpb24gKiB0aGlzLnRvdWNoT2JqZWN0Lmxlbmd0aCArIHRoaXMudG91Y2hPYmplY3Qub2Zmc2V0KTtcbiAgICAgIHRoaXMuc3R5bGVbJ3RyYW5zaXRpb24nXSA9IHRoaXMuX3RyYW5zaXRpb247XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgfSwgdGhpcy5zcGVlZCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIFsnJGV2ZW50J10pXG4gIGNhbmNlbCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3RhcnRUaW1lcigpO1xuICAgIH0sIHRoaXMuc3BlZWQpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxlOiBFbGVtZW50UmVmKSB7fVxuXG4gIGluaXRDYXJvdXNlbFNpemUoKSB7XG4gICAgY29uc3QgbmF0aXZlRWxlbWVudCA9IHRoaXMuX2VsZS5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuc2xpZGVIZWlnaHQgPSBuYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Nhcm91c2Vsc2xpZGUnKS5jbGllbnRIZWlnaHQ7XG4gICAgdGhpcy5fY3VycmVudFNsaWRlSGVpZ2h0ID0gdGhpcy5zbGlkZUhlaWdodCAqIHRoaXMuc2xpZGVXaWR0aDtcbiAgICB0aGlzLl9jdXJyZW50U2xpZGVXaWR0aCA9IG5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgdGhpcy5fcmF0aW9uV2lkdGggPSB0aGlzLnZlcnRpY2FsID8gdGhpcy5fY3VycmVudFNsaWRlV2lkdGggOiB0aGlzLl9jdXJyZW50U2xpZGVXaWR0aCAqIHRoaXMuc2xpZGVXaWR0aDtcbiAgICB0aGlzLl9zcGFjZVdpZHRoID0gKCh0aGlzLnZlcnRpY2FsID8gdGhpcy5zbGlkZUhlaWdodCA6IHRoaXMuX2N1cnJlbnRTbGlkZVdpZHRoKSAtIHRoaXMuX3JhdGlvbldpZHRoKSAvIDI7XG4gIH1cblxuICBjYXJvdXNlbEluaXQoaXRlbXMpIHtcbiAgICB0aGlzLmluZmluaXRlID0gdGhpcy5pbmZpbml0ZSB8fCB0cnVlO1xuICAgIHRoaXMuX25vZGVBcnIgPSBpdGVtc1snX3Jlc3VsdHMnXTtcbiAgICB0aGlzLmRyYWdnaW5nID0gdGhpcy5kcmFnZ2luZyA/IHRoaXMuZHJhZ2dpbmcgOiBmYWxzZTtcbiAgICBpZiAodGhpcy5fbm9kZUFyci5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLl9sYXN0SW5kZXggPSB0aGlzLl9ub2RlQXJyLmxlbmd0aCAtIDE7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fbm9kZUFyci5mb3JFYWNoKCh2LCBpbmRleCkgPT4ge1xuICAgICAgICAgIHYud2lkdGggPSB0aGlzLnZlcnRpY2FsID8gJ2F1dG8nIDogdGhpcy5fcmF0aW9uV2lkdGggLSB0aGlzLmNlbGxTcGFjaW5nO1xuICAgICAgICAgIHYubGVmdCA9IHRoaXMudmVydGljYWwgPyAwIDogaW5kZXggPT09IHRoaXMuX2xhc3RJbmRleCA/IC10aGlzLl9yYXRpb25XaWR0aCA6IGluZGV4ICogdGhpcy5fcmF0aW9uV2lkdGg7XG4gICAgICAgICAgdi50b3AgPSB0aGlzLnZlcnRpY2FsID8gKGluZGV4ID09PSB0aGlzLl9sYXN0SW5kZXggPyAtdGhpcy5fcmF0aW9uV2lkdGggOiBpbmRleCAqIHRoaXMuX3JhdGlvbldpZHRoKSA6IDA7XG4gICAgICAgICAgdi5tYXJnaW4gPSB0aGlzLnZlcnRpY2FsID8gYCR7dGhpcy5jZWxsU3BhY2luZyAvIDJ9cHggYXV0b2AgOiBgYXV0byAke3RoaXMuY2VsbFNwYWNpbmcgLyAyfXB4YDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lcigpO1xuICAgICAgfSwgMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9ub2RlQXJyLmxlbmd0aCA9PT0gMSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX25vZGVBcnIuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgIHYud2lkdGggPSB0aGlzLl9yYXRpb25XaWR0aCAtIHRoaXMuY2VsbFNwYWNpbmc7XG4gICAgICAgICAgdi5sZWZ0ID0gMDtcbiAgICAgICAgICB2LnRvcCA9IDA7XG4gICAgICAgICAgdi5tYXJnaW4gPSBgYXV0byAke3RoaXMuY2VsbFNwYWNpbmcgLyAyfXB4YDtcbiAgICAgICAgfSk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBzdGFydFRpbWVyKCkge1xuICAgIGlmICghdGhpcy5hdXRvcGxheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIHRoaXMuX3RpbWVyID0gdGhpcy5hdXRvcGxheUludGVydmFsXG4gICAgICA/IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy5jYXJvdXNlbCgxKTtcbiAgICAgIH0sIHRoaXMuYXV0b3BsYXlJbnRlcnZhbClcbiAgICAgIDogMDtcbiAgfVxuXG4gIHN0b3BUaW1lcigpIHtcbiAgICBjbGVhckludGVydmFsKHRoaXMuX3RpbWVyKTtcbiAgfVxuXG4gIGNhcm91c2VsKG1vdmVEaXJlY3Rpb24pIHtcbiAgICBpZiAodGhpcy52ZXJ0aWNhbCkge1xuICAgICAgaWYgKG1vdmVEaXJlY3Rpb24gPT09IDEpIHtcbiAgICAgICAgdGhpcy5tb3ZlVXAoKTtcbiAgICAgIH0gZWxzZSBpZiAobW92ZURpcmVjdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5tb3ZlRG93bigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobW92ZURpcmVjdGlvbiA9PT0gMSkge1xuICAgICAgICB0aGlzLm1vdmVMZWZ0KCk7XG4gICAgICB9IGVsc2UgaWYgKG1vdmVEaXJlY3Rpb24gPT09IC0xKSB7XG4gICAgICAgIHRoaXMubW92ZVJpZ2h0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3R5bGVbJ3RyYW5zaXRpb24nXSA9IHRoaXMuX3RyYW5zaXRpb247XG4gIH1cblxuICBtb3ZlVXAoKSB7XG4gICAgdGhpcy5nb3RvQ2Fyb3VzZWwodGhpcy5nZXRBZnRlck5vZGUoZmFsc2UpKTtcbiAgfVxuXG4gIG1vdmVEb3duKCkge1xuICAgIHRoaXMuZ290b0Nhcm91c2VsKHRoaXMuZ2V0QWZ0ZXJOb2RlKHRydWUpKTtcbiAgfVxuXG4gIG1vdmVMZWZ0KCkge1xuICAgIHRoaXMuZ290b0Nhcm91c2VsKHRoaXMuZ2V0QWZ0ZXJOb2RlKGZhbHNlKSk7XG4gIH1cblxuICBtb3ZlUmlnaHQoKSB7XG4gICAgdGhpcy5nb3RvQ2Fyb3VzZWwodGhpcy5nZXRBZnRlck5vZGUodHJ1ZSkpO1xuICB9XG5cbiAgZ2V0QWZ0ZXJOb2RlKHByZSkge1xuICAgIGxldCBuZXh0SW5kZXg7XG4gICAgaWYgKHByZSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA8PSAwKSB7XG4gICAgICAgIHRoaXMuZ2V0TGlzdFN0eWxlcyh0aGlzLl9yYXRpb25XaWR0aCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX25vZGVBcnIuZm9yRWFjaCgodiwgdGVtcEluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAodGVtcEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgIHYubGVmdCA9IHRoaXMudmVydGljYWwgPyAwIDogdGhpcy5fbm9kZUFyci5sZW5ndGggKiB0aGlzLl9yYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgdi50b3AgPSB0aGlzLnZlcnRpY2FsID8gdGhpcy5fbm9kZUFyci5sZW5ndGggKiB0aGlzLl9yYXRpb25XaWR0aCA6IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2LmxlZnQgPSB0aGlzLnZlcnRpY2FsID8gMCA6IHRlbXBJbmRleCAqIHRoaXMuX3JhdGlvbldpZHRoO1xuICAgICAgICAgICAgICB2LnRvcCA9IHRoaXMudmVydGljYWwgPyB0ZW1wSW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aCA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5nZXRMaXN0U3R5bGVzKC10aGlzLl9yYXRpb25XaWR0aCAqICh0aGlzLml0ZW1zLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgfSwgdGhpcy5zcGVlZCk7XG4gICAgICAgIG5leHRJbmRleCA9ICF0aGlzLmluZmluaXRlID8gbnVsbCA6IHRoaXMuX2xhc3RJbmRleDtcbiAgICAgICAgdGhpcy5iZWZvcmVDaGFuZ2UuZW1pdCh7IGZyb206IHRoaXMuc2VsZWN0ZWRJbmRleCwgdG86IG5leHRJbmRleCB9KTtcbiAgICAgICAgcmV0dXJuIG5leHRJbmRleDtcbiAgICAgIH1cbiAgICAgIG5leHRJbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleCAtIDE7XG4gICAgICB0aGlzLmdldExpc3RTdHlsZXMobmV4dEluZGV4ICogdGhpcy5fcmF0aW9uV2lkdGggKiB0aGlzLnRvdWNoT2JqZWN0LmRpcmVjdGlvbik7XG4gICAgICB0aGlzLl9ub2RlQXJyLmZvckVhY2goKHYsIHRlbXBJbmRleCkgPT4ge1xuICAgICAgICBpZiAoMCA9PT0gdGVtcEluZGV4ICYmIG5leHRJbmRleCA9PT0gdGhpcy5fbm9kZUFyci5sZW5ndGggLSAyKSB7XG4gICAgICAgICAgdi5sZWZ0ID0gMDtcbiAgICAgICAgICB2LnRvcCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5iZWZvcmVDaGFuZ2UuZW1pdCh7IGZyb206IHRoaXMuc2VsZWN0ZWRJbmRleCwgdG86IG5leHRJbmRleCB9KTtcbiAgICAgIHJldHVybiBuZXh0SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPj0gdGhpcy5fbGFzdEluZGV4KSB7XG4gICAgICAgIHRoaXMuc2V0U2xpZGVTdHlsZXModGhpcy5zZWxlY3RlZEluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5nZXRMaXN0U3R5bGVzKC0odGhpcy5fbGFzdEluZGV4ICsgMSkgKiB0aGlzLl9yYXRpb25XaWR0aCk7XG4gICAgICAgIG5leHRJbmRleCA9ICF0aGlzLmluZmluaXRlID8gbnVsbCA6IDA7XG4gICAgICAgIHRoaXMuYmVmb3JlQ2hhbmdlLmVtaXQoeyBmcm9tOiB0aGlzLnNlbGVjdGVkSW5kZXgsIHRvOiBuZXh0SW5kZXggfSk7XG4gICAgICAgIHJldHVybiBuZXh0SW5kZXg7XG4gICAgICB9XG4gICAgICBuZXh0SW5kZXggPSB0aGlzLnNlbGVjdGVkSW5kZXggKyAxO1xuICAgICAgdGhpcy5zZXRTbGlkZVN0eWxlcyh0aGlzLnNlbGVjdGVkSW5kZXgsIDEpO1xuICAgICAgdGhpcy5nZXRMaXN0U3R5bGVzKC1uZXh0SW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aCk7XG4gICAgICB0aGlzLmJlZm9yZUNoYW5nZS5lbWl0KHsgZnJvbTogdGhpcy5zZWxlY3RlZEluZGV4LCB0bzogbmV4dEluZGV4IH0pO1xuICAgICAgcmV0dXJuIG5leHRJbmRleDtcbiAgICB9XG4gIH1cblxuICBjYWN1bGF0ZURpcmVjdGlvbkxlZnRDdXJyZW50SW5kZXgoKSB7XG4gICAgY29uc3QgcHJldmlvdXNJbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleDtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSAocHJldmlvdXNJbmRleCArIDEpICUgdGhpcy5pdGVtcy5sZW5ndGg7XG4gIH1cblxuICBjYWN1bGF0ZURpcmVjdGlvblJpZ2h0Q3VycmVudEluZGV4KCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPT09IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gdGhpcy5zZWxlY3RlZEluZGV4O1xuICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IChwcmV2aW91c0luZGV4IC0gMSkgJSB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgfVxuXG4gIGdvdG9DYXJvdXNlbChhZnRlckluZGV4KSB7XG4gICAgaWYgKGFmdGVySW5kZXggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5nZXRDdXJyZW50SW5kZXgoKTtcblxuICAgIGlmIChhZnRlckluZGV4ID09PSAwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fbm9kZUFyci5mb3JFYWNoKCh2LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy5fbm9kZUFyci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB2LmxlZnQgPSB0aGlzLnZlcnRpY2FsID8gMCA6IC10aGlzLl9yYXRpb25XaWR0aDtcbiAgICAgICAgICAgIHYudG9wID0gdGhpcy52ZXJ0aWNhbCA/IC10aGlzLl9yYXRpb25XaWR0aCA6IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHYubGVmdCA9IHRoaXMudmVydGljYWwgPyAwIDogaW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aDtcbiAgICAgICAgICAgIHYudG9wID0gdGhpcy52ZXJ0aWNhbCA/IGluZGV4ICogdGhpcy5fcmF0aW9uV2lkdGggOiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lcigpO1xuICAgICAgICB0aGlzLmdldExpc3RTdHlsZXMoMCk7XG4gICAgICB9LCB0aGlzLnNwZWVkKTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gYWZ0ZXJJbmRleDtcbiAgICB0aGlzLmFmdGVyQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZEluZGV4KTtcbiAgfVxuXG4gIGdldEN1cnJlbnRJbmRleCgpIHtcbiAgICBpZiAodGhpcy50b3VjaE9iamVjdC5kaXJlY3Rpb24gPT09IDEpIHtcbiAgICAgIHRoaXMuY2FjdWxhdGVEaXJlY3Rpb25MZWZ0Q3VycmVudEluZGV4KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FjdWxhdGVEaXJlY3Rpb25SaWdodEN1cnJlbnRJbmRleCgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFNsaWRlU3R5bGVzKGluZGV4LCBkaXJlY3Rpb24sIHhEaXN0OiBudW1iZXIgPSAwKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gMSkge1xuICAgICAgdGhpcy5fbm9kZUFyci5mb3JFYWNoKCh2LCB0ZW1wSW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5fbm9kZUFyci5sZW5ndGggJiYgaW5kZXggLSAxID09PSB0ZW1wSW5kZXgpIHtcbiAgICAgICAgICBpZiAoeERpc3QgPT09IDAgfHwgeERpc3QgPiB0aGlzLl9zcGFjZVdpZHRoKSB7XG4gICAgICAgICAgICB2LmxlZnQgPSB0aGlzLnZlcnRpY2FsID8gMCA6ICh0aGlzLl9ub2RlQXJyLmxlbmd0aCArIHRlbXBJbmRleCkgKiB0aGlzLl9yYXRpb25XaWR0aDtcbiAgICAgICAgICAgIHYudG9wID0gdGhpcy52ZXJ0aWNhbCA/ICh0aGlzLl9ub2RlQXJyLmxlbmd0aCArIHRlbXBJbmRleCkgKiB0aGlzLl9yYXRpb25XaWR0aCA6IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX25vZGVBcnIubGVuZ3RoIC0gMSA9PT0gdGVtcEluZGV4ICYmIGluZGV4ICE9PSAyKSB7XG4gICAgICAgICAgaWYgKHhEaXN0ID09PSAwIHx8IHhEaXN0ID4gdGhpcy5fc3BhY2VXaWR0aCkge1xuICAgICAgICAgICAgdi5sZWZ0ID0gdGhpcy52ZXJ0aWNhbCA/IDAgOiAodGhpcy5fbm9kZUFyci5sZW5ndGggLSAxKSAqIHRoaXMuX3JhdGlvbldpZHRoO1xuICAgICAgICAgICAgdi50b3AgPSB0aGlzLnZlcnRpY2FsID8gKHRoaXMuX25vZGVBcnIubGVuZ3RoIC0gMSkgKiB0aGlzLl9yYXRpb25XaWR0aCA6IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09PSB0aGlzLl9ub2RlQXJyLmxlbmd0aCAtIDEgJiYgdGVtcEluZGV4ID09PSAxICYmIHRoaXMuYXV0b3BsYXkpIHtcbiAgICAgICAgICB2LmxlZnQgPSB0aGlzLnZlcnRpY2FsID8gMCA6ICh0aGlzLl9ub2RlQXJyLmxlbmd0aCArIHRlbXBJbmRleCkgKiB0aGlzLl9yYXRpb25XaWR0aDtcbiAgICAgICAgICB2LnRvcCA9IHRoaXMudmVydGljYWwgPyB0ZW1wSW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aCA6IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuX25vZGVBcnIubGVuZ3RoIC0gMSAmJiB0ZW1wSW5kZXggPT09IDAgJiYgIXRoaXMuYXV0b3BsYXkpIHtcbiAgICAgICAgICB2LmxlZnQgPSB0aGlzLnZlcnRpY2FsID8gMCA6ICh0aGlzLl9ub2RlQXJyLmxlbmd0aCArIHRlbXBJbmRleCkgKiB0aGlzLl9yYXRpb25XaWR0aDtcbiAgICAgICAgICB2LnRvcCA9IHRoaXMudmVydGljYWwgPyB0ZW1wSW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aCA6IDA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAtMSkge1xuICAgICAgdGhpcy5fbm9kZUFyci5mb3JFYWNoKCh2LCB0ZW1wSW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwICYmIHRoaXMuX25vZGVBcnIubGVuZ3RoIC0gMSA9PT0gdGVtcEluZGV4KSB7XG4gICAgICAgICAgdi5sZWZ0ID0gdGhpcy52ZXJ0aWNhbCA/IDAgOiBkaXJlY3Rpb24gKiB0aGlzLl9yYXRpb25XaWR0aDtcbiAgICAgICAgICB2LnRvcCA9IHRoaXMudmVydGljYWwgPyBkaXJlY3Rpb24gKiB0aGlzLl9yYXRpb25XaWR0aCA6IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuX25vZGVBcnIubGVuZ3RoIC0gMiAmJiBpbmRleCArIDEgPT09IHRlbXBJbmRleCkge1xuICAgICAgICAgIHYubGVmdCA9IHRoaXMudmVydGljYWwgPyAwIDogZGlyZWN0aW9uICogdGhpcy5fcmF0aW9uV2lkdGg7XG4gICAgICAgICAgdi50b3AgPSB0aGlzLnZlcnRpY2FsID8gZGlyZWN0aW9uICogdGhpcy5fcmF0aW9uV2lkdGggOiAwO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09PSAxICYmIDAgPT09IHRlbXBJbmRleCkge1xuICAgICAgICAgIHYubGVmdCA9IHRoaXMudmVydGljYWwgPyAwIDogZGlyZWN0aW9uICogdGhpcy5fcmF0aW9uV2lkdGggKiB0ZW1wSW5kZXg7XG4gICAgICAgICAgdi50b3AgPSB0aGlzLnZlcnRpY2FsID8gZGlyZWN0aW9uICogdGhpcy5fcmF0aW9uV2lkdGggOiAwO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID4gMSkge1xuICAgICAgICAgIHYubGVmdCA9IHRoaXMudmVydGljYWwgPyAwIDogdGVtcEluZGV4ICogdGhpcy5fcmF0aW9uV2lkdGg7XG4gICAgICAgICAgdi50b3AgPSB0aGlzLnZlcnRpY2FsID8gdGVtcEluZGV4ICogdGhpcy5fcmF0aW9uV2lkdGggOiAwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRMaXN0U3R5bGVzKG9mZnNldDogbnVtYmVyID0gMCkge1xuICAgIGNvbnN0IHBvc2l0aW9uT2Zmc2V0ID1cbiAgICAgIG9mZnNldCArXG4gICAgICAodGhpcy52ZXJ0aWNhbFxuICAgICAgICA/ICh0aGlzLnNsaWRlSGVpZ2h0IC0gdGhpcy5fY3VycmVudFNsaWRlSGVpZ2h0KSAvIDJcbiAgICAgICAgOiAodGhpcy5fY3VycmVudFNsaWRlV2lkdGggLSB0aGlzLl9yYXRpb25XaWR0aCkgLyAyKSAtXG4gICAgICB0aGlzLmNlbGxTcGFjaW5nO1xuICAgIHRoaXMuc3R5bGUgPSB7XG4gICAgICBoZWlnaHQ6IHRoaXMuX2N1cnJlbnRTbGlkZUhlaWdodCArICdweCcsXG4gICAgICB3aWR0aDogdGhpcy5pdGVtcy5sZW5ndGggKiB0aGlzLl9yYXRpb25XaWR0aCArICdweCcsXG4gICAgICB0cmFuc2Zvcm06IHRoaXMudmVydGljYWxcbiAgICAgICAgPyBgdHJhbnNsYXRlM2QoMHB4LCAke3Bvc2l0aW9uT2Zmc2V0fXB4LCAwcHgpYFxuICAgICAgICA6IGB0cmFuc2xhdGUzZCgke3Bvc2l0aW9uT2Zmc2V0fXB4LCAwcHgsIDBweClgLFxuICAgICAgbWFyZ2luOiB0aGlzLnZlcnRpY2FsID8gYCR7KHRoaXMuY2VsbFNwYWNpbmcgLyAyKSAqIC0xfXB4IDBweGAgOiBgMHB4ICR7KHRoaXMuY2VsbFNwYWNpbmcgLyAyKSAqIC0xfXB4YFxuICAgIH07XG4gIH1cblxuICBzd2lwZURpcmVjdGlvbih4MSwgeDIsIHkxLCB5Mikge1xuICAgIGNvbnN0IHhEaXN0ID0geDEgLSB4MjtcbiAgICBjb25zdCB5RGlzdCA9IHkxIC0geTI7XG5cbiAgICBjb25zdCByID0gTWF0aC5hdGFuMih5RGlzdCwgeERpc3QpO1xuICAgIGxldCBzd2lwZUFuZ2xlID0gTWF0aC5yb3VuZCgociAqIDE4MCkgLyBNYXRoLlBJKTtcbiAgICBpZiAoc3dpcGVBbmdsZSA8IDApIHtcbiAgICAgIHN3aXBlQW5nbGUgPSAzNjAgLSBNYXRoLmFicyhzd2lwZUFuZ2xlKTtcbiAgICB9XG4gICAgaWYgKHN3aXBlQW5nbGUgPD0gNDUgJiYgc3dpcGVBbmdsZSA+PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXJlY3Rpb246IDEsXG4gICAgICAgIHhEaXN0OiB4RGlzdFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHN3aXBlQW5nbGUgPD0gMzYwICYmIHN3aXBlQW5nbGUgPj0gMzE1KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXJlY3Rpb246IDEsXG4gICAgICAgIHhEaXN0OiB4RGlzdFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHN3aXBlQW5nbGUgPj0gMTM1ICYmIHN3aXBlQW5nbGUgPD0gMjI1KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXJlY3Rpb246IC0xLFxuICAgICAgICB4RGlzdDogeERpc3RcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLnZlcnRpY2FsID09PSB0cnVlKSB7XG4gICAgICBpZiAoc3dpcGVBbmdsZSA+PSAzNSArIDMzICYmIHN3aXBlQW5nbGUgPD0gMTM1KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGlyZWN0aW9uOiAxLFxuICAgICAgICAgIHhEaXN0OiB4RGlzdFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXJlY3Rpb246IC0xLFxuICAgICAgICAgIHhEaXN0OiB4RGlzdFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGlyZWN0aW9uOiAwLFxuICAgICAgeERpc3Q6IHhEaXN0XG4gICAgfTtcbiAgfVxuXG4gIGdldCBwYWdlKCkge1xuICAgIHJldHVybiB0aGlzLmRvdHMgPyB0aGlzLnNlbGVjdGVkSW5kZXggOiAwO1xuICB9XG5cbiAgZ2V0IHBhZ2VDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5kb3RzID8gdGhpcy5pdGVtcy5sZW5ndGggOiAwO1xuICB9XG5cbiAgZ2V0IGRvdGluZGljYXRvclN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5kb3RzID8gKHRoaXMuaXRlbXMubGVuZ3RoID4gMSkgOiB0aGlzLmRvdHM7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy50b3VjaE9iamVjdCA9IHsgZGlyZWN0aW9uOiAxIH07XG4gICAgdGhpcy5fdHJhbnNpdGlvbiA9IGB0cmFuc2Zvcm0gJHt0aGlzLnNwZWVkIC8gMTAwMH1zYDtcbiAgICB0aGlzLml0ZW1zLmNoYW5nZXMuc3Vic2NyaWJlKGl0ZW1zID0+IHtcbiAgICAgIHRoaXMuY2Fyb3VzZWxJbml0KGl0ZW1zKTtcbiAgICB9KTtcbiAgICB0aGlzLmluaXRDYXJvdXNlbFNpemUoKTtcbiAgICB0aGlzLmdldExpc3RTdHlsZXMoKTtcbiAgICB0aGlzLmNhcm91c2VsSW5pdCh0aGlzLml0ZW1zKTtcbiAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gdGhpcy5fZWxlLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IG5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignY2Fyb3VzZWxzbGlkZScpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHsgYXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH07XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobXV0YXRpb25zTGlzdCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnNMaXN0KSB7XG4gICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09ICdhdHRyaWJ1dGVzJykge1xuICAgICAgICAgIGlmICh0aGlzLnNsaWRlSGVpZ2h0ICE9PSBuYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Nhcm91c2Vsc2xpZGUnKS5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdENhcm91c2VsU2l6ZSgpO1xuICAgICAgICAgICAgdGhpcy5nZXRMaXN0U3R5bGVzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XG4gICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRhcmdldE5vZGUsIGNvbmZpZyk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLm9ic2VydmVyID0gbnVsbDtcbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiwgSG9zdEJpbmRpbmcgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnRG90SW5kaWNhdG9yLCBuem0tZG90LWluZGljYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kb3RpbmRpY2F0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIERvdEluZGljYXRvckNvbXBvbmVudCB7XG4gIGl0ZW1zOiB7IGFjdGl2ZTogYm9vbGVhbiB9W10gPSBbXTtcblxuICBwcml2YXRlIF9wYWdlID0gMDtcbiAgcHJpdmF0ZSBfcGFnZUNvdW50ID0gMDtcblxuICBASW5wdXQoKVxuICBzZXQgcGFnZShwOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYWdlID0gcDtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHBhZ2VDb3VudChwOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYWdlQ291bnQgPSBwIHx8IDA7XG4gICAgdGhpcy51cGRhdGVJdGVtcygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGRvdFN0eWxlOiBvYmplY3QgPSB7fTtcbiAgQElucHV0KClcbiAgZG90QWN0aXZlU3R5bGU6IG9iamVjdCA9IHt9O1xuICBASW5wdXQoKVxuICBkb3RDb2xvciA9ICd3aGl0ZSc7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kb3QtaW5kaWNhdG9yJylcbiAgZG90SW5kaWNhdG9yOiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIHVwZGF0ZUl0ZW1zKCkge1xuICAgIHRoaXMuaXRlbXMgPSBuZXcgQXJyYXkodGhpcy5fcGFnZUNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3BhZ2VDb3VudDsgaSsrKSB7XG4gICAgICB0aGlzLml0ZW1zW2ldID0geyBhY3RpdmU6IGkgPT0gdGhpcy5fcGFnZSB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0ZWQoKSB7XG4gICAgaWYgKHRoaXMuaXRlbXMubGVuZ3RoICE9IHRoaXMuX3BhZ2VDb3VudCkge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlSXRlbXMoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXRlbXMubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9wYWdlQ291bnQ7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5pdGVtc1t0aGlzLl9wYWdlXS5hY3RpdmUgPSB0cnVlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENhcm91c2VsQ29tcG9uZW50IH0gZnJvbSAnLi9jYXJvdXNlbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2Fyb3VzZWxTbGlkZUNvbXBvbmVudCB9IGZyb20gJy4vY2Fyb3VzZWwtc2xpZGUvY2Fyb3VzZWwtc2xpZGUuY29tcG9uZW50JztcbmltcG9ydCB7IERvdEluZGljYXRvckNvbXBvbmVudCB9IGZyb20gJy4vZG90aW5kaWNhdG9yL2RvdGluZGljYXRvci5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbQ2Fyb3VzZWxDb21wb25lbnQsIENhcm91c2VsU2xpZGVDb21wb25lbnQsIERvdEluZGljYXRvckNvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtDYXJvdXNlbENvbXBvbmVudCwgQ2Fyb3VzZWxTbGlkZUNvbXBvbmVudCwgRG90SW5kaWNhdG9yQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbE1vZHVsZSB7fVxuIiwiaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VDc3NQaXhlbFZhbHVlLCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBGdW5jdGlvblByb3AgfSBmcm9tICcuLi90eXBlcy9jb21tb24td3JhcCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Jvb2xlYW4odmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b051bWJlcjxEPih2YWx1ZTogbnVtYmVyIHwgc3RyaW5nLCBmYWxsYmFjazogRCk6IG51bWJlciB8IEQge1xuICByZXR1cm4gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUsIGZhbGxiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQ3NzUGl4ZWwodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb2VyY2VDc3NQaXhlbFZhbHVlKHZhbHVlKTtcbn1cblxuLy8gR2V0IHRoZSBmdW5jaXRvbi1wcm9wZXJ0eSB0eXBlJ3MgdmFsdWVcbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZUZ1bmN0aW9uUHJvcDxUPihwcm9wOiBGdW5jdGlvblByb3A8VD4sIC4uLmFyZ3M6IGFueVtdKTogVCB7IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6IG5vLWFueVxuICByZXR1cm4gdHlwZW9mIHByb3AgPT09ICdmdW5jdGlvbicgPyBwcm9wKC4uLmFyZ3MpIDogcHJvcDtcbn1cblxuLyoqXG4gKiBJbnB1dCBkZWNvcmF0b3IgdGhhdCBoYW5kbGUgYSBwcm9wIHRvIGRvIGdldC9zZXQgYXV0b21hdGljYWxseSB3aXRoIHRvQm9vbGVhblxuICpcbiAqIFdoeSBub3QgdXNpbmcgQElucHV0Qm9vbGVhbiBhbG9uZSB3aXRob3V0IEBJbnB1dD8gQU9UIG5lZWRzIEBJbnB1dCB0byBiZSB2aXNpYmxlXG4gKlxuICogQGhvd1RvVXNlXG4gKiBgYGBcbiAqIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB2aXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gKlxuICogLy8gQWN0IGFzIGJlbG93OlxuICogLy8gQElucHV0KClcbiAqIC8vIGdldCB2aXNpYmxlKCkgeyByZXR1cm4gdGhpcy5fX3Zpc2liaWxlOyB9XG4gKiAvLyBzZXQgdmlzaWJsZSh2YWx1ZSkgeyB0aGlzLl9fdmlzaWJsZSA9IHZhbHVlOyB9XG4gKiAvLyBfX3Zpc2libGUgPSBmYWxzZTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gSW5wdXRCb29sZWFuKCk6IGFueSB7IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6bm8tYW55XG4gIHJldHVybiBmdW5jdGlvbiBJbnB1dEJvb2xlYW5Qcm9wRGVjb3JhdG9yICh0YXJnZXQ6IG9iamVjdCwgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQWRkIG91ciBvd24gcHJpdmF0ZSBwcm9wXG4gICAgY29uc3QgcHJpdmF0ZVByb3BOYW1lID0gYCQkX18ke25hbWV9YDtcblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBwcml2YXRlUHJvcE5hbWUpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFRoZSBwcm9wIFwiJHtwcml2YXRlUHJvcE5hbWV9XCIgaXMgYWxyZWFkeSBleGlzdCwgaXQgd2lsbCBiZSBvdmVycmlkZWQgYnkgSW5wdXRCb29sZWFuIGRlY29yYXRvci5gKTtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcml2YXRlUHJvcE5hbWUsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBuYW1lLCB7XG4gICAgICBnZXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzWyBwcml2YXRlUHJvcE5hbWUgXTsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1pbnZhbGlkLXRoaXNcbiAgICAgIH0sXG4gICAgICBzZXQodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpc1sgcHJpdmF0ZVByb3BOYW1lIF0gPSB0b0Jvb2xlYW4odmFsdWUpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWludmFsaWQtdGhpc1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gLy8gRG8gcmVzdCB0aGluZ3MgZm9yIGlucHV0IGRlY29yYXRvclxuICAgIC8vIGNvbnN0IGlucHV0RGVjb3JhdG9yID0gSW5wdXQoKTtcbiAgICAvLyBpbnB1dERlY29yYXRvcih0YXJnZXQsIG5hbWUpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBPbkluaXQsXG4gIE9uQ2hhbmdlcyxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgZm9yd2FyZFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvQm9vbGVhbiB9IGZyb20gJy4uL2NvcmUvdXRpbC9jb252ZXJ0JztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuZXhwb3J0IGludGVyZmFjZSBPbkNoYW5nZUV2ZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBjaGVja2VkOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdbQ2hlY2tib3hdLCBbbnptLWNoZWNrYm94XScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGVja2JveC5jb21wb25lbnQuaHRtbCcsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENoZWNrYm94KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIENoZWNrYm94IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tY2hlY2tib3gnO1xuICBjbGFzc01hcDogb2JqZWN0ID0ge1xuICAgIFt0aGlzLnByZWZpeENsc106IHRydWUsXG4gICAgW2Ake3RoaXMucHJlZml4Q2xzfS1jaGVja2VkYF06IHRoaXMuY2hlY2tlZCxcbiAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWRpc2FibGVkYF06IHRoaXMuZGlzYWJsZWRcbiAgfTtcbiAgcHJpdmF0ZSBfY2hlY2tlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9uZ01vZGVsT25DaGFuZ2U6IGFueSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgcHJpdmF0ZSBfbmdNb2RlbE9uVG91Y2hlZDogYW55ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4gIEBJbnB1dCgpXG4gIG5hbWU6IHN0cmluZztcbiAgQElucHV0KClcbiAgdmFsdWU6IHN0cmluZztcbiAgQElucHV0KClcbiAgZ2V0IGNoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoZWNrZWQ7XG4gIH1cbiAgc2V0IGNoZWNrZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICB0aGlzLl9jaGVja2VkID0gdmFsdWU7XG4gICAgICB0aGlzLnVwZGF0ZUNsYXNzTWFwKCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB0b0Jvb2xlYW4odmFsdWUpO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8T25DaGFuZ2VFdmVudD4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWNoZWNrYm94LXdyYXBwZXInKVxuICBjaGVja0JveFdyYXBwZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgb25DbGljayhldmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZSghdGhpcy5fY2hlY2tlZCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHVwZGF0ZVZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKHZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLm5hbWUsIHZhbHVlOiB0aGlzLnZhbHVlLCBjaGVja2VkOiB2YWx1ZSB9KTtcbiAgICB0aGlzLmNoZWNrZWQgPSB2YWx1ZTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAobnVsbCAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChfOiBib29sZWFuKSA9PiB7fSk6IHZvaWQge1xuICAgIHRoaXMuX25nTW9kZWxPbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHt9KTogdm9pZCB7XG4gICAgdGhpcy5fbmdNb2RlbE9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVDbGFzc01hcCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDbGFzc01hcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDbGFzc01hcCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsYXNzTWFwID0ge1xuICAgICAgW3RoaXMucHJlZml4Q2xzXTogdHJ1ZSxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY2hlY2tlZGBdOiB0aGlzLmNoZWNrZWQsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWRpc2FibGVkYF06IHRoaXMuZGlzYWJsZWRcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBPbkNoYW5nZUV2ZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBjaGVja2VkOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdBZ3JlZUl0ZW0sIG56bS1hZ3JlZS1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FncmVlLWl0ZW0uY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEFncmVlSXRlbSB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLWNoZWNrYm94JztcblxuICBASW5wdXQoKVxuICBuYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIHZhbHVlOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIGNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxPbkNoYW5nZUV2ZW50PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tY2hlY2tib3gtYWdyZWUnKVxuICBjaGVja2JveEFncmVlOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgYWdyZWUoKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZShldmVudCkge1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdChldmVudCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25DaGFuZ2VFdmVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgY2hlY2tlZDogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnQ2hlY2tib3hJdGVtLCBuem0tY2hlY2tib3gtaXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGVja2JveC1pdGVtLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBDaGVja2JveEl0ZW0ge1xuICBwcmVmaXhDbHMgPSAnYW0tY2hlY2tib3gnO1xuXG4gIEBJbnB1dCgpXG4gIG5hbWU6IHN0cmluZztcbiAgQElucHV0KClcbiAgdmFsdWU6IHN0cmluZztcbiAgQElucHV0KClcbiAgY2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KClcbiAgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE9uQ2hhbmdlRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBvbkNoZWNrYm94Q2xpY2soZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLm9uQ2xpY2sub2JzZXJ2ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMub25DbGljay5lbWl0KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTGlzdE1vZHVsZSB9IGZyb20gJy4uL2xpc3QvbGlzdC5tb2R1bGUnO1xuaW1wb3J0IHsgQ2hlY2tib3ggfSBmcm9tICcuL2NoZWNrYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBZ3JlZUl0ZW0gfSBmcm9tICcuL2FncmVlLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IENoZWNrYm94SXRlbSB9IGZyb20gJy4vY2hlY2tib3gtaXRlbS5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgTGlzdE1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0NoZWNrYm94LCBDaGVja2JveEl0ZW0sIEFncmVlSXRlbV0sXG4gIGV4cG9ydHM6IFtDaGVja2JveCwgQ2hlY2tib3hJdGVtLCBBZ3JlZUl0ZW1dXG59KVxuZXhwb3J0IGNsYXNzIENoZWNrYm94TW9kdWxlIHt9XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9Cb29sZWFuIH0gZnJvbSAnLi4vY29yZS91dGlsL2NvbnZlcnQnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9uQ2hhbmdlRXZlbnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGNoZWNrZWQ6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1tSYWRpb10sIFtuem0tcmFkaW9dJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JhZGlvLmNvbXBvbmVudC5odG1sJyxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUmFkaW8pLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgUmFkaW8gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1yYWRpbyc7XG4gIGNsYXNzTWFwOiBvYmplY3QgPSB7XG4gICAgW3RoaXMucHJlZml4Q2xzXTogdHJ1ZSxcbiAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWNoZWNrZWRgXTogdGhpcy5jaGVja2VkLFxuICAgIFtgJHt0aGlzLnByZWZpeENsc30tZGlzYWJsZWRgXTogdGhpcy5kaXNhYmxlZFxuICB9O1xuICBwcml2YXRlIF9jaGVja2VkID0gZmFsc2U7XG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX25nTW9kZWxPbkNoYW5nZTogYW55ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuICBwcml2YXRlIF9uZ01vZGVsT25Ub3VjaGVkOiBhbnkgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbiAgQElucHV0KClcbiAgbmFtZTogc3RyaW5nO1xuICBASW5wdXQoKVxuICB2YWx1ZTogc3RyaW5nO1xuICBASW5wdXQoKVxuICBnZXQgY2hlY2tlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2hlY2tlZDtcbiAgfVxuICBzZXQgY2hlY2tlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2NoZWNrZWQgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUNsYXNzTWFwKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHRvQm9vbGVhbih2YWx1ZSk7XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxPbkNoYW5nZUV2ZW50PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tcmFkaW8td3JhcHBlcicpXG4gIHJhZGlvV3JhcHBlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICBvbkNsaWNrKGV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkICYmICF0aGlzLl9jaGVja2VkKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICB1cGRhdGVWYWx1ZShjaGVja1ZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKGNoZWNrVmFsdWUpO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgIGNoZWNrZWQ6IGNoZWNrVmFsdWVcbiAgICB9KTtcbiAgICB0aGlzLmNoZWNrZWQgPSBjaGVja1ZhbHVlO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChudWxsICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5jaGVja2VkID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGJvb2xlYW4pID0+IHt9KTogdm9pZCB7XG4gICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4ge30pOiB2b2lkIHtcbiAgICB0aGlzLl9uZ01vZGVsT25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZUNsYXNzTWFwKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUNsYXNzTWFwKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNsYXNzTWFwKCk6IHZvaWQge1xuICAgIHRoaXMuY2xhc3NNYXAgPSB7XG4gICAgICBbdGhpcy5wcmVmaXhDbHNdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1jaGVja2VkYF06IHRoaXMuY2hlY2tlZCxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tZGlzYWJsZWRgXTogdGhpcy5kaXNhYmxlZFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25DaGFuZ2VFdmVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgY2hlY2tlZDogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnUmFkaW9JdGVtLCBuem0tcmFkaW8taXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yYWRpby1pdGVtLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBSYWRpb0l0ZW0ge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1yYWRpbyc7XG5cbiAgQElucHV0KClcbiAgbmFtZTogc3RyaW5nO1xuICBASW5wdXQoKVxuICB2YWx1ZTogc3RyaW5nO1xuICBASW5wdXQoKVxuICBjaGVja2VkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE9uQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG9uUmFkaW9JdGVtQ2xpY2soZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMuY2hlY2tlZCkge1xuICAgICAgdGhpcy5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICAgIGNoZWNrZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5vbkNsaWNrLm9ic2VydmVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLm9uQ2xpY2suZW1pdChldmVudCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSYWRpbyB9IGZyb20gJy4vcmFkaW8uY29tcG9uZW50JztcbmltcG9ydCB7IExpc3RNb2R1bGUgfSBmcm9tICcuLi9saXN0L2xpc3QubW9kdWxlJztcbmltcG9ydCB7IFJhZGlvSXRlbSB9IGZyb20gJy4vcmFkaW8taXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIExpc3RNb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtSYWRpbywgUmFkaW9JdGVtXSxcbiAgZXhwb3J0czogW1JhZGlvLCBSYWRpb0l0ZW1dXG59KVxuZXhwb3J0IGNsYXNzIFJhZGlvTW9kdWxlIHt9XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uLCBJbnB1dCwgSG9zdEJpbmRpbmcgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmV4cG9ydCB0eXBlIFBvc2l0aW9uVHlwZSA9ICdub3JtYWwnIHwgJ2ZpeGVkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnUHJvZ3Jlc3MsIG56bS1wcm9ncmVzcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9ncmVzcy5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3NDb21wb25lbnQge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1wcm9ncmVzcyc7XG5cbiAgcHJpdmF0ZSBfcGVyY2VudDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfZXhjZWVkYW5jZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHVuZmlsbGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgcG9zaXRpb246IFBvc2l0aW9uVHlwZSA9ICdmaXhlZCc7XG4gIEBJbnB1dCgpXG4gIGJhclN0eWxlOiBvYmplY3QgPSB7fTtcbiAgQElucHV0KClcbiAgZ2V0IHBlcmNlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGVyY2VudDtcbiAgfVxuICBzZXQgcGVyY2VudCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fcGVyY2VudCA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSA+IDEwMCkge1xuICAgICAgdGhpcy5fZXhjZWVkYW5jZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2V4Y2VlZGFuY2UgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2F0dHIubWF4JylcbiAgbWF4OiBudW1iZXIgPSAxMDA7XG4gIEBIb3N0QmluZGluZygnYXR0ci52YWx1ZScpXG4gIGdldCB2YWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBlcmNlbnQ7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1wcm9ncmVzcy1vdXRlcicpXG4gIG91dGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1wcm9ncmVzcy1maXhlZC1vdXRlcicpXG4gIGdldCBmaXhPdXRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gJ2ZpeGVkJyA9PT0gdGhpcy5wb3NpdGlvbjtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXByb2dyZXNzLWhpZGUtb3V0ZXInKVxuICBnZXQgaGlkZU91dGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy51bmZpbGxlZCAmJiAhdGhpcy5fZXhjZWVkYW5jZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXByb2dyZXNzLWV4Y2VlZGFuY2UnKVxuICBnZXQgZXhjZWVkYW5jZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZXhjZWVkYW5jZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge31cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUHJvZ3Jlc3NDb21wb25lbnQgfSBmcm9tICcuL3Byb2dyZXNzLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtQcm9ncmVzc0NvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtQcm9ncmVzc0NvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3NNb2R1bGUge31cbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFjY29yZGlvblNlcnZpY2Uge1xuICBjb21wb25lbnQ7XG4gIGFjY29yZGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBnZXRDb21wb25lbnQoY29tcG9uZW50KSB7XG4gICAgdGhpcy5hY2NvcmRpb24gPSBjb21wb25lbnQuYWNjb3JkaW9uO1xuICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBDaGFuZ2VEZXRlY3RvclJlZiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdFbmNhcHN1bGF0aW9uLCBIb3N0QmluZGluZyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBBY2NvcmRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYWNjb3JkaW9uLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdBY2NvcmRpb25QYW5lbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hY2NvcmRpb24tZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcignc2xpZGUnLCBbXG4gICAgICBzdGF0ZSgndXAnLCBzdHlsZSh7IGhlaWdodDogMCB9KSksXG4gICAgICBzdGF0ZSgnZG93bicsIHN0eWxlKHsgaGVpZ2h0OiAnKicgfSkpLFxuICAgICAgdHJhbnNpdGlvbignZG93biA9PiB1cCcsIFthbmltYXRlKDIwMCwgc3R5bGUoeyBoZWlnaHQ6IDAgfSkpXSksXG4gICAgICB0cmFuc2l0aW9uKCd1cCA9PiBkb3duJywgW1xuICAgICAgICBhbmltYXRlKFxuICAgICAgICAgIDIwMCxcbiAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICBoZWlnaHQ6ICcqJ1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIF0pXG4gICAgXSlcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBY2NvcmRpb25Hcm91cENvbXBvbmVudCB7XG4gIGlzU2hvd0NoaWxkOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBrZXk6IHN0cmluZztcbiAgQElucHV0KClcbiAgaGVhZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIGlzT3BlbmVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKVxuICBvbk9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKVxuICBvbkNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1hY2NvcmRpb24taXRlbScpIHByaXZhdGUgX2FtSXRlbSA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tYWNjb3JkaW9uLWl0ZW0tYWN0aXZlJykgcHJpdmF0ZSBfaXNBY3RpdmUgPSB0aGlzLmlzT3BlbmVkO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFkZG9uJykgcHJpdmF0ZSBfYWRkb24gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2FjY29yZGlvblNlcnZpY2U6IEFjY29yZGlvblNlcnZpY2UsIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgY2hlY2tBbmRUb2dnbGUoKSB7XG4gICAgdGhpcy50b2dnbGUoKTtcbiAgfVxuXG4gIGdldCBzbGlkZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlzT3BlbmVkID8gJ2Rvd24nIDogJ3VwJztcbiAgfVxuXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzU2hvd0NoaWxkID0gdHJ1ZTtcbiAgICBjb25zdCBpc09wZW5lZEJlZm9yZVdlQ2hhbmdlID0gdGhpcy5pc09wZW5lZDtcbiAgICBpZiAodGhpcy5fYWNjb3JkaW9uU2VydmljZS5hY2NvcmRpb24pIHtcbiAgICAgIHRoaXMuX2FjY29yZGlvblNlcnZpY2UuY29tcG9uZW50LmNsb3NlQWxsKCk7XG4gICAgfVxuICAgIHRoaXMuaXNPcGVuZWQgPSAhaXNPcGVuZWRCZWZvcmVXZUNoYW5nZTtcbiAgICBpZiAodGhpcy5pc09wZW5lZCkge1xuICAgICAgdGhpcy5vbk9wZW4uZW1pdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uQ2xvc2UuZW1pdCgpO1xuICAgIH1cbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5pc09wZW5lZCk7XG4gIH1cblxuICBvcGVuT25Jbml0aWFsaXphdGlvbigpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaXNPcGVuZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHNsaWRlQW5pbWF0aW9uRG9lbihldmVudCkge1xuICAgIGlmIChldmVudC5mcm9tU3RhdGUgPT09ICdkb3duJyAmJiBldmVudC50b1N0YXRlID09PSAndXAnKSB7XG4gICAgICB0aGlzLmlzU2hvd0NoaWxkID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb250ZW50Q2hpbGRyZW4sXG4gIENvbXBvbmVudCxcbiAgUXVlcnlMaXN0LFxuICBJbnB1dCxcbiAgZm9yd2FyZFJlZixcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgT25EZXN0cm95LFxuICBIb3N0TGlzdGVuZXIsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWNjb3JkaW9uU2VydmljZSB9IGZyb20gJy4vYWNjb3JkaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWNjb3JkaW9uR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2FjY29yZGlvbi1ncm91cC9hY2NvcmRpb24tZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMvU3Vic2NyaXB0aW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnQWNjb3JkaW9uLCBuem0tYWNjb3JkaW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FjY29yZGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW0FjY29yZGlvblNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIEFjY29yZGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgcHJpdmF0ZSBfb2xkR3JvdXBzOiBBY2NvcmRpb25Hcm91cENvbXBvbmVudFtdO1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBAQ29udGVudENoaWxkcmVuKGZvcndhcmRSZWYoKCkgPT4gQWNjb3JkaW9uR3JvdXBDb21wb25lbnQpKVxuICBncm91cHM6IFF1ZXJ5TGlzdDxBY2NvcmRpb25Hcm91cENvbXBvbmVudD47XG5cbiAgQElucHV0KClcbiAgZXhwYW5kQWxsID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGFjdGl2ZUtleTogQXJyYXk8c3RyaW5nPiB8IHN0cmluZztcbiAgQElucHV0KClcbiAgZGVmYXVsdEFjdGl2ZUtleTogc3RyaW5nO1xuICBASW5wdXQoKVxuICBvcGVuQW5pbWF0aW9uID0ge307XG4gIEBJbnB1dCgpXG4gIGFjY29yZGlvbiA9IGZhbHNlO1xuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWFjY29yZGlvbicpXG4gIGFtQWNjb3JkaW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIGNsaWNrKGV2ZW50KSB7XG4gICAgbGV0IHJlc3VsdDogYW55ID0gW107XG4gICAgdGhpcy5ncm91cHMudG9BcnJheSgpLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgaWYgKGdyb3VwLmlzT3BlbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLmFjY29yZGlvbikge1xuICAgICAgICAgIHJlc3VsdCA9IGdyb3VwLmtleTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQucHVzaChncm91cC5rZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHJlc3VsdCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9hY2NvcmRpb25TZXJ2aWNlOiBBY2NvcmRpb25TZXJ2aWNlKSB7XG4gICAgdGhpcy5fYWNjb3JkaW9uU2VydmljZS5nZXRDb21wb25lbnQodGhpcyk7XG4gIH1cblxuICBjbG9zZUFsbCgpIHtcbiAgICB0aGlzLmdyb3Vwcy50b0FycmF5KCkuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICBncm91cC5pc09wZW5lZCA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgaW5pdCAoKSB7XG4gICAgaWYgKHRoaXMuZXhwYW5kQWxsICYmIHRoaXMuZ3JvdXBzICYmIHRoaXMuZ3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX29sZEdyb3VwcyA9IHRoaXMuZ3JvdXBzLnRvQXJyYXkoKTtcbiAgICAgIHRoaXMuX29sZEdyb3Vwcy5mb3JFYWNoKChncm91cCwgaW5kZXgpID0+IHtcbiAgICAgICAgZ3JvdXAub3Blbk9uSW5pdGlhbGl6YXRpb24oKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gdGhpcy5ncm91cHMuY2hhbmdlcy5zdWJzY3JpYmUoY2hhbmdlID0+IHtcbiAgICAgICAgY29uc3QgbmV3R3JvdXBzID0gdGhpcy5ncm91cHMudG9BcnJheSgpLmZpbHRlcihncm91cCA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX29sZEdyb3Vwcy5pbmRleE9mKGdyb3VwKSA9PT0gLTE7XG4gICAgICAgIH0pO1xuICAgICAgICBuZXdHcm91cHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgZ3JvdXAub3Blbk9uSW5pdGlhbGl6YXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX29sZEdyb3VwcyA9IHRoaXMuZ3JvdXBzLnRvQXJyYXkoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBjdXJyZW50QWN0aXZlS2V5ID0gW107XG4gICAgaWYgKHRoaXMuYWN0aXZlS2V5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5hY3RpdmVLZXkubGVuZ3RoID4gMCAmJiAhdGhpcy5hY2NvcmRpb24gJiYgdGhpcy5ncm91cHMgJiYgdGhpcy5ncm91cHMubGVuZ3RoID4gMCkge1xuICAgICAgY3VycmVudEFjdGl2ZUtleSA9IHRoaXMudG9BcnJheSh0aGlzLmFjdGl2ZUtleSk7XG4gICAgICB0aGlzLmdyb3Vwcy5mb3JFYWNoKChncm91cCwgaW5kZXgpID0+IHtcbiAgICAgICAgY3VycmVudEFjdGl2ZUtleS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgaWYgKGluZGV4ID09PSBwYXJzZUludChrZXksIDApKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgZ3JvdXAuaXNPcGVuZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kZWZhdWx0QWN0aXZlS2V5ICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuZXhwYW5kQWxsICYmICF0aGlzLmFjY29yZGlvbiAmJiB0aGlzLmdyb3VwcyAmJiB0aGlzLmdyb3Vwcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmdyb3Vwcy5mb3JFYWNoKChncm91cCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4ID09PSBwYXJzZUludCh0aGlzLmRlZmF1bHRBY3RpdmVLZXksIDApKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBncm91cC5pc09wZW5lZCA9IHRydWU7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRvQXJyYXkoYWN0aXZlS2V5KSB7XG4gICAgbGV0IGN1cnJlbnRBY3RpdmVLZXkgPSBhY3RpdmVLZXk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGN1cnJlbnRBY3RpdmVLZXkpKSB7XG4gICAgICBjdXJyZW50QWN0aXZlS2V5ID0gY3VycmVudEFjdGl2ZUtleSAhPT0gdW5kZWZpbmVkICYmIGN1cnJlbnRBY3RpdmVLZXkgIT09ICcnID8gW2N1cnJlbnRBY3RpdmVLZXldIDogW107XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50QWN0aXZlS2V5O1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmFjY29yZGlvbikge1xuICAgICAgdGhpcy5fYWNjb3JkaW9uU2VydmljZS5nZXRDb21wb25lbnQodGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuZXhwYW5kQWxsIHx8IGNoYW5nZXMuYWNjb3JkaW9uKSB7XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWNjb3JkaW9uQ29tcG9uZW50IH0gZnJvbSAnLi9hY2NvcmRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IEFjY29yZGlvbkdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi9hY2NvcmRpb24tZ3JvdXAvYWNjb3JkaW9uLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXaGl0ZVNwYWNlTW9kdWxlIH0gZnJvbSAnLi4vd2hpdGUtc3BhY2Uvd2hpdGUtc3BhY2UubW9kdWxlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgV2hpdGVTcGFjZU1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0FjY29yZGlvbkNvbXBvbmVudCwgQWNjb3JkaW9uR3JvdXBDb21wb25lbnRdLFxuICBleHBvcnRzOiBbQWNjb3JkaW9uQ29tcG9uZW50LCBBY2NvcmRpb25Hcm91cENvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQWNjb3JkaW9uTW9kdWxlIHt9XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJY29uSGFuZGxlciB9IGZyb20gJy4uL2NvcmUvdXRpbC9pY29uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnTm90aWNlQmFyLCBuem0tbm90aWNlLWJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub3RpY2UtYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbSWNvbkhhbmRsZXJdXG59KVxuZXhwb3J0IGNsYXNzIE5vdGljZUJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGFjdGlvbkRvbTogYW55O1xuXG4gIGlzU2hvdyA9IGZhbHNlO1xuICBpc1N0b3BTY3JvbGwgPSBmYWxzZTtcbiAgc3R5bGVEb206IGFueTtcbiAgcmF0ZTtcbiAgbWFycXVlZVNjcm9sbCA9ICdzY3JvbGxpbmcnO1xuICBzdHlsZSA9IHt9O1xuICBwcml2YXRlIF9tb2RlO1xuICBwcml2YXRlIF9pY29uO1xuICBwcml2YXRlIF9hY3Rpb247XG4gIHByaXZhdGUgX3RpbWVyID0gbnVsbDtcbiAgcHJpdmF0ZSBfd2lkdGg7XG5cbiAgQElucHV0KClcbiAgc2V0IHN0b3BTY3JvbGxpbmcodmFsdWUpIHtcbiAgICB0aGlzLmlzU3RvcFNjcm9sbCA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5tYXJxdWVlU2Nyb2xsID0gJ3Njcm9sbGluZy1zdG9wJztcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMubWFycXVlZVNjcm9sbCA9ICdzY3JvbGxpbmcnO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBtb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG4gIHNldCBtb2RlKHZhbHVlKSB7XG4gICAgdGhpcy5fbW9kZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBpY29uKCkge1xuICAgIHJldHVybiB0aGlzLl9pY29uO1xuICB9XG4gIHNldCBpY29uKHZhbHVlKSB7XG4gICAgdGhpcy5faWNvbiA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBhY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbjtcbiAgfVxuICBzZXQgYWN0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5fYWN0aW9uID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgbWFycXVlZVByb3BzID0geyBsb29wOiB0cnVlLCBsZWFkaW5nOiA1MDAsIHRyYWlsaW5nOiA4MDAwLCBmcHM6IDIwMCwgc3R5bGU6IHt9IH07XG4gIEBJbnB1dCgpXG4gIG5vdGljZUJhcmNvbnRlbnQgPSAnJztcbiAgQE91dHB1dCgpXG4gIG9uQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ljb25IYW5kbGVyOiBJY29uSGFuZGxlcikge1xuICAgIHRoaXMuX2ljb25IYW5kbGVyLmxvYWQoKTtcbiAgfVxuXG4gIGNsaWNrKCkge1xuICAgIHRoaXMub25DbGljay5lbWl0KHRoaXMuX21vZGUpO1xuICAgIGlmICh0aGlzLl9tb2RlID09PSAnY2xvc2FibGUnKSB7XG4gICAgICB0aGlzLmlzU2hvdyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGRhdGFQcm9jZXNzKCkge1xuICAgIHRoaXMuaXNTaG93ID0gdHJ1ZTtcbiAgICB0aGlzLnN0eWxlID0ge1xuICAgICAgd2lkdGg6ICcyMDAlJ1xuICAgIH07XG4gICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgdGhpcy5fd2lkdGgpIHtcbiAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5tYXJxdWVlUHJvcHMubG9vcCA/ICdpbmZpbml0ZScgOiAxO1xuICAgICAgdGhpcy5zdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6IHRoaXMuX3dpZHRoICogMiArICdweCcsXG4gICAgICAgICdhbmltYXRpb24tZGVsYXknOiBgJHt0aGlzLm1hcnF1ZWVQcm9wcy5sZWFkaW5nfW1zYCxcbiAgICAgICAgJ2FuaW1hdGlvbi1kdXJhdGlvbic6IGAkeygxIC8gdGhpcy5tYXJxdWVlUHJvcHMuZnBzKSAqIDEwMDB9c2AsXG4gICAgICAgICdhbmltYXRpb24taXRlcmF0aW9uLWNvdW50JzogYCR7Y291bnR9YFxuICAgICAgfTtcblxuICAgICAgc2Nyb2xsLmNhbGwodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFycXVlZVNjcm9sbCA9ICdzY3JvbGxpbmctc3RvcCc7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsICgpID0+IHtcbiAgICAgIHRoaXMubWFycXVlZVNjcm9sbCA9ICdzY3JvbGxpbmctc3RvcCc7XG4gICAgfSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsICgpID0+IHtcbiAgICAgIHRoaXMubWFycXVlZVNjcm9sbCA9ICdzY3JvbGxpbmcnO1xuICAgIH0pO1xuICAgIHRoaXMuX3dpZHRoID0gZ2V0UmVjdFdpZHRoKHRoaXMubm90aWNlQmFyY29udGVudCk7XG4gICAgdGhpcy5kYXRhUHJvY2VzcygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNjcm9sbCgpIHtcbiAgbGV0IHN0eWxlRG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGljZV9iYXJfYW5pbWF0aW9uX2NscycpO1xuICBpZiAoc3R5bGVEb20pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgc3R5bGVEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICBzdHlsZURvbS5zZXRBdHRyaWJ1dGUoJ2lkJywgJ25vdGljZV9iYXJfYW5pbWF0aW9uX2NscycpO1xuICBzdHlsZURvbS5pbm5lckhUTUwgPSBgQC13ZWJraXQta2V5ZnJhbWVzIG5vdGljZWJhcm1hcnF1ZWV7IDAlIHsgbGVmdDogMHB4OyB9IDEwMCUgeyBsZWZ0OiAtJHt0aGlzLl93aWR0aH1weDsgfX1gO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN0eWxlRG9tKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVjdFdpZHRoKHRleHQpIHtcbiAgY29uc3QgX2RvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBfZG9tLmlubmVySFRNTCA9IHRleHQ7XG4gIF9kb20uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICBfZG9tLnN0eWxlLmxlZnQgPSAnLTk5OTknO1xuICBfZG9tLnN0eWxlLndoaXRlU3BhY2UgPSAnbm93cmFwJztcbiAgX2RvbS5zdHlsZS5mb250U2l6ZSA9ICcxNHB4JztcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChfZG9tKTtcbiAgY29uc3QgX3cgPSBfZG9tLmNsaWVudFdpZHRoICsgMjA7XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoX2RvbSk7XG4gIHJldHVybiBfdztcbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTm90aWNlQmFyQ29tcG9uZW50IH0gZnJvbSAnLi9ub3RpY2UtYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJY29uTW9kdWxlIH0gZnJvbSAnLi4vaWNvbi9pY29uLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtJY29uTW9kdWxlLCBDb21tb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtOb3RpY2VCYXJDb21wb25lbnRdLFxuICBleHBvcnRzOiBbTm90aWNlQmFyQ29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbXSxcbiAgZW50cnlDb21wb25lbnRzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBOb3RpY2VCYXJNb2R1bGUge31cbiIsImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIElucHV0LCBUZW1wbGF0ZVJlZiwgSG9zdEJpbmRpbmcsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdUb2FzdCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiAnLi90b2FzdC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVG9hc3RDb21wb25lbnQge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS10b2FzdCc7XG4gIGlzQ29udGVudFN0cmluZzogYm9vbGVhbiA9IHRydWU7XG4gIG1hc2tDbGFzc01hcDtcbiAgdHJhbnNpdGlvbk5hbWUgPSAnYW0tZmFkZS1lbnRlciBhbS1mYWRlLWVudGVyLWFjdGl2ZSc7XG5cbiAgcHJpdmF0ZSBfaWNvblR5cGU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9jb250ZW50OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+ID0gJyc7XG5cbiAgQElucHV0KClcbiAgbWFzazogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIGdldCBjb250ZW50KCk6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50O1xuICB9XG4gIHNldCBjb250ZW50KHZhbHVlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcbiAgICAgIHRoaXMuaXNDb250ZW50U3RyaW5nID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNDb250ZW50U3RyaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5fY29udGVudCA9IHZhbHVlO1xuICAgIH0pO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBpY29uVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pY29uVHlwZTtcbiAgfVxuICBzZXQgaWNvblR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuX2ljb25UeXBlID0gdmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRvYXN0JylcbiAgYW1Ub2FzdDogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdG9hc3QtbWFzaycpXG4gIGdldCBhbVRvYXN0TWFzaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXNrO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdG9hc3Qtbm9tYXNrJylcbiAgZ2V0IGFtVG9hc3ROb01hc2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLm1hc2s7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF96b25lOiBOZ1pvbmUpIHt9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRvYXN0Q29tcG9uZW50IH0gZnJvbSAnLi90b2FzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWNvbk1vZHVsZSB9IGZyb20gJy4uL2ljb24vaWNvbi5tb2R1bGUnO1xuaW1wb3J0IHsgV2luZ0JsYW5rTW9kdWxlIH0gZnJvbSAnLi4vd2luZy1ibGFuay93aW5nLWJsYW5rLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEljb25Nb2R1bGUsIFdpbmdCbGFua01vZHVsZV0sXG4gIGV4cG9ydHM6IFtUb2FzdENvbXBvbmVudF0sXG4gIGRlY2xhcmF0aW9uczogW1RvYXN0Q29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBUb2FzdE1vZHVsZSB7fVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNsYXNzIEJhc2VPcHRpb25zIHtcbiAgdmlzaWJsZT86IGJvb2xlYW4gPSBmYWxzZTtcbiAgZm9jdXM/OiBib29sZWFuID0gdHJ1ZTtcbiAgY2xvc2FibGU/OiBib29sZWFuID0gZmFsc2U7XG4gIG1hc2tDbG9zYWJsZT86IGJvb2xlYW4gPSB0cnVlO1xuICBvbkNsb3NlPzogYW55O1xuICB0cmFuc3BhcmVudD86IGJvb2xlYW4gPSBmYWxzZTtcbiAgcG9wdXA/OiBib29sZWFuID0gZmFsc2U7XG4gIGFuaW1hdGlvblR5cGU/OiBzdHJpbmc7XG4gIHRpdGxlPzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgZm9vdGVyPzogQXJyYXk8YW55PjtcbiAgcGxhdGZvcm0/OiBzdHJpbmc7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgd3JhcENsYXNzTmFtZT86IHN0cmluZztcbiAgbWVzc2FnZT86IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gIGFjdGlvbnM/OiBBcnJheTxhbnk+O1xuICBjYWxsYmFja09yQWN0aW9ucz86IEFycmF5PGFueT47XG4gIHR5cGU/OiBzdHJpbmc7XG4gIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcbiAgcGxhY2Vob2xkZXJzPzogQXJyYXk8YW55PjtcbiAgb3BlcmF0aW9uPzogYm9vbGVhbjtcbiAgdHJhbnNpdGlvbk5hbWU/OiBzdHJpbmcgPSAnYW0tem9vbSc7XG4gIG1hc2tUcmFuc2l0aW9uTmFtZT86IHN0cmluZyA9ICdhbS1mYWRlJztcbiAgY2xvc2U6ICgpID0+IHZvaWQ7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNb2RhbE9wdGlvbnMgZXh0ZW5kcyBCYXNlT3B0aW9ucyB7fVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQWxlcnRPcHRpb25zIGV4dGVuZHMgQmFzZU9wdGlvbnMge1xuICAvKipcbiAgICogXHTDpsKPwpDDp8KkwrrDpMK/wqHDpsKBwq9cbiAgICovXG4gIG1lc3NhZ2U/OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8qKlxuICAgKiDDpsKMwonDqcKSwq7Dp8K7woQsIFt7dGV4dCwgb25QcmVzcywgc3R5bGV9XVxuICAgKi9cbiAgYWN0aW9ucz86IEFycmF5PGFueT47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQcm9tcHRPcHRpb25zIGV4dGVuZHMgQmFzZU9wdGlvbnMge1xuICAvKipcbiAgICogXHTDpsKPwpDDp8KkwrrDpMK/wqHDpsKBwq9cbiAgICovXG4gIG1lc3NhZ2U/OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8qKlxuICAgKiDDpsKMwonDqcKSwq7Dp8K7woQgW3t0ZXh0LCBvblByZXNzfV1cbiAgICogw6bCiMKWw6XCm8Kew6jCsMKDw6XCh8K9w6bClcKwIEFycmF5IG9yIEZ1bmN0aW9uXG4gICAqL1xuICBjYWxsYmFja09yQWN0aW9ucz86IEFycmF5PGFueT47XG5cbiAgLyoqXG4gICAqIHByb21wdCDDp8KawoTDpsKgwrfDpcK8wo9cbiAgICogU3RyaW5nIChkZWZhdWx0LCBzZWN1cmUtdGV4dCwgbG9naW4tcGFzc3dvcmQpXG4gICAqL1xuICB0eXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiDDqcK7wpjDqMKuwqTDpcKAwrwoaW5wdXQgw6TCuMK6IHBhc3N3b3JkIMOnwrHCu8Olwp7Ci8OkwrjCjcOmwpTCr8OmwozCgSlcbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcblxuICAvKipcbiAgICogWycnLCAnJ11cbiAgICovXG4gIHBsYWNlaG9sZGVycz86IEFycmF5PGFueT47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25PcHRpb25zIGV4dGVuZHMgQmFzZU9wdGlvbnMge1xuICAvKipcbiAgICogw6bCjMKJw6nCksKuw6fCu8KELCBbe3RleHQsIG9uUHJlc3MsIHN0eWxlfV1cbiAgICovXG4gIGFjdGlvbnM/OiBBcnJheTxhbnk+O1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQWN0aW9uIHtcbiAgdGV4dD86IHN0cmluZztcbiAgb25QcmVzcz86IEZ1bmN0aW9uO1xuICBzdHlsZT86IHt9O1xufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBFdmVudEVtaXR0ZXIsIFZpZXdFbmNhcHN1bGF0aW9uLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nU3dpdGNoLCBOZ1N3aXRjaENhc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTW9kYWxPcHRpb25zIH0gZnJvbSAnLi9tb2RhbC1vcHRpb25zLnByb3ZpZGVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnTW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtOZ1N3aXRjaCwgTmdTd2l0Y2hDYXNlLCBNb2RhbE9wdGlvbnNdXG59KVxuZXhwb3J0IGNsYXNzIE1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgZGVmYXVsdFByb3BzID0ge1xuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIHByZWZpeENsczogJ2FtLW1vZGFsJyxcbiAgICB0cmFuc3BhcmVudDogZmFsc2UsXG4gICAgcG9wdXA6IGZhbHNlLFxuICAgIGFuaW1hdGlvblR5cGU6ICdzbGlkZS1kb3duJyxcbiAgICBhbmltYXRlZDogdHJ1ZSxcbiAgICBzdHlsZToge30sXG4gICAgZm9vdGVyOiBbXSxcbiAgICBjbG9zYWJsZTogZmFsc2UsXG4gICAgbWFza0Nsb3NhYmxlOiBmYWxzZSxcbiAgICBvcGVyYXRpb246IGZhbHNlLFxuICAgIHBsYXRmb3JtOiAnaW9zJyxcbiAgICBjbGFzc05hbWU6ICcnLFxuICAgIHdyYXBDbGFzc05hbWU6ICcnLFxuICAgIG1lc3NhZ2U6ICcnLFxuICAgIGFjdGlvbnM6IFtdLFxuICAgIGNhbGxiYWNrT3JBY3Rpb25zOiBbXSxcbiAgICB0eXBlOiAnJyxcbiAgICBkZWZhdWx0VmFsdWU6ICcnLFxuICAgIHBsYWNlaG9sZGVyczogW11cbiAgfTtcbiAgdmFsdWU6IHN0cmluZyA9ICcnO1xuICBwYXNzd29yZFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgYXV0b0ZvY3VzID0geyBmb2N1czogdHJ1ZSwgZGF0ZTogbmV3IERhdGUoKSB9O1xuICB0cmFuc2l0aW9uTmFtZTogc3RyaW5nID0gJyc7XG4gIG1hc2tUcmFuc2l0aW9uTmFtZTogc3RyaW5nID0gJyc7XG4gIGlzVGl0bGVTdHJpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBpc01lc3NhZ2VTdHJpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICB3cmFwQ2xzID0ge307XG4gIGNscyA9IHt9O1xuICBidG5Hcm91cENsYXNzID0ge307XG4gIGRhdGEgPSB7fTtcblxuICBwcml2YXRlIF90aXRsZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PiA9ICcnO1xuICBwcml2YXRlIF9tZXNzYWdlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+ID0gJyc7XG4gIHByaXZhdGUgX2ZvY3VzOiBib29sZWFuID0gdHJ1ZTtcblxuICBAVmlld0NoaWxkKCdpbnB1dEVsZW1lbnQnKVxuICBpbnB1dEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KClcbiAgZ2V0IHRpdGxlKCk6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgfVxuICBzZXQgdGl0bGUodmFsdWU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikge1xuICAgICAgdGhpcy5pc1RpdGxlU3RyaW5nID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNUaXRsZVN0cmluZyA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX3RpdGxlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHZpc2libGUodmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLmxlYXZlQW5pbWF0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVmYXVsdFByb3BzLnZpc2libGUgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRQcm9wcy5hbmltYXRlZCkge1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0UHJvcHMudHJhbnNwYXJlbnQpIHtcbiAgICAgICAgICB0aGlzLnRyYW5zaXRpb25OYW1lID0gdGhpcy5tYXNrVHJhbnNpdGlvbk5hbWUgPSAnYW0tZmFkZS1lbnRlciBhbS1mYWRlLWVudGVyLWFjdGl2ZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9IHRoaXMubWFza1RyYW5zaXRpb25OYW1lID0gJ2FtLXNsaWRlLXVwLWVudGVyIGFtLXNsaWRlLXVwLWVudGVyLWFjdGl2ZSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFByb3BzLnBvcHVwKSB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRQcm9wcy5hbmltYXRpb25UeXBlID09PSAnc2xpZGUtdXAnXG4gICAgICAgICAgICAgID8gJ2FtLXNsaWRlLXVwLWVudGVyIGFtLXNsaWRlLXVwLWVudGVyLWFjdGl2ZSdcbiAgICAgICAgICAgICAgOiAnYW0tc2xpZGUtZG93bi1lbnRlciBhbS1zbGlkZS1kb3duLWVudGVyLWFjdGl2ZSc7XG4gICAgICAgICAgdGhpcy5tYXNrVHJhbnNpdGlvbk5hbWUgPSAnYW0tZmFkZS1lbnRlciBhbS1mYWRlLWVudGVyLWFjdGl2ZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGNsb3NhYmxlKHZhbHVlKSB7XG4gICAgdGhpcy5kZWZhdWx0UHJvcHMuY2xvc2FibGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWFza0Nsb3NhYmxlKHZhbHVlKSB7XG4gICAgdGhpcy5kZWZhdWx0UHJvcHMubWFza0Nsb3NhYmxlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHBvcHVwKHZhbHVlKSB7XG4gICAgdGhpcy5kZWZhdWx0UHJvcHMucG9wdXAgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGFuaW1hdGlvblR5cGUodmFsdWUpIHtcbiAgICB0aGlzLmRlZmF1bHRQcm9wcy5hbmltYXRpb25UeXBlID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCB0cmFuc3BhcmVudCh2YWx1ZSkge1xuICAgIHRoaXMuZGVmYXVsdFByb3BzLnRyYW5zcGFyZW50ID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBmb290ZXIodmFsdWUpIHtcbiAgICB0aGlzLmRlZmF1bHRQcm9wcy5mb290ZXIgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcGxhdGZvcm0odmFsdWUpIHtcbiAgICB0aGlzLmRlZmF1bHRQcm9wcy5wbGF0Zm9ybSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbWVzc2FnZSgpOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZTtcbiAgfVxuICBzZXQgbWVzc2FnZSh2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICB0aGlzLmlzTWVzc2FnZVN0cmluZyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzTWVzc2FnZVN0cmluZyA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX21lc3NhZ2UgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgY2xhc3NOYW1lKHZhbHVlKSB7XG4gICAgdGhpcy5kZWZhdWx0UHJvcHMuY2xhc3NOYW1lID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCB3cmFwQ2xhc3NOYW1lKHZhbHVlKSB7XG4gICAgdGhpcy5kZWZhdWx0UHJvcHMud3JhcENsYXNzTmFtZSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgYWN0aW9ucyh2YWx1ZSkge1xuICAgIHRoaXMuZGVmYXVsdFByb3BzLmZvb3RlciA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZGVmYXVsdFZhbHVlKHZhbHVlKSB7XG4gICAgdGhpcy5kZWZhdWx0UHJvcHMuZGVmYXVsdFZhbHVlID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogJyc7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHR5cGUodmFsdWUpIHtcbiAgICB0aGlzLmRlZmF1bHRQcm9wcy50eXBlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHBsYWNlaG9sZGVycyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMuZGVmYXVsdFByb3BzLnBsYWNlaG9sZGVycyA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBvcGVyYXRpb24odmFsdWUpIHtcbiAgICB0aGlzLmRlZmF1bHRQcm9wcy5vcGVyYXRpb24gPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGZvY3VzKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl9mb2N1cyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBAT3V0cHV0KClcbiAgb25DbG9zZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfb3B0aW9uOiBNb2RhbE9wdGlvbnMpIHt9XG5cbiAgc2V0Q2xhc3NNYXAoKSB7XG4gICAgdGhpcy53cmFwQ2xzID0ge1xuICAgICAgW3RoaXMuZGVmYXVsdFByb3BzLndyYXBDbGFzc05hbWVdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30td3JhcC1wb3B1cGBdOiB0aGlzLmRlZmF1bHRQcm9wcy5wb3B1cFxuICAgIH07XG5cbiAgICB0aGlzLmNscyA9IHtcbiAgICAgIFt0aGlzLmRlZmF1bHRQcm9wcy5jbGFzc05hbWVdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30tdHJhbnNwYXJlbnRgXTogdGhpcy5kZWZhdWx0UHJvcHMudHJhbnNwYXJlbnQsXG4gICAgICBbYCR7dGhpcy5kZWZhdWx0UHJvcHMucHJlZml4Q2xzfS1wb3B1cGBdOiB0aGlzLmRlZmF1bHRQcm9wcy5wb3B1cCxcbiAgICAgIFtgJHt0aGlzLmRlZmF1bHRQcm9wcy5wcmVmaXhDbHN9LXBvcHVwLSR7dGhpcy5kZWZhdWx0UHJvcHMuYW5pbWF0aW9uVHlwZX1gXTpcbiAgICAgICAgdGhpcy5kZWZhdWx0UHJvcHMucG9wdXAgJiYgdGhpcy5kZWZhdWx0UHJvcHMuYW5pbWF0aW9uVHlwZSxcbiAgICAgIFtgJHt0aGlzLmRlZmF1bHRQcm9wcy5wcmVmaXhDbHN9LWFuZHJvaWRgXTogdGhpcy5kZWZhdWx0UHJvcHMucGxhdGZvcm0gPT09ICdhbmRyb2lkJ1xuICAgIH07XG5cbiAgICB0aGlzLmJ0bkdyb3VwQ2xhc3MgPSB7XG4gICAgICBbYCR7dGhpcy5kZWZhdWx0UHJvcHMucHJlZml4Q2xzfS1idXR0b24tZ3JvdXAtJHtcbiAgICAgICAgdGhpcy5kZWZhdWx0UHJvcHMuZm9vdGVyLmxlbmd0aCA9PT0gMiAmJiAhdGhpcy5kZWZhdWx0UHJvcHMub3BlcmF0aW9uID8gJ2gnIDogJ3YnXG4gICAgICB9YF06IHRydWUsXG4gICAgICBbYCR7dGhpcy5kZWZhdWx0UHJvcHMucHJlZml4Q2xzfS1idXR0b24tZ3JvdXAtJHt0aGlzLmRlZmF1bHRQcm9wcy5vcGVyYXRpb24gPyAnb3BlcmF0aW9uJyA6ICdub3JtYWwnfWBdOiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIGlucHV0Q2hhbmdlKHR5cGUsIHZhbHVlKSB7XG4gICAgdGhpcy5kYXRhW3R5cGVdID0gdmFsdWU7XG4gIH1cblxuICBsZWF2ZUFuaW1hdGlvbigpIHtcbiAgICBpZiAodGhpcy5kZWZhdWx0UHJvcHMuYW5pbWF0ZWQpIHtcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRQcm9wcy50cmFuc3BhcmVudCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25OYW1lID0gdGhpcy5tYXNrVHJhbnNpdGlvbk5hbWUgPSAnYW0tZmFkZS1sZWF2ZSBhbS1mYWRlLWxlYXZlLWFjdGl2ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25OYW1lID0gdGhpcy5tYXNrVHJhbnNpdGlvbk5hbWUgPSAnYW0tc2xpZGUtdXAtbGVhdmUgYW0tc2xpZGUtdXAtbGVhdmUtYWN0aXZlJztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRlZmF1bHRQcm9wcy5wb3B1cCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25OYW1lID1cbiAgICAgICAgICB0aGlzLmRlZmF1bHRQcm9wcy5hbmltYXRpb25UeXBlID09PSAnc2xpZGUtdXAnXG4gICAgICAgICAgICA/ICdhbS1zbGlkZS11cC1sZWF2ZSBhbS1zbGlkZS11cC1sZWF2ZS1hY3RpdmUnXG4gICAgICAgICAgICA6ICdhbS1zbGlkZS1kb3duLWxlYXZlIGFtLXNsaWRlLWRvd24tbGVhdmUtYWN0aXZlJztcbiAgICAgICAgdGhpcy5tYXNrVHJhbnNpdGlvbk5hbWUgPSAnYW0tZmFkZS1sZWF2ZSBhbS1mYWRlLWxlYXZlLWFjdGl2ZSc7XG4gICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kZWZhdWx0UHJvcHMudmlzaWJsZSA9IGZhbHNlO1xuICAgIH0sIDIwMCk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICBpZiAoKCF0aGlzLmRlZmF1bHRQcm9wcy5jbG9zYWJsZSB8fCAhdGhpcy5kZWZhdWx0UHJvcHMubWFza0Nsb3NhYmxlKSAmJiAhdGhpcy5kZWZhdWx0UHJvcHMucG9wdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wdGlvbi5jbG9zZSkge1xuICAgICAgdGhpcy5fb3B0aW9uLmNsb3NlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGVhdmVBbmltYXRpb24oKTtcbiAgICAgIHRoaXMub25DbG9zZS5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBOZ1N3aXRjaCwgTmdTd2l0Y2hDYXNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlzdE1vZHVsZSB9IGZyb20gJy4uL2xpc3QvbGlzdC5tb2R1bGUnO1xuaW1wb3J0IHsgV2luZ0JsYW5rTW9kdWxlIH0gZnJvbSAnLi4vd2luZy1ibGFuay93aW5nLWJsYW5rLm1vZHVsZSc7XG5pbXBvcnQgeyBXaGl0ZVNwYWNlTW9kdWxlIH0gZnJvbSAnLi4vd2hpdGUtc3BhY2Uvd2hpdGUtc3BhY2UubW9kdWxlJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24ubW9kdWxlJztcbmltcG9ydCB7IElucHV0SXRlbU1vZHVsZSB9IGZyb20gJy4uL2lucHV0LWl0ZW0vaW5wdXQtaXRlbS5tb2R1bGUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIExpc3RNb2R1bGUsIFdpbmdCbGFua01vZHVsZSwgV2hpdGVTcGFjZU1vZHVsZSwgQnV0dG9uTW9kdWxlLCBJbnB1dEl0ZW1Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgZXhwb3J0czogW01vZGFsQ29tcG9uZW50XSxcbiAgZGVjbGFyYXRpb25zOiBbTW9kYWxDb21wb25lbnRdLFxuICBwcm92aWRlcnM6IFtOZ1N3aXRjaCwgTmdTd2l0Y2hDYXNlXVxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbE1vZHVsZSB7fVxuIiwiZXhwb3J0IGludGVyZmFjZSBQb3BvdmVyT3B0aW9uc0ludGVyZmFjZSB7XG4gIG1hc2s/OiBib29sZWFuO1xuICB2aXNpYmxlPzogYm9vbGVhbjtcbiAgcGxhY2VtZW50Pzogc3RyaW5nO1xuICBhcHBlbmRUb0JvZHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgUG9wb3Zlck9wdGlvbnMgaW1wbGVtZW50cyBQb3BvdmVyT3B0aW9uc0ludGVyZmFjZSB7XG4gIHNob3dBcnJvdzogYm9vbGVhbiA9IGZhbHNlO1xuICBtYXNrOiBib29sZWFuID0gZmFsc2U7XG4gIHBsYWNlbWVudDogc3RyaW5nID0gJ2JvdHRvbSc7XG4gIGFwcGVuZFRvQm9keTogYm9vbGVhbiA9IGZhbHNlO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBvcG92ZXJPcHRpb25zIH0gZnJvbSAnLi9wb3BvdmVyLW9wdGlvbnMucHJvdmlkZXInO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUG9wb3ZlckNvbXBvbmVudE9wdGlvbnMgZXh0ZW5kcyBQb3BvdmVyT3B0aW9ucyB7XG4gIG9uQWZ0ZXJWaWV3SW5pdDogKCkgPT4gdm9pZDtcbiAgaGlkZVBvcG92ZXI6ICgpID0+IHZvaWQ7XG4gIG92ZXJsYXk6IFRlbXBsYXRlUmVmPGFueT47XG59IiwiaW1wb3J0IHsgQ29tcG9uZW50LCBBZnRlclZpZXdJbml0LCBWaWV3RW5jYXBzdWxhdGlvbiwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBvcG92ZXJDb21wb25lbnRPcHRpb25zIH0gZnJvbSAnLi9wb3BvdmVyLWNvbXBvbmVudC1vcHRpb25zLnByb3ZpZGVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnUG9wb3ZlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wb3BvdmVyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBQb3BvdmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgZGVmYXVsdFByb3BzOiBhbnkgPSB7XG4gICAgcHJlZml4Q2xzOiAnYW0tcG9wb3ZlcidcbiAgfTtcbiAgbWFza0NsczogYW55ID0ge307XG4gIHBvcG92ZXJDbHM6IGFueSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBvcHRpb25zOiBQb3BvdmVyQ29tcG9uZW50T3B0aW9ucykge31cblxuICBzZXRDbGFzc01hcCgpIHtcbiAgICB0aGlzLm1hc2tDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5kZWZhdWx0UHJvcHMucHJlZml4Q2xzfS1tYXNrYF06IHRoaXMub3B0aW9ucy5tYXNrLFxuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30tbWFzay1oaWRkZW5gXTogIXRoaXMub3B0aW9ucy5tYXNrXG4gICAgfTtcbiAgICB0aGlzLnBvcG92ZXJDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5kZWZhdWx0UHJvcHMucHJlZml4Q2xzfWBdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30tcGxhY2VtZW50LSR7dGhpcy5vcHRpb25zLnBsYWNlbWVudH1gXTogdHJ1ZVxuICAgIH07XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9ucy5vbkFmdGVyVmlld0luaXQoKTtcbiAgfVxufVxuIiwiXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsU3R5bGVzIChlbGVtZW50KSB7IHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTsgfVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlKGVsZW1lbnQsIHByb3ApIHsgcmV0dXJuIGdldEFsbFN0eWxlcyhlbGVtZW50KVtwcm9wXTsgfVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RhdGljUG9zaXRpb25lZCAoZWxlbWVudCkge1xuICByZXR1cm4gKGdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpIHx8ICdzdGF0aWMnKSA9PT0gJ3N0YXRpYyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBsZXQgb2Zmc2V0UGFyZW50RWwgPSBlbGVtZW50Lm9mZnNldFBhcmVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIHdoaWxlIChvZmZzZXRQYXJlbnRFbCAmJiBvZmZzZXRQYXJlbnRFbCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGlzU3RhdGljUG9zaXRpb25lZChvZmZzZXRQYXJlbnRFbCkpIHtcbiAgICBvZmZzZXRQYXJlbnRFbCA9IG9mZnNldFBhcmVudEVsLm9mZnNldFBhcmVudDtcbiAgfVxuICByZXR1cm4gb2Zmc2V0UGFyZW50RWwgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2Zmc2V0KGVsZW1lbnQsIHJvdW5kKSB7XG4gIGlmIChyb3VuZCA9PT0gdm9pZCAwKSB7IHJvdW5kID0gdHJ1ZTsgfVxuICBsZXQgZWxCY3IgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBsZXQgdmlld3BvcnRPZmZzZXQgPSB7XG4gICAgdG9wOiB3aW5kb3cucGFnZVlPZmZzZXQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50VG9wLFxuICAgIGxlZnQ6IHdpbmRvdy5wYWdlWE9mZnNldCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRMZWZ0XG4gIH07XG4gIGxldCBlbE9mZnNldCA9IHtcbiAgICBoZWlnaHQ6IGVsQmNyLmhlaWdodCB8fCBlbGVtZW50Lm9mZnNldEhlaWdodCxcbiAgICB3aWR0aDogZWxCY3Iud2lkdGggfHwgZWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICB0b3A6IGVsQmNyLnRvcCArIHZpZXdwb3J0T2Zmc2V0LnRvcCxcbiAgICBib3R0b206IGVsQmNyLmJvdHRvbSArIHZpZXdwb3J0T2Zmc2V0LnRvcCxcbiAgICBsZWZ0OiBlbEJjci5sZWZ0ICsgdmlld3BvcnRPZmZzZXQubGVmdCxcbiAgICByaWdodDogZWxCY3IucmlnaHQgKyB2aWV3cG9ydE9mZnNldC5sZWZ0XG4gIH07XG4gIGlmIChyb3VuZCkge1xuICAgIGVsT2Zmc2V0LmhlaWdodCA9IE1hdGgucm91bmQoZWxPZmZzZXQuaGVpZ2h0KTtcbiAgICBlbE9mZnNldC53aWR0aCA9IE1hdGgucm91bmQoZWxPZmZzZXQud2lkdGgpO1xuICAgIGVsT2Zmc2V0LnRvcCA9IE1hdGgucm91bmQoZWxPZmZzZXQudG9wKTtcbiAgICBlbE9mZnNldC5ib3R0b20gPSBNYXRoLnJvdW5kKGVsT2Zmc2V0LmJvdHRvbSk7XG4gICAgZWxPZmZzZXQubGVmdCA9IE1hdGgucm91bmQoZWxPZmZzZXQubGVmdCk7XG4gICAgZWxPZmZzZXQucmlnaHQgPSBNYXRoLnJvdW5kKGVsT2Zmc2V0LnJpZ2h0KTtcbiAgfVxuICByZXR1cm4gZWxPZmZzZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3NpdGlvbihlbGVtZW50LCByb3VuZCkge1xuICBpZiAocm91bmQgPT09IHZvaWQgMCkgeyByb3VuZCA9IHRydWU7IH1cbiAgbGV0IGVsUG9zaXRpb247XG4gIGxldCBwYXJlbnRPZmZzZXQgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwLCByaWdodDogMCB9O1xuICBpZiAoZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcpIHtcbiAgICBlbFBvc2l0aW9uID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgb2Zmc2V0UGFyZW50RWwgPSBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCk7XG4gICAgZWxQb3NpdGlvbiA9IGdldE9mZnNldChlbGVtZW50LCBmYWxzZSk7XG4gICAgaWYgKG9mZnNldFBhcmVudEVsICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIHBhcmVudE9mZnNldCA9IGdldE9mZnNldChvZmZzZXRQYXJlbnRFbCwgZmFsc2UpO1xuICAgIH1cbiAgICBwYXJlbnRPZmZzZXQudG9wICs9IG9mZnNldFBhcmVudEVsLmNsaWVudFRvcDtcbiAgICBwYXJlbnRPZmZzZXQubGVmdCArPSBvZmZzZXRQYXJlbnRFbC5jbGllbnRMZWZ0O1xuICB9XG4gIGVsUG9zaXRpb24udG9wIC09IHBhcmVudE9mZnNldC50b3A7XG4gIGVsUG9zaXRpb24uYm90dG9tIC09IHBhcmVudE9mZnNldC50b3A7XG4gIGVsUG9zaXRpb24ubGVmdCAtPSBwYXJlbnRPZmZzZXQubGVmdDtcbiAgZWxQb3NpdGlvbi5yaWdodCAtPSBwYXJlbnRPZmZzZXQubGVmdDtcbiAgaWYgKHJvdW5kKSB7XG4gICAgZWxQb3NpdGlvbi50b3AgPSBNYXRoLnJvdW5kKGVsUG9zaXRpb24udG9wKTtcbiAgICBlbFBvc2l0aW9uLmJvdHRvbSA9IE1hdGgucm91bmQoZWxQb3NpdGlvbi5ib3R0b20pO1xuICAgIGVsUG9zaXRpb24ubGVmdCA9IE1hdGgucm91bmQoZWxQb3NpdGlvbi5sZWZ0KTtcbiAgICBlbFBvc2l0aW9uLnJpZ2h0ID0gTWF0aC5yb3VuZChlbFBvc2l0aW9uLnJpZ2h0KTtcbiAgfVxuICByZXR1cm4gZWxQb3NpdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvc2l0aW9uRWxlbWVudHMoaG9zdEVsZW1lbnQsIHRhcmdldEVsZW1lbnQsIHBsYWNlbWVudCwgYXBwZW5kVG9Cb2R5KSB7XG4gIGxldCBob3N0RWxQb3NpdGlvbiA9IGFwcGVuZFRvQm9keSA/IGdldE9mZnNldChob3N0RWxlbWVudCwgZmFsc2UpIDogZ2V0UG9zaXRpb24oaG9zdEVsZW1lbnQsIGZhbHNlKTtcbiAgbGV0IHRhcmdldEVsU3R5bGVzID0gZ2V0QWxsU3R5bGVzKHRhcmdldEVsZW1lbnQpO1xuICBsZXQgdGFyZ2V0RWxCQ1IgPSB0YXJnZXRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBsZXQgcGxhY2VtZW50UHJpbWFyeSA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdIHx8ICd0b3AnO1xuICBsZXQgcGxhY2VtZW50U2Vjb25kYXJ5ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMV0gfHwgJ2NlbnRlcic7XG4gIGxldCB0YXJnZXRFbFBvc2l0aW9uID0ge1xuICAgICdoZWlnaHQnOiB0YXJnZXRFbEJDUi5oZWlnaHQgfHwgdGFyZ2V0RWxlbWVudC5vZmZzZXRIZWlnaHQsXG4gICAgJ3dpZHRoJzogdGFyZ2V0RWxCQ1Iud2lkdGggfHwgdGFyZ2V0RWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICAndG9wJzogMCxcbiAgICAnYm90dG9tJzogdGFyZ2V0RWxCQ1IuaGVpZ2h0IHx8IHRhcmdldEVsZW1lbnQub2Zmc2V0SGVpZ2h0LFxuICAgICdsZWZ0JzogMCxcbiAgICAncmlnaHQnOiB0YXJnZXRFbEJDUi53aWR0aCB8fCB0YXJnZXRFbGVtZW50Lm9mZnNldFdpZHRoXG4gIH07XG4gIHN3aXRjaCAocGxhY2VtZW50UHJpbWFyeSkge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICB0YXJnZXRFbFBvc2l0aW9uLnRvcCA9XG4gICAgICAgIGhvc3RFbFBvc2l0aW9uLnRvcCAtICh0YXJnZXRFbGVtZW50Lm9mZnNldEhlaWdodCArIHBhcnNlRmxvYXQodGFyZ2V0RWxTdHlsZXMubWFyZ2luQm90dG9tKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgdGFyZ2V0RWxQb3NpdGlvbi50b3AgPSBob3N0RWxQb3NpdGlvbi50b3AgKyBob3N0RWxQb3NpdGlvbi5oZWlnaHQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHRhcmdldEVsUG9zaXRpb24ubGVmdCA9XG4gICAgICAgIGhvc3RFbFBvc2l0aW9uLmxlZnQgLSAodGFyZ2V0RWxlbWVudC5vZmZzZXRXaWR0aCArIHBhcnNlRmxvYXQodGFyZ2V0RWxTdHlsZXMubWFyZ2luUmlnaHQpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHRhcmdldEVsUG9zaXRpb24ubGVmdCA9IGhvc3RFbFBvc2l0aW9uLmxlZnQgKyBob3N0RWxQb3NpdGlvbi53aWR0aDtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHN3aXRjaCAocGxhY2VtZW50U2Vjb25kYXJ5KSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIHRhcmdldEVsUG9zaXRpb24udG9wID0gaG9zdEVsUG9zaXRpb24udG9wO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIHRhcmdldEVsUG9zaXRpb24udG9wID0gaG9zdEVsUG9zaXRpb24udG9wICsgaG9zdEVsUG9zaXRpb24uaGVpZ2h0IC0gdGFyZ2V0RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHRhcmdldEVsUG9zaXRpb24ubGVmdCA9IGhvc3RFbFBvc2l0aW9uLmxlZnQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICB0YXJnZXRFbFBvc2l0aW9uLmxlZnQgPSBob3N0RWxQb3NpdGlvbi5sZWZ0ICsgaG9zdEVsUG9zaXRpb24ud2lkdGggLSB0YXJnZXRFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY2VudGVyJzpcbiAgICAgIGlmIChwbGFjZW1lbnRQcmltYXJ5ID09PSAndG9wJyB8fCBwbGFjZW1lbnRQcmltYXJ5ID09PSAnYm90dG9tJykge1xuICAgICAgICB0YXJnZXRFbFBvc2l0aW9uLmxlZnQgPSBob3N0RWxQb3NpdGlvbi5sZWZ0ICsgaG9zdEVsUG9zaXRpb24ud2lkdGggLyAyIC0gdGFyZ2V0RWxlbWVudC5vZmZzZXRXaWR0aCAvIDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRFbFBvc2l0aW9uLnRvcCA9IGhvc3RFbFBvc2l0aW9uLnRvcCArIGhvc3RFbFBvc2l0aW9uLmhlaWdodCAvIDIgLSB0YXJnZXRFbGVtZW50Lm9mZnNldEhlaWdodCAvIDI7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuICB0YXJnZXRFbFBvc2l0aW9uLnRvcCA9IE1hdGgucm91bmQodGFyZ2V0RWxQb3NpdGlvbi50b3ApO1xuICB0YXJnZXRFbFBvc2l0aW9uLmJvdHRvbSA9IE1hdGgucm91bmQodGFyZ2V0RWxQb3NpdGlvbi5ib3R0b20pO1xuICB0YXJnZXRFbFBvc2l0aW9uLmxlZnQgPSBNYXRoLnJvdW5kKHRhcmdldEVsUG9zaXRpb24ubGVmdCk7XG4gIHRhcmdldEVsUG9zaXRpb24ucmlnaHQgPSBNYXRoLnJvdW5kKHRhcmdldEVsUG9zaXRpb24ucmlnaHQpO1xuICByZXR1cm4gdGFyZ2V0RWxQb3NpdGlvbjtcbn0iLCJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBDb21wb25lbnRSZWYsXG4gIE9uRGVzdHJveSxcbiAgRWxlbWVudFJlZixcbiAgT25Jbml0LFxuICBJbmplY3RvcixcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBDb21wb25lbnRGYWN0b3J5LFxuICBBZnRlclZpZXdJbml0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4vcG9wb3Zlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9wb3Zlck9wdGlvbnMgfSBmcm9tICcuL3BvcG92ZXItb3B0aW9ucy5wcm92aWRlcic7XG5pbXBvcnQgeyBQb3BvdmVyQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gJy4vcG9wb3Zlci1jb21wb25lbnQtb3B0aW9ucy5wcm92aWRlcic7XG5pbXBvcnQgKiBhcyBQb3NpdGlvbmluZyBmcm9tICcuLi9jb3JlL3V0aWwvcG9zaXRpb24nO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbUG9wb3Zlcl0sIFtuem0tcG9wb3Zlcl0nLFxuICBwcm92aWRlcnM6IFtQb3BvdmVyT3B0aW9uc11cbn0pXG5leHBvcnQgY2xhc3MgUG9wb3ZlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcG9wb3ZlcjogQ29tcG9uZW50UmVmPFBvcG92ZXJDb21wb25lbnQ+O1xuXG4gIHByaXZhdGUgX2V2ZW50TGlzdGVuZXJzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIG1hc2s6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHNob3dBcnJvdzogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgdmlzaWJsZTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcGxhY2VtZW50OiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIG92ZXJsYXk6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBPdXRwdXQoKVxuICBvblZpc2libGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIodHJ1ZSk7XG4gIEBPdXRwdXQoKVxuICBvblNlbGVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpXG4gIGFwcGVuZFRvQm9keTogYm9vbGVhbjtcblxuICBASG9zdExpc3RlbmVyKCdjbGljaycpXG4gIHRvZ2dsZVBvcG92ZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBvcG92ZXIpIHtcbiAgICAgIHRoaXMuc2hvd1BvcG92ZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlUG9wb3ZlcigpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBfZWxtOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgX2RlZmF1bHRPcHRpb25zOiBQb3BvdmVyT3B0aW9ucyxcbiAgICBwcml2YXRlIF9jZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge31cblxuICBwb3NpdGlvbk1hcChwbGFjZW1lbnQpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XG4gICAgICBjYXNlICd0b3BMZWZ0JzpcbiAgICAgICAgcmV0dXJuICd0b3AtbGVmdCc7XG4gICAgICBjYXNlICd0b3BSaWdodCc6XG4gICAgICAgIHJldHVybiAndG9wLXJpZ2h0JztcbiAgICAgIGNhc2UgJ2JvdHRvbUxlZnQnOlxuICAgICAgICByZXR1cm4gJ2JvdHRvbS1sZWZ0JztcbiAgICAgIGNhc2UgJ2JvdHRvbVJpZ2h0JzpcbiAgICAgICAgcmV0dXJuICdib3R0b20tcmlnaHQnO1xuICAgICAgY2FzZSAnbGVmdFRvcCc6XG4gICAgICAgIHJldHVybiAnbGVmdC10b3AnO1xuICAgICAgY2FzZSAnbGVmdEJvdHRvbSc6XG4gICAgICAgIHJldHVybiAnbGVmdC1ib3R0b20nO1xuICAgICAgY2FzZSAncmlnaHRUb3AnOlxuICAgICAgICByZXR1cm4gJ3JpZ2h0LXRvcCc7XG4gICAgICBjYXNlICdyaWdodEJvdHRvbSc6XG4gICAgICAgIHJldHVybiAncmlnaHQtYm90dG9tJztcbiAgICAgIGNhc2UgJ2Z1bGxTY3JlZW4nOlxuICAgICAgY2FzZSAnbGFuZFNjYXBlJzpcbiAgICAgICAgcmV0dXJuICdib3R0b20nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICh0aGlzLnZpc2libGUpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93UG9wb3ZlcigpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5oaWRlUG9wb3ZlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wb3BvdmVyICYmXG4gICAgICAhdGhpcy5fZWxtLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgIXRoaXMucG9wb3Zlci5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldClcbiAgICApIHtcbiAgICAgIHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3dQb3BvdmVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb3BvdmVyKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMgPSBbXG4gICAgICAgICAgdGhpcy5fcmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICdjbGljaycsIChldmVudDogRXZlbnQpID0+IHRoaXMub25Eb2N1bWVudENsaWNrKGV2ZW50KSksXG4gICAgICAgICAgdGhpcy5fcmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICd0b3VjaGVuZCcsIChldmVudDogRXZlbnQpID0+IHRoaXMub25Eb2N1bWVudENsaWNrKGV2ZW50KSksXG4gICAgICAgICAgdGhpcy5fcmVuZGVyZXIubGlzdGVuKCd3aW5kb3cnLCAncmVzaXplJywgKCkgPT4gdGhpcy5wb3NpdGlvblBvcG92ZXIoKSlcbiAgICAgICAgXTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvcHRpb25zID0gbmV3IFBvcG92ZXJDb21wb25lbnRPcHRpb25zKCk7XG4gICAgICBvcHRpb25zLnBsYWNlbWVudCA9IHRoaXMucGxhY2VtZW50O1xuICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCB0aGlzLl9kZWZhdWx0T3B0aW9ucywge1xuICAgICAgICBoaWRlUG9wb3ZlcjogKGV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5oaWRlUG9wb3ZlcigpO1xuICAgICAgICB9LFxuICAgICAgICBvbkFmdGVyVmlld0luaXQ6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uUG9wb3ZlcigpO1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYW0tcG9wb3Zlci1pbm5lci13cmFwcGVyJylbMF0uY2hpbGRyZW47XG4gICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIMOpwqbClsOlwoXCiMOmwojCkcOkwrvCrMOmwqPCgMOmwp/CpcOlwq7Cg8OmwpjCr8OlwpDCpsOlwozChcOlwpDCq8Olwq3CkMOoworCgsOnwoLCuVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjaGlsZHJlbltpXS5pZCA9IGAke2l9YDtcbiAgICAgICAgICAgICAgY2hpbGRyZW5baV0uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAnY2xpY2snLFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uU2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3QuZW1pdChjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3B0aW9uYWxQYXJhbXM6IEFycmF5PGtleW9mIFBvcG92ZXJEaXJlY3RpdmU+ID0gW1xuICAgICAgICAnbWFzaycsXG4gICAgICAgICdzaG93QXJyb3cnLFxuICAgICAgICAncGxhY2VtZW50JyxcbiAgICAgICAgJ2FwcGVuZFRvQm9keScsXG4gICAgICAgICdvdmVybGF5J1xuICAgICAgXTtcbiAgICAgIG9wdGlvbmFsUGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXNbcGFyYW1dICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIChvcHRpb25zIGFzIGFueSlbcGFyYW1dID0gdGhpc1twYXJhbV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5PFBvcG92ZXJDb21wb25lbnQ+ID0gdGhpcy5fY2ZyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KFBvcG92ZXJDb21wb25lbnQpO1xuICAgICAgY29uc3QgY2hpbGRJbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZShcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFBvcG92ZXJDb21wb25lbnRPcHRpb25zLFxuICAgICAgICAgICAgdXNlVmFsdWU6IG9wdGlvbnNcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYucGFyZW50SW5qZWN0b3JcbiAgICAgICk7XG4gICAgICB0aGlzLnBvcG92ZXIgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChcbiAgICAgICAgY29tcG9uZW50RmFjdG9yeSxcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5sZW5ndGgsXG4gICAgICAgIGNoaWxkSW5qZWN0b3JcbiAgICAgICk7XG4gICAgICBpZiAob3B0aW9ucy5hcHBlbmRUb0JvZHkpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnBvcG92ZXIubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZS5lbWl0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Qb3BvdmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvcG92ZXIpIHtcbiAgICAgIGNvbnN0IHBvcG92ZXJFbGVtZW50ID0gdGhpcy5wb3BvdmVyLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW5bMV07XG4gICAgICBjb25zdCBwb3BvdmVyUG9zaXRpb24gPSBQb3NpdGlvbmluZy5nZXRQb3NpdGlvbkVsZW1lbnRzKFxuICAgICAgICB0aGlzLl9lbG0ubmF0aXZlRWxlbWVudCxcbiAgICAgICAgcG9wb3ZlckVsZW1lbnQsXG4gICAgICAgIHRoaXMucG9zaXRpb25NYXAodGhpcy5wbGFjZW1lbnQpIHx8IHRoaXMuX2RlZmF1bHRPcHRpb25zLnBsYWNlbWVudCxcbiAgICAgICAgdGhpcy5hcHBlbmRUb0JvZHkgfHwgdGhpcy5fZGVmYXVsdE9wdGlvbnMuYXBwZW5kVG9Cb2R5XG4gICAgICApO1xuICAgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAnbGFuZFNjYXBlJykge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShwb3BvdmVyRWxlbWVudCwgJ3RvcCcsIGAke3BvcG92ZXJQb3NpdGlvbi50b3B9cHhgKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUocG9wb3ZlckVsZW1lbnQsICdsZWZ0JywgYDBweGApO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShwb3BvdmVyRWxlbWVudCwgJ3dpZHRoJywgYCR7d2luZG93LmlubmVyV2lkdGh9cHhgKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUocG9wb3ZlckVsZW1lbnQsICdtYXgtaGVpZ2h0JywgYCR7d2luZG93LmlubmVySGVpZ2h0IC0gcG9wb3ZlclBvc2l0aW9uLmhlaWdodH1weGApO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBsYWNlbWVudCA9PT0gJ2Z1bGxTY3JlZW4nKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHBvcG92ZXJFbGVtZW50LCAndG9wJywgYCR7MH1weGApO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShwb3BvdmVyRWxlbWVudCwgJ2xlZnQnLCBgMHB4YCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHBvcG92ZXJFbGVtZW50LCAnd2lkdGgnLCBgJHt3aW5kb3cuaW5uZXJXaWR0aH1weGApO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShwb3BvdmVyRWxlbWVudCwgJ21heC1oZWlnaHQnLCBgJHt3aW5kb3cuaW5uZXJIZWlnaHQgLSBwb3BvdmVyUG9zaXRpb24uaGVpZ2h0fXB4YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShwb3BvdmVyRWxlbWVudCwgJ3RvcCcsIGAke3BvcG92ZXJQb3NpdGlvbi50b3B9cHhgKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUocG9wb3ZlckVsZW1lbnQsICdsZWZ0JywgYCR7cG9wb3ZlclBvc2l0aW9uLmxlZnR9cHhgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhpZGVQb3BvdmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvcG92ZXIpIHtcbiAgICAgIHRoaXMucG9wb3Zlci5kZXN0cm95KCk7XG4gICAgICBkZWxldGUgdGhpcy5wb3BvdmVyO1xuICAgICAgdGhpcy5vblZpc2libGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICB0aGlzLl9ldmVudExpc3RlbmVycy5mb3JFYWNoKGZuID0+IGZuKCkpO1xuICAgICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUG9wb3ZlckRpcmVjdGl2ZSB9IGZyb20gJy4vcG9wb3Zlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4vcG9wb3Zlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9wb3Zlck9wdGlvbnMgfSBmcm9tICcuL3BvcG92ZXItb3B0aW9ucy5wcm92aWRlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25zRmFjdG9yeSh1c2VyT3B0aW9uczogUG9wb3Zlck9wdGlvbnMpOiBQb3BvdmVyT3B0aW9ucyB7XG4gIGNvbnN0IG9wdGlvbnM6IFBvcG92ZXJPcHRpb25zID0gbmV3IFBvcG92ZXJPcHRpb25zKCk7XG4gIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgdXNlck9wdGlvbnMpO1xuICByZXR1cm4gb3B0aW9ucztcbn1cblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbUG9wb3ZlckRpcmVjdGl2ZSwgUG9wb3ZlckNvbXBvbmVudF0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbUG9wb3ZlckRpcmVjdGl2ZSwgUG9wb3ZlckNvbXBvbmVudF0sXG4gIGVudHJ5Q29tcG9uZW50czogW1BvcG92ZXJDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBQb3BvdmVyTW9kdWxlIHt9XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBUZW1wbGF0ZVJlZiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ05hdmJhciwgbnptLW5hdi1iYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vbmF2LWJhci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTmF2QmFyQ29tcG9uZW50IHtcbiAgZGVmYXVsdFByb3BzID0ge1xuICAgIHByZWZpeENsczogJ2FtLW5hdmJhcicsXG4gICAgbW9kZTogJ2RhcmsnLFxuICAgIG9uTGVmdENsaWNrOiAoKSA9PiB7fVxuICB9O1xuICBuYXZiYXJDbHMgPSB7fTtcbiAgaXNJY29uU3RyaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgaXNMZWZ0Q29udGVudFN0cmluZzogYm9vbGVhbiA9IHRydWU7XG4gIGlzUmlnaHRDb250ZW50U3RyaW5nOiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIF9pY29uOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICBwcml2YXRlIF9sZWZ0Q29udGVudDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgcHJpdmF0ZSBfcmlnaHRDb250ZW50OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBJbnB1dCgpXG4gIHNldCBtb2RlKHZhbHVlKSB7XG4gICAgdGhpcy5kZWZhdWx0UHJvcHMubW9kZSA9IHZhbHVlO1xuICAgIHRoaXMuX2FtTmF2YmFyTGlnaHQgPSB0aGlzLmRlZmF1bHRQcm9wcy5tb2RlID09PSAnbGlnaHQnO1xuICAgIHRoaXMuX2FtTmF2YmFyZGFyayA9IHRoaXMuZGVmYXVsdFByb3BzLm1vZGUgPT09ICdkYXJrJztcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgaWNvbigpOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5faWNvbjtcbiAgfVxuICBzZXQgaWNvbih2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICB0aGlzLmlzSWNvblN0cmluZyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzSWNvblN0cmluZyA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX2ljb24gPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbGVmdENvbnRlbnQoKTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2xlZnRDb250ZW50O1xuICB9XG4gIHNldCBsZWZ0Q29udGVudCh2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICB0aGlzLmlzTGVmdENvbnRlbnRTdHJpbmcgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0xlZnRDb250ZW50U3RyaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fbGVmdENvbnRlbnQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgcmlnaHRDb250ZW50KCk6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9yaWdodENvbnRlbnQ7XG4gIH1cbiAgc2V0IHJpZ2h0Q29udGVudCh2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICB0aGlzLmlzUmlnaHRDb250ZW50U3RyaW5nID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNSaWdodENvbnRlbnRTdHJpbmcgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9yaWdodENvbnRlbnQgPSB2YWx1ZTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25MZWZ0Q2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tbmF2YmFyJylcbiAgcHJpdmF0ZSBfYW1OYXZiYXIgPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLW5hdmJhci1saWdodCcpXG4gIHByaXZhdGUgX2FtTmF2YmFyTGlnaHQ7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tbmF2YmFyLWRhcmsnKVxuICBwcml2YXRlIF9hbU5hdmJhcmRhcms7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGNsaWNrKGV2ZW50KSB7XG4gICAgdGhpcy5vbkxlZnRDbGljay5lbWl0KGV2ZW50KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJY29uTW9kdWxlIH0gZnJvbSAnLi4vaWNvbi9pY29uLm1vZHVsZSc7XG5pbXBvcnQgeyBOYXZCYXJDb21wb25lbnQgfSBmcm9tICcuL25hdi1iYXIuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWNvbk1vZHVsZV0sXG4gIGV4cG9ydHM6IFtOYXZCYXJDb21wb25lbnRdLFxuICBkZWNsYXJhdGlvbnM6IFtOYXZCYXJDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIE5hdkJhck1vZHVsZSB7fVxuIiwiLy8gw6XCkMKMw6bCrcKlw6jCh8KqICdybWMtY2FsZW5kYXIvbGliL2xvY2FsZS9lbl9VUyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgdGl0bGU6ICdDYWxlbmRhcicsXG4gIHRvZGF5OiAnVG9kYXknLFxuICBtb250aDogJ01vbnRoJyxcbiAgeWVhcjogJ1llYXInLFxuICBhbTogJ0FNJyxcbiAgcG06ICdQTScsXG4gIGRhdGVUaW1lRm9ybWF0OiAnTU0vZGQveXl5eSB3IGhoOm1tJyxcbiAgZGF0ZUZvcm1hdDogJ3l5eXkvTU0vZGQgdycsXG4gIG5vQ2hvb3NlOiAnTm8gQ2hvb3NlJyxcbiAgd2VlazogWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZpcicsICdTYXQnXSxcbiAgY2xlYXI6ICdDbGVhcicsXG4gIHNlbGVjdFRpbWU6ICdTZWxlY3QgVGltZScsXG4gIHNlbGVjdFN0YXJ0VGltZTogJ1NlbGVjdCBTdGFydCBUaW1lJyxcbiAgc2VsZWN0RW5kVGltZTogJ1NlbGVjdCBFbmQgVGltZScsXG4gIHN0YXJ0OiAnU3RhcnQnLFxuICBlbmQ6ICdFbmQnLFxuICBiZWdpbjogJ1N0YXJ0JyxcbiAgb3ZlcjogJ0VuZCcsXG4gIGJlZ2luX292ZXI6ICdTL0UnLFxuICBjb25maXJtOiAnQ29uZmlybScsXG4gIG1vbnRoVGl0bGU6ICd5eXl5L01NJyxcbiAgbG9hZFByZXZNb250aDogJ0xvYWQgUHJldiBNb250aCcsXG4gIHllc3RlcmRheTogJ1llc3RlcmRheScsXG4gIGxhc3RXZWVrOiAnTGFzdCBXZWVrJyxcbiAgbGFzdE1vbnRoOiAnTGFzdCBNb250aCdcbn07XG4iLCJpbXBvcnQgeyBNb2RlbHMgfSBmcm9tICcuLi9kYXRlL0RhdGFUeXBlcyc7XG5cbmV4cG9ydCBjb25zdCBtZXJnZURhdGVUaW1lID0gKGRhdGU/OiBEYXRlLCB0aW1lPzogRGF0ZSkgPT4ge1xuICBkYXRlID0gZGF0ZSB8fCBuZXcgRGF0ZSgpO1xuICBpZiAoIXRpbWUpIHJldHVybiBkYXRlO1xuICByZXR1cm4gbmV3IERhdGUoXG4gICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgIGRhdGUuZ2V0TW9udGgoKSxcbiAgICBkYXRlLmdldERhdGUoKSxcbiAgICB0aW1lLmdldEhvdXJzKCksXG4gICAgdGltZS5nZXRNaW51dGVzKCksXG4gICAgdGltZS5nZXRTZWNvbmRzKClcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXREYXRlID0gKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nLCBsb2NhbGU/OiBNb2RlbHMuTG9jYWxlKSA9PiB7XG4gIGNvbnN0IHdlZWsgPSBsb2NhbGUgJiYgbG9jYWxlLndlZWs7XG5cbiAgbGV0IG86IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7XG4gICAgJ00rJzogZGF0ZS5nZXRNb250aCgpICsgMSxcbiAgICAnZCsnOiBkYXRlLmdldERhdGUoKSxcbiAgICAnaCsnOiBkYXRlLmdldEhvdXJzKCksXG4gICAgJ20rJzogZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgJ3MrJzogZGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgJ3ErJzogTWF0aC5mbG9vcigoZGF0ZS5nZXRNb250aCgpICsgMykgLyAzKSxcbiAgICAndysnOiB3ZWVrICYmIHdlZWtbZGF0ZS5nZXREYXkoKV0sXG4gICAgUzogZGF0ZS5nZXRNaWxsaXNlY29uZHMoKVxuICB9O1xuICBpZiAoLyh5KykvLnRlc3QoZm9ybWF0KSkgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoUmVnRXhwLiQxLCAoZGF0ZS5nZXRGdWxsWWVhcigpICsgJycpLnN1YnN0cig0IC0gUmVnRXhwLiQxLmxlbmd0aCkpO1xuICBmb3IgKGxldCBrIGluIG8pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnKCcgKyBrICsgJyknKS50ZXN0KGZvcm1hdCkpIHtcbiAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKFJlZ0V4cC4kMSwgUmVnRXhwLiQxLmxlbmd0aCA9PSAxID8gb1trXSA6ICgnMDAnICsgb1trXSkuc3Vic3RyKCgnJyArIG9ba10pLmxlbmd0aCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZm9ybWF0O1xufTtcbiIsImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBIb3N0QmluZGluZyxcbiAgRXZlbnRFbWl0dGVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kZWxzIH0gZnJvbSAnLi9kYXRlL0RhdGFUeXBlcyc7XG5pbXBvcnQgemhDTiBmcm9tICcuL2xvY2FsZS96aF9DTic7XG5pbXBvcnQgZW5VUyBmcm9tICcuL2xvY2FsZS9lbl9VUyc7XG5pbXBvcnQgUHJvcHNUeXBlIGZyb20gJy4vY2FsZW5kYXIucHJvcHMuY29tcG9uZW50JztcbmltcG9ydCB7IExvY2FsZVByb3ZpZGVyU2VydmljZSB9IGZyb20gJy4uL2xvY2FsZS1wcm92aWRlci9sb2NhbGUtcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBtZXJnZURhdGVUaW1lIH0gZnJvbSAnLi91dGlsL2luZGV4JztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IHsgUHJvcHNUeXBlIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVUeXBlIHtcbiAgc2hvd1RpbWVQaWNrZXI6IGJvb2xlYW47XG4gIHRpbWVQaWNrZXJUaXRsZT86IHN0cmluZztcbiAgc3RhcnREYXRlPzogRGF0ZTtcbiAgZW5kRGF0ZT86IERhdGU7XG4gIGRpc0NvbmZpcm1CdG4/OiBib29sZWFuO1xuICBjbGllbnRIaWdodD86IG51bWJlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnQ2FsZW5kYXIsIG56bS1jYWxlbmRhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGlzU2hvdzogYm9vbGVhbiA9IGZhbHNlO1xuICBjb250ZW50QW5pbWF0ZUNsYXNzOiBzdHJpbmc7XG4gIG1hc2tBbmltYXRlQ2xhc3M6IHN0cmluZztcbiAgc2hvd0NsZWFyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvcHMgPSB7XG4gICAgdmlzaWJsZTogZmFsc2UsXG4gICAgc2hvd0hlYWRlcjogdHJ1ZSxcbiAgICBsb2NhbGU6IHpoQ04sXG4gICAgcGlja1RpbWU6IGZhbHNlLFxuICAgIHNob3dTaG9ydGN1dDogZmFsc2UsXG4gICAgcHJlZml4Q2xzOiAncm1jLWNhbGVuZGFyJyxcbiAgICB0eXBlOiAncmFuZ2UnLFxuICAgIGRlZmF1bHRUaW1lVmFsdWU6IG5ldyBEYXRlKDIwMDAsIDAsIDEsIDgpXG4gIH0gYXMgUHJvcHNUeXBlO1xuXG4gIHN0YXRlID0ge1xuICAgIHNob3dUaW1lUGlja2VyOiBmYWxzZSxcbiAgICB0aW1lUGlja2VyVGl0bGU6ICcnLFxuICAgIHN0YXJ0RGF0ZTogdW5kZWZpbmVkLFxuICAgIGVuZERhdGU6IHVuZGVmaW5lZCxcbiAgICBkaXNDb25maXJtQnRuOiB0cnVlLFxuICAgIGNsaWVudEhpZ2h0OiAwXG4gIH0gYXMgU3RhdGVUeXBlO1xuXG4gIHByaXZhdGUgX3Vuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2VudGVyRGlyZWN0aW9uOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgc2V0IGxvY2FsZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJ2VuVVMnKSB7XG4gICAgICB0aGlzLnByb3BzLmxvY2FsZSA9IGVuVVM7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ3poQ04nKSB7XG4gICAgICB0aGlzLnByb3BzLmxvY2FsZSA9IHpoQ047XG4gICAgfVxuXG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLl91bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZGVmYXVsdFRpbWVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5wcm9wcy5kZWZhdWx0VGltZVZhbHVlID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBwcmVmaXhDbHModmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMucHJvcHMucHJlZml4Q2xzID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBlbnRlckRpcmVjdGlvbih2YWx1ZSkge1xuICAgIHRoaXMuX2VudGVyRGlyZWN0aW9uID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX2VudGVyRGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgIHRoaXMuY29udGVudEFuaW1hdGVDbGFzcyA9ICdzbGlkZUgtZW50ZXIgc2xpZGVILWVudGVyLWFjdGl2ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudEFuaW1hdGVDbGFzcyA9ICdzbGlkZVYtZW50ZXIgc2xpZGVWLWVudGVyLWFjdGl2ZSc7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCB2aXNpYmxlKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy52aXNpYmxlID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIHRoaXMuc2hvd0FuaW1hdGlvbigpO1xuICAgICAgdGhpcy5pc1Nob3cgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGVBbmltYXRpb24oKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzU2hvdyA9IGZhbHNlO1xuICAgICAgfSwgMzAwKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGdldERhdGVFeHRyYSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMuZ2V0RGF0ZUV4dHJhID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRlZmF1bHREYXRlKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5kZWZhdWx0RGF0ZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtaW5EYXRlKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5taW5EYXRlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG1heERhdGUodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLm1heERhdGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcGlja1RpbWUodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLnBpY2tUaW1lID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHR5cGUodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLnR5cGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc2hvd1Nob3J0Y3V0KHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5zaG93U2hvcnRjdXQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcm93U2l6ZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMucm93U2l6ZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBpbmZpbml0ZSh2YWx1ZSkge31cbiAgQElucHV0KClcbiAgc2V0IGRlZmF1bHRWYWx1ZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMuZGVmYXVsdFZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMucmVjZWl2ZVByb3BzKHRoaXMucHJvcHMpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgb25TZWxlY3QodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLm9uU2VsZWN0ID0gdmFsdWU7XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2FuY2VsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25Db25maXJtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25TZWxlY3RIYXNEaXNhYmxlRGF0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgY2xhc3M6IHN0cmluZyA9ICdhbS1jYWxlbmRhcic7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9jYWxlUHJvdmlkZXJTZXJ2aWNlOiBMb2NhbGVQcm92aWRlclNlcnZpY2UpIHt9XG5cbiAgcmVjZWl2ZVByb3BzKG5leHRQcm9wczogUHJvcHNUeXBlKSB7XG4gICAgaWYgKG5leHRQcm9wcy52aXNpYmxlICYmIG5leHRQcm9wcy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgIHRoaXMuc2hvcnRjdXRTZWxlY3QobmV4dFByb3BzLmRlZmF1bHRWYWx1ZVswXSwgbmV4dFByb3BzLmRlZmF1bHRWYWx1ZVsxXSwgbmV4dFByb3BzKTtcbiAgICB9XG4gIH1cblxuICBzaG93QW5pbWF0aW9uKCkge1xuICAgIGlmICh0aGlzLl9lbnRlckRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICB0aGlzLmNvbnRlbnRBbmltYXRlQ2xhc3MgPSAnc2xpZGVILWVudGVyIHNsaWRlSC1lbnRlci1hY3RpdmUnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRlbnRBbmltYXRlQ2xhc3MgPSAnc2xpZGVWLWVudGVyIHNsaWRlVi1lbnRlci1hY3RpdmUnO1xuICAgIH1cbiAgICB0aGlzLm1hc2tBbmltYXRlQ2xhc3MgPSAnZmFkZS1lbnRlciBmYWRlLWVudGVyLWFjdGl2ZSc7XG4gIH1cblxuICBoaWRlQW5pbWF0aW9uKCkge1xuICAgIGlmICh0aGlzLl9lbnRlckRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICB0aGlzLmNvbnRlbnRBbmltYXRlQ2xhc3MgPSAnc2xpZGVILWxlYXZlIHNsaWRlSC1sZWF2ZS1hY3RpdmUnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRlbnRBbmltYXRlQ2xhc3MgPSAnc2xpZGVWLWxlYXZlIHNsaWRlVi1sZWF2ZS1hY3RpdmUnO1xuICAgIH1cbiAgICB0aGlzLm1hc2tBbmltYXRlQ2xhc3MgPSAnZmFkZS1sZWF2ZSBmYWRlLWxlYXZlLWFjdGl2ZSc7XG4gIH1cblxuICBzZWxlY3REYXRlID0gKFxuICAgIGRhdGU6IERhdGUsXG4gICAgdXNlRGF0ZVRpbWUgPSBmYWxzZSxcbiAgICBvbGRTdGF0ZTogeyBzdGFydERhdGU/OiBEYXRlOyBlbmREYXRlPzogRGF0ZSB9ID0ge30sXG4gICAgcHJvcHMgPSB0aGlzLnByb3BzXG4gICkgPT4ge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuIHt9IGFzIFN0YXRlVHlwZTtcbiAgICB9XG4gICAgbGV0IG5ld1N0YXRlID0ge30gYXMgU3RhdGVUeXBlO1xuICAgIGNvbnN0IHsgdHlwZSwgcGlja1RpbWUsIGRlZmF1bHRUaW1lVmFsdWUsIGxvY2FsZSA9IHt9IGFzIE1vZGVscy5Mb2NhbGUgfSA9IHByb3BzO1xuICAgIGNvbnN0IG5ld0RhdGUgPSBwaWNrVGltZSAmJiAhdXNlRGF0ZVRpbWUgPyBtZXJnZURhdGVUaW1lKGRhdGUsIGRlZmF1bHRUaW1lVmFsdWUpIDogZGF0ZTtcbiAgICBjb25zdCB7IHN0YXJ0RGF0ZSwgZW5kRGF0ZSB9ID0gb2xkU3RhdGU7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ29uZSc6XG4gICAgICAgIG5ld1N0YXRlID0ge1xuICAgICAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgICAgIHN0YXJ0RGF0ZTogbmV3RGF0ZSxcbiAgICAgICAgICBkaXNDb25maXJtQnRuOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBpZiAocGlja1RpbWUpIHtcbiAgICAgICAgICBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgICAgICAgdGltZVBpY2tlclRpdGxlOiBsb2NhbGUuc2VsZWN0VGltZSxcbiAgICAgICAgICAgIHNob3dUaW1lUGlja2VyOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmFuZ2UnOlxuICAgICAgICBpZiAoIXN0YXJ0RGF0ZSB8fCBlbmREYXRlKSB7XG4gICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogbmV3RGF0ZSxcbiAgICAgICAgICAgIGVuZERhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRpc0NvbmZpcm1CdG46IHRydWVcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChwaWNrVGltZSkge1xuICAgICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgICAgICAgICB0aW1lUGlja2VyVGl0bGU6IGxvY2FsZS5zZWxlY3RTdGFydFRpbWUsXG4gICAgICAgICAgICAgIHNob3dUaW1lUGlja2VyOiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgICAgICAgdGltZVBpY2tlclRpdGxlOiArbmV3RGF0ZSA+PSArc3RhcnREYXRlID8gbG9jYWxlLnNlbGVjdEVuZFRpbWUgOiBsb2NhbGUuc2VsZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgZGlzQ29uZmlybUJ0bjogZmFsc2UsXG4gICAgICAgICAgICBlbmREYXRlOlxuICAgICAgICAgICAgICBwaWNrVGltZSAmJiAhdXNlRGF0ZVRpbWUgJiYgK25ld0RhdGUgPj0gK3N0YXJ0RGF0ZVxuICAgICAgICAgICAgICAgID8gbmV3IERhdGUoK21lcmdlRGF0ZVRpbWUobmV3RGF0ZSwgc3RhcnREYXRlKSArIDM2MDAwMDApXG4gICAgICAgICAgICAgICAgOiBuZXdEYXRlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG5ld1N0YXRlO1xuICB9XG5cbiAgb25TZWxlY3RlZERhdGUgPSAoZGF0ZTogRGF0ZSkgPT4ge1xuICAgIGNvbnN0IHsgc3RhcnREYXRlLCBlbmREYXRlIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHsgb25TZWxlY3QgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAob25TZWxlY3QpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb25TZWxlY3QoZGF0ZSwgW3N0YXJ0RGF0ZSwgZW5kRGF0ZV0pO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2hvcnRjdXRTZWxlY3QodmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgLi4udGhpcy5zZWxlY3REYXRlKGRhdGUsIGZhbHNlLCB7IHN0YXJ0RGF0ZSwgZW5kRGF0ZSB9KVxuICAgIH07XG5cbiAgICB0aGlzLnNob3dDbGVhciA9ICEhdGhpcy5zdGF0ZS5zdGFydERhdGU7XG4gIH1cblxuICB0cmlnZ2VyU2VsZWN0SGFzRGlzYWJsZURhdGUgPSAoZGF0ZTogRGF0ZVtdKSA9PiB7XG4gICAgdGhpcy50cmlnZ2VyQ2xlYXIoKTtcbiAgICB0aGlzLm9uU2VsZWN0SGFzRGlzYWJsZURhdGUgJiYgdGhpcy5vblNlbGVjdEhhc0Rpc2FibGVEYXRlLmVtaXQoZGF0ZSk7XG4gIH1cblxuICBvbkNsb3NlID0gKCkgPT4ge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBzaG93VGltZVBpY2tlcjogZmFsc2UsXG4gICAgICB0aW1lUGlja2VyVGl0bGU6ICcnLFxuICAgICAgc3RhcnREYXRlOiB1bmRlZmluZWQsXG4gICAgICBlbmREYXRlOiB1bmRlZmluZWQsXG4gICAgICBkaXNDb25maXJtQnRuOiB0cnVlLFxuICAgICAgY2xpZW50SGlnaHQ6IDBcbiAgICB9IGFzIFN0YXRlVHlwZTtcbiAgICB0aGlzLnNob3dDbGVhciA9ICEhdGhpcy5zdGF0ZS5zdGFydERhdGU7XG4gIH1cblxuICB0cmlnZ2VyQ29uZmlybSA9ICgpID0+IHtcbiAgICBjb25zdCB7IHN0YXJ0RGF0ZSwgZW5kRGF0ZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAoc3RhcnREYXRlICYmIGVuZERhdGUgJiYgK3N0YXJ0RGF0ZSA+ICtlbmREYXRlKSB7XG4gICAgICB0aGlzLm9uQ2xvc2UoKTtcbiAgICAgIHJldHVybiB0aGlzLm9uQ29uZmlybSAmJiB0aGlzLm9uQ29uZmlybS5lbWl0KHsgc3RhcnREYXRlOiBlbmREYXRlLCBlbmREYXRlOiBzdGFydERhdGUgfSk7XG4gICAgfVxuICAgIHRoaXMub25Db25maXJtICYmIHRoaXMub25Db25maXJtLmVtaXQoeyBzdGFydERhdGUsIGVuZERhdGUgfSk7XG4gICAgdGhpcy5vbkNsb3NlKCk7XG4gIH1cblxuICB0cmlnZ2VyQ2FuY2VsKCkge1xuICAgIHRoaXMucHJvcHMub25DYW5jZWwgJiYgdGhpcy5wcm9wcy5vbkNhbmNlbCgpO1xuICAgIHRoaXMub25DbG9zZSgpO1xuICAgIHRoaXMub25DYW5jZWwgJiYgdGhpcy5vbkNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICB0cmlnZ2VyQ2xlYXIgPSAoKSA9PiB7XG4gICAgLy8gw6bCuMKFw6nCmcKkw6bClcKww6bCjcKuw6XCgcKaw6XCu8K2w6jCv8Kfw6/CvMKMw6XCkMKmw6XCiMKZw6XCkMKMw6bCrcKlw6XCiMK3w6bClsKww6bClcKww6bCjcKuw6XCr8K8w6jCh8K0w6bCisKlw6nClMKZXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAuLi57IHN0YXJ0RGF0ZTogdW5kZWZpbmVkLCBlbmREYXRlOiB1bmRlZmluZWQsIHNob3dUaW1lUGlja2VyOiBmYWxzZSB9XG4gICAgICB9O1xuICAgICAgdGhpcy5wcm9wcy5vbkNsZWFyICYmIHRoaXMucHJvcHMub25DbGVhcigpO1xuICAgICAgdGhpcy5zaG93Q2xlYXIgPSAhIXRoaXMuc3RhdGUuc3RhcnREYXRlO1xuICAgIH0sIDApO1xuICB9XG5cbiAgb25UaW1lQ2hhbmdlID0gKGRhdGU6IERhdGUpID0+IHtcbiAgICBjb25zdCB7IHN0YXJ0RGF0ZSwgZW5kRGF0ZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAoZW5kRGF0ZSkge1xuICAgICAgdGhpcy5zdGF0ZS5lbmREYXRlID0gZGF0ZTtcbiAgICB9IGVsc2UgaWYgKHN0YXJ0RGF0ZSkge1xuICAgICAgdGhpcy5zdGF0ZS5zdGFydERhdGUgPSBkYXRlO1xuICAgIH1cbiAgfVxuXG4gIHNob3J0Y3V0U2VsZWN0ID0gKHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSwgcHJvcHMgPSB0aGlzLnByb3BzKSA9PiB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAuLi57IHN0YXJ0RGF0ZSwgc2hvd1RpbWVQaWNrZXI6IGZhbHNlIH0sXG4gICAgICAuLi50aGlzLnNlbGVjdERhdGUoZW5kRGF0ZSwgdHJ1ZSwgeyBzdGFydERhdGUgfSwgcHJvcHMpXG4gICAgfTtcbiAgICB0aGlzLnNob3dDbGVhciA9ICEhdGhpcy5zdGF0ZS5zdGFydERhdGU7XG4gIH1cblxuICBzZXRDbGllbnRIZWlnaHQgPSAoaGVpZ2h0OiBudW1iZXIpID0+IHtcbiAgICB0aGlzLnN0YXRlLmNsaWVudEhpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5wcm9wcy5kZWZhdWx0VmFsdWU7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgLi4udGhpcy5zZWxlY3REYXRlKGRlZmF1bHRWYWx1ZVsxXSwgdHJ1ZSwgeyBzdGFydERhdGU6IGRlZmF1bHRWYWx1ZVswXSB9LCB0aGlzLnByb3BzKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2NhbGVQcm92aWRlclNlcnZpY2UubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlJCkpLnN1YnNjcmliZShfID0+IHtcbiAgICAgIHRoaXMucHJvcHMubG9jYWxlID0geyAuLi50aGlzLl9sb2NhbGVQcm92aWRlclNlcnZpY2UuZ2V0TG9jYWxlU3ViT2JqKCdDYWxlbmRhcicpIH0gYXMgTW9kZWxzLkxvY2FsZTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEhvc3RCaW5kaW5nLFxuICBUZW1wbGF0ZVJlZixcbiAgRXZlbnRFbWl0dGVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kZWxzIH0gZnJvbSAnLi4vZGF0ZS9EYXRhVHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdDYWxlbmRhckhlYWRlciwgbnptLWNhbGVuZGFyLWhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEhlYWRlckNvbXBvbmVudCB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGNsb3NlSWNvbl9jb21wb25lbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2xlYXJJY29uOiBhbnk7XG5cbiAgcHJpdmF0ZSBfbG9jYWxlOiBNb2RlbHMuTG9jYWxlO1xuICBwcml2YXRlIF9zaG93Q2xlYXI6IGJvb2xlYW47XG4gIHByaXZhdGUgX2Nsb3NlSWNvbjogYW55ID0gJ1gnO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBsb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgfVxuICBzZXQgbG9jYWxlKHZhbHVlKSB7XG4gICAgdGhpcy5fbG9jYWxlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGNsb3NlSWNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xvc2VJY29uO1xuICB9XG4gIHNldCBjbG9zZUljb24odmFsdWU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikge1xuICAgICAgdGhpcy5fY2xvc2VJY29uID0gdmFsdWU7XG4gICAgICB0aGlzLmNsb3NlSWNvbl9jb21wb25lbnQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jbG9zZUljb24gPSA8c3RyaW5nPnZhbHVlO1xuICAgICAgdGhpcy5jbG9zZUljb25fY29tcG9uZW50ID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBzaG93Q2xlYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dDbGVhcjtcbiAgfVxuICBzZXQgc2hvd0NsZWFyKHZhbHVlKSB7XG4gICAgdGhpcy5fc2hvd0NsZWFyID0gdmFsdWU7XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2FuY2VsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25DbGVhcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhlYWRlcicpIGhlYWRlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHRyaWdnZXJDYW5jZWwoKSB7XG4gICAgdGhpcy5vbkNhbmNlbCAmJiB0aGlzLm9uQ2FuY2VsLmVtaXQoKTtcbiAgfVxuXG4gIHRyaWdnZXJDbGVhcigpIHtcbiAgICB0aGlzLm9uQ2xlYXIgJiYgdGhpcy5vbkNsZWFyLmVtaXQoKTtcbiAgfVxuXG59XG4iLCJleHBvcnQgbmFtZXNwYWNlIE1vZGVscyB7XG4gIGV4cG9ydCBlbnVtIFNlbGVjdFR5cGUge1xuICAgIE5vbmUsXG4gICAgU2luZ2xlLFxuICAgIEFsbCxcbiAgICBPbmx5LFxuICAgIFN0YXJ0LFxuICAgIE1pZGRsZSxcbiAgICBFbmQsXG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIExvY2FsZSB7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICB0b2RheTogc3RyaW5nO1xuICAgIG1vbnRoOiBzdHJpbmc7XG4gICAgeWVhcjogc3RyaW5nO1xuICAgIGFtOiBzdHJpbmc7XG4gICAgcG06IHN0cmluZztcbiAgICBkYXRlRm9ybWF0OiBzdHJpbmc7XG4gICAgZGF0ZVRpbWVGb3JtYXQ6IHN0cmluZztcbiAgICBub0Nob29zZTogc3RyaW5nO1xuICAgIHdlZWs6IHN0cmluZ1tdO1xuICAgIGNsZWFyOiBzdHJpbmc7XG4gICAgc2VsZWN0VGltZTogc3RyaW5nO1xuICAgIHNlbGVjdFN0YXJ0VGltZTogc3RyaW5nO1xuICAgIHNlbGVjdEVuZFRpbWU6IHN0cmluZztcbiAgICBzdGFydDogc3RyaW5nO1xuICAgIGVuZDogc3RyaW5nO1xuICAgIGJlZ2luOiBzdHJpbmc7XG4gICAgb3Zlcjogc3RyaW5nO1xuICAgIGJlZ2luX292ZXI6IHN0cmluZztcbiAgICBjb25maXJtOiBzdHJpbmc7XG4gICAgbW9udGhUaXRsZTogc3RyaW5nO1xuICAgIGxvYWRQcmV2TW9udGg6IHN0cmluZztcbiAgICB5ZXN0ZXJkYXk6IHN0cmluZztcbiAgICBsYXN0V2Vlazogc3RyaW5nO1xuICAgIGxhc3RNb250aDogc3RyaW5nO1xuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBDZWxsRGF0YSB7XG4gICAgdGljazogbnVtYmVyO1xuICAgIGRheU9mTW9udGg6IG51bWJlcjtcbiAgICBzZWxlY3RlZDogU2VsZWN0VHlwZTtcbiAgICBpc0ZpcnN0T2ZNb250aDogYm9vbGVhbjtcbiAgICBpc0xhc3RPZk1vbnRoOiBib29sZWFuO1xuICAgIG91dE9mRGF0ZTogYm9vbGVhbjtcbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgRXh0cmFEYXRhIHtcbiAgICBpbmZvPzogc3RyaW5nO1xuICAgIGRpc2FibGU/OiBib29sZWFuO1xuICAgIGNlbGxDbHM/OiBhbnk7XG4gICAgY2VsbFJlbmRlcj86IGFueTtcbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgTW9udGhEYXRhIHtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGZpcnN0RGF0ZTogRGF0ZTtcbiAgICBsYXN0RGF0ZTogRGF0ZTtcbiAgICB3ZWVrczogTW9kZWxzLkNlbGxEYXRhW11bXTtcbiAgICBjb21wb25lbnQ/OiBhbnk7XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIHk/OiBudW1iZXI7XG4gICAgdXBkYXRlTGF5b3V0PzogRnVuY3Rpb247XG4gICAgY29tcG9uZW50UmVmPzogYW55O1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbHMgfSBmcm9tICcuLi9kYXRlL0RhdGFUeXBlcyc7XG5pbXBvcnQgUHJvcHNUeXBlIGZyb20gJy4vZGF0ZXBpY2tlci5wcm9wcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IGRlZmF1bHRMb2NhbGUgZnJvbSAnLi4vbG9jYWxlL3poX0NOJztcblxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZVR5cGUge1xuICBtb250aHM6IE1vZGVscy5Nb250aERhdGFbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0ZVBpY2tlciB7XG4gIHByb3BzID0ge1xuICAgIHByZWZpeENsczogJ3JtYy1jYWxlbmRhcicsXG4gICAgaW5maW5pdGU6IGZhbHNlLFxuICAgIGluZmluaXRlT3B0OiBmYWxzZSxcbiAgICBkZWZhdWx0RGF0ZTogbmV3IERhdGUoKSxcbiAgICBpbml0YWxNb250aHM6IDYsXG4gICAgbG9jYWxlOiBkZWZhdWx0TG9jYWxlXG4gIH0gYXMgUHJvcHNUeXBlO1xuXG4gIHN0YXRlOiBhbnkgPSB7XG4gICAgbW9udGhzOiBbXVxuICB9O1xuXG4gIHZpc2libGVNb250aDogTW9kZWxzLk1vbnRoRGF0YVtdID0gW107XG4gIGdlbk1vbnRoQ29tcG9uZW50OiAoZGF0YSkgPT4ge307XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGluaXQoKSB7XG4gICAgY29uc3QgeyBpbml0YWxNb250aHMgPSA2LCBkZWZhdWx0RGF0ZSB9ID0gdGhpcy5wcm9wcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluaXRhbE1vbnRoczsgaSsrKSB7XG4gICAgICB0aGlzLmNhbkxvYWROZXh0KCkgJiYgdGhpcy5nZW5Nb250aERhdGEoZGVmYXVsdERhdGUsIGkpO1xuICAgIH1cbiAgICB0aGlzLnZpc2libGVNb250aCA9IFsuLi50aGlzLnN0YXRlLm1vbnRoc107XG4gIH1cblxuICByZWNlaXZlUHJvcHMob2xkVmFsdWU6IFByb3BzVHlwZSwgbmV3VmFsdWU6IFByb3BzVHlwZSkge1xuICAgIGlmIChvbGRWYWx1ZSAmJiBuZXdWYWx1ZSkge1xuICAgICAgaWYgKG9sZFZhbHVlLnN0YXJ0RGF0ZSAhPT0gbmV3VmFsdWUuc3RhcnREYXRlIHx8IG9sZFZhbHVlLmVuZERhdGUgIT09IG5ld1ZhbHVlLmVuZERhdGUpIHtcbiAgICAgICAgaWYgKG9sZFZhbHVlLnN0YXJ0RGF0ZSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZVJhbmdlKG9sZFZhbHVlLnN0YXJ0RGF0ZSwgb2xkVmFsdWUuZW5kRGF0ZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld1ZhbHVlLnN0YXJ0RGF0ZSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZVJhbmdlKG5ld1ZhbHVlLnN0YXJ0RGF0ZSwgbmV3VmFsdWUuZW5kRGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRNb250aERhdGUoZGF0ZSA9IG5ldyBEYXRlKCksIGFkZE1vbnRoID0gMCkge1xuICAgIGNvbnN0IHkgPSBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBtID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIHJldHVybiB7XG4gICAgICBmaXJzdERhdGU6IG5ldyBEYXRlKHksIG0gKyBhZGRNb250aCwgMSksXG4gICAgICBsYXN0RGF0ZTogbmV3IERhdGUoeSwgbSArIDEgKyBhZGRNb250aCwgMClcbiAgICB9O1xuICB9XG5cbiAgY2FuTG9hZFByZXYoKSB7XG4gICAgY29uc3QgeyBtaW5EYXRlIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICAhbWluRGF0ZSB8fFxuICAgICAgdGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoIDw9IDAgfHxcbiAgICAgICt0aGlzLmdldE1vbnRoRGF0ZShtaW5EYXRlKS5maXJzdERhdGUgPCArdGhpcy5zdGF0ZS5tb250aHNbMF0uZmlyc3REYXRlXG4gICAgKTtcbiAgfVxuXG4gIGNhbkxvYWROZXh0KCkge1xuICAgIGNvbnN0IHsgbWF4RGF0ZSB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgIW1heERhdGUgfHxcbiAgICAgIHRoaXMuc3RhdGUubW9udGhzLmxlbmd0aCA8PSAwIHx8XG4gICAgICArdGhpcy5nZXRNb250aERhdGUobWF4RGF0ZSkuZmlyc3REYXRlID4gK3RoaXMuc3RhdGUubW9udGhzW3RoaXMuc3RhdGUubW9udGhzLmxlbmd0aCAtIDFdLmZpcnN0RGF0ZVxuICAgICk7XG4gIH1cblxuICBnZXREYXRlV2l0aG91dFRpbWUgPSAoZGF0ZT86IERhdGUpID0+IHtcbiAgICBpZiAoIWRhdGUpIHJldHVybiAwO1xuICAgIHJldHVybiArbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTtcbiAgfTtcblxuICBnZW5XZWVrRGF0YSA9IChmaXJzdERhdGU6IERhdGUpID0+IHtcbiAgICBjb25zdCBtaW5EYXRlVGltZSA9IHRoaXMuZ2V0RGF0ZVdpdGhvdXRUaW1lKHRoaXMucHJvcHMubWluRGF0ZSk7XG4gICAgY29uc3QgbWF4RGF0ZVRpbWUgPSB0aGlzLmdldERhdGVXaXRob3V0VGltZSh0aGlzLnByb3BzLm1heERhdGUpIHx8IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICAgIGNvbnN0IHdlZWtzOiBNb2RlbHMuQ2VsbERhdGFbXVtdID0gW107XG4gICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5nZXRNb250aERhdGUoZmlyc3REYXRlLCAxKS5maXJzdERhdGU7XG4gICAgbGV0IGN1cnJlbnREYXkgPSBmaXJzdERhdGU7XG4gICAgbGV0IGN1cnJlbnRXZWVrOiBNb2RlbHMuQ2VsbERhdGFbXSA9IFtdO1xuICAgIHdlZWtzLnB1c2goY3VycmVudFdlZWspO1xuXG4gICAgbGV0IHN0YXJ0V2Vla2RheSA9IGN1cnJlbnREYXkuZ2V0RGF5KCk7XG4gICAgaWYgKHN0YXJ0V2Vla2RheSA+IDApIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhcnRXZWVrZGF5OyBpKyspIHtcbiAgICAgICAgY3VycmVudFdlZWsucHVzaCh7fSBhcyBNb2RlbHMuQ2VsbERhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAoY3VycmVudERheSA8IG5leHRNb250aCkge1xuICAgICAgaWYgKGN1cnJlbnRXZWVrLmxlbmd0aCA9PT0gNykge1xuICAgICAgICBjdXJyZW50V2VlayA9IFtdO1xuICAgICAgICB3ZWVrcy5wdXNoKGN1cnJlbnRXZWVrKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRheU9mTW9udGggPSBjdXJyZW50RGF5LmdldERhdGUoKTtcbiAgICAgIGNvbnN0IHRpY2sgPSArY3VycmVudERheTtcbiAgICAgIGN1cnJlbnRXZWVrLnB1c2goe1xuICAgICAgICB0aWNrLFxuICAgICAgICBkYXlPZk1vbnRoLFxuICAgICAgICBzZWxlY3RlZDogTW9kZWxzLlNlbGVjdFR5cGUuTm9uZSxcbiAgICAgICAgaXNGaXJzdE9mTW9udGg6IGRheU9mTW9udGggPT09IDEsXG4gICAgICAgIGlzTGFzdE9mTW9udGg6IGZhbHNlLFxuICAgICAgICBvdXRPZkRhdGU6IHRpY2sgPCBtaW5EYXRlVGltZSB8fCB0aWNrID4gbWF4RGF0ZVRpbWVcbiAgICAgIH0pO1xuICAgICAgY3VycmVudERheSA9IG5ldyBEYXRlKGN1cnJlbnREYXkuZ2V0VGltZSgpICsgMzYwMCAqIDI0ICogMTAwMCk7XG4gICAgfVxuICAgIGN1cnJlbnRXZWVrW2N1cnJlbnRXZWVrLmxlbmd0aCAtIDFdLmlzTGFzdE9mTW9udGggPSB0cnVlO1xuICAgIHJldHVybiB3ZWVrcztcbiAgfTtcblxuICBnZW5Nb250aERhdGEoZGF0ZT86IERhdGUsIGFkZE1vbnRoOiBudW1iZXIgPSAwKSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICBkYXRlID0gYWRkTW9udGggPj0gMCA/IHRoaXMuc3RhdGUubW9udGhzW3RoaXMuc3RhdGUubW9udGhzLmxlbmd0aCAtIDFdLmZpcnN0RGF0ZSA6IHRoaXMuc3RhdGUubW9udGhzWzBdLmZpcnN0RGF0ZTtcbiAgICB9XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICBkYXRlID0gbmV3IERhdGUoKTtcbiAgICB9XG4gICAgY29uc3QgeyBsb2NhbGUgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBmaXJzdERhdGUsIGxhc3REYXRlIH0gPSB0aGlzLmdldE1vbnRoRGF0ZShkYXRlLCBhZGRNb250aCk7XG4gICAgY29uc3Qgd2Vla3MgPSB0aGlzLmdlbldlZWtEYXRhKGZpcnN0RGF0ZSk7XG4gICAgY29uc3QgdGl0bGUgPSBmb3JtYXREYXRlKGZpcnN0RGF0ZSwgbG9jYWxlID8gbG9jYWxlLm1vbnRoVGl0bGUgOiAneXl5eS9NTScsIHRoaXMucHJvcHMubG9jYWxlKTtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgdGl0bGUsXG4gICAgICBmaXJzdERhdGUsXG4gICAgICBsYXN0RGF0ZSxcbiAgICAgIHdlZWtzXG4gICAgfSBhcyBNb2RlbHMuTW9udGhEYXRhO1xuICAgIGRhdGEuY29tcG9uZW50ID0gdGhpcy5nZW5Nb250aENvbXBvbmVudChkYXRhKTtcbiAgICBpZiAoYWRkTW9udGggPj0gMCkge1xuICAgICAgdGhpcy5zdGF0ZS5tb250aHMucHVzaChkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZS5tb250aHMudW5zaGlmdChkYXRhKTtcbiAgICB9XG4gICAgY29uc3QgeyBzdGFydERhdGUsIGVuZERhdGUgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKHN0YXJ0RGF0ZSkge1xuICAgICAgdGhpcy5zZWxlY3REYXRlUmFuZ2Uoc3RhcnREYXRlLCBlbmREYXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBpbkRhdGUoZGF0ZTogbnVtYmVyLCB0aWNrOiBudW1iZXIpIHtcbiAgICByZXR1cm4gZGF0ZSA8PSB0aWNrICYmIHRpY2sgPCBkYXRlICsgMjQgKiAzNjAwMDAwO1xuICB9XG5cbiAgc2VsZWN0RGF0ZVJhbmdlID0gKHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZT86IERhdGUsIGNsZWFyID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCB7IGdldERhdGVFeHRyYSwgdHlwZSwgb25TZWxlY3RIYXNEaXNhYmxlRGF0ZSB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAodHlwZSA9PT0gJ29uZScpIHtcbiAgICAgIGVuZERhdGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHRpbWUxID0gdGhpcy5nZXREYXRlV2l0aG91dFRpbWUoc3RhcnREYXRlKSxcbiAgICAgIHRpbWUyID0gdGhpcy5nZXREYXRlV2l0aG91dFRpbWUoZW5kRGF0ZSk7XG4gICAgY29uc3Qgc3RhcnREYXRlVGljayA9ICF0aW1lMiB8fCB0aW1lMSA8IHRpbWUyID8gdGltZTEgOiB0aW1lMjtcbiAgICBjb25zdCBlbmREYXRlVGljayA9IHRpbWUyICYmIHRpbWUxID4gdGltZTIgPyB0aW1lMSA6IHRpbWUyO1xuXG4gICAgY29uc3Qgc3RhcnRNb250aERhdGUgPSB0aGlzLmdldE1vbnRoRGF0ZShuZXcgRGF0ZShzdGFydERhdGVUaWNrKSkuZmlyc3REYXRlO1xuICAgIGNvbnN0IGVuZE1vbnRoRGF0ZSA9IGVuZERhdGVUaWNrID8gbmV3IERhdGUoZW5kRGF0ZVRpY2spIDogdGhpcy5nZXRNb250aERhdGUobmV3IERhdGUoc3RhcnREYXRlVGljaykpLmxhc3REYXRlO1xuXG4gICAgbGV0IHVudXNlYWJsZTogbnVtYmVyW10gPSBbXSxcbiAgICAgIG5lZWRVcGRhdGUgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXRlLm1vbnRoc1xuICAgICAgLmZpbHRlcihtID0+IHtcbiAgICAgICAgcmV0dXJuIG0uZmlyc3REYXRlID49IHN0YXJ0TW9udGhEYXRlICYmIG0uZmlyc3REYXRlIDw9IGVuZE1vbnRoRGF0ZTtcbiAgICAgIH0pXG4gICAgICAuZm9yRWFjaChtID0+IHtcbiAgICAgICAgbS53ZWVrcy5mb3JFYWNoKHcgPT5cbiAgICAgICAgICB3XG4gICAgICAgICAgICAuZmlsdGVyKGQgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWVuZERhdGVUaWNrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQudGljayAmJiB0aGlzLmluRGF0ZShzdGFydERhdGVUaWNrLCBkLnRpY2spO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBkLnRpY2sgJiYgZC50aWNrID49IHN0YXJ0RGF0ZVRpY2sgJiYgZC50aWNrIDw9IGVuZERhdGVUaWNrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZvckVhY2goZCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gZC5zZWxlY3RlZDtcbiAgICAgICAgICAgICAgaWYgKGNsZWFyKSB7XG4gICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IE1vZGVscy5TZWxlY3RUeXBlLk5vbmU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IChnZXREYXRlRXh0cmEgJiYgZ2V0RGF0ZUV4dHJhKG5ldyBEYXRlKGQudGljaykpKSB8fCB7fTtcbiAgICAgICAgICAgICAgICBpZiAoZC5vdXRPZkRhdGUgfHwgaW5mby5kaXNhYmxlKSB7XG4gICAgICAgICAgICAgICAgICB1bnVzZWFibGUucHVzaChkLnRpY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbkRhdGUoc3RhcnREYXRlVGljaywgZC50aWNrKSkge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGQuc2VsZWN0ZWQgPSBNb2RlbHMuU2VsZWN0VHlwZS5TaW5nbGU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFlbmREYXRlVGljaykge1xuICAgICAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gTW9kZWxzLlNlbGVjdFR5cGUuT25seTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnREYXRlVGljayAhPT0gZW5kRGF0ZVRpY2spIHtcbiAgICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IE1vZGVscy5TZWxlY3RUeXBlLlN0YXJ0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IE1vZGVscy5TZWxlY3RUeXBlLkFsbDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5EYXRlKGVuZERhdGVUaWNrLCBkLnRpY2spKSB7XG4gICAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gTW9kZWxzLlNlbGVjdFR5cGUuRW5kO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gTW9kZWxzLlNlbGVjdFR5cGUuTWlkZGxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBuZWVkVXBkYXRlID0gbmVlZFVwZGF0ZSB8fCBkLnNlbGVjdGVkICE9PSBvbGRWYWx1ZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmIChuZWVkVXBkYXRlICYmIG0uY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgbS5jb21wb25lbnRSZWYudXBkYXRlV2Vla3MoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgaWYgKHVudXNlYWJsZS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAob25TZWxlY3RIYXNEaXNhYmxlRGF0ZSkge1xuICAgICAgICBvblNlbGVjdEhhc0Rpc2FibGVEYXRlKHVudXNlYWJsZS5tYXAodGljayA9PiBuZXcgRGF0ZSh0aWNrKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdVbnVzYWJsZSBkYXRlLiBZb3UgY2FuIGhhbmRsZSBieSBvblNlbGVjdEhhc0Rpc2FibGVEYXRlLicsIHVudXNlYWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbXB1dGVWaXNpYmxlID0gKGNsaWVudEhlaWdodDogbnVtYmVyLCBzY3JvbGxUb3A6IG51bWJlcikgPT4ge1xuICAgIGxldCBuZWVkVXBkYXRlID0gZmFsc2U7XG4gICAgY29uc3QgTUFYX1ZJRVdfUE9SVCA9IGNsaWVudEhlaWdodCAqIDI7XG4gICAgY29uc3QgTUlOX1ZJRVdfUE9SVCA9IGNsaWVudEhlaWdodDtcblxuICAgIC8vIMOlwqTCp8OnwrzCk8OlwobCssOlwozCusOlwqTClsOowr/Ch8OmwrvCpMOowqfChMOlwojCmVxuICAgIGNvbnN0IGZpbHRlckZ1bmMgPSAodm06IE1vZGVscy5Nb250aERhdGEpID0+XG4gICAgICB2bS55ICYmXG4gICAgICB2bS5oZWlnaHQgJiZcbiAgICAgICh2bS55ICsgdm0uaGVpZ2h0ID4gc2Nyb2xsVG9wIC0gTUFYX1ZJRVdfUE9SVCAmJiB2bS55IDwgc2Nyb2xsVG9wICsgY2xpZW50SGVpZ2h0ICsgTUFYX1ZJRVdfUE9SVCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5pbmZpbml0ZU9wdCAmJiB0aGlzLnZpc2libGVNb250aC5sZW5ndGggPiAxMikge1xuICAgICAgdGhpcy52aXNpYmxlTW9udGggPSB0aGlzLnZpc2libGVNb250aC5maWx0ZXIoZmlsdGVyRnVuYykuc29ydCgoYSwgYikgPT4gK2EuZmlyc3REYXRlIC0gK2IuZmlyc3REYXRlKTtcbiAgICB9XG5cbiAgICAvLyDDpcK9wpPDpcKwwo/Dp8K8wpPDpcKGwrLDpcKMwrrDpMK4wo3DpsK7wqHDpsKXwrbDpcKhwqvDpcKFwoVcbiAgICBpZiAodGhpcy52aXNpYmxlTW9udGgubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFzdCA9IHRoaXMudmlzaWJsZU1vbnRoW3RoaXMudmlzaWJsZU1vbnRoLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGxhc3QueSAhPT0gdW5kZWZpbmVkICYmIGxhc3QuaGVpZ2h0ICYmIGxhc3QueSArIGxhc3QuaGVpZ2h0IDwgc2Nyb2xsVG9wICsgY2xpZW50SGVpZ2h0ICsgTUlOX1ZJRVdfUE9SVCkge1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSB0aGlzLnN0YXRlLm1vbnRocy5pbmRleE9mKGxhc3QpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAyOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGxhc3RJbmRleCArIGk7XG4gICAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoICYmIHRoaXMudmlzaWJsZU1vbnRoLmluZGV4T2YodGhpcy5zdGF0ZS5tb250aHNbaW5kZXhdKSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZU1vbnRoLnB1c2godGhpcy5zdGF0ZS5tb250aHNbaW5kZXhdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYW5Mb2FkTmV4dCgpICYmIHRoaXMuZ2VuTW9udGhEYXRhKHVuZGVmaW5lZCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5lZWRVcGRhdGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXJzdCA9IHRoaXMudmlzaWJsZU1vbnRoWzBdO1xuICAgICAgaWYgKGZpcnN0LnkgIT09IHVuZGVmaW5lZCAmJiBmaXJzdC5oZWlnaHQgJiYgZmlyc3QueSA+IHNjcm9sbFRvcCAtIE1JTl9WSUVXX1BPUlQpIHtcbiAgICAgICAgY29uc3QgZmlyc3RJbmRleCA9IHRoaXMuc3RhdGUubW9udGhzLmluZGV4T2YoZmlyc3QpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAyOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGZpcnN0SW5kZXggLSBpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIHRoaXMudmlzaWJsZU1vbnRoLmluZGV4T2YodGhpcy5zdGF0ZS5tb250aHNbaW5kZXhdKSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZU1vbnRoLnVuc2hpZnQodGhpcy5zdGF0ZS5tb250aHNbaW5kZXhdKTtcbiAgICAgICAgICAgIG5lZWRVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy52aXNpYmxlTW9udGggPSB0aGlzLnN0YXRlLm1vbnRocy5maWx0ZXIoZmlsdGVyRnVuYyk7XG4gICAgICBuZWVkVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmVlZFVwZGF0ZTtcbiAgfTtcblxuICBjcmVhdGVPblNjcm9sbCA9ICgpID0+IHtcbiAgICAvLyBsZXQgdGltZXI6IGFueTtcbiAgICBsZXQgY2xpZW50SGVpZ2h0ID0gMCxcbiAgICAgIHNjcm9sbFRvcCA9IDA7XG5cbiAgICByZXR1cm4gKGRhdGE6IHsgZnVsbDogbnVtYmVyOyBjbGllbnQ6IG51bWJlcjsgdG9wOiBudW1iZXIgfSkgPT4ge1xuICAgICAgY29uc3QgeyBjbGllbnQsIHRvcCB9ID0gZGF0YTtcbiAgICAgIGNsaWVudEhlaWdodCA9IGNsaWVudDtcbiAgICAgIHNjcm9sbFRvcCA9IHRvcDtcblxuICAgICAgdGhpcy5jb21wdXRlVmlzaWJsZShjbGllbnRIZWlnaHQsIHNjcm9sbFRvcCk7XG5cbiAgICAgIC8vIMOkwrvCpcOkwrjCisOmwpbCucOmwrPClcOnwpvCrsOlwonCjcOmwpfCoMOpwpfCrsOpwqLCmMOvwrzCjMOlwqbCgsOmwp7CnMOlwpDCjsOnwrvCrcOmwpzCicOmwoDCp8OowoPCvcOpwpfCrsOpwqLCmMOvwrzCjMOmwpTCucOnwpTCqMOlwqbCgsOkwrjCi8OmwpbCucOmwrPClcOvwrzCjMOkwr3ChsOkwrvCpcOkwrjCi8OmwpbCucOmwrPClcOkwrzCmsOlwq/CvMOowofCtMOlwojCt8OmwpbCsMOnwqjCjcOlwr7CrsOlwrvCtsOowr/Cn8Onwo7CsMOowrHCoVxuXG4gICAgICAvLyBpZiAodGltZXIpIHtcbiAgICAgIC8vICAgcmV0dXJuO1xuICAgICAgLy8gfVxuICAgICAgLy9cbiAgICAgIC8vIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyAgIHRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgLy9cbiAgICAgIC8vICAgaWYgKHRoaXMuY29tcHV0ZVZpc2libGUoY2xpZW50SGVpZ2h0LCBzY3JvbGxUb3ApKSB7XG4gICAgICAvLyAgICAgY29uc29sZS5sb2coJ3VwZGF0ZSBkb20nKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfSwgNTApO1xuICAgIH07XG4gIH07XG5cbiAgYmFzZU9uQ2VsbENsaWNrID0gKGRheTogTW9kZWxzLkNlbGxEYXRhKSA9PiB7XG4gICAgaWYgKCFkYXkudGljaykgcmV0dXJuO1xuICAgIHRoaXMucHJvcHMub25DZWxsQ2xpY2sgJiYgdGhpcy5wcm9wcy5vbkNlbGxDbGljayhuZXcgRGF0ZShkYXkudGljaykpO1xuICB9O1xuXG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9uLCBJbnB1dCwgRWxlbWVudFJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RlbHMgfSBmcm9tICcuLi9kYXRlL0RhdGFUeXBlcyc7XG5pbXBvcnQgRGF0ZVBpY2tlciBmcm9tICcuL2RhdGVwaWNrZXIuYmFzZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdDYWxlbmRhckRhdGVQaWNrZXIsIG56bS1jYWxlbmRhci1kYXRlLXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VyQ29tcG9uZW50IGV4dGVuZHMgRGF0ZVBpY2tlciBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICB0cmFuc2Zvcm06IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9wYW5lbDogYW55O1xuICBwcml2YXRlIF9pbml0RGVsdGE6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RZOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9kZWx0YTogbnVtYmVyID0gdGhpcy5faW5pdERlbHRhO1xuXG4gIEBWaWV3Q2hpbGQoJ2xheW91dCcpXG4gIGxheW91dERvbTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncGFuZWwnKVxuICBwYW5lbERvbTogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKVxuICBzZXQgb25DZWxsQ2xpY2sodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLm9uQ2VsbENsaWNrID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGVuZERhdGUodmFsdWUpIHtcbiAgICBjb25zdCBvbGRQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMpO1xuICAgIHRoaXMucHJvcHMuZW5kRGF0ZSA9IHZhbHVlO1xuICAgIHRoaXMucmVjZWl2ZVByb3BzKG9sZFByb3BzLCB0aGlzLnByb3BzKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc3RhcnREYXRlKHZhbHVlKSB7XG4gICAgY29uc3Qgb2xkUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3BzKTtcbiAgICB0aGlzLnByb3BzLnN0YXJ0RGF0ZSA9IHZhbHVlO1xuICAgIHRoaXMucmVjZWl2ZVByb3BzKG9sZFByb3BzLCB0aGlzLnByb3BzKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcHJvcHNEYXRhKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcyA9IHtcbiAgICAgIC4uLnRoaXMucHJvcHMsXG4gICAgICAuLi52YWx1ZVxuICAgIH07XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG9uU2VsZWN0SGFzRGlzYWJsZURhdGUodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLm9uU2VsZWN0SGFzRGlzYWJsZURhdGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgb25MYXlvdXQodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLm9uTGF5b3V0ID0gdmFsdWU7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWNhbGVuZGFyJykgYW1DYWxlbmRhcjogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuZGF0ZS1waWNrZXInKSBkYXRlUGlja2VyOiBib29sZWFuID0gdHJ1ZTtcblxuICBnZW5Nb250aENvbXBvbmVudCA9IChkYXRhPzogTW9kZWxzLk1vbnRoRGF0YSkgPT4ge1xuICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgIHJldHVybiB7XG4gICAgICBtb250aERhdGE6IGRhdGEsXG4gICAgICBsb2NhbGU6IHRoaXMucHJvcHMubG9jYWxlLFxuICAgICAgcm93U2l6ZTogdGhpcy5wcm9wcy5yb3dTaXplLFxuICAgICAgb25DZWxsQ2xpY2s6IHRoaXMuYmFzZU9uQ2VsbENsaWNrLFxuICAgICAgZ2V0RGF0ZUV4dHJhOiB0aGlzLnByb3BzLmdldERhdGVFeHRyYSxcbiAgICAgIHJlZjogZG9tID0+IHtcbiAgICAgICAgZGF0YS5jb21wb25lbnRSZWYgPSBkb20gfHwgZGF0YS5jb21wb25lbnRSZWYgfHwgdW5kZWZpbmVkO1xuICAgICAgICBkYXRhLnVwZGF0ZUxheW91dCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbXB1dGVIZWlnaHQoZGF0YSwgZG9tKTtcbiAgICAgICAgfTtcbiAgICAgICAgZGF0YS51cGRhdGVMYXlvdXQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgY29tcHV0ZUhlaWdodCA9IChkYXRhOiBNb2RlbHMuTW9udGhEYXRhLCBzaW5nbGVNb250aCkgPT4ge1xuICAgIGlmIChzaW5nbGVNb250aCAmJiBzaW5nbGVNb250aC53cmFwcGVyRGl2RE9NKSB7XG4gICAgICBpZiAoIWRhdGEuaGVpZ2h0ICYmICFzaW5nbGVNb250aC53cmFwcGVyRGl2RE9NLmNsaWVudEhlaWdodCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29tcHV0ZUhlaWdodChkYXRhLCBzaW5nbGVNb250aCksIDUwMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRhdGEuaGVpZ2h0ID0gc2luZ2xlTW9udGgud3JhcHBlckRpdkRPTS5jbGllbnRIZWlnaHQgfHwgZGF0YS5oZWlnaHQgfHwgMDtcbiAgICAgIGRhdGEueSA9IHNpbmdsZU1vbnRoLndyYXBwZXJEaXZET00ub2Zmc2V0VG9wIHx8IGRhdGEueSB8fCAwO1xuICAgIH1cbiAgfVxuXG4gIHNldExheW91dCA9IChkb206IEhUTUxEaXZFbGVtZW50KSA9PiB7XG4gICAgaWYgKGRvbSkge1xuICAgICAgY29uc3QgeyBvbkxheW91dCB9ID0gdGhpcy5wcm9wcztcbiAgICAgIG9uTGF5b3V0ICYmIG9uTGF5b3V0KGRvbS5jbGllbnRIZWlnaHQpO1xuXG4gICAgICBjb25zdCBzY3JvbGxIYW5kbGVyID0gdGhpcy5jcmVhdGVPblNjcm9sbCgpO1xuICAgICAgZG9tLm9uc2Nyb2xsID0gZXZ0ID0+IHtcbiAgICAgICAgc2Nyb2xsSGFuZGxlcih7XG4gICAgICAgICAgY2xpZW50OiBkb20uY2xpZW50SGVpZ2h0LFxuICAgICAgICAgIGZ1bGw6IChldnQuY3VycmVudFRhcmdldCBhcyBIVE1MRGl2RWxlbWVudCkuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgIHRvcDogKGV2dC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxEaXZFbGVtZW50KS5zY3JvbGxUb3BcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHNldFBhbmVsID0gKGRvbTogSFRNTERpdkVsZW1lbnQpID0+IHtcbiAgICB0aGlzLl9wYW5lbCA9IGRvbTtcbiAgfVxuXG4gIG9uVG91Y2hTdGFydChldmVudCkge1xuICAgIHRoaXMuX2xhc3RZID0gZXZlbnQudG91Y2hlc1swXS5zY3JlZW5ZO1xuICAgIHRoaXMuX2RlbHRhID0gdGhpcy5faW5pdERlbHRhO1xuICB9XG5cbiAgb25Ub3VjaE1vdmUoZXZlbnQpIHtcbiAgICBjb25zdCBlbGUgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgIGNvbnN0IGlzUmVhY2hUb3AgPSBlbGUuc2Nyb2xsVG9wID09PSAwO1xuXG4gICAgaWYgKGlzUmVhY2hUb3ApIHtcbiAgICAgIHRoaXMuX2RlbHRhID0gZXZlbnQudG91Y2hlc1swXS5zY3JlZW5ZIC0gdGhpcy5fbGFzdFk7XG4gICAgICBpZiAodGhpcy5fZGVsdGEgPiAwKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLl9kZWx0YSA+IDgwKSB7XG4gICAgICAgICAgdGhpcy5fZGVsdGEgPSA4MDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZGVsdGEgPSAwO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRUcmFuc2Zvcm0odGhpcy5fcGFuZWwuc3R5bGUsIGB0cmFuc2xhdGUzZCgwLCR7dGhpcy5fZGVsdGF9cHgsMClgKTtcbiAgICB9XG4gIH1cblxuICBvblRvdWNoRW5kKGV2ZW50KSB7XG4gICAgdGhpcy5vbkZpbmlzaCgpO1xuICB9XG5cbiAgb25GaW5pc2goKSB7XG4gICAgaWYgKHRoaXMuX2RlbHRhID4gNDAgJiYgdGhpcy5jYW5Mb2FkUHJldigpKSB7XG4gICAgICB0aGlzLmdlbk1vbnRoRGF0YSh0aGlzLnN0YXRlLm1vbnRoc1swXS5maXJzdERhdGUsIC0xKTtcblxuICAgICAgdGhpcy52aXNpYmxlTW9udGggPSB0aGlzLnN0YXRlLm1vbnRocy5zbGljZSgwLCB0aGlzLnByb3BzLmluaXRhbE1vbnRocyk7XG5cbiAgICAgIHRoaXMuc3RhdGUubW9udGhzLmZvckVhY2gobSA9PiB7XG4gICAgICAgIG0udXBkYXRlTGF5b3V0ICYmIG0udXBkYXRlTGF5b3V0KCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZXRUcmFuc2Zvcm0odGhpcy5fcGFuZWwuc3R5bGUsIGB0cmFuc2xhdGUzZCgwLDAsMClgKTtcbiAgICB0aGlzLnNldFRyYW5zaXRpb24odGhpcy5fcGFuZWwuc3R5bGUsICcuM3MnKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3BhbmVsICYmIHRoaXMuc2V0VHJhbnNpdGlvbih0aGlzLl9wYW5lbC5zdHlsZSwgJycpO1xuICAgIH0sIDMwMCk7XG4gIH1cblxuICBzZXRUcmFuc2Zvcm0obm9kZVN0eWxlOiBDU1NTdHlsZURlY2xhcmF0aW9uLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB2YWx1ZTtcbiAgICBub2RlU3R5bGUudHJhbnNmb3JtID0gdmFsdWU7XG4gICAgbm9kZVN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHZhbHVlO1xuICB9XG5cbiAgc2V0VHJhbnNpdGlvbihub2RlU3R5bGU6IENTU1N0eWxlRGVjbGFyYXRpb24sIHZhbHVlOiBhbnkpIHtcbiAgICBub2RlU3R5bGUudHJhbnNpdGlvbiA9IHZhbHVlO1xuICAgIG5vZGVTdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gdmFsdWU7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgICB0aGlzLnNldExheW91dCh0aGlzLmxheW91dERvbS5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLnNldFBhbmVsKHRoaXMucGFuZWxEb20ubmF0aXZlRWxlbWVudCk7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgb2tUZXh0OiAnT2snLFxuICBkaXNtaXNzVGV4dDogJ0NhbmNlbCcsXG4gIGV4dHJhOiAncGxlYXNlIHNlbGVjdCcsXG59O1xuIiwiLy8gaW1wb3J0ICBEYXRlUGlja2VyTG9jYWxlIGZyb20gJ3JtYy1kYXRlLXBpY2tlci9saWIvbG9jYWxlL2VuX1VTJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBva1RleHQ6ICdPSycsXG4gIGRpc21pc3NUZXh0OiAnQ2FuY2VsJyxcbiAgZXh0cmE6ICdwbGVhc2Ugc2VsZWN0JyxcbiAgLy8gRGF0ZVBpY2tlckxvY2FsZSxcbiAgeWVhcjogJycsXG4gIG1vbnRoOiAnJyxcbiAgZGF5OiAnJyxcbiAgaG91cjogJycsXG4gIG1pbnV0ZTogJycsXG4gIGFtOiAnQU0nLFxuICBwbTogJ1BNJ1xufTtcbiIsIi8vIGltcG9ydCAgRGF0ZVBpY2tlckxvY2FsZSBmcm9tICdybWMtZGF0ZS1waWNrZXIvbGliL2xvY2FsZS9lbl9VUyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgb2tUZXh0OiAnT0snLFxuICBkaXNtaXNzVGV4dDogJ0NhbmNlbCcsXG4gIGV4dHJhOiAncGxlYXNlIHNlbGVjdCcsXG4gIC8vIERhdGVQaWNrZXJMb2NhbGUsXG4gIHllYXI6ICcnLFxuICBtb250aDogJycsXG4gIGRheTogJycsXG4gIGhvdXI6ICcnLFxuICBtaW51dGU6ICcnLFxuICBhbTogJ0FNJyxcbiAgcG06ICdQTSdcbn07XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIG9rVGV4dDogJ09rJyxcbiAgY2FuY2VsVGV4dDogJ0NhbmNlbCcsXG59O1xuIiwiZXhwb3J0IGRlZmF1bHQge1xuICBjYW5jZWxUZXh0OiAnQ2FuY2VsJyxcbn07XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIGNvbmZpcm1MYWJlbDogJ0RvbmUnLFxuICBiYWNrc3BhY2VMYWJlbDogJ0JhY2tzcGFjZScsXG4gIGNhbmNlbEtleWJvYXJkTGFiZWw6ICdDYW5jZWxLZXlib2FyZCcsXG59O1xuIiwiZXhwb3J0IGRlZmF1bHQge1xuICBwcmV2VGV4dDogJ1ByZXYnLFxuICBuZXh0VGV4dDogJ05leHQnLFxufTtcbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgYWN0aXZhdGVUZXh0OiAnUmVmcmVzaCBpbW1lZGlhdGVseSBhZnRlciByZWxlYXNlJyxcbiAgZGVhY3RpdmF0ZVRleHQ6ICdQdWxsIGRvd24gdG8gcmVmcmVzaCcsXG4gIGZpbmlzaFRleHQ6ICdGaW5pc2ggcmVmcmVzaCcsXG59O1xuIiwiaW1wb3J0IFBpY2tlciBmcm9tICcuLi8uLi9waWNrZXIvbG9jYWxlL2VuX1VTJztcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gJy4uLy4uL2RhdGUtcGlja2VyL2xvY2FsZS9lbl9VUyc7XG5pbXBvcnQgRGF0ZVBpY2tlclZpZXcgZnJvbSAnLi4vLi4vZGF0ZS1waWNrZXItdmlldy9sb2NhbGUvZW5fVVMnO1xuaW1wb3J0IE1lbnUgZnJvbSAnLi4vLi4vbWVudS9sb2NhbGUvZW5fVVMnO1xuaW1wb3J0IENhbGVuZGFyIGZyb20gJy4uLy4uL2NhbGVuZGFyL2xvY2FsZS9lbl9VUyc7XG5pbXBvcnQgU2VhcmNoQmFyIGZyb20gJy4uLy4uL3NlYXJjaC1iYXIvbG9jYWxlL2VuX1VTJztcbmltcG9ydCBJbnB1dEl0ZW0gZnJvbSAnLi4vLi4vaW5wdXQtaXRlbS9sb2NhbGUvZW5fVVMnO1xuaW1wb3J0IFBhZ2luYXRpb24gZnJvbSAnLi4vLi4vcGFnaW5hdGlvbi9sb2NhbGUvZW5fVVMnO1xuaW1wb3J0IFB1bGxUb1JlZnJlc2ggZnJvbSAnLi4vLi4vcHVsbC10by1yZWZyZXNoL2xvY2FsZS9lbl9VUyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbG9jYWxlOiAnZW5fVVMnLFxuICBQaWNrZXIsXG4gIERhdGVQaWNrZXIsXG4gIERhdGVQaWNrZXJWaWV3LFxuICBNZW51LFxuICBDYWxlbmRhcixcbiAgU2VhcmNoQmFyLFxuICBJbnB1dEl0ZW0sXG4gIFBhZ2luYXRpb24sXG4gIFB1bGxUb1JlZnJlc2hcbn07IiwiZXhwb3J0IGRlZmF1bHQge1xuICBva1RleHQ6ICfDkMKew5DCuicsXG4gIGRpc21pc3NUZXh0OiAnw5DCnsORwoLDkMK8w5DCtcOQwr3DkMKwJyxcbiAgZXh0cmE6ICcnLFxufTtcbiIsIi8vIGltcG9ydCBEYXRlUGlja2VyTG9jYWxlIGZyb20gJ3JtYy1kYXRlLXBpY2tlci9saWIvbG9jYWxlL2VuX1VTJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBva1RleHQ6ICfDkMKew5DCuicsXG4gIGRpc21pc3NUZXh0OiAnw5DCnsORwoLDkMK8w5DCtcOQwr3DkMKwJyxcbiAgZXh0cmE6ICcnLFxuICAvLyBEYXRlUGlja2VyTG9jYWxlLFxuICB5ZWFyOiAnJyxcbiAgbW9udGg6ICcnLFxuICBkYXk6ICcnLFxuICBob3VyOiAnJyxcbiAgbWludXRlOiAnJyxcbiAgYW06ICdBTScsXG4gIHBtOiAnUE0nXG59O1xuIiwiLy8gaW1wb3J0IERhdGVQaWNrZXJMb2NhbGUgZnJvbSAncm1jLWRhdGUtcGlja2VyL2xpYi9sb2NhbGUvZW5fVVMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG9rVGV4dDogJ8OQwp7DkMK6JyxcbiAgZGlzbWlzc1RleHQ6ICfDkMKew5HCgsOQwrzDkMK1w5DCvcOQwrAnLFxuICBleHRyYTogJycsXG4gIC8vIERhdGVQaWNrZXJMb2NhbGUsXG4gIHllYXI6ICcnLFxuICBtb250aDogJycsXG4gIGRheTogJycsXG4gIGhvdXI6ICcnLFxuICBtaW51dGU6ICcnLFxuICBhbTogJ0FNJyxcbiAgcG06ICdQTSdcbn07IiwiZXhwb3J0IGRlZmF1bHQge1xuICBva1RleHQ6ICfDkMKew5DCuicsXG4gIGNhbmNlbFRleHQ6ICfDkMKew5HCgsOQwrzDkMK1w5DCvcOQwrAnLFxufTtcbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgY2FuY2VsVGV4dDogJ8OQwp7DkcKCw5DCvMOQwrXDkMK9w5DCsCcsXG59O1xuIiwiZXhwb3J0IGRlZmF1bHQge1xuICBjb25maXJtTGFiZWw6ICfDkMKew5DCuicsXG4gIGJhY2tzcGFjZUxhYmVsOiAnw5DCssOQwr7DkMK3w5DCssORwoDDkMKww5HCgiDDkMK9w5DCsCDDkMK+w5DCtMOQwr3DkcKDIMOQwr/DkMK+w5DCt8OQwrjDkcKGw5DCuMORwo4nLFxuICBjYW5jZWxLZXlib2FyZExhYmVsOiAnw5DCnsORwoLDkMK8w5DCtcOQwr3DkMK4w5HCgsORwowgw5DCusOQwrvDkMKww5DCssOQwrjDkMKww5HCgsORwoPDkcKAw5HCgycsXG59O1xuIiwiZXhwb3J0IGRlZmF1bHQge1xuICBwcmV2VGV4dDogJ8OQwp3DkMKww5DCt8OQwrDDkMK0JyxcbiAgbmV4dFRleHQ6ICfDkMKSw5DCv8OQwrXDkcKAw5HCkcOQwrQnLFxufTtcbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgYWN0aXZhdGVUZXh0OiAnw5DCnsOQwrHDkMK9w5DCvsOQwrLDkMK4w5HCgsORwowgw5HCgcORwoDDkMKww5DCt8ORwoMgw5DCv8OQwr7DkcKBw5DCu8OQwrUgw5DCssORwovDkMK/w5HCg8ORwoHDkMK6w5DCsCcsXG4gIGRlYWN0aXZhdGVUZXh0OiAnw5DCn8OQwr7DkcKCw5HCj8OQwr3DkMK4w5HCgsOQwrUgw5DCssOQwr3DkMK4w5DCtywgw5HCh8ORwoLDkMK+w5DCscORwosgw5DCvsOQwrHDkMK9w5DCvsOQwrLDkMK4w5HCgsORwownLFxuICBmaW5pc2hUZXh0OiAnw5DCl8OQwrDDkMKyw5DCtcORwoDDkcKIw5DCuMORwoLDkcKMIMOQwr7DkMKxw5DCvcOQwr7DkMKyw5DCu8OQwrXDkMK9w5DCuMOQwrUnLFxufTtcbiIsImltcG9ydCBQaWNrZXIgZnJvbSAnLi4vLi4vcGlja2VyL2xvY2FsZS9ydV9SVSc7XG5pbXBvcnQgRGF0ZVBpY2tlciBmcm9tICcuLi8uLi9kYXRlLXBpY2tlci9sb2NhbGUvcnVfUlUnO1xuaW1wb3J0IERhdGVQaWNrZXJWaWV3IGZyb20gJy4uLy4uL2RhdGUtcGlja2VyLXZpZXcvbG9jYWxlL3J1X1JVJztcbmltcG9ydCBNZW51IGZyb20gJy4uLy4uL21lbnUvbG9jYWxlL3J1X1JVJztcbi8vIGltcG9ydCBDYWxlbmRhciBmcm9tICcuLi8uLi9jYWxlbmRhci9sb2NhbGUvcnVfUlUnO1xuaW1wb3J0IFNlYXJjaEJhciBmcm9tICcuLi8uLi9zZWFyY2gtYmFyL2xvY2FsZS9ydV9SVSc7XG5pbXBvcnQgSW5wdXRJdGVtIGZyb20gJy4uLy4uL2lucHV0LWl0ZW0vbG9jYWxlL3J1X1JVJztcbmltcG9ydCBQYWdpbmF0aW9uIGZyb20gJy4uLy4uL3BhZ2luYXRpb24vbG9jYWxlL3J1X1JVJztcbmltcG9ydCBQdWxsVG9SZWZyZXNoIGZyb20gJy4uLy4uL3B1bGwtdG8tcmVmcmVzaC9sb2NhbGUvcnVfUlUnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGxvY2FsZTogJ3J1X1JVJyxcbiAgUGlja2VyLFxuICBEYXRlUGlja2VyLFxuICBEYXRlUGlja2VyVmlldyxcbiAgTWVudSxcbiAgLy8gQ2FsZW5kYXIsXG4gIFNlYXJjaEJhcixcbiAgSW5wdXRJdGVtLFxuICBQYWdpbmF0aW9uLFxuICBQdWxsVG9SZWZyZXNoXG59OyIsImV4cG9ydCBkZWZhdWx0IHtcbiAgb2tUZXh0OiAnT2snLFxuICBkaXNtaXNzVGV4dDogJ0F2YnJ5dCcsXG4gIGV4dHJhOiAndsODwqRubGlnZW4gdsODwqRsaicsXG59O1xuIiwiLy8gaW1wb3J0IERhdGVQaWNrZXJMb2NhbGUgZnJvbSAncm1jLWRhdGUtcGlja2VyL2xpYi9sb2NhbGUvZW5fVVMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG9rVGV4dDogJ09rJyxcbiAgZGlzbWlzc1RleHQ6ICdBdmJyeXQnLFxuICBleHRyYTogJ3bDg8KkbmxpZ2VuIHbDg8KkbGonLFxuICAvLyBEYXRlUGlja2VyTG9jYWxlLFxuICB5ZWFyOiAnJyxcbiAgbW9udGg6ICcnLFxuICBkYXk6ICcnLFxuICBob3VyOiAnJyxcbiAgbWludXRlOiAnJyxcbiAgYW06ICdBTScsXG4gIHBtOiAnUE0nXG59O1xuIiwiLy8gaW1wb3J0IERhdGVQaWNrZXJMb2NhbGUgZnJvbSAncm1jLWRhdGUtcGlja2VyL2xpYi9sb2NhbGUvZW5fVVMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG9rVGV4dDogJ09rJyxcbiAgZGlzbWlzc1RleHQ6ICdBdmJyeXQnLFxuICBleHRyYTogJ3bDg8KkbmxpZ2VuIHbDg8KkbGonLFxuICAvLyBEYXRlUGlja2VyTG9jYWxlLFxuICB5ZWFyOiAnJyxcbiAgbW9udGg6ICcnLFxuICBkYXk6ICcnLFxuICBob3VyOiAnJyxcbiAgbWludXRlOiAnJyxcbiAgYW06ICdBTScsXG4gIHBtOiAnUE0nXG59OyIsImV4cG9ydCBkZWZhdWx0IHtcbiAgb2tUZXh0OiAnT2snLFxuICBjYW5jZWxUZXh0OiAnQXZicnl0Jyxcbn07XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIGNhbmNlbFRleHQ6ICdBdmJyeXQnLFxufTtcbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgY29uZmlybUxhYmVsOiAnT2snLFxuICBiYWNrc3BhY2VMYWJlbDogJ0JhY2tzcGFjZScsXG4gIGNhbmNlbEtleWJvYXJkTGFiZWw6ICdDYW5jZWxLZXlib2FyZCcsXG59O1xuIiwiZXhwb3J0IGRlZmF1bHQge1xuICBwcmV2VGV4dDogJ0bDg8K2cmVnJyxcbiAgbmV4dFRleHQ6ICdOw4PCpHN0YScsXG59O1xuIiwiZXhwb3J0IGRlZmF1bHQge1xuICBhY3RpdmF0ZVRleHQ6ICdVcHBkYXRlcmEgb21lZGVsYmFydCBlZnRlciB1dHNsw4PCpHBwJyxcbiAgZGVhY3RpdmF0ZVRleHQ6ICdEcmEgbmVyIGbDg8K2ciBhdHQgdXBwZGF0ZXJhJyxcbiAgZmluaXNoVGV4dDogJ0F2c2x1dGEgdXBwZGF0ZXJpbmdlbicsXG59O1xuIiwiaW1wb3J0IFBpY2tlciBmcm9tICcuLi8uLi9waWNrZXIvbG9jYWxlL3N2X1NFJztcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gJy4uLy4uL2RhdGUtcGlja2VyL2xvY2FsZS9zdl9TRSc7XG5pbXBvcnQgRGF0ZVBpY2tlclZpZXcgZnJvbSAnLi4vLi4vZGF0ZS1waWNrZXItdmlldy9sb2NhbGUvc3ZfU0UnO1xuaW1wb3J0IE1lbnUgZnJvbSAnLi4vLi4vbWVudS9sb2NhbGUvc3ZfU0UnO1xuLy8gaW1wb3J0IENhbGVuZGFyIGZyb20gJy4uLy4uL2NhbGVuZGFyL2xvY2FsZS9zdl9TRSc7XG5pbXBvcnQgU2VhcmNoQmFyIGZyb20gJy4uLy4uL3NlYXJjaC1iYXIvbG9jYWxlL3N2X1NFJztcbmltcG9ydCBJbnB1dEl0ZW0gZnJvbSAnLi4vLi4vaW5wdXQtaXRlbS9sb2NhbGUvc3ZfU0UnO1xuaW1wb3J0IFBhZ2luYXRpb24gZnJvbSAnLi4vLi4vcGFnaW5hdGlvbi9sb2NhbGUvc3ZfU0UnO1xuaW1wb3J0IFB1bGxUb1JlZnJlc2ggZnJvbSAnLi4vLi4vcHVsbC10by1yZWZyZXNoL2xvY2FsZS9zdl9TRSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbG9jYWxlOiAnc3ZfU0UnLFxuICBQaWNrZXIsXG4gIERhdGVQaWNrZXIsXG4gIERhdGVQaWNrZXJWaWV3LFxuICBNZW51LFxuICAvLyBDYWxlbmRhcixcbiAgU2VhcmNoQmFyLFxuICBJbnB1dEl0ZW0sXG4gIFBhZ2luYXRpb24sXG4gIFB1bGxUb1JlZnJlc2hcbn07IiwiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgSW5wdXQsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RlbHMgfSBmcm9tICcuLi9kYXRlL0RhdGFUeXBlcyc7XG5pbXBvcnQgeyB6aF9DTiwgZW5fVVMgfSBmcm9tICcuLi8uLi9sb2NhbGUtcHJvdmlkZXIvbGFuZ3VhZ2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBQcm9wc1R5cGUge1xuICBsb2NhbGU6IE1vZGVscy5Mb2NhbGU7XG4gIHByZWZpeENscz86IHN0cmluZztcbiAgcGlja2VyUHJlZml4Q2xzPzogc3RyaW5nO1xuICB0aXRsZT86IHN0cmluZztcbiAgZGVmYXVsdFZhbHVlPzogRGF0ZTtcbiAgdmFsdWU/OiBEYXRlO1xuICBvblZhbHVlQ2hhbmdlPzogKHRpbWU6IERhdGUpID0+IHZvaWQ7XG4gIG1vZGU/OiBzdHJpbmc7XG4gIG1pbkRhdGU/OiBEYXRlO1xuICBtYXhEYXRlPzogRGF0ZTtcbiAgY2xpZW50SGVpZ2h0PzogbnVtYmVyO1xuICBkYXRlUGlja2VyVmlld0xvY2FsZT86IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnQ2FsZW5kYXJUaW1lUGlja2VyLCBuem0tY2FsZW5kYXItdGltZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdGltZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgVGltZVBpY2tlckNvbXBvbmVudCB7XG4gIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBtaW5EYXRlOiBuZXcgRGF0ZSgwLCAwLCAwLCAwLCAwKSxcbiAgICBtYXhEYXRlOiBuZXcgRGF0ZSg5OTk5LCAxMSwgMzEsIDIzLCA1OSwgNTkpLFxuICAgIGRlZmF1bHRWYWx1ZTogbmV3IERhdGUoMjAwMCwgMSwgMSwgOCksXG4gICAgbW9kZTogJ3RpbWUnLFxuICAgIGRhdGVQaWNrZXJWaWV3TG9jYWxlOiB6aF9DTlxuICB9IGFzIFByb3BzVHlwZTtcblxuICBwcm9wcyA9IHtcbiAgICBtaW5EYXRlOiBuZXcgRGF0ZSgwLCAwLCAwLCAwLCAwKSxcbiAgICBtYXhEYXRlOiBuZXcgRGF0ZSg5OTk5LCAxMSwgMzEsIDIzLCA1OSwgNTkpLFxuICAgIGRlZmF1bHRWYWx1ZTogbmV3IERhdGUoMjAwMCwgMSwgMSwgOCksXG4gICAgbW9kZTogJ3RpbWUnLFxuICAgIGRhdGVQaWNrZXJWaWV3TG9jYWxlOiB6aF9DTlxuICB9IGFzIFByb3BzVHlwZTtcblxuICBzZWxmSGVpZ2h0OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgc2V0IHByb3BzRGF0YSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMgPSB7XG4gICAgICAuLi50aGlzLnByb3BzLFxuICAgICAgLi4udmFsdWVcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMucHJvcHMubG9jYWxlICYmIHRoaXMucHJvcHMubG9jYWxlLnRvZGF5ID09PSAnVG9kYXknKSB7XG4gICAgICB0aGlzLnByb3BzLmRhdGVQaWNrZXJWaWV3TG9jYWxlID0gZW5fVVM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMuZGF0ZVBpY2tlclZpZXdMb2NhbGUgPSB6aF9DTjtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHRpdGxlKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy50aXRsZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcHJlZml4Q2xzKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5wcmVmaXhDbHMgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZGVmYXVsdFZhbHVlKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcGlja2VyUHJlZml4Q2xzKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5waWNrZXJQcmVmaXhDbHMgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgY2xpZW50SGVpZ2h0KHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5jbGllbnRIZWlnaHQgPSB2YWx1ZTtcbiAgICBjb25zdCBoZWlnaHQgPSAodmFsdWUgJiYgKHZhbHVlICogMykgLyA4IC0gNTIpIHx8IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB0aGlzLnNlbGZIZWlnaHQgPSAoaGVpZ2h0ID4gMTY0IHx8IGhlaWdodCA8IDAgPyAxNjQgOiBoZWlnaHQpICsgJ3B4JztcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgb25WYWx1ZUNoYW5nZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMub25WYWx1ZUNoYW5nZSA9IHZhbHVlO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy50aW1lLXBpY2tlcicpXG4gIHRpbWVQaWNrZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBvbkRhdGVDaGFuZ2UgPSAoZGF0ZTogRGF0ZSkgPT4ge1xuICAgIGNvbnN0IHsgb25WYWx1ZUNoYW5nZSB9ID0gdGhpcy5wcm9wcztcbiAgICBvblZhbHVlQ2hhbmdlICYmIG9uVmFsdWVDaGFuZ2UoZGF0ZSk7XG4gIH1cblxuICBnZXRNaW5UaW1lKGRhdGU/OiBEYXRlKSB7XG4gICAgY29uc3QgbWluRGF0ZSA9IHRoaXMucHJvcHMubWluRGF0ZSBhcyBEYXRlO1xuICAgIGlmIChcbiAgICAgICFkYXRlIHx8XG4gICAgICBkYXRlLmdldEZ1bGxZZWFyKCkgPiBtaW5EYXRlLmdldEZ1bGxZZWFyKCkgfHxcbiAgICAgIGRhdGUuZ2V0TW9udGgoKSA+IG1pbkRhdGUuZ2V0TW9udGgoKSB8fFxuICAgICAgZGF0ZS5nZXREYXRlKCkgPiBtaW5EYXRlLmdldERhdGUoKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFByb3BzLm1pbkRhdGU7XG4gICAgfVxuICAgIHJldHVybiBtaW5EYXRlO1xuICB9XG5cbiAgZ2V0TWF4VGltZShkYXRlPzogRGF0ZSkge1xuICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLnByb3BzLm1heERhdGUgYXMgRGF0ZTtcbiAgICBpZiAoXG4gICAgICAhZGF0ZSB8fFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpIDwgbWF4RGF0ZS5nZXRGdWxsWWVhcigpIHx8XG4gICAgICBkYXRlLmdldE1vbnRoKCkgPCBtYXhEYXRlLmdldE1vbnRoKCkgfHxcbiAgICAgIGRhdGUuZ2V0RGF0ZSgpIDwgbWF4RGF0ZS5nZXREYXRlKClcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRQcm9wcy5tYXhEYXRlO1xuICAgIH1cbiAgICByZXR1cm4gbWF4RGF0ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0QmluZGluZywgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGVscyB9IGZyb20gJy4uL2RhdGUvRGF0YVR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnQ2FsZW5kYXJXZWVrUGFuZWwsIG56bS1jYWxlbmRhci13ZWVrLXBhbmVsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dlZWstcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFdlZWtQYW5lbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICB3ZWVrOiBzdHJpbmdbXSA9IFsnw6bCl8KlJywgJ8OkwrjCgCcsICfDpMK6wownLCAnw6TCuMKJJywgJ8OlwpvCmycsICfDpMK6wpQnLCAnw6XChcKtJ107XG5cbiAgcHJpdmF0ZSBfbG9jYWxlOiBNb2RlbHMuTG9jYWxlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBsb2NhbGUodmFsdWUpIHtcbiAgICB0aGlzLl9sb2NhbGUgPSB2YWx1ZTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3Mud2Vlay1wYW5lbCcpIHdlZWtQYW5lbDogYm9vbGVhbiA9IHRydWU7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy53ZWVrID0gdGhpcy5fbG9jYWxlLndlZWs7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIElucHV0LCBIb3N0QmluZGluZyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJy4uL3V0aWwvaW5kZXgnO1xuaW1wb3J0IHsgTW9kZWxzIH0gZnJvbSAnLi4vZGF0ZS9EYXRhVHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpcm1QYW5lbFByb3BzVHlwZSB7XG4gIHR5cGU/OiAnb25lJyB8ICdyYW5nZSc7XG4gIGxvY2FsZTogTW9kZWxzLkxvY2FsZTtcbiAgb25seUNvbmZpcm0/OiBib29sZWFuO1xuICBkaXNhYmxlQnRuPzogYm9vbGVhbjtcbiAgc3RhcnREYXRlVGltZT86IERhdGU7XG4gIGVuZERhdGVUaW1lPzogRGF0ZTtcbiAgZm9ybWF0U3RyPzogc3RyaW5nO1xuICBvbkNvbmZpcm06ICgpID0+IHZvaWQ7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0NhbGVuZGFyQ29uZmlybVBhbmVsLCBuem0tY2FsZW5kYXItY29uZmlybS1wYW5lbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb25maXJtLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcblxuZXhwb3J0IGNsYXNzIENvbmZpcm1QYW5lbENvbXBvbmVudCB7XG4gIHByb3BzID0ge1xuICAgIGZvcm1hdFN0cjogJ3l5eXktTU0tZGQgaGg6bW0nXG4gIH0gYXMgQ29uZmlybVBhbmVsUHJvcHNUeXBlO1xuICBzdGFydFRpbWVTdHI6IHN0cmluZztcbiAgZW5kVGltZVN0cjogc3RyaW5nO1xuICBidG5DbHM6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBzZXQgcHJvcHNEYXRhKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcyA9IHtcbiAgICAgIC4uLnRoaXMucHJvcHMsXG4gICAgICAuLi52YWx1ZVxuICAgIH07XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVCdG4odmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLmRpc2FibGVCdG4gPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZm9ybWF0U3RyKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5mb3JtYXRTdHIgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc3RhcnREYXRlVGltZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMuc3RhcnREYXRlVGltZSA9IHZhbHVlO1xuICAgIHRoaXMuZm9ybWF0VGltZSgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBlbmREYXRlVGltZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMuZW5kRGF0ZVRpbWUgPSB2YWx1ZTtcbiAgICB0aGlzLmZvcm1hdFRpbWUoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgb25Db25maXJtKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5vbkNvbmZpcm0gPSB2YWx1ZTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuY29uZmlybS1wYW5lbCcpIGNvbmZpcm1QYW5lOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgZm9ybWF0VGltZSgpIHtcbiAgICBjb25zdCB7IHR5cGUsIGxvY2FsZSwgZGlzYWJsZUJ0biB9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQgeyBzdGFydERhdGVUaW1lLCBlbmREYXRlVGltZSB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoc3RhcnREYXRlVGltZSAmJiBlbmREYXRlVGltZSAmJiArc3RhcnREYXRlVGltZSA+ICtlbmREYXRlVGltZSkge1xuICAgICAgY29uc3QgdG1wID0gc3RhcnREYXRlVGltZTtcbiAgICAgIHN0YXJ0RGF0ZVRpbWUgPSBlbmREYXRlVGltZTtcbiAgICAgIGVuZERhdGVUaW1lID0gdG1wO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRUaW1lU3RyID0gc3RhcnREYXRlVGltZSA/IHRoaXMuc2VsZkZvcm1hdERhdGUoc3RhcnREYXRlVGltZSkgOiBsb2NhbGUubm9DaG9vc2U7XG4gICAgdGhpcy5lbmRUaW1lU3RyID0gZW5kRGF0ZVRpbWUgPyB0aGlzLnNlbGZGb3JtYXREYXRlKGVuZERhdGVUaW1lKSA6IGxvY2FsZS5ub0Nob29zZTtcbiAgICBsZXQgYnRuQ2xzID0gZGlzYWJsZUJ0biA/ICdidXR0b24gYnV0dG9uLWRpc2FibGUnIDogJ2J1dHRvbic7XG4gICAgaWYgKHR5cGUgPT09ICdvbmUnKSB7XG4gICAgICBidG5DbHMgKz0gJyBidXR0b24tZnVsbCc7XG4gICAgfVxuICAgIHRoaXMuYnRuQ2xzID0gYnRuQ2xzO1xuICB9XG5cbiAgdHJpZ2dlckNvbmZpcm0gPSAoKSA9PiB7XG4gICAgY29uc3QgeyBvbkNvbmZpcm0sIGRpc2FibGVCdG4gfSA9IHRoaXMucHJvcHM7XG4gICAgIWRpc2FibGVCdG4gJiYgb25Db25maXJtKCk7XG4gIH1cblxuICBzZWxmRm9ybWF0RGF0ZShkYXRlOiBEYXRlKSB7XG4gICAgY29uc3QgeyBmb3JtYXRTdHIgPSAnJywgbG9jYWxlIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiBmb3JtYXREYXRlKGRhdGUsIGZvcm1hdFN0ciwgbG9jYWxlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9uLCBIb3N0QmluZGluZywgSW5wdXQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGVscyB9IGZyb20gJy4uL2RhdGUvRGF0YVR5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBQcm9wc1R5cGUge1xuICBsb2NhbGU6IE1vZGVscy5Mb2NhbGU7XG4gIG1vbnRoRGF0YTogTW9kZWxzLk1vbnRoRGF0YTtcbiAgcm93U2l6ZT86ICdub3JtYWwnIHwgJ3hsJztcbiAgZ2V0RGF0ZUV4dHJhPzogKGRhdGU6IERhdGUpID0+IE1vZGVscy5FeHRyYURhdGE7XG4gIG9uQ2VsbENsaWNrPzogKGRhdGE6IE1vZGVscy5DZWxsRGF0YSwgbW9udGhEYXRhOiBNb2RlbHMuTW9udGhEYXRhKSA9PiB2b2lkO1xuICByZWY6IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnU2luZ2xlTW9udGgsIG56bS1zaW5nbGUtbW9udGgnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2luZ2xlLW1vbnRoLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBTaW5nbGVNb250aENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHByb3BzID0ge1xuICAgIHJvd1NpemU6ICdub3JtYWwnXG4gIH0gYXMgUHJvcHNUeXBlO1xuXG4gIHN0YXRlID0ge1xuICAgIHdlZWtDb21wb25lbnRzOiBbXVxuICB9O1xuICByZWY6IChkb20pID0+IHZvaWQ7XG4gIHdyYXBwZXJEaXZET006IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcblxuICBASW5wdXQoKVxuICBzZXQgZGF0YSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMgPSB7XG4gICAgICAuLi50aGlzLnByb3BzLFxuICAgICAgLi4udmFsdWVcbiAgICB9O1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zaW5nbGUtbW9udGgnKSBzaW5nbGVNb250aDogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZikge31cblxuICBnZW5XZWVrID0gKHdlZWtzRGF0YTogTW9kZWxzLkNlbGxEYXRhW10sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCB7IGdldERhdGVFeHRyYSwgbW9udGhEYXRhLCBvbkNlbGxDbGljaywgbG9jYWxlLCByb3dTaXplIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCByb3dDbHMgPSAncm93JztcbiAgICBsZXQgd2Vla3NEYXRhTGlzdCA9IFtdO1xuICAgIGlmIChyb3dTaXplID09PSAneGwnKSB7XG4gICAgICByb3dDbHMgKz0gJyByb3cteGwnO1xuICAgIH1cblxuICAgIHdlZWtzRGF0YS5mb3JFYWNoKChkYXksIGRheU9mV2VlaykgPT4ge1xuICAgICAgY29uc3QgZXh0cmEgPSAoZ2V0RGF0ZUV4dHJhICYmIGdldERhdGVFeHRyYShuZXcgRGF0ZShkYXkudGljaykpKSB8fCB7fTtcbiAgICAgIGxldCBpbmZvID0gZXh0cmEuaW5mbztcbiAgICAgIGNvbnN0IGRpc2FibGUgPSBleHRyYS5kaXNhYmxlIHx8IGRheS5vdXRPZkRhdGU7XG5cbiAgICAgIGxldCBjbHMgPSAnZGF0ZSc7XG4gICAgICBsZXQgbENscyA9ICdsZWZ0JztcbiAgICAgIGxldCByQ2xzID0gJ3JpZ2h0JztcbiAgICAgIGxldCBpbmZvQ2xzID0gJ2luZm8nO1xuXG4gICAgICBpZiAoZGF5T2ZXZWVrID09PSAwIHx8IGRheU9mV2VlayA9PT0gNikge1xuICAgICAgICBjbHMgKz0gJyBncmV5JztcbiAgICAgIH1cblxuICAgICAgaWYgKGRpc2FibGUpIHtcbiAgICAgICAgY2xzICs9ICcgZGlzYWJsZSc7XG4gICAgICB9IGVsc2UgaWYgKGluZm8pIHtcbiAgICAgICAgY2xzICs9ICcgaW1wb3J0YW50JztcbiAgICAgIH1cblxuICAgICAgaWYgKGRheS5zZWxlY3RlZCkge1xuICAgICAgICBjbHMgKz0gJyBkYXRlLXNlbGVjdGVkJztcbiAgICAgICAgbGV0IHN0eWxlVHlwZSA9IGRheS5zZWxlY3RlZDtcbiAgICAgICAgc3dpdGNoIChzdHlsZVR5cGUpIHtcbiAgICAgICAgICBjYXNlIE1vZGVscy5TZWxlY3RUeXBlLk9ubHk6XG4gICAgICAgICAgICBpbmZvID0gbG9jYWxlLmJlZ2luO1xuICAgICAgICAgICAgaW5mb0NscyArPSAnIGRhdGUtc2VsZWN0ZWQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBNb2RlbHMuU2VsZWN0VHlwZS5BbGw6XG4gICAgICAgICAgICBpbmZvID0gbG9jYWxlLmJlZ2luX292ZXI7XG4gICAgICAgICAgICBpbmZvQ2xzICs9ICcgZGF0ZS1zZWxlY3RlZCc7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgTW9kZWxzLlNlbGVjdFR5cGUuU3RhcnQ6XG4gICAgICAgICAgICBpbmZvID0gbG9jYWxlLmJlZ2luO1xuICAgICAgICAgICAgaW5mb0NscyArPSAnIGRhdGUtc2VsZWN0ZWQnO1xuICAgICAgICAgICAgaWYgKGRheU9mV2VlayA9PT0gNiB8fCBkYXkuaXNMYXN0T2ZNb250aCkge1xuICAgICAgICAgICAgICBzdHlsZVR5cGUgPSBNb2RlbHMuU2VsZWN0VHlwZS5BbGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE1vZGVscy5TZWxlY3RUeXBlLk1pZGRsZTpcbiAgICAgICAgICAgIGlmIChkYXlPZldlZWsgPT09IDAgfHwgZGF5LmlzRmlyc3RPZk1vbnRoKSB7XG4gICAgICAgICAgICAgIGlmIChkYXkuaXNMYXN0T2ZNb250aCB8fCBkYXlPZldlZWsgPT09IDYpIHtcbiAgICAgICAgICAgICAgICBzdHlsZVR5cGUgPSBNb2RlbHMuU2VsZWN0VHlwZS5BbGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3R5bGVUeXBlID0gTW9kZWxzLlNlbGVjdFR5cGUuU3RhcnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF5T2ZXZWVrID09PSA2IHx8IGRheS5pc0xhc3RPZk1vbnRoKSB7XG4gICAgICAgICAgICAgIHN0eWxlVHlwZSA9IE1vZGVscy5TZWxlY3RUeXBlLkVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgTW9kZWxzLlNlbGVjdFR5cGUuRW5kOlxuICAgICAgICAgICAgaW5mbyA9IGxvY2FsZS5vdmVyO1xuICAgICAgICAgICAgaW5mb0NscyArPSAnIGRhdGUtc2VsZWN0ZWQnO1xuICAgICAgICAgICAgaWYgKGRheU9mV2VlayA9PT0gMCB8fCBkYXkuaXNGaXJzdE9mTW9udGgpIHtcbiAgICAgICAgICAgICAgc3R5bGVUeXBlID0gTW9kZWxzLlNlbGVjdFR5cGUuQWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHN0eWxlVHlwZSkge1xuICAgICAgICAgIGNhc2UgTW9kZWxzLlNlbGVjdFR5cGUuU2luZ2xlOlxuICAgICAgICAgIGNhc2UgTW9kZWxzLlNlbGVjdFR5cGUuT25seTpcbiAgICAgICAgICBjYXNlIE1vZGVscy5TZWxlY3RUeXBlLkFsbDpcbiAgICAgICAgICAgIGNscyArPSAnIHNlbGVjdGVkLXNpbmdsZSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE1vZGVscy5TZWxlY3RUeXBlLlN0YXJ0OlxuICAgICAgICAgICAgY2xzICs9ICcgc2VsZWN0ZWQtc3RhcnQnO1xuICAgICAgICAgICAgckNscyArPSAnIGRhdGUtc2VsZWN0ZWQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBNb2RlbHMuU2VsZWN0VHlwZS5NaWRkbGU6XG4gICAgICAgICAgICBjbHMgKz0gJyBzZWxlY3RlZC1taWRkbGUnO1xuICAgICAgICAgICAgbENscyArPSAnIGRhdGUtc2VsZWN0ZWQnO1xuICAgICAgICAgICAgckNscyArPSAnIGRhdGUtc2VsZWN0ZWQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBNb2RlbHMuU2VsZWN0VHlwZS5FbmQ6XG4gICAgICAgICAgICBjbHMgKz0gJyBzZWxlY3RlZC1lbmQnO1xuICAgICAgICAgICAgbENscyArPSAnIGRhdGUtc2VsZWN0ZWQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgd2Vla3NEYXRhTGlzdFtkYXlPZldlZWtdID0ge1xuICAgICAgICBsQ2xzLFxuICAgICAgICBjbHMsXG4gICAgICAgIGRheSxcbiAgICAgICAgckNscyxcbiAgICAgICAgaW5mb0NscyxcbiAgICAgICAgaW5mbyxcbiAgICAgICAgZXh0cmEsXG4gICAgICAgIGRpc2FibGUsXG4gICAgICAgIG9uQ2VsbENsaWNrOiBvbkNlbGxDbGljayxcbiAgICAgICAgbW9udGhEYXRhXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5zdGF0ZS53ZWVrQ29tcG9uZW50c1tpbmRleF0gPSB7XG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICByb3dDbHMsXG4gICAgICB3ZWVrc0RhdGFMaXN0XG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZVdlZWtzID0gKG1vbnRoRGF0YT86IE1vZGVscy5Nb250aERhdGEpID0+IHtcbiAgICAobW9udGhEYXRhIHx8IHRoaXMucHJvcHMubW9udGhEYXRhKS53ZWVrcy5mb3JFYWNoKCh3ZWVrLCBpbmRleCkgPT4ge1xuICAgICAgdGhpcy5nZW5XZWVrKHdlZWssIGluZGV4KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFdhcnBwZXIgPSAoZG9tOiBIVE1MRGl2RWxlbWVudCkgPT4ge1xuICAgIHRoaXMud3JhcHBlckRpdkRPTSA9IGRvbTtcbiAgfVxuXG4gIG9uQ2xpY2tDZWxsKGl0ZW0pIHtcbiAgICAhaXRlbS5kaXNhYmxlICYmIGl0ZW0ub25DZWxsQ2xpY2sgJiYgaXRlbS5vbkNlbGxDbGljayhpdGVtLmRheSwgaXRlbS5tb250aERhdGEpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXRXYXJwcGVyKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgdGhpcy5wcm9wcy5tb250aERhdGEud2Vla3MuZm9yRWFjaCgod2VlaywgaW5kZXgpID0+IHtcbiAgICAgIHRoaXMuZ2VuV2Vlayh3ZWVrLCBpbmRleCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5yZWYgPSB0aGlzLnByb3BzLnJlZjtcbiAgICB0aGlzLnJlZih0aGlzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgSG9zdEJpbmRpbmcsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RlbHMgfSBmcm9tICcuLi9kYXRlL0RhdGFUeXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcHNUeXBlIHtcbiAgbG9jYWxlOiBNb2RlbHMuTG9jYWxlO1xuICBvblNlbGVjdDogKHN0YXJ0RGF0ZT86IERhdGUsIGVuZERhdGU/OiBEYXRlKSA9PiB2b2lkO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdDYWxlbmRhclNob3J0Y3V0UGFuZWwsIG56bS1jYWxlbmRhci1zaG9ydGN1dC1wYW5lbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaG9ydGN1dC1wYW5lbC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgU2hvcnRjdXRQYW5lbENvbXBvbmVudCB7XG4gIHByb3BzID0ge30gYXMgUHJvcHNUeXBlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBsb2NhbGUodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLmxvY2FsZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBvblNlbGVjdCh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMub25TZWxlY3QgPSB2YWx1ZTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2hvcnRjdXQtcGFuZWwnKSBzaG9ydGN1dFBhbmVsOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgb25DbGljayA9ICh0eXBlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB7IG9uU2VsZWN0IH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAndG9kYXknOlxuICAgICAgICBvblNlbGVjdChcbiAgICAgICAgICBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCksIDApLFxuICAgICAgICAgIG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSwgMTIpXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd5ZXN0ZXJkYXknOlxuICAgICAgICBvblNlbGVjdChcbiAgICAgICAgICBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkgLSAxLCAwKSxcbiAgICAgICAgICBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkgLSAxLCAxMilcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2xhc3R3ZWVrJzpcbiAgICAgICAgb25TZWxlY3QoXG4gICAgICAgICAgbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgdG9kYXkuZ2V0RGF0ZSgpIC0gNiwgMCksXG4gICAgICAgICAgbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgdG9kYXkuZ2V0RGF0ZSgpLCAxMilcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2xhc3Rtb250aCc6XG4gICAgICAgIG9uU2VsZWN0KFxuICAgICAgICAgIG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSAtIDI5LCAwKSxcbiAgICAgICAgICBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCksIDEyKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgemhfQ04gfSBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvbGFuZ3VhZ2VzJztcbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVBpY2tlck9wdGlvbnNJbnRlcmZhY2Uge1xuICBtb2RlOiBzdHJpbmc7XG4gIHZhbHVlOiBEYXRlO1xuICBtaW5EYXRlOiBEYXRlO1xuICBtYXhEYXRlOiBEYXRlO1xuICB1c2UxMkhvdXJzOiBib29sZWFuO1xuICBtaW51dGVTdGVwOiBOdW1iZXI7XG4gIGxvY2FsZTogYW55O1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgbWFzazogYm9vbGVhbjtcbiAgdGl0bGU6IHN0cmluZztcbiAgb2tUZXh0OiBzdHJpbmc7XG4gIGRpc21pc3NUZXh0OiBzdHJpbmc7XG4gIGFwcGVuZFRvQm9keTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIERhdGVQaWNrZXJPcHRpb25zIGltcGxlbWVudHMgRGF0ZVBpY2tlck9wdGlvbnNJbnRlcmZhY2Uge1xuICBtb2RlID0gJ2RhdGUnO1xuICB2YWx1ZSA9IG5ldyBEYXRlKCk7XG4gIG1pbkRhdGUgPSBuZXcgRGF0ZSgyMDAwLCA2LCAxLCAwLCAwLCAwKTtcbiAgbWF4RGF0ZSA9IG5ldyBEYXRlKDIwMzAsIDEsIDEsIDIzLCA1OSwgNTkpO1xuICB1c2UxMkhvdXJzID0gZmFsc2U7XG4gIG1pbnV0ZVN0ZXAgPSAxO1xuICBkYXRhID0gW107XG4gIG1hc2s6IGJvb2xlYW4gPSB0cnVlO1xuICB0aXRsZSA9ICcnO1xuICBva1RleHQgPSAnw6fCocKuw6XCrsKaJztcbiAgZGlzbWlzc1RleHQgPSAnw6XCj8KWw6bCtsKIJztcbiAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgbG9jYWxlO1xuICBhcHBlbmRUb0JvZHkgPSBmYWxzZTtcbiAgb25PazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIG9uRGlzbWlzczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIG9uVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBvbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIGhpZGVQaWNrZXI6ICgpID0+IHZvaWQ7XG59XG4iLCJcbmV4cG9ydCBmdW5jdGlvbiBnZXRWZWxvY2l0eSgpIHtcbiAgcmV0dXJuICgobWluSW50ZXJ2YWwgPSAzMCwgbWF4SW50ZXJ2YWwgPSAxMDApID0+IHtcbiAgICBsZXQgX3RpbWUgPSAwO1xuICAgIGxldCBfeSA9IDA7XG4gICAgbGV0IF92ZWxvY2l0eSA9IDA7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB7XG4gICAgICByZWNvcmQ6ICh5KSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICBfdmVsb2NpdHkgPSAoeSAtIF95KSAvIChub3cgLSBfdGltZSk7XG4gICAgICAgIGlmIChub3cgLSBfdGltZSA+PSBtaW5JbnRlcnZhbCkge1xuICAgICAgICAgIF92ZWxvY2l0eSA9IG5vdyAtIF90aW1lIDw9IG1heEludGVydmFsID8gX3ZlbG9jaXR5IDogMDtcbiAgICAgICAgICBfeSA9IHk7XG4gICAgICAgICAgX3RpbWUgPSBub3c7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRWZWxvY2l0eTogKHkpID0+IHtcbiAgICAgICAgaWYgKHkgIT09IF95KSB7XG4gICAgICAgICAgcmVjb3JkZXIucmVjb3JkKHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdmVsb2NpdHk7XG4gICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIHJlY29yZGVyO1xuICB9KSgpO1xufSIsImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBFbGVtZW50UmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSG9zdExpc3RlbmVyLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIE9uRGVzdHJveSxcbiAgQWZ0ZXJWaWV3SW5pdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IExvY2FsZVByb3ZpZGVyU2VydmljZSB9IGZyb20gJy4uL2xvY2FsZS1wcm92aWRlci9sb2NhbGUtcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlUGlja2VyT3B0aW9ucyB9IGZyb20gJy4vZGF0ZS1waWNrZXItb3B0aW9ucy5wcm92aWRlcic7XG5pbXBvcnQgKiBhcyB2ZWxvY2l0eSBmcm9tICcuLi9jb3JlL3V0aWwvdmVsb2NpdHknO1xuZXhwb3J0IHR5cGUgRGF0ZU1vZGUgPSAnZGF0ZScgfCAndGltZScgfCAnZGF0ZXRpbWUnIHwgJ3llYXInIHwgJ21vbnRoJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnRGF0ZVBpY2tlciwgbnptLWRhdGUtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICB0cmFuc2l0aW9uTmFtZTogc3RyaW5nID0gJ2FtLXNsaWRlLXVwLWVudGVyIGFtLXNsaWRlLXVwLWVudGVyLWFjdGl2ZSc7XG4gIG1hc2tUcmFuc2l0aW9uTmFtZTogc3RyaW5nID0gJ2FtLWZhZGUtZW50ZXIgYW0tZmFkZS1lbnRlci1hY3RpdmUnO1xuICBtb2RlU3dpdGNoOiBudW1iZXJbXSA9IFsxLCAxLCAxLCAxLCAxLCAxXTtcbiAgbG9jYWxNaW5EYXRlOiBhbnlbXSA9IFtdO1xuICBsb2NhbE1heERhdGU6IGFueVtdID0gW107XG4gIGN1cnJlbnRUaW1lOiBhbnlbXSA9IFtdO1xuICBpbmRleEFycmF5OiBhbnkgPSBbXTtcbiAgbWluX2RhdGU6IGFueVtdID0gW107XG4gIG1heF9kYXRlOiBhbnlbXSA9IFtdO1xuICBjdXJyZW50X3RpbWU6IGFueVtdID0gW1xuICAgIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxcbiAgICBuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxLFxuICAgIG5ldyBEYXRlKCkuZ2V0RGF0ZSgpLFxuICAgIG5ldyBEYXRlKCkuZ2V0SG91cnMoKSxcbiAgICBuZXcgRGF0ZSgpLmdldE1pbnV0ZXMoKVxuICBdO1xuICBjbG9zOiBudW1iZXIgPSAwO1xuICByZXN1bHRBcnI6IGFueSA9IFtdO1xuICByZXN1bHREYXRlOiBEYXRlO1xuICBkYXRhOiBhbnlbXSA9IFtdO1xuICBkYXRhV2l0aFN0cjogYW55W10gPSBbXTtcbiAgc3RhcnRZOiBudW1iZXIgPSAwO1xuICBkaWZmZXJZOiBudW1iZXIgPSAwO1xuICBjdXJyZW50WTogbnVtYmVyID0gMDtcbiAgbGVuOiBudW1iZXIgPSAwO1xuICBkb206IGFueSA9IG51bGw7XG4gIGluZGV4OiBudW1iZXIgPSAwO1xuICBtYXhZOiBudW1iZXIgPSAwO1xuICBsaW5lSGVpZ2h0OiBudW1iZXIgPSAzNDtcbiAgc2VsZWN0ZWRUYXJnZXQ6IGFueVtdID0gW107XG4gIGlzTW91c2VEb3duOiBib29sZWFuID0gZmFsc2U7XG4gIGN1cnJlbnRQaWNrZXI6IGFueTtcbiAgbG9jYWxlTmV3OiBhbnkgPSB7fTtcbiAgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBWZWxvY2l0eSA9IHZlbG9jaXR5LmdldFZlbG9jaXR5KCk7XG5cbiAgQFZpZXdDaGlsZCgncGlja2VyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIHBpY2tlcjogVmlld0NvbnRhaW5lclJlZjtcblxuICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgcGFuc3RhcnQoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2FtLXBpY2tlci1jb2wtbWFzaycpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNNb3VzZURvd24gPSB0cnVlO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kb20gPSBldmVudC50YXJnZXQucGFyZW50RWxlbWVudC5jaGlsZHJlblsyXTtcbiAgICB0aGlzLmxlbiA9IHRoaXMuZG9tLmNoaWxkcmVuLmxlbmd0aDtcbiAgICB0aGlzLm1heFkgPSAtKHRoaXMubGVuIC0gMSk7XG5cbiAgICBpZiAodGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID09PSAndHJhbnNsYXRlWSgwcHgpJykge1xuICAgICAgdGhpcy5jdXJyZW50WSA9IDA7XG4gICAgICB0aGlzLm1heFkgPSAtKHRoaXMubGVuIC0gMSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFyZ2V0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0udGFyZ2V0SWQgPT09IGV2ZW50LnRhcmdldC5pZCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFkgPSBpdGVtLmN1cnJlbnRZO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgZXYgPSB0aGlzLmdldEV2ZW50VGFyZ2V0KGV2ZW50KTtcbiAgICB0aGlzLnN0YXJ0WSA9IGV2LmNsaWVudFk7XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgcGFubW92ZShldmVudCkge1xuICAgIGlmICghZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYW0tcGlja2VyLWNvbC1tYXNrJykgfHwgIXRoaXMuaXNNb3VzZURvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBldiA9IHRoaXMuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpO1xuICAgIHRoaXMuZGlmZmVyWSA9IGV2LmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICB0aGlzLlZlbG9jaXR5LnJlY29yZCh0aGlzLmRpZmZlclkpO1xuICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtIDBzJztcbiAgICB0aGlzLmRvbS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RoaXMuY3VycmVudFkgKiB0aGlzLmxpbmVIZWlnaHQgKyB0aGlzLmRpZmZlcll9cHgpYDtcbiAgfVxuICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgcGFuZW5kKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhbS1waWNrZXItY29sLW1hc2snKSB8fCAhdGhpcy5pc01vdXNlRG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzTW91c2VEb3duID0gZmFsc2U7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBldiA9IHRoaXMuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpO1xuICAgIHRoaXMuZGlmZmVyWSA9IGV2LmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICBsZXQgdGltZSA9IDAuMztcbiAgICBjb25zdCB2ZWxvY2l0eVRlbXAgPSB0aGlzLlZlbG9jaXR5LmdldFZlbG9jaXR5KHRoaXMuZGlmZmVyWSkgKiA0O1xuICAgIGlmICh2ZWxvY2l0eVRlbXApIHtcbiAgICAgIHRoaXMuZGlmZmVyWSA9IHZlbG9jaXR5VGVtcCAqIDQwICsgdGhpcy5kaWZmZXJZO1xuICAgICAgdGltZSA9IE1hdGguYWJzKHZlbG9jaXR5VGVtcCkgKiAwLjE7XG4gICAgfVxuICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtICcgKyAodGltZSA8IDAuMyA/IDAuMyA6IHRpbWUpICsgJ3MnO1xuICAgIGlmICh0aGlzLmRpZmZlclkgPD0gLXRoaXMubGluZUhlaWdodCAvIDIpIHtcbiAgICAgIHRoaXMuY3VycmVudFkgKz0gTWF0aC5mbG9vcih0aGlzLmRpZmZlclkgLyB0aGlzLmxpbmVIZWlnaHQpO1xuICAgICAgaWYgKHRoaXMuY3VycmVudFkgPD0gdGhpcy5tYXhZKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFkgPSB0aGlzLm1heFk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmRpZmZlclkgPj0gdGhpcy5saW5lSGVpZ2h0IC8gMikge1xuICAgICAgdGhpcy5jdXJyZW50WSArPSBNYXRoLmZsb29yKHRoaXMuZGlmZmVyWSAvIHRoaXMubGluZUhlaWdodCk7XG4gICAgICBpZiAodGhpcy5jdXJyZW50WSA+PSAwKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFkgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFyZ2V0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBoYXNLZXkgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0udGFyZ2V0SWQgPT09IGV2ZW50LnRhcmdldC5pZCkge1xuICAgICAgICAgIGhhc0tleSA9IHRydWU7XG4gICAgICAgICAgaXRlbS50YXJnZXRJZCA9IGV2ZW50LnRhcmdldC5pZDtcbiAgICAgICAgICBpdGVtLmN1cnJlbnRZID0gdGhpcy5jdXJyZW50WTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0LnB1c2goeyB0YXJnZXRJZDogZXZlbnQudGFyZ2V0LmlkLCBjdXJyZW50WTogdGhpcy5jdXJyZW50WSB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5wdXNoKHsgdGFyZ2V0SWQ6IGV2ZW50LnRhcmdldC5pZCwgY3VycmVudFk6IHRoaXMuY3VycmVudFkgfSk7XG4gICAgfVxuICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGhpcy5jdXJyZW50WSAqIHRoaXMubGluZUhlaWdodH1weClgO1xuICAgIHRoaXMuaW5kZXggPSBNYXRoLmZsb29yKE1hdGguYWJzKHRoaXMuY3VycmVudFkgLyAxKSk7IC8vIMOowq7CsMOlwr3ClcOlwr3Ck8OlwonCjcOkwr3CjcOnwqfCu8OlwpzCqMOmwpXCsMOnwrvChMOkwrjCrcOnwprChMOnwrTCosOlwrzClSzDpcK/woXDqcKhwrvDpcKPwpbDpsKVwrTDr8K8wozDpcKQwqbDpcKIwpnDpMK8wprDpcKHwrrDp8KOwrDDpsK1wq7Dp8KCwrnDpsKVwrBcbiAgICB0aGlzLmN1cnJlbnRfdGltZVt0aGlzLmluZGV4QXJyYXlbcGFyc2VJbnQoZXZlbnQudGFyZ2V0LmlkLCAwKV1dID0gdGhpcy5yZXN1bHRBcnJbXG4gICAgICB0aGlzLmluZGV4QXJyYXlbcGFyc2VJbnQoZXZlbnQudGFyZ2V0LmlkLCAwKV1cbiAgICBdID0gdGhpcy5kYXRhW3BhcnNlSW50KGV2ZW50LnRhcmdldC5pZCwgMCldW3RoaXMuaW5kZXhdO1xuICAgIGlmICh0aGlzLmp1ZGdlVGltZSh0aGlzLmN1cnJlbnRfdGltZSwgdGhpcy5tYXhfZGF0ZSkpIHtcbiAgICAgIHRoaXMuY3VycmVudFRpbWUgPSB0aGlzLmN1cnJlbnRfdGltZSA9IHRoaXMubWF4X2RhdGUuc2xpY2UoMCwgdGhpcy5pbmRleEFycmF5Lmxlbmd0aCk7XG4gICAgICB0aGlzLnJlc3VsdEFyciA9IHRoaXMuY3VycmVudF90aW1lO1xuICAgICAgdGhpcy5vcHRpb25zLm9uVmFsdWVDaGFuZ2UuZW1pdCh0aGlzLmhhbmRsZVJlc2x1dCgpKTtcbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5qdWRnZVRpbWUodGhpcy5taW5fZGF0ZSwgdGhpcy5jdXJyZW50X3RpbWUpKSB7XG4gICAgICB0aGlzLmN1cnJlbnRUaW1lID0gdGhpcy5jdXJyZW50X3RpbWUgPSB0aGlzLm1pbl9kYXRlLnNsaWNlKDAsIHRoaXMuaW5kZXhBcnJheS5sZW5ndGgpO1xuICAgICAgdGhpcy5yZXN1bHRBcnIgPSB0aGlzLmN1cnJlbnRUaW1lO1xuICAgICAgdGhpcy5vcHRpb25zLm9uVmFsdWVDaGFuZ2UuZW1pdCh0aGlzLmhhbmRsZVJlc2x1dCgpKTtcbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEN1cnJlbnRTZWxlY3RlZCgwLCB0aGlzLmRpZmZlclkgPCAwLCB0aGlzLmluZGV4KTtcbiAgICAgIHRoaXMub3B0aW9ucy5vblZhbHVlQ2hhbmdlLmVtaXQodGhpcy5oYW5kbGVSZXNsdXQoKSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHVibGljIG9wdGlvbnM6IERhdGVQaWNrZXJPcHRpb25zLFxuICAgIHB1YmxpYyBsb2NhbGVQcm92aWRlclNlcnZpY2U6IExvY2FsZVByb3ZpZGVyU2VydmljZVxuICApIHsgfVxuXG4gIGluaXQoKSB7XG4gICAgdGhpcy5pbml0UmVzdWx0KCk7XG4gICAgdGhpcy5jaGVja1RpbWUoKTtcbiAgICB0aGlzLmluaXRSZWFkeSgpO1xuICAgIHRoaXMuZ2V0SW5pdFZhbHVlSW5kZXgoKTtcbiAgfVxuXG4gIHJlbG9hZFBpY2tlcigpIHtcbiAgICBpZiAoIXRoaXMucGlja2VyIHx8IHRoaXMucGlja2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGlja2VyID0gdGhpcy5waWNrZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmN1cnJlbnRQaWNrZXIgJiYgdGhpcy5jdXJyZW50UGlja2VyLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHNlbGYuc2VsZWN0ZWRUYXJnZXQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgIHNlbGYuY3VycmVudFBpY2tlci5jaGlsZHJlbltpXS5jaGlsZHJlblsyXS5zdHlsZS50cmFuc2l0aW9uID0gJ3RyYW5zZm9ybSAuM3MnO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaXRlbS5jdXJyZW50WSwgMCk7XG4gICAgICAgICAgc2VsZi5jdXJyZW50UGlja2VyLmNoaWxkcmVuW2ldLmNoaWxkcmVuWzJdLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7aW5kZXggKiBzZWxmLmxpbmVIZWlnaHR9cHgpYDtcbiAgICAgICAgfSk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBsb2NhbGVQcm92aWRlcigpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5vcHRpb25zLmxvY2FsZSB8fCBzZWxmLm9wdGlvbnMubG9jYWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlbGYubG9jYWxlUHJvdmlkZXJTZXJ2aWNlLnNldExvY2FsZShzZWxmLm9wdGlvbnMubG9jYWxlKTtcbiAgICB9XG4gICAgc2VsZi5sb2NhbGVQcm92aWRlclNlcnZpY2UubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHNlbGYudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgc2VsZi5vcHRpb25zLmxvY2FsZSA9IHNlbGYubG9jYWxlUHJvdmlkZXJTZXJ2aWNlLmdldExvY2FsZSgpO1xuICAgICAgc2VsZi5sb2NhbGVOZXcgPSBzZWxmLmxvY2FsZVByb3ZpZGVyU2VydmljZS5nZXRMb2NhbGVTdWJPYmooJ0RhdGVQaWNrZXInKTtcbiAgICAgIHNlbGYub3B0aW9ucy5va1RleHQgPSBzZWxmLmxvY2FsZU5ldy5va1RleHQ7XG4gICAgICBzZWxmLm9wdGlvbnMuZGlzbWlzc1RleHQgPSBzZWxmLmxvY2FsZU5ldy5kaXNtaXNzVGV4dDtcbiAgICAgIHNlbGYuaW5pdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgdHJhbnNmb3JtRGF0ZUZvcm1hdChkYXRlKTogYW55IHtcbiAgICBpZiAoIWRhdGUgfHwgZGF0ZSA9PT0gJycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICd5eXl5LW1tLWRkLUhILU1NJ1xuICAgICAgICAucmVwbGFjZSgneXl5eScsIGRhdGUuZ2V0RnVsbFllYXIoKSArICcnKVxuICAgICAgICAucmVwbGFjZSgnbW0nLCBkYXRlLmdldE1vbnRoKCkgKyAxICsgJycpXG4gICAgICAgIC5yZXBsYWNlKCdkZCcsIGRhdGUuZ2V0RGF0ZSgpICsgJycpXG4gICAgICAgIC5yZXBsYWNlKCdISCcsIGRhdGUuZ2V0SG91cnMoKSArICcnKVxuICAgICAgICAucmVwbGFjZSgnTU0nLCBkYXRlLmdldE1pbnV0ZXMoKSArICcnKTtcbiAgICB9XG4gIH1cblxuICBwcmVaZXJvKHZhbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsIDwgMTAgPyAnMCcgKyB2YWwgOiB2YWwgKyAnJztcbiAgfVxuXG4gIGdldEluaXRWYWx1ZUluZGV4KCkge1xuICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQgPSBbXTtcbiAgICB0aGlzLmluZGV4QXJyYXkubWFwKChpbmRleCwgaSkgPT4ge1xuICAgICAgdGhpcy5kYXRhLmZvckVhY2goKGl0ZW0sIGopID0+IHtcbiAgICAgICAgaXRlbS5mb3JFYWNoKChpdGVtMSwgaykgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRUaW1lW2luZGV4XSA9PT0gaXRlbTEgJiYgaSA9PT0gaikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5wdXNoKHsgdGFyZ2V0SWQ6IGAke2l9YCwgY3VycmVudFk6IC1rIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnJlbG9hZFBpY2tlcigpO1xuICB9XG5cbiAgY2hlY2tNb2RlKG1vZGUpIHtcbiAgICB0aGlzLm1vZGVTd2l0Y2ggPSBbMSwgMSwgMSwgMSwgMSwgMV07XG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgdGhpcy5tb2RlU3dpdGNoID0gWzEsIDEsIDEsIDAsIDAsIDBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVzZTEySG91cnMpIHtcbiAgICAgICAgICB0aGlzLm1vZGVTd2l0Y2ggPSBbMCwgMCwgMCwgMSwgMSwgMV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tb2RlU3dpdGNoID0gWzAsIDAsIDAsIDEsIDEsIDBdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGF0ZXRpbWUnOlxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVzZTEySG91cnMpIHtcbiAgICAgICAgICB0aGlzLm1vZGVTd2l0Y2ggPSBbMSwgMSwgMSwgMSwgMSwgMV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tb2RlU3dpdGNoID0gWzEsIDEsIDEsIDEsIDEsIDBdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIHRoaXMubW9kZVN3aXRjaCA9IFsxLCAwLCAwLCAwLCAwXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIHRoaXMubW9kZVN3aXRjaCA9IFsxLCAxLCAwLCAwLCAwXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgdGVtcEluZGV4QXJyYXkgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubW9kZVN3aXRjaC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMubW9kZVN3aXRjaFtpXSA+IDApIHtcbiAgICAgICAgdGVtcEluZGV4QXJyYXkucHVzaChpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbG9zID0gdGVtcEluZGV4QXJyYXlbdGVtcEluZGV4QXJyYXkubGVuZ3RoIC0gMV0gLSB0ZW1wSW5kZXhBcnJheVswXSArIDE7XG4gICAgdGhpcy5pbmRleEFycmF5ID0gdGVtcEluZGV4QXJyYXk7XG4gIH1cblxuICBpbml0UmVzdWx0KCkge1xuICAgIHRoaXMucmVzdWx0QXJyID0gW107XG4gICAgaWYgKHRoaXMuY3VycmVudFRpbWUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50X3RpbWUgPSB0aGlzLmN1cnJlbnRUaW1lO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2xvczsgaSsrKSB7XG4gICAgICBjb25zdCByZXMgPSB0aGlzLmN1cnJlbnRUaW1lW2ldO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5tb2RlID09PSAndGltZScpIHtcbiAgICAgICAgdGhpcy5yZXN1bHRBcnIgPSB0aGlzLmN1cnJlbnRUaW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXN1bHRBcnIucHVzaChyZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoZWNrVGltZSgpIHtcbiAgICBjb25zdCBtaW5fRGF0ZSA9IHRoaXMudHJhbnNmb3JtRGF0ZUZvcm1hdCh0aGlzLm9wdGlvbnMubWluRGF0ZSkuc3BsaXQoJy0nKTtcbiAgICBpZiAobWluX0RhdGUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5taW5fZGF0ZSA9IG1pbl9EYXRlLm1hcChpdGVtID0+IHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KGl0ZW0sIDApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IG1heF9EYXRlID0gdGhpcy50cmFuc2Zvcm1EYXRlRm9ybWF0KHRoaXMub3B0aW9ucy5tYXhEYXRlKS5zcGxpdCgnLScpO1xuICAgIGlmIChtYXhfRGF0ZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLm1heF9kYXRlID0gbWF4X0RhdGUubWFwKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQoaXRlbSwgMCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgbWluX2RhdGUgPSB0aGlzLm1pbl9kYXRlO1xuICAgIGNvbnN0IG1heF9kYXRlID0gdGhpcy5tYXhfZGF0ZTtcbiAgICBjb25zdCBjdXJyZW50X3RpbWUgPSB0aGlzLmN1cnJlbnRfdGltZTtcbiAgICB0aGlzLmxvY2FsTWluRGF0ZSA9IFtdO1xuICAgIGlmICh0aGlzLmxvY2FsTWluRGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmluZGV4QXJyYXkubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHRoaXMubG9jYWxNaW5EYXRlLnB1c2gobWluX2RhdGVbdGhpcy5pbmRleEFycmF5W2luZGV4XV0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvY2FsTWF4RGF0ZSA9IFtdO1xuICAgIGlmICh0aGlzLmxvY2FsTWF4RGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmluZGV4QXJyYXkubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHRoaXMubG9jYWxNYXhEYXRlLnB1c2gobWF4X2RhdGVbdGhpcy5pbmRleEFycmF5W2luZGV4XV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmluZGV4QXJyYXkubGVuZ3RoID09PSB0aGlzLmxvY2FsTWluRGF0ZS5sZW5ndGggJiZcbiAgICAgIHRoaXMubG9jYWxNaW5EYXRlLmxlbmd0aCA9PT0gdGhpcy5sb2NhbE1heERhdGUubGVuZ3RoICYmXG4gICAgICB0aGlzLmxvY2FsTWF4RGF0ZS5sZW5ndGggPT09IHRoaXMuY3VycmVudFRpbWUubGVuZ3RoXG4gICAgKSB7XG4gICAgICBsZXQgX2luZGV4QXJyYXlJbmRleCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubW9kZVN3aXRjaC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5tb2RlU3dpdGNoW2ldID09PSAwKSB7XG4gICAgICAgICAgc3dpdGNoIChpKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIG1pbl9kYXRlW2ldID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgICBtYXhfZGF0ZVtpXSA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIG1pbl9kYXRlW2ldID0gbmV3IERhdGUoKS5nZXRNb250aCgpICsgMTtcbiAgICAgICAgICAgICAgbWF4X2RhdGVbaV0gPSBuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgbWluX2RhdGVbaV0gPSBuZXcgRGF0ZSgpLmdldERhdGUoKTtcbiAgICAgICAgICAgICAgbWF4X2RhdGVbaV0gPSBuZXcgRGF0ZSgpLmdldERhdGUoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIG1pbl9kYXRlW2ldID0gbmV3IERhdGUoKS5nZXRIb3VycygpO1xuICAgICAgICAgICAgICBtYXhfZGF0ZVtpXSA9IG5ldyBEYXRlKCkuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIG1pbl9kYXRlW2ldID0gbmV3IERhdGUoKS5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgICAgIG1heF9kYXRlW2ldID0gbmV3IERhdGUoKS5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICBtaW5fZGF0ZVtpXSA9IDA7XG4gICAgICAgICAgICAgIG1heF9kYXRlW2ldID0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAoaSkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICB0aGlzLmxvY2FsTWluRGF0ZVtfaW5kZXhBcnJheUluZGV4XSA9IG1pbl9kYXRlW2ldID1cbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTWluRGF0ZVtfaW5kZXhBcnJheUluZGV4XSA+PSAxOTAwXG4gICAgICAgICAgICAgICAgICA/IHRoaXMubG9jYWxNaW5EYXRlW19pbmRleEFycmF5SW5kZXhdXG4gICAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2NhbE1heERhdGVbX2luZGV4QXJyYXlJbmRleF0gPSBtYXhfZGF0ZVtpXSA9XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbE1heERhdGVbX2luZGV4QXJyYXlJbmRleF0gPj0gMTkwMFxuICAgICAgICAgICAgICAgICAgPyB0aGlzLmxvY2FsTWF4RGF0ZVtfaW5kZXhBcnJheUluZGV4XVxuICAgICAgICAgICAgICAgICAgOiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgKyAxO1xuICAgICAgICAgICAgICBjdXJyZW50X3RpbWVbaV0gPSB0aGlzLmN1cnJlbnRUaW1lW19pbmRleEFycmF5SW5kZXhdO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgdGhpcy5sb2NhbE1pbkRhdGVbX2luZGV4QXJyYXlJbmRleF0gPSBtaW5fZGF0ZVtpXSA9XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbE1pbkRhdGVbX2luZGV4QXJyYXlJbmRleF0gPiAwICYmIHRoaXMubG9jYWxNaW5EYXRlW19pbmRleEFycmF5SW5kZXhdIDw9IDEyXG4gICAgICAgICAgICAgICAgICA/IHRoaXMubG9jYWxNaW5EYXRlW19pbmRleEFycmF5SW5kZXhdXG4gICAgICAgICAgICAgICAgICA6IDE7XG4gICAgICAgICAgICAgIHRoaXMubG9jYWxNYXhEYXRlW19pbmRleEFycmF5SW5kZXhdID0gbWF4X2RhdGVbaV0gPVxuICAgICAgICAgICAgICAgIHRoaXMubG9jYWxNYXhEYXRlW19pbmRleEFycmF5SW5kZXhdID4gMCAmJiB0aGlzLmxvY2FsTWF4RGF0ZVtfaW5kZXhBcnJheUluZGV4XSA8PSAxMlxuICAgICAgICAgICAgICAgICAgPyB0aGlzLmxvY2FsTWF4RGF0ZVtfaW5kZXhBcnJheUluZGV4XVxuICAgICAgICAgICAgICAgICAgOiAxMjtcbiAgICAgICAgICAgICAgY3VycmVudF90aW1lW2ldID0gdGhpcy5jdXJyZW50VGltZVtfaW5kZXhBcnJheUluZGV4XTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgIHRoaXMubG9jYWxNaW5EYXRlW19pbmRleEFycmF5SW5kZXhdID0gbWluX2RhdGVbaV0gPVxuICAgICAgICAgICAgICAgIHRoaXMubG9jYWxNaW5EYXRlW19pbmRleEFycmF5SW5kZXhdID4gMCAmJlxuICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbE1pbkRhdGVbX2luZGV4QXJyYXlJbmRleF0gPD0gbmV3IERhdGUobWluX2RhdGVbMF0sIG1pbl9kYXRlWzFdLCAwKS5nZXREYXRlKClcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5sb2NhbE1pbkRhdGVbX2luZGV4QXJyYXlJbmRleF1cbiAgICAgICAgICAgICAgICAgIDogMTtcbiAgICAgICAgICAgICAgdGhpcy5sb2NhbE1heERhdGVbX2luZGV4QXJyYXlJbmRleF0gPSBtYXhfZGF0ZVtpXSA9XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbE1heERhdGVbX2luZGV4QXJyYXlJbmRleF0gPiAwICYmXG4gICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTWF4RGF0ZVtfaW5kZXhBcnJheUluZGV4XSA8PSBuZXcgRGF0ZShtYXhfZGF0ZVswXSwgbWF4X2RhdGVbMV0sIDApLmdldERhdGUoKVxuICAgICAgICAgICAgICAgICAgPyB0aGlzLmxvY2FsTWF4RGF0ZVtfaW5kZXhBcnJheUluZGV4XVxuICAgICAgICAgICAgICAgICAgOiBuZXcgRGF0ZShtYXhfZGF0ZVswXSwgbWF4X2RhdGVbMV0sIDApLmdldERhdGUoKTtcbiAgICAgICAgICAgICAgY3VycmVudF90aW1lW2ldID0gdGhpcy5jdXJyZW50VGltZVtfaW5kZXhBcnJheUluZGV4XTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIHRoaXMubG9jYWxNaW5EYXRlW19pbmRleEFycmF5SW5kZXhdID0gbWluX2RhdGVbaV0gPVxuICAgICAgICAgICAgICAgIHRoaXMubG9jYWxNaW5EYXRlW19pbmRleEFycmF5SW5kZXhdID49IDAgJiYgdGhpcy5sb2NhbE1pbkRhdGVbX2luZGV4QXJyYXlJbmRleF0gPD0gMjNcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5sb2NhbE1pbkRhdGVbX2luZGV4QXJyYXlJbmRleF1cbiAgICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51c2UxMkhvdXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbE1heERhdGVbX2luZGV4QXJyYXlJbmRleF0gPSBtYXhfZGF0ZVtpXSA9XG4gICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTWF4RGF0ZVtfaW5kZXhBcnJheUluZGV4XSA+PSAwICYmIHRoaXMubG9jYWxNYXhEYXRlW19pbmRleEFycmF5SW5kZXhdIDw9IDExXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5sb2NhbE1heERhdGVbX2luZGV4QXJyYXlJbmRleF1cbiAgICAgICAgICAgICAgICAgICAgOiAxMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTWF4RGF0ZVtfaW5kZXhBcnJheUluZGV4XSA9IG1heF9kYXRlW2ldID1cbiAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxNYXhEYXRlW19pbmRleEFycmF5SW5kZXhdID49IDAgJiYgdGhpcy5sb2NhbE1heERhdGVbX2luZGV4QXJyYXlJbmRleF0gPD0gMjNcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmxvY2FsTWF4RGF0ZVtfaW5kZXhBcnJheUluZGV4XVxuICAgICAgICAgICAgICAgICAgICA6IDIzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGN1cnJlbnRfdGltZVtpXSA9IHRoaXMuY3VycmVudFRpbWVbX2luZGV4QXJyYXlJbmRleF07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICB0aGlzLmxvY2FsTWluRGF0ZVtfaW5kZXhBcnJheUluZGV4XSA9IG1pbl9kYXRlW2ldID1cbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTWluRGF0ZVtfaW5kZXhBcnJheUluZGV4XSA+PSAwICYmIHRoaXMubG9jYWxNaW5EYXRlW19pbmRleEFycmF5SW5kZXhdIDw9IDU5XG4gICAgICAgICAgICAgICAgICA/IHRoaXMubG9jYWxNaW5EYXRlW19pbmRleEFycmF5SW5kZXhdXG4gICAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgICAgICAgIHRoaXMubG9jYWxNYXhEYXRlW19pbmRleEFycmF5SW5kZXhdID0gbWF4X2RhdGVbaV0gPVxuICAgICAgICAgICAgICAgIHRoaXMubG9jYWxNYXhEYXRlW19pbmRleEFycmF5SW5kZXhdID49IDAgJiYgdGhpcy5sb2NhbE1heERhdGVbX2luZGV4QXJyYXlJbmRleF0gPD0gNTlcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5sb2NhbE1heERhdGVbX2luZGV4QXJyYXlJbmRleF1cbiAgICAgICAgICAgICAgICAgIDogNTk7XG4gICAgICAgICAgICAgIGN1cnJlbnRfdGltZVtpXSA9IHRoaXMuY3VycmVudFRpbWVbX2luZGV4QXJyYXlJbmRleF07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfaW5kZXhBcnJheUluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWluVCA9IG5ldyBEYXRlKG1pbl9kYXRlWzBdLCBtaW5fZGF0ZVsxXSwgbWluX2RhdGVbMl0sIG1pbl9kYXRlWzNdLCBtaW5fZGF0ZVs0XSkuZ2V0VGltZSgpO1xuICAgICAgY29uc3QgbWF4VCA9IG5ldyBEYXRlKG1heF9kYXRlWzBdLCBtYXhfZGF0ZVsxXSwgbWF4X2RhdGVbMl0sIG1heF9kYXRlWzNdLCBtYXhfZGF0ZVs0XSkuZ2V0VGltZSgpO1xuICAgICAgY29uc3QgY3VyVCA9IG5ldyBEYXRlKFxuICAgICAgICBjdXJyZW50X3RpbWVbMF0sXG4gICAgICAgIGN1cnJlbnRfdGltZVsxXSxcbiAgICAgICAgY3VycmVudF90aW1lWzJdLFxuICAgICAgICBjdXJyZW50X3RpbWVbM10sXG4gICAgICAgIGN1cnJlbnRfdGltZVs0XVxuICAgICAgKS5nZXRUaW1lKCk7XG4gICAgICByZXR1cm4gbWluVCA8PSBjdXJUICYmIGN1clQgPD0gbWF4VDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGp1ZGdlVGltZShhcnIxLCBhcnIyKSB7XG4gICAgbGV0IGRhdGUxO1xuICAgIGxldCBkYXRlMjtcbiAgICBkYXRlMSA9IGFycjEuc2xpY2UoMCwgMykuam9pbignLScpICsgJyAnICsgYXJyMS5zbGljZSgzLCA1KS5qb2luKCc6Jyk7XG4gICAgZGF0ZTIgPSBhcnIyLnNsaWNlKDAsIDMpLmpvaW4oJy0nKSArICcgJyArIGFycjIuc2xpY2UoMywgNSkuam9pbignOicpO1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlMSkuZ2V0VGltZSgpID49IG5ldyBEYXRlKGRhdGUyKS5nZXRUaW1lKCk7XG4gIH1cblxuICBqdWRnZUVxdWFsQXJyYXkoYXJyMSwgYXJyMiwgbGVuZ3RoKSB7XG4gICAgbGV0IHN0YXR1cyA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycjFbaV0gIT0gYXJyMltpXSkge1xuICAgICAgICBzdGF0dXMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXR1cztcbiAgfVxuXG4gIGluaXRSZWFkeSgpIHtcbiAgICBsZXQgcmVhbElkeCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNsb3M7IGkrKykge1xuICAgICAgcmVhbElkeCA9IHRoaXMuaW5kZXhBcnJheVtpXTtcbiAgICAgIGxldCBtaW4gPSAwO1xuICAgICAgbGV0IG1heCA9IDA7XG4gICAgICBjb25zdCB0ZW1wQXJyYXkgPSBbXTtcbiAgICAgIHN3aXRjaCAocmVhbElkeCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgdGhpcy5pbml0RGF0YSh0ZW1wQXJyYXksIHRoaXMubG9jYWxNaW5EYXRlW2ldLCB0aGlzLmxvY2FsTWF4RGF0ZVtpXSwgdGhpcy5sb2NhbGVOZXcueWVhciwgaSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBtaW4gPSB0aGlzLmp1ZGdlRXF1YWxBcnJheSh0aGlzLm1pbl9kYXRlLCB0aGlzLmN1cnJlbnRfdGltZSwgMSkgPyB0aGlzLmxvY2FsTWluRGF0ZVtpXSA6IDE7XG4gICAgICAgICAgbWF4ID0gdGhpcy5qdWRnZUVxdWFsQXJyYXkodGhpcy5tYXhfZGF0ZSwgdGhpcy5jdXJyZW50X3RpbWUsIDEpID8gdGhpcy5sb2NhbE1heERhdGVbaV0gOiAxMjtcbiAgICAgICAgICB0aGlzLmluaXREYXRhKHRlbXBBcnJheSwgbWluLCBtYXgsIHRoaXMubG9jYWxlTmV3Lm1vbnRoLCBpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIG1pbiA9IHRoaXMuanVkZ2VFcXVhbEFycmF5KHRoaXMubWluX2RhdGUsIHRoaXMuY3VycmVudF90aW1lLCAyKSA/IHRoaXMubG9jYWxNaW5EYXRlW2ldIDogMTtcbiAgICAgICAgICBtYXggPSB0aGlzLmp1ZGdlRXF1YWxBcnJheSh0aGlzLm1heF9kYXRlLCB0aGlzLmN1cnJlbnRfdGltZSwgMilcbiAgICAgICAgICAgID8gdGhpcy5sb2NhbE1heERhdGVbaV1cbiAgICAgICAgICAgIDogbmV3IERhdGUodGhpcy5jdXJyZW50X3RpbWVbMF0sIHRoaXMuY3VycmVudF90aW1lWzFdLCAwKS5nZXREYXRlKCk7XG4gICAgICAgICAgdGhpcy5pbml0RGF0YSh0ZW1wQXJyYXksIG1pbiwgbWF4LCB0aGlzLmxvY2FsZU5ldy5kYXksIGkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgbWluID0gdGhpcy5qdWRnZUVxdWFsQXJyYXkodGhpcy5taW5fZGF0ZSwgdGhpcy5jdXJyZW50X3RpbWUsIDMpID8gdGhpcy5sb2NhbE1pbkRhdGVbaV0gOiAwO1xuICAgICAgICAgIG1heCA9IHRoaXMuanVkZ2VFcXVhbEFycmF5KHRoaXMubWF4X2RhdGUsIHRoaXMuY3VycmVudF90aW1lLCAzKSA/IHRoaXMubG9jYWxNYXhEYXRlW2ldIDogMjM7XG4gICAgICAgICAgdGhpcy5pbml0RGF0YSh0ZW1wQXJyYXksIG1pbiwgbWF4LCB0aGlzLmxvY2FsZU5ldy5ob3VyLCBpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIG1pbiA9IHRoaXMuanVkZ2VFcXVhbEFycmF5KHRoaXMubWluX2RhdGUsIHRoaXMuY3VycmVudF90aW1lLCA0KSA/IHRoaXMubG9jYWxNaW5EYXRlW2ldIDogMDtcbiAgICAgICAgICBtYXggPSB0aGlzLmp1ZGdlRXF1YWxBcnJheSh0aGlzLm1heF9kYXRlLCB0aGlzLmN1cnJlbnRfdGltZSwgNCkgPyB0aGlzLmxvY2FsTWF4RGF0ZVtpXSA6IDU5O1xuICAgICAgICAgIHRoaXMuaW5pdERhdGEodGVtcEFycmF5LCBtaW4sIG1heCwgdGhpcy5sb2NhbGVOZXcubWludXRlLCBpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIG1pbiA9IDA7XG4gICAgICAgICAgbWF4ID0gMTtcbiAgICAgICAgICB0aGlzLmluaXREYXRhKHRlbXBBcnJheSwgbWluLCBtYXgsICd1c2UxMkhvdXJzJywgaSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaW5pdERhdGEodGVtcEFyciwgbWluLCBtYXgsIHN0ciwgaWR4KSB7XG4gICAgY29uc3QgZGF0YVdpdGhTdHIgPSBbXTtcbiAgICBmb3IgKG1pbjsgbWluIDwgbWF4ICsgMTsgbWluKyspIHtcbiAgICAgIHRlbXBBcnIucHVzaChtaW4pO1xuICAgICAgZGF0YVdpdGhTdHIucHVzaChtaW4gKyBzdHIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA+IHRoaXMuaW5kZXhBcnJheS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgICAgdGhpcy5kYXRhV2l0aFN0ciA9IFtdO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA+IGlkeCAmJiB0aGlzLmRhdGFbaWR4XS50b1N0cmluZygpICE9PSB0ZW1wQXJyLnRvU3RyaW5nKCkpIHtcbiAgICAgIHRoaXMuZGF0YVtpZHhdID0gdGVtcEFycjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5sZW5ndGggPiBpZHggJiYgdGhpcy5kYXRhW2lkeF0udG9TdHJpbmcoKSA9PT0gdGVtcEFyci50b1N0cmluZygpKSB7XG4gICAgICB0aGlzLmRhdGFbaWR4XSA9IHRlbXBBcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YS5wdXNoKHRlbXBBcnIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmxvY2FsZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMub3B0aW9ucy5sb2NhbGUubG9jYWxlID09PSAnemhfQ04nKSB7XG4gICAgICBpZiAodGhpcy5kYXRhV2l0aFN0ci5sZW5ndGggPiBpZHggJiYgdGhpcy5kYXRhV2l0aFN0cltpZHhdLnRvU3RyaW5nKCkgIT09IGRhdGFXaXRoU3RyLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgdGhpcy5kYXRhV2l0aFN0cltpZHhdID0gZGF0YVdpdGhTdHI7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YVdpdGhTdHIubGVuZ3RoID4gaWR4ICYmIHRoaXMuZGF0YVdpdGhTdHJbaWR4XS50b1N0cmluZygpID09PSBkYXRhV2l0aFN0ci50b1N0cmluZygpKSB7XG4gICAgICAgIHRoaXMuZGF0YVdpdGhTdHJbaWR4XSA9IGRhdGFXaXRoU3RyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kYXRhV2l0aFN0ci5wdXNoKGRhdGFXaXRoU3RyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhV2l0aFN0ciA9IHRoaXMuZGF0YTtcbiAgICB9XG4gIH1cblxuICBvaygpIHtcbiAgICB0aGlzLm9wdGlvbnMub25Pay5lbWl0KHRoaXMuaGFuZGxlUmVzbHV0KCkpO1xuICAgIHRoaXMuc2V0VHJhbnNpdGlvbk5hbWUoKTtcbiAgfVxuXG4gIGhhbmRsZVJlc2x1dCgpIHtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5tb2RlID09PSAnZGF0ZXRpbWUnIHx8IHRoaXMub3B0aW9ucy5tb2RlID09PSAndGltZScpIHtcbiAgICAgIGNvbnN0IHRlbXAgPSB0aGlzLnJlc3VsdEFycjtcbiAgICAgIHJlc3VsdCA9IHRlbXAuc2xpY2UoMCwgMykuam9pbignLScpICsgJyAnICsgdGVtcC5zbGljZSgzLCA1KS5qb2luKCc6Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMucmVzdWx0QXJyLm1hcCh2ID0+IHYpLmpvaW4oJy0nKTtcbiAgICB9XG4gICAgdGhpcy5yZXN1bHREYXRlID0gbmV3IERhdGUocmVzdWx0LnJlcGxhY2UoLy0vZywgJy8nKSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5taW5EYXRlLmdldFRpbWUoKSA+IHRoaXMucmVzdWx0RGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgIGlmICh0aGlzLnJlc3VsdEFyci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnJlc3VsdEFyci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICB0aGlzLnJlc3VsdEFyciA9IHRoaXMubWluX2RhdGU7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VGltZSA9IHRoaXMucmVzdWx0QXJyO1xuICAgICAgICAgIHRoaXMuY3VycmVudF90aW1lID0gdGhpcy5jdXJyZW50VGltZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5yZXN1bHREYXRlID0gdGhpcy5vcHRpb25zLm1pbkRhdGU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc3VsdERhdGU7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5vcHRpb25zLm9uRGlzbWlzcy5lbWl0KCk7XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uTmFtZSgpO1xuICB9XG5cbiAgc2V0VHJhbnNpdGlvbk5hbWUoKSB7XG4gICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9ICdhbS1zbGlkZS11cC1sZWF2ZSBhbS1zbGlkZS11cC1sZWF2ZS1hY3RpdmUnO1xuICAgIHRoaXMubWFza1RyYW5zaXRpb25OYW1lID0gJ2FtLWZhZGUtbGVhdmUgYW0tZmFkZS1sZWF2ZS1hY3RpdmUnO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5vcHRpb25zLmhpZGVQaWNrZXIoKTtcbiAgICB9LCAyMDApO1xuICB9XG5cbiAgc2V0Q3VycmVudFNlbGVjdGVkKGNoZWNrSWR4LCBzdGEsIGluZGV4VCkge1xuICAgIGlmIChjaGVja0lkeCA+PSB0aGlzLmNsb3MgLSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBzdGF0dXMgPSBudWxsO1xuICAgIGlmIChzdGEpIHtcbiAgICAgIHN0YXR1cyA9IHRoaXMuanVkZ2VFcXVhbEFycmF5KHRoaXMubWluX2RhdGUsIHRoaXMucmVzdWx0QXJyLCBjaGVja0lkeCArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXMgPSB0aGlzLmp1ZGdlRXF1YWxBcnJheSh0aGlzLm1heF9kYXRlLCB0aGlzLnJlc3VsdEFyciwgY2hlY2tJZHggKyAxKTtcbiAgICB9XG4gICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgIGxldCBtaW4gPSAwO1xuICAgICAgbGV0IG1heCA9IDA7XG4gICAgICBsZXQgc3RyID0gJyc7XG4gICAgICBjb25zdCByZWFsSWR4ID0gdGhpcy5pbmRleEFycmF5W2NoZWNrSWR4XTtcbiAgICAgIHN3aXRjaCAocmVhbElkeCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbWluID0gMTtcbiAgICAgICAgICBtYXggPSAxMjtcbiAgICAgICAgICBzdHIgPSAnw6bCnMKIJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIG1pbiA9IDE7XG4gICAgICAgICAgbWF4ID0gbmV3IERhdGUodGhpcy5jdXJyZW50X3RpbWVbMF0sIHRoaXMuY3VycmVudF90aW1lWzFdLCAwKS5nZXREYXRlKCk7XG4gICAgICAgICAgc3RyID0gJ8OmwpfCpSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBtaW4gPSAwO1xuICAgICAgICAgIG1heCA9IDIzO1xuICAgICAgICAgIHN0ciA9ICfDpsKXwrYnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgbWluID0gMDtcbiAgICAgICAgICBtYXggPSA1OTtcbiAgICAgICAgICBzdHIgPSAnw6XCiMKGJztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbml0UmFuZ2VBcnIobWluLCBtYXgsIGluZGV4VCwgY2hlY2tJZHggKyAxLCBzdHIpO1xuICAgIH1cbiAgICB0aGlzLnNldEN1cnJlbnRTZWxlY3RlZChjaGVja0lkeCArIDEsIHN0YSwgaW5kZXhUKTtcbiAgfVxuXG4gIGluaXRSYW5nZUFycihtaW4sIG1heCwgaW5kZXhULCBjaGVja0lkeCwgc3RyKSB7XG4gICAgY29uc3QgcmVhbElkeCA9IHRoaXMuaW5kZXhBcnJheVtjaGVja0lkeF07XG4gICAgY29uc3QgYXJyID0gW107XG4gICAgbGV0IHRhcmdldExvbmcgPSAwO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSBtaW47IGluZGV4IDwgbWF4ICsgMTsgaW5kZXgrKykge1xuICAgICAgYXJyLnB1c2goaW5kZXgpO1xuICAgIH1cblxuICAgIGlmIChhcnIuaW5kZXhPZih0aGlzLnJlc3VsdEFycltjaGVja0lkeF0pID09IC0xKSB7XG4gICAgICBpZiAoLXRoaXMuc2VsZWN0ZWRUYXJnZXRbY2hlY2tJZHhdLmN1cnJlbnRZID4gbWF4IC0gbWluKSB7XG4gICAgICAgIGluZGV4VCA9IG1heCAtIG1pbjtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldFtjaGVja0lkeF0uY3VycmVudFkgPSAtaW5kZXhUO1xuICAgICAgfVxuICAgICAgdGFyZ2V0TG9uZyA9IC1hcnIubGVuZ3RoICogdGhpcy5saW5lSGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRMb25nID0gLWFyci5pbmRleE9mKHRoaXMucmVzdWx0QXJyW2NoZWNrSWR4XSkgKiB0aGlzLmxpbmVIZWlnaHQ7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0W2NoZWNrSWR4XS5jdXJyZW50WSA9IC1hcnIuaW5kZXhPZih0aGlzLnJlc3VsdEFycltjaGVja0lkeF0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhW2NoZWNrSWR4XS50b1N0cmluZygpICE9PSBhcnIudG9TdHJpbmcoKSkge1xuICAgICAgdGhpcy5jdXJyZW50X3RpbWVbcmVhbElkeF0gPSAtdGFyZ2V0TG9uZyAvIHRoaXMubGluZUhlaWdodCArIDE7XG4gICAgICB0aGlzLnJlc3VsdEFycltjaGVja0lkeF0gPSAtdGFyZ2V0TG9uZyAvIHRoaXMubGluZUhlaWdodCArIDE7XG4gICAgICB0aGlzLmRhdGFbY2hlY2tJZHhdID0gYXJyO1xuICAgICAgdGhpcy5kYXRhV2l0aFN0cltjaGVja0lkeF0gPVxuICAgICAgICB0aGlzLm9wdGlvbnMubG9jYWxlLmxvY2FsZSA9PT0gJ3poX0NOJ1xuICAgICAgICAgID8gYXJyLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtICsgc3RyO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgOiBhcnI7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgaWYgKGkgPj0gY2hlY2tJZHgpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBpY2tlci5jaGlsZHJlbltpXS5jaGlsZHJlblsyXS5zdHlsZS50cmFuc2l0aW9uID0gJyc7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGl0ZW0uY3VycmVudFksIDApO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGlja2VyLmNoaWxkcmVuW2ldLmNoaWxkcmVuWzJdLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7aW5kZXggKiB0aGlzLmxpbmVIZWlnaHR9cHgpYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RXZlbnRUYXJnZXQoZXZlbnQpIHtcbiAgICBpZiAoXG4gICAgICBldmVudC50eXBlID09PSAnbW91c2Vkb3duJyB8fFxuICAgICAgZXZlbnQudHlwZSA9PT0gJ21vdXNlbW92ZScgfHxcbiAgICAgIGV2ZW50LnR5cGUgPT09ICdtb3VzZXVwJyB8fFxuICAgICAgZXZlbnQudHlwZSA9PT0gJ21vdXNlbGVhdmUnXG4gICAgKSB7XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChldmVudCAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSkge1xuICAgICAgICByZXR1cm4gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvY2FsZVByb3ZpZGVyKCk7XG4gICAgdGhpcy5jaGVja01vZGUodGhpcy5vcHRpb25zLm1vZGUpO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy50cmFuc2Zvcm1EYXRlRm9ybWF0KHRoaXMub3B0aW9ucy52YWx1ZSkuc3BsaXQoJy0nKTtcbiAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50VGltZSA9IHZhbHVlLm1hcChpdGVtID0+IHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KGl0ZW0sIDApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMucmVsb2FkUGlja2VyKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgSG9zdEJpbmRpbmdcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRlUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IHpoX0NOIH0gZnJvbSAnLi4vbG9jYWxlLXByb3ZpZGVyL2xhbmd1YWdlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0RhdGVQaWNrZXJWaWV3LCBuem0tZGF0ZS1waWNrZXItdmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXBpY2tlci12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VyVmlld0NvbXBvbmVudCBleHRlbmRzIERhdGVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpXG4gIG1vZGU6IHN0cmluZyA9ICdkYXRlJztcbiAgQElucHV0KClcbiAgbWluRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKDIwMDAsIDUsIDEsIDAsIDAsIDApO1xuICBASW5wdXQoKVxuICBtYXhEYXRlOiBEYXRlID0gbmV3IERhdGUoMjAzMCwgMSwgMSwgMjMsIDU5LCA1OSk7XG4gIEBJbnB1dCgpXG4gIHZhbHVlOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgQElucHV0KClcbiAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgaW5kaWNhdG9yU3R5bGU6IG9iamVjdCA9IHt9O1xuICBASW5wdXQoKVxuICBnZXQgbG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9jYWxlO1xuICB9XG4gIHNldCBsb2NhbGUodmFsdWUpIHtcbiAgICB0aGlzLm9wdGlvbnMubG9jYWxlID0gdmFsdWU7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tcGlja2VyJylcbiAgYW1QaWNrZXIgPSB0cnVlO1xuXG4gIGluaXQoKSB7XG4gICAgdGhpcy5vcHRpb25zLm1vZGUgPSB0aGlzLm1vZGU7XG4gICAgdGhpcy5vcHRpb25zLm1pbkRhdGUgPSB0aGlzLm1pbkRhdGU7XG4gICAgdGhpcy5vcHRpb25zLm1heERhdGUgPSB0aGlzLm1heERhdGU7XG4gICAgdGhpcy5vcHRpb25zLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcbiAgICB0aGlzLm9wdGlvbnMubG9jYWxlID0gdGhpcy5sb2NhbGU7XG4gICAgdGhpcy5vcHRpb25zLnZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnMub25WYWx1ZUNoYW5nZSA9IHRoaXMub25WYWx1ZUNoYW5nZTtcbiAgICB0aGlzLmNoZWNrTW9kZSh0aGlzLm9wdGlvbnMubW9kZSk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnRyYW5zZm9ybURhdGVGb3JtYXQodGhpcy5vcHRpb25zLnZhbHVlKS5zcGxpdCgnLScpO1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnRUaW1lID0gdmFsdWUubWFwKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQoaXRlbSwgMCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5pbml0UmVzdWx0KCk7XG4gICAgdGhpcy5jaGVja1RpbWUoKTtcbiAgICB0aGlzLmluaXRSZWFkeSgpO1xuICAgIHRoaXMuZ2V0SW5pdFZhbHVlSW5kZXgoKTtcbiAgfVxuXG4gIHJlbG9hZFBpY2tlcigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGlja2VyKSB7XG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZWxmLnNlbGVjdGVkVGFyZ2V0LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICBzZWxmLmN1cnJlbnRQaWNrZXIuY2hpbGRyZW5baV0uY2hpbGRyZW5bMl0uc3R5bGUudHJhbnNpdGlvbiA9ICd0cmFuc2Zvcm0gLjNzJztcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGl0ZW0uY3VycmVudFksIDApO1xuICAgICAgICAgIHNlbGYuY3VycmVudFBpY2tlci5jaGlsZHJlbltpXS5jaGlsZHJlblsyXS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke2luZGV4ICogc2VsZi5saW5lSGVpZ2h0fXB4KWA7XG4gICAgICAgIH0pO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5sb2NhbGVQcm92aWRlcigpO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY3VycmVudFBpY2tlciA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMucmVsb2FkUGlja2VyKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMudmFsdWUpIHtcbiAgICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IGNoYW5nZXMudmFsdWUuY3VycmVudFZhbHVlO1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnRyYW5zZm9ybURhdGVGb3JtYXQodGhpcy5vcHRpb25zLnZhbHVlKS5zcGxpdCgnLScpO1xuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VGltZSA9IHZhbHVlLm1hcChpdGVtID0+IHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoaXRlbSwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5qdWRnZUVxdWFsQXJyYXkodGhpcy5jdXJyZW50VGltZSwgdGhpcy5yZXN1bHRBcnIsIHRoaXMucmVzdWx0QXJyLmxlbmd0aCkgfHxcbiAgICAgICAgdGhpcy5qdWRnZUVxdWFsQXJyYXkodGhpcy5jdXJyZW50VGltZSwgdGhpcy5taW5fZGF0ZSwgdGhpcy5jdXJyZW50VGltZS5sZW5ndGgpIHx8XG4gICAgICAgIHRoaXMuanVkZ2VUaW1lKHRoaXMuY3VycmVudFRpbWUsIHRoaXMubWF4X2RhdGUpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMubW9kZSB8fCBjaGFuZ2VzLm1pbkRhdGUgfHwgY2hhbmdlcy5tYXhEYXRlIHx8IGNoYW5nZXMuZGlzYWJsZWQgfHwgY2hhbmdlcy5sb2NhbGUpIHtcbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9jYWxlUHJvdmlkZXJTZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbGUtcHJvdmlkZXIuc2VydmljZSc7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ2xvY2FsZVByb3ZpZGVyJ1xufSlcbmV4cG9ydCBjbGFzcyBMb2NhbGVQcm92aWRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9jYWxlOiBMb2NhbGVQcm92aWRlclNlcnZpY2UpIHt9XG5cbiAgdHJhbnNmb3JtKGtleVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZS5nZXRMb2NhbGVWYWx1ZShrZXlQYXRoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB6aF9DTiBmcm9tICcuL2xhbmd1YWdlcy96aF9DTic7XG5pbXBvcnQgeyBMb2NhbGVQcm92aWRlclBpcGUgfSBmcm9tICcuL2xvY2FsZS1wcm92aWRlci5waXBlJztcbmltcG9ydCB7IExPQ0FMX1BST1ZJREVSX1RPS0VOIH0gZnJvbSAnLi9sb2NhbGUtcHJvdmlkZXIudG9rZW4nO1xuaW1wb3J0IHsgTE9DQUxFX1BST1ZJREVSX1NFUlZJQ0VfUFJPVklERVIgfSBmcm9tICcuL2xvY2FsZS1wcm92aWRlci5zZXJ2aWNlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW10sXG4gIGRlY2xhcmF0aW9uczogW0xvY2FsZVByb3ZpZGVyUGlwZV0sXG4gIGV4cG9ydHM6IFtMb2NhbGVQcm92aWRlclBpcGVdLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IExPQ0FMX1BST1ZJREVSX1RPS0VOLCB1c2VWYWx1ZTogemhfQ04gfSwgTE9DQUxFX1BST1ZJREVSX1NFUlZJQ0VfUFJPVklERVJdXG59KVxuZXhwb3J0IGNsYXNzIExvY2FsZVByb3ZpZGVyTW9kdWxlIHt9XG4iLCJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBDb21wb25lbnRSZWYsXG4gIE9uRGVzdHJveSxcbiAgRWxlbWVudFJlZixcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIEluamVjdG9yLFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIENvbXBvbmVudEZhY3RvcnksXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRlUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRlLXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlck9wdGlvbnMgfSBmcm9tICcuL2RhdGUtcGlja2VyLW9wdGlvbnMucHJvdmlkZXInO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbRGF0ZVBpY2tlcl0nXG59KVxuZXhwb3J0IGNsYXNzIERhdGVQaWNrZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgT25Jbml0IHtcbiAgcGlja2VyOiBDb21wb25lbnRSZWY8RGF0ZVBpY2tlckNvbXBvbmVudD47XG4gIHByaXZhdGUgX2V2ZW50TGlzdGVuZXJzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIGlzT3BlbjogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgbW9kZTogc3RyaW5nO1xuICBASW5wdXQoKVxuICBtaW5EYXRlOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIG1heERhdGU6IHN0cmluZztcbiAgQElucHV0KClcbiAgdXNlMTJIb3VyczogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgdmFsdWU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuICBASW5wdXQoKVxuICBtYXNrOiBib29sZWFuO1xuICBASW5wdXQoKVxuICB0aXRsZTogc3RyaW5nO1xuICBASW5wdXQoKVxuICBva1RleHQ6IHN0cmluZztcbiAgQElucHV0KClcbiAgZGlzbWlzc1RleHQ6IHN0cmluZztcbiAgQElucHV0KClcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIGxvY2FsZTogYW55O1xuICBASW5wdXQoKVxuICBhcHBlbmRUb0JvZHk6IGJvb2xlYW47XG4gIEBPdXRwdXQoKVxuICBvblZpc2libGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIodHJ1ZSk7XG4gIEBPdXRwdXQoKVxuICBvblZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIG9uT2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgb25EaXNtaXNzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdExpc3RlbmVyKCdjbGljaycpXG4gIHRvZ2dsZVBpY2tlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGlja2VyKSB7XG4gICAgICB0aGlzLnNob3dQaWNrZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlUGlja2VyKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIF9lbG06IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfZGVmYXVsdE9wdGlvbnM6IERhdGVQaWNrZXJPcHRpb25zLFxuICAgIHByaXZhdGUgX2NmcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG4gICkge31cblxuICBzaG93UGlja2VyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5waWNrZXIpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9ldmVudExpc3RlbmVycyA9IFtdO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBuZXcgRGF0ZVBpY2tlck9wdGlvbnMoKTtcbiAgICAgIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgdGhpcy5fZGVmYXVsdE9wdGlvbnMsIHtcbiAgICAgICAgaGlkZVBpY2tlcjogKGV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5oaWRlUGlja2VyKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvcHRpb25hbFBhcmFtczogQXJyYXk8a2V5b2YgRGF0ZVBpY2tlckRpcmVjdGl2ZT4gPSBbXG4gICAgICAgICdtb2RlJyxcbiAgICAgICAgJ21pbkRhdGUnLFxuICAgICAgICAnbWF4RGF0ZScsXG4gICAgICAgICd2YWx1ZScsXG4gICAgICAgICdtYXNrJyxcbiAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgJ29rVGV4dCcsXG4gICAgICAgICdkaXNtaXNzVGV4dCcsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdsb2NhbGUnLFxuICAgICAgICAnYXBwZW5kVG9Cb2R5JyxcbiAgICAgICAgJ29uT2snLFxuICAgICAgICAnb25EaXNtaXNzJyxcbiAgICAgICAgJ29uVmFsdWVDaGFuZ2UnXG4gICAgICBdO1xuICAgICAgb3B0aW9uYWxQYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpc1twYXJhbV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgKG9wdGlvbnMgYXMgYW55KVtwYXJhbV0gPSB0aGlzW3BhcmFtXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5PERhdGVQaWNrZXJDb21wb25lbnQ+ID0gdGhpcy5fY2ZyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KFxuICAgICAgICBEYXRlUGlja2VyQ29tcG9uZW50XG4gICAgICApO1xuICAgICAgY29uc3QgY2hpbGRJbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZShbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBEYXRlUGlja2VyT3B0aW9ucyxcbiAgICAgICAgICB1c2VWYWx1ZTogb3B0aW9uc1xuICAgICAgICB9XG4gICAgICBdKTtcbiAgICAgIHRoaXMucGlja2VyID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoXG4gICAgICAgIGNvbXBvbmVudEZhY3RvcnksXG4gICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYubGVuZ3RoLFxuICAgICAgICBjaGlsZEluamVjdG9yXG4gICAgICApO1xuICAgICAgaWYgKG9wdGlvbnMuYXBwZW5kVG9Cb2R5KSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5waWNrZXIubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZS5lbWl0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGhpZGVQaWNrZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGlja2VyKSB7XG4gICAgICB0aGlzLnBpY2tlci5kZXN0cm95KCk7XG4gICAgICBkZWxldGUgdGhpcy5waWNrZXI7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLmZvckVhY2goZm4gPT4gZm4oKSk7XG4gICAgICB0aGlzLl9ldmVudExpc3RlbmVycyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLmlzT3Blbikge1xuICAgICAgaWYgKGNoYW5nZXMuaXNPcGVuLmN1cnJlbnRWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnNob3dQaWNrZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlkZVBpY2tlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuaGlkZVBpY2tlcigpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERhdGVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGUtcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRlUGlja2VyRGlyZWN0aXZlIH0gZnJvbSAnLi9kYXRlLXBpY2tlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlck9wdGlvbnMgfSBmcm9tICcuL2RhdGUtcGlja2VyLW9wdGlvbnMucHJvdmlkZXInO1xuaW1wb3J0IHsgTG9jYWxlUHJvdmlkZXJNb2R1bGUgfSBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvbG9jYWxlLXByb3ZpZGVyLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIExvY2FsZVByb3ZpZGVyTW9kdWxlXSxcbiAgZXhwb3J0czogW0RhdGVQaWNrZXJDb21wb25lbnQsIERhdGVQaWNrZXJEaXJlY3RpdmVdLFxuICBkZWNsYXJhdGlvbnM6IFtEYXRlUGlja2VyQ29tcG9uZW50LCBEYXRlUGlja2VyRGlyZWN0aXZlXSxcbiAgZW50cnlDb21wb25lbnRzOiBbRGF0ZVBpY2tlckNvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW0RhdGVQaWNrZXJPcHRpb25zLCBMb2NhbGVQcm92aWRlck1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVBpY2tlck1vZHVsZSB7fVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEYXRlUGlja2VyVmlld0NvbXBvbmVudCB9IGZyb20gJy4vZGF0ZS1waWNrZXItdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9jYWxlUHJvdmlkZXJNb2R1bGUgfSBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvbG9jYWxlLXByb3ZpZGVyLm1vZHVsZSc7XG5pbXBvcnQgeyBEYXRlUGlja2VyTW9kdWxlIH0gZnJvbSAnLi4vZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIubW9kdWxlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRGF0ZVBpY2tlck1vZHVsZSwgTG9jYWxlUHJvdmlkZXJNb2R1bGVdLFxuICBleHBvcnRzOiBbRGF0ZVBpY2tlclZpZXdDb21wb25lbnRdLFxuICBkZWNsYXJhdGlvbnM6IFtEYXRlUGlja2VyVmlld0NvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW0xvY2FsZVByb3ZpZGVyTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VyVmlld01vZHVsZSB7fVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJy4vY2FsZW5kYXIuY29tcG9uZW50JztcbmltcG9ydCB7IEhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4vaGVhZGVyL2hlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaW1lUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi90aW1lcGlja2VyL3RpbWVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFdlZWtQYW5lbENvbXBvbmVudCB9IGZyb20gJy4vd2Vlay1wYW5lbC93ZWVrLXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb25maXJtUGFuZWxDb21wb25lbnQgfSBmcm9tICcuL2NvbmZpcm0tcGFuZWwvY29uZmlybS1wYW5lbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2luZ2xlTW9udGhDb21wb25lbnQgfSBmcm9tICcuL3NpbmdsZS1tb250aC9zaW5nbGUtbW9udGguY29tcG9uZW50JztcbmltcG9ydCB7IFNob3J0Y3V0UGFuZWxDb21wb25lbnQgfSBmcm9tICcuL3Nob3J0Y3V0LXBhbmVsL3Nob3J0Y3V0LXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRlUGlja2VyVmlld01vZHVsZSB9IGZyb20gJy4uL2RhdGUtcGlja2VyLXZpZXcvZGF0ZS1waWNrZXItdmlldy5tb2R1bGUnO1xuaW1wb3J0IHsgSWNvbk1vZHVsZSB9IGZyb20gJy4uL2ljb24vaWNvbi5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJY29uTW9kdWxlLCBEYXRlUGlja2VyVmlld01vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIENhbGVuZGFyQ29tcG9uZW50LFxuICAgIEhlYWRlckNvbXBvbmVudCxcbiAgICBEYXRlUGlja2VyQ29tcG9uZW50LFxuICAgIFdlZWtQYW5lbENvbXBvbmVudCxcbiAgICBTaW5nbGVNb250aENvbXBvbmVudCxcbiAgICBDb25maXJtUGFuZWxDb21wb25lbnQsXG4gICAgVGltZVBpY2tlckNvbXBvbmVudCxcbiAgICBTaG9ydGN1dFBhbmVsQ29tcG9uZW50XG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBDYWxlbmRhckNvbXBvbmVudCxcbiAgICBIZWFkZXJDb21wb25lbnQsXG4gICAgRGF0ZVBpY2tlckNvbXBvbmVudCxcbiAgICBXZWVrUGFuZWxDb21wb25lbnQsXG4gICAgU2luZ2xlTW9udGhDb21wb25lbnQsXG4gICAgQ29uZmlybVBhbmVsQ29tcG9uZW50LFxuICAgIFRpbWVQaWNrZXJDb21wb25lbnQsXG4gICAgU2hvcnRjdXRQYW5lbENvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyTW9kdWxlIHt9XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEFmdGVyQ29udGVudEluaXQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEVsZW1lbnRSZWYsXG4gIFRlbXBsYXRlUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdQb3BvdmVySXRlbSwgbnptLXBvcG92ZXItaXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wb3BvdmVyLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFBvcG92ZXJJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBwcmVmaXhDbHM6ICdhbS1wb3BvdmVyJyxcbiAgICBkaXNhYmxlZDogZmFsc2VcbiAgfTtcbiAgaXNBY3RpdmUgPSBmYWxzZTtcblxuICBwcml2YXRlIF9zdHlsZTtcbiAgcHJpdmF0ZSBfaWNvbjogVGVtcGxhdGVSZWY8YW55PjtcblxuICBASW5wdXQoKVxuICBnZXQgaWNvbigpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5faWNvbjtcbiAgfVxuICBzZXQgaWNvbih2YWx1ZTogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIHRoaXMuX2ljb24gPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgc3R5bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0eWxlO1xuICB9XG4gIHNldCBzdHlsZSh2YWx1ZSkge1xuICAgIHRoaXMuX3N0eWxlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkKHZhbHVlKSB7XG4gICAgdGhpcy5kZWZhdWx0UHJvcHMuZGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBAT3V0cHV0KClcbiAgc2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXBvcG92ZXItaXRlbScpXG4gIGFtUG9wb3Zlckl0ZW06IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXBvcG92ZXItaXRlbS1hY3RpdmUnKVxuICBnZXQgYW1Qb3BvdmVySXRlbUFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0FjdGl2ZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXBvcG92ZXItaXRlbS1kaXNhYmxlZCcpXG4gIGdldCBhbVBvcG92ZXJJdGVtRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFByb3BzLmRpc2FibGVkO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gIHRvdWNoU3RhcnQoZSkge1xuICAgIHRoaXMuc2VsZWN0LmVtaXQoKTtcbiAgICB0aGlzLmlzQWN0aXZlID0gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge31cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUG9wb3Zlckl0ZW1Db21wb25lbnQgfSBmcm9tICcuL3BvcG92ZXItaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWNvbk1vZHVsZSB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJY29uTW9kdWxlXSxcbiAgZXhwb3J0czogW1BvcG92ZXJJdGVtQ29tcG9uZW50XSxcbiAgZGVjbGFyYXRpb25zOiBbUG9wb3Zlckl0ZW1Db21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIFBvcG92ZXJJdGVtTW9kdWxlIHt9XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiwgSG9zdEJpbmRpbmcgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnRmxleCwgbnptLWZsZXgnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmxleC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgRmxleENvbXBvbmVudCB7XG4gIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBwcmVmaXhDbHM6ICdhbS1mbGV4Ym94JyxcbiAgICBhbGlnbjogJ2NlbnRlcidcbiAgfTtcblxuICAvLyBfd3JhcENscyA9IHt9O1xuICBwcml2YXRlIF9kaXJlY3Rpb246IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF93cmFwOiBzdHJpbmc7XG4gIHByaXZhdGUgX2p1c3RpZnk6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9hbGlnbkNvbnRlbnQ6IHN0cmluZyA9ICcnO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkaXJlY3Rpb24odmFsdWUpIHtcbiAgICB0aGlzLl9kaXJlY3Rpb24gPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgd3JhcCh2YWx1ZSkge1xuICAgIHRoaXMuX3dyYXAgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQganVzdGlmeSh2YWx1ZSkge1xuICAgIHRoaXMuX2p1c3RpZnkgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgYWxpZ24odmFsdWUpIHtcbiAgICB0aGlzLmRlZmF1bHRQcm9wcy5hbGlnbiA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBhbGlnbkNvbnRlbnQodmFsdWUpIHtcbiAgICB0aGlzLl9hbGlnbkNvbnRlbnQgPSB2YWx1ZTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZmxleGJveCcpXG4gIGFtRmxleGJveDogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZmxleGJveC1kaXItcm93JylcbiAgZ2V0IGFtRmxleGJveERpclJvdygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyZWN0aW9uID09PSAncm93JztcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWZsZXhib3gtZGlyLXJvdy1yZXZlcnNlJylcbiAgZ2V0IGFtRmxleGJveERpclJvd1JldmVyc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RpcmVjdGlvbiA9PT0gJ3Jvdy1yZXZlcnNlJztcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWZsZXhib3gtZGlyLWNvbHVtbicpXG4gIGdldCBhbUZsZXhib3hEaXJDb2x1bW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RpcmVjdGlvbiA9PT0gJ2NvbHVtbic7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1mbGV4Ym94LWRpci1jb2x1bW4tcmV2ZXJzZScpXG4gIGdldCBhbUZsZXhib3hEaXJDb2x1bW5SZXZlcnNlKCkge1xuICAgIHJldHVybiB0aGlzLl9kaXJlY3Rpb24gPT09ICdjb2x1bW4tcmV2ZXJzZSc7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1mbGV4Ym94LW5vd3JhcCcpXG4gIGdldCBhbUZsZXhib3hOb3dyYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyYXAgPT09ICdub3dyYXAnO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZmxleGJveC13cmFwJylcbiAgZ2V0IGFtRmxleGJveFdyYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyYXAgPT09ICd3cmFwJztcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWZsZXhib3gtd3JhcC1yZXZlcnNlJylcbiAgZ2V0IGFtRmxleGJveFdyYXBSZXZlcnNlKCkge1xuICAgIHJldHVybiB0aGlzLl93cmFwID09PSAnd3JhcC1yZXZlcnNlJztcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWZsZXhib3gtanVzdGlmeS1zdGFydCcpXG4gIGdldCBhbUZsZXhib3hKdXN0aWZ5U3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2p1c3RpZnkgPT09ICdzdGFydCc7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1mbGV4Ym94LWp1c3RpZnktY2VudGVyJylcbiAgZ2V0IGFtRmxleGJveEp1c3RpZnlDZW50ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2p1c3RpZnkgPT09ICdjZW50ZXInO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZmxleGJveC1qdXN0aWZ5LWVuZCcpXG4gIGdldCBhbUZsZXhib3hKdXN0aWZ5RW5kKCkge1xuICAgIHJldHVybiB0aGlzLl9qdXN0aWZ5ID09PSAnZW5kJztcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWZsZXhib3gtanVzdGlmeS1iZXR3ZWVuJylcbiAgZ2V0IGFtRmxleGJveEp1c3RpZnlCZXR3ZWVuKCkge1xuICAgIHJldHVybiB0aGlzLl9qdXN0aWZ5ID09PSAnYmV0d2Vlbic7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1mbGV4Ym94LWp1c3RpZnktYXJvdW5kJylcbiAgZ2V0IGFtRmxleGJveEFsaWduQXJvdW5kKCkge1xuICAgIHJldHVybiB0aGlzLl9qdXN0aWZ5ID09PSAnYXJvdW5kJztcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWZsZXhib3gtYWxpZ24tc3RhcnQnKVxuICBnZXQgYW1GbGV4Ym94QWxpZ25TdGFydCgpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0UHJvcHMuYWxpZ24gPT09ICdzdGFydCc7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1mbGV4Ym94LWFsaWduLWNlbnRlcicpXG4gIGdldCBhbUZsZXhib3hBbGlnbkNlbnRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0UHJvcHMuYWxpZ24gPT09ICdjZW50ZXInO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZmxleGJveC1hbGlnbi1lbmQnKVxuICBnZXQgYW1GbGV4Ym94QWxpZ25FbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFByb3BzLmFsaWduID09PSAnZW5kJztcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWZsZXhib3gtYWxpZ24tYmFzZWxpbmUnKVxuICBnZXQgYW1GbGV4Ym94QWxpZ25CYXNlbGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0UHJvcHMuYWxpZ24gPT09ICdiYXNlbGluZSc7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1mbGV4Ym94LWFsaWduLXN0cmV0Y2gnKVxuICBnZXQgYW1GbGV4Ym94QWxpZ25TdHJldGNoKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRQcm9wcy5hbGlnbiA9PT0gJ3N0cmV0Y2gnO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZmxleGJveC1hbGlnbi1jb250ZW50LXN0YXJ0JylcbiAgZ2V0IGFtRmxleGJveEFsaWduQ29udGVudFN0YXJ0KCkge1xuICAgIHJldHVybiB0aGlzLl9hbGlnbkNvbnRlbnQgPT09ICdzdGFydCc7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1mbGV4Ym94LWFsaWduLWNvbnRlbnQtY2VudGVyJylcbiAgZ2V0IGFtRmxleGJveEFsaWduQ290ZW50Q2VudGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9hbGlnbkNvbnRlbnQgPT09ICdjZW50ZXInO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZmxleGJveC1hbGlnbi1jb250ZW50LWVuZCcpXG4gIGdldCBhbUZsZXhib3hBbGlnbkNvbnRlbnRFbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FsaWduQ29udGVudCA9PT0gJ2VuZCc7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1mbGV4Ym94LWFsaWduLWNvbnRlbnQtYmV0d2VlbicpXG4gIGdldCBhbUZsZXhib3hBbGlnbkNvbnRlbnRCZXR3ZWVuKCkge1xuICAgIHJldHVybiB0aGlzLl9hbGlnbkNvbnRlbnQgPT09ICdiZXR3ZWVuJztcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWZsZXhib3gtYWxpZ24tY29udGVudC1hcm91bmQnKVxuICBnZXQgYW1GbGV4Ym94QWxpZ25Db250ZW50QXJvdW5kKCkge1xuICAgIHJldHVybiB0aGlzLl9hbGlnbkNvbnRlbnQgPT09ICdhcm91bmQnO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZmxleGJveC1hbGlnbi1jb250ZW50LXN0cmV0Y2gnKVxuICBnZXQgYW1GbGV4Ym94QWxpZ25Db250ZW50U3RyZXRjaCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWxpZ25Db250ZW50ID09PSAnc3RyZXRjaCc7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHt9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0ZsZXhJdGVtLCBuem0tZmxleC1pdGVtJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIGAsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgRmxleEl0ZW1Db21wb25lbnQge1xuICBkZWZhdWx0UHJvcHMgPSB7XG4gICAgcHJlZml4Q2xzOiAnYW0tZmxleGJveCcsXG4gICAgYWxpZ246ICdjZW50ZXInXG4gIH07XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1mbGV4Ym94LWl0ZW0nKVxuICBmbGV4Ym94SXRlbTogYm9vbGVhbiA9IHRydWU7XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZsZXhDb21wb25lbnQsIEZsZXhJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9mbGV4LmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbRmxleENvbXBvbmVudCwgRmxleEl0ZW1Db21wb25lbnRdLFxuICBkZWNsYXJhdGlvbnM6IFtGbGV4Q29tcG9uZW50LCBGbGV4SXRlbUNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgRmxleE1vZHVsZSB7fVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVGVtcGxhdGVSZWYsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0dyaWQsIG56bS1ncmlkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dyaWQuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICB3cmFwQ2xzID0ge307XG4gIGl0ZW1DbHMgPSB7fTtcbiAgY2Fyb3VzZWxQcm9wcyA9IHtcbiAgICBkb3RzOiBmYWxzZSxcbiAgICBkcmFnZ2luZzogZmFsc2VcbiAgfTtcbiAgZGVmYXVsdFByb3BzID0ge1xuICAgIGRhdGE6IFtdLFxuICAgIGhhc0xpbmU6IHRydWUsXG4gICAgaXNDYXJvdXNlbDogZmFsc2UsXG4gICAgY29sdW1uTnVtOiA0LFxuICAgIGNhcm91c2VsTWF4Um93OiAyLFxuICAgIHByZWZpeENsczogJ2FtLWdyaWQnLFxuICAgIHNxdWFyZTogdHJ1ZSxcbiAgICBpdGVtU3R5bGU6IHt9XG4gIH07XG4gIGNhcm91c2VsRGF0YSA9IFtdO1xuICBjYXJvdXNlbERhdGFUbXAgPSBbXTtcbiAgZ3JpZERhdGEgPSBbXTtcblxuICBwcml2YXRlIF9kYXRhID0gW107XG5cbiAgQElucHV0KClcbiAgY29sdW1uTnVtOiBudW1iZXIgPSA0O1xuICBASW5wdXQoKVxuICBjYXJvdXNlbE1heFJvdzogbnVtYmVyID0gMjtcbiAgQElucHV0KClcbiAgaXRlbVN0eWxlOiBvYmplY3QgPSB7fTtcbiAgQElucHV0KClcbiAgc3F1YXJlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgaGFzTGluZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIGdldCBpc0Nhcm91c2VsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRQcm9wcy5pc0Nhcm91c2VsO1xuICB9XG4gIHNldCBpc0Nhcm91c2VsICh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuZGVmYXVsdFByb3BzLmlzQ2Fyb3VzZWwgPSB2YWx1ZTtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuICBASW5wdXQoKVxuICBhY3RpdmVTdHlsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHNldCBkYXRhKHZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG4gIEBPdXRwdXQoKVxuICBPbkNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWdyaWQnKVxuICBhbUdyaWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWdyaWQtc3F1YXJlJylcbiAgZ2V0IGFtR3JpZFNxdWFyZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZSA9PT0gdGhpcy5zcXVhcmU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1ncmlkLWxpbmUnKVxuICBnZXQgYW1HcmlkTGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZSA9PT0gdGhpcy5oYXNMaW5lO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZ3JpZC1jYXJvdXNlbCcpXG4gIGdldCBhbUdyaWRDYXJvdXNlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZSA9PT0gdGhpcy5pc0Nhcm91c2VsO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGlzVGVtcGxhdGVSZWYodmFsdWU6IHt9KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG4gIH1cblxuICBpc1VSTCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUuaW5kZXhPZignaHR0cCcpID49IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpbml0KCkge1xuICAgIGNvbnN0IGRhdGFMZW5ndGggPSAodGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLmxlbmd0aCkgfHwgMDtcbiAgICBsZXQgcm93Q291bnQgPSBNYXRoLmNlaWwoZGF0YUxlbmd0aCAvIHRoaXMuY29sdW1uTnVtKTtcbiAgICBsZXQgcm93c0FycjtcbiAgICBpZiAodGhpcy5kZWZhdWx0UHJvcHMuaXNDYXJvdXNlbCkge1xuICAgICAgaWYgKHJvd0NvdW50ICUgdGhpcy5jYXJvdXNlbE1heFJvdyAhPT0gMCkge1xuICAgICAgICByb3dDb3VudCA9IHJvd0NvdW50ICsgdGhpcy5jYXJvdXNlbE1heFJvdyAtIChyb3dDb3VudCAlIHRoaXMuY2Fyb3VzZWxNYXhSb3cpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFnZUNvdW50ID0gTWF0aC5jZWlsKHJvd0NvdW50IC8gdGhpcy5jYXJvdXNlbE1heFJvdyk7XG4gICAgICByb3dzQXJyID0gdGhpcy5nZXRSb3dzKHJvd0NvdW50LCBkYXRhTGVuZ3RoKTtcbiAgICAgIGlmIChwYWdlQ291bnQgPD0gMSkge1xuICAgICAgICB0aGlzLmNhcm91c2VsUHJvcHMgPSB7XG4gICAgICAgICAgZG90czogZmFsc2UsXG4gICAgICAgICAgZHJhZ2dpbmc6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhcm91c2VsUHJvcHMgPSB7XG4gICAgICAgICAgZG90czogdHJ1ZSxcbiAgICAgICAgICBkcmFnZ2luZzogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhpcy5jYXJvdXNlbERhdGFUbXAgPSB0aGlzLmdldENhcm91c2VsRGF0YShyb3dzQXJyLCBwYWdlQ291bnQsIHJvd0NvdW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ncmlkRGF0YSA9IHRoaXMuZ2V0Um93cyhyb3dDb3VudCwgZGF0YUxlbmd0aCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2Fyb3VzZWxEYXRhKHJvd3NBcnI6IGFueVtdLCBwYWdlQ291bnQ6IG51bWJlciwgcm93Q291bnQ6IG51bWJlcikge1xuICAgIGNvbnN0IHBhZ2VzQXJyOiBhbnlbXSA9IFtdO1xuICAgIGZvciAobGV0IHBhZ2VJbmRleCA9IDA7IHBhZ2VJbmRleCA8IHBhZ2VDb3VudDsgcGFnZUluZGV4KyspIHtcbiAgICAgIGNvbnN0IHBhZ2VSb3dzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IHRoaXMuY2Fyb3VzZWxNYXhSb3c7IGlpKyspIHtcbiAgICAgICAgY29uc3Qgcm93SW5kZXggPSBwYWdlSW5kZXggKiB0aGlzLmNhcm91c2VsTWF4Um93ICsgaWk7XG4gICAgICAgIGlmIChyb3dJbmRleCA8IHJvd0NvdW50KSB7XG4gICAgICAgICAgcGFnZVJvd3MucHVzaChyb3dzQXJyW3Jvd0luZGV4XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gw6fCqcK6w6jCisKCw6fCgsK5w6TCuMK6w6TCusKGw6fCocKuw6TCv8Kdw6bCnMKrw6XCsMK+w6nCocK1w6fCmsKEw6bCnMKAw6XCkMKOw6bCnMKqw6XCiMKww6XCusKVw6fCmsKEw6jCocKMw6bCnMKJw6XCusKVw6fCusK/KMOmwqDCt8OlwrzCj8OkwrjCrWxhc3QtY2hpbGTDpMK8wprDpsKywqHDp8K6wr8pXG4gICAgICAgICAgcGFnZVJvd3MucHVzaChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFnZXNBcnIucHVzaChwYWdlUm93cyk7XG4gICAgfVxuICAgIHJldHVybiBwYWdlc0FycjtcbiAgfVxuXG4gIGdldFJvd3Mocm93Q291bnQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyKSB7XG4gICAgY29uc3QgY29sdW1uTnVtID0gdGhpcy5jb2x1bW5OdW07XG4gICAgY29uc3Qgcm93QXJyID0gbmV3IEFycmF5KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dDb3VudDsgaSsrKSB7XG4gICAgICByb3dBcnJbaV0gPSBuZXcgQXJyYXkoKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sdW1uTnVtOyBqKyspIHtcbiAgICAgICAgY29uc3QgZGF0YUluZGV4ID0gaSAqIGNvbHVtbk51bSArIGo7XG4gICAgICAgIGlmIChkYXRhSW5kZXggPCBkYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgcm93QXJyW2ldW2pdID0gdGhpcy5fZGF0YVtkYXRhSW5kZXhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvd0FycltpXVtqXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd0FycjtcbiAgfVxuXG4gIGNsaWNrKGRhdGEsIGluZGV4KSB7XG4gICAgY29uc3Qgb3V0cHV0RGF0YSA9IHtcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIHRoaXMuT25DbGljay5lbWl0KG91dHB1dERhdGEpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pdGVtQ2xzID0ge1xuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30taXRlbWBdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30tYWN0aXZlLWl0ZW1gXTogZmFsc2VcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBFbGVtZW50UmVmLFxuICBPbkluaXQsXG4gIFJlbmRlcmVyMixcbiAgSW5qZWN0aW9uVG9rZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgSU5URVJGQUNFX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuPGFueT4oJ0ludGVyZmFjZVRva2VuJyk7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tUb3VjaEZlZWRiYWNrXSdcbn0pXG5leHBvcnQgY2xhc3MgVG91Y2hGZWVkYmFja0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHJpdmF0ZSBfY2xhc3NOYW1lO1xuICBASW5wdXQoKSBjbGFzc05hbWU6IEFycmF5PHN0cmluZz47XG4gIEBJbnB1dCgpIGFjdGl2ZVN0eWxlID0gdHJ1ZTtcbiAgQE91dHB1dCgpIGNsaWNrU3RhcnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY2xpY2tFbmQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjJcbiAgKSB7XG5cbiAgfVxuXG4gIHByaXZhdGUgYWRkQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUNsYXNzKGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBjbGFzc05hbWUpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWU7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgdG91Y2hTdGFydCgpIHtcbiAgICBpZiAodGhpcy5hY3RpdmVTdHlsZSkge1xuICAgICAgdGhpcy5hZGRDbGFzcyh0aGlzLl9jbGFzc05hbWUpO1xuICAgICAgdGhpcy5jbGlja1N0YXJ0LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd0b3VjaGVuZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNldXAnLCBbJyRldmVudCddKVxuICB0b3VjaEVuZCgpIHtcbiAgICBpZiAodGhpcy5hY3RpdmVTdHlsZSkge1xuICAgICAgdGhpcy5yZW1vdmVDbGFzcyh0aGlzLl9jbGFzc05hbWUpO1xuICAgICAgdGhpcy5jbGlja0VuZC5lbWl0KCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBIb3N0TGlzdGVuZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgRWxlbWVudFJlZixcbiAgUmVuZGVyZXIyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdUb3VjaEZlZWRCYWNrJyxcbiAgdGVtcGxhdGU6ICc8bmctY29udGVudD48L25nLWNvbnRlbnQ+JyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBUb3VjaEZlZWRCYWNrQ29tcG9uZW50IHtcbiAgQElucHV0KCkgYWN0aXZlQ2xhc3NOYW1lID0gJyc7XG4gIEBJbnB1dCgpIGFjdGl2ZVN0eWxlID0gdHJ1ZTtcblxuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgdG91Y2hTdGFydCgpIHtcbiAgICBpZiAodGhpcy5hY3RpdmVTdHlsZSkge1xuICAgICAgdGhpcy5fcmVuZGVyLmFkZENsYXNzKHRoaXMuX2VsZS5uYXRpdmVFbGVtZW50LCB0aGlzLmFjdGl2ZUNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcsIFsnJGV2ZW50J10pXG4gIHRvdWNoRW5kKCkge1xuICAgIGlmICh0aGlzLmFjdGl2ZVN0eWxlKSB7XG4gICAgICB0aGlzLl9yZW5kZXIucmVtb3ZlQ2xhc3ModGhpcy5fZWxlLm5hdGl2ZUVsZW1lbnQsIHRoaXMuYWN0aXZlQ2xhc3NOYW1lKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGU6IEVsZW1lbnRSZWYsIHByaXZhdGUgX3JlbmRlcjogUmVuZGVyZXIyKSB7fVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlDb25maWcsIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBvcHVwU2VydmljZSB7XG4gIHN0YXRpYyB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmID0gbnVsbDtcbiAgc3RhdGljIG92ZXJsYXk6IE92ZXJsYXkgPSBudWxsO1xuICBzdGF0aWMgb3ZlcmxheVJlZjogT3ZlcmxheVJlZiA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIF9vdmVybGF5OiBPdmVybGF5LFxuICAgIHB1YmxpYyBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZlxuICApIHtcbiAgICBQb3B1cFNlcnZpY2Uudmlld0NvbnRhaW5lclJlZiA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWY7XG4gICAgUG9wdXBTZXJ2aWNlLm92ZXJsYXkgPSB0aGlzLl9vdmVybGF5O1xuICB9XG5cbiAgc3RhdGljIHNob3dQb3B1cChjb21wb25lbnQsIGNoaWxkSW5qZWN0b3I/OiBJbmplY3Rvcik6IHZvaWQge1xuICAgIGxldCBvdmVybGF5Q29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoKTtcbiAgICBvdmVybGF5Q29uZmlnLmhhc0JhY2tkcm9wID0gdHJ1ZTtcbiAgICBQb3B1cFNlcnZpY2Uub3ZlcmxheVJlZiA9IFBvcHVwU2VydmljZS5vdmVybGF5LmNyZWF0ZShvdmVybGF5Q29uZmlnKTtcbiAgICBQb3B1cFNlcnZpY2Uub3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIFBvcHVwU2VydmljZS5vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICB9KTtcblxuICAgIFBvcHVwU2VydmljZS5vdmVybGF5UmVmLmF0dGFjaChuZXcgQ29tcG9uZW50UG9ydGFsKGNvbXBvbmVudCwgUG9wdXBTZXJ2aWNlLnZpZXdDb250YWluZXJSZWYsIGNoaWxkSW5qZWN0b3IpKTtcbiAgfVxuXG4gIHN0YXRpYyBoaWRlUG9wdXAoKTogdm9pZCB7XG4gICAgaWYgKFBvcHVwU2VydmljZS5vdmVybGF5UmVmKSB7XG4gICAgICBQb3B1cFNlcnZpY2Uub3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRvdWNoRmVlZGJhY2tEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZS90b3VjaC1mZWVkYmFjay5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgVG91Y2hGZWVkQmFja0NvbXBvbmVudCB9IGZyb20gJy4vZGlyZWN0aXZlL3RvdWNoLWZlZWRiYWNrLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQb3B1cFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3BvcHVwLnNlcnZpY2UnO1xuZXhwb3J0IHsgUG9wdXBTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9wb3B1cC5zZXJ2aWNlJztcbmltcG9ydCB7IE92ZXJsYXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE92ZXJsYXlNb2R1bGVcbiAgXSxcbiAgZXhwb3J0czogW1RvdWNoRmVlZGJhY2tEaXJlY3RpdmUsIFRvdWNoRmVlZEJhY2tDb21wb25lbnRdLFxuICBkZWNsYXJhdGlvbnM6IFtUb3VjaEZlZWRiYWNrRGlyZWN0aXZlLCBUb3VjaEZlZWRCYWNrQ29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbUG9wdXBTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBDb3JlTW9kdWxlIHsgfVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi9ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGbGV4TW9kdWxlIH0gZnJvbSAnLi4vZmxleC9mbGV4Lm1vZHVsZSc7XG5pbXBvcnQgeyBDYXJvdXNlbE1vZHVsZSB9IGZyb20gJy4uL2Nhcm91c2VsL2Nhcm91c2VsLm1vZHVsZSc7XG5pbXBvcnQgeyBJY29uTW9kdWxlIH0gZnJvbSAnLi4vaWNvbi9pY29uLm1vZHVsZSc7XG5pbXBvcnQgeyBDb3JlTW9kdWxlIH0gZnJvbSAnLi4vY29yZS9jb3JlLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtGbGV4TW9kdWxlLCBJY29uTW9kdWxlLCBDb21tb25Nb2R1bGUsIENhcm91c2VsTW9kdWxlLCBDb3JlTW9kdWxlXSxcbiAgZXhwb3J0czogW0dyaWRDb21wb25lbnRdLFxuICBkZWNsYXJhdGlvbnM6IFtHcmlkQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBHcmlkTW9kdWxlIHt9XG4iLCJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuQFBpcGUoeyBuYW1lOiAnc2FmZUhUTUwnIH0pXG5leHBvcnQgY2xhc3MgU2FmZUhUTUxQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3Nhbml0aXplZDogRG9tU2FuaXRpemVyKSB7fVxuXG4gIHRyYW5zZm9ybSh2YWx1ZSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nhbml0aXplZC5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh2YWx1ZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFNhZmVIVE1MUGlwZSB9IGZyb20gJy4vc2F2ZS1odG1sJztcbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBTYWZlSFRNTFBpcGVcbiAgXSxcbiAgZXhwb3J0czogW1NhZmVIVE1MUGlwZV1cbn0pXG5leHBvcnQgY2xhc3MgTmdab3Jyb0FudGRNb2JpbGVQaXBlc01vZHVsZSB7fVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBUZW1wbGF0ZVJlZiwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnQWN0aW9uU2hlZXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWN0aW9uLXNoZWV0LmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBBY3Rpb25TaGVldENvbXBvbmVudCB7XG4gIHByb3BzID0ge1xuICAgIHByZWZpeENsczogJ2FtLWFjdGlvbi1zaGVldCcsXG4gICAgY2FuY2VsQnV0dG9uVGV4dDogJ8Olwo/ClsOmwrbCiCdcbiAgfTtcbiAgZmxhZzogc3RyaW5nID0gJyc7XG4gIHRpdGxlOiBzdHJpbmcgPSAnJztcbiAgbWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIHRyYW5zaXRpb25OYW1lOiBzdHJpbmcgPSAnJztcbiAgbWFza1RyYW5zaXRpb25OYW1lOiBzdHJpbmcgPSAnJztcbiAgYWN0aXZlQ2xhc3NOYW1lID0gW2Ake3RoaXMucHJvcHMucHJlZml4Q2xzfS1idXR0b24tbGlzdC1pdGVtLWFjdGl2ZWBdO1xuICBvblByZXNzO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBzaG93U2hhcmUoZmxhZykge1xuICAgIGNvbnN0IGNscyA9IHsgW2Ake3RoaXMucHJvcHMucHJlZml4Q2xzfS1zaGFyZWBdOiBmbGFnID09PSAnU0hBUkUnIH07XG4gICAgcmV0dXJuIGNscztcbiAgfVxuXG4gIGlzVGVtcGxhdGVSZWYodmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpc0FycmF5KG9wdGlvbnM6IGFueSwgdmFsdWU6IGFueSkge1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDAgJiYgdmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29yZU1vZHVsZSB9IGZyb20gJy4uL2NvcmUvY29yZS5tb2R1bGUnO1xuaW1wb3J0IHsgTGlzdE1vZHVsZSB9IGZyb20gJy4uL2xpc3QvbGlzdC5tb2R1bGUnO1xuaW1wb3J0IHsgTmdab3Jyb0FudGRNb2JpbGVQaXBlc01vZHVsZSB9IGZyb20gJy4uL3BpcGVzL25nLXpvcnJvLWFudGQtbW9iaWxlLnBpcGVzLm1vZHVsZSc7XG5pbXBvcnQgeyBBY3Rpb25TaGVldENvbXBvbmVudCB9IGZyb20gJy4vYWN0aW9uLXNoZWV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXaW5nQmxhbmtNb2R1bGUgfSBmcm9tICcuLi93aW5nLWJsYW5rL3dpbmctYmxhbmsubW9kdWxlJztcbmltcG9ydCB7IFdoaXRlU3BhY2VNb2R1bGV9IGZyb20gJy4uL3doaXRlLXNwYWNlL3doaXRlLXNwYWNlLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE5nWm9ycm9BbnRkTW9iaWxlUGlwZXNNb2R1bGUsIExpc3RNb2R1bGUsIFdoaXRlU3BhY2VNb2R1bGUsIFdpbmdCbGFua01vZHVsZSwgQ29yZU1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIEFjdGlvblNoZWV0Q29tcG9uZW50XG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBBY3Rpb25TaGVldENvbXBvbmVudFxuICBdLFxuICBlbnRyeUNvbXBvbmVudHM6IFtBY3Rpb25TaGVldENvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQWN0aW9uU2hlZXRNb2R1bGUgeyB9XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEhvc3RCaW5kaW5nLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBPbkNoYW5nZUV2ZW50IHtcbiAgc2VsZWN0ZWRJbmRleDogbnVtYmVyO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdTZWdtZW50ZWRDb250cm9sLCBuei1zZWdtZW50ZWQtY29udHJvbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWdtZW50ZWQtY29udHJvbC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgU2VnbWVudGVkQ29udHJvbENvbXBvbmVudCB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLXNlZ21lbnQnO1xuXG4gIEBJbnB1dCgpXG4gIHRpbnRDb2xvcjogc3RyaW5nID0gJyMyREI3RjUnO1xuICBASW5wdXQoKVxuICBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBzZWxlY3RlZEluZGV4OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKVxuICB2YWx1ZXM6IEFycmF5PHN0cmluZz5bXTtcbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8T25DaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPE9uQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICByb2xlID0gJ3RhYmxpc3QnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXNlZ21lbnQnKVxuICBhbVNlZ21lbnQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXNlZ21lbnQtZGlzYWJsZWQnKVxuICBnZXQgYW1EaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBvbkNsaWNrKGluZGV4OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgaW5kZXggIT09IHRoaXMuc2VsZWN0ZWRJbmRleCkge1xuICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoeyBzZWxlY3RlZEluZGV4OiBpbmRleCwgdmFsdWU6IHZhbHVlIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTZWdtZW50ZWRDb250cm9sQ29tcG9uZW50IH0gZnJvbSAnLi9zZWdtZW50ZWQtY29udHJvbC5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbU2VnbWVudGVkQ29udHJvbENvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtTZWdtZW50ZWRDb250cm9sQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBTZWdtZW50ZWRDb250cm9sTW9kdWxlIHt9XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBWaWV3Q2hpbGQsXG4gIFRlbXBsYXRlUmVmLFxuICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1RleHRhcmVhSXRlbSAsIG56bS10ZXh0YXJlYS1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RleHRhcmVhLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRleHRhcmVhSXRlbSksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVGV4dGFyZWFJdGVtIGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRDaGVja2VkIHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tdGV4dGFyZWEnO1xuICB3cmFwQ2xzOiBvYmplY3Q7XG4gIGxhYmVsQ2xzOiBvYmplY3Q7XG4gIGNvbnRyb2xDbHM6IG9iamVjdDtcbiAgY2xlYXJDbHM6IG9iamVjdDtcbiAgaGFzQ291bnQ6IGJvb2xlYW47XG4gIGNoYXJhY3Rlckxlbmd0aDogbnVtYmVyO1xuICBpc1RpdGxlU3RyaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgbWF4TGVuZ3RoOiBudW1iZXIgPSBJbmZpbml0eTtcblxuICBwcml2YXRlIF9wcmVmaXhMaXN0Q2xzID0gJ2FtLWxpc3QnO1xuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2VkaXRhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY2xlYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcm93czogbnVtYmVyID0gMTtcbiAgcHJpdmF0ZSBfY291bnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfYXV0b0hlaWdodDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbGFiZWxOdW1iZXI6IG51bWJlciA9IDU7XG4gIHByaXZhdGUgX25hbWU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF90aXRsZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgcHJpdmF0ZSBfZm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfYXV0b0ZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzQ2xlYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNDbGlja2luZ0NsZWFyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgndGV4dCcpXG4gIHRleHRSZWY7XG5cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2OiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9ICcnO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgdGhpcy50ZXh0UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZGVmYXVsdFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgfVxuICBzZXQgZGVmYXVsdFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgICB0aGlzLnRleHRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjtcbiAgfVxuICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGVkaXRhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lZGl0YWJsZTtcbiAgfVxuICBzZXQgZWRpdGFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lZGl0YWJsZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENscygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBjbGVhcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2xlYXI7XG4gIH1cbiAgc2V0IGNsZWFyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fY2xlYXIgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgcm93cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yb3dzO1xuICB9XG4gIHNldCByb3dzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9yb3dzID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZXJyb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Vycm9yO1xuICB9XG4gIHNldCBlcnJvcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Vycm9yID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbGFiZWxOdW1iZXIodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2xhYmVsTnVtYmVyID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgY291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY291bnQ7XG4gIH1cbiAgc2V0IGNvdW50KHZhbHVlKSB7XG4gICAgdGhpcy5fY291bnQgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENscygpO1xuICAgIHRoaXMuc2V0Q2hhcmFjdGVyTGVuZ3RoKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHByZWZpeExpc3RDbHMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZml4TGlzdENscztcbiAgfVxuICBzZXQgcHJlZml4TGlzdENscyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcHJlZml4TGlzdENscyA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSB2YWx1ZTtcbiAgICB0aGlzLnRleHRSZWYubmF0aXZlRWxlbWVudC5uYW1lID0gdGhpcy5fbmFtZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgYXV0b0hlaWdodCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2F1dG9IZWlnaHQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdGl0bGUoKTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX3RpdGxlO1xuICB9XG4gIHNldCB0aXRsZSh2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIHRoaXMuX3RpdGxlID0gdmFsdWU7XG4gICAgdGhpcy5pc1RpdGxlU3RyaW5nID0gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5pc1RpdGxlU3RyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBmb2N1cyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5mb2N1cykge1xuICAgICAgdGhpcy50ZXh0UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIHRoaXMuaW5wdXRGb2N1cygnJyk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBhdXRvRm9jdXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dG9Gb2N1cztcbiAgfVxuICBzZXQgYXV0b0ZvY3VzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fYXV0b0ZvY3VzID0gdmFsdWU7XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25CbHVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25Gb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uRXJyb3JDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc2V0Q2xzKCkge1xuICAgIHRoaXMuaGFzQ291bnQgPSB0aGlzLl9jb3VudCA+IDAgJiYgdGhpcy5fcm93cyA+IDE7XG4gICAgdGhpcy53cmFwQ2xzID0ge1xuICAgICAgW2Ake3RoaXMuX3ByZWZpeExpc3RDbHN9LWl0ZW1gXTogdHJ1ZSxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30taXRlbWBdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1kaXNhYmxlZGBdOiB0aGlzLl9kaXNhYmxlZCxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tZXJyb3JgXTogdGhpcy5fZXJyb3IsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWZvY3VzYF06IHRoaXMuX2ZvY3VzLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1pdGVtLXNpbmdsZS1saW5lYF06IHRoaXMuX3Jvd3MgPT09IDEgJiYgIXRoaXMuX2F1dG9IZWlnaHQsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWhhcy1jb3VudGBdOiB0aGlzLmhhc0NvdW50XG4gICAgfTtcbiAgICB0aGlzLmxhYmVsQ2xzID0ge1xuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1sYWJlbGBdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1sYWJlbC0yYF06IHRoaXMuX2xhYmVsTnVtYmVyID09PSAyLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1sYWJlbC0zYF06IHRoaXMuX2xhYmVsTnVtYmVyID09PSAzLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1sYWJlbC00YF06IHRoaXMuX2xhYmVsTnVtYmVyID09PSA0LFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1sYWJlbC01YF06IHRoaXMuX2xhYmVsTnVtYmVyID09PSA1LFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1sYWJlbC02YF06IHRoaXMuX2xhYmVsTnVtYmVyID09PSA2LFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1sYWJlbC03YF06IHRoaXMuX2xhYmVsTnVtYmVyID09PSA3XG4gICAgfTtcbiAgICB0aGlzLmNvbnRyb2xDbHMgPSB7IFtgJHt0aGlzLnByZWZpeENsc30tY29udHJvbGBdOiB0cnVlIH07XG4gICAgdGhpcy5jbGVhckNscyA9IHtcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY2xlYXItYWN0aXZlYF06IHRoaXMuX2lzQ2xpY2tpbmdDbGVhclxuICAgIH07XG4gIH1cbiAgc2V0Q2hhcmFjdGVyTGVuZ3RoKCkge1xuICAgIHRoaXMuY2hhcmFjdGVyTGVuZ3RoID0gdGhpcy5jb3VudFN5bWJvbHModGhpcy5fdmFsdWUpO1xuICAgIGlmICh0aGlzLl9jb3VudCA+IDApIHtcbiAgICAgIHRoaXMubWF4TGVuZ3RoID0gdGhpcy5fY291bnQgLSB0aGlzLmNoYXJhY3Rlckxlbmd0aCArICh0aGlzLl92YWx1ZSA/IHRoaXMuX3ZhbHVlLmxlbmd0aCA6IDApO1xuICAgIH1cbiAgfVxuXG4gIGlucHV0Q2hhbmdlKGUpIHtcbiAgICB0aGlzLl92YWx1ZSA9IGU7XG4gICAgdGhpcy50ZXh0UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgICB0aGlzLnNldENoYXJhY3Rlckxlbmd0aCgpO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gIH1cblxuICBpbnB1dEZvY3VzKHZhbHVlKSB7XG4gICAgdGhpcy5fZm9jdXMgPSB0cnVlO1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub25Gb2N1cy5lbWl0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBpbnB1dEJsdXIodmFsdWUsIGV2ZW50KSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9mb2N1cyA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXRDbHMoKTtcbiAgICAgIHRoaXMub25CbHVyLmVtaXQodmFsdWUpO1xuICAgICAgdGhpcy5faXNDbGVhciA9IGZhbHNlO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBjbGVhcklucHV0KCkge1xuICAgIHRoaXMuX2lzQ2xpY2tpbmdDbGVhciA9IHRydWU7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gICAgICB0aGlzLmlucHV0Q2hhbmdlKCcnKTtcbiAgICAgIHRoaXMuaW5wdXRGb2N1cyh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLl9pc0NsaWNraW5nQ2xlYXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuICBlcnJvckNsaWNrKGUpIHtcbiAgICBpZiAodGhpcy5vbkVycm9yQ2xpY2spIHtcbiAgICAgIHRoaXMub25FcnJvckNsaWNrLmVtaXQoZSk7XG4gICAgfVxuICB9XG4gIHJlQWxpZ25IZWlnaHQoKSB7XG4gICAgY29uc3QgdGV4dGFyZWFEb20gPSB0aGlzLnRleHRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB0ZXh0YXJlYURvbS5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICB0ZXh0YXJlYURvbS5zdHlsZS5oZWlnaHQgPSBgJHt0ZXh0YXJlYURvbS5zY3JvbGxIZWlnaHR9cHhgO1xuICB9XG5cbiAgY291bnRTeW1ib2xzKHRleHQgPSAnJykge1xuICAgIGNvbnN0IHJlZ2V4QXN0cmFsU3ltYm9scyA9IC9bXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdfFxcbi9nO1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UocmVnZXhBc3RyYWxTeW1ib2xzLCAnXycpLmxlbmd0aDtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgdGhpcy5zZXRDaGFyYWN0ZXJMZW5ndGgoKTtcbiAgICB0aGlzLnRleHRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xuICAgIGlmICh0aGlzLl9hdXRvSGVpZ2h0ICYmIHRoaXMuX2ZvY3VzKSB7XG4gICAgICB0aGlzLnJlQWxpZ25IZWlnaHQoKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZXh0YXJlYUl0ZW0gfSBmcm9tICcuL3RleHRhcmVhLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQE5nTW9kdWxlKHtcbiAgZXhwb3J0czogW1RleHRhcmVhSXRlbV0sXG4gIGRlY2xhcmF0aW9uczogW1RleHRhcmVhSXRlbSBdLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgVGV4dGFyZWFJdGVtTW9kdWxlIHt9XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBIb3N0QmluZGluZywgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRyaWdnZXIsIHN0YXRlLCBzdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5leHBvcnQgdHlwZSBUYWJQYW5lbFBvc2l0aW9uU3RhdGUgPVxuICB8ICdjZW50ZXItd2l0aC1hbmltYXRpb24nXG4gIHwgJ2NlbnRlci13aXRob3V0LWFuaW1hdGlvbidcbiAgfCAndG9wLXdpdGgtYW5pbWF0aW9uJ1xuICB8ICd0b3Atd2l0aC1hbmltYXRpb24td2l0aC1oaWdoZXItemluZGV4J1xuICB8ICd0b3Atd2l0aG91dC1hbmltYXRpb24nXG4gIHwgJ2xlZnQtd2l0aC1hbmltYXRpb24nXG4gIHwgJ2xlZnQtd2l0aC1hbmltYXRpb24td2l0aC1oaWdoZXItemluZGV4J1xuICB8ICdsZWZ0LXdpdGhvdXQtYW5pbWF0aW9uJ1xuICB8ICdib3R0b20td2l0aC1hbmltYXRpb24nXG4gIHwgJ2JvdHRvbS13aXRoLWFuaW1hdGlvbi13aXRoLWhpZ2hlci16aW5kZXgnXG4gIHwgJ2JvdHRvbS13aXRob3V0LWFuaW1hdGlvbidcbiAgfCAncmlnaHQtd2l0aC1hbmltYXRpb24nXG4gIHwgJ3JpZ2h0LXdpdGgtYW5pbWF0aW9uLXdpdGgtaGlnaGVyLXppbmRleCdcbiAgfCAncmlnaHQtd2l0aG91dC1hbmltYXRpb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdUYWJQYW5lLCBuem0tdGFiLXBhbmUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFiLXBhbmUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtgOmhvc3Qge3RvdWNoLWFjdGlvbjogYXV0b31gXSxcbiAgaG9zdDoge1xuICAgICdbQHRyYW5zbGF0ZVRhYlBhbmVdJzogJ3Bvc2l0aW9uJyxcbiAgICAnKEB0cmFuc2xhdGVUYWJQYW5lLnN0YXJ0KSc6ICdvblRyYW5zbGF0ZVRhYlN0YXJ0ZWQoJGV2ZW50KScsXG4gICAgJyhAdHJhbnNsYXRlVGFiUGFuZS5kb25lKSc6ICdvblRyYW5zbGF0ZVRhYkNvbXBsZXRlKCRldmVudCknXG4gIH0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCd0cmFuc2xhdGVUYWJQYW5lJywgW1xuICAgICAgc3RhdGUoXG4gICAgICAgICdsZWZ0LXdpdGgtYW5pbWF0aW9uJyxcbiAgICAgICAgc3R5bGUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKScsXG4gICAgICAgICAgdHJhbnNpdGlvbjogJy4zcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSknXG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgc3RhdGUoXG4gICAgICAgICdsZWZ0LXdpdGgtYW5pbWF0aW9uLXdpdGgtaGlnaGVyLXppbmRleCcsXG4gICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAnei1pbmRleCc6IDEwMCxcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCknLFxuICAgICAgICAgIHRyYW5zaXRpb246ICcuM3MgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpJ1xuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHN0YXRlKCdsZWZ0LXdpdGhvdXQtYW5pbWF0aW9uJywgc3R5bGUoe3RyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKScgfSkpLFxuICAgICAgc3RhdGUoXG4gICAgICAgICdyaWdodC13aXRoLWFuaW1hdGlvbicsXG4gICAgICAgIHN0eWxlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKScsXG4gICAgICAgICAgdHJhbnNpdGlvbjogJy4zcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSknXG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgc3RhdGUoXG4gICAgICAgICdyaWdodC13aXRoLWFuaW1hdGlvbi13aXRoLWhpZ2hlci16aW5kZXgnLFxuICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgJ3otaW5kZXgnOiAxMDAsXG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMTAwJSwgMCwgMCknLFxuICAgICAgICAgIHRyYW5zaXRpb246ICcuM3MgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpJ1xuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHN0YXRlKCdyaWdodC13aXRob3V0LWFuaW1hdGlvbicsIHN0eWxlKHt0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKScgfSkpLFxuICAgICAgc3RhdGUoXG4gICAgICAgICd0b3Atd2l0aC1hbmltYXRpb24nLFxuICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgLTEwMCUsIDApJyxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAnLjNzIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKSdcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgICBzdGF0ZShcbiAgICAgICAgJ3RvcC13aXRoLWFuaW1hdGlvbi13aXRoLWhpZ2hlci16aW5kZXgnLFxuICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgJ3otaW5kZXgnOiAxMDAsXG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgLTEwMCUsIDApJyxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAnLjNzIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKSdcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgICBzdGF0ZSgndG9wLXdpdGhvdXQtYW5pbWF0aW9uJywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCknIH0pKSxcbiAgICAgIHN0YXRlKFxuICAgICAgICAnYm90dG9tLXdpdGgtYW5pbWF0aW9uJyxcbiAgICAgICAgc3R5bGUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDEwMCUsIDApJyxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAnLjNzIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKSdcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgICBzdGF0ZShcbiAgICAgICAgJ2JvdHRvbS13aXRoLWFuaW1hdGlvbi13aXRoLWhpZ2hlci16aW5kZXgnLFxuICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgJ3otaW5kZXgnOiAxMDAsXG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMTAwJSwgMCknLFxuICAgICAgICAgIHRyYW5zaXRpb246ICcuM3MgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpJ1xuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHN0YXRlKCdib3R0b20td2l0aG91dC1hbmltYXRpb24nLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDEwMCUsIDApJyB9KSksXG4gICAgICBzdGF0ZShcbiAgICAgICAgJ2NlbnRlci13aXRoLWFuaW1hdGlvbicsXG4gICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAnei1pbmRleCc6IDEwMCxcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgICAgICAgdHJhbnNpdGlvbjogJy4zcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSknXG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgc3RhdGUoJ2NlbnRlci13aXRob3V0LWFuaW1hdGlvbicsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH0pKVxuICAgIF0pXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVGFiUGFuZSB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLXRhYnMtcGFuZSc7XG4gIHRpbnRDb2xvcjogc3RyaW5nID0gJyMxMDhlZTknO1xuICB1bnNlbGVjdGVkVGludENvbG9yOiBzdHJpbmcgPSAnIzg4OCc7XG4gIGFjdGl2ZTogYm9vbGVhbiA9IHRydWU7XG4gIGlzVGl0bGVTdHJpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBzaG93VGFiUGFuZWxDb250ZW50OiBib29sZWFuID0gZmFsc2U7XG4gIHBvc2l0aW9uOiBUYWJQYW5lbFBvc2l0aW9uU3RhdGU7XG5cbiAgcHJpdmF0ZSBfdGl0bGU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gIEBJbnB1dCgpXG4gIGdldCB0aXRsZSgpOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3RpdGxlO1xuICB9XG4gIHNldCB0aXRsZSh2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD4pIHtcbiAgICB0aGlzLmlzVGl0bGVTdHJpbmcgPSAhKHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpO1xuICAgIHRoaXMuX3RpdGxlID0gdmFsdWU7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtcGFuZS13cmFwJylcbiAgcGFuZVdyYXA6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtcGFuZS13cmFwLWFjdGl2ZScpXG4gIGdldCB3cmFwQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtcGFuZS13cmFwLWluYWN0aXZlJylcbiAgZ2V0IHdyYXBJbmFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuYWN0aXZlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG9uVHJhbnNsYXRlVGFiU3RhcnRlZChlOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICAoZS50b1N0YXRlID09ICdjZW50ZXItd2l0aC1hbmltYXRpb24nIHx8XG4gICAgICAgIGUudG9TdGF0ZSA9PSAnY2VudGVyLXdpdGhvdXQtYW5pbWF0aW9uJyB8fFxuICAgICAgICBlLnRvU3RhdGUgPT0gJ2xlZnQtd2l0aC1hbmltYXRpb24td2l0aC1oaWdoZXItemluZGV4JyB8fFxuICAgICAgICBlLnRvU3RhdGUgPT0gJ3JpZ2h0LXdpdGgtYW5pbWF0aW9uLXdpdGgtaGlnaGVyLXppbmRleCcgfHxcbiAgICAgICAgZS50b1N0YXRlID09ICd0b3Atd2l0aC1hbmltYXRpb24td2l0aC1oaWdoZXItemluZGV4JyB8fFxuICAgICAgICBlLnRvU3RhdGUgPT0gJ2JvdHRvbS13aXRoLWFuaW1hdGlvbi13aXRoLWhpZ2hlci16aW5kZXgnKSAmJlxuICAgICAgKHRoaXMucG9zaXRpb24gPT0gJ2NlbnRlci13aXRoLWFuaW1hdGlvbicgfHxcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9PSAnY2VudGVyLXdpdGhvdXQtYW5pbWF0aW9uJyB8fFxuICAgICAgICB0aGlzLnBvc2l0aW9uID09ICdsZWZ0LXdpdGgtYW5pbWF0aW9uLXdpdGgtaGlnaGVyLXppbmRleCcgfHxcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9PSAncmlnaHQtd2l0aC1hbmltYXRpb24td2l0aC1oaWdoZXItemluZGV4JyB8fFxuICAgICAgICB0aGlzLnBvc2l0aW9uID09ICd0b3Atd2l0aC1hbmltYXRpb24td2l0aC1oaWdoZXItemluZGV4JyB8fFxuICAgICAgICB0aGlzLnBvc2l0aW9uID09ICdib3R0b20td2l0aC1hbmltYXRpb24td2l0aC1oaWdoZXItemluZGV4JylcbiAgICApIHtcbiAgICAgIHRoaXMuc2hvd1RhYlBhbmVsQ29udGVudCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgb25UcmFuc2xhdGVUYWJDb21wbGV0ZShlOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICBlLnRvU3RhdGUgIT09ICdjZW50ZXItd2l0aC1hbmltYXRpb24nICYmXG4gICAgICBlLnRvU3RhdGUgIT09ICdjZW50ZXItd2l0aG91dC1hbmltYXRpb24nICYmXG4gICAgICBlLnRvU3RhdGUgIT09ICdsZWZ0LXdpdGgtYW5pbWF0aW9uLXdpdGgtaGlnaGVyLXppbmRleCcgJiZcbiAgICAgIGUudG9TdGF0ZSAhPT0gJ3JpZ2h0LXdpdGgtYW5pbWF0aW9uLXdpdGgtaGlnaGVyLXppbmRleCcgJiZcbiAgICAgIGUudG9TdGF0ZSAhPT0gJ3RvcC13aXRoLWFuaW1hdGlvbi13aXRoLWhpZ2hlci16aW5kZXgnICYmXG4gICAgICBlLnRvU3RhdGUgIT09ICdib3R0b20td2l0aC1hbmltYXRpb24td2l0aC1oaWdoZXItemluZGV4JyAmJlxuICAgICAgdGhpcy5wb3NpdGlvbiAhPT0gJ2NlbnRlci13aXRoLWFuaW1hdGlvbicgJiZcbiAgICAgIHRoaXMucG9zaXRpb24gIT09ICdjZW50ZXItd2l0aG91dC1hbmltYXRpb24nICYmXG4gICAgICB0aGlzLnBvc2l0aW9uICE9PSAnbGVmdC13aXRoLWFuaW1hdGlvbi13aXRoLWhpZ2hlci16aW5kZXgnICYmXG4gICAgICB0aGlzLnBvc2l0aW9uICE9PSAncmlnaHQtd2l0aC1hbmltYXRpb24td2l0aC1oaWdoZXItemluZGV4JyAmJlxuICAgICAgdGhpcy5wb3NpdGlvbiAhPT0gJ3RvcC13aXRoLWFuaW1hdGlvbi13aXRoLWhpZ2hlci16aW5kZXgnICYmXG4gICAgICB0aGlzLnBvc2l0aW9uICE9PSAnYm90dG9tLXdpdGgtYW5pbWF0aW9uLXdpdGgtaGlnaGVyLXppbmRleCdcbiAgICApIHtcbiAgICAgIHRoaXMuc2hvd1RhYlBhbmVsQ29udGVudCA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBEb0NoZWNrLFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIFRlbXBsYXRlUmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJQYW5lIH0gZnJvbSAnLi90YWItcGFuZS5jb21wb25lbnQnO1xuXG5leHBvcnQgdHlwZSBUYWJEaXJlY3Rpb24gPSAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuZXhwb3J0IHR5cGUgVGFiQmFyUG9zaXRpb25UeXBlID0gJ3RvcCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICdyaWdodCc7XG5leHBvcnQgaW50ZXJmYWNlIE9uQ2hhbmdlRXZlbnQge1xuICBpbmRleDogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdUYWJzLCBuem0tdGFicycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJzLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBUYWJzIGltcGxlbWVudHMgRG9DaGVjaywgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLXRhYnMnO1xuICBzZWxlY3RlZEtleTogbnVtYmVyID0gMDtcbiAga2V5VG9TZWxlY3Q6IG51bWJlciA9IDA7XG4gIHBhbmVNb3ZlU3R5bGU6IHN0cmluZyA9ICcnO1xuXG4gIHByaXZhdGUgX3N0YXJ0VGltZTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfc3RhcnRQb3NpdGlvbjogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfdmVsb2NpdHlUaHJlc2hvbGQ6IG51bWJlciA9IDAuMztcbiAgcHJpdmF0ZSBfdGFiRGlyZWN0aW9uOiBUYWJEaXJlY3Rpb24gPSAnaG9yaXpvbnRhbCc7XG4gIHByaXZhdGUgX3RhYkJhclBvc2l0aW9uOiBUYWJCYXJQb3NpdGlvblR5cGUgPSAndG9wJztcblxuICBAQ29udGVudENoaWxkcmVuKFRhYlBhbmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgdGFiUGFuZXM6IFF1ZXJ5TGlzdDxUYWJQYW5lPjtcblxuICBAVmlld0NoaWxkKCdUYWJDb250ZW50JylcbiAgdGFiQ29udGVudDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnVGFic0JhclN3aXBlJylcbiAgdGFic0JhclN3aXBlOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdEZWZhdWx0VGFiQmFyJylcbiAgZGVmYXVsdFRhYkJhcjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnVGFic0JhckNvbnRhaW5lcicpXG4gIHRhYnNCYXJDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KClcbiAgcGFnZTogbnVtYmVyID0gNTtcbiAgQElucHV0KClcbiAgc3dpcGVhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgdXNlT25QYW46IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBhbmltYXRlZDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHRhYkJhclVuZGVybGluZVN0eWxlOiBvYmplY3Q7XG4gIEBJbnB1dCgpXG4gIGRpc3RhbmNlVG9DaGFuZ2VUYWI6IG51bWJlciA9IDAuMztcbiAgQElucHV0KClcbiAgdGFiQmFyQWN0aXZlVGV4dENvbG9yOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KClcbiAgdGFiQmFySW5hY3RpdmVUZXh0Q29sb3I6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKVxuICByZW5kZXJUYWJCYXI6IFRlbXBsYXRlUmVmPHZvaWQ+ID0gbnVsbDtcbiAgQElucHV0KClcbiAgdGFiQmFyQmFja2dyb3VuZENvbG9yOiBzdHJpbmcgPSAnI0ZGRic7XG4gIEBJbnB1dCgpXG4gIHRhYkJhclRleHRTdHlsZTogb2JqZWN0ID0ge307XG4gIC8qKiBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzIwODEwIHJlc29sdmVkICoqL1xuICBASW5wdXQoKVxuICB0YWJQYW5lc0NvbXBvbmVudDogUXVlcnlMaXN0PFRhYlBhbmU+ID0gbnVsbDtcbiAgQElucHV0KClcbiAgZ2V0IGFjdGl2ZVRhYigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkS2V5O1xuICB9XG4gIHNldCBhY3RpdmVUYWIodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMua2V5VG9TZWxlY3QgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdGFiQmFyUG9zaXRpb24oKTogVGFiQmFyUG9zaXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiQmFyUG9zaXRpb247XG4gIH1cbiAgc2V0IHRhYkJhclBvc2l0aW9uKHBvc2l0aW9uOiBUYWJCYXJQb3NpdGlvblR5cGUpIHtcbiAgICB0aGlzLl90YWJCYXJQb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIHRoaXMuYW1UYWJzVG9wID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hbVRhYnNMZWZ0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzUmlnaHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNCb3R0b20gPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgdGhpcy5hbVRhYnNUb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNMZWZ0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hbVRhYnNSaWdodCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0JvdHRvbSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHRoaXMuYW1UYWJzVG9wID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzTGVmdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic1JpZ2h0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzQm90dG9tID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIHRoaXMuYW1UYWJzVG9wID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzTGVmdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic1JpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hbVRhYnNCb3R0b20gPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHRhYkRpcmVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiRGlyZWN0aW9uO1xuICB9XG4gIHNldCB0YWJEaXJlY3Rpb24oZGlyZWN0aW9uOiBUYWJEaXJlY3Rpb24pIHtcbiAgICB0aGlzLl90YWJEaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2hvcml6b250YWwnOlxuICAgICAgICB0aGlzLmFtVGFic0hvcml6b250YWwgPSB0cnVlO1xuICAgICAgICB0aGlzLmFtVGFic1ZlcnRpY2FsID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndmVydGljYWwnOlxuICAgICAgICB0aGlzLmFtVGFic0hvcml6b250YWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNWZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZTogRXZlbnRFbWl0dGVyPE9uQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxPbkNoYW5nZUV2ZW50PigpO1xuICBAT3V0cHV0KClcbiAgb25UYWJDbGljazogRXZlbnRFbWl0dGVyPE9uQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxPbkNoYW5nZUV2ZW50PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicycpXG4gIGFtVGFiczogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicy10b3AnKVxuICBhbVRhYnNUb3A6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtbGVmdCcpXG4gIGFtVGFic0xlZnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLXJpZ2h0JylcbiAgYW1UYWJzUmlnaHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLWJvdHRvbScpXG4gIGFtVGFic0JvdHRvbTogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtdmVydGljYWwnKVxuICBhbVRhYnNWZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtaG9yaXpvbnRhbCcpXG4gIGFtVGFic0hvcml6b250YWw6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBjbGlja1RhYihpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRLZXkgIT09IGluZGV4KSB7XG4gICAgICB0aGlzLmtleVRvU2VsZWN0ID0gaW5kZXg7XG4gICAgICB0aGlzLm9uVGFiQ2xpY2suZW1pdCh7IGluZGV4OiB0aGlzLmtleVRvU2VsZWN0IH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldEN1cnJlbnRUYWJQYW5lcygpOiBRdWVyeUxpc3Q8VGFiUGFuZT4ge1xuICAgIHJldHVybiB0aGlzLnRhYlBhbmVzQ29tcG9uZW50IHx8IHRoaXMudGFiUGFuZXM7XG4gIH1cblxuICBvblRvdWNoU3RhcnQoZXZlbnQpIHtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSBldmVudC50aW1lU3RhbXA7XG4gICAgaWYgKHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoJ2hvcml6b250YWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvbiA9XG4gICAgICAgICAgZXZlbnQgJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXMgJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgIH0gZWxzZSBpZiAoJ3ZlcnRpY2FsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb24gPVxuICAgICAgICAgIGV2ZW50ICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Ub3VjaE1vdmUoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKSAmJiB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICgnaG9yaXpvbnRhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLl9zdGFydFBvc2l0aW9uO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPCAwICYmIHRoaXMuYWN0aXZlVGFiID09PSB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPiAwICYmIHRoaXMuYWN0aXZlVGFiID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHZlbG9jaXR5IMOlwrDCj8OkwrrCjsOpwpjCiMOlwoDCvMOmwonCjcOowq7CpMOkwrjCusOmwpjCr3BhbsOmwpPCjcOkwr3CnFxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA8PSB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgIHRoaXMudXNlT25QYW4gJiZcbiAgICAgICAgICB0aGlzLnN3aXBlYWJsZSAmJlxuICAgICAgICAgIHRoaXMuYW5pbWF0ZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5wYW5lTW92ZVN0eWxlID0gJ3RyYW5zbGF0ZTNkKCcgKyBkaXN0YW5jZSArICdweCwgMCwgMCApJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgndmVydGljYWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5fc3RhcnRQb3NpdGlvbjtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgMCAmJiB0aGlzLmFjdGl2ZVRhYiA9PT0gdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID4gMCAmJiB0aGlzLmFjdGl2ZVRhYiA9PT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA8PSB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgIHRoaXMudXNlT25QYW4gJiZcbiAgICAgICAgICB0aGlzLnN3aXBlYWJsZSAmJlxuICAgICAgICAgIHRoaXMuYW5pbWF0ZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5wYW5lTW92ZVN0eWxlID0gJ3RyYW5zbGF0ZTNkKDAsICcgKyBkaXN0YW5jZSArICdweCwgMCApJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uVG91Y2hFbmQoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKSAmJiB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICgnaG9yaXpvbnRhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLl9zdGFydFBvc2l0aW9uO1xuICAgICAgICBjb25zdCBkaXN0YW5jZVRvQ2hhbmdlVGFiUHggPSB0aGlzLnRhYkNvbnRlbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAqIHRoaXMuZGlzdGFuY2VUb0NoYW5nZVRhYjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICh0aGlzLmdldFZlbG9jaXR5KGRpc3RhbmNlLCBldmVudC50aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpIDw9IHRoaXMuX3ZlbG9jaXR5VGhyZXNob2xkICYmXG4gICAgICAgICAgICAodGhpcy51c2VPblBhbiAmJiB0aGlzLnN3aXBlYWJsZSAmJiBNYXRoLmFicyhkaXN0YW5jZSkgPiBkaXN0YW5jZVRvQ2hhbmdlVGFiUHgpKSB8fFxuICAgICAgICAgICh0aGlzLmdldFZlbG9jaXR5KGRpc3RhbmNlLCBldmVudC50aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpID4gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICh0aGlzLnN3aXBlYWJsZSAmJiBNYXRoLmFicyhkaXN0YW5jZSkgPiBkaXN0YW5jZVRvQ2hhbmdlVGFiUHggLyAyKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGRpc3RhbmNlIDwgMCAmJiB0aGlzLmFjdGl2ZVRhYiA8IHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5rZXlUb1NlbGVjdCsrO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPiAwICYmIHRoaXMuYWN0aXZlVGFiID4gMCkge1xuICAgICAgICAgICAgdGhpcy5rZXlUb1NlbGVjdC0tO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhbmVNb3ZlU3R5bGUgPSAndHJhbnNsYXRlM2QoMCwgMCwgMCApJztcbiAgICAgIH0gZWxzZSBpZiAoJ3ZlcnRpY2FsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMuX3N0YXJ0UG9zaXRpb247XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCA9IHRoaXMudGFiQ29udGVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAqIHRoaXMuZGlzdGFuY2VUb0NoYW5nZVRhYjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICh0aGlzLmdldFZlbG9jaXR5KGRpc3RhbmNlLCBldmVudC50aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpIDw9IHRoaXMuX3ZlbG9jaXR5VGhyZXNob2xkICYmXG4gICAgICAgICAgICAodGhpcy51c2VPblBhbiAmJiB0aGlzLnN3aXBlYWJsZSAmJiAgTWF0aC5hYnMoZGlzdGFuY2UpID4gZGlzdGFuY2VUb0NoYW5nZVRhYlB4KSkgfHxcbiAgICAgICAgICAodGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA+IHRoaXMuX3ZlbG9jaXR5VGhyZXNob2xkICYmXG4gICAgICAgICAgICAodGhpcy5zd2lwZWFibGUgJiYgTWF0aC5hYnMoZGlzdGFuY2UpID4gZGlzdGFuY2VUb0NoYW5nZVRhYlB4IC8gMikpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChkaXN0YW5jZSA8IDAgJiYgdGhpcy5hY3RpdmVUYWIgPCB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMua2V5VG9TZWxlY3QrKztcbiAgICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID4gMCAmJiB0aGlzLmFjdGl2ZVRhYiA+IDApIHtcbiAgICAgICAgICAgIHRoaXMua2V5VG9TZWxlY3QtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYW5lTW92ZVN0eWxlID0gJ3RyYW5zbGF0ZTNkKDAsIDAsIDAgKSc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuc2VsZWN0VGFiUGFuZSh0aGlzLmtleVRvU2VsZWN0KTtcbiAgICB0aGlzLnNlbGVjdGVkS2V5ID0gdGhpcy5rZXlUb1NlbGVjdDtcbiAgfVxuXG4gIG5nRG9DaGVjaygpIHtcbiAgICBpZiAodGhpcy5rZXlUb1NlbGVjdCAhPT0gdGhpcy5zZWxlY3RlZEtleSAmJiB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpICYmIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RUYWJQYW5lKHRoaXMua2V5VG9TZWxlY3QpO1xuICAgICAgdGhpcy5zZWxlY3RlZEtleSA9IHRoaXMua2V5VG9TZWxlY3Q7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoeyBpbmRleDogdGhpcy5zZWxlY3RlZEtleSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdFRhYlBhbmUoaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGtleVRvU2VsZWN0ID0gTWF0aC5taW4odGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggLSAxLCBNYXRoLm1heChpbmRleCB8fCAwLCAwKSk7XG4gICAgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5mb3JFYWNoKCh0YWJQYW5lOiBUYWJQYW5lLCBpbmRleEtleTogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoa2V5VG9TZWxlY3QgPCBpbmRleEtleSkge1xuICAgICAgICBpZiAodGhpcy5hbmltYXRlZCkge1xuICAgICAgICAgIGlmICgnaG9yaXpvbnRhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICAgICAgaWYgKGtleVRvU2VsZWN0ID09PSBpbmRleEtleSAtIDEpIHtcbiAgICAgICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICdyaWdodC13aXRoLWFuaW1hdGlvbi13aXRoLWhpZ2hlci16aW5kZXgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICdyaWdodC13aXRoLWFuaW1hdGlvbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICgndmVydGljYWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmIChrZXlUb1NlbGVjdCA9PT0gaW5kZXhLZXkgLSAxKSB7XG4gICAgICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAnYm90dG9tLXdpdGgtYW5pbWF0aW9uLXdpdGgtaGlnaGVyLXppbmRleCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ2JvdHRvbS13aXRoLWFuaW1hdGlvbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICgnaG9yaXpvbnRhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICdyaWdodC13aXRob3V0LWFuaW1hdGlvbic7XG4gICAgICAgICAgfSBlbHNlIGlmICgndmVydGljYWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAnYm90dG9tLXdpdGhvdXQtYW5pbWF0aW9uJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5VG9TZWxlY3QgPiBpbmRleEtleSkge1xuICAgICAgICBpZiAodGhpcy5hbmltYXRlZCkge1xuICAgICAgICAgIGlmICgnaG9yaXpvbnRhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICAgICAgaWYgKGtleVRvU2VsZWN0ID09PSBpbmRleEtleSArIDEpIHtcbiAgICAgICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICdsZWZ0LXdpdGgtYW5pbWF0aW9uLXdpdGgtaGlnaGVyLXppbmRleCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ2xlZnQtd2l0aC1hbmltYXRpb24nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoJ3ZlcnRpY2FsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoa2V5VG9TZWxlY3QgPT09IGluZGV4S2V5ICsgMSkge1xuICAgICAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ3RvcC13aXRoLWFuaW1hdGlvbi13aXRoLWhpZ2hlci16aW5kZXgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICd0b3Atd2l0aC1hbmltYXRpb24nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoJ2hvcml6b250YWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAnbGVmdC13aXRob3V0LWFuaW1hdGlvbic7XG4gICAgICAgICAgfSBlbHNlIGlmICgndmVydGljYWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAndG9wLXdpdGhvdXQtYW5pbWF0aW9uJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGVkKSB7XG4gICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICdjZW50ZXItd2l0aC1hbmltYXRpb24nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAnY2VudGVyLXdpdGhvdXQtYW5pbWF0aW9uJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGtleVRvU2VsZWN0ICE9PSBpbmRleEtleSkge1xuICAgICAgICB0YWJQYW5lLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFiUGFuZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRWZWxvY2l0eShkZWx0YURpc3RhbmNlLCBkZWx0YVRpbWUpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoZGVsdGFEaXN0YW5jZSAvIGRlbHRhVGltZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBBZnRlclZpZXdJbml0LFxuICBDb250ZW50Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCB0eXBlIFRhYkJhclBvc2l0aW9uVHlwZSA9ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdEZWZhdWx0VGFiQmFyLCBuem0tZGVmYXVsdC10YWItYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RlZmF1bHQtdGFiLWJhci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRGVmYXVsdFRhYkJhckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS10YWJzLWRlZmF1bHQtYmFyJztcbiAgaW5rQmFyU3R5bGU6IG9iamVjdCA9IHt9O1xuICB0YWJzQmFyU3R5bGU6IG9iamVjdCA9IHt9O1xuICBzaG93UHJldjogYm9vbGVhbiA9IGZhbHNlO1xuICBzaG93TmV4dDogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RlZEtleTogbnVtYmVyID0gMDtcbiAgaW5rQmFyT2ZmU2V0OiBudW1iZXIgPSAwO1xuICBpbmtCYXJMZW5ndGg6IG51bWJlciA9IDA7XG4gIHRhYkJhck5hdlN3aXBlZFBvc2l0aW9uOiBudW1iZXIgPSAwO1xuICB0YWJCYXJOYXZTd2lwaW5nUG9zaXRpb246IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBfc3RhcnRQb3NpdGlvbjogbnVtYmVyID0gMDtcblxuICBAQ29udGVudENoaWxkcmVuKCdUYWJUaXRsZScpXG4gIHRhYlRpdGxlczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gIEBWaWV3Q2hpbGQoJ1RhYnNCYXJTd2lwZScpXG4gIHRhYnNCYXJTd2lwZTogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKVxuICBwYWdlOiBudW1iZXIgPSA1O1xuICBASW5wdXQoKVxuICBhbmltYXRlZDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHRhYkJhclVuZGVybGluZVN0eWxlOiBvYmplY3Q7XG4gIEBJbnB1dCgpXG4gIHRhYkJhckJhY2tncm91bmRDb2xvcjogc3RyaW5nID0gJyNGRkYnO1xuICBASW5wdXQoKVxuICB0YWJCYXJQb3NpdGlvbjogVGFiQmFyUG9zaXRpb25UeXBlID0gJ3RvcCc7XG4gIEBJbnB1dCgpXG4gIGdldCBhY3RpdmVUYWIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEtleTtcbiAgfVxuICBzZXQgYWN0aXZlVGFiKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoaW5kZXggIT09IHRoaXMuc2VsZWN0ZWRLZXkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRLZXkgPSBpbmRleDtcbiAgICAgIGlmICh0aGlzLnRhYlRpdGxlcyAmJiB0aGlzLnRhYlRpdGxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2V0VGFiQmFyU3R5bGVDZW50ZXIoKTtcbiAgICAgICAgdGhpcy5zZXRJbmtCYXJTdGF0dXModGhpcy5zZWxlY3RlZEtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLXRhYi1iYXItd3JhcCcpXG4gIHRhYkJhcldyYXAgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIpIHt9XG5cbiAgb25Ub3VjaFN0YXJ0KGV2ZW50KSB7XG4gICAgaWYgKCd0b3AnID09PSB0aGlzLnRhYkJhclBvc2l0aW9uIHx8ICdib3R0b20nID09PSB0aGlzLnRhYkJhclBvc2l0aW9uKSB7XG4gICAgICB0aGlzLl9zdGFydFBvc2l0aW9uID0gZXZlbnQgJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXMgJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvbiA9IGV2ZW50ICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFk7XG4gICAgfVxuICB9XG5cbiAgb25Ub3VjaE1vdmUoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICgndG9wJyA9PT0gdGhpcy50YWJCYXJQb3NpdGlvbiB8fCAnYm90dG9tJyA9PT0gdGhpcy50YWJCYXJQb3NpdGlvbikge1xuICAgICAgdGhpcy5zZXRUYWJCYXJOYXZTd2lwaW5nUG9zaXRpb24oXG4gICAgICAgIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLl9zdGFydFBvc2l0aW9uLFxuICAgICAgICB0aGlzLnRhYlRpdGxlcy5maXJzdC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoLFxuICAgICAgICB0aGlzLnRhYnNCYXJTd2lwZS5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoXG4gICAgICApO1xuICAgICAgdGhpcy50YWJzQmFyU3R5bGUgPSB7XG4gICAgICAgIHRyYW5zaXRpb246ICcwbXMnLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgnICsgdGhpcy50YWJCYXJOYXZTd2lwaW5nUG9zaXRpb24gKyAncHgsIDBweCwgMHB4KScsXG4gICAgICAgIHdlYmtpdFRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCcgKyB0aGlzLnRhYkJhck5hdlN3aXBpbmdQb3NpdGlvbiArICdweCwgMHB4LCAwcHgpJ1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRUYWJCYXJOYXZTd2lwaW5nUG9zaXRpb24oXG4gICAgICAgIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLl9zdGFydFBvc2l0aW9uLFxuICAgICAgICB0aGlzLnRhYlRpdGxlcy5maXJzdC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCxcbiAgICAgICAgdGhpcy50YWJzQmFyU3dpcGUubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcbiAgICAgICk7XG4gICAgICB0aGlzLnRhYnNCYXJTdHlsZSA9IHtcbiAgICAgICAgdHJhbnNpdGlvbjogJzBtcycsXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsICcgKyB0aGlzLnRhYkJhck5hdlN3aXBpbmdQb3NpdGlvbiArICdweCwgMHB4KScsXG4gICAgICAgIHdlYmtpdFRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsICcgKyB0aGlzLnRhYkJhck5hdlN3aXBpbmdQb3NpdGlvbiArICdweCwgMHB4KSdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgb25Ub3VjaEVuZCgpIHtcbiAgICB0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uID0gdGhpcy50YWJCYXJOYXZTd2lwaW5nUG9zaXRpb247XG4gIH1cblxuICBvbkNvbnRlbnRDaGFuZ2UoKSB7XG4gICAgdGhpcy5zZXRUYWJzU3R5bGUoKTtcbiAgICB0aGlzLnNldElua0JhclN0YXR1cyh0aGlzLmFjdGl2ZVRhYik7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5zZXRUYWJzU3R5bGUoKTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEtleSA+IDApIHtcbiAgICAgIHRoaXMuc2V0VGFiQmFyU3R5bGVDZW50ZXIoKTtcbiAgICB9XG4gICAgdGhpcy5zZXRJbmtCYXJTdGF0dXModGhpcy5zZWxlY3RlZEtleSk7XG4gIH1cblxuICBwcml2YXRlIHNldFRhYnNTdHlsZSgpIHtcbiAgICBpZiAodGhpcy50YWJUaXRsZXMgJiYgdGhpcy50YWJUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCd0b3AnID09PSB0aGlzLnRhYkJhclBvc2l0aW9uIHx8ICdib3R0b20nID09PSB0aGlzLnRhYkJhclBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMudGFiVGl0bGVzLmZvckVhY2goKHRhYlRpdGxlOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICAgIHRhYlRpdGxlLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgICAgdGhpcy5nZXRUYWJTaXplKHRoaXMucGFnZSwgdGhpcy50YWJUaXRsZXMubGVuZ3RoKSArICclJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50YWJUaXRsZXMuZm9yRWFjaCgodGFiVGl0bGU6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgICAgdGFiVGl0bGUubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgICAgdGhpcy5nZXRUYWJTaXplKHRoaXMucGFnZSwgdGhpcy50YWJUaXRsZXMubGVuZ3RoKSArICclJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0VGFiQmFyU3R5bGVDZW50ZXIoKSB7XG4gICAgaWYgKCd0b3AnID09PSB0aGlzLnRhYkJhclBvc2l0aW9uIHx8ICdib3R0b20nID09PSB0aGlzLnRhYkJhclBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnNldFRhYkJhck5hdlN3aXBlZFBvc2l0aW9uKHRoaXMudGFiVGl0bGVzLmZpcnN0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsIHRoaXMudGFic0JhclN3aXBlLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgpO1xuICAgICAgdGhpcy50YWJzQmFyU3R5bGUgPSB7XG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCcgKyB0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uICsgJ3B4LCAwcHgsIDBweCknLFxuICAgICAgICB3ZWJraXRUcmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgnICsgdGhpcy50YWJCYXJOYXZTd2lwZWRQb3NpdGlvbiArICcsIDBweCwgMHB4KSdcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0VGFiQmFyTmF2U3dpcGVkUG9zaXRpb24odGhpcy50YWJUaXRsZXMuZmlyc3QubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQsIHRoaXMudGFic0JhclN3aXBlLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0KTtcbiAgICAgIHRoaXMudGFic0JhclN0eWxlID0ge1xuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAnICsgdGhpcy50YWJCYXJOYXZTd2lwZWRQb3NpdGlvbiArICdweCwgMHB4KScsXG4gICAgICAgIHdlYmtpdFRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsICcgKyB0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uICsgJ3B4LCAwcHgpJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldElua0JhclN0YXR1cyhrZXk6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnRhYlRpdGxlcyAmJiB0aGlzLnRhYlRpdGxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoJ3RvcCcgPT09IHRoaXMudGFiQmFyUG9zaXRpb24gfHwgJ2JvdHRvbScgPT09IHRoaXMudGFiQmFyUG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5pbmtCYXJPZmZTZXQgPSB0aGlzLnRhYlRpdGxlcy50b0FycmF5KClba2V5XS5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQ7XG4gICAgICAgIHRoaXMuaW5rQmFyTGVuZ3RoID0gdGhpcy50YWJUaXRsZXMudG9BcnJheSgpW2tleV0ubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aDtcbiAgICAgICAgdGhpcy5pbmtCYXJTdHlsZSA9IHtcbiAgICAgICAgICB3aWR0aDogdGhpcy5pbmtCYXJMZW5ndGgsXG4gICAgICAgICAgbGVmdDogKHRoaXMuc2VsZWN0ZWRLZXkgKiAxMDApIC8gdGhpcy5wYWdlICsgJyUnXG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5pbmtCYXJTdHlsZSwgdGhpcy50YWJCYXJVbmRlcmxpbmVTdHlsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlua0Jhck9mZlNldCA9IHRoaXMudGFiVGl0bGVzLnRvQXJyYXkoKVtrZXldLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgICB0aGlzLmlua0Jhckxlbmd0aCA9IHRoaXMudGFiVGl0bGVzLnRvQXJyYXkoKVtrZXldLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0O1xuICAgICAgICB0aGlzLmlua0JhclN0eWxlID0ge1xuICAgICAgICAgIGhlaWdodDogdGhpcy5pbmtCYXJMZW5ndGgsXG4gICAgICAgICAgdG9wOiAodGhpcy5zZWxlY3RlZEtleSAqIDEwMCkgLyB0aGlzLnBhZ2UgKyAnJSdcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmlua0JhclN0eWxlLCB0aGlzLnRhYkJhclVuZGVybGluZVN0eWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFRhYkJhck5hdlN3aXBpbmdQb3NpdGlvbihzd2lwaW5nRGlzdGFuY2U6IG51bWJlciwgc3dpcGluZ0l0ZW1MZW5ndGg6IG51bWJlciwgdmlld3BvcnRMZW5ndGg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uICsgc3dpcGluZ0Rpc3RhbmNlID4gMCkge1xuICAgICAgdGhpcy50YWJCYXJOYXZTd2lwaW5nUG9zaXRpb24gPSAwO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uICsgc3dpcGluZ0Rpc3RhbmNlIDxcbiAgICAgIHZpZXdwb3J0TGVuZ3RoIC0gc3dpcGluZ0l0ZW1MZW5ndGggKiB0aGlzLnRhYlRpdGxlcy5sZW5ndGhcbiAgICApIHtcbiAgICAgIHRoaXMudGFiQmFyTmF2U3dpcGluZ1Bvc2l0aW9uID0gdmlld3BvcnRMZW5ndGggLSBzd2lwaW5nSXRlbUxlbmd0aCAqIHRoaXMudGFiVGl0bGVzLmxlbmd0aDtcbiAgICAgIHRoaXMuc2hvd05leHQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWJCYXJOYXZTd2lwaW5nUG9zaXRpb24gPSB0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uICsgc3dpcGluZ0Rpc3RhbmNlO1xuICAgICAgdGhpcy5zaG93TmV4dCA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnRhYkJhck5hdlN3aXBpbmdQb3NpdGlvbiA8IDApIHtcbiAgICAgIHRoaXMuc2hvd1ByZXYgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dQcmV2ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRUYWJCYXJOYXZTd2lwZWRQb3NpdGlvbihzd2lwaW5nSXRlbUxlbmd0aDogbnVtYmVyLCB2aWV3cG9ydExlbmd0aDogbnVtYmVyKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zZWxlY3RlZEtleSA+PSBNYXRoLmZsb29yKHRoaXMucGFnZSAvIDIpICYmXG4gICAgICB0aGlzLnNlbGVjdGVkS2V5IDw9IHRoaXMudGFiVGl0bGVzLmxlbmd0aCAtIDEgLSBNYXRoLmZsb29yKHRoaXMucGFnZSAvIDIpXG4gICAgKSB7XG4gICAgICB0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uID0gdmlld3BvcnRMZW5ndGggLyAyIC0gc3dpcGluZ0l0ZW1MZW5ndGggKiAodGhpcy5zZWxlY3RlZEtleSArIDEgLyAyKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRLZXkgPCBNYXRoLmZsb29yKHRoaXMucGFnZSAvIDIpKSB7XG4gICAgICB0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWJCYXJOYXZTd2lwZWRQb3NpdGlvbiA9IHZpZXdwb3J0TGVuZ3RoIC0gc3dpcGluZ0l0ZW1MZW5ndGggKiB0aGlzLnRhYlRpdGxlcy5sZW5ndGg7XG4gICAgfVxuICAgIGlmICh0aGlzLnRhYkJhck5hdlN3aXBlZFBvc2l0aW9uIDwgMCkge1xuICAgICAgdGhpcy5zaG93UHJldiA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd1ByZXYgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFiQmFyTmF2U3dpcGVkUG9zaXRpb24gKyBzd2lwaW5nSXRlbUxlbmd0aCAqIHRoaXMudGFiVGl0bGVzLmxlbmd0aCAtIHZpZXdwb3J0TGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zaG93TmV4dCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd05leHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFRhYlNpemUgPSAocGFnZTogbnVtYmVyLCB0YWJMZW5ndGg6IG51bWJlcikgPT4gMTAwIC8gTWF0aC5taW4ocGFnZSwgdGFiTGVuZ3RoKTtcbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgT2JzZXJ2ZXJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL29ic2VydmVycyc7XG5pbXBvcnQgeyBUYWJzIH0gZnJvbSAnLi90YWJzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJQYW5lIH0gZnJvbSAnLi90YWItcGFuZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVmYXVsdFRhYkJhckNvbXBvbmVudCB9IGZyb20gJy4vZGVmYXVsdC10YWItYmFyLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE9ic2VydmVyc01vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW1RhYlBhbmUsIFRhYnMsIERlZmF1bHRUYWJCYXJDb21wb25lbnRdLFxuICBleHBvcnRzOiBbVGFiUGFuZSwgVGFicywgRGVmYXVsdFRhYkJhckNvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW11cbn0pXG5leHBvcnQgY2xhc3MgVGFic01vZHVsZSB7fVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBIb3N0QmluZGluZyxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgT3B0aW9uYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJQYW5lIH0gZnJvbSAnLi4vdGFicy90YWItcGFuZS5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9uUHJlc3NFdmVudCB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGtleTogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdUYWJCYXJUYWIsIG56bS10YWItYmFyLXRhYicsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWItYmFyLXRhYi5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVGFiQmFyVGFiIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLXRhYi1iYXItdGFiJztcbiAgc2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGludENvbG9yOiBzdHJpbmcgPSAnIzEwOGVlOSc7XG4gIHVuc2VsZWN0ZWRUaW50Q29sb3I6IHN0cmluZyA9ICcjODg4JztcblxuICBASW5wdXQoKVxuICBrZXk6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKVxuICB0aXRsZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpXG4gIGRvdDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBiYWRnZTogbnVtYmVyIHwgc3RyaW5nID0gbnVsbDtcbiAgQElucHV0KClcbiAgaWNvbjogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD4gPSBudWxsO1xuICBASW5wdXQoKVxuICBzZWxlY3RlZEljb246IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+ID0gbnVsbDtcbiAgQE91dHB1dCgpXG4gIG9uUHJlc3M6IEV2ZW50RW1pdHRlcjxPblByZXNzRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxPblByZXNzRXZlbnQ+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWItYmFyLXRhYicpXG4gIHRhYkJhclRhYjogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgcHVibGljIHRhYlBhbmU6IFRhYlBhbmUpIHt9XG5cbiAgaXNUZW1wbGF0ZVJlZih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh0aGlzLnRhYlBhbmUuYWN0aXZlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnRpbnRDb2xvciA9IHRoaXMudGFiUGFuZS50aW50Q29sb3I7XG4gICAgdGhpcy51bnNlbGVjdGVkVGludENvbG9yID0gdGhpcy50YWJQYW5lLnVuc2VsZWN0ZWRUaW50Q29sb3I7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgQWZ0ZXJDb250ZW50SW5pdCwgSW5wdXQsIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0LCBIb3N0QmluZGluZyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFiUGFuZSB9IGZyb20gJy4uL3RhYnMvdGFiLXBhbmUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYkJhclRhYiB9IGZyb20gJy4vdGFiLWJhci10YWIuY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgVGFiQmFyUG9zaXRpb25UeXBlID0gJ3RvcCcgfCAnYm90dG9tJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnVGFiQmFyLCBuem0tdGFiLWJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWItYmFyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBUYWJCYXIgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tdGFiLWJhcic7XG5cbiAgcHJpdmF0ZSBfdGludENvbG9yOiBzdHJpbmcgPSAnIzEwOGVlOSc7XG4gIHByaXZhdGUgX3Vuc2VsZWN0ZWRUaW50Q29sb3I6IHN0cmluZyA9ICcjODg4JztcblxuICBAQ29udGVudENoaWxkcmVuKFRhYlBhbmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgdGFiUGFuZXM6IFF1ZXJ5TGlzdDxUYWJQYW5lPjtcbiAgQENvbnRlbnRDaGlsZHJlbihUYWJCYXJUYWIsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgdGFiQmFyVGFiczogUXVlcnlMaXN0PFRhYkJhclRhYj47XG5cbiAgQElucHV0KClcbiAgaGlkZGVuOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGFjdGl2ZVRhYjogbnVtYmVyID0gMDtcbiAgQElucHV0KClcbiAgYmFyVGludENvbG9yOiBzdHJpbmcgPSAnd2hpdGUnO1xuICBASW5wdXQoKVxuICB0YWJCYXJQb3NpdGlvbjogVGFiQmFyUG9zaXRpb25UeXBlID0gJ2JvdHRvbSc7XG4gIEBJbnB1dCgpXG4gIGdldCB0aW50Q29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGludENvbG9yO1xuICB9XG4gIHNldCB0aW50Q29sb3IoY29sb3I6IHN0cmluZykge1xuICAgIHRoaXMuX3RpbnRDb2xvciA9IGNvbG9yO1xuICAgIGlmICh0aGlzLnRhYkJhclRhYnMgJiYgdGhpcy50YWJCYXJUYWJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudGFiQmFyVGFicy5mb3JFYWNoKCh0YWJCYXJUYWI6IFRhYkJhclRhYikgPT4ge1xuICAgICAgICB0YWJCYXJUYWIudGludENvbG9yID0gdGhpcy5fdGludENvbG9yO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB1bnNlbGVjdGVkVGludENvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Vuc2VsZWN0ZWRUaW50Q29sb3I7XG4gIH1cbiAgc2V0IHVuc2VsZWN0ZWRUaW50Q29sb3IoY29sb3I6IHN0cmluZykge1xuICAgIHRoaXMuX3Vuc2VsZWN0ZWRUaW50Q29sb3IgPSBjb2xvcjtcbiAgICBpZiAodGhpcy50YWJCYXJUYWJzICYmIHRoaXMudGFiQmFyVGFicy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRhYkJhclRhYnMuZm9yRWFjaCgodGFiQmFyVGFiOiBUYWJCYXJUYWIpID0+IHtcbiAgICAgICAgdGFiQmFyVGFiLnVuc2VsZWN0ZWRUaW50Q29sb3IgPSB0aGlzLl91bnNlbGVjdGVkVGludENvbG9yO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWItYmFyJylcbiAgdGFiQmFyOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc2VsZWN0VGFiUGFuZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy50YWJQYW5lcy5mb3JFYWNoKCh0YWJQYW5lOiBUYWJQYW5lLCBpbmRleEtleTogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoaW5kZXggPCBpbmRleEtleSkge1xuICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ3JpZ2h0LXdpdGhvdXQtYW5pbWF0aW9uJztcbiAgICAgIH0gZWxzZSBpZiAoaW5kZXggPiBpbmRleEtleSkge1xuICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ2xlZnQtd2l0aG91dC1hbmltYXRpb24nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICdjZW50ZXItd2l0aG91dC1hbmltYXRpb24nO1xuICAgICAgfVxuICAgICAgaWYgKGluZGV4ICE9PSBpbmRleEtleSkge1xuICAgICAgICB0YWJQYW5lLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFiUGFuZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0aGlzLnRhYkJhclRhYnMgJiYgdGhpcy50YWJCYXJUYWJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudGFiQmFyVGFicy5mb3JFYWNoKCh0YWJCYXJUYWI6IFRhYkJhclRhYikgPT4ge1xuICAgICAgICB0YWJCYXJUYWIuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy50YWJCYXJUYWJzLnRvQXJyYXkoKVtpbmRleF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy50YWJCYXJUYWJzLnRvQXJyYXkoKVtpbmRleF0ub25QcmVzcy5lbWl0KHtcbiAgICAgICAgdGl0bGU6IHRoaXMudGFiQmFyVGFicy50b0FycmF5KClbaW5kZXhdLnRpdGxlLFxuICAgICAgICBrZXk6IHRoaXMudGFiQmFyVGFicy50b0FycmF5KClbaW5kZXhdLmtleVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuc2VsZWN0VGFiUGFuZSh0aGlzLmFjdGl2ZVRhYik7XG4gICAgdGhpcy50YWJQYW5lcy5mb3JFYWNoKCh0YWJQYW5lOiBUYWJQYW5lKSA9PiB7XG4gICAgICB0YWJQYW5lLnRpbnRDb2xvciA9IHRoaXMudGludENvbG9yO1xuICAgICAgdGFiUGFuZS51bnNlbGVjdGVkVGludENvbG9yID0gdGhpcy51bnNlbGVjdGVkVGludENvbG9yO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRhYnNNb2R1bGUgfSBmcm9tICcuLi90YWJzL3RhYnMubW9kdWxlJztcbmltcG9ydCB7IFRhYkJhciB9IGZyb20gJy4vdGFiLWJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmFkZ2VNb2R1bGUgfSBmcm9tICcuLi9iYWRnZS9iYWRnZS5tb2R1bGUnO1xuaW1wb3J0IHsgVGFiQmFyVGFiIH0gZnJvbSAnLi90YWItYmFyLXRhYi5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBUYWJzTW9kdWxlLCBCYWRnZU1vZHVsZV0sXG4gIGV4cG9ydHM6IFtUYWJCYXIsIFRhYkJhclRhYl0sXG4gIGRlY2xhcmF0aW9uczogW1RhYkJhciwgVGFiQmFyVGFiXSxcbiAgcHJvdmlkZXJzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBUYWJCYXJNb2R1bGUge31cbiIsImltcG9ydCB7RXZlbnRFbWl0dGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmV4cG9ydCBpbnRlcmZhY2UgUGlja2VyT3B0aW9uc0ludGVyZmFjZSB7XG4gIGRhdGE/OiBBcnJheTxhbnk+O1xuICBjb2xzPzogbnVtYmVyO1xuICBtYXNrPzogYm9vbGVhbjtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIG9rVGV4dD86IHN0cmluZztcbiAgZGlzbWlzc1RleHQ/OiBzdHJpbmc7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgY2FzY2FkZT86IGJvb2xlYW47XG4gIGFwcGVuZFRvQm9keT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBQaWNrZXJPcHRpb25zIGltcGxlbWVudHMgUGlja2VyT3B0aW9uc0ludGVyZmFjZSB7XG4gIGRhdGE/OiBBcnJheTxhbnk+ID0gW107XG4gIHZhbHVlPzogQXJyYXk8YW55PiA9IFtdO1xuICBjb2xzPzogbnVtYmVyID0gMztcbiAgbWFzaz86IGJvb2xlYW4gPSB0cnVlO1xuICB0aXRsZT86IHN0cmluZyA9ICcnO1xuICBva1RleHQ/OiBzdHJpbmcgPSAnw6fCocKuw6XCrsKaJztcbiAgZGlzbWlzc1RleHQ/OiBzdHJpbmcgPSAnw6XCj8KWw6bCtsKIJztcbiAgZGlzYWJsZWQ/OiBib29sZWFuID0gZmFsc2U7XG4gIGNhc2NhZGU/OiBib29sZWFuID0gdHJ1ZTtcbiAgYXBwZW5kVG9Cb2R5PzogYm9vbGVhbiA9IGZhbHNlO1xuICBvbk9rPzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIG9uRGlzbWlzcz86IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBvblBpY2tlckNoYW5nZT86IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBpbmRpY2F0b3JTdHlsZT86IG9iamVjdCA9IHt9O1xuICBoaWRlUGlja2VyPzogKCkgPT4gdm9pZDtcbiAgY29uZmlybT86IChyZXN1bHQpID0+IHZvaWQ7XG4gIGNhbmNlbD86ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIFBpY2tlckNhbGxCYWNrID0gKHJlc3VsdD86IGFueSkgPT4gUHJvbWlzZUxpa2U8YW55PiB8IHZvaWQ7XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0RGF0YSgpIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBsYWJlbDogJ8OlwozCl8OkwrrCrCcsXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKMwpfDpMK6wqzDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6TCuMKcw6XCn8KOw6XCjMK6JyxcbiAgICAgICAgICAgICfDqMKlwr/DpcKfwo7DpcKMwronLFxuICAgICAgICAgICAgJ8OlwrTCh8OmwpbCh8OlwozCuicsXG4gICAgICAgICAgICAnw6XCrsKjw6bCrcKmw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKcwp3DqcKYwrPDpcKMwronLFxuICAgICAgICAgICAgJ8OkwrjCsMOlwo/CsMOlwozCuicsXG4gICAgICAgICAgICAnw6fCn8Kzw6bCmcKvw6XCscKxw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsK1wrfDpsK3woDDpcKMwronLFxuICAgICAgICAgICAgJ8OpwpfCqMOlwqTCtMOmwrLCn8OlwozCuicsXG4gICAgICAgICAgICAnw6bCiMK/w6XCscKxw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKAwprDpcK3wp7DpcKMwronLFxuICAgICAgICAgICAgJ8OpwqHCusOkwrnCicOlwozCuicsXG4gICAgICAgICAgICAnw6bCmMKMw6XCucKzw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKkwqfDpcKFwrTDpcKMwronLFxuICAgICAgICAgICAgJ8OlwrnCs8OowrDCt8OlwozCuicsXG4gICAgICAgICAgICAnw6bCgMKAw6bCn8KUw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKvwobDpMK6wpHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrvCtsOlwrrChsOlwo7CvydcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6XCpMKpw6bCtMKlw6XCuMKCJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwqTCqcOmwrTCpcOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpcKSwozDpcK5wrPDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrLCs8OkwrjCnMOlwozCuicsXG4gICAgICAgICAgICAnw6bCssKzw6jCpcK/w6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKNwpfDpcK8woDDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrLCs8OlwozCl8OlwozCuicsXG4gICAgICAgICAgICAnw6fCusKiw6bCocKlw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKhwpjDpsKywr3DpcKMwronLFxuICAgICAgICAgICAgJ8OmwrHCicOmwrLCvcOlwozCuicsXG4gICAgICAgICAgICAnw6XCpMKnw6bCuMKvw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK4wpzDpMK4wr3DpcKMwronLFxuICAgICAgICAgICAgJ8OowqXCv8Opwp3CksOlwozCuicsXG4gICAgICAgICAgICAnw6bCtMKlw6XCjcKXw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKMwpfDqMK+wrDDpcKMwronLFxuICAgICAgICAgICAgJ8Omwq3CpsOmwrjChcOlwozCuicsXG4gICAgICAgICAgICAnw6XCrsKdw6XCncK7w6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKuwoHDpsKywrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8Opwp3CmcOmwrXCt8Olwo7CvycsXG4gICAgICAgICAgICAnw6jCk8KfICDDpcKOwr8nXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ8OmwrLCs8OlwozCl8OnwpzCgScsXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDp8KfwrPDpcKuwrbDpcK6woTDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6nClcK/w6XCrsKJw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKhwqXDpMK4wpzDpcKMwronLFxuICAgICAgICAgICAgJ8OmwqHCpcOowqXCv8OlwozCuicsXG4gICAgICAgICAgICAnw6bClsKww6XCjcKOw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKDwoogIMOlwozCuicsXG4gICAgICAgICAgICAnw6TCusKVw6nCmcKJw6fCn8K/w6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK6wpXDqcKZwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwq3Co8Olwq7CmsOlwo7CvycsXG4gICAgICAgICAgICAnw6bCoMK+w6XCn8KOw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKhwozDpcKUwpDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwoHCtcOlwq/Cv8Olwo7CvycsXG4gICAgICAgICAgICAnw6nCq8KYw6nCgsKRw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK3wrHDpsKzwr3DpcKOwr8nLFxuICAgICAgICAgICAgJ8OowrXCnsOnwprCh8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCl8Kgw6bCnsKBw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK5wrPDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCg8OmwrDCj8Olwo7CvycsXG4gICAgICAgICAgICAnw6jCtcK1ICDDpcKOwr8nLFxuICAgICAgICAgICAgJ8Oowr7Cm8OpwpvChsOlwrjCgicsXG4gICAgICAgICAgICAnw6jCl8KBJyxcbiAgICAgICAgICAgICfDpsKZwovDpcK3wp7DpcK4woInLFxuICAgICAgICAgICAgJ8OmwpbCsMOkwrnCkMOlwrjCgicsXG4gICAgICAgICAgICAnw6nCucK/w6bCs8KJw6XCuMKCJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XClMKQw6XCscKxw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OowrfCr8Olwo3Cl8OlwozCuicsXG4gICAgICAgICAgICAnw6jCt8Kvw6XCjMKXw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKPwqTDpcKGwrbDpcKMwronLFxuICAgICAgICAgICAgJ8OlwrzCgMOlwrnCs8OlwozCuicsXG4gICAgICAgICAgICAnw6bClsKwICDDpcKMwronLFxuICAgICAgICAgICAgJ8OkwrjCsMOmwrbCpsOlwo7CvycsXG4gICAgICAgICAgICAnw6bCu8KmICDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrvCpsOlwo3Cl8Olwo7CvycsXG4gICAgICAgICAgICAnw6TCucKQw6TCusKtw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMK/woHDqMKlwr/DpcKOwr8nLFxuICAgICAgICAgICAgJ8Onwo7CicOnwpTCsMOlwo7CvycsXG4gICAgICAgICAgICAnw6XClMKQw6bCtcK3w6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKBwrXDpcKMwpbDpcK4woInLFxuICAgICAgICAgICAgJ8OkwrjCsMOlwo3Cl8OlwrjCgicsXG4gICAgICAgICAgICAnw6jCv8KBw6XCrsKJw6XCuMKCJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6fCp8Kmw6fCmsKHw6XCssKbw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsK1wrfDpsK4wq/DpcKMwronLCAnw6XCscKxw6bCtcK3w6XChcKzw6XCjMK6JywgJ8OlwozCl8OmwojCtMOmwrLCs8OlwozCuicsICfDqcKdwpLDqcK+wpnDpsK7wqHDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLCAnw6bCmMKMw6nCu8KOw6XCjsK/JywgJ8OmworCmsOlwq7CgcOlwo7CvycsICfDpcKNwqLDqcK+wpnDpcKOwr8nXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKCwq/DqcKDwrjDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6nCgsKvw6XCscKxw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK4wpvDpcKPwrDDpcKMwronLFxuICAgICAgICAgICAgJ8OlwqTCjcOlwoXCtMOlwozCuicsXG4gICAgICAgICAgICAnw6XCs8Kww6XCs8Kww6fCn8K/w6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKCwq/DqcKDwrjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrjCtMOmwrzCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCiMKQw6XCrsKJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKkwqfDpcKQwo3DpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrbCiSAgw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KjwoEgIMOlwo7CvycsXG4gICAgICAgICAgICAnw6jCgsKlw6TCucKhw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKwwrjDpcK5wrTDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwoLCsSAgw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcK4wqHDpsKzwr3DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrnCv8OlwrnCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6nCpsKGw6nCmcK2w6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKtwo8gIMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCm8Kyw6XCkcKow6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKtwqbDpcKuwonDpcK4woInXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKCwqLDpcKPwrDDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCocKlw6TCuMKcw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKhwqXDqMKlwr/DpcKMwronLFxuICAgICAgICAgICAgJ8OpwoLCosOlwo/CsMOlwo7CvycsXG4gICAgICAgICAgICAnw6TCuMK0w6XCn8KOw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKGwoXDpMK4wpjDpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwp/Cj8OkwrnCocOlwo7CvycsXG4gICAgICAgICAgICAnw6nCmsKGw6XCsMKnw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK7wrsgIMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCjcKXw6XCksKMw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwoHDpsKZwovDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrfCqMOpwrnCv8Olwo7CvycsXG4gICAgICAgICAgICAnw6bClsKww6bCssKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK5wr/DpcKuwpfDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrnCs8OkwrnCocOlwo7CvycsXG4gICAgICAgICAgICAnw6XCqMKBICDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrjChcOmwrLCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6TCuMK0w6jCpcK/w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKNwpfDpcKuwqvDpcK4woInLFxuICAgICAgICAgICAgJ8OmwrLCmcOmwrLCs8OlwrjCgidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Okwr/CncOlwq7CmsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpsKWwrDDpcK4woLDpcKMwronLFxuICAgICAgICAgICAgJ8OlwozCl8OlwrjCgsOlwozCuicsXG4gICAgICAgICAgICAnw6XCjcKXw6XCuMKCw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsK7wqHDpcKfwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrjChcOowovCkcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCtsKew6bCsMK0w6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKYwpzDpcK5wrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwr7CkMOmwrDCtMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCrsKaw6XChcK0w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKUwpAgIMOlwo7CvycsXG4gICAgICAgICAgICAnw6nCq8KYw6nCmMKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwrnDpcKfwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrbCnsOmwrrCkMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCnMKbw6nCg8K9w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwonDpsKWwrDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwpjCkyAgw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKbwrLDqcKYwrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OowqDCoSAgw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKhwrrDpcK5wrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwo3CmsOpwofCjicsXG4gICAgICAgICAgICAnw6nCm8KEw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK2wr/DpcK3wp7DpcK4woInLFxuICAgICAgICAgICAgJ8Olwq7CmsOlwrfCnsOlwrjCgicsXG4gICAgICAgICAgICAnw6XCrsKJw6XCm8K9w6XCuMKCJyxcbiAgICAgICAgICAgICfDqcKrwpjDp8KiwpHDpcK6wpfDpcK4woInXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcK8wqDDpcKuwrbDpcKPwqMnLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCocKlw6TCuMKcw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKhwqXDqMKlwr/DpcKMwronLFxuICAgICAgICAgICAgJ8Olwq7Co8OlwozClsOlwozCuicsXG4gICAgICAgICAgICAnw6TCuMKLw6jCisKxw6XCm8Ktw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKuwqPDpcKMwpbDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrzCoMOlwozCl8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCusK3w6TCv8Kdw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKywr3DpsK6wpDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrDCmsOkwrnCicOlwo7CvycsXG4gICAgICAgICAgICAnw6jClMKaICDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwpjCs8Olwo7Cn8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCgMKAw6XCrsKJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wofDpcKFwqjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwoDCgMOmwp3CpcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCtsK/w6nCucK/w6XCjsK/JyxcbiAgICAgICAgICAgICfDqMK1wqTDpcKfwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrTCh8OnwqTCvMOlwo7CvydcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwonCv8Olwr7Ct8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpcKPwozDpsKhwqXDpcKMwronLFxuICAgICAgICAgICAgJ8Olwo/CjMOmwrvCpsOlwozCuicsXG4gICAgICAgICAgICAnw6nCucKww6bCicKLw6jCkMKlw6XCrcKQw6fCn8K/w6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKJwr/DpcK+wrfDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtMOpwprChsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCucKzw6bCs8KJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK7wqbDpcK5wrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwprChsOlwozClsOlwo7CvycsXG4gICAgICAgICAgICAnw6TCuMKww6XCrsKBw6bCu8Khw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwr3DpcKfwo7DpsK7wqHDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwpvCtMOlwpzCusOmwrvCocOmwpfCj8OowpLCmcOlwo/CpMOmwpfCj8OowofCqsOmwrLCu8Olwo7CvydcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrLCp8OlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpsKWwrDDpcKNwo7DpcKMwronLFxuICAgICAgICAgICAgJ8Oowr/CkMOmwrLCs8OlwozCuicsXG4gICAgICAgICAgICAnw6bCssKnICDDpcKOwr8nLFxuICAgICAgICAgICAgJ8Opwp3CkiAgw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wpzDpcKFwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrXCt8OlwoXCtMOlwo7CvycsXG4gICAgICAgICAgICAnw6fCm8KQw6XCscKxw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKCwoPDpcKuwoHDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwo3Cl8OnwprCrsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCkMK0w6bCocKlw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KMwq4gIMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCrcKfw6bCncKRw6XCm8Kew6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKzworDpcKkwrTDpcK4woInLFxuICAgICAgICAgICAgJ8OkwrvCu8OkwrjCmMOlwrjCgicsXG4gICAgICAgICAgICAnw6nCu8KEw6nCqsKFw6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKywrPDqcKXwrTDpcK4woInXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcK7worDpcKdworDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8Olwq7CicOmwqzCocOlwozCuicsICfDpcKbwrrDpcKuwonDpcKOwr8nLCAnw6bCsMK4w6bCuMKFw6XCjsK/JywgJ8OpwqbCmcOmwrLCs8Olwo7CvycsICfDpcKkwqfDpcKfwo7DpcKOwr8nLCAnw6bClsKHw6XCrsKJw6XCjsK/JywgJ8OlwqTCp8Olwo7CgsOlwpvCnsOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsICfDqcKcwrjDpcK3wp7DpcK4woInLCAnw6TCuMKJw6bCssKzw6XCuMKCJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6jCocKhw6bCsMK0w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OmwqHCg8Olwp/CjsOlwozCuicsXG4gICAgICAgICAgICAnw6bCnsKjw6XCvMK6w6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKtwqbDqcKCwpHDpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwq3CpsOlwrzCusOlwo7CvycsXG4gICAgICAgICAgICAnw6nCpcK2w6nCmMKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwonDpcK5wrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwpXChcOlwp/CjsOlwo7CvycsXG4gICAgICAgICAgICAnw6bCmcKvICDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwpjCnMOlwp/CjsOlwo7CvycsXG4gICAgICAgICAgICAnw6XChsKAw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICAgICfDpsK3wrHDpcK3wp7DpcK4woInXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ8OlwrHCscOowqXCv8OnwpzCgScsXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKkwqrDpcKOwp/DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6XCsMKPw6XCusKXw6XCjMK6JyxcbiAgICAgICAgICAgICfDqMK/wo7DpsKzwr3DpcKMwronLFxuICAgICAgICAgICAgJ8Omwp3Cj8OoworCscOlwrLCrcOlwozCuicsXG4gICAgICAgICAgICAnw6XCsMKWw6jCjcKJw6XCncKqw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK4wofDpsKfwo/DpsKewpfDpcKMwronLFxuICAgICAgICAgICAgJ8OmwpnCi8OmwrrCkMOlwozCuicsXG4gICAgICAgICAgICAnw6bCuMKFw6XCvsKQw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKYwrPDpsKbwrLDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwqjChMOnwoPCpsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCj8Kkw6TCusKkw6XCuMKCJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCpMKnw6XCkMKMw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8Olwp/CjiAgw6XCjMK6JyxcbiAgICAgICAgICAgICfDp8Kfwr8gIMOlwozCuicsXG4gICAgICAgICAgICAnw6XCjcKXw6nCg8KKw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKWwrDDqMKNwqPDpcKMwronLFxuICAgICAgICAgICAgJ8OpwpjCs8OpwqvCmMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCpMKpw6nClcKHw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK5wr/Dp8KBwrXDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwoHCtcOkwrjCmMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCtcKRw6bCusKQw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK3wqbDpMK6wpHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwqTCp8OlwpDCjMOlwo7CvydcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwpjCs8OmwrPCicOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCn8KOICDDpcKMwronLCAnw6fCn8K/ICDDpcKMwronLCAnw6nCg8KKICDDpcKMwronLCAnw6XCucKzw6XCrsKaw6XCjsK/JywgJ8OnwpvCgiAgw6XCjsK/J11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nClcK/w6bCssK7w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8Olwp/CjiAgw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKDwoogIMOlwozCuicsXG4gICAgICAgICAgICAnw6nClcK/w6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKlwoTDpcKewqPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrHCr8OnwpXCmcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCucKzw6nCocK6w6XCjsK/JyxcbiAgICAgICAgICAgICfDqcK7wo7DpcKfwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwqPCtsOlwoXCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6nClcK/w6XCrcKQw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKtwqbDpMK5wqHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrLCgSAgw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKywoHDpsK6wpDDpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwr3CnsOlwp/CjsOlwrjCgidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwpnCi8Olwp/CjsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCn8KOICDDpcKMwronLCAnw6bCssKBw6bCsMK0w6XCjsK/JywgJ8OpwpjCs8Olwp/CjsOlwo7CvycsICfDqcKZwrXDpcK3wp3DpcKOwr8nLCAnw6bCs8K9w6XCt8Kew6XCjsK/JywgJ8OpwqvCmMOlwrnCs8OlwrjCgiddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwpzClMOlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCnMKUw6XCn8KOw6XCjMK6JywgJ8OlwrnCs8OpwrLCgcOlwozCuicsICfDpcKxwrHDqcKYwrTDpcKOwr8nLCAnw6XCusKUICDDpcKOwr8nLCAnw6XCj8Kzw6fCjsKJw6XCjsK/JywgJ8OmwoDCgMOkwrvCgcOlwo7CvyddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Olwr/Cu8OlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpcK/wrvDpcK6wpzDpcKMwronLFxuICAgICAgICAgICAgJ8Olwo7Cn8OlwrnCs8OlwrjCgicsXG4gICAgICAgICAgICAnw6XCrsKaw6jCpcKEw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK6wpTDpcKPwrDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrvCoyAgw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8K5woHDpcKzwpnDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwq7CgcOmwq3CpsOlwo7CvycsXG4gICAgICAgICAgICAnw6nCncKZw6TCucKQw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8Klwp7DpsKxwqDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrrClMOlwq/CqMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCssKiw6XCssKaw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKywrPDpsKbwrLDpcKOwr8nLFxuICAgICAgICAgICAgJ8Okwr/CncOlwr7Ct8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCgcKPw6XChcKzw6XCjsK/J1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCkMKVw6bCosKBw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OnwqbCu8Onwp/Cs8OlwozCuicsXG4gICAgICAgICAgICAnw6XCrcKdw6TCucKJw6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKxwr7DqcKYwrPDpcK4woInLFxuICAgICAgICAgICAgJ8OmwpbCh8OmwrDCtMOlwo7CvycsXG4gICAgICAgICAgICAnw6TCusKkw6XCn8KOw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrQgIMOlwo7CvycsXG4gICAgICAgICAgICAnw6TCuMK0ICDDpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwp/Cs8Omwp7Cl8Olwo7CvycsXG4gICAgICAgICAgICAnw6fCn8Kzw6bCpcK8w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKywpogIMOlwo7CvycsXG4gICAgICAgICAgICAnw6bClsK5w6XCscKxw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wq3DqcKYwrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrrCpMOlwo/Co8Olwo7CvydcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwpnCi8OkwrjCrcOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpsKmwobDpsKswqHDpcK4woInLFxuICAgICAgICAgICAgJ8OkwrvCi8OkwrzCkcOlwrjCgicsXG4gICAgICAgICAgICAnw6bCpsKGw6fCpMK+w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK3wqbDpsKdwoPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwpLCjMOpwqHCusOlwo7CvycsXG4gICAgICAgICAgICAnw6bCmMKUw6nCmMKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKvwr/DqcKYwrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwqTCqsOowrDCt8Olwo7CvycsXG4gICAgICAgICAgICAnw6fCpcKBICDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrnCs8OpwoHCpcOlwo7CvycsXG4gICAgICAgICAgICAnw6fCgcK1w6fCn8Kzw6XCjsK/J1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCuMK0w6bCscK+w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OkwrjCtMOmwrHCvsOlwrjCgicsXG4gICAgICAgICAgICAnw6TCvsKvw6nCqcKsw6XCuMKCJyxcbiAgICAgICAgICAgICfDqcKcwo3DpcK3wp7DpcK4woInLFxuICAgICAgICAgICAgJ8OmwpvCssOmwrLCg8Olwo7CvycsXG4gICAgICAgICAgICAnw6fCv8K8w6XCn8KOw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKlwoTDpsKxwr7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrTCqsOmwrTCnsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCj8KkICDDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwq7CicOmwrPCvcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCtcKuw6XCscKxw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKQwokgIMOlwo7CvycsXG4gICAgICAgICAgICAnw6TCucKhw6XCrsKBw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKSwrIgIMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCpMKnw6XCrsKBw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKwwrjDpcKSwozDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwprCsCAgw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKxwr7DqMKlwr/DpcKOwr8nXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqMK/wpDDpcKfwo7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6jCv8KQw6XCn8KOw6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKwwrjDpsK1wo7DpcK4woInLFxuICAgICAgICAgICAgJ8OmwrLCs8OmwrTCpcOlwrjCgicsXG4gICAgICAgICAgICAnw6jCisKuw6XCn8KOw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wrTDp8KMwpfDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrjCh8Oowo3Co8Olwo7CvycsXG4gICAgICAgICAgICAnw6bClsKww6fCu8Kbw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KowrfDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwpfCu8OlwpbCnMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCpMKPICDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwrvCmyAgw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK5wrPDqcKZwobDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwp7Co8OmwpvCssOlwo7CvydcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6XChsKFw6jCksKZw6XCj8KkJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwpHCvMOlwpLCjMOmwrXCqcOnwonCucOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpsKWwrDDpcKfwo7DpcKMwronLFxuICAgICAgICAgICAgJ8OlwpvCnsOmwrDCkcOlwozCuicsXG4gICAgICAgICAgICAnw6fCjsKJw6bCs8KJw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKDwoogIMOlwozCuicsXG4gICAgICAgICAgICAnw6XCnMKfw6nCu8KYw6fCicK5w6XCt8Kmw6bCl8KXJyxcbiAgICAgICAgICAgICfDpsKJwpjDpcKFwovDpsKJwpjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwpLCjMOmwp7Cl8OmwqDCvMOlwrDClMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCuMKFw6bCsMK0w6bCssKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKtwqbDpcK3wp3DpcKOwr8nXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKMwoXDpcKkwrTDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6TCuMKcw6bCssKzw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKYwobDqcKDwr3DpMK8wqbDpcKMwronLFxuICAgICAgICAgICAgJ8Opwp3CksOlwrHCscOlwozCuicsXG4gICAgICAgICAgICAnw6fCn8Kzw6bCi8KQw6fCn8K/w6XCjMK6JyxcbiAgICAgICAgICAgICfDp8KZwr3DpMK6wpHDp8Kfwr/DpcKMwronLFxuICAgICAgICAgICAgJ8OpwoPCiiAgw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKcwp/DqcK7wpjDp8KJwrnDpcKPwrPDpsKXwpcnLFxuICAgICAgICAgICAgJ8OlwpvCusOpwpjCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6jCvsK+w6XCsMKUw6fCvcKVw6jCjMKCw6bCmMKOw6XCrsKJw6jCgcKUw6XCkMKIw6bCl8KXJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCucKMw6bCtcK3w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsK1wrfDpcKLwoPDpsK5wr7DpcKMwronLCAnw6bCtcK3w6XCjcKXw6XCjMK6JywgJ8OkwrnCjMOowr7CvsOlwozCuiddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OowrXCpMOlwrPCsMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDp8K6wqLDpcKxwrHDpcKMwronLFxuICAgICAgICAgICAgJ8OlwoXCg8Olwq7CncOlwrHCscOlwozCuicsXG4gICAgICAgICAgICAnw6bCncK+w6XCscKxw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKYwr/DqcKywoHDp8KnwpHDpcKwwpTDpsKywoHDpsKXwpcnLFxuICAgICAgICAgICAgJ8OlwrfCtMOmwp7Cl8OlwrfCpsOmwpfClycsXG4gICAgICAgICAgICAnw6XCt8K0w6bCnsKXw6XCj8Kzw6bCl8KXJyxcbiAgICAgICAgICAgICfDpsKewpfDqMKlwr/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCi8OkwrvCgMOlwoXCi8OowoXCvsOmwpfClycsXG4gICAgICAgICAgICAnw6fCv8KBw6fCicKbw6fCicK5w6bCl8KXJyxcbiAgICAgICAgICAgICfDpcKWwoDDpcKWwofDpsKywoHDpsKXwpcnLFxuICAgICAgICAgICAgJ8Olwq7CgcOlwp/CjsOlwo7CvycsXG4gICAgICAgICAgICAnw6bClcKWw6bCscKJw6bCl8KXJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCkcK8w6TCvMKmw6jCtMKdw6XCsMKUw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OmwrXCt8OmwovCicOlwrDClMOlwrjCgicsXG4gICAgICAgICAgICAnw6bCu8Khw6bCtMKyw6nCh8KMw6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKJwo7DpcKFwrDDpcKxwq/DpcK4woInLFxuICAgICAgICAgICAgJ8OnwonCmcOlwoXCi8Onwp/Cs8OlwrjCgicsXG4gICAgICAgICAgICAnw6bCoMK5w6bCssKzw6XCuMKCJyxcbiAgICAgICAgICAgICfDqcKiwp3DpcKwwpTDpcKPwqTDp8K6wrPDpcK4woInLFxuICAgICAgICAgICAgJ8OpwpjCv8Oowo3Co8OmwpfClycsXG4gICAgICAgICAgICAnw6jCjsKrw6XCisKbw6jCvsK+w6fCk8Kmw6jCvsK+w6bClsKhw6XCsMKUw6bCl8KPw6jCh8Kqw6bCssK7w6bCl8KXJyxcbiAgICAgICAgICAgICfDqcKEwoLDpMK8wqbDpsKYwqXDqMKHwqrDpsKywrvDpsKXwpcnLFxuICAgICAgICAgICAgJ8OpwoTCgsOmwrjCqcOlwoXCi8OmwpfCj8OowofCqsOmwrLCu8OmwpfClycsXG4gICAgICAgICAgICAnw6bClsKww6XCt8K0w6XCsMKUw6jCmcKOw6XCj8Kzw6bCl8KXJyxcbiAgICAgICAgICAgICfDpsKWwrDDpcK3wrTDpcKwwpTDqMKZwo7DpcK3wqbDpsKXwpcnLFxuICAgICAgICAgICAgJ8OpwpnCiMOlwrfCtMOlwrDClMOowpnCjsOmwpfClydcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwoXCtMOlwq7CicOnwpvCnycsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6TCucKMw6XChcKww6bCtcKpw6fCicK5w6XCuMKCJywgJ8OpwpjCv8OlwrDClMOlwrHCscOlwrjCgicsICfDp8KnwpHDpcKwwpTDpsKywoHDpcKPwrPDp8K/wrzDpcKJwo3DpsKXwpcnLCAnw6fCp8KRw6XCsMKUw6bCssKBw6XCj8Kzw6fCv8K8w6TCuMKtw6bCl8KXJywgJ8OmwonCjsOowrXCicOnwonCucOmwpfClycsICfDp8KqwoHDpsKzwonDpcKOwr8nXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKAwprDqMK+wr3DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6fCp8KRw6XCsMKUw6bCssKBw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKcwo3DpsKewpfDqcKDwq3DpcKLwpLDpcK4woInLFxuICAgICAgICAgICAgJ8OnwqfCkcOlwrDClMOmwrLCgcOlwrfCpsOnwr/CvMOkwrjCrcOmwpfClycsXG4gICAgICAgICAgICAnw6fCp8KRw6XCsMKUw6bCssKBw6XCt8Kmw6fCv8K8w6XCkMKOw6bCl8KXJyxcbiAgICAgICAgICAgICfDpcK8woDDqcKywoHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrrCk8OkwrzCpsOmwpfClycsXG4gICAgICAgICAgICAnw6XCpcKIw6bCm8K8w6bCl8KXJyxcbiAgICAgICAgICAgICfDpsKJwo7DqcKywoHDp8KJwrnDpsKXwpcnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKUwqHDpsKewpfDqcKDwq3DpcKLwpLDp8Kbwp8nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6TCusKMw6jCv8Kew6bCtcKpw6fCicK5w6XCuMKCJyxcbiAgICAgICAgICAgICfDqcKUwqHDpsKewpfDpsK1wqnDp8KJwrnDpcK4woInLFxuICAgICAgICAgICAgJ8OpwpjCv8OlwrfCtMOlwpjCjsOmwpfClycsXG4gICAgICAgICAgICAnw6jCi8KPw6XCsMK8w6fCicK5w6XCt8Kmw6bCl8KXJyxcbiAgICAgICAgICAgICfDqMKLwo/DpcKwwrzDp8KJwrnDpcKPwrPDpsKXwpcnLFxuICAgICAgICAgICAgJ8OkwrjCnMOkwrnCjMOnwo/CoMOnwqnChsOmwrLCgcOmwpfClycsXG4gICAgICAgICAgICAnw6jCpcK/w6TCucKMw6fCj8Kgw6fCqcKGw6bCssKBw6bCl8KXJyxcbiAgICAgICAgICAgICfDpcKkwqrDpMK7wobDpcKvwrrDpsKXwpcnLFxuICAgICAgICAgICAgJ8OpwpXCtsOpwrvChMOmwpfClycsXG4gICAgICAgICAgICAnw6bCrcKjw6nClcK2w6fCmcK9w6bCl8KXJyxcbiAgICAgICAgICAgICfDpsKtwqPDqMKTwp3DpsKXwpcnLFxuICAgICAgICAgICAgJ8OlwqTCmsOkwrzCpsOlwo7CvydcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrnCjMOlwoXCsMOlwq/Cn8OlwrjCg8OnwpvCnycsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqcKbwobDpcKuwoHDpcK4woInLFxuICAgICAgICAgICAgJ8OkwrjCsMOpwpXCh8OlwrjCgicsXG4gICAgICAgICAgICAnw6XCjcKTw6jCtcKEw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKMwpbDpcK+wrfDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwpXChsOpwoPCvcOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK0w6XCksKMw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKHwonDpcKfwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwq/Cn8OlwpPCiMOlwrDClMOlwo/Cs8Onwr/CvMOlwonCjcOmwpfClycsXG4gICAgICAgICAgICAnw6XCr8Kfw6XCk8KIw6XCsMKUw6XCj8Kzw6fCv8K8w6TCuMKtw6bCl8KXJyxcbiAgICAgICAgICAgICfDpcKvwp/DpcKTwojDpcKwwpTDpcKPwrPDp8K/wrzDpcKQwo7DpsKXwpcnLFxuICAgICAgICAgICAgJ8OlwpvCm8Olwq3CkMOnwo7Ci8OmwpfClydcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrzCisOlwoXCi8OmwpjCrcOnwpvCnycsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6TCuMKcw6jCg8Kcw6XCuMKCJywgJ8Oowr7CvsOmwovCicOnwonCucOmwpfClycsICfDpcKHwobDpsKgwrzDpcKwwpTDpsKXwpcnLCAnw6nChMKCw6bCicKYw6XChcKLw6XCicKNw6bCl8KXJywgJ8OpwoTCgsOmwonCmMOlwoXCi8OmwpfClycsICfDpsKdwq3DqcKUwqbDpsKXwpcnLCAnw6TCucKMw6XCrsKhw6bCl8KXJywgJ8OkwrzCisOpwofCkcOpwpzCjcOmwrTCm8OmwpfClyddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwrfCtMOlwr3CpsOmwrfClsOlwrDClMOnwpvCnycsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6TCuMK0w6bCssKzw6XCuMKCJywgJ8OkwrrClMOlwo7Cn8Olwo7CvycsICfDp8KjwrTDpcKPwqPDpcKOwr8nLCAnw6TCucKMw6bCi8KJw6fCicK5w6XCicKNw6bCl8KXJywgJ8OkwrnCjMOmwovCicOnwonCucOkwrjCrcOmwpfClycsICfDpMK5wozDpsKLwonDp8KJwrnDpcKQwo7DpsKXwpcnLCAnw6bCncKtw6nClMKmw6XCkMKOw6bCl8KXJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCmMK/w6bCi8KJw6XClsKEw6fCm8KfJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqcKYwr/DpsKLwonDpcKWwoTDpcK3wqbDpsKXwpcnLCAnw6nCmMK/w6bCi8KJw6XClsKEw6XCj8Kzw6bCl8KXJywgJ8OpwqLCncOmwrXCjsOnwrrCs8OmwpfClyddXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6jCvsK9w6XCrsKBw6fCnMKBJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrLCiMOpwpjCs8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpsKywojDpsKywrPDpcKMwronLFxuICAgICAgICAgICAgJ8OnwprCh8OlwqfCkcOlwozCuicsXG4gICAgICAgICAgICAnw6XCksKMw6XCucKzw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKkwqfDpMK4wpzDpcKMwronLFxuICAgICAgICAgICAgJ8OpwpPCgcOowqXCv8OlwozCuicsXG4gICAgICAgICAgICAnw6jCi8KPw6XCrsK2w6XCscKvw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK4wpzDqcKZwrXDpcKMwronLFxuICAgICAgICAgICAgJ8OkwrrCjsOmwrTCqsOlwozCuicsXG4gICAgICAgICAgICAnw6bClsKww6bCsMKRw6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKzwpXDpcK6wpPDpcKOwr8nLFxuICAgICAgICAgICAgJ8Oowr7CvcOkwrjCrcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCusK3w6XCucKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKWwrDDpcKfwo7DpcKtwpDDpcKMwronLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwqTCp8Oowr/CnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqMKlwr/DpcKywpfDpcKMwronLFxuICAgICAgICAgICAgJ8OkwrjCrcOlwrHCscOlwozCuicsXG4gICAgICAgICAgICAnw6bCssKZw6bCssKzw6XCj8Kjw6XCjMK6JyxcbiAgICAgICAgICAgICfDp8KUwpjDpMK6wpXDpcKtwpDDpcKMwronLFxuICAgICAgICAgICAgJ8OmwpfChcOpwqHCusOlwo/Co8OlwozCuicsXG4gICAgICAgICAgICAnw6nCh8KRw6XCt8Kew6XCjMK6JyxcbiAgICAgICAgICAgICfDp8KTwqbDpsKIwr/DpcK6wpfDpcK4woInLFxuICAgICAgICAgICAgJ8OmwpnCrsOlwoXCsMOlwrrCl8OlwrjCgicsXG4gICAgICAgICAgICAnw6XCusKEw6bCssKzw6XCuMKCJyxcbiAgICAgICAgICAgICfDqcKVwr/DpsK1wrfDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Opwp7CjcOlwrHCscOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6nCk8KBw6TCuMKcw6XCjMK6JywgJ8OpwpPCgcOowqXCv8OlwozCuicsICfDp8KrwovDpcKxwrHDpcKMwronLCAnw6XCjcKDw6XCscKxw6XCjMK6JywgJ8OmwrXCt8Olwp/CjsOlwrjCgicsICfDpcKPwrDDpcKuwonDpcKOwr8nLCAnw6XCssKrw6XCssKpw6bCu8Khw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmworCmsOpwqHCusOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6nCocK6w6XCn8KOw6XCjMK6JywgJ8OmwpbCsMOmworCmsOlwozCuicsICfDpMK4wpzDpsK0wrLDpcKMwronLCAnw6bCnMKbw6jCisKxw6XCjMK6JywgJ8OmworCmsOpwqHCusOlwo7CvycsICfDpsK4woXDpcKOwp/DpsK7wqHDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLCAnw6bClsKww6XCrsK+w6bCu8Khw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwpzCrMOmwrrCqsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCucKzw6XCscKxw6XCjMK6JywgJ8OmwpjCjsOlwrHCscOlwozCuicsICfDpsK6wqrDpsK5wpbDpcKMwronLCAnw6XCjcKXw6jCisKsw6XCjMK6JywgJ8OmwpzCrMOmwrrCqsOmwrvCocOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsICfDpsKhwpPDpMK7woHDpsK7wqHDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCuMK5w6TCuMKcw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsKMwq/DpcKFwrTDpcKMwronLCAnw6XChcKDw6XCrsKdw6XCjMK6JywgJ8OmwozCr8Olwq7CicOlwozCuicsICfDpMK4wpzDpsK4wq/DpcK4woInLCAnw6XCh8Kkw6XCn8KOw6XCuMKCJywgJ8Olwq7CvcOnwpTCuMOmwrvCocOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKUwqbDpcK3wp7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwqTCqsOlwpLCjMOlwozCuicsICfDpcKPwqTDpcKhwpTDpcKMwronLCAnw6XCh8KMw6bCssKzw6XCjMK6JywgJ8OlwofCjMOmwrXCt8OlwrjCgicsICfDqcK7wpHDpcKxwrHDpcKOwr8nLCAnw6TCucKJw6XCjsK/JywgJ8OlwozCl8Olwq7CgcOlwrjCgicsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqMKQwqXDpcKPwqPDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OnwqvCmcOlwonCjcOlwozCuicsICfDqMKlwr/DpcK4woLDpcKMwronLCAnw6nCssKFw6nCscK8w6XCnMKIw6XCjMK6JywgJ8OowoDCgcOowr7CucOlwozCuicsICfDpcKkwqfDp8KfwrPDpsKhwqXDpcK4woInLCAnw6fCm8KWw6XCt8Kew6XCuMKCJywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwpjCnMOmwpbCsMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCtcK3w6XCt8Kew6XCjMK6JywgJ8OmwpbCsMOpwoLCscOlwozCuicsICfDpcKkwqrDpcK5wrPDpcKMwronLCAnw6bCuMKFw6bCssKzw6nCl8Kow6XCjMK6JywgJ8OnwrvChsOmwrLCs8OlwozCuicsICfDpcK9wrDDpsKtwqbDpcKOwr8nLCAnw6nCmMKcw6bClsKww6jCksKZw6XCj8Kkw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Oowr7CvcOpwpjCs8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6fCmcK9w6XCocKUw6XCjMK6JywgJ8OmwpbCh8OlwpzCo8OlwozCuicsICfDpcKuwo/DpMK8wp/DpcKMwronLCAnw6XCpMKqw6XCrcKQw6bCssKzw6XCjMK6JywgJ8OlwrzCk8OpwpXCv8OlwrLCrcOlwozCuicsICfDp8KBwq/DpcKhwpTDpcK4woInLCAnw6jCvsK9w6nCmMKzw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OnwpvCmMOpwpTCpicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCj8KMw6XCj8Kww6XCrcKQw6XCjMK6JywgJ8OlwoXCtMOpwprChsOlwo/CsMOlwozCuicsICfDp8KbwpjDpcKxwrHDpcKOwr8nLCAnw6XCpMKnw6bCtMK8w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwpPCgcOlwrLCrcOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6nCk8K2w6XCt8Kew6XCjMK6JywgJ8OmwrjChcOmwrLCs8OlwozCuicsICfDqMKwwoPDpcKFwrXDpcKxwrHDpcK4woInLCAnw6XCvMKAw6XCjsKfw6XCuMKCJywgJ8OpwpPCgcOlwrLCrcOlwo7CvycsICfDpsKYwozDpcKbwr7DpcKOwr8nLCAnw6jCpcK/w6TCuMKww6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwpzCncOpwpjCs8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCj8KMw6XCocKUw6XCjMK6JywgJ8Opwr7CmcOlwp/CjsOlwozCuicsICfDpcKHwozDpsK6wpDDpcK4woInLCAnw6XCjMKXw6fCpcKow6XCuMKCJywgJ8OmwpzCncOpwpjCs8Olwo7CvycsICfDpcK7wrrDpcK5wrPDpcKOwr8nLCAnw6XClsKAw6XClsKHw6bCssKBw6XCt8Kmw6fCv8K8w6jCksKZw6XCj8Kkw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OowpHCq8OoworCpsOlwrLCm8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6nCvsKZw6bCuMKvw6XCjMK6JywgJ8Olwo3Cl8OnwqXCqMOlwozCuicsICfDqMK/wp7DpcKxwrHDpcKMwronLCAnw6XChcK0w6XCn8KOw6XCuMKCJywgJ8OnwrvCpcOkwrjCrcOlwo7CvycsICfDpcK7wrrDpsKYwozDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XChcK2w6TCu8KWJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ8OlwpDCicOmwp7Cl8OnwpzCgScsXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKVwr/DpsKYwqXDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCnMKdw6nCmMKzw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKuwr3DpcKfwo7DpcKMwronLFxuICAgICAgICAgICAgJ8OkwrrCjMOpwoHCk8OlwozCuicsXG4gICAgICAgICAgICAnw6XCjcKXw6XChcKzw6XCjMK6JyxcbiAgICAgICAgICAgICfDp8K7wr/DpcKbwq3DpcKMwronLFxuICAgICAgICAgICAgJ8Olwo/CjMOpwpjCs8OlwozCuicsXG4gICAgICAgICAgICAnw6TCucKdw6XCj8Kww6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKmwobDpsKgwpHDpcK4woInLFxuICAgICAgICAgICAgJ8Olwr7Ct8OmwoPCoMOlwrjCgicsXG4gICAgICAgICAgICAnw6XChsKcw6XCrsKJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKQwonDpsKewpfDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OowojCucOowpDCpcOlwozCuicsICfDpsKYwozDqcKCwpHDpcKMwronLCAnw6nCvsKZw6bCvcKtw6XCjMK6JywgJ8OkwrjCsMOmwrvCocOlwozCuicsICfDqMKIwpLDpcKFwrDDpcK4woInLCAnw6bCocKmw6fClMK4w6XCuMKCJywgJ8OowpvCn8OmwrLCs8OlwrjCgicsICfDp8KjwpDDp8KfwrPDpcK4woInLCAnw6bCsMK4w6XCkMKJw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwpvCm8OlwrnCsycsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6nCk8KBw6jCpcK/w6XCjMK6JywgJ8OpwpPCgcOkwrjCnMOlwozCuicsICfDpcKFwqzDpMK4wrvDpcKywq3DpcK4woInLCAnw6XCj8KMw6jCvsK9w6XCuMKCJywgJ8OmwqLCqMOmwqDCkcOlwo7CvycsICfDpMK8worDqcKAwprDpsK7wqHDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6jCvsK9w6bCusKQw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqcK+wpnDpcKxwrHDpcKMwronLCAnw6jCpcK/w6XCrsKJw6XCjMK6JywgJ8OkwrjCnMOowr7CvcOlwo7CvycsICfDpMK4wpzDpMK4wrDDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCgMKaw6XCjMKWw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpMK4wpzDpsKYwozDpcKMwronLCAnw6TCusKMw6nCgcKTw6bCscKfw6XCjMK6JywgJ8OmwqLChcOmwrLCs8Olwo/Co8OlwrjCgicsICfDqcKbwobDpcKuwonDpcK4woInLCAnw6nCgMKaw6XCjMKWw6XCjsK/JywgJ8Oowr7CicOlwo3Cl8Olwo7CvycsICfDpsKfwrPDpsKywrPDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6fCmcK9w6XCscKxw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKFwqvDqcKBwpPDpsKxwp/DpcKMwronLCAnw6bCscKfw6bCusKQw6XCjMK6JywgJ8OkwrjCtMOmwrHCn8OlwrjCgicsICfDqcKdwpbDpcKuwofDpcKOwr8nLCAnw6bCisKaw6bCncK+w6XCjsK/JywgJ8OpwpXCv8OnwpnCvcOmwpzCncOpwrLCnMOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKdwr7DpcKOwp/DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8Olwq7CgcOmwrHCn8OlwozCuicsICfDpMK5wr7DpcKuwonDpcKOwr8nLCAnw6nClcK/w6XCssKtw6XCjsK/JywgJ8OmwonCtsOkwr3CmcOlwo7CvycsICfDpcKJwo3DqcKDwq3DpcKwwpTDp8K9wpfDpsKWwq/DqMKSwpnDpcKPwqTDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6fCmcK9w6XCn8KOw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsK0wq7DpcKMwpfDpcKMwronLCAnw6XCpMKnw6XCrsKJw6XCuMKCJywgJ8OmwrTCrsOlwo3Cl8OlwrjCgicsICfDqcKVwofDqMK1wonDpcKOwr8nLCAnw6nCgMKaw6bCpsKGw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwrvCtsOowr7CucOmwpzCncOpwrLCnMOmwpfCj8OowofCqsOmwrLCu8OlwrfCnicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCu8K2w6XCkMKJw6XCuMKCJywgJ8OlwpvCvsOkwrvCrMOlwrjCgicsICfDpsKVwqbDpcKMwpbDpcK4woInLCAnw6nCvsKZw6TCusKVw6XCuMKCJywgJ8Onwo/CssOmwpjCpcOlwrjCgicsICfDpcKSwozDqcK+wpnDpcK4woInLCAnw6XCrsKJw6XCm8K+w6XCjsK/JywgJ8OmwrHCqsOmwrjChcOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKFwrbDpMK7wpYnLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6nCu8KRw6nCvsKZw6bCscKfw6fCnMKBJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwpPCiMOlwrDClMOmwrvCqMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpsKdwr7DpcKMwpfDpcKMwronLFxuICAgICAgICAgICAgJ8OpwoHCk8OpwofCjMOlwozCuicsXG4gICAgICAgICAgICAnw6XCjcKXw6XCssKXw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcK5wrPDpsKIwr/DpcKMwronLFxuICAgICAgICAgICAgJ8OpwqbCmcOlwp3CisOlwozCuicsXG4gICAgICAgICAgICAnw6nCgcKTw6XCpMKWw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKRwrzDpcKFwrDDpcKMwronLFxuICAgICAgICAgICAgJ8OpwpjCv8Olwp/CjsOlwozCuicsXG4gICAgICAgICAgICAnw6XCj8KMw6XCn8KOw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKwwprDpcK/wpfDpcK4woInLFxuICAgICAgICAgICAgJ8OkwrrClMOlwrjCuMOlwrjCgicsXG4gICAgICAgICAgICAnw6XCrsK+w6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKWwrnDpsKtwqPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwoDCmsOmwrLCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCt8K0w6XCvcKmw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK7wrbDpcKvwr/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwpzCqMOlwoXCsMOlwo7CvycsXG4gICAgICAgICAgICAnw6TCvsKdw6XChcKww6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcK9wpDDqcK9wpDDpcKTwojDpcKwwpTDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6nCvsKZw6bCssKZw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKYwoLDpsKYwoLDpsK6wqrDpcKMwronLFxuICAgICAgICAgICAgJ8OpwpPCgcOpwpTCi8OlwozCuicsXG4gICAgICAgICAgICAnw6XCu8K6w6XCjcKOw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKvwozDpsKLwonDpcKwwpTDpcKfwrrDpcKMwronLFxuICAgICAgICAgICAgJ8OnwqLCvsOlwq3CkMOlwrHCscOlwozCuicsXG4gICAgICAgICAgICAnw6bCosKFw6nCh8KMw6bClsKvw6jCvsK+w6bClsKhw6XCsMKUw6bCl8KPw6XCjMK6JyxcbiAgICAgICAgICAgICfDqMKuwrfDpsKywrPDpcK4woInLFxuICAgICAgICAgICAgJ8Olwq/CjMOowqPClcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCi8Kcw6bCs8KJw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KUwpjDpcKNwpfDpcKOwr8nLFxuICAgICAgICAgICAgJ8Okwr7CncOlwq7CicOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcKLw6XCscKxw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKzwrDDpsKdwqXDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCi8OkwrjCnMOlwo7CvycsXG4gICAgICAgICAgICAnw6nCvsKZw6bCscKfw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcK5wqTDpcKywpfDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoXCtMOlwrHCscOlwozCuicsICfDpcK3wqXDpcKGwpzDpcKMwronLCAnw6XCjcKXw6XCscKxw6XCjMK6JywgJ8OlwoXCtMOlwq7CicOlwozCuicsICfDpcKQwpHDqcKYwrPDpcKMwronLCAnw6TCuMKcw6XCscKxw6XCjMK6JywgJ8OowpDCncOlwozCl8Olwo7CvycsICfDp8K7wqXDpsK7wqjDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCj8KMw6nCuMKtw6XCscKxJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKwwpbDpcKxwrHDpcKMwronLCAnw6XCssKtw6TCuMKcw6XCjMK6JywgJ8OlwpvCm8OmwpbCucOlwo/CsMOlwozCuicsICfDpcKuwp3DpcKxwrHDpcKMwronLCAnw6nCm8KGw6jCtMKkw6XCjsK/JywgJ8Olwq7CncOmwrjChcOlwo7CvycsICfDpcKPwovDqMKwworDpcKOwr8nLCAnw6nCpcK2w6bCssKzw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwrjCocOowqXCv8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6nCuMKhw6XChsKgw6XCjMK6JywgJ8OmwoHCksOlwrHCscOlwozCuicsICfDpcKfwo7DpcKtwpDDpsKywrPDpcKMwronLCAnw6bCu8K0w6nCgcKTw6XCjMK6JywgJ8OmwqLCqMOmwqDCkcOlwozCuicsICfDqcK6wrvDpcKxwrHDpcKMwronLCAnw6XCr8KGw6XCscKxw6XCuMKCJywgJ8OowpnCjsOmwp7Cl8OlwrjCgicsICfDqcK4wqHDpMK4wpzDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCpMKnw6XCusKGw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OowpDCqMOlwrDClMOlwpvCvsOlwozCuicsXG4gICAgICAgICAgICAnw6fCusKiw6XCssKXw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcK+wpnDpcKHwqTDpcKMwronLFxuICAgICAgICAgICAgJ8Oowq7CqcOowoPCocOowrfCr8OlwozCuicsXG4gICAgICAgICAgICAnw6XCpMKnw6XCkMKMw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKewpfDp8KUwrjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OowoLCh8OlwrfCnsOlwo7CvycsXG4gICAgICAgICAgICAnw6jCgsKHw6bCusKQw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKdwpzDpcKwwpTDpMK8wq/Dp8KJwrnDqMKSwpnDpcKPwqTDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrzCisOmwpjCpcOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpMK8worDpsKYwqXDpcKMwronLFxuICAgICAgICAgICAgJ8OlwrjCpsOlwrLCrcOlwozCuicsXG4gICAgICAgICAgICAnw6XCjcKXw6XCssKUw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKHwpHDpcKxwrHDpcKxwq/DpcKMwronLFxuICAgICAgICAgICAgJ8OowqXCv8Omwp7Cl8OlwozCuicsXG4gICAgICAgICAgICAnw6fCvsKOw6bCusKqw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK5wozDqcKpwqzDpsKywrPDpcKMwronLFxuICAgICAgICAgICAgJ8Onwr/CoMOlwrPCpsOlwozCuicsXG4gICAgICAgICAgICAnw6XCj8KLw6XCpcK9w6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK4worDp8KUwpjDpcKywq3DpcKMwronLFxuICAgICAgICAgICAgJ8OkwrrClMOowpDCpcOlwozCuicsXG4gICAgICAgICAgICAnw6fCusKiw6bCmMKfw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKWwrDDqcKdwpLDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrHCpMOmwpfCusOmwrLCs8OlwozCuicsXG4gICAgICAgICAgICAnw6TCucKMw6TCvMKKw6XCssKtw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKTwoHDpcKKwpvDpcK4woInLFxuICAgICAgICAgICAgJ8OlwpjCicOowo3Cq8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6fCicKhw6TCuMK5w6bCscKfw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OnwojCscOmwrDCkcOlwozCuicsXG4gICAgICAgICAgICAnw6TCuMKcw6XCrsKJw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKYwrPDpsKYwo7DpcKMwronLFxuICAgICAgICAgICAgJ8OowqXCv8Olwq7CicOlwozCuicsXG4gICAgICAgICAgICAnw6fCu8Klw6jCisKsw6bCssKzw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKuwoHDpcKuwonDpcK4woInLFxuICAgICAgICAgICAgJ8OmwrXCt8Omwp7Cl8OlwrjCgicsXG4gICAgICAgICAgICAnw6fCqcKGw6bCo8Kxw6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKewpfDpcKPwqPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrjCnMOlwq7CgcOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCvcKzw6bCnMKow6bClsKvw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OlwpDCkcOpwpjCs8OlwozCuicsXG4gICAgICAgICAgICAnw6XCicKNw6jCv8Kbw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK4wpzDqcKjwo7DpcKMwronLFxuICAgICAgICAgICAgJ8OpwoPCisOlwozCuicsXG4gICAgICAgICAgICAnw6XCkMKMw6bCscKfw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKvwozDqcKUwqbDpcK4woInLFxuICAgICAgICAgICAgJ8OmwqHCpsOlwrfCncOlwo7CvycsXG4gICAgICAgICAgICAnw6bCisKaw6jCv8Kcw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKhwqbDpcKNwpfDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrHCpMOlwo7Cn8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCuMKDw6XCj8Kww6bCssKzw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsKhwoPDpcKxwrHDpcKMwronLCAnw6bClsKww6XChcK0w6XCjMK6JywgJ8OowozChMOlwq3CkMOmwrLCs8OlwozCuicsICfDpcKLwoPDpcKIwqnDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCu8KRw6bCssKzw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDp8KIwrHDqMK+wonDpcKMwronLCAnw6XCjMKXw6XCrsKJw6XCuMKCJywgJ8OkwrrClMOlwqTCp8Oowr/CnsOmwrHCoMOlwrjCgicsICfDqcKAworDpcKFwovDpcKOwr8nLCAnw6XCq8Kpw6bCscKfw6XCjsK/JywgJ8Olwq3CmcOlwpDCtMOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDp8K7wqXDpcKMwpbDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6XCjMKXw6bCnsKXw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKuwonDqMK+wr7DpcK4woInLFxuICAgICAgICAgICAgJ8OowoLCh8OkwrjCnMOlwrjCgicsXG4gICAgICAgICAgICAnw6bCtcK3w6TCvMKmw6XCuMKCJyxcbiAgICAgICAgICAgICfDp8K7wqXDpsKjwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCsMOowqXCv8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCmMKOw6bCsMK0w6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKdwpLDpcKGwojDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrrChsOlwq7CicOlwo7CvycsXG4gICAgICAgICAgICAnw6bCnMKbw6XCpcKOw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKkwqfDpcKFwrTDpcKuwonDpcKywq3DpcKcwrDDpcKMwronLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwpHCvMOnwo7Cm8Olwo7CvycsICfDpcKhwpTDpsKywrPDpcKOwr8nLCAnw6bCvMKgw6bCssKzw6XCjsK/JywgJ8OlwqTCp8OlwoXCtMOlwq7CicOlwrLCrcOowr7ClsOlwozCuicsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKFwrbDpMK7wpYnLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6TCuMKKw6bCtcK3JyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrjCisOmwrXCt8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqcK7woTDpsK1wqbDpcKMwronLFxuICAgICAgICAgICAgJ8Olwo3CosOmwrnCvsOlwozCuicsXG4gICAgICAgICAgICAnw6XCvsKQw6bCscKHw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKVwr/DpcKuwoHDpcKMwronLFxuICAgICAgICAgICAgJ8Opwp3CmcOlwq7CicOlwozCuicsXG4gICAgICAgICAgICAnw6bCmcKuw6nCmcKAw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKXwrjDpcKMwpfDpcKMwronLFxuICAgICAgICAgICAgJ8OowpnCucOlwo/Co8OlwozCuicsXG4gICAgICAgICAgICAnw6bCncKow6bCtcKmw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKuwp3DpcKxwrHDpcKMwronLFxuICAgICAgICAgICAgJ8OpwpfCtcOowqHCjMOlwozCuicsXG4gICAgICAgICAgICAnw6XCmMKJw6XCrsKaw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKdwr7DpsKxwp/DpcKMwronLFxuICAgICAgICAgICAgJ8OpwofCkcOlwrHCscOlwozCuicsXG4gICAgICAgICAgICAnw6nCncKSw6bCtcKmw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKNwpfDpsKxwofDpcKMwronLFxuICAgICAgICAgICAgJ8OlwqXCicOowrTCpMOlwozCuicsXG4gICAgICAgICAgICAnw6bCtcKmw6TCuMKcw6bClsKww6XCjMK6JyxcbiAgICAgICAgICAgICfDpcK0wofDpsKYwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6bCscKfw6jCi8KPw6fCnMKBJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Olwo3Cl8OkwrrCrMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDp8KOwoTDpsKtwqbDpcKMwronLFxuICAgICAgICAgICAgJ8OnwpnCvcOkwrjCi8OlwozCuicsXG4gICAgICAgICAgICAnw6fCp8Kmw6bCt8Kuw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcK7wrrDqcKCwrrDpcKMwronLFxuICAgICAgICAgICAgJ8OpwrzCk8OmwqXCvMOlwozCuicsXG4gICAgICAgICAgICAnw6TCuMKLw6XChcKzw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKgwpbDqcKcwp7DpcKMwronLFxuICAgICAgICAgICAgJ8OpwpvCqMOoworCscOlwo/CsMOlwozCuicsXG4gICAgICAgICAgICAnw6bCtcKmw6XCj8Kjw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKxwp/DpcKuwoHDpcKMwronLFxuICAgICAgICAgICAgJ8OlwoXCrcOlwpDCiMOlwozCuicsXG4gICAgICAgICAgICAnw6bCusKnw6bCsMK0w6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKrwpjDpsK3wrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OowovCj8OlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqcKHwpHDqcKYworDpcKMwronLFxuICAgICAgICAgICAgJ8OlwrnCs8OmwrHCn8OlwozCuicsXG4gICAgICAgICAgICAnw6bCssKnw6bCtcKqw6XCjMK6JyxcbiAgICAgICAgICAgICfDqMKZwo7DpMK4wpjDpcKMwronLFxuICAgICAgICAgICAgJ8OlwpDCtMOkwrjCrcOlwozCuicsXG4gICAgICAgICAgICAnw6fCm8K4w6XCn8KOw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcK4wrjDp8KGwp/DpcK4woInLFxuICAgICAgICAgICAgJ8OlwrzCoMOlwq7CtsOmwrjCr8OlwrjCgicsXG4gICAgICAgICAgICAnw6bCmMKGw6XCscKxw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKQwrTDpsKxwp/DpcK4woInLFxuICAgICAgICAgICAgJ8OlwqTCqsOkwrvCk8OlwrjCgicsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCl8Kgw6nClMKhw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcK0wofDpcKuwonDpcKMwronLCAnw6XCjcKXw6nClcK/w6XCjMK6JywgJ8OlwozCl8OlwqHCmMOlwozCuicsICfDpsK7wqjDpsK5wpbDpcKMwronLCAnw6nClMKhw6XCscKxw6XCjMK6JywgJ8OmwoPCoMOlwrHCscOlwozCuicsICfDpsKxwp/DqcKYwrTDpcK4woInLCAnw6XCrsKcw6XChcK0w6XCuMKCJywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwrjCuMOlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6nCksKfw6bCpcK8w6XCjMK6JywgJ8OlwqTCqcOlwq7CgcOlwozCuicsICfDpsKIwprDpcKiwoXDpcKgwrDDpcKMwronLCAnw6bClsKww6XCjMKXw6XCjMK6JywgJ8Omwq3CpsOowr/Cm8OlwozCuicsICfDqcKHwpHDpcKdwpvDpcK4woInLCAnw6bCusKnw6nCmMKzw6XCuMKCJywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwpXCh8OmwrHCn8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6TCusKsw6XCj8Kjw6XCjMK6JywgJ8OmwrbCpsOlwrfCnsOlwozCuicsICfDpMK4wrnDpcK+wpLDpcKMwronLCAnw6TCuMK5w6nCmMKzw6XCuMKCJywgJ8OmwonCrMOkwrjCrcOlwrjCgicsICfDpcKPwqXDpcKuwrnDpcK4woInLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCjcKXw6nCgMKaw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcK0wofDpcK3wp3DpcKMwronLCAnw6bCuMKvw6nCl8K4w6XCjMK6JywgJ8OpwoDCmsOlwrfCnsOlwrjCgicsICfDpcKmwoLDp8KawovDpcK4woInLCAnw6bCtcK3w6nCl8Kow6XCuMKCJywgJ8OlwpDCr8OkwrjCnMOlwrjCgicsICfDpsK1wrfDpcKuwonDpcKOwr8nLCAnw6XCpsKCw6TCuMKcw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrPCsMOlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCtcK3w6nCmcK1w6XCjMK6JywgJ8OpwqvCmMOmwrjCr8OlwozCuicsICfDpcKnwpzDpcKgwrDDpcK4woInLCAnw6bCs8Kww6XChcK0w6XCuMKCJywgJ8Opwp3ClsOmwrHCn8OlwrjCgicsICfDpcKFwrTDpcKMwpbDpcK4woInLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCicKsw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcK5wr/DqcKZwrXDpcKMwronLCAnw6fCu8K0w6bCicKsw6XCjMK6JywgJ8OpwoLCl8OmwrHCn8OlwozCuicsICfDpsKxwp/DqcKDwr3DpcK4woInLCAnw6TCu8Kqw6XCvsKBw6XCuMKCJywgJ8OpwqvCmMOpwoLCrsOlwrjCgicsICfDpcKuwp3DpcK6wpTDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6fCm8KQw6XCn8KOw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpMK6wq3DpsK5wpbDpcKMwronLCAnw6fCm8KQw6nCg8K9w6XCjMK6JywgJ8OlwqTCp8OkwrjCsMOlwrjCgicsICfDpMK4wpzDpcKPwrDDpcK4woInLCAnw6XCu8K6w6bCucKWw6XCjsK/JywgJ8OlwrDChMOpwpjCs8Olwo7CvycsICfDqcKYwpzDpcKuwoHDpcKOwr8nLCAnw6bCu8Kow6bCtcK3w6XCjsK/JywgJ8OlwpPCjcOmwrDCtMOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqMK/wp7DpMK6wpHDpsK4wq/DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwpbCsMOmwrXCpsOlwozCuicsICfDpsK1wrfDpcK3wp7DpcKMwronLCAnw6jCv8Kew6TCusKRw6XCjMK6JywgJ8OkwrjCnMOmwrXCt8Olwo7CvycsICfDp8KBwozDpMK6wpHDpcKOwr8nLCAnw6jCtcKjw6bCpsKGw6XCjsK/JywgJ8OnwoHCjMOlwo3Cl8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcK+wpDDpcK3wp7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6TCusKRw6nCvsKZw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcK8wpPDpsKlwrzDpcKMwronLFxuICAgICAgICAgICAgJ8OkwrnCncOpwofCjMOlwozCuicsXG4gICAgICAgICAgICAnw6bCs8KJw6XCscKxw6XCjMK6JyxcbiAgICAgICAgICAgICfDqMK0wr7DpsKxwqrDpcKMwronLFxuICAgICAgICAgICAgJ8OpwoLCs8OlwrfCnsOlwrjCgicsXG4gICAgICAgICAgICAnw6bClsKww6bCssKCw6XCuMKCJyxcbiAgICAgICAgICAgICfDqcKTwpzDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8Onwp3CosOlwq7CgcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCssKbw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wrDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrfCrsOlwq7CicOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCuMKFw6bCssKzw6XCjMK6JywgJ8OmwrjChcOmwrXCpsOlwozCuicsICfDpsKlwprDpcK3wp7DpcKMwronLCAnw6bCt8Kuw6nCmMK0w6XCjMK6JywgJ8OmwrbCn8OmwrDCtMOlwo7CvycsICfDpsK0wqrDpsKzwr3DpcKOwr8nLCAnw6nCh8KRw6bCucKWw6XCjsK/JywgJ8OnwpvCscOnwpzCmcOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKuwr/DqMK/woHDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8Olwq7Cv8Olwp/CjsOlwozCuicsICfDpcKuwr/DqMKxwqvDpcKMwronLCAnw6bCssKtw6nCmMKzw6XCjsK/JywgJ8OmwrPCl8OpwpjCs8Olwo7CvycsICfDpsKzwpfDpsK0wqrDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XChcK2w6TCu8KWJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ8OmwrXCmcOmwrHCn8OnwpzCgScsXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKdwq3DpcK3wp7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCi8Kxw6XCosKFw6XCjMK6JyxcbiAgICAgICAgICAgICfDqMKlwr/DpsK5wpbDpcKMwronLFxuICAgICAgICAgICAgJ8OkwrjCisOlwp/CjsOlwozCuicsXG4gICAgICAgICAgICAnw6TCuMKLw6XCn8KOw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKxwp/DpcK5wrLDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrvCqMOmwrHCn8OlwozCuicsXG4gICAgICAgICAgICAnw6TCvcKZw6bCncKtw6XCjMK6JyxcbiAgICAgICAgICAgICfDqMKQwqfDpcKxwrHDpcKMwronLFxuICAgICAgICAgICAgJ8OlwrvCusOlwr7Ct8OlwrjCgicsXG4gICAgICAgICAgICAnw6XCr8KMw6nCmMKzw6XCuMKCJyxcbiAgICAgICAgICAgICfDpMK4wrTDpcKuwonDpcK4woInLFxuICAgICAgICAgICAgJ8OmwqHCkMOlwrrCkMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCt8Kzw6XCrsKJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKuwoHDpsKzwqLDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCtcK3w6bCm8KZw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKxwp/DpMK4wpzDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrHCn8OlwozCl8OlwozCuicsXG4gICAgICAgICAgICAnw6nClcKHw6bCtcK3w6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKMwpfDpMK7wpHDpcKMwronLFxuICAgICAgICAgICAgJ8OpwoTCnsOlwrfCnsOlwozCuicsXG4gICAgICAgICAgICAnw6TCvcKZw6XCp8Kaw6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKFwojDpsK6wqrDpcK4woInLFxuICAgICAgICAgICAgJ8OlwqXCicOlwozClsOlwrjCgicsXG4gICAgICAgICAgICAnw6XCrsKBw6bCtcK3w6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKxwqHDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrjCqcOlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqcK5wr/DpcKfwo7DpcKMwronLFxuICAgICAgICAgICAgJ8Opwr7CmcOmwrnCvsOlwozCuicsXG4gICAgICAgICAgICAnw6fCk8Kvw6bCtcK3w6XCjMK6JyxcbiAgICAgICAgICAgICfDp8KRwp7DpcKuwonDpcK4woInLFxuICAgICAgICAgICAgJ8OkwrnCkMOmwrjChcOlwrjCgicsXG4gICAgICAgICAgICAnw6bCsMK4w6XCmMKJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK0wp7DpcKkwrTDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrnCs8OpwpjCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6jCi8KNw6XCjcKXw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKWwofDpsKIwpDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrPCsMOpwqHCusOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCmMKJw6XChcK0w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDp8KnwoDDpcKfwo7DpcKMwronLCAnw6fCp8KAw6bCtMKyw6XCjMK6JywgJ8OmwrXCt8Olwq7CgcOlwrjCgicsICfDpcK5wrPDpsK5wpbDpcK4woInLCAnw6bCocKQw6TCucKhw6XCuMKCJywgJ8OlwpjCicOlwpbChMOlwo7CvycsICfDpsK1wrfDp8KbwpDDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCucKWw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKQwrTDpcKFwrTDpcKMwronLCAnw6XCjcKXw6bCtcKUw6XCjMK6JywgJ8OpwpXCv8OlwoXCtMOlwo7CvycsICfDpcK+wrfDpsK4woXDpcKOwr8nLCAnw6XCrsKJw6XCkMKJw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OnwrvCjcOlwoXCtMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6jCtsKKw6XCn8KOw6XCjMK6JywgJ8Oowq/CuMOmwprCqMOlwrjCgicsICfDpMK4worDqMKZwp7DpcK4woInLCAnw6XCtcKKw6XCt8Kew6XCuMKCJywgJ8OnwrvCjcOlwoXCtMOlwo7CvycsICfDpsKWwrDDpsKYwozDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCh8KRw6XCjcKOw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKpwrrDpcKfwo7DpcKMwronLCAnw6nCh8KRw6TCuMKcw6XCjMK6JywgJ8OlwoXCsMOmwrrCqsOlwrjCgicsICfDpMK5wonDpMK5wozDpcK4woInLCAnw6TCuMKcw6nCmMKzw6XCuMKCJywgJ8OmwrDCuMOlwrrCt8OlwrjCgicsICfDpsKtwqbDpMK5wonDpcKOwr8nLCAnw6bCtcKmw6bCscKfw6XCjsK/JywgJ8OnwqPCkMOlwq7CicOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqMKhwqLDpcK3wp7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8Omwp/Cr8Olwp/CjsOlwozCuicsICfDqMKhwqLDpsKxwp/DpcKMwronLCAnw6bCscKfw6XCscKxw6XCuMKCJywgJ8Opwr7CmcOmwrjCuMOlwo7CvycsICfDpcK4wrjDpcKxwrHDpcKOwr8nLCAnw6XCvMKAw6XCjMKWw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OowojCn8OlwrHCscOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCrsKaw6bCtcK3w6XCjMK6JywgJ8OmwpnCrsOpwpnCgMOlwozCuicsICfDpcKywrHDpcKxwrHDpcKOwr8nLCAnw6XCtcKKw6bCs8KXw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Olwo/CsMOlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCpMKSw6bCscKfw6XCjMK6JywgJ8OpwrvChMOlwrLCqcOlwozCuicsICfDqMK3wq/DpsKhwqXDpcKMwronLCAnw6TCuMK0w6bCtcK3w6XCuMKCJywgJ8OmwrjCqcOlwrLCrcOlwrjCgicsICfDp8KOwonDp8KOwq/DpcKOwr8nLCAnw6XCpMKpw6XCj8Kww6XCjsK/JywgJ8OkwrvCmcOlwrHChcOlwo7CvycsICfDpMK4wonDqcKXwqjDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCuMK9w6bCsMK0w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8Oowo7CssOpwoPCvcOlwozCuicsXG4gICAgICAgICAgICAnw6nCvsKZw6bCs8KJw6XCuMKCJyxcbiAgICAgICAgICAgICfDp8K8wpnDpMK6wpHDpcKOwr8nLFxuICAgICAgICAgICAgJ8Opwp3CksOnwpTCsMOlwo7CvycsXG4gICAgICAgICAgICAnw6TCusKRw6XCksKMw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKBwoLDpsKYwozDpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwp3CvsOpwpjCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCusKGw6XChcKDw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKZwq/DpcKuwoHDp8KVwrLDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwoXCtsOkwrvClsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICfDpcKuwonDpcK+wr3Dp8KcwoEnLFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCkMKIw6jCgsKlw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcK6wpDDqcKYwrPDpcKMwronLCAnw6fCkcK2w6bCtcK3w6XCjMK6JywgJ8OowpzCgMOlwrHCscOlwozCuicsICfDpcKMwoXDpsKywrPDpcKMwronLCAnw6nClcK/w6TCuMKww6XCjsK/JywgJ8OowoLCpcOkwrjCnMOlwo7CvycsICfDqMKCwqXDqMKlwr/DpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6jCisKcw6bCucKWw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqcKVwpzDpsK5wpbDpcKMwronLCAnw6XCvMKLw6bCscKfw6XCjMK6JywgJ8OpwrjCoMOmwrHCn8OlwozCuicsICfDpMK4wonDpcKxwrHDpcKMwronLCAnw6jCisKcw6bCucKWw6XCjsK/JywgJ8Olwo3Cl8OpwpnCtcOlwo7CvycsICfDp8K5woHDpsKYwozDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6jCmsKMw6XCn8Kgw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqMKawozDpcKxwrHDpcKMwronLCAnw6nCvsKZw6XCrcKQw6bCucKWw6XCjMK6JywgJ8OnwqbCucOkwrzCmsOlwozCuicsICfDpsK3wq7DpMK4worDpcKMwronLCAnw6bCgMKAw6jCv8Kcw6XCjsK/JywgJ8OlwpvCusOpwpXCh8Olwo7CvycsICfDpMK6wpTDpsKywrPDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCt8Kuw6XCjcKXw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDp8KUwrDDpcKuwrbDpcK6wrXDpcKMwronLCAnw6XCpMKnw6nCgMKaw6XCjMK6JywgJ8OowrDCosOlwq7CtsOpwpvChsOlwozCuicsICfDpcKFwqvDpcKFwqzDpcKxwrHDpcKMwronLCAnw6bCvcKYw6nCm8KGw6XCjMK6JywgJ8OlwofCpMOlwo/CsMOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKpwqzDqcKewo3DpcKxwrHDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OpwpvCqMOlwrHCscOlwozCuicsICfDqMKKwrHDpcKxwrHDpcKMwronLCAnw6nCh8KRw6XCrsK2w6XCusKEw6XCjMK6JywgJ8Olwr3Ck8OmwrbCgsOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsK3wq7DpcKMwpfDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OnwpvCuMOlwrHCscOlwozCuicsICfDpsKdwpzDqcKbwobDpcKMwronLCAnw6fCg8KIw6XCscKxw6XCjMK6JywgJ8Omwr/CicOmwrrCqsOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKTwpzDqcKZwrXDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OpwpPCnMOlwq7CmMOlwrHCscOlwozCuicsICfDp8KLwq7DpcKtwpDDpcKxwrHDpcKMwronLCAnw6nCg8KKw6XCjMK6JywgJ8OpwpPCnMOpwpnCtcOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKuwonDpcK6wobDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6jCv8KOw6bCscKfw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKkwqfDqMKnwoLDpcKMwronLFxuICAgICAgICAgICAgJ8Olwq7CnMOnwqfCgMOlwozCuicsXG4gICAgICAgICAgICAnw6bCocKQw6XCn8KOw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKuwr/DpsKdwr7DpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwp7CnsOpwpjCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCpMKqw6bCucKWw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKAwoDDpcKuwoHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrLCs8OowqXCv8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCnMKbw6bCscKfw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK9wpzDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwrvChMOlwrHCscOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCscKvw6bCusKqw6XCjMK6JywgJ8OpwrvChMOlwrHCscOlwozCuicsICfDpcK+wr3DpcK3wp7DpcKMwronLCAnw6TCvMKRw6XCrsKBw6XCjsK/JywgJ8Omwq3CmcOlwo7CvycsICfDp8KlwoHDqcKXwqjDpcKOwr8nLCAnw6nCu8Kfw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrvCgcOlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6fCkMKFw6fCkMKKw6XCjMK6JywgJ8Olwo3Cl8OowrDCr8OlwozCuicsICfDpcKkwqnDqcKVwr/DpcK4woInLCAnw6bCmMKOw6XChcKJw6XCuMKCJywgJ8OlwoXCqMOmwqTCksOlwo7CvycsICfDpsKdwqXDpcKuwonDpcKOwr8nLCAnw6XCrsKaw6jCv8Kcw6XCjsK/JywgJ8OlwofCpMOpwpjCs8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKYwpzDqcKYwrPDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OpwqLCjcOlwrfCnsOlwozCuicsICfDqcKiwo3DpMK4wpzDpcKMwronLCAnw6nCosKNw6bCs8KJw6XCjMK6JywgJ8OnwpXCjMOpwqbClsOlwrjCgicsICfDpMK4wrTDpsKzwonDpcKOwr8nLCAnw6nCosKNw6TCuMKKw6XCjsK/JywgJ8OpwpjCnMOlwo3Cl8Olwo7CvycsICfDpcKkwqrDpcKSwozDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCrsK/w6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKfwofDpsKhwqXDpcKMwronLCAnw6jCkMKnw6XCjsK/JywgJ8OmwrPCl8Olwo7CvycsICfDp8KgwoDDpcKxwrHDpcKOwr8nLCAnw6fCgcK1w6fCksKnw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwrfCosOmwrnClsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCscKFw6XCt8Kiw6XCjMK6JywgJ8OlwpDCq8OlwrHCscOlwo7CvycsICfDpsKXwqDDpMK4wrrDpcKOwr8nLCAnw6XCusKQw6bCscKfw6XCjsK/JywgJ8OlwpLCjMOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKFwq3DpcKuwonDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OpwofCkcOlwq7CicOlwozCuicsICfDqMKjwpXDpcKuwonDpcKMwronLCAnw6XCr8K/w6XCjsK/JywgJ8OpwpzCjcOlwrHCscOlwo7CvycsICfDqcKcwo3DqcKCwrHDpcKOwr8nLCAnw6jCiMKSw6XCn8KOw6XCjsK/JywgJ8OpwofCkcOlwq/CqMOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpMK6wrPDpcK3wp7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OowrDCr8Olwp/CjsOlwozCuicsICfDpcKIwqnDqMK+wpvDpcKOwr8nLCAnw6bCtsKhw6nCmMKzw6XCjsK/JywgJ8OowpLCmcOlwp/CjsOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKxwqDDpcK3wp7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OowrTCtcOmwrHCoMOlwozCuicsICfDpMK4wpzDqMKHwrPDpcKOwr8nLCAnw6fCn8Kzw6XCj8Kww6XCjsK/JywgJ8Opwp3CksOpwpjCs8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKuwqPDpcKfwo7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8Olwq7Co8OlwrfCnsOlwozCuicsICfDpcKuwoHDpcKbwr3DpcK4woInLCAnw6XCucK/w6XCvsK3w6XCjsK/JywgJ8OpwoPCjsOmwrrCqsOlwo7CvycsICfDpsKzwr7DpcKOwr8nLCAnw6bCl8KMw6XCvsK3w6XCjsK/JywgJ8OnwrvCqcOmwrrCqsOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKFwrbDpMK7wpbDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6fCpsKPw6XCu8K6w6fCnMKBJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OnwqbCj8OlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqcK8wpPDpsKlwrzDpcKMwronLFxuICAgICAgICAgICAgJ8Olwo/CsMOmwrHCn8OlwozCuicsXG4gICAgICAgICAgICAnw6TCu8KTw6XCscKxw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKpwqzDpcKwwr7DpcKMwronLFxuICAgICAgICAgICAgJ8OmwpnCi8Olwq7CicOlwozCuicsXG4gICAgICAgICAgICAnw6fCpsKPw6bCuMKFw6XCuMKCJyxcbiAgICAgICAgICAgICfDqcKVwr/DpMK5wpDDpcK4woInLFxuICAgICAgICAgICAgJ8OpwpfCvcOkwr7Cr8Olwo7CvycsXG4gICAgICAgICAgICAnw6nCl8K9w6bCuMKFw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKwwrjDpsKzwrDDpcKOwr8nLFxuICAgICAgICAgICAgJ8Oowr/CnsOmwrHCn8Olwo7CvycsXG4gICAgICAgICAgICAnw6fCvcKXw6bCusKQw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK5wrPDpsK9wq3DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Olwo7CpsOpwpfCqMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCgMKdw6bCmMKOw6XCjMK6JywgJ8OmwrXCt8OmwrLCp8OlwozCuicsICfDpsK5wpbDqcKHwozDpcKMwronLCAnw6nCm8KGw6fCvsKOw6XCjMK6JywgJ8OlwpDCjMOlwq7CicOlwozCuicsICfDp8K/wpTDpcKuwonDpcKMwronLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6jCjsKGw6fClMKww6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKfwo7DpcKOwqLDpcKMwronLCAnw6bCtsK1w6bCscKfw6XCjMK6JywgJ8Oowo3ClMOlwp/CjsOlwozCuicsICfDp8KnwoDDpcKxwr/DpcKMwronLCAnw6TCu8KZw6bCuMK4w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrjCicOmwpjCjsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpsKiwoXDpcKIwpfDpcKMwronLFxuICAgICAgICAgICAgJ8OkwrjCicOlwoXCg8OlwozCuicsXG4gICAgICAgICAgICAnw6bCsMK4w6XCrsKJw6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKYwo7DpsK6wqrDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrDChsOkwrnCkMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCpMKnw6fClMKww6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwoHDpcKMwpbDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrvCusOlwq7CgcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCssKZw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKwwqTDpsK6wqrDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrjChcOmwrXCgcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCs8Kww6XCrsKBw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKzwonDpcK3wp7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6nCssKkw6XCn8KOw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK4wrDDpsKzwr3DpcKMwronLFxuICAgICAgICAgICAgJ8OmwrTCm8OmwrHCn8OlwozCuicsXG4gICAgICAgICAgICAnw6bCs8KJw6bCuMKvw6XCjMK6JyxcbiAgICAgICAgICAgICfDp8KfwrPDp8KLwq7DpcK4woInLFxuICAgICAgICAgICAgJ8OmwpnCi8OmwrHCn8OlwrjCgicsXG4gICAgICAgICAgICAnw6XCjcKXw6XCrsKJw6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKDwqDDpcKuwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrDCuMOmwpjCpcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCrsKJw6bCusKqw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK+wrfDpcKMwpbDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwofCkcOpwpfCqMOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCvMKzw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OoworCl8Olwp/CjsOlwozCuicsXG4gICAgICAgICAgICAnw6nCvsKZw6bClsKHw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcK+wpnDpsK1wrfDpcK4woInLFxuICAgICAgICAgICAgJ8OlwrnCs8OlwpLCjMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCjcKXw6nCncKWw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKvwo/DpcKuwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrzCs8OmwrXCpsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCjcKOw6XCrsKJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wpzDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwpXCv8OmwrPCsMOlwo7CvycsXG4gICAgICAgICAgICAnw6TCusKRw6nCnMKEw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKNwpfDpcK5wrPDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6XCu8K2w6XCucKzw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcK7wrrDp8KTwq/DpcK4woInLFxuICAgICAgICAgICAgJ8OpwoLCtcOmwq3CpsOlwrjCgicsXG4gICAgICAgICAgICAnw6bCrcKmw6XCpMK3w6XCscKxw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcK7wrrDqcKYwrPDpcK4woInLFxuICAgICAgICAgICAgJ8Omwp3CvsOmwrrCqsOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcKJw6bCs8K9w6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKhwrrDpsKYwozDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrXCpsOlwp/CjsOlwo7CvycsXG4gICAgICAgICAgICAnw6bClMK/w6XCksKMw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcK+wpnDpcKywqnDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwpbCsMOnwr3Cl8OlwozCuicsICfDpsK8wrPDpcK5wrPDpcK4woInLCAnw6nClcK/w6bCscKAw6XCjsK/JywgJ8Omwq3CpsOlwrnCs8Olwo7CvycsICfDpMK4worDpsKdwq3DpcKOwr8nLCAnw6bCsMK4w6XCrsKaw6XCjsK/JywgJ8Oowr/CnsOlwp/CjsOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKuwoHDpcK+wrfDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OowpXCicOlwp/CjsOlwozCuicsICfDp8Kmwo/DpcKuwonDpcK4woInLCAnw6fCpsKPw6nCvMKOw6XCuMKCJywgJ8Olwq/Cv8Olwq7CgcOlwo7CvycsICfDqcKcwp7DpsK1wqbDpcKOwr8nLCAnw6bCn8KYw6jCjcKjw6XCjsK/JywgJ8OlwrHCj8Olwo3Cl8Olwo7CvycsICfDpcKPwqTDp8KUwrDDpcKOwr8nLCAnw6XCkcKow6XCrsKBw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwoXCtsOkwrvClicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICfDpsKxwp/DqMKlwr/Dp8KcwoEnLFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCjcKXw6bCmMKMw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OkwrjCnMOmwrnClsOlwozCuicsXG4gICAgICAgICAgICAnw6jCpcK/w6bCucKWw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKdwpLDpMK6wpHDqMKwwrHDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrnCvsOpwofCjMOlwozCuicsXG4gICAgICAgICAgICAnw6nCncKSw6XCscKxw6bCucKWw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKWwrDDpcK7wrrDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwo3Cl8OmwpjCjMOlwo7CvycsXG4gICAgICAgICAgICAnw6jCv8Kbw6jCtMKkw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwonDpMK5wonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwpnCr8Olwr7Ct8OpwpXCh8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6fCj8Kgw6XCscKxw6XCjMK6JywgJ8OmwpjCjMOmwrHCn8OlwozCuicsICfDpMK5wpDDpcK5wrPDpcK4woInLCAnw6bCtcKuw6bCosKBw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OowpDCjcOkwrnCocOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCrsKJw6bCusKQw6XCjMK6JywgJ8OmwrnCmMOkwrjCnMOlwozCuicsICfDqMKOwrLDqMKKwrHDpcKOwr8nLCAnw6TCuMKKw6bCoMKXw6XCjsK/JywgJ8OoworCpsOmwrrCqsOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpMK5wp3DpsKxwp/DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCtcKUw6nCmMKzw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcK6wpDDpcKxwrHDpcKMwronLFxuICAgICAgICAgICAgJ8OnwpHCnsOmwpjCjMOlwrjCgicsXG4gICAgICAgICAgICAnw6TCucKdw6bCscKfw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKYwp/DpcKtwpDDpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwq3CpsOlwq7CgcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCvcKtw6bCs8K9w6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKwwrjDpMK/wq7DpcKOwr8nLFxuICAgICAgICAgICAgJ8Okwr/CrsOmwrDCtMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCucKWw6XCj8Kjw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK+wrfDpcKuwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwoPCvcOmwpjCjMOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bClsKww6TCvcKZw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsK4wp3DpsKwwrTDpcKMwronLCAnw6XCiMKGw6XCrsKcw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwrnCsMOmwr3CrcOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCnMKIw6bCucKWw6XCjMK6JywgJ8OowrTCtcOmwrrCqsOlwrjCgicsICfDpMK9wpnDpsKxwp/DpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6jCtcKjw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OnwqvCoMOowrTCocOlwozCuicsXG4gICAgICAgICAgICAnw6fCkcKew6nCh8KRw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKNwpfDpcK6wrfDpcK4woInLFxuICAgICAgICAgICAgJ8Onwp/Cs8Olwp/CjsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCrsKJw6jCv8Kcw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMK1wqPDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwq7CgcOpwoPCvcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCr8K7w6TCucKMw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrTDpcKbwr3DpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwq7CmsOlwo3Cl8Olwo7CvycsXG4gICAgICAgICAgICAnw6TCuMKKw6fCisK5w6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK6wo7DqcKDwr3DpcKOwr8nLFxuICAgICAgICAgICAgJ8Opwr7CmcOlwo3Cl8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCtMKHw6TCucKJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK/wqHDpMK4wrDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCqMOlwo3Cl8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCpMKnw6TCvcKZw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK8wprDpsKYwozDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwpDCicOlwq7CicOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpcKQwonDpcK3wp7DpcKMwronLFxuICAgICAgICAgICAgJ8Opwp3CksOlwo7Cn8OlwozCuicsXG4gICAgICAgICAgICAnw6TCusKVw6XChsKIw6XCscKxw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKQwonDpcKuwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrDCuMOkwrjCsMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCsMK4w6bClsKww6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKWwrDDpcK5wrLDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrPCsMOlwpLCjMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCs8Khw6bCscKfw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKBwoLDpcK3wp3DpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwq7CicOnwqbCj8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCkMKJw6bCsMK0w6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wofDpcKuwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Olwq7CnMOmwpjCpcOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqMKiwoHDpcK3wp7DpcKMwronLFxuICAgICAgICAgICAgJ8OkwrjCsMOlwp/CjsOlwrjCgicsXG4gICAgICAgICAgICAnw6bCqMKfw6bCoMKRw6XCuMKCJyxcbiAgICAgICAgICAgICfDqcKrwpjDpcKuwonDpcK4woInLFxuICAgICAgICAgICAgJ8OpwpPCnMOpwrzCk8Olwo7CvycsXG4gICAgICAgICAgICAnw6nCncKWw6XCrsKJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwpzDpMK4wrDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwqXCicOmwpbCsMOlwo7CvycsXG4gICAgICAgICAgICAnw6TCuMKHw6jCvcK9w6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4worDqcKrwpjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmworCmsOlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpMK4wrTDpcK3wp3DpcKMwronLFxuICAgICAgICAgICAgJ8Olwo3Cl8OkwrjCsMOlwo7CvycsXG4gICAgICAgICAgICAnw6TCucKQw6XCrsKJw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKHwpHDpsK6wqrDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwo3Cl8Olwp/CjsOlwo7CvycsXG4gICAgICAgICAgICAnw6TCuMKcw6TCucKhw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMK1woTDpsK6wqrDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwq7CnMOpwrvChMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCucK/w6bCmMKMw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcK7wo7DpcK3wp3DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrTCh8OkwrvCgcOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCuMKKw6nCpcK2w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8Okwr/CocOlwrfCnsOlwozCuicsXG4gICAgICAgICAgICAnw6XCvsK3w6XChcK0w6XCuMKCJyxcbiAgICAgICAgICAgICfDpMK4worDqcKlwrbDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrnCv8OkwrjCsMOlwo7CvycsXG4gICAgICAgICAgICAnw6nChMKxw6nCmMKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKpwrrDpsK6wpDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwpPChcOlwrHCscOlwo7CvycsXG4gICAgICAgICAgICAnw6TCvcKZw6XCucKyw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKowqrDpcKzwrDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrzCi8OpwpjCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6fCjsKJw6XCscKxw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wofDpcK5wrTDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwoXCtsOkwrvClicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICfDpcKxwrHDpMK4wpzDp8KcwoEnLFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCtcKOw6XCjcKXw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OlwrjCgsOkwrjCrcOlwozCuicsXG4gICAgICAgICAgICAnw6XCjsKGw6TCuMKLw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKkwqnDpsKhwqXDpcKMwronLFxuICAgICAgICAgICAgJ8OmwqfCkMOowo3Cq8OlwozCuicsXG4gICAgICAgICAgICAnw6XCjsKGw6XCn8KOw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKVwr/DpsK4woXDpcKMwronLFxuICAgICAgICAgICAgJ8OnwqvCoMOkwrjCmMOlwrjCgicsXG4gICAgICAgICAgICAnw6XCucKzw6nCmMK0w6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK1wo7DqcKYwrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwpXChsOmwrLCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCncKSw6XCssKbw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OlwrjCgsOlwo3Cl8OlwozCuicsXG4gICAgICAgICAgICAnw6XCuMKCw6XCjMKXw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKfwo7DqcKYwrPDpcKMwronLFxuICAgICAgICAgICAgJ8OlwpvCm8OmwpbCucOlwozCuicsXG4gICAgICAgICAgICAnw6bCncKOw6bCssKnw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcK7woTDpcKywpvDpcKMwronLFxuICAgICAgICAgICAgJ8OlwrTCgsOlwrHCscOlwozCuicsXG4gICAgICAgICAgICAnw6jCg8K2w6XCjcKXw6XCuMKCJyxcbiAgICAgICAgICAgICfDqMKDwrbDpcK3wp7DpcK4woInLFxuICAgICAgICAgICAgJ8OlwrnCs8OlwrrCpsOlwrjCgicsXG4gICAgICAgICAgICAnw6jCjsKxw6jCpcK/w6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKNwrPDpcKiwqjDpcK4woInLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrfChMOlwo3CmsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCvMKgw6XCusKXw6XCjMK6JywgJ8OkwrjCtMOmwrfChMOlwozCuicsICfDpsK3woTDpcK3wp3DpcKMwronLCAnw6XCjcKaw6XCscKxw6XCjMK6JywgJ8OlwpHCqMOmwp3CkcOlwozCuicsICfDpsKhwpPDpcKPwrDDpcKOwr8nLCAnw6nCq8KYw6nCncKSw6XCjsK/JywgJ8OmwrLCgsOmwrrCkMOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKewqPDpcK6woTDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwrjCgsOkwrjCrcOlwozCuicsICfDpcKxwrHDpMK6wq3DpcKMwronLCAnw6XCs8KEw6XCn8KOw6XCjMK6JywgJ8Olwo/CsMOlwoTCv8OlwrrChMOlwozCuicsICfDqMKWwpvDpcKfwo7DpcKMwronLCAnw6bCu8KVw6XCt8Kew6XCuMKCJywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrjCnMOowpDCpcOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6TCuMKcw6jCkMKlw6XCjMK6JywgJ8OmwrLCs8Olwo/Co8OlwozCuicsICfDpcKewqbDpcKIwqnDpcKOwr8nLCAnw6XCucK/w6nCpcK2w6XCjsK/JywgJ8OlwojCqcOmwrTCpcOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDp8KDwp/DpcKPwrDDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6jCisKdw6fCvcKYw6XCjMK6JyxcbiAgICAgICAgICAgICfDp8Kmwo/DpcKxwrHDpcKMwronLFxuICAgICAgICAgICAgJ8OnwonCn8OlwrnCs8OlwozCuicsXG4gICAgICAgICAgICAnw6jCjsKxw6XCscKxw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcK+wpnDpcKPwqPDpcK4woInLFxuICAgICAgICAgICAgJ8Oowo7CscOpwpjCs8OlwrjCgicsXG4gICAgICAgICAgICAnw6jCjsKxw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKLwpvDqMK/wpzDpcK4woInLFxuICAgICAgICAgICAgJ8OowpPCrMOowo7CscOlwrjCgicsXG4gICAgICAgICAgICAnw6bCoMKWw6nCnMKew6XCuMKCJyxcbiAgICAgICAgICAgICfDpsK1wrfDqcKYwrPDpcK4woInLFxuICAgICAgICAgICAgJ8OpwpXCv8OlwrLCm8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCvcKNw6XCncKKw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8Omwr3CjcOlwp/CjsOlwozCuicsXG4gICAgICAgICAgICAnw6XCr8KSw6TCusKtw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKdworDpcKtwpDDpcKMwronLFxuICAgICAgICAgICAgJ8OlwqXCjsOmwpbCh8OlwozCuicsXG4gICAgICAgICAgICAnw6nCncKSw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICAgICfDqMKvwrjDpcKfwo7DpcK4woInLFxuICAgICAgICAgICAgJ8Olwq/Cv8OlwoXCicOlwrjCgicsXG4gICAgICAgICAgICAnw6XCrsKJw6TCuMKYw6XCuMKCJyxcbiAgICAgICAgICAgICfDqcKrwpjDpcKvwobDpcK4woInLFxuICAgICAgICAgICAgJ8OmwpjCjMOpwoLCkcOlwrjCgicsXG4gICAgICAgICAgICAnw6bCmMKMw6TCucKQw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wrTDpsKcwpDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrXCjsOlwq7CgcOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpcK4woLDpMK4wq3DpcKMwronLFxuICAgICAgICAgICAgJ8OkwrvCu8Olwp/CjsOlwozCuicsXG4gICAgICAgICAgICAnw6bCm8Kyw6nCmMKcw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKFwpbDpcK3wp7DpcK4woInLFxuICAgICAgICAgICAgJ8OpwoLCucOlwp/CjsOlwrjCgicsXG4gICAgICAgICAgICAnw6nCscK8w6XCj8Kww6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKHwpHDpMK5wqHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwpjCicOnwqXCpcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCvsKuw6XCscKxw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKxwrbDpMK4worDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrPCl8OmwrDCtMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCosKBw6XCscKxw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKzwrDDpcKuwonDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwrPCsMOlwrHCscOlwozCuicsICfDpcKywrHDpcKywrPDpcKMwronLCAnw6bClsKww6bCs8Kww6XCuMKCJywgJ8OowoLCpcOlwp/CjsOlwrjCgicsICfDpcKuwoHDqcKYwrPDpcKOwr8nLCAnw6TCuMKcw6XCucKzw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwqjCgcOmwrXCt8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6fCjsKvw6fCv8Kgw6XCjMK6JywgJ8OkwrnCs8OlwrHCscOlwrjCgicsICfDpsKWwofDp8KZwrvDpcK4woInLCAnw6jCjcKjw6bCiMKQw6XCuMKCJywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwpfCpcOnwoXCp8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6TCuMKcw6bCuMKvw6XCjMK6JywgJ8OlwrLCmsOlwrHCscOlwozCuicsICfDpMK6wpTDqMKOwrLDpcKOwr8nLCAnw6jCjsKSw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Oowo7CscOoworCnMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6jCjsKxw6XCn8KOw6XCjMK6JywgJ8OpwpLCosOlwp/CjsOlwozCuicsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpMK4wrTDpsKywoLDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6XChcKww6XCscKxw6XCjMK6JyxcbiAgICAgICAgICAgICfDp8K9wpfDpcK6woTDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrLCs8OkwrjCnMOlwozCuicsXG4gICAgICAgICAgICAnw6bCssKCw6XCjcKXw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKDwq/DpcKfwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrLCgsOmwrDCtMOlwo7CvycsXG4gICAgICAgICAgICAnw6jCi8KNw6XCscKxw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMK0wrnDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrnCs8OpwoLCkcOlwo7CvycsXG4gICAgICAgICAgICAnw6jCjsKSw6XCjcKXw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKSwpnDqcKYwrTDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrjCtMOmwrLCrcOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCvsK3w6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8Olwr7Ct8Olwp/CjsOlwozCuicsXG4gICAgICAgICAgICAnw6TCucKQw6nCmcK1w6XCuMKCJyxcbiAgICAgICAgICAgICfDp8KmwrnDpcKfwo7DpcK4woInLFxuICAgICAgICAgICAgJ8OpwpnCtcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCrsKBw6bCtMKlw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcK9wpDDpsKywrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwq3CpsOlwp/CjsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCusKGw6TCusKRw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK5wrPDpcKOwp/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwqTCj8OmwrTCpcOlwo7CvycsXG4gICAgICAgICAgICAnw6TCuMK0w6nCgsKRw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqMKBworDpcKfwo7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OkwrjCnMOmwpjCjMOlwrrCnMOlwozCuicsICfDpMK4wrTDpsK4woXDpcK4woInLCAnw6nCq8KYw6XClMKQw6XCjsK/JywgJ8OpwpjCs8OowrDCt8Olwo7CvycsICfDqMKMwozDpcK5wrPDpcKOwr8nLCAnw6jCjsKYw6XCjsK/JywgJ8OkwrjCnMOpwpjCv8Olwo7CvycsICfDpcKGwqDDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCu8Kow6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsK7wqjDpcKfwo7DpcKMwronLCAnw6nCgsK5w6XCucKzw6XCjsK/JywgJ8OmwrLCvsOlwozClsOlwo7CvycsICfDpsKDwqDDpsKwwpHDpcKOwr8nLCAnw6XCjcKaw6XChcK0w6XCjsK/JywgJ8OpwpjCs8Okwr/CocOlwo7CvycsICfDpsKXwqDDpsKjwqPDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6jCj8KPw6bCs8K9w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDp8KJwqHDpMK4wrnDpcKMwronLCAnw6nChMKEw6XCn8KOw6XCjsK/JywgJ8Olwo3ClcOlwo7CvycsICfDqcKDwpPDpcKfwo7DpcKOwr8nLCAnw6bCm8K5w6XCjsK/JywgJ8Olwq7CmsOpwpnCtsOlwo7CvycsICfDpcK3wqjDqcKHwo7DpcKOwr8nLCAnw6TCuMKcw6bCmMKOw6XCjsK/JywgJ8OmwojCkMOmwq3CpsOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKFwrbDpMK7wpYnLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6bCssKzw6XCjcKXw6fCnMKBJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwoPCkcOlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpMK4wq3DpcKOwp/DpcKMwronLFxuICAgICAgICAgICAgJ8OpwofCkcOmwrDCtMOlwozCuicsXG4gICAgICAgICAgICAnw6TCusKMw6TCuMKDw6XCjMK6JyxcbiAgICAgICAgICAgICfDp8KuwqHDpcKfwo7DpcKbwp7DpsKXwo/DpcKMwronLFxuICAgICAgICAgICAgJ8OkwrjCisOowqHCl8OlwozCuicsXG4gICAgICAgICAgICAnw6bCg8Kgw6bCtcKOw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcK3wqnDpMK5wonDpcK4woInLFxuICAgICAgICAgICAgJ8OmwpbCsMOpwoPCkcOlwrjCgicsXG4gICAgICAgICAgICAnw6bClsKww6XCr8KGw6XCuMKCJyxcbiAgICAgICAgICAgICfDp8KZwrvDpcKwwoHDpcK4woInLFxuICAgICAgICAgICAgJ8Oowo3CpcOpwpjCs8OlwrjCgicsXG4gICAgICAgICAgICAnw6TCuMKtw6fCicKfw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcK8woDDpcKwwoHDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6nCvMKTw6bCpcK8w6XCjMK6JyxcbiAgICAgICAgICAgICfDqcK+wpnDpMK6wq3DpcKMwronLFxuICAgICAgICAgICAgJ8OpwqHCusOmwrLCs8OlwpvCnsOmwpfCj8OlwozCuicsXG4gICAgICAgICAgICAnw6fCpsK5w6fCjsKLw6XCj8Kww6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKHwpHDpsKYwo7DpcKMwronLFxuICAgICAgICAgICAgJ8OlwrzCgMOlwrDCgcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCsMKJw6bCsMKPw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrDDqMKAwoPDpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwp3CnsOlwo7CvycsXG4gICAgICAgICAgICAnw6nCgMKaw6jCrsK4w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsK0wpvDqcKYwrPDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6jCpcK/w6XCt8Klw6XCjMK6JyxcbiAgICAgICAgICAgICfDqMKAwoHDpcKfwo7DpcKMwronLFxuICAgICAgICAgICAgJ8OmwrbCp8OowqXCv8OlwozCuicsXG4gICAgICAgICAgICAnw6fCgMKNw6bCssKzw6XCm8Kew6bCl8KPw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsK0wpvDqcK+wpnDpcKMwronLFxuICAgICAgICAgICAgJ8OlwpDCicOlwojCqcOlwozCuicsXG4gICAgICAgICAgICAnw6XCgcKDw6XCuMKIw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKtwp/DpsK0wqXDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrHCncOpwpjCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6TCvMKKw6XCt8Kdw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK0wpvDpcKuwoHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrXCqcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCrsKcw6nCmMKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKWwrDDpcKuwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwqDCvsOlwrfCncOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCucKzw6nCocK2w6XCscKxw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OmwpbCsMOlwo3CjsOlwozCuicsXG4gICAgICAgICAgICAnw6XCjcKrw6TCuMKcw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsK5wpvDpsKywrPDpcKMwronLFxuICAgICAgICAgICAgJ8Onwp/Cs8Opwr7CmcOlwozCuicsXG4gICAgICAgICAgICAnw6bCscKdw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICAgICfDqMKIwp7DqcKSwqLDpcK4woInLFxuICAgICAgICAgICAgJ8Olwq7CncOkwrjCsMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCj8K2w6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKDwo/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwrLCgcOlwrHCscOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCrsKJw6nCmMKzw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKMwpfDpcKFwrPDpcKMwronLCAnw6bClsKHw6XCs8Kww6XCjMK6JywgJ8Omwq7Ct8OpwoPCvcOlwozCuicsICfDqcK+wpnDpcKuwonDpcKMwronLCAnw6bCnsKXw6XCt8Kew6XCuMKCJywgJ8Olwq7CicOpwpjCs8Olwo7CvycsICfDpsK7wpHDpcKOwr8nLCAnw6XChsKFw6nCu8KEw6XCjsK/JywgJ8OmwrHCpMOpwpjCtMOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcK5wqTDpcKjwoHDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwrfCh8OmwrvCqMOlwozCuicsICfDpcKxwrHDpcKfwo7DpcKMwronLCAnw6nCucKkw6XCscKxw6XCjMK6JywgJ8OmwrXCmsOlwo7CvycsICfDpsK3wofDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bClsKww6TCucKhw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8Olwo3Cq8OmwrvCqMOlwozCuicsXG4gICAgICAgICAgICAnw6fCusKiw6bCl8KXw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKHwqTDpsKzwonDpcKMwronLFxuICAgICAgICAgICAgJ8OnwonCp8OpwofCjsOlwozCuicsXG4gICAgICAgICAgICAnw6XCjcKrw6jCvsKJw6XCuMKCJyxcbiAgICAgICAgICAgICfDqMK+wonDpcKOwr/DpcK4woInLFxuICAgICAgICAgICAgJ8OmwpbCsMOkwrnCocOlwo7CvycsXG4gICAgICAgICAgICAnw6jCjsK3w6XCmMKJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKOwp/DqcKYwrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwpXCv8Olwp7Co8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCsMKBw6TCuMKYw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK7wrbDpsK0wqXDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OnwoTCpsOkwr3CnMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqMKnwqPDpsKUwr7DpcKMwronLFxuICAgICAgICAgICAgJ8OkwrjCrcOnwqvCmcOlwozCuicsXG4gICAgICAgICAgICAnw6nCqcKsw6bCncKRw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKxwrHDqcKYwrPDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrLCgcOpwpjCs8OlwrjCgicsXG4gICAgICAgICAgICAnw6XCrcKfw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICAgICfDpMK/wq7DpsKtwqbDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrjCqcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCrcKmw6nCmcKfw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKNwprDp8KIwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Omwr/CrsOpwpjCs8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCjcKOw6nCvsKZw6XCjMK6JywgJ8Omwr/CrsOpwpjCs8Olwo7CvycsICfDpcKNwpfDpMK5wpDDpcKOwr8nLCAnw6XCj8Kww6XCicKNw6XCjsK/JywgJ8OmwrjChcOkwrjCsMOlwo7CvycsICfDqMKMwoPDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6jCrsK4w6bCmMKMw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqcKtwo/DqcKDwr3DpcKMwronLCAnw6fCpsK5w6XCt8Kew6XCuMKCJywgJ8OpwpXCv8OowpHCm8OlwrjCgicsICfDqMKuwrjDpsKYwozDpcKOwr8nLCAnw6nChMKiw6nCmcK1w6XCjsK/JywgJ8OowqXChMOlwp/CjsOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsK8wq/DpsKywrPDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwrrCkMOmwrHCh8OlwozCuicsICfDqcKDwr7DpcKfwo7DpcKMwronLCAnw6XCj8Ksw6nCmcK1w6XCjMK6JywgJ8OkwrjCtMOpwqLCjcOlwo7CvycsICfDqMKIwp7DqcKYwrPDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCuMKJw6nCl8Kow6XCs8Khw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsK5wpbDpsK7wqjDpcKMwronLCAnw6TCucKJw6nCqcKsw6XCuMKCJywgJ8OnwoHCtcOlwq7CncOlwrjCgicsICfDpsK4wpHDpsKxwqDDpcKOwr8nLCAnw6XCjcKiw6bCsMKPw6XCjsK/JywgJ8OpwpnClcOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKNwpfDqcKYwrPDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6XCjcKnw6nCvsKZw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKuwpvDpcKfwo7DpcKMwronLFxuICAgICAgICAgICAgJ8OpwoLCk8OlwrfCnsOlwrjCgicsXG4gICAgICAgICAgICAnw6bCocKQw6bCn8KPw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKWwrnDpcKfwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrfChcOlwrfCncOlwo7CvycsXG4gICAgICAgICAgICAnw6nClcKHw6XCucKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKUwpDDpsKywrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwo3Cl8Olwo/CrMOlwo7CvycsXG4gICAgICAgICAgICAnw6XChsKFw6TCucKhw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKWwrDDqcKHwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwqTCvsOmwpfCl8Olwo7CvycsXG4gICAgICAgICAgICAnw6jCpcK/w6XCs8Khw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKVwobDpMK4wpjDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwqLCgcOlwpvCrcOlwozCuicsICfDp8KdwqLDqcKYwrPDpcKMwronLCAnw6bCsMK4w6XCn8KOw6XCuMKCJywgJ8Olwq7CgcOpwpnCtcOlwo7CvycsICfDqMKZwp7DpcKfwo7DpcKOwr8nLCAnw6bCsMKRw6bCncKDw6XCjsK/JywgJ8OlwqTCj8OpwoLCkcOlwo7CvycsICfDpsKfwpjDpcKfwo7DpcKOwr8nLCAnw6fCncKiw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Okwr/CocOpwpjCs8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpsK1wonDpsKywrPDpcKMwronLFxuICAgICAgICAgICAgJ8OlwrnCs8OmwqHCpcOlwozCuicsXG4gICAgICAgICAgICAnw6bCvcKiw6XCt8Kdw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK3wq7DpsK7wqjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwoHCr8Olwo7CvycsXG4gICAgICAgICAgICAnw6bClsKww6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKVwobDpcKfwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwpvCusOlwqfCi8Olwo7CvycsXG4gICAgICAgICAgICAnw6fCvcKXw6XCscKxw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwonDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwpHCqMOlwo/Co8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpcK3wp3DpsKxwofDpcKMwronLFxuICAgICAgICAgICAgJ8OpwqHCucOlwp/CjsOlwrjCgicsXG4gICAgICAgICAgICAnw6XClcKGw6bCsMK0w6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK3wq7DqcKYwrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwqTCqsOlwrrCt8Olwo7CvycsXG4gICAgICAgICAgICAnw6nCucK/w6nCgsKRw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKlwr/DpcKNwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwonCtsOmwrLCn8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCssKIw6TCuMKYw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKDwrjDpcKfwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwqnCu8OpwqnCrMOlwrrCl8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqcKpwr/DpcKfwo7DpcKMwronLFxuICAgICAgICAgICAgJ8OnwqHCrsOlwrHCscOlwo7CvycsXG4gICAgICAgICAgICAnw6bClsKww6jClMKhw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4worDqMKUwqHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OowqXCv8OlwrnCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCs8KMw6nCmMKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK5wrPDqMKIwobDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrHCncOlwo3Cl8Olwo7CvycsXG4gICAgICAgICAgICAnw6nCgcKCw6XCucKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKtwqPDqcKYwrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OnwoTCpsOkwr3CnMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCtcKOw6bCusKQw6XCuMKCJywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwoXCtsOkwrvClicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICfDpsK5wpbDpcKMwpfDp8KcwoEnLFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCrcKmw6bCscKJw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OmwrHCn8OlwrLCuMOlwozCuicsXG4gICAgICAgICAgICAnw6bCrcKmw6bCmMKMw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKxwp/DpsKxwonDpcKMwronLFxuICAgICAgICAgICAgJ8OnwqHCmsOlwo/Co8OlwozCuicsXG4gICAgICAgICAgICAnw6bCscKJw6nCmMKzw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKdwpLDpcKxwrHDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrTCqsOlwrHCscOlwozCuicsXG4gICAgICAgICAgICAnw6TCuMKcw6jCpcK/w6bCucKWw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKxwonDpcKNwpfDpcKMwronLFxuICAgICAgICAgICAgJ8OowpTCocOnwpTCuMOlwozCuicsXG4gICAgICAgICAgICAnw6bCscKfw6XCpMKPw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcK7woTDqcKZwoLDpcKMwronLFxuICAgICAgICAgICAgJ8OmwpbCsMOmwrTCssOlwozCuicsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCu8KEw6fCn8Kzw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqcK7woTDp8KfwrPDpsK4wq/DpcKMwronLCAnw6jCpcK/w6XCocKew6XCscKxw6XCjMK6JywgJ8OkwrjCi8OpwpnChsOlwozCuicsICfDqcKTwoHDpcKxwrHDpcKMwronLCAnw6XCpMKnw6XChsK2w6XCuMKCJywgJ8OpwpjCs8OmwpbCsMOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKNwoHDpcKgwrDDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwrzCoMOmwrnCvsOlwozCuicsICfDqMKMwoXDp8Kuwq3DpcKMwronLCAnw6TCuMK5w6bCscKfw6XCj8Kjw6XCuMKCJywgJ8OpwoPCp8Olwo7CvycsICfDp8KrwrnDpcKxwrHDpcKOwr8nLCAnw6bCiMK/w6XCjsK/JywgJ8OpwoPCp8OowqXCv8Olwo7CvycsICfDp8KrwrnDpsK6wqrDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6jCjcKGw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsKywpnDpcK4woLDpcKMwronLCAnw6jCjcKGw6XCt8Kew6XCjMK6JywgJ8OmwrTCqsOmwrnClsOlwrjCgicsICfDp8KfwrPDqcKmwpbDpcK4woInLCAnw6bCncK+w6bCu8KLw6XCuMKCJywgJ8OnwpvCkcOlwojCqcOlwo7CvycsICfDpcKFwqzDpcKuwonDpcKOwr8nLCAnw6bCscKfw6nCmcK1w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Olwq7CnMOmwpjCjMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqMKlwr/DqcKZwrXDpcKMwronLFxuICAgICAgICAgICAgJ8OkwrzCjcOlwq7CtsOlwrLCl8OlwozCuicsXG4gICAgICAgICAgICAnw6fCgsK5w6XChsKbw6XCjMK6JyxcbiAgICAgICAgICAgICfDp8KMwofDpMK6wq3DpcKMwronLFxuICAgICAgICAgICAgJ8OlwqTCt8OpwpnCtcOlwozCuicsXG4gICAgICAgICAgICAnw6XCrsKcw6nCg8K9w6XCuMKCJyxcbiAgICAgICAgICAgICfDpcK9wpPDqcKYwrPDpcK4woInLFxuICAgICAgICAgICAgJ8Omwp7CncOmwrHCn8OlwrjCgicsXG4gICAgICAgICAgICAnw6fCp8Ktw6XCvcKSw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMK/wpzDpcKuwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtMOlwrHCscOlwo7CvycsXG4gICAgICAgICAgICAnw6TCusKUw6XCs8Kww6XCnMKfw6XCrsK2w6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKVwr/DqcKYwrPDpcKcwp/DpcKuwrbDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OowqXChMOmwqjCisOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6jCpcKEw6XCn8KOw6XCjMK6JywgJ8OmwqjCisOlwp/CjsOlwozCuicsICfDqMKlwoTDqcKYwrPDpcKMwronLCAnw6jCgMKBw6bCssKzw6XCj8Kjw6XCuMKCJywgJ8Omwp7Co8OpwpjCs8OlwrjCgicsICfDpcKuwpzDpcKfwo7DpcK4woInLCAnw6XCjcKXw6bCvMKzw6XCjsK/JywgJ8OowrDCt8Olwp/CjsOlwo7CvycsICfDpMK/wp3DpcK6wrfDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nChMKCw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqcKEwoLDpcKfwo7DpcKMwronLCAnw6XCjcKOw6XCrsK5w6XCjMK6JywgJ8OmwqLCgcOlwq3CkMOmwrnClsOlwozCuicsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqMKNwobDqcKXwqjDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OkwrjCnMOlwq7CncOlwozCuicsICfDpsKOwofDpcKIwoDDpcKMwronLCAnw6nCksKfw6fCpcKlw6XCuMKCJywgJ8OkwrrCrMOlwrHCscOlwo7CvycsICfDpsKywpnDpsK0wovDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCrcKdw6bChMKfw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKtwp3DpcKNwpfDpcKMwronLCAnw6XCusKUw6XCn8KOw6XCuMKCJywgJ8Olwq7CicOpwpnChsOlwrjCgicsICfDpsKxwonDpcK3wp3DpcK4woInLCAnw6TCusKRw6bCosKmw6XCjsK/JywgJ8OlwqTCp8OmwoLCn8Olwo7CvycsICfDpcKtwp3DpsKYwozDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCu8KEw6XChsKIw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OpwrvChMOlwrfCnsOlwozCuicsXG4gICAgICAgICAgICAnw6nCusK7w6XCn8KOw6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKtwqbDp8KpwrTDpcK4woInLFxuICAgICAgICAgICAgJ8OnwrrCosOlwq7CicOlwo7CvycsXG4gICAgICAgICAgICAnw6fCvcKXw6fClMKww6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK1wqDDpsKwwrTDpcKOwr8nLFxuICAgICAgICAgICAgJ8OowpXCssOmwpjCpcOlwo7CvycsXG4gICAgICAgICAgICAnw6nCu8KEw6bCosKFw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKLwrHDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwpvCosOpwqPCjsOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCksK4w6XCrsKBw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKSwrjDpcKuwonDpcKMwronLCAnw6jCtcKkw6XCo8KBw6XCuMKCJywgJ8OlwpjCicOpwrHCvMOlwo7CvycsICfDqcKAwprDpcKxwrHDpcKOwr8nLCAnw6XCtMKHw6nCmMKzw6XCjsK/JywgJ8OpwoDCmsOlwp/CjsOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKawo/DpcK3wp7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwpvCvsOpwoPCvcOlwozCuicsICfDpcK5wr/DpsKwwrTDpcK4woInLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCgcKpw6bClsK9w6XCnMKfw6XCrsK2w6bCl8KPw6jCi8KXw6bCl8KPw6jCh8Kqw6bCssK7w6XCt8KeJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsKBwqnDpsKWwr3DpcK4woInLCAnw6XCiMKpw6XCt8Kdw6XCuMKCJywgJ8OlwrvCusOlwqfCi8Olwo7CvycsICfDpsKdwqXDpcKHwqTDpcKOwr8nLCAnw6XCt8K0w6TCuMKcw6XCjsK/JywgJ8OpwrnCpMOlwrPCsMOlwo7CvycsICfDpcKuwqPDpsKBwqnDpcKOwr8nLCAnw6XCksK4w6TCuMKww6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrvCmcOmwqHCg8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6TCu8KZw6bCocKDJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCpMKpw6nCl8Kow6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKkwqnDqcKXwqgnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsK9wpzDpsKxwp/DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8Omwr3CnMOmwrHCnyddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OnwqXCnsOlwobCnMOmwp7CtsOmwp7Cl8OlwozCuicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6fCpcKew6XChsKcw6bCnsK2w6bCnsKXw6XCjMK6J11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XChcK2w6TCu8KWJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ8OmwrnClsOlwo3Cl8OnwpzCgScsXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKVwr/DpsKywpnDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwrLCs8OpwrrCk8OlwozCuicsICfDqMKKwpnDqMKTwonDpcKMwronLCAnw6XCpMKpw6XCv8KDw6XCjMK6JywgJ8OlwrzCgMOnwqbCj8OlwozCuicsICfDqcKbwqjDqMKKwrHDpcKMwronLCAnw6bCtcKPw6nCmMKzw6XCuMKCJywgJ8OpwpXCv8OmwrLCmcOlwo7CvycsICfDpsKcwpvDpcKfwo7DpcKOwr8nLCAnw6XCrsKBw6TCucKhw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwqDCqsOmwrTCssOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCpMKpw6XChcKDw6XCjMK6JywgJ8Oowo3Ct8OlwqHCmMOlwozCuicsICfDqMKKwqbDpsK3wp7DpcKMwronLCAnw6fCn8Kzw6XCs8Kww6XCjMK6JywgJ8OpwobCtMOpwpnCtcOlwrjCgicsICfDpsKgwqrDpsK0wrLDpcKOwr8nLCAnw6fCgsKOw6nCmcK1w6XCjsK/JywgJ8OowozCtsOpwpnCtcOlwo7CvycsICfDpsKUwrjDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCucKYw6bCvcKtw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKywrPDpcKhwpjDpcKMwronLCAnw6nCm8Kow6bCucKWw6XCjMK6JywgJ8OmwrnCmMOkwrnCocOlwrjCgicsICfDqcKfwrbDpcKxwrHDpcK4woInLCAnw6bCucKYw6bCvcKtw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OowqHCocOpwpjCs8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqcKbwoHDpcKzwrDDpcKMwronLFxuICAgICAgICAgICAgJ8Onwo/CoMOmwpnClsOlwozCuicsXG4gICAgICAgICAgICAnw6fCn8Kzw6nCvMKTw6XCjMK6JyxcbiAgICAgICAgICAgICfDqMKSwrjDpsK5wpjDpcKMwronLFxuICAgICAgICAgICAgJ8Olwo3Cl8OlwrLCs8OlwozCuicsXG4gICAgICAgICAgICAnw6jCgMKSw6nCmMKzw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcK4wrjDpcKuwoHDpcK4woInLFxuICAgICAgICAgICAgJ8OowqHCocOpwpjCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6jCocKhw6TCuMKcw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKhwqHDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OowqHCocOlwo3Cl8Olwo7CvycsXG4gICAgICAgICAgICAnw6fCpcKBw6TCuMKcw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKCwrXDqcKYwrPDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6XCj8KMw6bCuMKFw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKkwqfDp8KlwqXDpcKMwronLFxuICAgICAgICAgICAgJ8OlwozCl8OlwqHClMOlwozCuicsXG4gICAgICAgICAgICAnw6bCrcKmw6XChsKIw6XCuMKCJyxcbiAgICAgICAgICAgICfDqcKCwrXDpMK4wpzDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrTCnsOlwo/Co8Olwo7CvycsXG4gICAgICAgICAgICAnw6bClsKww6nCgsK1w6XCjsK/JyxcbiAgICAgICAgICAgICfDp8K7wqXDpcKuwoHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwpbCsMOlwq7CgcOlwo7CvycsXG4gICAgICAgICAgICAnw6nCgsK1w6nCmMKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKawobDpcKbwp7DpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwp/CjsOmwq3CpcOowovCl8OmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCssKzw6nCmMKzw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKywrPDqcKYwrPDpsKlwrzDpcKMwronLCAnw6TCusKRw6bCusKqw6XCjMK6JywgJ8OlwpDCm8OlwrHCscOlwozCuicsICfDpMK4wrTDpsK5wpjDpcK4woInLCAnw6bCscKow6fCvcKXw6XCuMKCJywgJ8OlwrLCs8OpwpjCs8Olwo7CvycsICfDpsK5wpjDqcKYwrTDpcKOwr8nLCAnw6XCucKzw6bCscKfw6XCjsK/JywgJ8Olwo3CjsOlwq7CucOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcK4wrjDpcK+wrfDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8Omwq3CpsOpwpnCtcOlwozCuicsICfDqcK8wo7DpcKfwo7DpcKMwronLCAnw6bCtMKlw6XCuMKCw6XCuMKCJywgJ8Omwr7Cp8Olwo7CvycsICfDpMK4wrTDpsK+wqfDpcKOwr8nLCAnw6bCocKDw6bCusKQw6XCjsK/JywgJ8OmwrHCicOlwq/Cv8Olwo7CvycsICfDpcKuwonDpMK5wqHDpcKOwr8nLCAnw6fCn8Kzw6nCl8Kow6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwrzCoMOlwq7CtsOnwpXCjMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCsMK4w6XCrsKaw6XCjMK6JywgJ8Omwq3CpsOpwpnCtcOmwrrCkMOlwozCuicsICfDpsKFwojDpcKIwqnDpcKOwr8nLCAnw6bCocKRw6bCpMKNw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OnwpvCisOpwpjCs8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6jCtcKrw6XCscKxw6XCjMK6JywgJ8OowrXChMOpwpjCs8OlwozCuicsICfDpsKywoXDpsKxwp/DpcK4woInLCAnw6bCocKDw6bCscKfw6XCjsK/JywgJ8Olwo3Cl8Olwo7CvycsICfDpcKuwonDpcKMwpbDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCg8K0w6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OlwozCl8OmwrnClsOlwozCuicsXG4gICAgICAgICAgICAnw6jCi8KPw6TCu8KZw6XCjMK6JyxcbiAgICAgICAgICAgICfDqMK1woTDpcKFwrTDpcK4woInLFxuICAgICAgICAgICAgJ8Olwq7CnMOnwqvCoMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCscKdw6XCn8KOw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwonDpMK7woHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwpjCicOnwqbCvsOlwo7CvycsXG4gICAgICAgICAgICAnw6TCuMK0w6bCrcKmw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKhwoLDpMK4wpzDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrDCuMOlwoXCtMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCocKCw6nCmMKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKwwrjDpcK3wp7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6XChsK3w6bCsMK0w6bCu8Kpw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKbwrbDqcKZwrXDpcKMwronLFxuICAgICAgICAgICAgJ8OnwqXCgcOpwpjCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6jCk8Kdw6XCscKxw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwoHDqMK/wpzDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwpbCsMOnwpTCsMOlwo7CvycsXG4gICAgICAgICAgICAnw6TCuMKcw6XCrsKJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKxwp/DpsKwwrjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwoHCk8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCj8KMw6fCicKMw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKxwp/DpcKNwo7Dp8KRwrbDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwoDCgMOlwozClsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqcK5wqTDpcKfwo7DpcKMwronLFxuICAgICAgICAgICAgJ8OmwrTCqsOmwrHCn8OlwrjCgicsXG4gICAgICAgICAgICAnw6TCvMKaw6XCkMKMw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKywoXDqcKZwrXDpcKOwr8nLFxuICAgICAgICAgICAgJ8Oowr7CsMOmwrrCqsOlwo7CvycsXG4gICAgICAgICAgICAnw6bCusKGw6bCtcKmw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wq3DpsKWwrnDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwpbCsMOmwpnCg8Okwr7Cl8OmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6jCisK3w6bCscKfw6TCvsKXw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKAwprDqcKBwpPDpMK+wpfDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8Opwp3ClsOlwrfCnsOowovCl8OmwpfCj8Okwr7Cl8OmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6nCusK7w6nCmMKzw6jCi8KXw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKowoTDpcK6wpXDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwqjChMOmwpjCn8OlwozCuicsICfDpcKGwrfDpsKwwrTDpsKxwp/DpcK4woInLCAnw6bCtsKfw6bCusKQw6XCuMKCJywgJ8OmwpbCsMOlwozClsOlwo7CvycsICfDpcKPwozDpcKzwrDDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCucKYw6jCpcK/w6XCnMKfw6XCrsK2w6bCl8KPw6jCi8KXw6bCl8KPw6jCh8Kqw6bCssK7w6XCt8KeJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKQwonDqcKmwpbDpcK4woInLCAnw6XCj8Kkw6TCuMKIw6XCjsK/JywgJ8Opwr7CmcOlwrHCscOlwo7CvycsICfDpsKwwrjDqcKhwrrDpcKOwr8nLCAnw6XCh8Kkw6XCh8Kww6XCjsK/JywgJ8OmwrPCuMOmwrrCqsOlwo7CvycsICfDpMK/wp3DqcKdwpbDpcKOwr8nLCAnw6jCisKxw6XCnsKjw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwoXCtsOkwrvClicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICfDpcK5wr/DpMK4wpzDp8KcwoEnLFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCucK/w6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OowrbCisOnwqfCgMOlwozCuicsXG4gICAgICAgICAgICAnw6jCjcKUw6bCucK+w6XCjMK6JyxcbiAgICAgICAgICAgICfDpsK1wrfDp8KPwqDDpcKMwronLFxuICAgICAgICAgICAgJ8OlwqTCqcOmwrLCs8OlwozCuicsXG4gICAgICAgICAgICAnw6fCmcK9w6TCusKRw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcK7woTDpcKfwpTDpcKMwronLFxuICAgICAgICAgICAgJ8OnwpXCqsOnwqbCusOlwozCuicsXG4gICAgICAgICAgICAnw6jCisKxw6nCg8K9w6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKNwpfDpsKywpnDpcKMwronLFxuICAgICAgICAgICAgJ8OowpDCncOlwrLCl8OlwozCuicsXG4gICAgICAgICAgICAnw6XCosKew6XCn8KOw6XCuMKCJyxcbiAgICAgICAgICAgICfDpMK7wo7DpcKMwpbDpcK4woInLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrfCscOlwpzCs8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6fCpsKPw6fClMKww6XCjMK6JywgJ8Onwr3Cl8OmwrnClsOlwozCuicsICfDpcKNwpfDpcKxwrHDpcKMwronLCAnw6XCrsKdw6XCrsKJw6XCjMK6JywgJ8Opwr7CmcOlwrLCl8OlwozCuicsICfDp8KbwpDDp8KUwrDDpcKMwronLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCuMKcw6jCjsKew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqMKOwp7DpcKfwo4nLCAnw6XCuMK4w6XCucKzJywgJ8OlwqHCmMOlwo7CpicsICfDpcKhwpjDpcKOwqYnLCAnw6XCocKYw6XCjsKmJywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrjCrcOlwrHCscOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6TCuMKtw6XCscKxJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCvcKuw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsK5wpjDpsKhwqXDpcKMwronLCAnw6bCvcKuw6XCrsKJw6XCjsK/JywgJ8OpwqXCtsOlwrnCs8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKPwq3DqcKYwrPDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwqbClcOlwp/CjsOlwozCuicsICfDpsKPwq3DpMK4wpzDpcKOwr8nLCAnw6bCj8Ktw6jCpcK/w6XCjsK/JywgJ8OmwoPCoMOmwp3CpcOlwo7CvycsICfDpsKZwq7DpcKuwoHDpcK4woInLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCusKRw6bCtcKuw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpMK6wpHDpcKfwo7DpcKMwronLCAnw6bClsKww6XChcK0w6XCjsK/JywgJ8OpwoPCgcOlwo3Cl8Olwo7CvycsICfDpMK6wpHDpcKuwonDpcKOwr8nLCAnw6fCvcKXw6XCrsKaw6XCuMKCJywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Onwo/CoMOmwrXCt8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6nCpsKZw6bCtMKyw6XCjMK6JywgJ8OmwpbCl8OpwpfCqMOlwozCuicsICfDqcKHwpHDpsK5wr7DpcKMwronLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCscKVw6XCpMK0w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqcKHwpHDpcK5wrPDpcKMwronLCAnw6bCv8Kgw6bCscKfw6XCjMK6JywgJ8Opwr7CmcOmwrnClsOlwozCuicsICfDpsK9wq7DqcKYwrPDpcKMwronLCAnw6bCvcKuw6XCjcKXw6XCjMK6JywgJ8Omwr7ChMOmwrXCt8OlwozCuicsICfDpcKNwpfDpsK+wrPDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCn8K2w6XChcKzw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OmwrXCiMOmwrHCn8OlwozCuicsXG4gICAgICAgICAgICAnw6bCrcKmw6bCscKfw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKbwrLDpsKxwp/DpcKMwronLFxuICAgICAgICAgICAgJ8OkwrnCkMOmwpjCjMOlwrjCgicsXG4gICAgICAgICAgICAnw6XCjcKXw6nCm8KEw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKnwovDpcKFwrTDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrvCgcOlwozClsOlwo7CvycsXG4gICAgICAgICAgICAnw6fCv8KBw6bCusKQw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKWwrDDpMK4wrDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrnCs8OmwrrCkMOnwpHCtsOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCvcKbw6XCscKxw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDp8KmwoXDpcKfwo7DpcKMwronLCAnw6XCjcKXw6bCtcK3w6XCjMK6JywgJ8OpwqHCusOlwr7Ct8OlwozCuicsICfDpMK4wonDpsKwwrTDpcKMwronLCAnw6nCq8KYw6bCmMKOw6XCjMK6JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrHCn8OpwpfCqMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6jCk8Ksw6bCscKfw6XCjMK6JywgJ8OmwrHCn8OmwrXCt8OlwozCuicsICfDpsKWwrDDpMK8wprDpcKMwronLCAnw6bCgcKpw6XCucKzw6XCuMKCJywgJ8Olwo/CsMOlwrHCscOlwrjCgicsICfDpcK8woDDpcK5wrPDpcK4woInLCAnw6nCucKkw6XCscKxw6XCuMKCJywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrnCm8OmwrHCn8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6jCtcKkw6XCncKOw6XCjMK6JywgJ8OpwpzCnsOlwrHCscOlwozCuicsICfDpcKdwqHDpcKkwrTDpcKMwronLCAnw6nCusK7w6fCq8Kgw6XCjMK6JywgJ8OlwpDCtMOlwrfCncOlwrjCgicsICfDpcK7wonDpsKxwp/DpcK4woInLCAnw6nCm8K3w6XCt8Kew6XCuMKCJywgJ8OpwoHCgsOmwrrCqsOlwo7CvycsICfDpcK+wpDDqcKXwrvDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6jCjMKCw6XCkMKNw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqMKMwoLDpcKNwpfDpcKMwronLCAnw6jCjMKCw6bCuMKvw6XCjMK6JywgJ8OlwozClsOlwrfCnsOlwrjCgicsICfDpMK/wqHDpcKuwpzDpcK4woInLCAnw6nCq8KYw6XCt8Kew6XCuMKCJywgJ8OnwpTCtcOnwpnCvcOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqMKCwofDpcK6wobDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OnwqvCr8OlwrfCnsOlwozCuicsICfDqcK8wo7DpsK5wpbDpcKMwronLCAnw6nCq8KYw6jCpsKBw6XCuMKCJywgJ8OlwpvCm8OkwrzCmsOlwrjCgicsICfDpcK5wr/DpcKuwoHDpcKOwr8nLCAnw6bCgMKAw6nCm8KGw6XCjsK/JywgJ8OlwrDCgcOlwrzCgMOlwo7CvycsICfDpcK+wrfDpcK6wobDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCg8Kgw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsKDwqDDpcKfwo7DpcKMwronLCAnw6bCg8Kgw6nCmMKzw6XCjMK6JywgJ8Olwo3CmsOnwr3Cl8Olwo7CvycsICfDpsKDwqDDpMK4wpzDpcKOwr8nLCAnw6nCvsKZw6nCl8Kow6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwqLChcOlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCosKFw6bCscKfw6XCjMK6JywgJ8OlwoXCtMOlwq7CgcOlwrjCgicsICfDpsKiwoXDpcKOwr8nLCAnw6XCpMKnw6XCn8KUw6XCjsK/JywgJ8OkwrjCsMOpwqHCusOlwo7CvycsICfDpMK6wpTDpcKNwo7DpcKOwr8nLCAnw6XCucKzw6jCv8Kcw6XCjsK/JywgJ8OowpXCicOlwrLCrcOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKxwpXDpcKwwr7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8Olwp/CjsOlwozCuicsICfDqcKZwobDpMK4wrDDpcK4woInLCAnw6bCtcK3w6TCuMKww6XCjsK/JywgJ8OpwpnChsOmwrLCs8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKywrPDpsK6wpDDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwrrCkMOlwp/CjsOlwozCuicsICfDp8K0wqvDqcKHwpHDpcKOwr8nLCAnw6nCvsKZw6XCt8Kdw6XCjsK/JywgJ8Oowr/CnsOlwrnCs8Olwo7CvycsICfDpcKSwozDpcK5wrPDpcKOwr8nLCAnw6TCuMKcw6bCusKQw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwpjCs8OmwrHCn8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCscKfw6XCn8KOw6XCjMK6JywgJ8OpwpjCs8OmwpjCpcOlwrjCgicsICfDqcKYwrPDqMKlwr/DpcKOwr8nLCAnw6nCmMKzw6TCuMKcw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrjChcOowr/CnMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpsK4woXDpcKfwo7DpcKMwronLFxuICAgICAgICAgICAgJ8OowovCscOlwr7Ct8OlwrjCgicsXG4gICAgICAgICAgICAnw6jCv8Kew6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICAgICfDpMK9wpvDpcKGwojDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwpjCs8OlwrHCscOlwo7CvycsXG4gICAgICAgICAgICAnw6bCuMKFw6bClsKww6XCjsK/JyxcbiAgICAgICAgICAgICfDqMK/wp7DpcKxwrHDpcKjwq7DpsKXwo/Dp8KRwrbDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8Oowr/CnsOlwo3Cl8OnwpHCtsOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICfDpcK5wr/DqMKlwr8nLFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCjcKXw6XCrsKBw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8Opwp3CksOnwqfCgMOlwozCuicsXG4gICAgICAgICAgICAnw6XChcK0w6XCrsKBw6XCjMK6JyxcbiAgICAgICAgICAgICfDqMKlwr/DpMK5wqHDpcKhwpjDpcKMwronLFxuICAgICAgICAgICAgJ8OowonCr8OlwrrChsOlwozCuicsXG4gICAgICAgICAgICAnw6bCscKfw6XCjcKXw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKCwpXDpcKuwoHDpcKMwronLFxuICAgICAgICAgICAgJ8Omwq3CpsOpwrjCo8Olwo7CvycsXG4gICAgICAgICAgICAnw6nCmsKGw6XCrsKJw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKpwqzDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrjCisOmwp7Cl8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCrsK+w6nCmMKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKowqrDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Omwp/Cs8OlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpcKfwo7DpMK4wq3DpcKMwronLFxuICAgICAgICAgICAgJ8OpwrHCvMOlwrPCsMOlwozCuicsXG4gICAgICAgICAgICAnw6bCn8Kzw6XCjMKXw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKfwrPDpcKNwpfDpcKMwronLFxuICAgICAgICAgICAgJ8Omwp/Cs8OmwrHCn8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCn8Kzw6XCn8KOw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcK5wr/DpcKvwqjDpcKOwr8nLFxuICAgICAgICAgICAgJ8Oowp7CjcOlwq7CicOlwo7CvycsXG4gICAgICAgICAgICAnw6jCnsKNw6bCsMK0w6jCi8KXw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wonDpsKxwp/DpMK+wpfDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwqHCgsOmwp7Cl8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqMKxwqHDpcKxwrHDpcKMwronLFxuICAgICAgICAgICAgJ8OnwqfCgMOlwrPCsMOlwozCuicsXG4gICAgICAgICAgICAnw6XCj8Kgw6XCvcKpw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK4woPDpsKYwp/DpcKMwronLFxuICAgICAgICAgICAgJ8OpwpvCgcOlwrHCscOlwozCuicsXG4gICAgICAgICAgICAnw6nCmMKzw6bCnMKUw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wrTDpsKhwoLDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwoHCtcOlwrfCncOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcKow6XCt8Kew6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK5wrPDpMK5wpDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtMOlwq7CicOlwo7CvycsXG4gICAgICAgICAgICAnw6fCgcKMw6nCmMKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKNwpTDpsK1wqbDpcKOwr8nLFxuICAgICAgICAgICAgJ8OowrXChMOmwrrCkMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCsMK4w6fCpsKPw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcK+wpnDqMKDwpzDpcKQwoTDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwoHCrcOlwp/CjsOnwpHCtsOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCosKnw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpMK4wofDp8KnwoDDpcKMwronLCAnw6jCncK2w6XCscKxw6XCjMK6JywgJ8OpwpXCv8OmwrTCssOlwozCuicsICfDpcKywpHDpsK6wqrDpcK4woInLCAnw6jCi8KNw6bCosKnw6XCjsK/JywgJ8OowpfCpMOlwo7CvycsICfDqMKSwpnDpcKxwrHDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCjMKXw6bCtcK3w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsK1wrfDpcKfwo7DpcKMwronLCAnw6nCk8K2w6bCtcK3w6XCjMK6JywgJ8OpwpPCgcOlwrHCscOmwrjCr8OlwozCuicsICfDpcKQwojDpsK1wqbDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCmMKyw6XCn8KOw6bCuMKvw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsK4wq/DpcKPwqPDpcKMwronLCAnw6nCmMKyw6XCn8KOw6XCjMK6JywgJ8OkwrjCnMOlwoXCtMOlwrjCgicsICfDpMK4worDpsKAwp3DpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCksKmw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqcKSwqbDpcKNwpfDpcKMwronLCAnw6nCksKmw6XCjMKXw6XCjMK6JywgJ8OnwoHCtcOlwrHCscOlwo7CvycsICfDpsK1wqbDpcKMwpfDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6jCtMK1w6bCuMKvw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsK4wq/DpcKMwpfDpcKMwronLCAnw6bCuMKvw6XCjcKXw6XCjMK6JywgJ8OowqbCg8OlwqHCmMOlwozCuicsICfDpsKhwoLDpcK5wrPDpcK4woInLCAnw6XCucKzw6XCjcKXw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Onwo7CicOmwp7Cl8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6fCjsKJw6XCt8Kew6XCjMK6JywgJ8OlwozCl8OmwrXCgcOlwrjCgicsICfDpcKuwrnDpcKOwr8nLCAnw6nCmcKGw6XCt8Kdw6XCjsK/JywgJ8Olwo3CmsOnwpnCvcOlwo7CvycsICfDpcKFwrTDpMK4wprDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6fCmcK+w6jCicKyw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8Olwo/Cs8OmwrHCn8OlwozCuicsXG4gICAgICAgICAgICAnw6XCh8KMw6TCusKRw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK5wrPDpsKewpzDpcKOwr8nLFxuICAgICAgICAgICAgJ8OowqXCv8Omwp7Cl8Olwo7CvycsXG4gICAgICAgICAgICAnw6TCucKQw6TCuMKaw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK+wrfDpMK/wp3DpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwpTCsMOmwp7Cl8Olwo7CvycsXG4gICAgICAgICAgICAnw6fClMKww6nCmMKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKdwpbDqMKlwr/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwpTCsMOkwrjCnMOlwo7CvycsXG4gICAgICAgICAgICAnw6nCgsKjw6XCncKhw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKawobDpsKewpfDpcKQwoTDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OowrTCusOlwrfCnsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XChcKrw6bCrcKlw6XCjMK6JywgJ8OpwpLCn8OlwrHCscOlwo7CvycsICfDpsKYwq3DpcK5wrPDpcKOwr8nLCAnw6XCr8KMw6XCt8Kdw6fCkcK2w6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrLCs8OmwrHCoMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqcKHwpHDpcKfwo7DpsKxwp/DpcKMwronLFxuICAgICAgICAgICAgJ8Olwq7CnMOlwrfCnsOlwrjCgicsXG4gICAgICAgICAgICAnw6XCpMKpw6XCs8Kow6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKHwqTDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwo3Cl8OkwrjCucOlwo7CvycsXG4gICAgICAgICAgICAnw6TCuMKcw6XChcKww6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKDwr3DpcKuwonDp8KRwrbDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8Onwr3Cl8Olwp/CjsOkwrvCq8Okwr3CrMOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCt8K0w6nCqcKsw6fCkcK2w6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KOwq/DpsKxwp/DpsKvwpvDpcKNwpfDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwqTCp8OlwozClsOnwpHCtsOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCncKlw6XCrsK+w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKFwrTDpcKuwr7DpcKMwronLCAnw6XCkMKIw6XCscKxw6XCuMKCJywgJ8OowrHCocOlwrfCnsOlwo7CvycsICfDpsKtwqbDpcKuwqPDpcKOwr8nLCAnw6XCv8K7w6XCn8KOw6XCjsK/JywgJ8OpwofCkcOnwqfCgMOnwpHCtsOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcK0wofDpcK3wqbDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwrHCn8OlwrfCnsOlwozCuicsICfDpcKHwq3Dp8KlwqXDpcK4woInLCAnw6XCrsKBw6bCmMKOw6XCjsK/JywgJ8OmwonCtsOnwrvCpcOlwo7CvycsICfDqcK+wpnDpcK3wp7DpcKOwr8nLCAnw6XCpMKnw6bClsKww6XCjsK/JywgJ8OlwqTCqcOnwq3CicOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKFwrbDpMK7wpbDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6bCtcK3w6XCjcKXw6fCnMKBJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrXCt8Olwo/Co8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6nCvsKZw6XCjcKOw6XCjMK6JywgJ8OnwqfCgMOowovCscOlwozCuicsICfDp8KQwrzDpcKxwrHDpcKMwronLCAnw6fCvsKOw6XChcKww6XCjMK6JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrjCicOkwrrCmsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6TCuMKJw6TCusKaw6XCuMKCJywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrrClMOmwozCh8OlwrHCscOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6TCusKUw6bCjMKHw6XCscKxJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6fCkMK8w6bCtcK3w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDp8KQwrzDpsK1wrcnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKEwovDpcK3wp7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoTCi8OlwrfCniddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwpbCh8OmwpjCjMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bClsKHw6bCmMKMJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCuMKHw6XCrsKBw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpMK4wofDpcKuwoEnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpMK4wpzDpsKWwrnDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OkwrjCnMOmwpbCuSddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Omwr7ChMOowr/CiMOlwo7CvycsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCvsKEw6jCv8KIw6XCjsK/J11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCrsKaw6XCrsKJw6XCjsK/JyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKuwprDpcKuwonDpcKOwr8nXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKxwq/DpsKYwozDpcKOwr8nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwrHCr8OmwpjCjMOlwo7CvyddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrjCtMOpwqvCmMOlwo7CvycsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6TCuMK0w6nCq8KYw6XCjsK/J11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6fCmcK9w6bCssKZw6nCu8KOw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDp8KZwr3DpsKywpnDqcK7wo7DpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKYwozDpsKxwp/DqcK7wo7DpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwpjCjMOmwrHCn8OpwrvCjsOmwpfCj8OowofCqsOmwrLCu8Olwo7CvyddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrnCkMOkwrjCnMOpwrvCjsOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6TCucKQw6TCuMKcw6nCu8KOw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/J11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCmcK1w6bCsMK0w6nCu8KOw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqcKZwrXDpsKwwrTDqcK7wo7DpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpMK/wp3DpMK6wq3DqcK7wo7DpsKXwo/DqMKLwpfDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8Okwr/CncOkwrrCrcOpwrvCjsOmwpfCj8OowovCl8OmwpfCj8OowofCqsOmwrLCu8Olwo7CvyddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OnwpDCvMOkwrjCrcOpwrvCjsOmwpfCj8OowovCl8OmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6fCkMK8w6TCuMKtw6nCu8KOw6bCl8KPw6jCi8KXw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/J11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XChcK2w6TCu8KWJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ8OpwofCjcOlwrrChsOlwrjCgicsXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKHwo3DpcK6wobDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCuMKdw6TCuMKtw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKkwqfDpsK4wqHDpcKPwqPDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrHCn8OlwozCl8OlwozCuicsXG4gICAgICAgICAgICAnw6XCjcKXw6XCssK4w6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKMwpfDp8KiwprDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrjCncOlwozCl8OlwozCuicsXG4gICAgICAgICAgICAnw6XCt8K0w6XCjcKXw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKVwr/DpcKvwr/DpcKMwronLFxuICAgICAgICAgICAgJ8Olwo/CjMOmwqHCpcOlwozCuicsXG4gICAgICAgICAgICAnw6bCssKZw6XCncKqw6XCncKdw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK4wofDp8KbwpvDpcKMwronLFxuICAgICAgICAgICAgJ8OkwrjCh8OlwrfCnsOlwozCuicsXG4gICAgICAgICAgICAnw6bCtsKqw6nCmcK1w6XCjMK6JyxcbiAgICAgICAgICAgICfDqcK7wpTDpsKxwp/DpcKMwronLFxuICAgICAgICAgICAgJ8OmwrDCuMOlwrfCncOlwozCuicsXG4gICAgICAgICAgICAnw6XCkMKIw6XCt8Kdw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKxwp/DpsK0wqXDpcKMwronLFxuICAgICAgICAgICAgJ8OkwrnCncOpwr7CmcOlwp3CocOlwozCuicsXG4gICAgICAgICAgICAnw6XCjcKXw6XCt8Kdw6XCjMK6JyxcbiAgICAgICAgICAgICfDp8K2wqbDpsKxwp/DpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwr3CvMOlwo3Cl8Olwo7CvycsXG4gICAgICAgICAgICAnw6jCjcKjw6bCmMKMw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KSwqfDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwqTCp8OowrbCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6nCk8Kcw6bCosKBw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKiwoHDpcK5wrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrzCgMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCv8Kgw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKfwo7DpcKPwqPDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwp7Cq8OmwrHCn8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCrcKmw6nCmsKGw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wrDDqcKDwr3DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwqXCicOoworCgsOlwo7CvycsXG4gICAgICAgICAgICAnw6TCusKRw6nCmMKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK3wqvDpsK6wqrDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrfCq8OlwrHCscOlwo7CvycsXG4gICAgICAgICAgICAnw6fCn8Kzw6bCn8Kxw6XCnMKfw6XCrsK2w6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KnwoDDpcKxwrHDpcKcwp/DpcKuwrbDpsKXwo/DqMKLwpfDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwoXCicOpwpjCs8OlwpzCn8Olwq7CtsOmwpfCj8OowovCl8OmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCvcKtw6bCsMK0w6jCi8KXw6bCl8KPw6XCnMKfw6XCrsK2w6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ8OlwpvCm8OlwrfCncOnwpzCgScsXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKIwpDDqcKDwr3DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6nCncKSw6fCvsKKw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKUwqbDpsKxwp/DpcKMwronLFxuICAgICAgICAgICAgJ8OpwofCkcOnwonCm8OlwozCuicsXG4gICAgICAgICAgICAnw6bCrcKmw6TCvsKvw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKIwpDDpcKNwo7DpcKMwronLFxuICAgICAgICAgICAgJ8Opwr7CmcOmwrPCicOpwqnCv8OlwozCuicsXG4gICAgICAgICAgICAnw6nCncKSw6fCmcK9w6bCscKfw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKWwrDDqcKDwr3DpcKMwronLFxuICAgICAgICAgICAgJ8OmwrjCqcOmwrHCn8OlwozCuicsXG4gICAgICAgICAgICAnw6nCg8K9w6bCscKfw6XCoMKww6XCuMKCJyxcbiAgICAgICAgICAgICfDpcK9wq3DpcK3wp7DpcK4woInLFxuICAgICAgICAgICAgJ8OpwoLCm8OlwrTCg8OlwrjCgicsXG4gICAgICAgICAgICAnw6XCtMKHw6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICAgICfDqcKHwpHDpcKgwoLDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwoPCq8Olwo7CvycsXG4gICAgICAgICAgICAnw6bClsKww6bCtMKlw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKPwozDpsK1woHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OowpLCssOmwrHCn8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCpMKnw6nCgsKRw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqMKHwqrDqMK0wqHDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwqTCp8Olwq7CicOlwozCuicsICfDqMKHwqrDpsK1woHDpMK6wpXDpcKMwronLCAnw6jCtMKhw6TCusKVw6XCjMK6JywgJ8OmwrLCv8OmwrvCqcOlwozCuicsICfDqMKNwqPDpcKOwr8nLCAnw6XCr8KMw6nCocK6w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwpTCgMOmwp7CncOoworCscOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6TCu8KBw6XCksKMw6XCjMK6JywgJ8OnwrHCs8OmwpjCk8Olwo7CvycsICfDp8KbwpDDqMK+wrnDpcKOwr8nLCAnw6TCuMKcw6XCjMK6JywgJ8OowqXCv8OlwozCuicsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKzwrjDpcK3wp7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwrHCn8OpwpjCs8OlwozCuicsICfDp8K6wrPDpsK6wqrDpcKMwronLCAnw6nCvsKZw6nCqcKsw6bCvcKtw6XCjMK6JywgJ8OmwrPCuMOlwo7CvycsICfDpcKQwojDpsKxwp/DpcKOwr8nLCAnw6XCj8KZw6bCsMK4w6XCjsK/JywgJ8Olwo/CpMOowpTCusOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcK+wrfDqcKYwrPDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwpfCjMOpwpjCs8OlwozCuicsICfDpcK5wr/DpsKxwonDpcK4woInLCAnw6TCu8KAw6nCgsKhw6XCuMKCJywgJ8OnwrvCtcOnwqvCucOlwrjCgicsICfDp8K9wpfDpsKxwp/DpcKOwr8nLCAnw6TCuMKtw6bCscKfw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OnwrvCtcOpwpjCs8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpsK2wqrDpcKfwo7DpcKMwronLFxuICAgICAgICAgICAgJ8OmwrjCuMOkwrvCmcOlwozCuicsXG4gICAgICAgICAgICAnw6bCscKfw6bCssK5w6XCuMKCJyxcbiAgICAgICAgICAgICfDp8KbwpDDpMK6wq3DpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrjCicOlwo/CsMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCucKzw6bCrcKmw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwqLCk8Omwr3CvMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCjMKXw6XCt8Kdw6fCvsKMw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcK5wr/DpcKFwoPDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoXCg8Olwp3CncOlwozCuicsICfDpsKcwp3DpcKkwqnDpcKMwronLCAnw6nCncKSw6XCt8Kdw6XCjsK/JywgJ8OmwpfCusOowovCjcOlwo7CvycsICfDpcKJwpHDqcKYwoHDpcKOwr8nLCAnw6jCi8KNw6bCusKqw6XCjsK/JywgJ8OlwrjCgsOkwrjCrcOlwozCuicsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKBwoLDpcKuwoHDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OowojCucOlwrHCscOlwozCuicsICfDpcKuwonDpcKxwoXDpcKMwronLCAnw6XCsMKEw6bCtMKqw6XCjsK/JywgJ8OowpPCrMOmwrrCqsOlwo7CvycsICfDpcKkwqfDqMKLwrHDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XChsKFw6bCscKfw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcK4woLDpMK4wq3DpcKMwronLCAnw6TCuMKcw6XChcK0w6XCjMK6JywgJ8OowrXChMOkwrjCrcOlwo7CvycsICfDqcKawobDpsKYwozDpcKOwr8nLCAnw6XCqMKBw6jCv8Kcw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrnCkMOlwrHCscOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpcK4woLDpMK4wq3DpcKMwronLFxuICAgICAgICAgICAgJ8OkwrrClMOpwoDCmsOmwqHCpcOlwozCuicsXG4gICAgICAgICAgICAnw6bCssKZw6bCucK+w6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKHwpHDpcKPwqPDpsKywrPDpcKMwronLFxuICAgICAgICAgICAgJ8OlwrPCqMOnwpzCicOlwrHCscOlwrjCgicsXG4gICAgICAgICAgICAnw6XCpMK5w6bCscKfw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK6wpXDp8KgwpTDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnworCjcOkwrjCusOlwo7CvycsXG4gICAgICAgICAgICAnw6bCssKQw6XCt8Kdw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKpwqzDqMK+wrnDpcK9wp3DpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrPCqMOowr7CucOlwr3CncOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCjcKXw6XChcKFJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqcKhwrrDpcK6wobDpcKMwronLCAnw6nCq8KYw6XCncKqw6XCjMK6JywgJ8OlwpjCicOpwpnCtcOlwozCuicsICfDqcKYwobDpMK4wq3DpcK4woInLCAnw6jCkMKlw6XCscKxw6XCjsK/JywgJ8OowpPCrMOlwq7CicOlwo7CvycsICfDpMK7wqrDqcKZwofDpcKOwr8nLCAnw6XCjcKXw6nCg8Kow6XCjsK/JywgJ8OowqXCv8OlwoXChcOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDp8KcwonDpcKxwrHDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OkwrjCnMOlwp3CocOlwozCuicsICfDpMK7woHDpcKvwr/DpcKOwr8nLCAnw6XCvcKtw6XCscKxw6XCjsK/JywgJ8OmwrTCqsOpwpvChcOlwo7CvycsICfDpMK4wrnDpsKjwrHDpcKOwr8nLCAnw6nCncKSw6fCpcKew6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Olwq7CnMOlwq7CvsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDp8K/wqDDpcKxwo/DpcKMwronLFxuICAgICAgICAgICAgJ8Olwq7CnMOlwq7CvsOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK0w6bClsKHw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKNwpfDpsK6wqrDpcKOwr8nLFxuICAgICAgICAgICAgJ8Onwo/CmcOlwo7CvycsXG4gICAgICAgICAgICAnw6nClcK/w6XCrsKBw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKrwpjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrHCn8Olwq7CicOlwo7CvycsXG4gICAgICAgICAgICAnw6fCrcKgw6jCv8Kew6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKxwo/DpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwrnCv8Olwq7CicOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCucK/w6XCrsKJw6XCjMK6JywgJ8Olwo3CjsOowpPCpcOlwrjCgicsICfDpcKywrPDpsKxwqDDpcKOwr8nLCAnw6nCgsK7w6bCsMK0w6XCjsK/JywgJ8Omwq3CpsOowoPCnMOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqMK+wr7DpcK3wp7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OpwoDCmsOlwrfCncOlwozCuicsICfDpMK4wofDpsK6wpDDpcK4woInLCAnw6jCvsK+w6XCjsK/JywgJ8OmwrjCoMOlwo7CvycsICfDpcKuwqPDpsKxwonDpcKOwr8nLCAnw6XCvMKAw6bCscKfw6XCjsK/JywgJ8OlwqTCp8OnwqvCucOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKbwoXDpcKuwonDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OpwpvCqMOlwp/CjsOlwozCuicsICfDqMKKwqbDpcKxwrHDpcKOwr8nLCAnw6fCn8Kzw6bCo8KJw6XCjsK/JywgJ8OlwpDCjcOlwrHCscOlwo7CvycsICfDpcKkwqnDpcKFwqjDpcKOwr8nLCAnw6jCjcKlw6fCu8KPw6XCjsK/JywgJ8Olwq7CncOlwoXCtMOlwo7CvycsICfDpsKxwonDpsK6wpDDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCt8K0w6TCuMKtw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcK3wrTDpcK3wp7DpcKMwronLCAnw6XCjcKXw6bCscKfw6XCjsK/JywgJ8OlwrnCs8OmwpjCjMOlwo7CvycsICfDqcKAwprDpsKxwp/DpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6jCtcKEw6nCmMKzw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDqcKbwoHDpsKxwp/DpcKMwronLCAnw6fCrsKAw6nCmMKzw6XCuMKCJywgJ8Olwq7CicOlwrLCs8Olwo7CvycsICfDpMK5wpDDqMKHwrPDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCmMK/w6XCncKdw6jCl8KPw6bCl8KPw6fCvsKMw6bCl8KPw6jCh8Kqw6bCssK7w6XCt8KeJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OpwqnCrMOlwrDClMOlwrrCt8Olwo7CvycsXG4gICAgICAgICAgICAnw6TCucKdw6XCr8Kow6bCssKfw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8K6wqLDpcKOwp/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrHCtsOlwrfCncOlwo7CvycsXG4gICAgICAgICAgICAnw6nCmMK/w6XCncKdw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KQwobDpcKOwr8nLFxuICAgICAgICAgICAgJ8OowovCpcOlwrDClMOnwpvClsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCsMKPw6nCh8KRw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcK7wpHDpsKwwrTDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwofCkcOlwrfCncOlwo7CvycsXG4gICAgICAgICAgICAnw6bCncK+w6bCvcKYw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKjwqTDpcKhwpjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OowozCgsOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6fClMKYw6XCrcKcw6jCl8KPw6bCl8KPw6jCh8Kqw6bCssK7w6XCt8KeJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OlwrrCt8Olwq7CmsOlwo7CvycsXG4gICAgICAgICAgICAnw6TCuMK5w6XCt8K0w6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KCwonDqcKcwo3DpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrnCncOpwr7CmcOlwo7CvycsXG4gICAgICAgICAgICAnw6fClMKYw6XCrcKcw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKbwoXDpsKxwp/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwpbCsMOpwr7CmcOlwo7CvycsXG4gICAgICAgICAgICAnw6nCgcKTw6XCrcKaw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KZwr3Dp8KOwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwpDChsOlwqHCmMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCvsK3w6bCoMK8w6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK5wqHDpcKfwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8Onwp/Cs8OmwrjCoMOlwo7CvycsXG4gICAgICAgICAgICAnw6fCqMK7w6XCn8KOw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKJwrLDqMK+wr7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrfCtMOlwqHCmMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCs8K4w6XCrsKaw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK+wpfDqMKNwqPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwofCicOlwrHCscOlwr3CncOmwpfCj8OowofCqsOmwrLCu8OlwrfCnicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqMKlwr/DpsKYwozDpcK4woInLFxuICAgICAgICAgICAgJ8Onwr7CjsOlwqfCkcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCmMKtw6jCp8KJw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKHwpHDqcKYwrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwpTCmMOmwrTCm8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCuMKDw6bCi8KWw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKbwrfDpsKzwqLDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwpnCrsOmwqDCvMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCrsKBw6XCjcKXw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKWwpzDpcK+wrfDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrzCmsOkwrjCnMOlwo7CvycsXG4gICAgICAgICAgICAnw6jCtsKKw6jCpcK/w6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK8wprDp8KQwobDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwpvCkMOmwrrCkMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCvsK3w6bCmMKMw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKGwpXDpcKuwoHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwpzCqMOpwofCjMOowpfCj8OmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XChcK2w6TCu8KWJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ8OowrTCtcOlwrfCnsOnwpzCgScsXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqMK0wrXDqcKYwrPDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6XCjcKXw6bCmMKOw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK6wpHDpcKywqnDpcKMwronLFxuICAgICAgICAgICAgJ8OoworCscOmwrrCqsOlwozCuicsXG4gICAgICAgICAgICAnw6TCucKMw6XCvcKTw6XCjMK6JyxcbiAgICAgICAgICAgICfDp8KZwr3DpMK6wpHDpcKMwronLFxuICAgICAgICAgICAgJ8OlwrDCj8OmwrLCs8OlwozCuicsXG4gICAgICAgICAgICAnw6bCuMKFw6nClcKHw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcK8woDDqcKYwrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8Okwr/CrsOmwpbCh8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCgcKvw6fCg8K9w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKFwq3Dp8KbwpjDpsKwwrTDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OpwpLCn8OlwrHCscOlwozCuicsICfDpsKwwrTDpcKfwo7DpcKOwr8nLCAnw6fCm8KYw6XCjsK/JywgJ8OlwoXCrcOmwp7CncOnwonCucOlwozCuicsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKBwrXDpMK5wonDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6fCusKiw6jCisKxw6XCssKXw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKxwofDpcK3wp3DpcKMwronLFxuICAgICAgICAgICAgJ8OowrXCpMOmwrDCtMOlwrjCgicsXG4gICAgICAgICAgICAnw6TCu8KBw6bCgMKAw6XCuMKCJyxcbiAgICAgICAgICAgICfDqcKBwrXDpMK5wonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwrvCpcOpwpjCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCocKQw6bCosKTw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK5wqDDpsKwwrTDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwofCpMOlwobCiMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCrcKjw6XCrsKJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK9wpnDpcK6wobDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrnChMOmwr3CrcOlwo7CvycsXG4gICAgICAgICAgICAnw6nCgcKTw6fCnMKfw6TCu8Khw6TCvcKsw6bCl8KPw6jCi8KXw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKKwqHDpcK3wp3DpMK7wqHDpMK9wqzDpsKXwo/DqMKLwpfDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Olwq7CicOpwqHCusOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDqMKlwr/Dp8KnwoDDpcKMwronLFxuICAgICAgICAgICAgJ8OmwpnCrsOlwq7CmsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCucKzw6XCncKdw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKVwofDpcKuwoHDpcK4woPDpMK+wp3DpsKXwo/DqMKLwpfDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwrTCq8OkwrrCkcOowovCl8OmwpfCj8OlwrjCg8Okwr7CncOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcKzw6XCssKtw6XCuMKDw6TCvsKdw6bCl8KPw6jCi8KXw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKTwpzDpMK7woHDpcKcwrDDpcKMwronLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6nCk8Kcw6TCu8KBw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcK+wrfDpsKxwp/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrHCn8Olwo/Co8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCgMKdw6XCjcKXw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KfwrPDqcKYwqHDpcKOwr8nLFxuICAgICAgICAgICAgJ8Onwo7CicOlwrHCj8Okwr7Cl8OmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCncK+w6bCocKDw6jCi8KXw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKNwrDDpsKxwp/DpcKcwp/DpcKuwrbDpsKXwo/DqMKLwpfDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrLCv8OmwrLCs8OlwpzCn8Olwq7CtsOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6TCuMKHw6XCscKxw6fCicK5w6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKvwpXDqMKKwoLDpcKcwrDDpcKMwronLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCr8KVw6jCisKCw6XCuMKCJyxcbiAgICAgICAgICAgICfDqcK7wpTDqMKlwr/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwqTCp8OmwpbCucOlwo7CvycsXG4gICAgICAgICAgICAnw6fCu8KHw6nCh8KRw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKHwpHDpsKywpnDpcKOwr8nLFxuICAgICAgICAgICAgJ8OowrXCq8OnwqvCoMOlwo7CvycsXG4gICAgICAgICAgICAnw6fCusKzw6nCm8KNw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKowoHDpcKuwoHDpcK9wp3DpsKXwo/DpcKbwp7DpsKXwo/DqMKLwpfDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwrvClMOowqXCv8Olwo3Cl8OlwrjCg8Okwr7CncOmwpfCj8OowovCl8OmwpfCj8OowofCqsOmwrLCu8OlwrfCnicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XChcK0w6TCucKJw6XCuMKCJywgJ8OmwpzCm8OowrDCn8Olwo7CvycsICfDpcKFwrTDpMK7woHDpcKOwr8nLCAnw6bCmcKuw6XCrsKJw6XCjsK/JywgJ8OlwobCjMOkwrrCqMOlwo7CvycsICfDpsKZwrTDqcKawobDpcKOwr8nLCAnw6jCtMKew6TCuMKww6XCjsK/JywgJ8Olwq7CicOpwr7CmcOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcK7wpTDpMK4wpzDpcKNwpfDqMKLwpfDpsKXwo/DpMK+wpfDpsKXwo/DqMKHwqrDpsKywrvDpcK3wp4nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6XCh8Kvw6nCh8KMw6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKWwr3Dp8KnwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrvCjsOmwrHCn8Olwo7CvycsXG4gICAgICAgICAgICAnw6nClMKmw6XCscKPw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKVwofDqMK/wpzDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwrrCu8OmwrHCn8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCj8Kww6bCscKfw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKkwqnDpsKfwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwrvChMOlwrnCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCpsKVw6bCscKfw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKJwpHDpsKywrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrjCicOnwqnCl8Olwo7CvycsXG4gICAgICAgICAgICAnw6nCm8K3w6XCscKxw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcK7wo7DpcK5wrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrLCkcOlwrfCqcOlwo7CvycsXG4gICAgICAgICAgICAnw6TCuMK5w6XCr8Kow6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcK7wpTDpcKNwpfDpcK4woPDpMK+wp3DpsKXwo/DqMKLwpfDpsKXwo/DqMKHwqrDpsKywrvDpcK3wp4nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6nCg8K9w6XCjMKAw6XCuMKCJyxcbiAgICAgICAgICAgICfDp8Kmwo/DpsKzwonDpcK4woInLFxuICAgICAgICAgICAgJ8OowrTCtcOlwq7CmsOlwo7CvycsXG4gICAgICAgICAgICAnw6bCg8Kgw6bCsMK0w6XCjsK/JyxcbiAgICAgICAgICAgICfDp8K9wpfDp8KUwrjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwpPCrsOlwq7CicOlwo7CvycsXG4gICAgICAgICAgICAnw6jCjcKUw6bCs8Kiw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcK+wpnDqcKHwozDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrnCs8OlwqHCmMOlwo7CvycsXG4gICAgICAgICAgICAnw6nClcK/w6nCocK6w6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KLwqzDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrjCicOpwoPCvcOmwrDCtMOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XChcK2w6TCu8KWJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ8OkwrrCkcOlwo3Cl8OnwpzCgScsXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKYwobDpsKYwo7DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6fCm8KYw6nCvsKZw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK6wpTDpcKNwo7DpcKMwronLFxuICAgICAgICAgICAgJ8Olwq7CmMOmwrjCocOlwozCuicsXG4gICAgICAgICAgICAnw6jCpcK/w6XCscKxw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK4wpzDpcK3wp3DpcKMwronLFxuICAgICAgICAgICAgJ8Olwq7CicOlwq7CgcOlwrjCgicsXG4gICAgICAgICAgICAnw6XCkcKIw6jCtMKhw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKZwovDpcKuwoHDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwq/CjMOmwrDCkcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCrsKcw6jCicKvw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK1wqnDpsKYwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8Onwp/Cs8Omwp7Cl8Olwr3CncOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6fCpsKEw6XCisKdw6XCvcKdw6bCl8KPw6jCi8KXw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKvwrvDp8KUwrjDpcKbwp7DpsKXwo/DpcK9wp3DpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwpvCssOpwp3ClsOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6nCusKSw6nCusKfw6XCjMK6JywgJ8Olwq7Co8OlwqjCgcOlwrjCgicsICfDqcKpwqzDqcK+wpnDpcKOwr8nLCAnw6bCssK+w6fCm8KKw6XCjsK/JywgJ8Olwq/CjMOmwrrCkMOlwo7CvycsICfDp8K9wpfDpcK5wrPDpcKOwr8nLCAnw6XCuMKIw6XCrsKXw6XCjsK/JywgJ8OpwpnChsOowonCr8Olwo7CvycsICfDpMK8wprDpsKzwr3DpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6fCjsKJw6bCusKqw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OnwrrCosOlwqHClMOlwozCuicsXG4gICAgICAgICAgICAnw6bCscKfw6XCt8Kdw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK+woTDpsKxwp/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwoDCmsOmwrXCt8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCjcKOw6XCrsKBw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKYwpPDqcKXwqjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrPCqMOlwrHCscOlwr3CncOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6bClsKww6XCucKzw6XCvcKdw6bCl8KPw6XCgsKjw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwoPDpsKxwp/DpcKTwojDpcKwwrzDpsKXwo/DpcK9wp3DpsKXwo/DpcKCwqPDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Okwr/CncOlwrHCscOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6nCmsKGw6nCmMKzw6XCjMK6JywgJ8OmwpbCvcOnwpTCuMOlwo7CvycsICfDqMKFwr7DpcKGwrLDpcKOwr8nLCAnw6nCvsKZw6nCmcK1w6XCjsK/JywgJ8OmwpjCjMOlwq7CgcOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKYwq3DqcKAwprDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCmMKtw6nCmMKzw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKywoHDp8KUwrjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrfCp8Olwq7CtsOlwo7CvycsXG4gICAgICAgICAgICAnw6fCm8KQw6bCtMKlw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKkwqfDpcKFwrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrDCuMOlwpbChMOlwo7CvycsXG4gICAgICAgICAgICAnw6fCu8Klw6bCscKfw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKVwofDqcKbwoTDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwr3CncOowonCr8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCqMKBw6TCv8Khw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKwwrTDpcKvwozDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrjCvcOmwrHCn8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCj8Kkw6XCn8KOw6XCjMK6JywgJ8OmwrDCuMOowoPCnMOlwo7CvycsICfDpcKNwo7DpcKdwqrDpcKOwr8nLCAnw6fCjsKJw6nCvsKZw6fCusKzw6jCpcK/w6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JywgJ8Olwq7CgcOowpLCl8Olwr3CncOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKZwq7DpsK0wrHDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCgMKdw6jCjMKFw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKZwq7DpsK0wrHDpcKTwojDpcKwwrzDpsKXwo/DpcK9wp3DpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwqLCqMOmwrHCn8OlwpPCiMOlwrDCvMOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCmcKvw6TCuMKcw6XCvcKdw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKZwq/DqMKwwrfDpcKCwqPDpsKXwo/DpcK9wp3DpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwpXCh8OmwrLChcOlwr3CncOmwpfCj8OlwpPCiMOlwrDCvMOmwpfCj8OmwovCicOnwqXCnMOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCscKfw6XCn8KOw6XCk8KIw6XCsMK8w6bCl8KPw6XCvcKdw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKtwp/DqMK/wp7DpcKCwqPDpsKXwo/DpsKLwonDp8KlwpzDpsKXwo/DpMK9wqTDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwr7CnMOmwrLCp8OmwovCicOnwqXCnMOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6jCpcK/w6fCm8Kfw6TCvcKkw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpMK4wrTDpsKywqfDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6TCuMK0w6fCv8KUw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKHwqTDpcK6wobDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrrCkcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCsMK4w6XCvsK3w6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKVwofDpcK6wrfDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwo/CjMOmwrHCn8OmwovCicOnwqXCnMOmwpfCj8Okwr3CpMOmwpfCj8OlwrjCg8OmwpzCl8OmwpfCj8OlwoLCo8OmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6jCgMK/w6nCqcKsw6XCgsKjw6bCl8KPw6TCvcKkw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKywqfDpsK6wpDDpMK9wqTDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Olwr7Ct8Olwq7Cj8OlwoLCo8OmwpfCj8OmwpnCr8OpwqLCh8OmwpfCj8OowofCqsOmwrLCu8OlwrfCnicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCvcKew6jCpcK/w6XCuMKCJywgJ8OnwpHCnsOkwrjCvcOlwrjCgicsICfDpsKiwoHDpsKywrPDpcKOwr8nLCAnw6fCm8KIw6bCscKfw6XCjsK/JywgJ8OpwpnCh8OlwrfCncOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKAwpLDpsKxwp/DpcKCwojDpcKDwrPDpsKXwo/DqMKHwqrDpsKywrvDpcK3wp4nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwrPCuMOmwrDCtMOlwo7CvycsICfDp8Kmwo/DqMK0wqHDpcKOwr8nLCAnw6jCtMKhw6XCscKxw6fCi8Ksw6nCvsKZw6bCl8KPw6bCgMKSw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JywgJ8OlwoXCsMOlwp3CqsOnwpnCvcOmwpfCj8OmwpnCrsOnwrHCs8OmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqMK/wqrDpcK6wobDqMKXwo/DpsKXwo/DqMKHwqrDpsKywrvDpcK3wp4nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OpwqbCmcOmwqDCvMOpwofCjMOmwovCicOlwo7CvycsICfDpcK+wrfDqcKSwqbDpcKOwr8nLCAnw6fCu8K0w6jCpcK/w6XCgsKIw6XCg8Kzw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwqTCp8OnwpDChsOnwpnCvcOmwpfCj8OowofCqsOmwrLCu8OlwrfCnicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpcKkwqfDp8KQwobDpcK4woInLFxuICAgICAgICAgICAgJ8OnwqXCpcOkwrrCkcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCrsK+w6XCt8Kdw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK8wqXDpsK4wqHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrDCuMOlwrnCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6TCusKRw6nCvsKZw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK0wrHDpsK6wpDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwonCkcOlwrfCncOlwo7CvycsXG4gICAgICAgICAgICAnw6nCucKkw6XCusKGw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK8wr7DpsK/wp7DpcK9wp3DpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwo3Cl8OmwrbCp8Olwr3CncOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCt8KNw6XCscKxw6XCvcKdw6bCl8KPw6XCm8Kew6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKlwprDqcKbwoTDpcK9wp3DpsKXwo/DqMKHwqrDpsKywrvDpcK3wp4nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCpcKaw6nCm8KEw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKPwozDpsKfwo/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwonCn8Olwq7CmsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCjcKXw6XCjcKOw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKnwprDpcKuwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwqTCp8OlwqfCmsOlwo7CvycsXG4gICAgICAgICAgICAnw6bCsMK4w6TCu8KBw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwoPDqMKwwovDpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwq3CpsOlwq7CmsOlwo7CvycsXG4gICAgICAgICAgICAnw6fCpsKEw6TCuMKww6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDp8K6wqLDpsKywrPDpcKTwojDpcKwwrzDpsKXwo/DpcK9wp3DpsKXwo/DqMKHwqrDpsKywrvDpcK3wp4nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6jCksKZw6jCh8Kqw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4wqrDpsKXwqfDpcK4woInLFxuICAgICAgICAgICAgJ8OlwrzCgMOowr/CnMOlwrjCgicsXG4gICAgICAgICAgICAnw6fCu8K/w6bCmMKlw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK7wrrDpsKwwrTDpcKOwr8nLFxuICAgICAgICAgICAgJ8Onwp/Cs8OlwrHCj8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCvMKlw6XCi8KSw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKzwrjDqMKlwr/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCg8OpwpjCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6fCusKiw6bCssKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKHwpHDpcK5wrPDqMKLwpfDpsKXwo/Dp8KRwrbDpsKXwo/DpcKCwqPDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrLCs8Olwo/Co8OnwpHCtsOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCscKPw6jCvsK5w6jCi8KXw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKWwofDpcKxwrHDpcKjwq7DpsKXwo/DqMKLwpfDpsKXwo/DqMKHwqrDpsKywrvDpcK3wp4nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwpbCh8OlwrHCscOlwo7CvycsICfDp8KgwprDpcKxwrHDpcKOwr8nLCAnw6jCpcK/w6fClcK0w6XCjsK/JywgJ8OpwrrCu8OmwqDCl8Olwp3CocOlwo7CvycsICfDqcKpwqzDpcKFwrPDpcKOwr8nLCAnw6TCuMKYw6XCjMKXw6XCjsK/JywgJ8OlwrnCv8Olwo3Cl8Olwo7CvycsICfDpcKvwozDpcKuwoHDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6jCpcK/w6XCj8KMw6fCicKIw6fCusKzw6XCgsKjw6bCl8KPw6jCh8Kqw6bCssK7w6XCt8KeJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsKZwq/DpsK0wqrDpcK4woInLCAnw6XCi8KQw6bCtcK3w6XCjsK/JywgJ8OlwovCkMOowoXCisOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKFwrbDpMK7wpYnLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6jCpcK/w6jCl8KPJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwovCicOowpDCqMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCn8KOw6XChcKzw6XCjMK6JywgJ8Omwp7Cl8OlwpHCqMOlwo7CvycsICfDpcK9wpPDqcKbwoTDpcKOwr8nLCAnw6XCsMK8w6bCnMKow6XCjsK/JywgJ8OmwpvCssOmwrDCtMOlwo7CvycsICfDpcKgwobDqcK+wpnDpcK+wrfDpcK6wobDpcKOwr8nLCAnw6jCvsK+w6XCrcKcw6XCjsK/JywgJ8OlwqLCqMOnwqvCucOlwrfCpcOlwo3CocOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKCwqPDpsKbwrLDpcKcwrDDpcKMwronLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6nCgsKjw6bCm8Kyw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKYwonDqcK7wo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwq/ClMOlwqbCgsOlwo7CvycsXG4gICAgICAgICAgICAnw6jCgcKCw6jCjcKjw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwonDpcKkwprDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwpTCs8OmwonCjsOlwo7CvycsXG4gICAgICAgICAgICAnw6fCtMKiw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KPwq3DpsKIwojDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrfCtMOpwp3CksOlwo7CvycsXG4gICAgICAgICAgICAnw6XCsMK8w6fCjsKbw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKYwozDqcKDwr3DpcKcwrDDpcKMwronLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCmMKMw6nCg8K9w6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKxwp/DqMK+wr7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OowrTCocOowqfCicOlwo7CvycsXG4gICAgICAgICAgICAnw6fCscK7w6TCucKMw6nCvcKQw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK4woHDqcKdwpLDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwq/Cn8OpwpvChcOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcKrw6XCrsK/w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK3wqbDqMK0wqHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OoworCksOlwrrCt8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCtMKbw6nCmsKGw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMK+wrnDpcKdwp3DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Omwp7Cl8OoworCncOlwpzCsMOlwozCuicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCnsKXw6jCisKdw6XCjsK/JywgJ8OlwrfCpcOlwrjCg8OmwrHCn8Oowr7CvsOlwo7CvycsICfDp8KxwrPDpsKewpfDpcKOwr8nLCAnw6XCosKow6jChMKxw6XCjsK/JywgJ8OmwrPCosOlwq/ChsOlwo7CvycsICfDpcKvwp/DqcKawoXDpcKOwr8nLCAnw6bCnMKXw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwrHCscOlwo3Cl8OlwpzCsMOlwozCuicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpMK5woPDpMK4wpzDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwonCjsOlwpvCisOlwo7CvycsXG4gICAgICAgICAgICAnw6jCtMKhw6XCmMKOw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKhwpHDpsKXwqXDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwpDCvMOnwrvCk8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCm8Kyw6bCncK+w6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKOwqrDp8K+wo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrTCm8OmwonCjsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCisKgw6bCn8Klw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKawobDpcKtwpDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwpTCmcOpwoLCo8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCtcKqw6XCjcKhw6XCrcKQw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKXwqXDpcKWwoDDpcKIwpnDpcKcwrDDpcKMwronLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCl8Klw6XClsKAw6XCiMKZw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKNwpfDpsKcwqjDpsKewpfDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrHCn8Olwq3CnMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCrsKaw6bCl8Klw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKQwqjDqMK/wqbDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwovCicOlwq3CnMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCmMKCw6TCu8KBw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKwwqLDqcKAwprDqcKXwqjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwpnCvcOmwpzCl8Olwo7CvycsXG4gICAgICAgICAgICAnw6TCu8KBw6XCuMKDw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK6wrfDqcKpwqzDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwq7CmsOnwrvCk8Olwo7CvycsXG4gICAgICAgICAgICAnw6TCu8Kyw6XCt8K0w6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK6wprDpMK4wpzDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwpDCicOpwprChsOlwo7CvycsXG4gICAgICAgICAgICAnw6jCgcKCw6bCi8KJw6bCnMKow6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKQwqjDpcKYwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrLCl8OlwrfCtMOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCmMK/w6nCh8KMw6XCnMKww6XCjMK6JyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKZwrbDpcKwwpTDpcKOwr8nLCAnw6bCmcKuw6XChcKww6XCjsK/JywgJ8OmwpzCrcOowr7CvsOlwo7CvycsICfDpsKXwqXDpcKcwp/DpcKOwr8nLCAnw6nCncKpw6XCkMKJw6XCjsK/JywgJ8OmwpTCucOlwojCmcOlwo7CvycsICfDpsKOwqrDpcKLwqTDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XChcK2w6TCu8KWJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ8OpwpnClcOowqXCv8OnwpzCgScsXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqMKlwr/DpcKuwonDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6jCjsKyw6bCucKWw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKWwrDDpcKfwo7DpcKMwronLFxuICAgICAgICAgICAgJ8OnwqLCkcOmwp7Cl8OlwozCuicsXG4gICAgICAgICAgICAnw6nCm8KBw6XCocKUw6XCjMK6JyxcbiAgICAgICAgICAgICfDp8KBwp7DpsKhwqXDpcKMwronLFxuICAgICAgICAgICAgJ8OmwpzCqsOlwqTCrsOlwozCuicsXG4gICAgICAgICAgICAnw6nCmMKOw6jCicKvw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK4wrTDpsK9wrzDpcKMwronLFxuICAgICAgICAgICAgJ8OpwpXCv8Olwq7CicOlwozCuicsXG4gICAgICAgICAgICAnw6nCq8KYw6nCmcK1w6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKTwp3Dp8KUwrDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwojCt8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCkcKow6jCh8Kzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKTwpzDpcK3wp3DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OowoDCgMOlwrfCnsOlwozCuicsICfDp8KOwovDp8KbworDpcKMwronLCAnw6XCjcKww6XCj8Kww6XCjMK6JywgJ8Olwq7CnMOlwpDCm8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKuwp3DqcK4wqHDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCuMKtw6bCu8Kow6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKHwpHDpcKPwrDDpcKMwronLFxuICAgICAgICAgICAgJ8OpwpnCiMOkwrvCk8OlwozCuicsXG4gICAgICAgICAgICAnw6XCssKQw6XCscKxw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKHwqTDp8K/wpTDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwpnCh8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCpMKqw6fCmcK9w6XCjsK/JyxcbiAgICAgICAgICAgICfDqcK6wp/DpsK4wrjDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwonCtsOpwqPCjsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCjcKDw6nCmMKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KcwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwofCpMOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCksK4w6nCmMKzw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OnwqfCpsOpwoPCvcOlwozCuicsXG4gICAgICAgICAgICAnw6bCuMKtw6XCn8KOw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKdwqjDqcKZwrXDpcKMwronLFxuICAgICAgICAgICAgJ8OlwoXCtMOlwrnCs8OlwrjCgicsXG4gICAgICAgICAgICAnw6fCpMK8w6bCs8KJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKzwr7DqcKYwrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrDCuMOlwq/Cv8Olwo7CvycsXG4gICAgICAgICAgICAnw6TCuMKJw6XCjsKfw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK9wqzDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwpfCrMOpwoLCkcOlwo7CvycsXG4gICAgICAgICAgICAnw6nClcK/w6bCrcKmw6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK5wr7DpcKOwr8nLFxuICAgICAgICAgICAgJ8Omwq3CpsOlworCn8Olwo7CvycsXG4gICAgICAgICAgICAnw6bCt8Kzw6XCjMKWw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsK4wq3DpcKNwpfDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6TCuMK0w6bCuMKtw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKfwqnDpcKfwo7DpcK4woInLFxuICAgICAgICAgICAgJ8Olwo3CjsOpwpjCtMOlwrjCgicsXG4gICAgICAgICAgICAnw6jCksKyw6XCn8KOw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsK9wrzDpcKFwrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwpnCvcOmwrDCtMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCvsKEw6XCn8KOw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKNwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwpDCiMOpwpjCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCr8KMw6XCucKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKkwqfDqMKNwpTDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwrvCtsOlwq7CicOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpcKuwp3DpcKhwpTDpcKMwronLFxuICAgICAgICAgICAgJ8Olwq7CicOlwqHCnsOlwo7CvycsXG4gICAgICAgICAgICAnw6bCtMKbw6XCt8Kdw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKtwpDDqcKVwr/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwrvChMOpwpnCtcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCu8K2w6XCt8Kdw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKvwozDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrvCtsOpwpXCv8Olwo7CvycsXG4gICAgICAgICAgICAnw6fClMKYw6bCs8KJw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwpzDpcK3wp3DpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwr/Cl8OkwrjCucOlwo7CvycsXG4gICAgICAgICAgICAnw6nCu8KEw6nCvsKZw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKQwrTDqMK1wrfDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrHCicOkwrjCrcOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpsKxwonDpcKPwrDDpcKMwronLFxuICAgICAgICAgICAgJ8OnwpXCmcOlwp3CncOlwo7CvycsXG4gICAgICAgICAgICAnw6nClcKHw6XCt8K0w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKfwo7DpcKbwrrDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwo3Cl8OpwoPCkcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCtMKLw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwoHDpcK8wrrDpcKOwr8nLFxuICAgICAgICAgICAgJ8Okwr3Cm8Olwp3CqsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCi8KJw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKlwr/DpMK5wqHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwpXCpcOpwpjCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCpsKGw6bCnsKXw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OmwqbChsOpwpjCs8OlwozCuicsXG4gICAgICAgICAgICAnw6bCuMKFw6bCtsKnw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8K7wqXDpcK+wrfDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwqXCnsOmwpzCqMOlwo7CvycsXG4gICAgICAgICAgICAnw6TCvcKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK6wpzDqMKwwrfDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwq3CkMOmwrTCssOlwo7CvycsXG4gICAgICAgICAgICAnw6nCncKWw6jCvsK5w6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKowqrDpcKxwrHDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwrHCs8OowoTCgsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCkMK0w6XCoMKhw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKuwprDqMK+wrnDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Olwq7CicOlwrrCt8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpsKxwonDpsK7wqjDpcKMwronLFxuICAgICAgICAgICAgJ8OnwrTCq8OpwpjCs8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCssKaw6fCmsKLw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKXwqzDqcKYwrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OpwpXCh8Olwp3CqsOlwo7CvycsXG4gICAgICAgICAgICAnw6XCucKzw6XCiMKpw6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KfwrPDpsKzwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwq7CgcOpwpnClcOlwo7CvycsXG4gICAgICAgICAgICAnw6fCmcK9w6bCssKzw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKxwonDqcKYwrTDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwpXChsOmwrTCm8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XClcKGw6XCt8Kew6XCjMK6JywgJ8OpwpXCh8Olwq7CicOlwo7CvycsICfDpcKxwrHDqcKYwrPDpcKOwr8nLCAnw6bCtMKbw6XCjcKXw6XCjsK/JywgJ8OlwpXChsOlwo3Cl8Olwo7CvycsICfDpMK4wrnDpcKHwqTDpcKOwr8nLCAnw6bCn8Kew6bCsMK0w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwoXCtsOkwrvClicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICfDp8KUwpjDqMKCwoPDp8KcwoEnLFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XChcKww6XCt8Kew6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKfwo7DpcKFwrPDpcKMwronLCAnw6TCuMKDw6nCh8KMw6bCssKzw6XCjMK6JywgJ8OowqXCv8OlwpvCusOlwozCuicsICfDpcKuwonDpcKuwoHDpcKMwronLCAnw6fCusKiw6XCj8Kkw6XCjMK6JywgJ8OmwrDCuMOnwpnCu8Olwo7CvycsICfDp8KawovDpcKFwrDDpcKOwr8nLCAnw6bCpsKGw6TCuMKtw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwpjCicOlwrPCqsOlwoXCs8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCmMKJw6XCs8Kqw6XChcKzw6XCuMKCJywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwofCkcOmwpjCjMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6nCh8KRw6XCt8Kdw6XCjMK6JywgJ8OmwrDCuMOmwpjCjMOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDp8KZwr3DqcKTwrbDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OnwpnCvcOpwpPCtsOlwozCuicsICfDpcK5wrPDpcK3wp3DpcKMwronLCAnw6nCncKWw6jCv8Kcw6XCjsK/JywgJ8OkwrzCmsOlwq7CgcOlwo7CvycsICfDpsKZwq/DpsKzwrDDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCpMKpw6bCsMK0w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsK4woXDpsKwwrTDpcKOwr8nLCAnw6fCp8Kmw6XCrsKJw6XCjsK/JywgJ8OnwpTCmMOowrDCt8Olwo7CvycsICfDpsKtwqbDpcKxwrHDpcKOwr8nLCAnw6XCvMKgw6XCrsK2w6XCt8Kdw6XCm8Kew6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JywgJ8OlwozCl8OpwoHCk8OlwozCuicsICfDp8KnwqbDpcKfwo7DpcKMwronLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCrcKmw6XCqMKBw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKHwonDpcK3wp7DpcKMwronLCAnw6bCsMKRw6XCi8Kkw6XCjsK/JywgJ8Olwo/CpMOmwrXCqsOlwo7CvycsICfDpcKkwqnDp8Klwp3DqMKXwo/DpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nChcKSw6bCs8KJw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OowoLCg8OlwrfCnsOlwozCuicsXG4gICAgICAgICAgICAnw6fCjsKJw6nCl8Kow6XCuMKCJyxcbiAgICAgICAgICAgICfDpsKVwqbDp8KFwozDpcK4woInLFxuICAgICAgICAgICAgJ8OpwofCkcOlwqHClMOlwo7CvycsXG4gICAgICAgICAgICAnw6jCgsKDw6XCjMKXw6jCksKZw6XCj8Kkw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKYwr/DpcKFwovDpcKhwp7DpcKTwojDqMKQwqjDpcKFwovDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8Olwq7CicOowqXCv8Olwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCvMKgw6bCjsKWw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDp8KUwpjDpcK3wp7DpcKMwronLCAnw6bCsMKRw6TCucKQw6XCjsK/JywgJ8OkwrjCtMOmwrPCvcOlwo7CvycsICfDqcKrwpjDpcKPwrDDpcKOwr8nLCAnw6XCscKxw6TCuMK5w6XCjsK/JywgJ8OowoLCg8Olwo3Cl8OowqPClcOlwpvCusOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcK6wobDqcKYwrPDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OowqXCv8OlwrPCsMOlwozCuicsICfDpcK6wobDpcKfwo7DpcKOwr8nLCAnw6fCjsKvw6XCjsK/JywgJ8Olwo3CjsOmwrHCoMOlwo7CvycsICfDpcKQwojDpsKwwrTDpcKOwr8nLCAnw6bCrcKjw6XCrsKBw6XCjsK/JywgJ8Olwq7CgcOlwo7CvycsICfDqcKVwofDpcKOwp/DpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCucKzw6XCh8KJw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcK0wobDpcKzwpLDpcKMwronLCAnw6bCs8K+w6XCt8Kdw6XCjsK/JywgJ8OnwoHCtcOlwo/CsMOlwo7CvycsICfDpcK0wofDpMK/wqHDpcKOwr8nLCAnw6XCjcKOw6TCusKtw6XCjsK/JywgJ8OlwrrChMOmwrXCqsOlwo7CvycsICfDqcKdwpnDpcKuwoHDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCrsKaw6jCpcK/w6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKuwonDpcKuwprDpcKMwronLCAnw6nCgMKaw6bCuMKtw6XCjsK/JywgJ8OkwrjCtMOmwrTCrsOlwo7CvycsICfDpsK8wrPDpcKOwr8nLCAnw6XCssK3w6XCjsK/JywgJ8OmwrjCrcOmwrrCkMOlwo7CvycsICfDqcKZwofDqMKlwr/DpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCmcKHw6XCjcKXw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsKtwqbDqcKDwr3DpcKMwronLCAnw6bCiMKQw6XCjsK/JywgJ8Olwq7ClcOmwpjCjMOlwo7CvycsICfDpcK6wrfDpcKOwr8nLCAnw6bClsKHw6XCjsK/JywgJ8OowqXCv8OlwpLCjMOlwo7CvycsICfDp8KkwrzDpcKOwr8nLCAnw6TCuMKkw6XCvcKTw6XCjsK/JywgJ8Olwr7CvcOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpMK4wrTDpcKkwo/DpcKbwp7DpsKXwo/DqMKHwqrDpsKywrvDpcK3wp4nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6TCuMK0w6XCpMKPw6XCuMKCJyxcbiAgICAgICAgICAgICfDpMK4wrTDpcKkwo/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrrCt8OkwrnCkMOlwo7CvycsXG4gICAgICAgICAgICAnw6bCsMK4w6nCncKWw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcK5wr/DpsKywrPDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwpLCjMOmwpTCv8Olwo7CvycsXG4gICAgICAgICAgICAnw6TCuMKcw6TCucKhw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDp8Knwq/Dp8KfwrPDpcKxwrHDpMK/wp3DpcKuwonDpsKXwo/DpMK4wpzDpMK5wqHDpsKXwo/DpsKSwpLDpsKLwonDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OnwpTCmMOlwo3Cl8OowpfCj8OmwpfCj8OowofCqsOmwrLCu8OlwrfCnicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCkMKIw6TCvcKcw6XCuMKCJywgJ8OkwrjCtMOmwr3CrcOlwo7CvycsICfDpcKNwpPDpcKwwrzDpcKOwr8nLCAnw6jCiMKfw6bCm8Kyw6XCjsK/JywgJ8Oowr/CrcOpwoPCqMOlwo7CvycsICfDp8KOwpvDpsKbwrLDpcKOwr8nLCAnw6fCosKMw6bCm8Kyw6XCjsK/JywgJ8OlwqTCj8OmwrLCs8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKFwrbDpMK7wpYnLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6nCncKSw6bCtcK3w6fCnMKBJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OowqXCv8Olwq7CgcOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCn8KOw6TCuMKtw6XCjMK6JywgJ8Olwp/CjsOkwrjCnMOlwozCuicsICfDpcKfwo7DqMKlwr/DpcKMwronLCAnw6XCn8KOw6XCjMKXw6XCjMK6JywgJ8OmwrnCn8OmwrrCkMOlwo7CvycsICfDpsK5wp/DpMK4wq3DpcKOwr8nLCAnw6XCpMKnw6nCgMKaw6XCm8Kew6bCl8KPw6XCnMKfw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrXCt8OkwrjCnMOlwpzCsMOlwozCuicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpcK5wrPDpcKuwonDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrnCkMOpwoPCvcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCsMKRw6XCksKMw6XCm8Kew6bCl8KPw6XCnMKfw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpMK6wpLDpcKKwqnDpcKcwp/DpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwozClsOpwprChsOlwpvCnsOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCvsKqw6XCjMKWw6bCksKSw6bCi8KJw6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsK1wrfDpcKMwpfDqMKXwo/DpsKXwo/DqMKHwqrDpsKywrvDpcK3wp4nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OmwrXCt8OmwpnCj8Olwo7CvycsICfDp8KlwoHDqMK/wp7DpcKOwr8nLCAnw6XCiMKaw6XCr8Kfw6XCjsK/JywgJ8OpwpfCqMOmwrrCkMOlwpvCnsOmwpfCj8OowofCqsOmwrLCu8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsK1wrfDpcKNwpfDqMKXwo/DpsKXwo/DqMKHwqrDpsKywrvDpcK3wp4nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoXCscOlwpLCjMOlwo7CvycsICfDpcKQwozDpcK+wrfDpcKOwr8nLCAnw6jCtMK1w6XCvsK3w6XCjsK/JywgJ8OlwoXCtMOmwrXCt8Olwo7CvycsICfDqMK0wrXDpcKNwpfDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCu8KEw6XCjcKXw6jCl8KPw6bCl8KPw6jCh8Kqw6bCssK7w6XCt8KeJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKQwozDpMK7woHDpcKOwr8nLCAnw6XCsMKWw6bCicKOw6XCjsK/JywgJ8OmwrPCvcOlwrrCk8Olwo7CvycsICfDpsKywrPDpcKNwpfDqMKSwpnDpcKPwqTDpsKXwo/DqMKHwqrDpsKywrvDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCnsKcw6bCtMKbw6jCl8KPw6bCl8KPw6jCh8Kqw6bCssK7w6XCt8KeJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDp8KOwpvDpsKywoHDpcKOwr8nLCAnw6fCj8Ktw6fCjsKbw6XCjsK/JywgJ8OnwpTCmMOlwr7Ct8Olwo7CvycsICfDqMK+wr7DpsKXwqXDpcKOwr8nLCAnw6TCucKFw6bCssK7w6XCjsK/JywgJ8Onwo7Cm8OlwqTCmsOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDp8KOwonDpsKgwpHDqMKXwo/DpsKXwo/DqMKHwqrDpsKywrvDpcK3wp4nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8Onwo7CicOmwqDCkcOlwo7CvycsICfDpsKdwoLDpcKkwprDpcKOwr8nLCAnw6fCp8Kww6XCpMKaw6XCjsK/JywgJ8OmwrLCu8OlwqTCmsOlwo7CvycsICfDpcKbworDqMKwwqbDpcKOwr8nLCAnw6bCm8Kyw6nCusK7w6jCjsKxw6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwrXCt8OowqXCv8OowpLCmcOlwo/CpMOmwpfCj8OowpfCj8OmwpfCj8OowofCqsOmwrLCu8OlwrfCnicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCvsK3w6TCu8Kkw6XCk8KIw6XCuMKCJywgJ8OmwqDCvMOlwrDClMOmwpzCqMOlwrjCgicsICfDpMK5wozDpcKFwrDDpcKOwr8nLCAnw6nCg8K9w6XChcKww6XCjsK/JywgJ8OlwqTCqcOlwrPCu8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKFwrbDpMK7wpYnLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6XCrsKBw6XCpMKPJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwpPCtsOlwrfCncOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XChcK0w6XCusKGw6XCjMK6JywgJ8OowqXCv8OlwqTCj8OlwozCuicsICfDqcKHwpHDpcKHwqTDpcKMwronLCAnw6fCgcK1w6bCrcKmw6XCuMKCJywgJ8OmwrDCuMOlwq7CgcOlwo7CvycsICfDqMK0wrrDpcKFwrDDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6fCn8Kzw6XCmMK0w6XCscKxw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKkwqfDpsKtwqbDpcKPwqPDpcKMwronLCAnw6bCg8Kgw6XChsKcw6XCjMK6JywgJ8OlwrnCs8Onwr3Cl8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKQwrTDpcK/wqDDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwojCqcOpwoDCmsOlwozCuicsICfDqcKdwpLDqcKTwpzDpcKzwqHDpcK4woInLCAnw6fCm8KQw6bCscKgw6XCjsK/JywgJ8OlwpDCjMOlwr/Cg8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKbwrrDpcKOwp/DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8Olwo7Cn8OlwrfCnsOlwozCuicsICfDqMKlwr/DpcKQwonDpcKOwr8nLCAnw6nCmsKGw6XCvsK3w6XCjsK/JywgJ8OmwrPCvsOmwrrCkMOlwo7CvycsICfDpcK9wq3DqcKYwrPDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCuMKtw6XCjcKrw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpsKywpnDpcKdwqHDpcKkwrTDpcKMwronLCAnw6TCuMKtw6XCrsKBw6XCjsK/JywgJ8OmwrXCt8Olwo7Cn8Olwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKFwrbDpMK7wpYnLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6bClsKww6fClsKGJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OkwrnCjMOpwrLCgcOmwpzCqMOpwr3CkMOlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpcKkwqnDpcKxwrHDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrLCmcOkwr7CncOlwrfCtMOlwoXCi8OlwozCuicsXG4gICAgICAgICAgICAnw6bClsKww6XCuMKCw6XCjMK6JyxcbiAgICAgICAgICAgICfDpsKwwrTDp8KjwqjDpsKywp/DpcKMwronLFxuICAgICAgICAgICAgJ8OlwqTCtMOlwrHCr8OmwrLCs8OlwozCuicsXG4gICAgICAgICAgICAnw6jCvsK+w6XCncKCw6XCn8KOw6XCjMK6JyxcbiAgICAgICAgICAgICfDpMK4wpzDpcKxwrHDpcKMwronLFxuICAgICAgICAgICAgJ8OkwrnCjMOpwrLCgcOmwpzCqMOpwr3CkMOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XChcKLw6bCi8KJw6fCjsKbw6TCvsKdw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKFwovDpsKLwonDp8KOwpvDpMK+wp3DpcKMwronLCAnw6fCi8Ksw6XCscKxw6XCrcKQw6XCjMK6JywgJ8OnwpnCvcOnwqLCscOmwrvCqcOlwozCuicsICfDpMK5wozDpcKwwpTDp8Kmwr7DpcKMwronLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XCkMKQw6nCssKBw6fClcKqw6XCnMKww6XCjMK6JyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKQwpDDqcKywoHDp8KVwqrDpcK4woInLCAnw6bCicKYw6XChcKLw6nCgMKKw6XCjsK/JywgJ8OpwoTCr8OlwpbChMOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKTwojDpcKvwobDpcKcwrDDpcKMwronLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwpPCiMOlwq/ChsOlwrjCgicsICfDpMK8worDpcKQwr7DpcKOwr8nLCAnw6XCt8K0w6nCh8KMw6XCncKkw6XCk8KIw6jCkMKow6XChcKLw6jCh8Kqw6bCssK7w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwpLCjMOnwpTCsMOlwpzCsMOlwozCuicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCksKMw6fClMKww6XCuMKCJywgJ8OlwpLCjMOnwpTCsMOlwo7CvycsICfDpsK0wpvDpsK1wqbDpcKOwr8nLCAnw6bCsMKRw6TCuMKww6XCjsK/JywgJ8OnwprCrsOlwrHCscOlwo7CvycsICfDp8KtwpbDpcKLwpLDpcKOwr8nLCAnw6TCusKOw6fClMKww6XCjsK/JywgJ8OlwqLCqMOnwo7CicOlwo7CvycsICfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKYwr/DpcKFwovDqMKLwo/DpcKcwrDDpcKMwronLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6nCmMK/w6XChcKLw6jCi8KPw6XCuMKCJyxcbiAgICAgICAgICAgICfDpsK4wqnDpcKuwr/DpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwrLCmcOpwpvChcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCi8Kcw6XCn8KOw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKYwr/Dp8KTwqbDpsKPwpDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrrCk8Oowr3CpsOlwo7CvycsXG4gICAgICAgICAgICAnw6bCn8Kvw6XCncKqw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKWwrDDpcKSwozDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrnCjMOkwrvCgMOlwo7CvycsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XClsKAw6TCu8KAw6XCnMKww6XCjMK6JyxcbiAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgJ8OlwpbCgMOkwrvCgMOlwrjCgicsXG4gICAgICAgICAgICAnw6XCt8K0w6bCpcKaw6XCjsK/JyxcbiAgICAgICAgICAgICfDpsKzwr3DpsKZwq7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrzCvcOlwrjCiMOlwo7CvycsXG4gICAgICAgICAgICAnw6XCj8K2w6XCn8KOw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKywrPDpsKZwq7DpsK5wpbDpcKOwr8nLFxuICAgICAgICAgICAgJ8OnwpbCj8OlwovCksOlwo7CvycsXG4gICAgICAgICAgICAnw6nCusKmw6fCm8KWw6bCj8KQw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMKLwrHDpcKQwonDpsKywpnDpcKOwr8nLFxuICAgICAgICAgICAgJ8Oowo7CjsOowr3CpsOlwo7CvycsXG4gICAgICAgICAgICAnw6fClsKPw6nCmcKEw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKhwpTDpMK7woDDpcK6wpPDpcKwwpTDpcK5wrLDpcKhwpTDpcKQwonDpcKFwovDqMKHwqrDpsKywrvDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwoXCi8Olwq3CnMOlwovCksOowovCj8Omwp/Cr8OlwrDClMOlwoXCi8Olwq3CnMOowofCqsOmwrLCu8OlwrfCnicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6nCmMK/w6XCm8K+w6TCu8KAw6XCuMKCJywgJ8OpwpjCv8OlwpDCiMOlwqXCh8Olwo7CvycsICfDpMK5wozDpsKBwrDDpcKOwr8nLCAnw6nCmMK/w6XChcKLw6nCmcK2w6XCjsK/JywgJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwrfCtMOpwp/Cs8OpwoPCrcOmwqXCnsOowpLCmcOlwo/CpMOowofCqsOmwrLCu8OlwrfCnicsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpcK6wpPDpcKwwpTDpcKLwpLDpcK4woInLFxuICAgICAgICAgICAgJ8OlwpLCjMOpwp3CmcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCsMKJw6fCisKBw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKSwozDp8KhwpXDpcKOwr8nLFxuICAgICAgICAgICAgJ8OkwrjClMOmwpzCq8Olwo7CvycsXG4gICAgICAgICAgICAnw6XCjcKaw6bCucKWw6XCjsK/JyxcbiAgICAgICAgICAgICfDqMK9wq7DpcKPwrDDpcKOwr8nLFxuICAgICAgICAgICAgJ8OowovCpcOnwr7CjMOlwo7CvycsXG4gICAgICAgICAgICAnw6fChMKJw6jCgMKGw6XCm8Kew6bCl8KPw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsKYwozDpcKQwonDpcKbwp7DpsKXwo/DqMKHwqrDpsKywrvDpcK3wp4nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6bCmMKMw6XCkMKJw6XCuMKCJyxcbiAgICAgICAgICAgICfDqcKYwpzDpcK6wrfDpcK4woInLFxuICAgICAgICAgICAgJ8OlwqXCh8Olwo/CsMOlwo7CvycsXG4gICAgICAgICAgICAnw6fCjsKbw6fCusKzw6bClsKvw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKQwonDpsKcwqjDqMKQwqjDpcKwwpTDpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwpHCvMOlwpvCvsOlwqPCgcOlwo7CvycsXG4gICAgICAgICAgICAnw6bCnMKow6XCnsKSw6XCk8KIw6jCkMKow6XChcKLw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDp8KxwrPDpsKzwonDpcK4woInLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Olwo3CmsOlwrDClMOlwqHClMOmwovCicOowpLCmcOlwo/CpMOowofCqsOmwrLCu8OlwrfCnicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCjcKaw6TCucKQw6XCuMKCJywgJ8OnwrLCvsOmwrLCs8Olwo7CvycsICfDpsK4wqnDpsKzwonDpcKOwr8nLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6fCn8Kzw6bCssKzw6XCrcKQJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDp8KfwrPDpsKywrPDpcKtwpAnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDqcKYwr/DpsKLwonDpcKwwpQnLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OpwpjCv8OmwovCicOlwrDClCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OlwpvCvsOmwpzCqMOowojCksOlwoXCiycsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XCm8K+w6bCnMKow6jCiMKSw6XChcKLJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6TCusKUw6XCrsK2w6bCuMKgJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpMK6wpTDpcKuwrbDpsK4wqAnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpMK8worDp8KKwoHDpcKTwojDqMKQwqjDpcKFwovDqMKHwqrDpsKywrvDpcK3wp4nLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6TCvMKKw6XCrsKBw6XCuMKCJyxcbiAgICAgICAgICAgICfDpcKlwo7DpcKxwq/DpcK4woInLFxuICAgICAgICAgICAgJ8OkwrzCisOlwq7CgcOlwo7CvycsXG4gICAgICAgICAgICAnw6fCicK5w6XChcKLw6bClsKvw6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKwwrzDpcKLwpLDpcKFwovDpcKOwr8nLFxuICAgICAgICAgICAgJ8OmwpjCrcOowovCj8Olwo7CvycsXG4gICAgICAgICAgICAnw6bClsKww6bCusKQw6XCjsK/JyxcbiAgICAgICAgICAgICfDqcKcwo3DpcKfwo7DpcKOwr8nLFxuICAgICAgICAgICAgJ8OlwrfCqcOnwpXCmcOlwo7CvycsXG4gICAgICAgICAgICAnw6XCr8Kfw6XCuMKDw6bCn8Klw6XCsMKUw6nClMKhw6TCvMKvw6jCh8Kqw6bCssK7w6XCjsK/JyxcbiAgICAgICAgICAgICfDpcKhwpTDpcKfwo7DpcKcwrDDpcKMwronLFxuICAgICAgICAgICAgJ8OpwpjCv8OlwovCksOmwrPCsMOlwpzCsMOlwozCuicsXG4gICAgICAgICAgICAnw6XChcK2w6TCu8KWJ1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6XChcK2w6TCu8KWJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ8Olwo/CsMOmwrnCvsOnwpzCgScsXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKPwrDDpcKMwpfDpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6XChsKFw6bCucKWw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKNwpfDpsK4wq/DpcKMwronLFxuICAgICAgICAgICAgJ8OkwrjCrcOmwq3Co8OlwozCuicsXG4gICAgICAgICAgICAnw6TCuMKHw6XCjcKOw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKkwqfDpcKQwozDpcKMwronLFxuICAgICAgICAgICAgJ8OkwrjCrcOlwrHCscOlwozCuicsXG4gICAgICAgICAgICAnw6bCncK+w6XCscKxw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKkwqfDpcKuwonDpcKMwronLFxuICAgICAgICAgICAgJ8Okwr/CocOkwrnCicOlwozCuicsXG4gICAgICAgICAgICAnw6bClsKHw6XCscKxw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKjwqvDpsKewpfDpcKMwronLFxuICAgICAgICAgICAgJ8OlwozCl8OmworClcOlwozCuidcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OmwpbCsMOlwozCl8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6bCncK/w6bCocKlw6XCjMK6JywgJ8OmwrHCkMOmwq3CosOlwozCuicsICfDpsKWwrDDpcK6wpfDpcKMwronLCAnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6bCocKDw6XCm8Ktw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpcKPwrDDpMK4wq3DpcK4woInLFxuICAgICAgICAgIGNoaWxkcmVuOiBbJ8OlwoXCtsOkwrvCliddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8Olwo/CsMOlwo3Cl8OlwrjCgicsXG4gICAgICAgICAgY2hpbGRyZW46IFsnw6XChcK2w6TCu8KWJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnw6nCq8KYw6nCm8KEw6XCuMKCJyxcbiAgICAgICAgICBjaGlsZHJlbjogWyfDpcKFwrbDpMK7wpYnXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ8Omwr7Cs8OpwpfCqCcsXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICfDpsK+wrPDqcKXwqgnLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAnw6jCisKxw6XCnMKww6fCjsKbw6XCoMKCw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKcwqPDpcKuwonDpcKkwprDpcKwwrzDpcKgwoLDpcKMwronLFxuICAgICAgICAgICAgJ8OlwqTCp8OlwqDCgsOlwozCuicsXG4gICAgICAgICAgICAnw6bCnMKbw6XCvsK3w6XCoMKCw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcKjwo7DqcKhwrrDpcKgwoLDpcKMwronLFxuICAgICAgICAgICAgJ8OlwpjCicOmwqjCocOlwqDCgsOlwozCuicsXG4gICAgICAgICAgICAnw6XCnMKjw6bClsK5w6bCtcKOw6XCkMKEw6XCoMKCw6XCjMK6JyxcbiAgICAgICAgICAgICfDqMK3wq/DpcKHwrwnLFxuICAgICAgICAgICAgJ8OlwoXCtsOkwrvClidcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnw6nCpsKZw6bCuMKvJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ8OpwqbCmcOmwrjCrycsXG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICfDpsK3wrHDpsKwwrTDpcKfwpfDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrLCucOlwrDClsOmwpfCusOlwozCuicsXG4gICAgICAgICAgICAnw6TCucKdw6nCvsKZw6XCn8KOw6XCjMK6JyxcbiAgICAgICAgICAgICfDqcK7woTDpcKkwqfDpMK7wpnDpcKMwronLFxuICAgICAgICAgICAgJ8OowqfCgsOlwqHCmMOlwozCuicsXG4gICAgICAgICAgICAnw6XCjMKXw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKkwqfDpcKfwpTDpcKMwronLFxuICAgICAgICAgICAgJ8OmwrLCmcOnwpTCsMOlwozCuicsXG4gICAgICAgICAgICAnw6jCpcK/w6jCtMKhw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKFwoPDpsKcwpfDpcKMwronLFxuICAgICAgICAgICAgJ8OlwrHCr8OpwpfCqMOlwozCuicsXG4gICAgICAgICAgICAnw6jCjcKDw6bCucK+w6XCjMK6JyxcbiAgICAgICAgICAgICfDqMKRwrXDqcKdwpLDpcKMwronLFxuICAgICAgICAgICAgJ8OnwqbCu8OlwrLCm8OlwozCuicsXG4gICAgICAgICAgICAnw6TCuMKtw6jCpcK/w6XCjMK6JyxcbiAgICAgICAgICAgICfDpsK5wr7DpMK7wpTDpcKMwronLFxuICAgICAgICAgICAgJ8OkwrjCnMOlwozCuicsXG4gICAgICAgICAgICAnw6XCjcKXw6XCjMK6JyxcbiAgICAgICAgICAgICfDpcKFwrbDpMK7wpYnXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICBdO1xufVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIEVsZW1lbnRSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPdXRwdXQsXG4gIE9uRGVzdHJveVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBpY2tlck9wdGlvbnMgfSBmcm9tICcuL3BpY2tlci1vcHRpb25zLnByb3ZpZGVyJztcbmltcG9ydCAqIGFzIGRhdGEgZnJvbSAnLi9kZW1vLWRhdGEvYWRkcmVzcy1kYXRhJztcbmltcG9ydCAqIGFzIHZlbG9jaXR5IGZyb20gJy4uL2NvcmUvdXRpbC92ZWxvY2l0eSc7XG5pbXBvcnQgKiBhcyB0b3VjaEV2ZW50IGZyb20gJy4uL2NvcmUvdXRpbC90b3VjaC1ldmVudCc7XG5pbXBvcnQgeyBMb2NhbGVQcm92aWRlclNlcnZpY2UgfSBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvbG9jYWxlLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdQaWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHRyYW5zaXRpb25OYW1lOiBzdHJpbmcgPSAnYW0tc2xpZGUtdXAtZW50ZXIgYW0tc2xpZGUtdXAtZW50ZXItYWN0aXZlJztcbiAgbWFza1RyYW5zaXRpb25OYW1lOiBzdHJpbmcgPSAnYW0tZmFkZS1lbnRlciBhbS1mYWRlLWVudGVyLWFjdGl2ZSc7XG4gIGFkZHJlc3M6IGFueVtdID0gZGF0YS5nZXREYXRhKCk7XG4gIHN0YXJ0WTogbnVtYmVyID0gMDtcbiAgZGlmZmVyWTogbnVtYmVyID0gMDtcbiAgY3VycmVudFk6IG51bWJlciA9IDA7XG4gIGxlbjogbnVtYmVyID0gMDtcbiAgZG9tOiBhbnkgPSBudWxsO1xuICBpbmRleDogbnVtYmVyID0gMDtcbiAgbWF4WTogbnVtYmVyID0gMDtcbiAgbGluZUhlaWdodDogbnVtYmVyID0gMzQ7XG4gIGRhdGE6IGFueVtdID0gW107XG4gIHNlbGVjdGVkVGFyZ2V0OiBhbnlbXSA9IFtdO1xuICBpc01vdXNlRG93bjogYm9vbGVhbiA9IGZhbHNlO1xuICBWZWxvY2l0eSA9IHZlbG9jaXR5LmdldFZlbG9jaXR5KCk7XG4gIGN1cnJlbnRQaWNrZXI6IGFueTtcblxuICBwcml2YXRlIF91bnN1YnNjcmliZSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3BpY2tlcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBwcml2YXRlIF9waWNrZXI6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgcGFuc3RhcnQoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2FtLXBpY2tlci1jb2wtbWFzaycpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNNb3VzZURvd24gPSB0cnVlO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kb20gPSB0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KS50YXJnZXQucGFyZW50RWxlbWVudC5jaGlsZHJlblsyXTtcbiAgICB0aGlzLmxlbiA9IHRoaXMuZG9tLmNoaWxkcmVuLmxlbmd0aDtcbiAgICB0aGlzLm1heFkgPSAtKHRoaXMubGVuIC0gMSk7XG5cbiAgICBpZiAodGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID09PSAndHJhbnNsYXRlWSgwcHgpJykge1xuICAgICAgdGhpcy5jdXJyZW50WSA9IDA7XG4gICAgICB0aGlzLm1heFkgPSAtKHRoaXMubGVuIC0gMSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFyZ2V0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0udGFyZ2V0SWQgPT09IGV2ZW50LnRhcmdldC5pZCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFkgPSBpdGVtLmN1cnJlbnRZO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGFydFkgPSB0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KS5jbGllbnRZO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgcGFubW92ZShldmVudCkge1xuICAgIGlmICghZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYW0tcGlja2VyLWNvbC1tYXNrJykgfHwgIXRoaXMuaXNNb3VzZURvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBldiA9IHRvdWNoRXZlbnQuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpO1xuICAgIHRoaXMuZGlmZmVyWSA9IGV2LmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICB0aGlzLlZlbG9jaXR5LnJlY29yZCh0aGlzLmRpZmZlclkpO1xuICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtIDBzJztcbiAgICB0aGlzLmRvbS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RoaXMuY3VycmVudFkgKiB0aGlzLmxpbmVIZWlnaHQgKyB0aGlzLmRpZmZlcll9cHgpYDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNldXAnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hlbmQnLCBbJyRldmVudCddKVxuICBwYW5lbmQoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2FtLXBpY2tlci1jb2wtbWFzaycpIHx8ICF0aGlzLmlzTW91c2VEb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGV2ID0gdG91Y2hFdmVudC5nZXRFdmVudFRhcmdldChldmVudCk7XG4gICAgdGhpcy5kaWZmZXJZID0gZXYuY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xuICAgIGxldCB0aW1lID0gMC4zO1xuICAgIGNvbnN0IHZlbG9jaXR5VGVtcCA9IHRoaXMuVmVsb2NpdHkuZ2V0VmVsb2NpdHkodGhpcy5kaWZmZXJZKSAqIDQ7XG4gICAgaWYgKHZlbG9jaXR5KSB7XG4gICAgICB0aGlzLmRpZmZlclkgPSB2ZWxvY2l0eVRlbXAgKiA0MCArIHRoaXMuZGlmZmVyWTtcbiAgICAgIHRpbWUgPSBNYXRoLmFicyh2ZWxvY2l0eVRlbXApICogMC4xO1xuICAgIH1cbiAgICB0aGlzLmRvbS5zdHlsZS50cmFuc2l0aW9uID0gJ3RyYW5zZm9ybSAnICsgKHRpbWUgPCAwLjMgPyAwLjMgOiB0aW1lKSArICdzJztcbiAgICBpZiAodGhpcy5kaWZmZXJZIDw9IC10aGlzLmxpbmVIZWlnaHQgLyAyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRZICs9IE1hdGguZmxvb3IodGhpcy5kaWZmZXJZIC8gdGhpcy5saW5lSGVpZ2h0KTtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRZIDw9IHRoaXMubWF4WSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRZID0gdGhpcy5tYXhZO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5kaWZmZXJZID49IHRoaXMubGluZUhlaWdodCAvIDIpIHtcbiAgICAgIHRoaXMuY3VycmVudFkgKz0gTWF0aC5mbG9vcih0aGlzLmRpZmZlclkgLyB0aGlzLmxpbmVIZWlnaHQpO1xuICAgICAgaWYgKHRoaXMuY3VycmVudFkgPj0gMCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRZID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYXJnZXQubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGhhc0tleSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS50YXJnZXRJZCA9PT0gZXZlbnQudGFyZ2V0LmlkKSB7XG4gICAgICAgICAgaGFzS2V5ID0gdHJ1ZTtcbiAgICAgICAgICBpdGVtLnRhcmdldElkID0gZXZlbnQudGFyZ2V0LmlkO1xuICAgICAgICAgIGl0ZW0uY3VycmVudFkgPSB0aGlzLmN1cnJlbnRZO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlSW50KGl0ZW0udGFyZ2V0SWQsIDApID4gcGFyc2VJbnQoZXZlbnQudGFyZ2V0LmlkLCAwKSAmJiB0aGlzLm9wdGlvbnMuY2FzY2FkZSkge1xuICAgICAgICAgIGl0ZW0uY3VycmVudFkgPSAwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQucHVzaCh7IHRhcmdldElkOiBldmVudC50YXJnZXQuaWQsIGN1cnJlbnRZOiB0aGlzLmN1cnJlbnRZIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0LnB1c2goeyB0YXJnZXRJZDogZXZlbnQudGFyZ2V0LmlkLCBjdXJyZW50WTogdGhpcy5jdXJyZW50WSB9KTtcbiAgICB9XG4gICAgdGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHt0aGlzLmN1cnJlbnRZICogdGhpcy5saW5lSGVpZ2h0fXB4KWA7XG4gICAgdGhpcy5pbmRleCA9IE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5jdXJyZW50WSAvIDEpKTtcbiAgICB0aGlzLnNldEN1cnJlbnRTZWxlY3RlZChwYXJzZUludChldmVudC50YXJnZXQuaWQsIDApLCB0aGlzLmluZGV4KTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5jb21iaW5lUmVzbHV0KCkpO1xuICAgIHRoaXMub3B0aW9ucy5vblBpY2tlckNoYW5nZS5lbWl0KHRoaXMuY29tYmluZVJlc2x1dCgpKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwdWJsaWMgb3B0aW9uczogUGlja2VyT3B0aW9ucywgcHJpdmF0ZSBfbG9jYWxlUHJvdmlkZXJTZXJ2aWNlOiBMb2NhbGVQcm92aWRlclNlcnZpY2UpIHtcbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuYWRkcmVzcyA9IHRoaXMub3B0aW9ucy5kYXRhO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQgPSBbXTtcbiAgICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmRhdGEucHVzaCh0aGlzLmdlbmVyYXRlQXJyYXlEYXRhKHRoaXMuYWRkcmVzcykpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5nZXRJbml0VmFsdWVJbmRleCh0aGlzLmRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoZWNrQXJyYXlEZWVwKHRoaXMuYWRkcmVzc1swXSk7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5kYXRhLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0LnB1c2goeyB0YXJnZXRJZDogYCR7aW5kZXh9YCwgY3VycmVudFk6IDAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0SW5pdFZhbHVlSW5kZXgoZGF0YVRlbXApIHtcbiAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0ID0gW107XG4gICAgdGhpcy5vcHRpb25zLnZhbHVlLmZvckVhY2goKGVsZW1lbnQsIGkpID0+IHtcbiAgICAgIGRhdGFUZW1wLmZvckVhY2goKGl0ZW0sIGopID0+IHtcbiAgICAgICAgaXRlbS5mb3JFYWNoKChpdGVtMSwgaykgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50ID09PSAoaXRlbTEubGFiZWwgfHwgaXRlbTEpICYmIGkgPT09IGopIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tBcnJheURlZXAodGhpcy5kYXRhW2ldW2tdLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0LnB1c2goeyB0YXJnZXRJZDogYCR7aX1gLCBjdXJyZW50WTogLWsgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmVsb2FkUGlja2VyKCkge1xuICAgIGlmICghdGhpcy5fcGlja2VyIHx8IHRoaXMuX3BpY2tlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFBpY2tlciA9IHRoaXMuX3BpY2tlci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuY3VycmVudFBpY2tlciAmJiB0aGlzLmN1cnJlbnRQaWNrZXIuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgc2VsZi5zZWxlY3RlZFRhcmdldC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgc2VsZi5jdXJyZW50UGlja2VyLmNoaWxkcmVuW2ldLmNoaWxkcmVuWzJdLnN0eWxlLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtIC4zcyc7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChpdGVtLmN1cnJlbnRZLCAwKTtcbiAgICAgICAgICBzZWxmLmN1cnJlbnRQaWNrZXIuY2hpbGRyZW5baV0uY2hpbGRyZW5bMl0uc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHtpbmRleCAqIHNlbGYubGluZUhlaWdodH1weClgO1xuICAgICAgICB9KTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlQXJyYXlEYXRhKHRhcmdldEFycikge1xuICAgIGNvbnN0IHRlbXBBcnIgPSBbXTtcbiAgICBpZiAodGFyZ2V0QXJyIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHRhcmdldEFyci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbSk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHt9O1xuICAgICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudFtrZXldID0gdGFyZ2V0QXJyW2ldW2tleV0gfHwgdGFyZ2V0QXJyW2ldO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRlbXBBcnIucHVzaChlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW1wQXJyLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRlbXBBcnI7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNoZWNrQXJyYXlEZWVwKHBhcmVudCwgaW5pdDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgT2JqZWN0ICYmIHBhcmVudC5jaGlsZHJlbiAmJiBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHRoaXMuZ2VuZXJhdGVBcnJheURhdGEocGFyZW50LmNoaWxkcmVuKS5sZW5ndGggPiAwICYmIHRoaXMuZGF0YS5sZW5ndGggPCB0aGlzLm9wdGlvbnMuY29scykge1xuICAgICAgICB0aGlzLmRhdGEucHVzaCh0aGlzLmdlbmVyYXRlQXJyYXlEYXRhKHBhcmVudC5jaGlsZHJlbikpO1xuICAgICAgICBpZiAoaW5pdCkge1xuICAgICAgICAgIHRoaXMuY2hlY2tBcnJheURlZXAocGFyZW50LmNoaWxkcmVuWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9rKCkge1xuICAgIHRoaXMub3B0aW9ucy5vbk9rLmVtaXQodGhpcy5jb21iaW5lUmVzbHV0KCkpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY29uZmlybSkge1xuICAgICAgdGhpcy5vcHRpb25zLmNvbmZpcm0odGhpcy5jb21iaW5lUmVzbHV0KCkpO1xuICAgIH1cbiAgICB0aGlzLnNldFRyYW5zaXRpb25OYW1lKCk7XG4gIH1cblxuICBjb21iaW5lUmVzbHV0KCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZGF0YVtwYXJzZUludChpdGVtLnRhcmdldElkLCAwKV1bLWl0ZW0uY3VycmVudFldKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuc2V0VHJhbnNpdGlvbk5hbWUoKTtcbiAgICB0aGlzLm9wdGlvbnMub25EaXNtaXNzLmVtaXQoKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNhbmNlbCkge1xuICAgICAgdGhpcy5vcHRpb25zLmNhbmNlbCgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFRyYW5zaXRpb25OYW1lKCkge1xuICAgIHRoaXMudHJhbnNpdGlvbk5hbWUgPSAnYW0tc2xpZGUtdXAtbGVhdmUgYW0tc2xpZGUtdXAtbGVhdmUtYWN0aXZlJztcbiAgICB0aGlzLm1hc2tUcmFuc2l0aW9uTmFtZSA9ICdhbS1mYWRlLWxlYXZlIGFtLWZhZGUtbGVhdmUtYWN0aXZlJztcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMub3B0aW9ucy5oaWRlUGlja2VyKCk7XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIHNldEN1cnJlbnRTZWxlY3RlZCh0YXJnZXQsIGluZGV4KSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuY2FzY2FkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhID0gdGhpcy5kYXRhLnNsaWNlKDAsIHRhcmdldCArIDEpO1xuICAgIHRoaXMuZGF0YSA9IGE7XG4gICAgdGhpcy5jaGVja0FycmF5RGVlcCh0aGlzLmRhdGFbdGFyZ2V0XVtpbmRleF0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYCR7aX1gICYmIGkgPiB0YXJnZXQpIHtcbiAgICAgICAgICB0aGlzLl9waWNrZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuW2ldLmNoaWxkcmVuWzJdLnN0eWxlLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtIC4zcyc7XG4gICAgICAgICAgdGhpcy5fcGlja2VyLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZHJlbltpXS5jaGlsZHJlblsyXS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWSgwcHgpJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgICB0aGlzLl9sb2NhbGVQcm92aWRlclNlcnZpY2UubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlJCkpLnN1YnNjcmliZShfID0+IHtcbiAgICAgIGNvbnN0IGxvY2FsZTogYW55ID0gdGhpcy5fbG9jYWxlUHJvdmlkZXJTZXJ2aWNlLmdldExvY2FsZVN1Yk9iaignUGlja2VyJyk7XG4gICAgICB0aGlzLm9wdGlvbnMub2tUZXh0ID0gbG9jYWxlLm9rVGV4dDtcbiAgICAgIHRoaXMub3B0aW9ucy5kaXNtaXNzVGV4dCA9IGxvY2FsZS5kaXNtaXNzVGV4dDtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnJlbG9hZFBpY2tlcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLl91bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgQ29tcG9uZW50UmVmLFxuICBPbkRlc3Ryb3ksXG4gIEVsZW1lbnRSZWYsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBJbmplY3RvcixcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBSZW5kZXJlcjIsXG4gIENvbXBvbmVudEZhY3RvcnksXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL3BpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGlja2VyT3B0aW9ucyB9IGZyb20gJy4vcGlja2VyLW9wdGlvbnMucHJvdmlkZXInO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbUGlja2VyXSwgW256bS1waWNrZXJdJ1xufSlcbmV4cG9ydCBjbGFzcyBQaWNrZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgT25Jbml0IHtcbiAgcGlja2VyOiBDb21wb25lbnRSZWY8UGlja2VyQ29tcG9uZW50PjtcbiAgcHJpdmF0ZSBfZXZlbnRMaXN0ZW5lcnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgQElucHV0KClcbiAgZGF0YTogQXJyYXk8YW55PjtcbiAgQElucHV0KClcbiAgdmFsdWU6IEFycmF5PGFueT47XG4gIEBJbnB1dCgpXG4gIGNvbHM6IE51bWJlcjtcbiAgQElucHV0KClcbiAgbWFzazogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgdGl0bGU6IHN0cmluZztcbiAgQElucHV0KClcbiAgdmlzaWJsZTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgb2tUZXh0OiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIGRpc21pc3NUZXh0OiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIGRpc2FibGVkOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBjYXNjYWRlOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBhcHBlbmRUb0JvZHk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIGluZGljYXRvclN0eWxlOiBvYmplY3Q7XG4gIEBPdXRwdXQoKVxuICBvblZpc2libGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIodHJ1ZSk7XG4gIEBPdXRwdXQoKVxuICBvblBpY2tlckNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKVxuICBvbk9rOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIG9uRGlzbWlzczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICB0b2dnbGVQaWNrZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBpY2tlcikge1xuICAgICAgdGhpcy5zaG93UGlja2VyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZVBpY2tlcigpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBfZWxtOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgX2RlZmF1bHRPcHRpb25zOiBQaWNrZXJPcHRpb25zLFxuICAgIHByaXZhdGUgX2NmcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjJcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLmlzT3Blbikge1xuICAgICAgaWYgKGNoYW5nZXMuaXNPcGVuLmN1cnJlbnRWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnNob3dQaWNrZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlkZVBpY2tlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuaGlkZVBpY2tlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5waWNrZXIgJiZcbiAgICAgICF0aGlzLl9lbG0ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpICYmXG4gICAgICAhdGhpcy5waWNrZXIubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpXG4gICAgKSB7XG4gICAgICB0aGlzLmhpZGVQaWNrZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3dQaWNrZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBpY2tlcikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzID0gW1xuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAnY2xpY2snLCAoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLm9uRG9jdW1lbnRDbGljayhldmVudCkpLFxuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAndG91Y2hlbmQnLCAoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLm9uRG9jdW1lbnRDbGljayhldmVudCkpXG4gICAgICAgIF07XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IG5ldyBQaWNrZXJPcHRpb25zKCk7XG4gICAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHRoaXMuX2RlZmF1bHRPcHRpb25zLCB7XG4gICAgICAgIGhpZGVQaWNrZXI6IChldmVudCk6IHZvaWQgPT4ge1xuICAgICAgICAgIHRoaXMuaGlkZVBpY2tlcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3B0aW9uYWxQYXJhbXM6IEFycmF5PGtleW9mIFBpY2tlckRpcmVjdGl2ZT4gPSBbXG4gICAgICAgICdkYXRhJyxcbiAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgJ2NvbHMnLFxuICAgICAgICAnbWFzaycsXG4gICAgICAgICd0aXRsZScsXG4gICAgICAgICdva1RleHQnLFxuICAgICAgICAnZGlzbWlzc1RleHQnLFxuICAgICAgICAnZGlzYWJsZWQnLFxuICAgICAgICAnY2FzY2FkZScsXG4gICAgICAgICdhcHBlbmRUb0JvZHknLFxuICAgICAgICAnaW5kaWNhdG9yU3R5bGUnLFxuICAgICAgICAnb25PaycsXG4gICAgICAgICdvblBpY2tlckNoYW5nZSdcbiAgICAgIF07XG4gICAgICBvcHRpb25hbFBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzW3BhcmFtXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAob3B0aW9ucyBhcyBhbnkpW3BhcmFtXSA9IHRoaXNbcGFyYW1dO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8UGlja2VyQ29tcG9uZW50PiA9IHRoaXMuX2Nmci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShQaWNrZXJDb21wb25lbnQpO1xuICAgICAgY29uc3QgY2hpbGRJbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZShbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBQaWNrZXJPcHRpb25zLFxuICAgICAgICAgIHVzZVZhbHVlOiBvcHRpb25zXG4gICAgICAgIH1cbiAgICAgIF0pO1xuICAgICAgdGhpcy5waWNrZXIgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChcbiAgICAgICAgY29tcG9uZW50RmFjdG9yeSxcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5sZW5ndGgsXG4gICAgICAgIGNoaWxkSW5qZWN0b3JcbiAgICAgICk7XG4gICAgICBpZiAob3B0aW9ucy5hcHBlbmRUb0JvZHkpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnBpY2tlci5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoaWRlUGlja2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBpY2tlcikge1xuICAgICAgdGhpcy5waWNrZXIuZGVzdHJveSgpO1xuICAgICAgZGVsZXRlIHRoaXMucGlja2VyO1xuICAgICAgdGhpcy5vblZpc2libGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICB0aGlzLl9ldmVudExpc3RlbmVycy5mb3JFYWNoKGZuID0+IGZuKCkpO1xuICAgICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBpY2tlckRpcmVjdGl2ZSB9IGZyb20gJy4vcGlja2VyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBQaWNrZXJPcHRpb25zIH0gZnJvbSAnLi9waWNrZXItb3B0aW9ucy5wcm92aWRlcic7XG5pbXBvcnQgeyBDb3JlTW9kdWxlIH0gZnJvbSAnLi4vY29yZS9jb3JlLm1vZHVsZSc7XG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBDb3JlTW9kdWxlXSxcbiAgZXhwb3J0czogW1BpY2tlckNvbXBvbmVudCwgUGlja2VyRGlyZWN0aXZlXSxcbiAgZGVjbGFyYXRpb25zOiBbUGlja2VyQ29tcG9uZW50LCBQaWNrZXJEaXJlY3RpdmVdLFxuICBwcm92aWRlcnM6IFtQaWNrZXJPcHRpb25zXSxcbiAgZW50cnlDb21wb25lbnRzOiBbUGlja2VyQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBQaWNrZXJNb2R1bGUge31cbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbiwgQWZ0ZXJWaWV3SW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi9waWNrZXIvcGlja2VyLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1BpY2tlclZpZXcsIG56bS1waWNrZXItdmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9waWNrZXItdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgUGlja2VyVmlld0NvbXBvbmVudCBleHRlbmRzIFBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIG9wdGlvbnM7XG4gIEBJbnB1dCgpXG4gIGRhdGE6IEFycmF5PGFueT4gPSBbXTtcbiAgQElucHV0KClcbiAgdmFsdWU6IEFycmF5PGFueT4gPSBbXTtcbiAgQElucHV0KClcbiAgY29sczogbnVtYmVyID0gMztcbiAgQElucHV0KClcbiAgY2FzY2FkZTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgaW5kaWNhdG9yU3R5bGU6IG9iamVjdCA9IHt9O1xuICBASW5wdXQoKVxuICBpdGVtU3R5bGU6IG9iamVjdCA9IHt9O1xuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHBpY2tlclZpZXdJbml0KCkge1xuICAgIHRoaXMub3B0aW9ucy5kYXRhID0gdGhpcy5kYXRhO1xuICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgdGhpcy5vcHRpb25zLmNvbHMgPSB0aGlzLmNvbHM7XG4gICAgdGhpcy5vcHRpb25zLmNhc2NhZGUgPSB0aGlzLmNhc2NhZGU7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnBpY2tlclZpZXdJbml0KCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jdXJyZW50UGlja2VyID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5yZWxvYWRQaWNrZXIoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBQaWNrZXJWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi9waWNrZXItdmlldy5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlXG4gIF0sXG4gIGV4cG9ydHM6IFtQaWNrZXJWaWV3Q29tcG9uZW50XSxcbiAgZGVjbGFyYXRpb25zOiBbUGlja2VyVmlld0NvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgUGlja2VyVmlld01vZHVsZSB7IH1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50VHlwZSB7XG4gIHR5cGU6IHN0cmluZzsgLy8gJ2ltZycgfCAnc2VsZWN0JyB8ICd3aGl0ZSdcbiAgYmFja2dyb3VuZEltYWdlOiBzdHJpbmc7XG4gIHRyYW5zZm9ybTogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdJbWFnZVBpY2tlciwgbnptLWltYWdlLXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbWFnZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlUGlja2VyIHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0taW1hZ2UtcGlja2VyJztcbiAgZmxleEVsOiBFbGVtZW50VHlwZVtdW10gPSBbXTtcblxuICBwcml2YXRlIF9hY2NlcHQ6IHN0cmluZyA9ICdpbWFnZS8qJztcbiAgcHJpdmF0ZSBfY291bnQ6IG51bWJlciA9IDQ7XG4gIHByaXZhdGUgX3NlbGVjdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9maWxlczogQXJyYXk8YW55PiA9IFtdO1xuICBwcml2YXRlIF9tdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVTZWxlY3RvcklucHV0JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIHByaXZhdGUgX2ZpbGVTZWxlY3RvcklucHV0OiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBmaWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZXM7XG4gIH1cbiAgc2V0IGZpbGVzKHZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5fZmlsZXMgPSB2YWx1ZTtcbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGFjY2VwdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hY2NlcHQ7XG4gIH1cbiAgc2V0IGFjY2VwdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYWNjZXB0ID0gdmFsdWU7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY291bnQ7XG4gIH1cbiAgc2V0IGxlbmd0aCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlID4gMCkge1xuICAgICAgdGhpcy5fY291bnQgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY291bnQgPSA0O1xuICAgIH1cbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IG11bHRpcGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9tdWx0aXBsZTtcbiAgfVxuICBzZXQgbXVsdGlwbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9tdWx0aXBsZSA9IHZhbHVlO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0YWJsZTtcbiAgfVxuICBzZXQgc2VsZWN0YWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlbGVjdGFibGUgPSB2YWx1ZTtcbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uRmFpbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKVxuICBvbkltYWdlQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgb25BZGRJbWFnZUNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc29ydEl0ZW0oKSB7XG4gICAgaWYgKCF0aGlzLl9maWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgY291bnQgPSBwYXJzZUludCgnJyArIHRoaXMuX2NvdW50LCAxMCk7XG4gICAgaWYgKGNvdW50IDw9IDApIHtcbiAgICAgIGNvdW50ID0gNDtcbiAgICB9XG4gICAgbGV0IGFsbEVsOiBFbGVtZW50VHlwZVtdID0gdGhpcy5fZmlsZXMubWFwKGl0ZW0gPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2ltZycsXG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJ3VybCgnICsgaXRlbS51cmwgKyAnKScsXG4gICAgICAgIHRyYW5zZm9ybTogJ3JvdGF0ZSgnICsgdGhpcy5nZXRSb3RhdGlvbihpdGVtLm9yaWVudGF0aW9uKSArICcpZGVnJ1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5fc2VsZWN0YWJsZSkge1xuICAgICAgYWxsRWwucHVzaCh7XG4gICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICcnLFxuICAgICAgICB0cmFuc2Zvcm06ICcnXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgbGVuZ3RoID0gYWxsRWwubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggIT09IDAgJiYgbGVuZ3RoICUgY291bnQgIT09IDApIHtcbiAgICAgIGNvbnN0IGJsYW5rQ291bnQgPSBjb3VudCAtIChsZW5ndGggJSBjb3VudCk7XG4gICAgICBjb25zdCBmaWxsQmxhbmtFbDogYW55W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxhbmtDb3VudDsgaSsrKSB7XG4gICAgICAgIGZpbGxCbGFua0VsLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICd3aGl0ZScsXG4gICAgICAgICAgYmFja2dyb3VuZEltYWdlOiAnJyxcbiAgICAgICAgICB0cmFuc2Zvcm06ICcnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYWxsRWwgPSBhbGxFbC5jb25jYXQoZmlsbEJsYW5rRWwpO1xuICAgIH1cbiAgICB0aGlzLmZsZXhFbCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsRWwubGVuZ3RoIC8gY291bnQ7IGkrKykge1xuICAgICAgY29uc3Qgcm93RWwgPSBhbGxFbC5zbGljZShpICogY291bnQsIGkgKiBjb3VudCArIGNvdW50KTtcbiAgICAgIHRoaXMuZmxleEVsLnB1c2gocm93RWwpO1xuICAgIH1cbiAgfVxuXG4gIGFkZEltYWdlKGltZ0l0ZW06IGFueSkge1xuICAgIHRoaXMuX2ZpbGVzLnB1c2goe1xuICAgICAgdHlwZTogJ2ltZycsXG4gICAgICB1cmw6IGltZ0l0ZW0udXJsLFxuICAgICAgb3JpZW50YXRpb246IGltZ0l0ZW0ub3JpZW50YXRpb25cbiAgICB9KTtcbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHtcbiAgICAgIGZpbGVzOiB0aGlzLl9maWxlcyxcbiAgICAgIG9wZXJhdGlvblR5cGU6ICdhZGQnLFxuICAgICAgaW5kZXg6IHRoaXMuX2ZpbGVzLmxlbmd0aCAtIDFcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUltYWdlKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9maWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoe1xuICAgICAgZmlsZXM6IHRoaXMuX2ZpbGVzLFxuICAgICAgb3BlcmF0aW9uVHlwZTogJ3JlbW92ZScsXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9KTtcbiAgfVxuXG4gIGltYWdlQ2xpY2soaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMub25JbWFnZUNsaWNrLmVtaXQoe1xuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgZmlsZXM6IHRoaXMuX2ZpbGVzXG4gICAgfSk7XG4gIH1cblxuICBhZGRJbWFnZUNsaWNrKGUpIHtcbiAgICB0aGlzLm9uQWRkSW1hZ2VDbGljay5lbWl0KGUpO1xuICB9XG5cbiAgcGFyc2VGaWxlKGZpbGU6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgY29uc3QgZGF0YVVSTCA9IChlLnRhcmdldCBhcyBhbnkpLnJlc3VsdDtcbiAgICAgIGlmICghZGF0YVVSTCkge1xuICAgICAgICB0aGlzLm9uRmFpbC5lbWl0KGBGYWlsIHRvIGdldCB0aGUgJHtpbmRleH0gaW1hZ2VgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgb3JpZW50YXRpb24gPSAxO1xuICAgICAgdGhpcy5nZXRPcmllbnRhdGlvbihmaWxlLCByZXMgPT4ge1xuICAgICAgICAvLyAtMjogbm90IGpwZWcgLCAtMTogbm90IGRlZmluZWRcbiAgICAgICAgaWYgKHJlcyA+IDApIHtcbiAgICAgICAgICBvcmllbnRhdGlvbiA9IHJlcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZEltYWdlKHtcbiAgICAgICAgICB1cmw6IGRhdGFVUkwsXG4gICAgICAgICAgb3JpZW50YXRpb24sXG4gICAgICAgICAgZmlsZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gIH1cblxuICBmaWxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgY29uc3QgZmlsZUxpc3Q6IEZpbGVMaXN0ID0gZXZlbnQudGFyZ2V0LmZpbGVzO1xuICAgIGlmIChmaWxlTGlzdCAmJiBmaWxlTGlzdC5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5wYXJzZUZpbGUoZmlsZUxpc3RbaV0sIGkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFJvdGF0aW9uKG9yaWVudGF0aW9uID0gMSkge1xuICAgIGxldCBpbWdSb3RhdGlvbiA9IDA7XG4gICAgc3dpdGNoIChvcmllbnRhdGlvbikge1xuICAgICAgY2FzZSAzOlxuICAgICAgICBpbWdSb3RhdGlvbiA9IDE4MDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY6XG4gICAgICAgIGltZ1JvdGF0aW9uID0gOTA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICBpbWdSb3RhdGlvbiA9IDI3MDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgICByZXR1cm4gaW1nUm90YXRpb247XG4gIH1cblxuICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc1ODQ3OTQvYWNjZXNzaW5nLWpwZWctZXhpZi1yb3RhdGlvbi1kYXRhLWluLWphdmFzY3JpcHQtb24tdGhlLWNsaWVudC1zaWRlXG4gIGdldE9yaWVudGF0aW9uKGZpbGU6IGFueSwgY2FsbGJhY2s6IChfOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSBlID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoKGUudGFyZ2V0IGFzIGFueSkucmVzdWx0KTtcbiAgICAgIGlmICh2aWV3LmdldFVpbnQxNigwLCBmYWxzZSkgIT09IDB4ZmZkOCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soLTIpO1xuICAgICAgfVxuICAgICAgY29uc3QgbGVuZ3RoID0gdmlldy5ieXRlTGVuZ3RoO1xuICAgICAgbGV0IG9mZnNldCA9IDI7XG4gICAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG1hcmtlciA9IHZpZXcuZ2V0VWludDE2KG9mZnNldCwgZmFsc2UpO1xuICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgaWYgKG1hcmtlciA9PT0gMHhmZmUxKSB7XG4gICAgICAgICAgY29uc3QgdG1wID0gdmlldy5nZXRVaW50MzIoKG9mZnNldCArPSAyKSwgZmFsc2UpO1xuICAgICAgICAgIGlmICh0bXAgIT09IDB4NDU3ODY5NjYpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGxpdHRsZSA9IHZpZXcuZ2V0VWludDE2KChvZmZzZXQgKz0gNiksIGZhbHNlKSA9PT0gMHg0OTQ5O1xuICAgICAgICAgIG9mZnNldCArPSB2aWV3LmdldFVpbnQzMihvZmZzZXQgKyA0LCBsaXR0bGUpO1xuICAgICAgICAgIGNvbnN0IHRhZ3MgPSB2aWV3LmdldFVpbnQxNihvZmZzZXQsIGxpdHRsZSk7XG4gICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdzOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh2aWV3LmdldFVpbnQxNihvZmZzZXQgKyBpICogMTIsIGxpdHRsZSkgPT09IDB4MDExMikge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sodmlldy5nZXRVaW50MTYob2Zmc2V0ICsgaSAqIDEyICsgOCwgbGl0dGxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKChtYXJrZXIgJiAweGZmMDApICE9PSAweGZmMDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXQgKz0gdmlldy5nZXRVaW50MTYob2Zmc2V0LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjYWxsYmFjaygtMSk7XG4gICAgfTtcbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZS5zbGljZSgwLCA2NCAqIDEwMjQpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEltYWdlUGlja2VyIH0gZnJvbSAnLi9pbWFnZS1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEZsZXhNb2R1bGUgfSBmcm9tICcuLi9mbGV4L2ZsZXgubW9kdWxlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW0ltYWdlUGlja2VyXSxcbiAgZXhwb3J0czogW0ltYWdlUGlja2VyXSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRmxleE1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgSW1hZ2VQaWNrZXJNb2R1bGUge31cbiIsImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgVGVtcGxhdGVSZWYsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1Jlc3VsdCwgbnptLXJlc3VsdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXN1bHQuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFJlc3VsdCB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLXJlc3VsdCc7XG4gIGlzVGl0bGVTdHJpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBpc01lc3NhZ2VTdHJpbmc6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgX3RpdGxlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICBwcml2YXRlIF9tZXNzYWdlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBJbnB1dCgpXG4gIGdldCB0aXRsZSgpOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fdGl0bGU7XG4gIH1cbiAgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgaWYgKHRoaXMuaXNUZW1wbGF0ZVJlZih2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNUaXRsZVN0cmluZyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzVGl0bGVTdHJpbmcgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl90aXRsZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGltZ1VybDogc3RyaW5nO1xuICBASW5wdXQoKVxuICBidXR0b25UZXh0OiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIGJ1dHRvblR5cGU6IHN0cmluZztcbiAgQElucHV0KClcbiAgaW1nOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKVxuICBnZXQgbWVzc2FnZSgpOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZTtcbiAgfVxuICBzZXQgbWVzc2FnZSh2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIGlmICh0aGlzLmlzVGVtcGxhdGVSZWYodmFsdWUpKSB7XG4gICAgICB0aGlzLmlzTWVzc2FnZVN0cmluZyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzTWVzc2FnZVN0cmluZyA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX21lc3NhZ2UgPSB2YWx1ZTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25CdXR0b25DbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICByb2xlOiBzdHJpbmcgPSAnYWxlcnQnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXJlc3VsdCcpXG4gIGFtUmVzdWx0OiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgYnV0dG9uQ2xpY2soZXZlbnQpIHtcbiAgICB0aGlzLm9uQnV0dG9uQ2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICBpc1RlbXBsYXRlUmVmKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVzdWx0IH0gZnJvbSAnLi9yZXN1bHQuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJY29uTW9kdWxlIH0gZnJvbSAnLi4vaWNvbi9pY29uLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1Jlc3VsdF0sXG4gIGV4cG9ydHM6IFtSZXN1bHRdLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJY29uTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBSZXN1bHRNb2R1bGUge31cbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1JhbmdlICwgbnptLXJhbmdlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JhbmdlLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBSYW5nZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLXNsaWRlcic7XG4gIG9mZnNldDogYW55W10gPSBbXTtcbiAgbGVuZ3RoOiBhbnlbXSA9IFtdO1xuICB1cHBlckJvdW5kOiBudW1iZXI7XG4gIGxvd2VyQm91bmQ6IG51bWJlcjtcbiAgbWF4Qm91bmQ6IG51bWJlcltdO1xuICBtaW5Cb3VuZDogbnVtYmVyW107XG4gIHNsaWRlckNsczogb2JqZWN0O1xuICBzbGlkZXJMZW5ndGg6IG51bWJlcjtcbiAgc2xpZGVyU3RhcnQ6IG51bWJlcjtcblxuICBwcml2YXRlIF9taW4gPSAwO1xuICBwcml2YXRlIF9tYXggPSAxMDA7XG4gIHByaXZhdGUgX3N0ZXAgPSAxO1xuICBwcml2YXRlIF92YWx1ZTtcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlID0gWzAsIDAsIDBdO1xuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9tYXJrcyA9IHt9O1xuICBwcml2YXRlIF9kb3RzID0gZmFsc2U7XG4gIHByaXZhdGUgX2luY2x1ZGVkID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfY291bnQgPSAxO1xuICBwcml2YXRlIF9hbGxvd0Nyb3NzID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfcHVzaGFibGU7XG4gIHByaXZhdGUgX2hhbmRsZVN0eWxlID0gW107XG4gIHByaXZhdGUgX3RyYWNrU3R5bGUgPSBbXTtcbiAgcHJpdmF0ZSBfcmFpbFN0eWxlO1xuICBwcml2YXRlIF9oYW5kbGVDb3VudDtcblxuICBASW5wdXQoKVxuICBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuICBzZXQgbWluKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuICBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgc3RlcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdGVwO1xuICB9XG4gIHNldCBzdGVwKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGVwID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IFtudW1iZXJdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbHVlOiBbbnVtYmVyXSkge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRlZmF1bHRWYWx1ZSh2YWx1ZSkge1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbWFya3MoKTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5fbWFya3M7XG4gIH1cbiAgc2V0IG1hcmtzKHZhbHVlOiBvYmplY3QpIHtcbiAgICB0aGlzLl9tYXJrcyA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBkb3RzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kb3RzO1xuICB9XG4gIHNldCBkb3RzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZG90cyA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBpbmNsdWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZWQ7XG4gIH1cbiAgc2V0IGluY2x1ZGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faW5jbHVkZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgY291bnQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2NvdW50ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGFsbG93Q3Jvc3ModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9hbGxvd0Nyb3NzID0gdmFsdWU7XG4gICAgdGhpcy5zZXRWYWx1ZUJvdW5kKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHB1c2hhYmxlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wdXNoYWJsZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLnZlcmlmeVB1c2hhYmxlKCkpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWVCb3VuZCgpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBnZXQgaGFuZGxlU3R5bGUoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl9oYW5kbGVTdHlsZTtcbiAgfVxuICBzZXQgaGFuZGxlU3R5bGUodmFsdWU6IGFueVtdKSB7XG4gICAgdGhpcy5faGFuZGxlU3R5bGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdHJhY2tTdHlsZSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYWNrU3R5bGU7XG4gIH1cbiAgc2V0IHRyYWNrU3R5bGUodmFsdWU6IGFueVtdKSB7XG4gICAgdGhpcy5fdHJhY2tTdHlsZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCByYWlsU3R5bGUoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl9yYWlsU3R5bGU7XG4gIH1cbiAgc2V0IHJhaWxTdHlsZSh2YWx1ZTogYW55W10pIHtcbiAgICB0aGlzLl9yYWlsU3R5bGUgPSB2YWx1ZTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQWZ0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXNsaWRlci13cmFwcGVyJylcbiAgYW1XcmFwcGVyOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGY6IEVsZW1lbnRSZWYpIHt9XG5cbiAgc2V0Q2xzKCkge1xuICAgIHRoaXMuc2xpZGVyQ2xzID0ge1xuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1kaXNhYmxlZGBdOiB0aGlzLl9kaXNhYmxlZFxuICAgIH07XG4gIH1cblxuICBpbml0aWFsVmFsdWUoKSB7XG4gICAgY29uc3QgbWluVGVtcCA9IHRoaXMuX21pbjtcbiAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBBcnJheS5hcHBseShudWxsLCBBcnJheSh0aGlzLl9jb3VudCArIDEpKS5tYXAoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbWluVGVtcDtcbiAgICB9KTtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCA/IHRoaXMuX2RlZmF1bHRWYWx1ZSA6IGluaXRpYWxWYWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX3ZhbHVlICE9PSB1bmRlZmluZWQgPyB0aGlzLl92YWx1ZSA6IHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgICBpZiAodGhpcy5fY291bnQgPiAwKSB7XG4gICAgICB0aGlzLnVwcGVyQm91bmQgPSBNYXRoLm1heCguLi50aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLmxvd2VyQm91bmQgPSBNYXRoLm1pbiguLi50aGlzLl92YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ2hhbmdlKGUsIGkpIHtcbiAgICBsZXQgdGVtcCA9IFsuLi50aGlzLl92YWx1ZV07XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9wdXNoYWJsZSA9PT0gJ2Jvb2xlYW4nICYmIHRoaXMuX3B1c2hhYmxlKSB7XG4gICAgICBjb25zdCBkaWZmID0gZSAtIHRoaXMuX3ZhbHVlW2ldO1xuICAgICAgdGVtcCA9IHRlbXAubWFwKHYgPT4gKHYgPSB2ICsgZGlmZikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wW2ldID0gZTtcbiAgICB9XG4gICAgdGhpcy51cHBlckJvdW5kID0gTWF0aC5tYXgoLi4udGVtcCk7XG4gICAgdGhpcy5sb3dlckJvdW5kID0gTWF0aC5taW4oLi4udGVtcCk7XG4gICAgdGhpcy5zZXRUcmFja1N0eWxlKHRlbXApO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0ZW1wKTtcbiAgfVxuXG4gIGhhbmRsZUFmdGVyQ2hhbmdlKGUsIGkpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3ZhbHVlW2ldID0gZTtcbiAgICAgIHRoaXMudXBwZXJCb3VuZCA9IE1hdGgubWF4KC4uLnRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMubG93ZXJCb3VuZCA9IE1hdGgubWluKC4uLnRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMuc2V0VHJhY2tTdHlsZSh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLm9uQWZ0ZXJDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLnNldFZhbHVlQm91bmQoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHNldFRyYWNrU3R5bGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID09PSB0aGlzLl9jb3VudCArIDEpIHtcbiAgICAgIHZhbHVlLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY291bnQ7IGkrKykge1xuICAgICAgICB0aGlzLm9mZnNldFtpXSA9ICh2YWx1ZVtpXSAqIDEwMCkgLyAodGhpcy5fbWF4IC0gdGhpcy5fbWluKTtcbiAgICAgICAgdGhpcy5sZW5ndGhbaV0gPSAoKHZhbHVlW2kgKyAxXSAtIHZhbHVlW2ldKSAqIDEwMCkgLyAodGhpcy5fbWF4IC0gdGhpcy5fbWluKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRWYWx1ZUJvdW5kKCkge1xuICAgIHRoaXMubWF4Qm91bmQgPSBbXTtcbiAgICB0aGlzLm1pbkJvdW5kID0gW107XG4gICAgaWYgKHRoaXMuX2FsbG93Q3Jvc3MgfHwgdGhpcy5faGFuZGxlQ291bnQgPD0gMSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9oYW5kbGVDb3VudDsgaSsrKSB7XG4gICAgICAgIHRoaXMubWF4Qm91bmRbaV0gPSB0aGlzLl9tYXg7XG4gICAgICAgIHRoaXMubWluQm91bmRbaV0gPSB0aGlzLl9taW47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fcHVzaGFibGUgIT09ICdudW1iZXInIHx8ICh0eXBlb2YgdGhpcy5fcHVzaGFibGUgPT09ICdib29sZWFuJyAmJiB0aGlzLl9wdXNoYWJsZSkpIHtcbiAgICAgICAgdGhpcy5fcHVzaGFibGUgPSAwO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9oYW5kbGVDb3VudDsgaSsrKSB7XG4gICAgICAgIHRoaXMubWF4Qm91bmRbaV0gPSBpID09PSB0aGlzLl9oYW5kbGVDb3VudCAtIDEgPyB0aGlzLl9tYXggOiB0aGlzLl92YWx1ZVtpICsgMV0gLSB0aGlzLl9wdXNoYWJsZTtcbiAgICAgICAgdGhpcy5taW5Cb3VuZFtpXSA9IGkgPT09IDAgPyB0aGlzLl9taW4gOiB0aGlzLl92YWx1ZVtpIC0gMV0gKyB0aGlzLl9wdXNoYWJsZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2ZXJpZnlQdXNoYWJsZSgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3B1c2hhYmxlID09PSAnbnVtYmVyJykge1xuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl9oYW5kbGVDb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLl92YWx1ZVtpXSAtIHRoaXMuX3ZhbHVlW2kgLSAxXTtcbiAgICAgICAgaWYgKGRpZmYgPCB0aGlzLl9wdXNoYWJsZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLl9tYXggPT09IHVuZGVmaW5lZCB8fCB0aGlzLl9taW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy52ZXJpZnlQdXNoYWJsZSgpKSB7XG4gICAgICB0aGlzLnNldFZhbHVlQm91bmQoKTtcbiAgICAgIHRoaXMuX2hhbmRsZUNvdW50ID0gdGhpcy5fY291bnQgKyAxO1xuICAgICAgdGhpcy5zZXRDbHMoKTtcbiAgICAgIGNvbnN0IHNsaWRlckNvb3JkcyA9IHRoaXMuX2VsZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FtLXNsaWRlcicpWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5zbGlkZXJMZW5ndGggPSBzbGlkZXJDb29yZHMud2lkdGg7XG4gICAgICB0aGlzLnNsaWRlclN0YXJ0ID0gc2xpZGVyQ29vcmRzLmxlZnQ7XG4gICAgICB0aGlzLmluaXRpYWxWYWx1ZSgpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgRWxlbWVudFJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdTbGlkZXIgLCBuem0tc2xpZGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NsaWRlci5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVyIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJlZml4Q2xzID0gJ2FtLXNsaWRlcic7XG4gIHNsaWRlckxlbmd0aDogbnVtYmVyO1xuICBzbGlkZXJTdGFydDogbnVtYmVyO1xuICBzbGlkZXJDbHM6IG9iamVjdDtcbiAgb2Zmc2V0OiBudW1iZXIgPSAwO1xuICBsZW5ndGg6IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBfbWluOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9tYXg6IG51bWJlciA9IDEwMDtcbiAgcHJpdmF0ZSBfc3RlcDogbnVtYmVyID0gMTtcbiAgcHJpdmF0ZSBfdmFsdWU6IG51bWJlciA9IDEwO1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbWFya3M6IG9iamVjdCA9IHt9O1xuICBwcml2YXRlIF9kb3RzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2luY2x1ZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfaGFuZGxlU3R5bGU6IG9iamVjdDtcbiAgcHJpdmF0ZSBfdHJhY2tTdHlsZTogb2JqZWN0ID0ge307XG4gIHByaXZhdGUgX3JhaWxTdHlsZTogb2JqZWN0O1xuXG4gIEBJbnB1dCgpXG4gIGdldCBtaW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG4gIHNldCBtaW4odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbiA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBtYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG4gIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBzdGVwKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3N0ZXA7XG4gIH1cbiAgc2V0IHN0ZXAodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3N0ZXAgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudmFsdWVSYW5nZSgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWUpIHtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbWFya3MoKTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5fbWFya3M7XG4gIH1cbiAgc2V0IG1hcmtzKHZhbHVlOiBvYmplY3QpIHtcbiAgICB0aGlzLl9tYXJrcyA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBkb3RzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kb3RzO1xuICB9XG4gIHNldCBkb3RzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZG90cyA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBpbmNsdWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZWQ7XG4gIH1cbiAgc2V0IGluY2x1ZGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faW5jbHVkZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgaGFuZGxlU3R5bGUoKTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5faGFuZGxlU3R5bGU7XG4gIH1cbiAgc2V0IGhhbmRsZVN0eWxlKHZhbHVlOiBvYmplY3QpIHtcbiAgICB0aGlzLl9oYW5kbGVTdHlsZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB0cmFja1N0eWxlKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYWNrU3R5bGU7XG4gIH1cbiAgc2V0IHRyYWNrU3R5bGUodmFsdWU6IG9iamVjdCkge1xuICAgIHRoaXMuX3RyYWNrU3R5bGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgcmFpbFN0eWxlKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMuX3JhaWxTdHlsZTtcbiAgfVxuICBzZXQgcmFpbFN0eWxlKHZhbHVlOiBvYmplY3QpIHtcbiAgICB0aGlzLl9yYWlsU3R5bGUgPSB2YWx1ZTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQWZ0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXNsaWRlci13cmFwcGVyJylcbiAgYW1TbGlkZXJXcmFwcGVyOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGY6IEVsZW1lbnRSZWYpIHt9XG5cbiAgc2V0Q2xzKCkge1xuICAgIHRoaXMuc2xpZGVyQ2xzID0ge1xuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1kaXNhYmxlZGBdOiB0aGlzLl9kaXNhYmxlZFxuICAgIH07XG4gIH1cblxuICBoYW5kbGVDaGFuZ2UoZSkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAoKGUgLSB0aGlzLl9taW4pICogMTAwKSAvICh0aGlzLl9tYXggLSB0aGlzLl9taW4pO1xuICAgICAgdGhpcy5fdmFsdWUgPSBlO1xuICAgIH0sIDEwKTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoZSk7XG4gIH1cblxuICBoYW5kbGVBZnRlckNoYW5nZShlKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9ICgoZSAtIHRoaXMuX21pbikgKiAxMDApIC8gKHRoaXMuX21heCAtIHRoaXMuX21pbik7XG4gICAgICB0aGlzLl92YWx1ZSA9IGU7XG4gICAgfSwgMTApO1xuICAgIHRoaXMub25BZnRlckNoYW5nZS5lbWl0KGUpO1xuICB9XG5cbiAgdmFsdWVSYW5nZSgpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUgPCB0aGlzLl9taW4pIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fbWluO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdmFsdWUgPiB0aGlzLl9tYXgpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fbWF4O1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgdGhpcy52YWx1ZVJhbmdlKCk7XG4gICAgY29uc3Qgc2xpZGVyQ29vcmRzID0gdGhpcy5fZWxmLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYW0tc2xpZGVyJylbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5zbGlkZXJMZW5ndGggPSBzbGlkZXJDb29yZHMud2lkdGg7XG4gICAgdGhpcy5zbGlkZXJTdGFydCA9IHNsaWRlckNvb3Jkcy5sZWZ0O1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIE9uRGVzdHJveSxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnU2xpZGVySGFuZGxlLCBuem0tc2xpZGVyLWhhbmRsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zbGlkZXItaGFuZGxlLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBTbGlkZXJIYW5kbGUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGxlZnQ6IG51bWJlcjtcblxuICBwcml2YXRlIF9taW46IG51bWJlcjtcbiAgcHJpdmF0ZSBfbWF4OiBudW1iZXI7XG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdmFsdWU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbWFya3M6IG9iamVjdCA9IHt9O1xuICBwcml2YXRlIF9oYW5kbGVTdHlsZTogb2JqZWN0O1xuICBwcml2YXRlIF9zbGlkZXJMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfc2xpZGVyU3RhcnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfbWluQm91bmQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfbWF4Qm91bmQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfc3RhcnRYOiBudW1iZXI7XG4gIHByaXZhdGUgX2lzRHJhZ2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9oYW5kbGVTdGF0dXM6IHN0cmluZztcbiAgcHJpdmF0ZSBfaGFuZGxlT2Zmc2V0WDogbnVtYmVyO1xuICBwcml2YXRlIF9vbGRWYWx1ZTogbnVtYmVyO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBtaW4odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbiA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtaW5Cb3VuZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluQm91bmQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWF4Qm91bmQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heEJvdW5kID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHN0ZXAodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3N0ZXAgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgdmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX3ZhbHVlKSB7XG4gICAgICB0aGlzLmxlZnQgPSB0aGlzLmNhbGNPZmZzZXQodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzbGlkZXJMZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3NsaWRlckxlbmd0aCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzbGlkZXJTdGFydCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc2xpZGVyU3RhcnQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgaGFuZGxlU3R5bGUoKTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5faGFuZGxlU3R5bGU7XG4gIH1cbiAgc2V0IGhhbmRsZVN0eWxlKHZhbHVlOiBvYmplY3QpIHtcbiAgICB0aGlzLl9oYW5kbGVTdHlsZSA9IHZhbHVlO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25BZnRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qIMOmwonCi8OlworCv8OmwpPCjcOkwr3CnCAqL1xuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgcGFuc3RhcnQoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghdGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuX3N0YXJ0WCA9IGV2ZW50ICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB0aGlzLl9oYW5kbGVTdGF0dXMgPSAnc3RhcnQnO1xuICAgICAgdGhpcy5faXNEcmFnaW5nID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd0b3VjaG1vdmUnLCBbJyRldmVudCddKVxuICBwYW5tb3ZlKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkICYmIHRoaXMuX2lzRHJhZ2luZykge1xuICAgICAgY29uc3QgcG9zID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgIHRoaXMuX3ZhbHVlID0gTWF0aC5yb3VuZCh0aGlzLmNhbGNWYWx1ZUJ5UG9zKHBvcykpO1xuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIGlmICh0aGlzLl9vbGRWYWx1ZSAhPT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fb2xkVmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hlbmQnLCBbJyRldmVudCddKVxuICBwYW5lbmQoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghdGhpcy5fZGlzYWJsZWQgJiYgdGhpcy5faXNEcmFnaW5nKSB7XG4gICAgICB0aGlzLl9oYW5kbGVTdGF0dXMgPSAnZW5kJztcbiAgICAgIHRoaXMuX2lzRHJhZ2luZyA9IGZhbHNlO1xuICAgICAgY29uc3QgcG9zID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgIHRoaXMuX3ZhbHVlID0gTWF0aC5yb3VuZCh0aGlzLmNhbGNWYWx1ZUJ5UG9zKHBvcykpO1xuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMub25BZnRlckNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGY6IEVsZW1lbnRSZWYsIHByaXZhdGUgX3Nhbml0aXplcjogRG9tU2FuaXRpemVyKSB7fVxuXG4gIG1vdXNlRG93biA9IGV2ZW50ID0+IHtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkICYmIHRoaXMuaXNNb3VzZVRhcmdldChldmVudCkpIHtcbiAgICAgIHRoaXMuX3N0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICB0aGlzLl9oYW5kbGVTdGF0dXMgPSAnc3RhcnQnO1xuICAgICAgdGhpcy5faXNEcmFnaW5nID0gdHJ1ZTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5tb3VzZVVwLCBmYWxzZSk7XG4gICAgICB0aGlzLnBhdXNlRXZlbnQoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICBtb3VzZU1vdmUgPSBldmVudCA9PiB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLl9pc0RyYWdpbmcpIHtcbiAgICAgIHRoaXMucGF1c2VFdmVudChldmVudCk7XG4gICAgICBjb25zdCBwb3MgPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5fdmFsdWUgPSBNYXRoLnJvdW5kKHRoaXMuY2FsY1ZhbHVlQnlQb3MocG9zKSk7XG4gICAgICB0aGlzLmxlZnQgPSB0aGlzLmNhbGNPZmZzZXQodGhpcy5fdmFsdWUpO1xuICAgICAgaWYgKHRoaXMuX29sZFZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgICB0aGlzLl9vbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBtb3VzZVVwID0gZXZlbnQgPT4ge1xuICAgIGlmICghdGhpcy5fZGlzYWJsZWQgJiYgdGhpcy5faXNEcmFnaW5nKSB7XG4gICAgICB0aGlzLl9oYW5kbGVTdGF0dXMgPSAnZW5kJztcbiAgICAgIHRoaXMuX2lzRHJhZ2luZyA9IGZhbHNlO1xuICAgICAgY29uc3QgcG9zID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIHRoaXMuX3ZhbHVlID0gTWF0aC5yb3VuZCh0aGlzLmNhbGNWYWx1ZUJ5UG9zKHBvcykpO1xuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMub25BZnRlckNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgY2FsY1ZhbHVlQnlQb3MocG9zKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gcG9zIC0gdGhpcy5fc2xpZGVyU3RhcnQ7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5jYWxjVmFsdWUob2Zmc2V0KTtcbiAgICBpZiAodmFsdWUgPD0gdGhpcy5fbWluQm91bmQpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5fbWluQm91bmQ7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA+PSB0aGlzLl9tYXhCb3VuZCkge1xuICAgICAgdmFsdWUgPSB0aGlzLl9tYXhCb3VuZDtcbiAgICB9XG4gICAgY29uc3QgY2xvc2VzdFBvaW50ID0gdGhpcy5nZXRDbG9zZXN0UG9pbnQodmFsdWUpO1xuICAgIHJldHVybiB0aGlzLl9zdGVwID09PSBudWxsID8gY2xvc2VzdFBvaW50IDogcGFyc2VGbG9hdChjbG9zZXN0UG9pbnQudG9GaXhlZCh0aGlzLmdldFByZWNpc2lvbih0aGlzLl9zdGVwKSkpO1xuICB9XG5cbiAgY2FsY1ZhbHVlKG9mZnNldCkge1xuICAgIGNvbnN0IHJhdGlvID0gTWF0aC5hYnMoTWF0aC5tYXgob2Zmc2V0LCAwKSAvIHRoaXMuX3NsaWRlckxlbmd0aCk7XG4gICAgY29uc3QgdmFsdWUgPSByYXRpbyAqICh0aGlzLl9tYXggLSB0aGlzLl9taW4pICsgdGhpcy5fbWluO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGdldENsb3Nlc3RQb2ludCh2YWwpIHtcbiAgICBjb25zdCBwb2ludHMgPSBPYmplY3Qua2V5cyh0aGlzLl9tYXJrcykubWFwKHBhcnNlRmxvYXQpO1xuICAgIGlmICh0aGlzLl9zdGVwICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBjbG9zZXN0U3RlcCA9IE1hdGgucm91bmQoKHZhbCAtIHRoaXMuX21pbikgLyB0aGlzLl9zdGVwKSAqIHRoaXMuX3N0ZXAgKyB0aGlzLl9taW47XG4gICAgICBwb2ludHMucHVzaChjbG9zZXN0U3RlcCk7XG4gICAgfVxuICAgIGNvbnN0IGRpZmZzID0gcG9pbnRzLm1hcChmdW5jdGlvbihwb2ludCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHZhbCAtIHBvaW50KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcG9pbnRzW2RpZmZzLmluZGV4T2YoTWF0aC5taW4uYXBwbHkoTWF0aCwgdGhpcy50b0NvbnN1bWFibGVBcnJheShkaWZmcykpKV07XG4gIH1cblxuICBnZXRQcmVjaXNpb24oc3RlcCkge1xuICAgIGNvbnN0IHN0ZXBTdHJpbmcgPSBzdGVwLnRvU3RyaW5nKCk7XG4gICAgbGV0IHByZWNpc2lvbiA9IDA7XG4gICAgaWYgKHN0ZXBTdHJpbmcuaW5kZXhPZignLicpID49IDApIHtcbiAgICAgIHByZWNpc2lvbiA9IHN0ZXBTdHJpbmcubGVuZ3RoIC0gc3RlcFN0cmluZy5pbmRleE9mKCcuJykgLSAxO1xuICAgIH1cbiAgICByZXR1cm4gcHJlY2lzaW9uO1xuICB9XG5cbiAgY2FsY09mZnNldCh2YWx1ZSkge1xuICAgIGNvbnN0IHJhdGlvID0gKHZhbHVlIC0gdGhpcy5fbWluKSAvICh0aGlzLl9tYXggLSB0aGlzLl9taW4pO1xuICAgIHJldHVybiByYXRpbyAqIDEwMDtcbiAgfVxuXG4gIHBhdXNlRXZlbnQoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgaXNNb3VzZVRhcmdldChldmVudCkge1xuICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgbGV0IHBhcmVudEZvdW5kID0gZmFsc2U7XG4gICAgd2hpbGUgKHRhcmdldCAhPT0gbnVsbCAmJiAhcGFyZW50Rm91bmQpIHtcbiAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX2VsZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHBhcmVudEZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50Rm91bmQ7XG4gIH1cblxuICB0b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgICBjb25zdCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnIyW2ldID0gYXJyW2ldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycjI7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fZWxmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5tb3VzZURvd24sIGZhbHNlKTtcbiAgICB0aGlzLl9oYW5kbGVPZmZzZXRYID0gdGhpcy5fZWxmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkueDtcbiAgICB0aGlzLmxlZnQgPSB0aGlzLmNhbGNPZmZzZXQodGhpcy5fdmFsdWUpO1xuICAgIHRoaXMuX21pbkJvdW5kID0gdGhpcy5fbWluQm91bmQgPT09IHVuZGVmaW5lZCA/IHRoaXMuX21pbiA6IHRoaXMuX21pbkJvdW5kO1xuICAgIHRoaXMuX21heEJvdW5kID0gdGhpcy5fbWF4Qm91bmQgPT09IHVuZGVmaW5lZCA/IHRoaXMuX21heCA6IHRoaXMuX21heEJvdW5kO1xuICAgIHRoaXMub25BZnRlckNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcCwgZmFsc2UpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBBZnRlclZpZXdJbml0LFxuICBIb3N0QmluZGluZyxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1NsaWRlck1hcmtzLCBuem0tc2xpZGVyLW1hcmtzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NsaWRlci1tYXJrcy5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVyTWFya3MgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBtYXJrQXJyYXk6IEFycmF5PGFueT4gPSBbXTtcblxuICBwcml2YXRlIF9taW46IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX21heDogbnVtYmVyID0gMTAwO1xuICBwcml2YXRlIF9tYXJrczogb2JqZWN0ID0ge307XG4gIHByaXZhdGUgX2luY2x1ZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfY2xhc3NOYW1lOiBzdHJpbmcgPSAnYW0tc2xpZGVyLW1hcmsnO1xuICBwcml2YXRlIF91cHBlckJvdW5kOiBudW1iZXI7XG4gIHByaXZhdGUgX2xvd2VyQm91bmQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcmFuZ2U6IG51bWJlcjtcbiAgcHJpdmF0ZSBfbWFya1dpZHRoOiBudW1iZXI7XG5cbiAgQElucHV0KClcbiAgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlIDw9IHRoaXMuX21heCkge1xuICAgICAgdGhpcy5fbWluID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSA+PSB0aGlzLl9taW4pIHtcbiAgICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWFya3ModmFsdWU6IG9iamVjdCkge1xuICAgIHRoaXMuX21hcmtzID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGluY2x1ZGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faW5jbHVkZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgdXBwZXJCb3VuZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlICE9PSB0aGlzLl91cHBlckJvdW5kKSB7XG4gICAgICB0aGlzLl91cHBlckJvdW5kID0gdmFsdWU7XG4gICAgICB0aGlzLnNldEFjdGl2ZUNscygpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbG93ZXJCb3VuZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlICE9PSB0aGlzLmxvd2VyQm91bmQpIHtcbiAgICAgIHRoaXMuX2xvd2VyQm91bmQgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2V0QWN0aXZlQ2xzKCk7XG4gICAgfVxuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25BZnRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBIb3N0QmluZGluZygpXG4gIGdldCBjbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xhc3NOYW1lO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxmOiBFbGVtZW50UmVmKSB7fVxuXG4gIGdldE1hcmtzKG1hcmtzS2V5cykge1xuICAgIHRoaXMubWFya0FycmF5ID0gW107XG4gICAgbWFya3NLZXlzXG4gICAgICAubWFwKHBhcnNlRmxvYXQpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpXG4gICAgICAubWFwKHBvaW50ID0+IHtcbiAgICAgICAgY29uc3QgbWFya0l0ZW0gPSB7XG4gICAgICAgICAgbWFya0xhYmVsOiAnJyxcbiAgICAgICAgICBwb2ludDogJycsXG4gICAgICAgICAgY2xhc3NOYW1lOiB7fSxcbiAgICAgICAgICBzdHlsZToge31cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbWFya1BvaW50ID0gdGhpcy5fbWFya3NbcG9pbnRdO1xuICAgICAgICBjb25zdCBtYXJrUG9pbnRJc09iamVjdCA9IHR5cGVvZiBtYXJrUG9pbnQgPT09ICdvYmplY3QnO1xuICAgICAgICBjb25zdCBtYXJrTGFiZWwgPSBtYXJrUG9pbnRJc09iamVjdCA/IG1hcmtQb2ludC5sYWJlbCA6IG1hcmtQb2ludDtcbiAgICAgICAgaWYgKCFtYXJrTGFiZWwgJiYgbWFya0xhYmVsICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNBY3RpdmUgPVxuICAgICAgICAgICghdGhpcy5faW5jbHVkZWQgJiYgcG9pbnQgPT09IHRoaXMuX3VwcGVyQm91bmQpIHx8XG4gICAgICAgICAgKHRoaXMuX2luY2x1ZGVkICYmIHBvaW50IDw9IHRoaXMuX3VwcGVyQm91bmQgJiYgcG9pbnQgPj0gdGhpcy5fbG93ZXJCb3VuZCk7XG4gICAgICAgIGNvbnN0IG1hcmtDbGFzc05hbWUgPSB7XG4gICAgICAgICAgW2Ake3RoaXMuX2NsYXNzTmFtZX0tdGV4dGBdOiB0cnVlLFxuICAgICAgICAgIFtgJHt0aGlzLl9jbGFzc05hbWV9LXRleHQtYWN0aXZlYF06IGlzQWN0aXZlXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJvdHRvbVN0eWxlID0ge1xuICAgICAgICAgIG1hcmdpbkJvdHRvbTogJy01MCUnLFxuICAgICAgICAgIGJvdHRvbTogYCR7KChwb2ludCAtIHRoaXMuX21pbikgLyB0aGlzLl9yYW5nZSkgKiAxMDB9JWBcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbGVmdFN0eWxlID0ge1xuICAgICAgICAgIHdpZHRoOiBgJHt0aGlzLl9tYXJrV2lkdGh9JWAsXG4gICAgICAgICAgbWFyZ2luTGVmdDogYCR7LXRoaXMuX21hcmtXaWR0aCAvIDJ9JWAsXG4gICAgICAgICAgbGVmdDogYCR7KChwb2ludCAtIHRoaXMuX21pbikgLyB0aGlzLl9yYW5nZSkgKiAxMDB9JWBcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBsZWZ0U3R5bGU7XG4gICAgICAgIGNvbnN0IG1hcmtTdHlsZSA9IG1hcmtQb2ludElzT2JqZWN0ID8geyAuLi5zdHlsZSwgLi4ubWFya1BvaW50LnN0eWxlIH0gOiBzdHlsZTtcbiAgICAgICAgbWFya0l0ZW0ubWFya0xhYmVsID0gbWFya0xhYmVsO1xuICAgICAgICBtYXJrSXRlbS5wb2ludCA9IHBvaW50O1xuICAgICAgICBtYXJrSXRlbS5jbGFzc05hbWUgPSBPYmplY3Qua2V5cyhtYXJrQ2xhc3NOYW1lKS5qb2luKCcgJyk7XG4gICAgICAgIG1hcmtJdGVtLnN0eWxlID0gbWFya1N0eWxlO1xuICAgICAgICB0aGlzLm1hcmtBcnJheS5wdXNoKG1hcmtJdGVtKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc2V0QWN0aXZlQ2xzKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXJrQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBvaW50ID0gdGhpcy5tYXJrQXJyYXlbaV0ucG9pbnQ7XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9XG4gICAgICAgICghdGhpcy5faW5jbHVkZWQgJiYgcG9pbnQgPT09IHRoaXMuX3VwcGVyQm91bmQpIHx8XG4gICAgICAgICh0aGlzLl9pbmNsdWRlZCAmJiBwb2ludCA8PSB0aGlzLl91cHBlckJvdW5kICYmIHBvaW50ID49IHRoaXMuX2xvd2VyQm91bmQpO1xuICAgICAgdGhpcy5tYXJrQXJyYXlbaV0uY2xhc3NOYW1lID0ge1xuICAgICAgICBbYCR7dGhpcy5fY2xhc3NOYW1lfS10ZXh0YF06IHRydWUsXG4gICAgICAgIFtgJHt0aGlzLl9jbGFzc05hbWV9LXRleHQtYWN0aXZlYF06IGlzQWN0aXZlXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHNldE1hcmtzTGFibGUoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hcmtBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbWFya0VsZSA9IHRoaXMuX2VsZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5fY2xhc3NOYW1lICsgJy10ZXh0JylbaV07XG4gICAgICBtYXJrRWxlLmlubmVySFRNTCA9IHRoaXMubWFya0FycmF5W2ldLm1hcmtMYWJlbDtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBtYXJrc0tleXMgPSBPYmplY3Qua2V5cyh0aGlzLl9tYXJrcyk7XG4gICAgY29uc3QgbWFya3NDb3VudCA9IG1hcmtzS2V5cy5sZW5ndGg7XG4gICAgY29uc3QgdW5pdCA9IG1hcmtzQ291bnQgPiAxID8gMTAwIC8gKG1hcmtzQ291bnQgLSAxKSA6IDEwMDtcbiAgICB0aGlzLl9tYXJrV2lkdGggPSB1bml0ICogMC45O1xuICAgIHRoaXMuX3JhbmdlID0gdGhpcy5fbWF4IC0gdGhpcy5fbWluO1xuICAgIHRoaXMuZ2V0TWFya3MobWFya3NLZXlzKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnNldE1hcmtzTGFibGUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEVsZW1lbnRSZWYsIElucHV0LCBIb3N0QmluZGluZywgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnU2xpZGVyU3RlcHMsIG56bS1zbGlkZXItc3RlcHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2xpZGVyLXN0ZXBzLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBTbGlkZXJTdGVwcyBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByZWZpeENscyA9ICdhbS1zbGlkZXInO1xuICBzdGVwQXJyYXkgPSBbXTtcblxuICBwcml2YXRlIF9taW46IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX21heDogbnVtYmVyID0gMTAwO1xuICBwcml2YXRlIF9zdGVwOiBudW1iZXI7XG4gIHByaXZhdGUgX21hcmtzOiBvYmplY3QgPSB7fTtcbiAgcHJpdmF0ZSBfaW5jbHVkZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF91cHBlckJvdW5kOiBudW1iZXI7XG4gIHByaXZhdGUgX2xvd2VyQm91bmQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZG90czogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9kb3RTdHlsZTogb2JqZWN0O1xuICBwcml2YXRlIF9hY3RpdmVEb3RTdHlsZTogb2JqZWN0O1xuXG4gIEBJbnB1dCgpXG4gIHNldCBtaW4odmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSA8PSB0aGlzLl9tYXgpIHtcbiAgICAgIHRoaXMuX21pbiA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUgPj0gdGhpcy5fbWluKSB7XG4gICAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG1hcmtzKHZhbHVlOiBvYmplY3QpIHtcbiAgICB0aGlzLl9tYXJrcyA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzdGVwKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGVwID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGluY2x1ZGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faW5jbHVkZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZG90cyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2RvdHMgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgdXBwZXJCb3VuZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IHRoaXMuX3VwcGVyQm91bmQpIHtcbiAgICAgIHRoaXMuX3VwcGVyQm91bmQgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2V0QWN0aXZlQ2xzKCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBsb3dlckJvdW5kKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gdGhpcy5sb3dlckJvdW5kKSB7XG4gICAgICB0aGlzLl9sb3dlckJvdW5kID0gdmFsdWU7XG4gICAgICB0aGlzLnNldEFjdGl2ZUNscygpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0QmluZGluZygpXG4gIGdldCBjbGFzcygpIHtcbiAgICByZXR1cm4gJ2FtLXNsaWRlci1zdGVwJztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VsZjogRWxlbWVudFJlZikge31cblxuICBjYWxQb2ludHMoKSB7XG4gICAgY29uc3QgcG9pbnRzID0gT2JqZWN0LmtleXModGhpcy5fbWFya3MpLm1hcChwYXJzZUZsb2F0KTtcbiAgICBpZiAodGhpcy5fZG90cykge1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX21pbjsgaSA8PSB0aGlzLl9tYXg7IGkgPSBpICsgdGhpcy5fc3RlcCkge1xuICAgICAgICBpZiAocG9pbnRzLmluZGV4T2YoaSkgPCAwKSB7XG4gICAgICAgICAgcG9pbnRzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxuXG4gIGdldFN0ZXBzKHBvaW50cykge1xuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fbWF4IC0gdGhpcy5fbWluO1xuICAgIHRoaXMuc3RlcEFycmF5ID0gW107XG4gICAgcG9pbnRzLm1hcChwb2ludCA9PiB7XG4gICAgICBjb25zdCBzdGVwSXRlbSA9IHtcbiAgICAgICAgc3RlcFN0eWxlOiB7fSxcbiAgICAgICAgc3RlcENsYXNzOiB7fSxcbiAgICAgICAgcG9pbnQ6IG51bGxcbiAgICAgIH07XG4gICAgICBjb25zdCBvZmZzZXQgPSBgJHsoTWF0aC5hYnMocG9pbnQgLSB0aGlzLl9taW4pIC8gcmFuZ2UpICogMTAwfSVgO1xuICAgICAgY29uc3QgaXNBY3RpdmVkID1cbiAgICAgICAgKCF0aGlzLl9pbmNsdWRlZCAmJiBwb2ludCA9PT0gdGhpcy5fdXBwZXJCb3VuZCkgfHxcbiAgICAgICAgKHRoaXMuX2luY2x1ZGVkICYmIHBvaW50IDw9IHRoaXMuX3VwcGVyQm91bmQgJiYgcG9pbnQgPj0gdGhpcy5fbG93ZXJCb3VuZCk7XG4gICAgICBsZXQgc3R5bGUgPSB7IGxlZnQ6IG9mZnNldCwgLi4udGhpcy5fZG90U3R5bGUgfTtcbiAgICAgIGlmIChpc0FjdGl2ZWQpIHtcbiAgICAgICAgc3R5bGUgPSB7IC4uLnN0eWxlLCAuLi50aGlzLl9hY3RpdmVEb3RTdHlsZSB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwb2ludENsYXNzTmFtZSA9IHtcbiAgICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1kb3RgXTogdHJ1ZSxcbiAgICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1kb3QtYWN0aXZlYF06IGlzQWN0aXZlZFxuICAgICAgfTtcbiAgICAgIHN0ZXBJdGVtLnBvaW50ID0gcG9pbnQ7XG4gICAgICBzdGVwSXRlbS5zdGVwU3R5bGUgPSBzdHlsZTtcbiAgICAgIHN0ZXBJdGVtLnN0ZXBDbGFzcyA9IHBvaW50Q2xhc3NOYW1lO1xuICAgICAgdGhpcy5zdGVwQXJyYXkucHVzaChzdGVwSXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICBzZXRBY3RpdmVDbHMoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0ZXBBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcG9pbnQgPSB0aGlzLnN0ZXBBcnJheVtpXS5wb2ludDtcbiAgICAgIGNvbnN0IGlzQWN0aXZlZCA9XG4gICAgICAgICghdGhpcy5faW5jbHVkZWQgJiYgcG9pbnQgPT09IHRoaXMuX3VwcGVyQm91bmQpIHx8XG4gICAgICAgICh0aGlzLl9pbmNsdWRlZCAmJiBwb2ludCA8PSB0aGlzLl91cHBlckJvdW5kICYmIHBvaW50ID49IHRoaXMuX2xvd2VyQm91bmQpO1xuICAgICAgdGhpcy5zdGVwQXJyYXlbaV0uc3RlcENsYXNzID0ge1xuICAgICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWRvdGBdOiB0cnVlLFxuICAgICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWRvdC1hY3RpdmVgXTogaXNBY3RpdmVkXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMuY2FsUG9pbnRzKCk7XG4gICAgdGhpcy5nZXRTdGVwcyhwb2ludHMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkNoYW5nZXMsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnU2xpZGVyVHJhY2ssIG56bS1zbGlkZXItdHJhY2snLFxuICB0ZW1wbGF0ZVVybDogJy4vc2xpZGVyLXRyYWNrLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBTbGlkZXJUcmFjayBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIHByZWZpeENscyA9ICdhbS1zbGlkZXInO1xuICBlbFN0eWxlOiBvYmplY3Q7XG5cbiAgcHJpdmF0ZSBfY2xhc3NOYW1lOiBvYmplY3Q7XG4gIHByaXZhdGUgX2luY2x1ZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfb2Zmc2V0OiBudW1iZXI7XG4gIHByaXZhdGUgX2xlbmd0aDogbnVtYmVyO1xuICBwcml2YXRlIF9zdHlsZTogb2JqZWN0O1xuXG4gIEBJbnB1dCgpXG4gIGdldCBjbGFzc05hbWUoKTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5fY2xhc3NOYW1lO1xuICB9XG4gIHNldCBjbGFzc05hbWUodmFsdWU6IG9iamVjdCkge1xuICAgIHRoaXMuX2NsYXNzTmFtZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBpbmNsdWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZWQ7XG4gIH1cbiAgc2V0IGluY2x1ZGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faW5jbHVkZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgb2Zmc2V0KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9vZmZzZXQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9sZW5ndGggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc3R5bGUodmFsdWU6IG9iamVjdCkge1xuICAgIHRoaXMuX3N0eWxlID0gdmFsdWU7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGY6IEVsZW1lbnRSZWYsIHByaXZhdGUgX3Nhbml0aXplcjogRG9tU2FuaXRpemVyKSB7fVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGNvbnN0IHBvc2l0b25TdHlsZSA9IHtcbiAgICAgIGxlZnQ6IGAke3RoaXMuX29mZnNldH0lYCxcbiAgICAgIHdpZHRoOiBgJHt0aGlzLl9sZW5ndGh9JWBcbiAgICB9O1xuICAgIHRoaXMuZWxTdHlsZSA9IHtcbiAgICAgIC4uLnRoaXMuX3N0eWxlLFxuICAgICAgLi4ucG9zaXRvblN0eWxlXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNsaWRlciB9IGZyb20gJy4vc2xpZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU2xpZGVySGFuZGxlIH0gZnJvbSAnLi9zbGlkZXItaGFuZGxlL3NsaWRlci1oYW5kbGUuY29tcG9uZW50JztcbmltcG9ydCB7IFNsaWRlck1hcmtzIH0gZnJvbSAnLi9zbGlkZXItbWFya3Mvc2xpZGVyLW1hcmtzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbGlkZXJTdGVwcyB9IGZyb20gJy4vc2xpZGVyLXN0ZXBzL3NsaWRlci1zdGVwcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xpZGVyVHJhY2sgfSBmcm9tICcuL3NsaWRlci10cmFjay9zbGlkZXItdHJhY2suY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZXhwb3J0czogW1NsaWRlciAsIFNsaWRlckhhbmRsZSAsIFNsaWRlck1hcmtzICwgU2xpZGVyU3RlcHMgLCBTbGlkZXJUcmFja10sXG4gIGRlY2xhcmF0aW9uczogW1NsaWRlciAsIFNsaWRlckhhbmRsZSAsIFNsaWRlck1hcmtzICwgU2xpZGVyU3RlcHMgLCBTbGlkZXJUcmFja10sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIFNsaWRlck1vZHVsZSB7fVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi9yYW5nZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFNsaWRlck1vZHVsZSB9IGZyb20gJy4uL3NsaWRlci9zbGlkZXIubW9kdWxlJztcblxuQE5nTW9kdWxlKHtcbiAgZXhwb3J0czogW1JhbmdlXSxcbiAgZGVjbGFyYXRpb25zOiBbUmFuZ2VdLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBTbGlkZXJNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIFJhbmdlTW9kdWxlIHt9XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgVGVtcGxhdGVSZWYsXG4gIE9uRGVzdHJveVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExvY2FsZVByb3ZpZGVyU2VydmljZSB9IGZyb20gJy4uL2xvY2FsZS1wcm92aWRlci9sb2NhbGUtcHJvdmlkZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1BhZ2luYXRpb24sIG56bS1wYWdpbmF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2luYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByZWZpeENscyA9ICdhbS1wYWdpbmF0aW9uJztcblxuICBwcml2YXRlIF9sb2NhbGU6IG9iamVjdCA9IHt9O1xuICBwcml2YXRlIF91bnN1YnNjcmliZSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBJbnB1dCgpXG4gIG1vZGU6IHN0cmluZyA9ICdidXR0b24nO1xuICBASW5wdXQoKVxuICBjdXJyZW50OiBudW1iZXIgPSAxO1xuICBASW5wdXQoKVxuICB0b3RhbDogbnVtYmVyID0gMDtcbiAgQElucHV0KClcbiAgc2ltcGxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBsb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgfVxuICBzZXQgbG9jYWxlKHYpIHtcbiAgICB0aGlzLl9sb2NhbGUgPSB2O1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvY2FsZVByb3ZpZGVyU2VydmljZTogTG9jYWxlUHJvdmlkZXJTZXJ2aWNlKSB7fVxuXG4gIGlzVGVtcGxhdGVSZWYoa2V5KSB7XG4gICAgcmV0dXJuIDxhbnk+a2V5IGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG4gIH1cblxuICBvbkNsaWNrKHA6IG51bWJlcikge1xuICAgIHRoaXMuY3VycmVudCA9IHA7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHApO1xuICB9XG5cbiAgZ2V0TnVtYmVyKHA6IG51bWJlcik6IEFycmF5PG51bWJlcj4ge1xuICAgIHJldHVybiBuZXcgQXJyYXkocCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl9sb2NhbGVQcm92aWRlclNlcnZpY2UubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlJCkpLnN1YnNjcmliZShfID0+IHtcbiAgICAgIHRoaXMuX2xvY2FsZSA9IHRoaXMuX2xvY2FsZVByb3ZpZGVyU2VydmljZS5nZXRMb2NhbGVTdWJPYmooJ1BhZ2luYXRpb24nKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5tb2R1bGUnO1xuaW1wb3J0IHsgRmxleE1vZHVsZSB9IGZyb20gJy4uL2ZsZXgvZmxleC5tb2R1bGUnO1xuaW1wb3J0IHsgSWNvbk1vZHVsZSB9IGZyb20gJy4uL2ljb24vaWNvbi5tb2R1bGUnO1xuaW1wb3J0IHsgUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vcGFnaW5hdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9jYWxlUHJvdmlkZXJNb2R1bGUgfSBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvbG9jYWxlLXByb3ZpZGVyLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEJ1dHRvbk1vZHVsZSwgRmxleE1vZHVsZSwgSWNvbk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW1BhZ2luYXRpb25Db21wb25lbnRdLFxuICBleHBvcnRzOiBbUGFnaW5hdGlvbkNvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW0xvY2FsZVByb3ZpZGVyTW9kdWxlXVxufSlcblxuZXhwb3J0IGNsYXNzIFBhZ2luYXRpb25Nb2R1bGUge1xufVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1RhZywgbnptLXRhZycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWcuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuXG5leHBvcnQgY2xhc3MgVGFnQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tdGFnJztcbiAgY2xvc2VkOiBib29sZWFuID0gZmFsc2U7XG4gIHdyYXBDbHM6IGFueSA9IHt9O1xuXG4gIHByaXZhdGUgX3NtYWxsOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2Nsb3NhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3NlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgZ2V0IHNtYWxsKCkge1xuICAgIHJldHVybiB0aGlzLl9zbWFsbDtcbiAgfVxuICBzZXQgc21hbGwodikge1xuICAgIHRoaXMuX3NtYWxsID0gdjtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGNsb3NhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl9jbG9zYWJsZTtcbiAgfVxuICBzZXQgY2xvc2FibGUodikge1xuICAgIHRoaXMuX2Nsb3NhYmxlID0gdjtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHNlbGVjdGVkKHYpIHtcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHY7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBkaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHYpIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHY7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQ2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBhZnRlckNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBvbkNsaWNrKCkge1xuICAgIGlmICh0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZWxlY3RlZCA9ICF0aGlzLl9zZWxlY3RlZDtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5fc2VsZWN0ZWQpO1xuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgfVxuXG4gIG9uVGFnQ2xvc2UoKSB7XG4gICAgdGhpcy5vbkNsb3NlLmVtaXQoKTtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgdGhpcy5hZnRlckNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIHNldENsYXNzTWFwKCkge1xuICAgIHRoaXMud3JhcENscyA9IHtcbiAgICAgIFt0aGlzLnByZWZpeENsc106IHRydWUsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LW5vcm1hbGBdOiAhdGhpcy5fZGlzYWJsZWQgJiYgKCF0aGlzLl9zZWxlY3RlZCB8fCB0aGlzLl9zbWFsbCB8fCB0aGlzLl9jbG9zYWJsZSksXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LXNtYWxsYF06IHRoaXMuX3NtYWxsLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1hY3RpdmVgXTogdGhpcy5fc2VsZWN0ZWQgJiYgIXRoaXMuX2Rpc2FibGVkICYmICF0aGlzLl9zbWFsbCAmJiAhdGhpcy5fY2xvc2FibGUsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWRpc2FibGVkYF06IHRoaXMuX2Rpc2FibGVkLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1jbG9zYWJsZWBdOiB0aGlzLl9jbG9zYWJsZVxuICAgIH07XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSWNvbk1vZHVsZSB9IGZyb20gJy4uL2ljb24vaWNvbi5tb2R1bGUnXG5pbXBvcnQgeyBUYWdDb21wb25lbnQgfSBmcm9tICcuL3RhZy5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJY29uTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbVGFnQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW1RhZ0NvbXBvbmVudF1cbn0pXG5cbmV4cG9ydCBjbGFzcyBUYWdNb2R1bGUge31cbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExvY2FsZVByb3ZpZGVyU2VydmljZSB9IGZyb20gJy4uL2xvY2FsZS1wcm92aWRlci9sb2NhbGUtcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ01lbnUsIG56bS1tZW51JyxcbiAgdGVtcGxhdGVVcmw6ICcuL21lbnUuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIE1lbnVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLW1lbnUnO1xuICBzdWJNZW51UHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tc3ViLW1lbnUnO1xuICByYWRpb1ByZWZpeENsczogc3RyaW5nID0gJ2FtLXJhZGlvJztcbiAgbXVsdGlTZWxlY3RNZW51QnRuc0Nsczogc3RyaW5nID0gJ2FtLW11bHRpLXNlbGVjdC1idG5zJztcbiAgbWVudVNlbGVjdENvbnRhbmVyUHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tbWVudS1zZWxlY3QtY29udGFpbmVyJztcbiAgZmlyc3RMZXZlbFNlbGVjdFZhbHVlOiBudW1iZXIgfCBzdHJpbmc7XG4gIGhlaWdodFN0eWxlOiBvYmplY3Q7XG4gIHN1Yk1lbnVEYXRhOiBBcnJheTxhbnk+O1xuICBzaG93U2VsZWN0OiBib29sZWFuO1xuICBzdWJTZWxJbml0SXRlbTogb2JqZWN0O1xuICBsb2NhbGU6IG9iamVjdCA9IHt9O1xuXG4gIHByaXZhdGUgX2RhdGE6IEFycmF5PGFueT4gPSBbXTtcbiAgcHJpdmF0ZSBfdW5zdWJzY3JpYmUkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBASW5wdXQoKVxuICBnZXQgZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuICBzZXQgZGF0YSh2KSB7XG4gICAgdGhpcy5fZGF0YSA9IHY7XG4gICAgdGhpcy5pbml0RGF0YSgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGxldmVsOiBudW1iZXIgPSAyO1xuICBASW5wdXQoKVxuICB2YWx1ZTogQXJyYXk8YW55PiA9IFtdO1xuICBASW5wdXQoKVxuICBoZWlnaHQ6IG51bWJlciA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgLyAyO1xuICBASW5wdXQoKVxuICBtdWx0aVNlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbk9rOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25DYW5jZWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9jYWxlUHJvdmlkZXJTZXJ2aWNlOiBMb2NhbGVQcm92aWRlclNlcnZpY2UpIHt9XG5cbiAgb25NZW51T2soKSB7XG4gICAgdGhpcy5vbk9rLmVtaXQodGhpcy52YWx1ZSk7XG4gIH1cblxuICBvbk1lbnVDYW5jZWwoKSB7XG4gICAgdGhpcy5vbkNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICBnZXROZXdGc3YoKSB7XG4gICAgbGV0IGZpcnN0VmFsdWUgPSAnJztcbiAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlLmxlbmd0aCkge1xuICAgICAgZmlyc3RWYWx1ZSA9IHRoaXMudmFsdWVbMF0gYXMgc3RyaW5nO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLmxlbmd0aCAmJiAhdGhpcy5fZGF0YVswXS5pc0xlYWYpIHtcbiAgICAgIGZpcnN0VmFsdWUgPSB0aGlzLl9kYXRhWzBdLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RWYWx1ZTtcbiAgfVxuXG4gIG9uQ2xpY2tGaXJzdExldmVsSXRlbShkYXRhSXRlbSkge1xuICAgIHRoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlID0gZGF0YUl0ZW0udmFsdWU7XG4gICAgaWYgKGRhdGFJdGVtLmlzTGVhZiAmJiB0aGlzLm9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoW2RhdGFJdGVtLnZhbHVlXSk7XG4gICAgfVxuICAgIHRoaXMuaW5pdERhdGEoKTtcbiAgfVxuXG4gIG9uQ2xpY2tTdWJNZW51SXRlbShkYXRhSXRlbSkge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLmdldFNlbGVjdFZhbHVlKGRhdGFJdGVtKTtcbiAgICB0aGlzLmluaXREYXRhKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIGdldFNlbGVjdFZhbHVlKGRhdGFJdGVtKSB7XG4gICAgaWYgKHRoaXMubXVsdGlTZWxlY3QpIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAodGhpcy5sZXZlbCA9PT0gMiAmJiB0aGlzLnZhbHVlWzBdICE9PSB0aGlzLmZpcnN0TGV2ZWxTZWxlY3RWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiBbdGhpcy5maXJzdExldmVsU2VsZWN0VmFsdWUsIFtkYXRhSXRlbS52YWx1ZV1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmxldmVsID09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNob3NlblZhbHVlcyA9IEFycmF5LmZyb20odGhpcy52YWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBleGlzdEluZGV4ID0gY2hvc2VuVmFsdWVzLmluZGV4T2YoZGF0YUl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgaWYgKGV4aXN0SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgIGNob3NlblZhbHVlcy5wdXNoKGRhdGFJdGVtLnZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNob3NlblZhbHVlcy5zcGxpY2UoZXhpc3RJbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2hvc2VuVmFsdWVzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjaG9zZW5WYWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMudmFsdWVbMV0pO1xuICAgICAgICAgICAgY29uc3QgZXhpc3RJbmRleCA9IGNob3NlblZhbHVlcy5pbmRleE9mKGRhdGFJdGVtLnZhbHVlKTtcbiAgICAgICAgICAgIGlmIChleGlzdEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICBjaG9zZW5WYWx1ZXMucHVzaChkYXRhSXRlbS52YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaG9zZW5WYWx1ZXMuc3BsaWNlKGV4aXN0SW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmZpcnN0TGV2ZWxTZWxlY3RWYWx1ZSwgY2hvc2VuVmFsdWVzXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxldmVsID09PSAyID8gW3RoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlLCBbZGF0YUl0ZW0udmFsdWVdXSA6IFtkYXRhSXRlbS52YWx1ZV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxldmVsID09PSAyID8gW3RoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlLCBkYXRhSXRlbS52YWx1ZV0gOiBbZGF0YUl0ZW0udmFsdWVdO1xuICB9XG5cbiAgaW5pdERhdGEoKSB7XG4gICAgdGhpcy5zdWJNZW51RGF0YSA9IHRoaXMuX2RhdGE7XG4gICAgaWYgKHRoaXMubGV2ZWwgPT09IDIpIHtcbiAgICAgIGxldCBwYXJlbnQgPSB0aGlzLl9kYXRhO1xuICAgICAgaWYgKHRoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlICYmIHRoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlICE9PSAnJykge1xuICAgICAgICBwYXJlbnQgPSB0aGlzLl9kYXRhLmZpbHRlcihkYXRhSXRlbSA9PiBkYXRhSXRlbS52YWx1ZSA9PT0gdGhpcy5maXJzdExldmVsU2VsZWN0VmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudFswXSAmJiBwYXJlbnRbMF0uY2hpbGRyZW4gJiYgcGFyZW50WzBdLmlzTGVhZiAhPT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnN1Yk1lbnVEYXRhID0gcGFyZW50WzBdLmNoaWxkcmVuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdWJNZW51RGF0YSA9IFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzdWJWYWx1ZSA9ICh0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoID4gMCAmJiBbLi4udGhpcy52YWx1ZV0pIHx8IFtdO1xuICAgIGlmICh0aGlzLmxldmVsID09PSAyICYmIHN1YlZhbHVlLmxlbmd0aCA+IDEpIHtcbiAgICAgIHN1YlZhbHVlLnNoaWZ0KCk7XG4gICAgICBpZiAodGhpcy5tdWx0aVNlbGVjdCkge1xuICAgICAgICBzdWJWYWx1ZSA9IHN1YlZhbHVlWzBdIGFzIHN0cmluZ1tdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3ViU2VsSW5pdEl0ZW0gPSB0aGlzLnN1Yk1lbnVEYXRhLmZpbHRlcihkYXRhSXRlbSA9PiBzdWJWYWx1ZS5pbmRleE9mKGRhdGFJdGVtLnZhbHVlKSAhPT0gLTEpLm1hcChpdGVtID0+IHtcbiAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcGFyZW50VmFsdWUgPSB0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoID4gMSAmJiB0aGlzLmxldmVsID09PSAyID8gdGhpcy52YWx1ZVswXSA6IG51bGw7XG5cbiAgICB0aGlzLnNob3dTZWxlY3QgPSB0cnVlO1xuICAgIGlmICh0aGlzLmxldmVsID09PSAyICYmIHBhcmVudFZhbHVlICE9PSB0aGlzLmZpcnN0TGV2ZWxTZWxlY3RWYWx1ZSkge1xuICAgICAgdGhpcy5zaG93U2VsZWN0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3MoZGF0YUl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhSXRlbVNlbGVjdGVkKGRhdGFJdGVtKSA/IHRoaXMucHJlZml4Q2xzICsgJy1zZWxlY3RlZCcgOiAnJztcbiAgfVxuXG4gIGRhdGFJdGVtU2VsZWN0ZWQoZGF0YUl0ZW0pIHtcbiAgICByZXR1cm4gZGF0YUl0ZW0udmFsdWUgPT09IHRoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fbG9jYWxlUHJvdmlkZXJTZXJ2aWNlLmxvY2FsZUNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICB0aGlzLmxvY2FsZSA9IHRoaXMuX2xvY2FsZVByb3ZpZGVyU2VydmljZS5nZXRMb2NhbGVTdWJPYmooJ01lbnUnKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlID0gdGhpcy5nZXROZXdGc3YoKTtcblxuICAgIHRoaXMuaGVpZ2h0U3R5bGUgPSB7XG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0ICsgJ3B4J1xuICAgIH07XG4gICAgdGhpcy5pbml0RGF0YSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLl91bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnU3ViTWVudSwgbnptLXN1Yi1tZW51JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N1Yi1tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgU3ViTWVudUNvbXBvbmVudCB7XG4gIHByZWZpeENscyA9ICdhbS1zdWItbWVudSc7XG5cbiAgcHJpdmF0ZSBfc3ViTWVudVByZWZpeENsczogc3RyaW5nO1xuICBwcml2YXRlIF9yYWRpb1ByZWZpeENsczogc3RyaW5nO1xuICBwcml2YXRlIF9zdWJNZW51RGF0YTtcbiAgcHJpdmF0ZSBfc2hvd1NlbGVjdDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfc2VsSXRlbTtcbiAgcHJpdmF0ZSBfbXVsdGlTZWxlY3Q/OiBib29sZWFuO1xuXG4gIEBPdXRwdXQoKVxuICBvblNlbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASW5wdXQoKVxuICBnZXQgc3ViTWVudVByZWZpeENscygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdWJNZW51UHJlZml4Q2xzO1xuICB9XG4gIHNldCBzdWJNZW51UHJlZml4Q2xzKHY6IHN0cmluZykge1xuICAgIHRoaXMuX3N1Yk1lbnVQcmVmaXhDbHMgPSB2O1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCByYWRpb1ByZWZpeENscygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9yYWRpb1ByZWZpeENscztcbiAgfVxuICBzZXQgcmFkaW9QcmVmaXhDbHModjogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmFkaW9QcmVmaXhDbHMgPSB2O1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBzdWJNZW51RGF0YSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9zdWJNZW51RGF0YTtcbiAgfVxuICBzZXQgc3ViTWVudURhdGEodjogYW55KSB7XG4gICAgdGhpcy5fc3ViTWVudURhdGEgPSB2O1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBzaG93U2VsZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93U2VsZWN0O1xuICB9XG4gIHNldCBzaG93U2VsZWN0KHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93U2VsZWN0ID0gdjtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgc2VsSXRlbSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9zZWxJdGVtO1xuICB9XG4gIHNldCBzZWxJdGVtKHY6IGFueSkge1xuICAgIHRoaXMuX3NlbEl0ZW0gPSB2O1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBtdWx0aVNlbGVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlTZWxlY3Q7XG4gIH1cbiAgc2V0IG11bHRpU2VsZWN0KHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9tdWx0aVNlbGVjdCA9IHY7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgb25DbGljayhkYXRhSXRlbSkge1xuICAgIHRoaXMub25TZWwuZW1pdChkYXRhSXRlbSk7XG4gIH1cblxuICBzZWxlY3RlZChkYXRhSXRlbSkge1xuICAgIHJldHVybiB0aGlzLl9zaG93U2VsZWN0ICYmICh0aGlzLl9zZWxJdGVtLmxlbmd0aCA+IDAgJiYgdGhpcy5fc2VsSXRlbS5pbmRleE9mKGRhdGFJdGVtLnZhbHVlKSAhPT0gLTEpO1xuICB9XG5cbiAgZ2V0Q2xhc3MoZGF0YUl0ZW0pIHtcbiAgICBsZXQgbmFtZSA9IHRoaXMuX3JhZGlvUHJlZml4Q2xzICsgJy1pdGVtICc7XG4gICAgbmFtZSArPSB0aGlzLnNlbGVjdGVkKGRhdGFJdGVtKSA/IHRoaXMuX3N1Yk1lbnVQcmVmaXhDbHMgKyAnLWl0ZW0tc2VsZWN0ZWQnIDogJyc7XG4gICAgbmFtZSArPSBkYXRhSXRlbS5kaXNhYmxlZCA/IHRoaXMuX3N1Yk1lbnVQcmVmaXhDbHMgKyAnLWl0ZW0tZGlzYWJsZWQnIDogJyc7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRmxleE1vZHVsZSB9IGZyb20gJy4uL2ZsZXgvZmxleC5tb2R1bGUnO1xuaW1wb3J0IHsgTGlzdE1vZHVsZSB9IGZyb20gJy4uL2xpc3QvbGlzdC5tb2R1bGUnO1xuaW1wb3J0IHsgUmFkaW9Nb2R1bGUgfSBmcm9tICcuLi9yYWRpby9yYWRpby5tb2R1bGUnO1xuaW1wb3J0IHsgQ2hlY2tib3hNb2R1bGUgfSBmcm9tICcuLi9jaGVja2JveC9jaGVja2JveC5tb2R1bGUnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5tb2R1bGUnO1xuaW1wb3J0IHsgTWVudUNvbXBvbmVudCB9IGZyb20gJy4vbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3ViTWVudUNvbXBvbmVudCB9IGZyb20gJy4vc3ViLW1lbnUvc3ViLW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IExvY2FsZVByb3ZpZGVyTW9kdWxlIH0gZnJvbSAnLi4vbG9jYWxlLXByb3ZpZGVyL2xvY2FsZS1wcm92aWRlci5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGbGV4TW9kdWxlLCBMaXN0TW9kdWxlLCBSYWRpb01vZHVsZSwgQ2hlY2tib3hNb2R1bGUsIEJ1dHRvbk1vZHVsZV0sXG4gIGV4cG9ydHM6IFtNZW51Q29tcG9uZW50LCBTdWJNZW51Q29tcG9uZW50XSxcbiAgZGVjbGFyYXRpb25zOiBbTWVudUNvbXBvbmVudCwgU3ViTWVudUNvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW0xvY2FsZVByb3ZpZGVyTW9kdWxlXVxufSlcblxuZXhwb3J0IGNsYXNzIE1lbnVNb2R1bGUge1xufVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSW5wdXQsXG4gIEhvc3RCaW5kaW5nLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgRWxlbWVudFJlZixcbiAgT25DaGFuZ2VzLFxuICBBZnRlclZpZXdDaGVja2VkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdEcmF3ZXIsIG56bS1kcmF3ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJhd2VyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBEcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1kcmF3ZXInO1xuICBzaWRlYmFyU3R5bGVGaW5hbDogeyBbazogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgY29udGVudFN0eWxlRmluYWw6IHsgW2s6IHN0cmluZ106IGFueSB9ID0ge307XG4gIG92ZXJsYXlTdHlsZUZpbmFsOiB7IFtrOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBzaWRlYmFyV2lkdGg6IG51bWJlciA9IDA7XG4gIHNpZGViYXJIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHNpZGViYXJUb3A6IG51bWJlciA9IDA7XG4gIGRyYWdIYW5kbGVUb3A6IG51bWJlciA9IDA7XG4gIHRvdWNoSWRlbnRpZmllcjogbnVtYmVyID0gbnVsbDtcbiAgdG91Y2hTdGFydFg6IG51bWJlciA9IG51bGw7XG4gIHRvdWNoU3RhcnRZOiBudW1iZXIgPSBudWxsO1xuICB0b3VjaEN1cnJlbnRYOiBudW1iZXIgPSBudWxsO1xuICB0b3VjaEN1cnJlbnRZOiBudW1iZXIgPSBudWxsO1xuICB0b3VjaFN1cHBvcnRlZDogYm9vbGVhbiA9IHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICYmICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdztcblxuICBwcml2YXRlIF9kb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfb3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9wb3NpdGlvbjogc3RyaW5nID0gJ2xlZnQnO1xuXG4gIEBJbnB1dCgpXG4gIHNpZGViYXI6IGFueTtcbiAgQElucHV0KClcbiAgc2lkZWJhclN0eWxlOiB7IFtrOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBASW5wdXQoKVxuICBjb250ZW50U3R5bGU6IHsgW2s6IHN0cmluZ106IGFueSB9ID0ge307XG4gIEBJbnB1dCgpXG4gIG92ZXJsYXlTdHlsZTogeyBbazogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgQElucHV0KClcbiAgZHJhZ0hhbmRsZVN0eWxlOiB7IFtrOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBASW5wdXQoKVxuICB0cmFuc2l0aW9uczogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHRvdWNoOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgZW5hYmxlRHJhZ0hhbmRsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIGRyYWdUb2dnbGVEaXN0YW5jZTogbnVtYmVyID0gMzA7XG4gIEBJbnB1dCgpXG4gIGdldCBkb2NrZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RvY2tlZDtcbiAgfVxuICBzZXQgZG9ja2VkKHYpIHtcbiAgICB0aGlzLl9kb2NrZWQgPSB2O1xuICAgIHRoaXMuZG9ja2VkQ2xzID0gdjtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgb3BlbigpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlbjtcbiAgfVxuICBzZXQgb3Blbih2KSB7XG4gICAgdGhpcy5fb3BlbiA9IHY7XG4gICAgdGhpcy5vcGVuQ2xzID0gdjtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcG9zaXRpb24odikge1xuICAgIHRoaXMuX3Bvc2l0aW9uID0gdjtcbiAgICB0aGlzLnJpZ2h0ID0gZmFsc2U7XG4gICAgdGhpcy5sZWZ0ID0gZmFsc2U7XG4gICAgdGhpcy50b3AgPSBmYWxzZTtcbiAgICB0aGlzLmJvdHRvbSA9IGZhbHNlO1xuICAgIHN3aXRjaCAodikge1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICB0aGlzLnJpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgdGhpcy5sZWZ0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICB0aGlzLnRvcCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgdGhpcy5ib3R0b20gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uT3BlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWRyYXdlcicpXG4gIGFtOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1kcmF3ZXItbGVmdCcpXG4gIGxlZnQ6IGJvb2xlYW4gPSB0aGlzLl9wb3NpdGlvbiA9PT0gJ2xlZnQnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWRyYXdlci1yaWdodCcpXG4gIHJpZ2h0OiBib29sZWFuID0gdGhpcy5fcG9zaXRpb24gPT09ICdyaWdodCc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZHJhd2VyLXRvcCcpXG4gIHRvcDogYm9vbGVhbiA9IHRoaXMuX3Bvc2l0aW9uID09ICd0b3AnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWRyYXdlci1ib3R0b20nKVxuICBib3R0b206IGJvb2xlYW4gPSB0aGlzLl9wb3NpdGlvbiA9PSAnYm90dG9tJztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1kcmF3ZXItZG9ja2VkJylcbiAgZG9ja2VkQ2xzOiBib29sZWFuID0gdGhpcy5fZG9ja2VkO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWRyYXdlci1vcGVuJylcbiAgb3BlbkNsczogYm9vbGVhbiA9IHRoaXMuX29wZW47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgb25PdmVybGF5Q2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5fb3Blbikge1xuICAgICAgdGhpcy5vbk9wZW5DaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBpc1RvdWNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnRvdWNoSWRlbnRpZmllciAhPT0gbnVsbDtcbiAgfVxuXG4gIG9uVG91Y2hTdGFydChldmVudCkge1xuICAgIGNvbnN0IHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgdGhpcy50b3VjaElkZW50aWZpZXIgPSB0b3VjaC5pZGVudGlmaWVyO1xuICAgIHRoaXMudG91Y2hTdGFydFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHRoaXMudG91Y2hTdGFydFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHRoaXMudG91Y2hDdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgdGhpcy50b3VjaEN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgfVxuXG4gIG9uVG91Y2hNb3ZlKGV2KSB7XG4gICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgZXYuY2hhbmdlZFRvdWNoZXMubGVuZ3RoOyBpbmQrKykge1xuICAgICAgaWYgKGV2LmNoYW5nZWRUb3VjaGVzW2luZF0uaWRlbnRpZmllciA9PT0gdGhpcy50b3VjaElkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy50b3VjaEN1cnJlbnRYID0gZXYuY2hhbmdlZFRvdWNoZXNbaW5kXS5jbGllbnRYO1xuICAgICAgICB0aGlzLnRvdWNoQ3VycmVudFkgPSBldi5jaGFuZ2VkVG91Y2hlc1tpbmRdLmNsaWVudFk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgb25Ub3VjaEVuZCgpIHtcbiAgICBjb25zdCB0b3VjaFdpZHRoID0gdGhpcy50b3VjaFNpZGViYXJXaWR0aCgpO1xuICAgIGlmIChcbiAgICAgICh0aGlzLl9vcGVuICYmIHRvdWNoV2lkdGggPCB0aGlzLnNpZGViYXJXaWR0aCAtIHRoaXMuZHJhZ1RvZ2dsZURpc3RhbmNlKSB8fFxuICAgICAgKCF0aGlzLl9vcGVuICYmIHRvdWNoV2lkdGggPiB0aGlzLmRyYWdUb2dnbGVEaXN0YW5jZSlcbiAgICApIHtcbiAgICAgIHRoaXMub25PcGVuQ2hhbmdlLmVtaXQoIXRoaXMuX29wZW4pO1xuICAgIH1cblxuICAgIGNvbnN0IHRvdWNoSGVpZ2h0ID0gdGhpcy50b3VjaFNpZGViYXJIZWlnaHQoKTtcbiAgICBpZiAoXG4gICAgICAodGhpcy5fb3BlbiAmJiB0b3VjaEhlaWdodCA8IHRoaXMuc2lkZWJhckhlaWdodCAtIHRoaXMuZHJhZ1RvZ2dsZURpc3RhbmNlKSB8fFxuICAgICAgKCF0aGlzLl9vcGVuICYmIHRvdWNoSGVpZ2h0ID4gdGhpcy5kcmFnVG9nZ2xlRGlzdGFuY2UpXG4gICAgKSB7XG4gICAgICB0aGlzLm9uT3BlbkNoYW5nZS5lbWl0KCF0aGlzLl9vcGVuKTtcbiAgICB9XG4gICAgdGhpcy50b3VjaElkZW50aWZpZXIgPSBudWxsO1xuICAgIHRoaXMudG91Y2hTdGFydFggPSBudWxsO1xuICAgIHRoaXMudG91Y2hTdGFydFkgPSBudWxsO1xuICAgIHRoaXMudG91Y2hDdXJyZW50WCA9IG51bGw7XG4gICAgdGhpcy50b3VjaEN1cnJlbnRZID0gbnVsbDtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgc2F2ZVNpZGViYXJTaXplKCkge1xuICAgIGNvbnN0IHNpZGViYXIgPSB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzaWRlYmFyJyk7XG4gICAgY29uc3QgZHJhZ0hhbmRsZSA9IHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI2RyYWdIYW5kbGUnKTtcblxuICAgIGNvbnN0IHdpZHRoID0gc2lkZWJhci5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBzaWRlYmFyLm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBzaWRlYmFyVG9wID0gdGhpcy5nZXRPZmZzZXQoc2lkZWJhcikudG9wO1xuICAgIGNvbnN0IGRyYWdIYW5kbGVUb3AgPSB0aGlzLmdldE9mZnNldChkcmFnSGFuZGxlKS50b3A7XG5cbiAgICBpZiAod2lkdGggIT09IHRoaXMuc2lkZWJhcldpZHRoKSB7XG4gICAgICB0aGlzLnNpZGViYXJXaWR0aCA9IHdpZHRoO1xuICAgIH1cbiAgICBpZiAoaGVpZ2h0ICE9PSB0aGlzLnNpZGViYXJIZWlnaHQpIHtcbiAgICAgIHRoaXMuc2lkZWJhckhlaWdodCA9IGhlaWdodDtcbiAgICB9XG4gICAgaWYgKHNpZGViYXJUb3AgIT09IHRoaXMuc2lkZWJhclRvcCkge1xuICAgICAgdGhpcy5zaWRlYmFyVG9wID0gc2lkZWJhclRvcDtcbiAgICB9XG4gICAgaWYgKGRyYWdIYW5kbGVUb3AgIT09IHRoaXMuZHJhZ0hhbmRsZVRvcCkge1xuICAgICAgdGhpcy5kcmFnSGFuZGxlVG9wID0gZHJhZ0hhbmRsZVRvcDtcbiAgICB9XG4gIH1cblxuICB0b3VjaFNpZGViYXJXaWR0aCgpIHtcbiAgICBpZiAodGhpcy5fcG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgIGlmICh0aGlzLl9vcGVuICYmIHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy50b3VjaFN0YXJ0WCA8IHRoaXMuc2lkZWJhcldpZHRoKSB7XG4gICAgICAgIGlmICh0aGlzLnRvdWNoQ3VycmVudFggPiB0aGlzLnRvdWNoU3RhcnRYKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhcldpZHRoICsgdGhpcy50b3VjaFN0YXJ0WCAtIHRoaXMudG91Y2hDdXJyZW50WDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zaWRlYmFyV2lkdGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gTWF0aC5taW4od2luZG93LmlubmVyV2lkdGggLSB0aGlzLnRvdWNoQ3VycmVudFgsIHRoaXMuc2lkZWJhcldpZHRoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgaWYgKHRoaXMuX29wZW4gJiYgdGhpcy50b3VjaFN0YXJ0WCA8IHRoaXMuc2lkZWJhcldpZHRoKSB7XG4gICAgICAgIGlmICh0aGlzLnRvdWNoQ3VycmVudFggPiB0aGlzLnRvdWNoU3RhcnRYKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhcldpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNpZGViYXJXaWR0aCAtIHRoaXMudG91Y2hTdGFydFggKyB0aGlzLnRvdWNoQ3VycmVudFg7XG4gICAgICB9XG4gICAgICByZXR1cm4gTWF0aC5taW4odGhpcy50b3VjaEN1cnJlbnRYLCB0aGlzLnNpZGViYXJXaWR0aCk7XG4gICAgfVxuICB9XG5cbiAgdG91Y2hTaWRlYmFySGVpZ2h0KCkge1xuICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fb3BlbiAmJlxuICAgICAgICB0aGlzLl9lbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMudG91Y2hTdGFydFkgKyB0aGlzLl9lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCA8IHRoaXMuc2lkZWJhckhlaWdodFxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnRvdWNoQ3VycmVudFkgPiB0aGlzLnRvdWNoU3RhcnRZKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhckhlaWdodCArIHRoaXMudG91Y2hTdGFydFkgLSB0aGlzLnRvdWNoQ3VycmVudFk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhckhlaWdodDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBNYXRoLm1pbihcbiAgICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgLSB0aGlzLnRvdWNoQ3VycmVudFkgKyB0aGlzLl9lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCxcbiAgICAgICAgdGhpcy5zaWRlYmFySGVpZ2h0XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ3RvcCcpIHtcbiAgICAgIGNvbnN0IHRvdWNoU3RhcnRPZmZzZXRZID0gdGhpcy50b3VjaFN0YXJ0WSAtIHRoaXMuc2lkZWJhclRvcDtcbiAgICAgIGlmICh0aGlzLl9vcGVuICYmIHRvdWNoU3RhcnRPZmZzZXRZIDwgdGhpcy5zaWRlYmFySGVpZ2h0KSB7XG4gICAgICAgIGlmICh0aGlzLnRvdWNoQ3VycmVudFkgPiB0aGlzLnRvdWNoU3RhcnRZKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhckhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zaWRlYmFySGVpZ2h0IC0gdGhpcy50b3VjaFN0YXJ0WSArIHRoaXMudG91Y2hDdXJyZW50WTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnRvdWNoQ3VycmVudFkgLSB0aGlzLmRyYWdIYW5kbGVUb3AsIHRoaXMuc2lkZWJhckhlaWdodCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyU3R5bGUoeyBzaWRlYmFyU3R5bGUsIGlzVG91Y2hpbmcsIG92ZXJsYXlTdHlsZSwgY29udGVudFN0eWxlIH0pIHtcbiAgICBpZiAodGhpcy5fcG9zaXRpb24gPT09ICdyaWdodCcgfHwgdGhpcy5fcG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgc2lkZWJhclN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKDAlKWA7XG4gICAgICBzaWRlYmFyU3R5bGUuV2Via2l0VHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoMCUpYDtcbiAgICAgIGlmIChpc1RvdWNoaW5nKSB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0aGlzLnRvdWNoU2lkZWJhcldpZHRoKCkgLyB0aGlzLnNpZGViYXJXaWR0aDtcbiAgICAgICAgLy8gc2xpZGUgb3BlbiB0byB3aGF0IHdlIGRyYWdnZWRcbiAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgc2lkZWJhclN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7KDEgLSBwZXJjZW50YWdlKSAqIDEwMH0lKWA7XG4gICAgICAgICAgc2lkZWJhclN0eWxlLldlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7KDEgLSBwZXJjZW50YWdlKSAqIDEwMH0lKWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoLSR7KDEgLSBwZXJjZW50YWdlKSAqIDEwMH0lKWA7XG4gICAgICAgICAgc2lkZWJhclN0eWxlLldlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKC0keygxIC0gcGVyY2VudGFnZSkgKiAxMDB9JSlgO1xuICAgICAgICB9XG4gICAgICAgIG92ZXJsYXlTdHlsZS5vcGFjaXR5ID0gcGVyY2VudGFnZTtcbiAgICAgICAgb3ZlcmxheVN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICB9XG4gICAgICBpZiAoY29udGVudFN0eWxlKSB7XG4gICAgICAgIGNvbnRlbnRTdHlsZVt0aGlzLl9wb3NpdGlvbl0gPSBgJHt0aGlzLnNpZGViYXJXaWR0aH1weGA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ3RvcCcgfHwgdGhpcy5fcG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICBzaWRlYmFyU3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoMCUpYDtcbiAgICAgIHNpZGViYXJTdHlsZS5XZWJraXRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgwJSlgO1xuICAgICAgaWYgKGlzVG91Y2hpbmcpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRoaXMudG91Y2hTaWRlYmFySGVpZ2h0KCkgLyB0aGlzLnNpZGViYXJIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHsoMSAtIHBlcmNlbnRhZ2UpICogMTAwfSUpYDtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUuV2Via2l0VHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHsoMSAtIHBlcmNlbnRhZ2UpICogMTAwfSUpYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgc2lkZWJhclN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKC0keygxIC0gcGVyY2VudGFnZSkgKiAxMDB9JSlgO1xuICAgICAgICAgIHNpZGViYXJTdHlsZS5XZWJraXRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgtJHsoMSAtIHBlcmNlbnRhZ2UpICogMTAwfSUpYDtcbiAgICAgICAgfVxuICAgICAgICBvdmVybGF5U3R5bGUub3BhY2l0eSA9IHBlcmNlbnRhZ2U7XG4gICAgICAgIG92ZXJsYXlTdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgfVxuICAgICAgaWYgKGNvbnRlbnRTdHlsZSkge1xuICAgICAgICBjb250ZW50U3R5bGVbdGhpcy5fcG9zaXRpb25dID0gYCR7dGhpcy5zaWRlYmFySGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgY29uc3Qgc2lkZWJhclN0eWxlID0geyAuLi50aGlzLnNpZGViYXJTdHlsZSB9O1xuICAgIGNvbnN0IGNvbnRlbnRTdHlsZSA9IHsgLi4udGhpcy5jb250ZW50U3R5bGUgfTtcbiAgICBjb25zdCBvdmVybGF5U3R5bGUgPSB7IC4uLnRoaXMub3ZlcmxheVN0eWxlIH07XG5cbiAgICBpZiAodGhpcy5pc1RvdWNoaW5nKCkpIHtcbiAgICAgIHRoaXMucmVuZGVyU3R5bGUoe1xuICAgICAgICBzaWRlYmFyU3R5bGU6IHNpZGViYXJTdHlsZSxcbiAgICAgICAgaXNUb3VjaGluZzogdHJ1ZSxcbiAgICAgICAgY29udGVudFN0eWxlOiB1bmRlZmluZWQsXG4gICAgICAgIG92ZXJsYXlTdHlsZTogb3ZlcmxheVN0eWxlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2RvY2tlZCkge1xuICAgICAgdGhpcy5kb2NrZWRDbHMgPSB0cnVlO1xuICAgICAgdGhpcy5yZW5kZXJTdHlsZSh7XG4gICAgICAgIHNpZGViYXJTdHlsZTogc2lkZWJhclN0eWxlLFxuICAgICAgICBpc1RvdWNoaW5nOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRlbnRTdHlsZTogY29udGVudFN0eWxlLFxuICAgICAgICBvdmVybGF5U3R5bGU6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9vcGVuKSB7XG4gICAgICB0aGlzLm9wZW5DbHMgPSB0cnVlO1xuICAgICAgdGhpcy5yZW5kZXJTdHlsZSh7XG4gICAgICAgIHNpZGViYXJTdHlsZTogc2lkZWJhclN0eWxlLFxuICAgICAgICBpc1RvdWNoaW5nOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRlbnRTdHlsZTogdW5kZWZpbmVkLFxuICAgICAgICBvdmVybGF5U3R5bGU6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICBvdmVybGF5U3R5bGUub3BhY2l0eSA9IDE7XG4gICAgICBvdmVybGF5U3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1RvdWNoaW5nKCkgfHwgIXRoaXMudHJhbnNpdGlvbnMpIHtcbiAgICAgIHNpZGViYXJTdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgICAgc2lkZWJhclN0eWxlLldlYmtpdFRyYW5zaXRpb24gPSAnbm9uZSc7XG4gICAgICBjb250ZW50U3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcbiAgICAgIG92ZXJsYXlTdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgIH1cbiAgICB0aGlzLnNpZGViYXJTdHlsZUZpbmFsID0gc2lkZWJhclN0eWxlO1xuICAgIHRoaXMuY29udGVudFN0eWxlRmluYWwgPSBjb250ZW50U3R5bGU7XG4gICAgdGhpcy5vdmVybGF5U3R5bGVGaW5hbCA9IG92ZXJsYXlTdHlsZTtcbiAgfVxuXG4gIGdldE9mZnNldChlbGUpIHtcbiAgICBsZXQgZWwgPSBlbGU7XG4gICAgbGV0IF94ID0gMDtcbiAgICBsZXQgX3kgPSAwO1xuICAgIHdoaWxlIChlbCAmJiAhaXNOYU4oZWwub2Zmc2V0TGVmdCkgJiYgIWlzTmFOKGVsLm9mZnNldFRvcCkpIHtcbiAgICAgIF94ICs9IGVsLm9mZnNldExlZnQgLSBlbC5zY3JvbGxMZWZ0O1xuICAgICAgX3kgKz0gZWwub2Zmc2V0VG9wIC0gZWwuc2Nyb2xsVG9wO1xuICAgICAgZWwgPSBlbC5vZmZzZXRQYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiB7IHRvcDogX3ksIGxlZnQ6IF94IH07XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlzVG91Y2hpbmcoKSkge1xuICAgICAgdGhpcy5zYXZlU2lkZWJhclNpemUoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERyYXdlckNvbXBvbmVudCB9IGZyb20gJy4vZHJhd2VyLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtEcmF3ZXJDb21wb25lbnRdLFxuICBleHBvcnRzOiBbRHJhd2VyQ29tcG9uZW50XVxufSlcblxuZXhwb3J0IGNsYXNzIERyYXdlck1vZHVsZSB7fVxuIiwiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1N3aXBlQWN0aW9uLCBuem0tc3dpcGUtYWN0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N3aXBlLWFjdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgU3dpcGVBY3Rpb24gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLXN3aXBlJztcbiAgd3JhcENsczogb2JqZWN0ID0ge307XG5cbiAgcHJpdmF0ZSBfc3dpcGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9vcGVuZWRMZWZ0OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX29wZW5lZFJpZ2h0OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2J0bnNMZWZ0V2lkdGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfYnRuc1JpZ2h0V2lkdGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfbmVlZFNob3dMZWZ0OiBib29sZWFuO1xuICBwcml2YXRlIF9uZWVkU2hvd1JpZ2h0OiBib29sZWFuO1xuICBwcml2YXRlIF9zdGFydFg6IG51bWJlcjtcblxuICBAVmlld0NoaWxkKCdsZWZ0QnRuUmVmJylcbiAgbGVmdEJ0blJlZjtcbiAgQFZpZXdDaGlsZCgncmlnaHRCdG5SZWYnKVxuICByaWdodEJ0blJlZjtcbiAgQFZpZXdDaGlsZCgnY29udGVudFJlZicpXG4gIGNvbnRlbnQ7XG4gIEBWaWV3Q2hpbGQoJ2NvdmVyUmVmJylcbiAgY292ZXI7XG5cbiAgQElucHV0KClcbiAgbGVmdDogQXJyYXk8b2JqZWN0PiA9IFtdO1xuICBASW5wdXQoKVxuICByaWdodDogQXJyYXk8b2JqZWN0PiA9IFtdO1xuICBASW5wdXQoKVxuICBhdXRvQ2xvc2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpXG4gIG9uT3BlbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQ2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHNldENsYXNzTWFwKCkge1xuICAgIHRoaXMud3JhcENscyA9IHtcbiAgICAgIFt0aGlzLnByZWZpeENsc106IHRydWUsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LXN3aXBpbmdgXTogdGhpcy5fc3dpcGluZ1xuICAgIH07XG4gIH1cblxuICBvbkNsb3NlU3dpcGUgPSAoKSA9PiB7XG4gICAgaWYgKCEodGhpcy5fb3BlbmVkTGVmdCB8fCB0aGlzLl9vcGVuZWRSaWdodCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9O1xuXG4gIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLl9vcGVuZWRMZWZ0IHx8IHRoaXMuX29wZW5lZFJpZ2h0KSB7XG4gICAgICB0aGlzLm9uQ2xvc2UuZW1pdCgpO1xuICAgIH1cbiAgICB0aGlzLnNldEJ0blN0eWxlKDApO1xuICAgIHRoaXMuX29wZW5lZExlZnQgPSBmYWxzZTtcbiAgICB0aGlzLl9vcGVuZWRSaWdodCA9IGZhbHNlO1xuICB9XG5cbiAgc2V0QnRuU3R5bGUodmFsdWUpIHtcbiAgICBjb25zdCBsaW1pdCA9IHZhbHVlID4gMCA/IHRoaXMuX2J0bnNMZWZ0V2lkdGggOiAtdGhpcy5fYnRuc1JpZ2h0V2lkdGg7XG4gICAgY29uc3QgY29udGVudExlZnQgPSB0aGlzLmdldENvbnRlbnRFYXNpbmcodmFsdWUsIGxpbWl0KTtcbiAgICB0aGlzLmNvbnRlbnQubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7Y29udGVudExlZnR9cHhgO1xuICAgIHRoaXMuY292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gTWF0aC5hYnModmFsdWUpID4gMCA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgdGhpcy5jb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtjb250ZW50TGVmdH1weGA7XG4gIH1cblxuICBnZXRDb250ZW50RWFzaW5nKHZhbHVlLCBsaW1pdCkge1xuICAgIHJldHVybiBNYXRoLmFicyh2YWx1ZSkgLSBNYXRoLmFicyhsaW1pdCkgPiAwID8gbGltaXQgOiB2YWx1ZTtcbiAgfVxuXG4gIG9uVG91Y2hTdGFydCA9IGUgPT4ge1xuICAgIHRoaXMuX3N0YXJ0WCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICB0aGlzLl9zd2lwaW5nID0gdHJ1ZTtcbiAgfTtcblxuICBvblRvdWNoTW92ZShlKSB7XG4gICAgY29uc3QgZGVsdGFYID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fc3RhcnRYO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLl9uZWVkU2hvd1JpZ2h0ID0gZGVsdGFYIDwgMCAmJiB0aGlzLnJpZ2h0Lmxlbmd0aCA+IDA7XG4gICAgdGhpcy5fbmVlZFNob3dMZWZ0ID0gZGVsdGFYID4gMCAmJiB0aGlzLmxlZnQubGVuZ3RoID4gMDtcbiAgICBpZiAodGhpcy5sZWZ0QnRuUmVmKSB7XG4gICAgICB0aGlzLmxlZnRCdG5SZWYubmF0aXZlRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gdGhpcy5fbmVlZFNob3dSaWdodCA/ICdoaWRkZW4nIDogJ3Zpc2libGUnO1xuICAgIH1cbiAgICBpZiAodGhpcy5yaWdodEJ0blJlZikge1xuICAgICAgdGhpcy5yaWdodEJ0blJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSB0aGlzLl9uZWVkU2hvd0xlZnQgPyAnaGlkZGVuJyA6ICd2aXNpYmxlJztcbiAgICB9XG4gICAgdGhpcy5zZXRCdG5TdHlsZShkZWx0YVgpO1xuICB9XG5cbiAgb25Ub3VjaEVuZChlKSB7XG4gICAgY29uc3QgZGVsdGFYID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fc3RhcnRYO1xuXG4gICAgY29uc3QgbmVlZE9wZW5SaWdodCA9IHRoaXMuX25lZWRTaG93UmlnaHQgJiYgTWF0aC5hYnMoZGVsdGFYKSA+IHRoaXMuX2J0bnNSaWdodFdpZHRoIC8gMjtcbiAgICBjb25zdCBuZWVkT3BlbkxlZnQgPSB0aGlzLl9uZWVkU2hvd0xlZnQgJiYgTWF0aC5hYnMoZGVsdGFYKSA+IHRoaXMuX2J0bnNMZWZ0V2lkdGggLyAyO1xuXG4gICAgaWYgKG5lZWRPcGVuUmlnaHQpIHtcbiAgICAgIHRoaXMuZG9PcGVuUmlnaHQoKTtcbiAgICB9IGVsc2UgaWYgKG5lZWRPcGVuTGVmdCkge1xuICAgICAgdGhpcy5kb09wZW5MZWZ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fc3dpcGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX25lZWRTaG93TGVmdCA9IGZhbHNlO1xuICAgIHRoaXMuX25lZWRTaG93UmlnaHQgPSBmYWxzZTtcbiAgfVxuXG4gIGRvT3BlbkxlZnQoKSB7XG4gICAgdGhpcy5vcGVuKHRoaXMuX2J0bnNMZWZ0V2lkdGgsIHRydWUsIGZhbHNlKTtcbiAgfVxuXG4gIGRvT3BlblJpZ2h0KCkge1xuICAgIHRoaXMub3BlbigtdGhpcy5fYnRuc1JpZ2h0V2lkdGgsIGZhbHNlLCB0cnVlKTtcbiAgfVxuXG4gIG9uQnRuQ2xpY2soZXYsIGJ0bikge1xuICAgIGNvbnN0IG9uUHJlc3MgPSBidG4ub25QcmVzcztcbiAgICBpZiAob25QcmVzcykge1xuICAgICAgb25QcmVzcyhldik7XG4gICAgfVxuICAgIGlmICh0aGlzLmF1dG9DbG9zZSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW4odmFsdWUsIG9wZW5lZExlZnQsIG9wZW5lZFJpZ2h0KSB7XG4gICAgdGhpcy5vbk9wZW4uZW1pdCgpO1xuICAgIHRoaXMuX29wZW5lZExlZnQgPSBvcGVuZWRMZWZ0O1xuICAgIHRoaXMuX29wZW5lZFJpZ2h0ID0gb3BlbmVkUmlnaHQ7XG4gICAgdGhpcy5zZXRCdG5TdHlsZSh2YWx1ZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fYnRuc0xlZnRXaWR0aCA9IHRoaXMubGVmdEJ0blJlZiA/IHRoaXMubGVmdEJ0blJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIDogMDtcbiAgICB0aGlzLl9idG5zUmlnaHRXaWR0aCA9IHRoaXMucmlnaHRCdG5SZWYgPyB0aGlzLnJpZ2h0QnRuUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggOiAwO1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25DbG9zZVN3aXBlLCB0cnVlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25DbG9zZVN3aXBlLCB0cnVlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTd2lwZUFjdGlvbiB9IGZyb20gJy4vc3dpcGUtYWN0aW9uLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbU3dpcGVBY3Rpb25dLFxuICBkZWNsYXJhdGlvbnM6IFtTd2lwZUFjdGlvbl0sXG4gIHByb3ZpZGVyczogW10sXG59KVxuXG5leHBvcnQgY2xhc3MgU3dpcGVBY3Rpb25Nb2R1bGUgeyB9XG4iLCJpbXBvcnQge1xuICBWaWV3Q29udGFpbmVyUmVmLFxuICBWaWV3Q2hpbGQsXG4gIEhvc3RMaXN0ZW5lcixcbiAgQ29tcG9uZW50LFxuICBUZW1wbGF0ZVJlZixcbiAgSW5wdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSG9zdEJpbmRpbmdcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5leHBvcnQgaW50ZXJmYWNlIEluZGljYXRvciB7XG4gIGFjdGl2YXRlPzogYW55O1xuICBkZWFjdGl2YXRlPzogYW55O1xuICByZWxlYXNlPzogYW55O1xuICBmaW5pc2g/OiBhbnk7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1B1bGxUb1JlZnJlc2gsIG56bS1wdWxsLXRvLXJlZnJlc2gnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHVsbC10by1yZWZyZXNoLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBQdWxsVG9SZWZyZXNoQ29tcG9uZW50IHtcbiAgdHJhbnN0aW9uQ2xzOiBhbnkgPSB7fTtcbiAgc3R5bGU6IG9iamVjdCA9IHtcbiAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNsYXRlM2QoIDAsIDAsIDAgKScsXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoIDAsIDAsIDAgKSdcbiAgfTtcbiAgc3RhcnRZOiBudW1iZXI7XG4gIHN0YXRlOiBhbnkgPSB7XG4gICAgY3VyclN0OiAnZGVhY3RpdmF0ZScsXG4gICAgZHJhZzogZmFsc2VcbiAgfTtcblxuICBwcml2YXRlIF9pbmRpY2F0b3I6IEluZGljYXRvciA9IHtcbiAgICBhY3RpdmF0ZTogJ8Omwp3CvsOlwrzCgMOnwqvCi8Olwo3Cs8OlwojCt8OmwpbCsCcsXG4gICAgZGVhY3RpdmF0ZTogJ8OkwrjCi8OmwovCicOlwo/Cr8OkwrvCpcOlwojCt8OmwpbCsCcsXG4gICAgcmVsZWFzZTogJ8OlwojCt8OmwpbCsMOkwrjCrcOjwoDCgsOjwoDCgsOjwoDCgicsXG4gICAgZmluaXNoOiAnw6XCrsKMw6bCiMKQw6XCiMK3w6bClsKwJ1xuICB9O1xuICBwcml2YXRlIF9kaXJlY3Rpb246IHN0cmluZyA9ICdkb3duJztcbiAgcHJpdmF0ZSBfY2xpZW50SGVpZ2h0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9jdXJyZW50Q29udGVudEhlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfZm9vdGVySGVpZ2h0OiBudW1iZXIgPSA1NDtcbiAgcHJpdmF0ZSBfbGFzdGNvbnRlbnRPZmZzZXQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX3ZpZXdIZWlnaHQ6IG51bWJlciA9IE1hdGgubWF4KHdpbmRvdy5pbm5lckhlaWdodCwgd2luZG93LmlubmVyV2lkdGgpO1xuXG4gIEBWaWV3Q2hpbGQoJ3B1bGxUb1JlZnJlc2gnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgcHJpdmF0ZSBfcHVsbFRvUmVmcmVzaDogVmlld0NvbnRhaW5lclJlZjtcblxuICBASW5wdXQoKVxuICBzY3JvbGxSZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGRpc3RhbmNlVG9SZWZyZXNoOiBudW1iZXIgPSAyNTsgLy/DqMKnwqbDpcKPwpHDpcKIwrfDpsKWwrDDqMK3wp3Dp8KmwrtcbiAgQElucHV0KClcbiAgZGFtcGluZzogbnVtYmVyID0gMTAwOyAvLyDDpMK4wovDpsKLwonDp8KawoTDpsKcwoDDpcKkwqfDqMK3wp3Dp8KmwrtcbiAgQElucHV0KClcbiAgZ2V0IGRpcmVjdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJlY3Rpb247XG4gIH1cbiAgc2V0IGRpcmVjdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGlyZWN0aW9uID0gdmFsdWU7XG4gICAgdGhpcy5yZWZyZXNoVXAgPSB0aGlzLl9kaXJlY3Rpb24gPT09ICd1cCc7XG4gICAgdGhpcy5yZWZyZXNoRG93biA9IHRoaXMuX2RpcmVjdGlvbiA9PT0gJ2Rvd24nO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBpbmRpY2F0b3IoKTogSW5kaWNhdG9yIHtcbiAgICByZXR1cm4gdGhpcy5faW5kaWNhdG9yO1xuICB9XG4gIHNldCBpbmRpY2F0b3IodmFsdWU6IEluZGljYXRvcikge1xuICAgIHRoaXMuX2luZGljYXRvci5hY3RpdmF0ZSA9IHZhbHVlLmFjdGl2YXRlID8gdmFsdWUuYWN0aXZhdGUgOiB0aGlzLl9pbmRpY2F0b3IuYWN0aXZhdGU7XG4gICAgdGhpcy5faW5kaWNhdG9yLmRlYWN0aXZhdGUgPSB2YWx1ZS5kZWFjdGl2YXRlID8gdmFsdWUuZGVhY3RpdmF0ZSA6IHRoaXMuX2luZGljYXRvci5kZWFjdGl2YXRlO1xuICAgIHRoaXMuX2luZGljYXRvci5yZWxlYXNlID0gdmFsdWUucmVsZWFzZSA/IHZhbHVlLnJlbGVhc2UgOiB0aGlzLl9pbmRpY2F0b3IucmVsZWFzZTtcbiAgICB0aGlzLl9pbmRpY2F0b3IuZmluaXNoID0gdmFsdWUuZmluaXNoID8gdmFsdWUuZmluaXNoIDogdGhpcy5faW5kaWNhdG9yLmZpbmlzaDtcbiAgfVxuICBAT3V0cHV0KClcbiAgZm9vdGVyUmVmcmVzaDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKVxuICBvblJlZnJlc2g6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tcHVsbC10by1yZWZyZXNoJylcbiAgcmVmcmVzaDogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc3VwZXItY29udGFpbmVyJylcbiAgY29udGFpbmVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1wdWxsLXRvLXJlZnJlc2gtdXAnKVxuICByZWZyZXNoVXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1wdWxsLXRvLXJlZnJlc2gtZG93bicpXG4gIHJlZnJlc2hEb3duOiBib29sZWFuID0gdHJ1ZTtcblxuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgdG91Y2hzdGFydChlKSB7XG4gICAgaWYgKHRoaXMuX2RpcmVjdGlvbiA9PT0gJ2Rvd24nKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3B1bGx0b3JlZnJlc2gnKVswXS5zY3JvbGxUb3AgPiAwKSB7XG4gICAgICAgIHRoaXMuc3RhcnRZID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXJ0WSA9IGUgJiYgZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdICYmIGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICAgIHRoaXMuc3RhdGUuZHJhZyA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydFkgPSBlICYmIGUuY2hhbmdlZFRvdWNoZXMgJiYgZS5jaGFuZ2VkVG91Y2hlc1swXSAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICB0aGlzLl9jbGllbnRIZWlnaHQgPSB0aGlzLl9wdWxsVG9SZWZyZXNoLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB0aGlzLl9jdXJyZW50Q29udGVudEhlaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwdWxsdG9yZWZyZXNoJylbMF0uY2xpZW50SGVpZ2h0O1xuICAgIH1cbiAgICB0aGlzLnRyYW5zdGlvbkNscyA9ICcnO1xuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNobW92ZScsIFsnJGV2ZW50J10pXG4gIHRvdWNobW92ZShlKSB7XG4gICAgaWYgKHRoaXMuX2RpcmVjdGlvbiA9PT0gJ2Rvd24nKSB7XG4gICAgICBpZiAoIXRoaXMuc3RhcnRZKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBkaXN0YW5jZVkgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICAgIGlmIChkaXN0YW5jZVkgPCAwKSB7XG4gICAgICAgIC8vIMOmwrvCmsOlworCqFxuICAgICAgICB0aGlzLnN0YXRlLmRyYWcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIMOkwrjCi8OmwovCiVxuICAgICAgICB0aGlzLnN0YXRlLmRyYWcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RhdGUuZHJhZykge1xuICAgICAgICAvLyDDp8KmwoHDpsKtwqLDpsK7wprDpcKKwqhcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRpc3RhbmNlWSA+IHRoaXMuZGFtcGluZykge1xuICAgICAgICAvL8Olwr3Ck8OowrbChcOowr/Ch8Oowq7CvsOlwq7CmsOpwpjCiMOlwoDCvMOmwpjCr8OvwrzCjMOnwrzCk8OmwoXCosOlwqLCnsOlworCoFxuICAgICAgICBkaXN0YW5jZVkgPSAoZGlzdGFuY2VZIC8gKGRpc3RhbmNlWSArIHRoaXMuZGFtcGluZykpICogdGhpcy5kYW1waW5nICogMjtcbiAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2VZIDwgMCkge1xuICAgICAgICBkaXN0YW5jZVkgPSAwO1xuICAgICAgfVxuICAgICAgaWYgKGRpc3RhbmNlWSA+IHRoaXMuZGlzdGFuY2VUb1JlZnJlc2gpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5jdXJyU3QgPSAnYWN0aXZhdGUnO1xuICAgICAgfVxuICAgICAgdGhpcy5zdHlsZSA9IHtcbiAgICAgICAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZTNkKCAwLCAnICsgZGlzdGFuY2VZICsgJ3B4LCAwICknLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCggMCwgJyArIGRpc3RhbmNlWSArICdweCwgMCApJ1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGRpc3RhbmNlWSA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xuICAgICAgLy/DpcKQwpHDpMK4worDpsKLwonDpcKKwqjDp8KawoTDpsKXwrbDpcKAwpnDr8K8wozDpcKmwoLDpsKewpzDpcK9wpPDpcKJwo3Dp8KqwpfDpcKPwqPDpcKGwoXDpcKuwrnDpsKywqHDpsKcwonDpsK7wprDpcKIwrDDpsKcwoDDpcKQwo7Dr8K8wozDpcKIwpnDpMK4wo3DpcKuwp7Dp8KOwrDDpsKLwpbDpcKKwqjDp8KawoTDpcKKwqjDpMK9wpzDr8K8wpvDpcKQwpHDpMK4wovDpsK7wprDpcKKwqjDpMK4wo3DpcKuwp7Dp8KOwrDDpsKLwpbDpcKKwqjDpcKKwqjDpMK9wpxcbiAgICAgIGlmIChcbiAgICAgICAgTWF0aC5hYnModGhpcy5fbGFzdGNvbnRlbnRPZmZzZXQpIDw9IHRoaXMuX2NsaWVudEhlaWdodCAtIHRoaXMuX2N1cnJlbnRDb250ZW50SGVpZ2h0IC0gdGhpcy5kaXN0YW5jZVRvUmVmcmVzaCB8fFxuICAgICAgICBkaXN0YW5jZVkgPiAwXG4gICAgICApIHtcbiAgICAgICAgLy8gw6bCu8Kaw6XCisKoXG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZyA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gw6TCuMKKw6bCi8KJXG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdGF0ZS5kcmFnKSB7XG4gICAgICAgIC8vIMOnwqbCgcOmwq3CosOmwrvCmsOlworCqFxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvL8OlwqbCgsOmwp7CnMOmwrvCkcOlworCqMOlwojCsMOlwrrClcOpwoPCqMOkwrrChsOvwrzCjMOmwrvCkcOlworCqMOowrfCncOnwqbCu8OpwprCj8Onwp3CgMOmwovCicOlworCqMOnwprChMOowrfCncOnwqbCu8OlwqLCnsOlworCoMOnwrzCk8OmwoXCosOlwqLCnsOlworCoFxuICAgICAgZGlzdGFuY2VZID0gLShkaXN0YW5jZVkgLyAoZGlzdGFuY2VZIC0gdGhpcy5kYW1waW5nKSkgKiB0aGlzLmRhbXBpbmc7XG4gICAgICBpZiAoTWF0aC5hYnMoZGlzdGFuY2VZKSA+IHRoaXMuZGlzdGFuY2VUb1JlZnJlc2gpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5jdXJyU3QgPSAnYWN0aXZhdGUnO1xuICAgICAgfVxuICAgICAgdGhpcy5zdHlsZSA9IHtcbiAgICAgICAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZTNkKCAwLCAnICsgZGlzdGFuY2VZICsgJ3B4LCAwICknLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCggMCwgJyArIGRpc3RhbmNlWSArICdweCwgMCApJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hlbmQnLCBbJyRldmVudCddKVxuICB0b3VjaGVuZChlKSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0WSB8fCB0aGlzLnN0YXRlLmRyYWcgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpc3RhbmNlWSA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xuICAgIGlmIChNYXRoLmFicyhkaXN0YW5jZVkpID49IHRoaXMuZGlzdGFuY2VUb1JlZnJlc2gpIHtcbiAgICAgIHRoaXMuc3RhdGUuY3VyclN0ID0gJ3JlbGVhc2UnO1xuICAgICAgaWYgKHRoaXMuX2RpcmVjdGlvbiA9PT0gJ2Rvd24nKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlWSh0aGlzLmRpc3RhbmNlVG9SZWZyZXNoICsgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVkoLXRoaXMuZGlzdGFuY2VUb1JlZnJlc2ggLSAxKTtcbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN0YXRlLmN1cnJTdCA9ICdmaW5pc2gnO1xuICAgICAgICB0aGlzLm9uUmVmcmVzaC5lbWl0KCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3RhdGUuY3VyclN0ID0gJ2RlYWN0aXZhdGUnO1xuICAgICAgICAgIHRoaXMudHJhbnNsYXRlWSgwKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9LCA1MDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYW5zbGF0ZVkoMCk7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgWyckZXZlbnQnXSlcbiAgdG91Y2hjYW5jZWwoZXZ0KSB7XG4gICAgdGhpcy50cmFuc2xhdGVZKDApO1xuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3Njcm9sbCcsIFsnJGV2ZW50J10pXG4gIHNjcm9sbChldnQpIHtcbiAgICBjb25zdCBjb250ZW50T2Zmc2V0ID0gZXZ0LnRhcmdldC5zY3JvbGxUb3A7XG4gICAgY29uc3Qgb2Zmc2V0ID0gY29udGVudE9mZnNldCAtIHRoaXMuX2xhc3Rjb250ZW50T2Zmc2V0O1xuICAgIHRoaXMuX2xhc3Rjb250ZW50T2Zmc2V0ID0gY29udGVudE9mZnNldDtcbiAgICBpZiAoIXRoaXMuc2Nyb2xsUmVmcmVzaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBvZmZzZXQgPiAwICYmXG4gICAgICBjb250ZW50T2Zmc2V0ID4gMCAmJlxuICAgICAgZXZ0LnRhcmdldC5zY3JvbGxUb3AgKyB0aGlzLl92aWV3SGVpZ2h0ID4gZXZ0LnRhcmdldC5zY3JvbGxIZWlnaHQgLSB0aGlzLl9mb290ZXJIZWlnaHQgLyAyXG4gICAgKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5mb290ZXJSZWZyZXNoLmVtaXQoJ2ZpbmlzaGVkJyk7XG4gICAgICB9LCA1MDApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBpc1RlbXBsYXRlUmVmKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcbiAgICB9XG4gIH1cblxuICB0cmFuc2xhdGVZKGRpc3RhbmNlWSkge1xuICAgIHRoaXMudHJhbnN0aW9uQ2xzID0gJ2FtLXB1bGwtdG8tcmVmcmVzaC10cmFuc2l0aW9uJztcbiAgICB0aGlzLnN0eWxlID0ge1xuICAgICAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZTNkKCAwLCAnICsgZGlzdGFuY2VZICsgJ3B4LCAwICknLFxuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoIDAsICcgKyBkaXN0YW5jZVkgKyAncHgsIDAgKSdcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFB1bGxUb1JlZnJlc2hDb21wb25lbnQgfSBmcm9tICcuL3B1bGwtdG8tcmVmcmVzaC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWNvbk1vZHVsZSB9IGZyb20gJy4uL2ljb24vaWNvbi5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJY29uTW9kdWxlXSxcbiAgZXhwb3J0czogW1B1bGxUb1JlZnJlc2hDb21wb25lbnRdLFxuICBkZWNsYXJhdGlvbnM6IFtQdWxsVG9SZWZyZXNoQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBQdWxsVG9SZWZyZXNoTW9kdWxlIHt9XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUb2FzdE9wdGlvbnMge1xuICBjb250ZW50OiBhbnk7XG4gIG1hc2s6IGJvb2xlYW47XG4gIGljb25UeXBlOiBzdHJpbmc7XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBDb21wb25lbnRSZWYsXG4gIENvbXBvbmVudEZhY3RvcnksXG4gIEFwcGxpY2F0aW9uUmVmLFxuICBDb21waWxlcixcbiAgTmdab25lLFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVG9hc3RDb21wb25lbnQgfSBmcm9tICcuL3RvYXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUb2FzdE9wdGlvbnMgfSBmcm9tICcuL3RvYXN0LW9wdGlvbnMucHJvdmlkZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ0ludGVyZmFjZSB7XG4gIGNvbnRlbnQ/OiBhbnk7XG4gIGljb25UeXBlPzogc3RyaW5nO1xuICBtYXNrPzogYm9vbGVhbjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRvYXN0IHtcbiAgc3RhdGljIHRpbWVvdXQgPSBudWxsO1xuICBzdGF0aWMgX3pvbmU6IE5nWm9uZSA9IG51bGw7XG4gIHN0YXRpYyBjb21wUmVmOiBDb21wb25lbnRSZWY8YW55PiA9IG51bGw7XG4gIHN0YXRpYyBfdG9hc3RDb21wRmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxUb2FzdENvbXBvbmVudD4gPSBudWxsO1xuICBzdGF0aWMgX2FwcFJlZjogQXBwbGljYXRpb25SZWYgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2FwcFJlZjogQXBwbGljYXRpb25SZWYsIHByaXZhdGUgX2NvbXBpbGVyOiBDb21waWxlciwgcHJpdmF0ZSBfY2ZyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIHByaXZhdGUgX3pvbmU6IE5nWm9uZSkge1xuICAgIFRvYXN0Ll96b25lID0gdGhpcy5fem9uZTtcbiAgICBUb2FzdC5fYXBwUmVmID0gdGhpcy5fYXBwUmVmO1xuICAgIFRvYXN0Ll90b2FzdENvbXBGYWN0b3J5ID0gdGhpcy5fY2ZyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KFRvYXN0Q29tcG9uZW50KTtcbiAgfVxuXG4gIHN0YXRpYyBfaW5pdENvbmZpZyhjb25maWc6IE9iamVjdCwgb3B0aW9uczogVG9hc3RPcHRpb25zKTogT2JqZWN0IHtcbiAgICBjb25zdCBwcm9wcyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbmFsUGFyYW1zOiBzdHJpbmdbXSA9IFsnY29udGVudCcsICdpY29uVHlwZScsICdtYXNrJ107XG5cbiAgICBjb25maWcgPSBPYmplY3QuYXNzaWduKG9wdGlvbnMsIGNvbmZpZyk7XG4gICAgb3B0aW9uYWxQYXJhbXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKGNvbmZpZ1trZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcHNba2V5XSA9IGNvbmZpZ1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgaWNvblR5cGUgPSB7XG4gICAgICBpbmZvOiAnJyxcbiAgICAgIHN1Y2Nlc3M6ICdzdWNjZXNzJyxcbiAgICAgIGZhaWw6ICdmYWlsJyxcbiAgICAgIG9mZmxpbmU6ICdkaXNsaWtlJyxcbiAgICAgIGxvYWRpbmc6ICdsb2FkaW5nJ1xuICAgIH1bb3B0aW9ucy5pY29uVHlwZV07XG5cbiAgICBwcm9wc1snaWNvblR5cGUnXSA9IGljb25UeXBlO1xuICAgIHByb3BzWydtYXNrJ10gPSBvcHRpb25zLm1hc2s7XG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG5cbiAgc3RhdGljIG5vdGljZShjb25maWc6IENvbmZpZ0ludGVyZmFjZSwgdHlwZSwgdGltZUludGVydmFsID0gMjAwMCwgb25DbG9zZSwgbWFzayA9IHRydWUpIHtcbiAgICAvLyDDpcKmwoLDpsKewpzDpcK3wrLDp8K7wo/DpcKtwpjDpcKcwqjDr8K8wozDpcKcwqjDpsKywqHDpsKcwonDqcKBwq7Dp8K9wqnDpcKxwoLDp8KawoTDpsKDwoXDpcKGwrXDpMK4wovDr8K8wozDpMK8wprDpcKTwo3DpcK6wpTDpcKIwqvDp8KawoR0b2FzdMOvwrzCjMOpwpzCgMOowqbCgcOmwrjChcOpwpnCpMOlwo7Cn8Omwp3CpcOnwprChFxuICAgIGlmIChUb2FzdC5jb21wUmVmKSB7XG4gICAgICBUb2FzdC5oaWRlKCk7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnM6IFRvYXN0T3B0aW9ucyA9IG5ldyBUb2FzdE9wdGlvbnMoKTtcbiAgICBvcHRpb25zLmljb25UeXBlID0gdHlwZTtcbiAgICBvcHRpb25zLm1hc2sgPSBtYXNrO1xuICAgIGNvbnN0IHByb3BzID0gVG9hc3QuX2luaXRDb25maWcoY29uZmlnLCBvcHRpb25zKTtcblxuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoVG9hc3QuX3RvYXN0Q29tcEZhY3Rvcnkuc2VsZWN0b3IpLCBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQpO1xuICAgIGxldCBpbnN0YW5jZTogYW55O1xuICAgIGxldCBzdWJqZWN0OiBhbnk7XG5cbiAgICBUb2FzdC5jb21wUmVmID0gVG9hc3QuX2FwcFJlZi5ib290c3RyYXAoVG9hc3QuX3RvYXN0Q29tcEZhY3RvcnkpO1xuICAgIGluc3RhbmNlID0gVG9hc3QuY29tcFJlZi5pbnN0YW5jZTtcbiAgICBzdWJqZWN0ID0gaW5zdGFuY2Uuc3ViamVjdDtcblxuICAgIGlmICh0aW1lSW50ZXJ2YWwpIHtcbiAgICAgIFRvYXN0LnRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgICBvbkNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgVG9hc3QuaGlkZSgpO1xuICAgICAgfSwgdGltZUludGVydmFsKTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCBwcm9wcyk7XG4gICAgcmV0dXJuIHN1YmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiBpbmZvIGRpYWxvZ1xuICAgKi9cbiAgc3RhdGljIGluZm8oY29udGVudD86IHN0cmluZywgdGltZUludGVydmFsPzogbnVtYmVyLCBvbkNsb3NlPzogKCkgPT4gdm9pZCwgbWFzaz86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGljb25UeXBlOiAnaW5mbycsXG4gICAgICBjb250ZW50OiBjb250ZW50XG4gICAgfSk7XG4gICAgcmV0dXJuIFRvYXN0Lm5vdGljZShjb25maWcsICdpbmZvJywgdGltZUludGVydmFsLCBvbkNsb3NlLCBtYXNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHN1Y2Nlc3MgZGlhbG9nXG4gICAqL1xuICBzdGF0aWMgc3VjY2Vzcyhjb250ZW50Pzogc3RyaW5nLCB0aW1lSW50ZXJ2YWw/OiBudW1iZXIsIG9uQ2xvc2U/OiAoKSA9PiB2b2lkLCBtYXNrPzogYm9vbGVhbikge1xuICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgaWNvblR5cGU6ICdzdWNjZXNzJyxcbiAgICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgICB9KTtcbiAgICByZXR1cm4gVG9hc3Qubm90aWNlKGNvbmZpZywgJ3N1Y2Nlc3MnLCB0aW1lSW50ZXJ2YWwsIG9uQ2xvc2UsIG1hc2spO1xuICB9XG5cbiAgc3RhdGljIHNob3coY29udGVudD86IHN0cmluZywgdGltZUludGVydmFsPzogbnVtYmVyLCBtYXNrPzogYm9vbGVhbikge1xuICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgaWNvblR5cGU6ICdpbmZvJyxcbiAgICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgICB9KTtcbiAgICByZXR1cm4gVG9hc3Qubm90aWNlKGNvbmZpZywgJ2luZm8nLCB0aW1lSW50ZXJ2YWwsICgpID0+IHt9LCBtYXNrKTtcbiAgfVxuXG4gIHN0YXRpYyBmYWlsKGNvbnRlbnQ/OiBzdHJpbmcsIHRpbWVJbnRlcnZhbD86IG51bWJlciwgb25DbG9zZT86ICgpID0+IHZvaWQsIG1hc2s/OiBib29sZWFuKSB7XG4gICAgY29uc3QgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBpY29uVHlwZTogJ2ZhaWwnLFxuICAgICAgY29udGVudDogY29udGVudFxuICAgIH0pO1xuICAgIHJldHVybiBUb2FzdC5ub3RpY2UoY29uZmlnLCAnZmFpbCcsIHRpbWVJbnRlcnZhbCwgb25DbG9zZSwgbWFzayk7XG4gIH1cblxuICBzdGF0aWMgb2ZmbGluZShjb250ZW50Pzogc3RyaW5nLCB0aW1lSW50ZXJ2YWw/OiBudW1iZXIsIG9uQ2xvc2U/OiAoKSA9PiB2b2lkLCBtYXNrPzogYm9vbGVhbikge1xuICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgaWNvblR5cGU6ICdvZmZsaW5lJyxcbiAgICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgICB9KTtcbiAgICByZXR1cm4gVG9hc3Qubm90aWNlKGNvbmZpZywgJ29mZmxpbmUnLCB0aW1lSW50ZXJ2YWwsIG9uQ2xvc2UsIG1hc2spO1xuICB9XG5cbiAgc3RhdGljIGxvYWRpbmcoY29udGVudD86IHN0cmluZywgdGltZUludGVydmFsPzogbnVtYmVyLCBvbkNsb3NlPzogKCkgPT4gdm9pZCwgbWFzaz86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGljb25UeXBlOiAnbG9hZGluZycsXG4gICAgICBjb250ZW50OiBjb250ZW50XG4gICAgfSk7XG4gICAgcmV0dXJuIFRvYXN0Lm5vdGljZShjb25maWcsICdsb2FkaW5nJywgdGltZUludGVydmFsLCBvbkNsb3NlLCBtYXNrKTtcbiAgfVxuXG4gIHN0YXRpYyBoaWRlKCkge1xuICAgIGlmIChUb2FzdC50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoVG9hc3QudGltZW91dCk7XG4gICAgfVxuICAgIGlmIChUb2FzdC5jb21wUmVmKSB7XG4gICAgICBUb2FzdC5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBUb2FzdC5jb21wUmVmLmRlc3Ryb3koKTtcbiAgICAgIH0pO1xuICAgICAgVG9hc3QuY29tcFJlZiA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBDb21wb25lbnRSZWYsXG4gIENvbXBvbmVudEZhY3RvcnksXG4gIEFwcGxpY2F0aW9uUmVmLFxuICBDb21waWxlcixcbiAgVGVtcGxhdGVSZWYsXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmFzZU9wdGlvbnMsIE1vZGFsT3B0aW9ucywgQWxlcnRPcHRpb25zLCBBY3Rpb24gfSBmcm9tICcuL21vZGFsLW9wdGlvbnMucHJvdmlkZXInO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTW9kYWwge1xuICBzdGF0aWMgY29tcFJlZjogQ29tcG9uZW50UmVmPGFueT4gPSBudWxsO1xuICBzdGF0aWMgX21vZGFsQ29tcEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8TW9kYWxDb21wb25lbnQ+ID0gbnVsbDtcbiAgc3RhdGljIGFwcFJlZjogQXBwbGljYXRpb25SZWYgPSBudWxsO1xuICBzdGF0aWMgaW5zdGFuY2UgPSBudWxsO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9hcHBSZWY6IEFwcGxpY2F0aW9uUmVmLCBwcml2YXRlIF9jb21waWxlcjogQ29tcGlsZXIsIHByaXZhdGUgX2NmcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSB7XG4gICAgTW9kYWwuYXBwUmVmID0gdGhpcy5fYXBwUmVmO1xuICAgIE1vZGFsLl9tb2RhbENvbXBGYWN0b3J5ID0gdGhpcy5fY2ZyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KE1vZGFsQ29tcG9uZW50KTtcbiAgfVxuXG4gIHN0YXRpYyBfaW5pdENvbmZpZyhjb25maWc6IEJhc2VPcHRpb25zLCBvcHRpb25zOiBhbnkpOiBCYXNlT3B0aW9ucyB7XG4gICAgY29uc3QgcHJvcHM6IEJhc2VPcHRpb25zID0gbmV3IEJhc2VPcHRpb25zKCk7XG4gICAgY29uc3Qgb3B0aW9uYWxQYXJhbXM6IHN0cmluZ1tdID0gW1xuICAgICAgJ3Zpc2libGUnLFxuICAgICAgJ2ZvY3VzJyxcbiAgICAgICdjbG9zYWJsZScsXG4gICAgICAnbWFza0Nsb3NhYmxlJyxcbiAgICAgICdvbkNsb3NlJyxcbiAgICAgICd0cmFuc3BhcmVudCcsXG4gICAgICAncG9wdXAnLFxuICAgICAgJ2FuaW1hdGlvblR5cGUnLFxuICAgICAgJ3RpdGxlJyxcbiAgICAgICdmb290ZXInLFxuICAgICAgJ3BsYXRmb3JtJyxcbiAgICAgICdjbGFzc05hbWUnLFxuICAgICAgJ3dyYXBDbGFzc05hbWUnLFxuICAgICAgJ21lc3NhZ2UnLFxuICAgICAgJ2FjdGlvbnMnLFxuICAgICAgJ2NhbGxiYWNrT3JBY3Rpb25zJyxcbiAgICAgICd0eXBlJyxcbiAgICAgICdkZWZhdWx0VmFsdWUnLFxuICAgICAgJ3BsYWNlaG9sZGVycycsXG4gICAgICAnb3BlcmF0aW9uJyxcbiAgICAgICd0cmFuc2l0aW9uTmFtZScsXG4gICAgICAnbWFza1RyYW5zaXRpb25OYW1lJyxcbiAgICAgICdjbG9zZSdcbiAgICBdO1xuICAgIG9wdGlvbnMudHJhbnNpdGlvbk5hbWUgPSBgJHtvcHRpb25zLnRyYW5zaXRpb25OYW1lfS1lbnRlciAke29wdGlvbnMudHJhbnNpdGlvbk5hbWV9LWVudGVyLWFjdGl2ZWA7XG4gICAgb3B0aW9ucy5tYXNrVHJhbnNpdGlvbk5hbWUgPSBgJHtvcHRpb25zLm1hc2tUcmFuc2l0aW9uTmFtZX0tZW50ZXIgJHtvcHRpb25zLm1hc2tUcmFuc2l0aW9uTmFtZX0tZW50ZXItYWN0aXZlYDtcbiAgICBjb25maWcgPSBPYmplY3QuYXNzaWduKG9wdGlvbnMsIGNvbmZpZywge1xuICAgICAgY2xvc2U6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5tYXNrQ2xvc2FibGUgfHwgY29uZmlnLmNsb3NhYmxlKSB7XG4gICAgICAgICAgTW9kYWwuY2xvc2VXaXRoQW5pbWF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBvcHRpb25hbFBhcmFtcy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoY29uZmlnW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1trZXldID0gY29uZmlnW2tleV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG5cbiAgc3RhdGljIF9vcGVuKHByb3BzOiBCYXNlT3B0aW9ucywgZmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxhbnk+KTogYW55IHtcbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVFbGVtZW50KGZhY3Rvcnkuc2VsZWN0b3IpLCBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQpO1xuICAgIGxldCBzdWJqZWN0OiBhbnk7XG4gICAgTW9kYWwuY29tcFJlZiA9IE1vZGFsLmFwcFJlZi5ib290c3RyYXAoZmFjdG9yeSk7XG4gICAgTW9kYWwuaW5zdGFuY2UgPSBNb2RhbC5jb21wUmVmLmluc3RhbmNlO1xuICAgIHN1YmplY3QgPSBNb2RhbC5pbnN0YW5jZS5zdWJqZWN0O1xuICAgIE9iamVjdC5hc3NpZ24oTW9kYWwuaW5zdGFuY2UsIHByb3BzKTtcbiAgICByZXR1cm4gc3ViamVjdDtcbiAgfVxuXG4gIHN0YXRpYyBjbG9zZVdpdGhBbmltYXRpb24oKSB7XG4gICAgY29uc3Qgb3B0aW9uczogQmFzZU9wdGlvbnMgPSBuZXcgQmFzZU9wdGlvbnMoKTtcbiAgICBNb2RhbC5pbnN0YW5jZS50cmFuc2l0aW9uTmFtZSA9IGAke29wdGlvbnMudHJhbnNpdGlvbk5hbWV9LWxlYXZlICR7b3B0aW9ucy50cmFuc2l0aW9uTmFtZX0tbGVhdmUtYWN0aXZlYDtcbiAgICBNb2RhbC5pbnN0YW5jZS5tYXNrVHJhbnNpdGlvbk5hbWUgPSBgJHtvcHRpb25zLm1hc2tUcmFuc2l0aW9uTmFtZX0tbGVhdmUgJHtcbiAgICAgIG9wdGlvbnMubWFza1RyYW5zaXRpb25OYW1lXG4gICAgfS1sZWF2ZS1hY3RpdmVgO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgTW9kYWwuY2xvc2UoKTtcbiAgICB9LCAyMDApO1xuICB9XG5cbiAgc3RhdGljIG9wZW4oY29uZmlnOiBCYXNlT3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3Qgb3B0aW9uczogTW9kYWxPcHRpb25zID0gbmV3IE1vZGFsT3B0aW9ucygpO1xuICAgIGNvbnN0IHByb3BzID0gTW9kYWwuX2luaXRDb25maWcoY29uZmlnLCBvcHRpb25zKTtcbiAgICByZXR1cm4gTW9kYWwuX29wZW4ocHJvcHMsIE1vZGFsLl9tb2RhbENvbXBGYWN0b3J5KTtcbiAgfVxuXG4gIHN0YXRpYyBhbGVydChcbiAgICB0aXRsZT86IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgYWN0aW9ucz86IEFycmF5PGFueT4sXG4gICAgcGxhdGZvcm0/OiBzdHJpbmdcbiAgKTogYW55IHtcbiAgICBjb25zdCBvcHRpb25zOiBBbGVydE9wdGlvbnMgPSBuZXcgQWxlcnRPcHRpb25zKCk7XG4gICAgb3B0aW9ucy52aXNpYmxlID0gdHJ1ZTtcbiAgICBvcHRpb25zLnRyYW5zcGFyZW50ID0gdHJ1ZTtcbiAgICBvcHRpb25zLmNsb3NhYmxlID0gZmFsc2U7XG4gICAgb3B0aW9ucy5tYXNrQ2xvc2FibGUgPSBmYWxzZTtcbiAgICBvcHRpb25zLnBsYXRmb3JtID0gJ2lvcyc7XG5cbiAgICBjb25zdCBmb290ZXIgPSBnZXRGb290ZXIoYWN0aW9ucyk7XG5cbiAgICBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICBhY3Rpb25zOiBmb290ZXIgPyBmb290ZXIgOiBbeyB0ZXh0OiAnw6fCocKuw6XCrsKaJyB9XSxcbiAgICAgIHBsYXRmb3JtOiBwbGF0Zm9ybSA/IHBsYXRmb3JtIDogJ2lvcydcbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gTW9kYWwuX2luaXRDb25maWcoY29uZmlnLCBvcHRpb25zKTtcbiAgICByZXR1cm4gTW9kYWwuX29wZW4ocHJvcHMsIHRoaXMuX21vZGFsQ29tcEZhY3RvcnkpO1xuICB9XG5cbiAgc3RhdGljIHByb21wdChcbiAgICB0aXRsZT86IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgY2FsbGJhY2tPckFjdGlvbnM/OiBhbnksXG4gICAgdHlwZT86IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU/OiBzdHJpbmcsXG4gICAgcGxhY2Vob2xkZXJzPzogQXJyYXk8YW55PixcbiAgICBwbGF0Zm9ybT86IHN0cmluZ1xuICApOiBhbnkge1xuICAgIGNvbnN0IG9wdGlvbnM6IEFsZXJ0T3B0aW9ucyA9IG5ldyBBbGVydE9wdGlvbnMoKTtcbiAgICBvcHRpb25zLnZpc2libGUgPSB0cnVlO1xuICAgIG9wdGlvbnMudHJhbnNwYXJlbnQgPSB0cnVlO1xuICAgIG9wdGlvbnMuY2xvc2FibGUgPSBmYWxzZTtcbiAgICBvcHRpb25zLm1hc2tDbG9zYWJsZSA9IGZhbHNlO1xuICAgIG9wdGlvbnMuY2xhc3NOYW1lID0gJ2FtLW1vZGFsLWFsZXJ0LWNvbnRlbnQnO1xuICAgIG9wdGlvbnMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIG9wdGlvbnMucGxhY2Vob2xkZXJzID0gcGxhY2Vob2xkZXJzO1xuICAgIChvcHRpb25zLnR5cGUgPSB0eXBlID8gdHlwZSA6ICdkZWZhdWx0JyksIChvcHRpb25zLnBsYXRmb3JtID0gcGxhdGZvcm0gPyBwbGF0Zm9ybSA6ICdpb3MnKTtcblxuICAgIGZ1bmN0aW9uIGdldEFyZ3Moc2VsZiwgZnVuYykge1xuICAgICAgY29uc3QgdGV4dCA9IHNlbGYuaW5zdGFuY2UuZGF0YS50ZXh0IHx8IGRlZmF1bHRWYWx1ZSB8fCAnJztcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gc2VsZi5pbnN0YW5jZS5kYXRhLnBhc3N3b3JkIHx8ICcnO1xuICAgICAgaWYgKHR5cGUgPT09ICdsb2dpbi1wYXNzd29yZCcpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGV4dCwgcGFzc3dvcmQpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2VjdXJlLXRleHQnKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHBhc3N3b3JkIHx8IGRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyh0ZXh0KTtcbiAgICB9XG5cbiAgICBsZXQgYWN0aW9ucztcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrT3JBY3Rpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhY3Rpb25zID0gW1xuICAgICAgICB7IHRleHQ6ICfDpcKPwpbDpsK2wognIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnw6fCocKuw6XCrsKaJyxcbiAgICAgICAgICBvblByZXNzOiAoKSA9PiB7XG4gICAgICAgICAgICBnZXRBcmdzKHRoaXMsIGNhbGxiYWNrT3JBY3Rpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGlvbnMgPSBjYWxsYmFja09yQWN0aW9ucy5tYXAoaXRlbSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdGV4dDogaXRlbS50ZXh0LFxuICAgICAgICAgIG9uUHJlc3M6ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLm9uUHJlc3MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldEFyZ3ModGhpcywgaXRlbS5vblByZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmb290ZXIgPSBnZXRGb290ZXIoYWN0aW9ucyk7XG4gICAgY29uc3QgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICB0aXRsZTogdGl0bGUsXG4gICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgdHlwZTogdHlwZSA/IHR5cGUgOiAnZGVmYXVsdCcsXG4gICAgICBhY3Rpb25zOiBmb290ZXIgPyBmb290ZXIgOiBbeyB0ZXh0OiAnw6fCocKuw6XCrsKaJyB9XSxcbiAgICAgIHBsYXRmb3JtOiBwbGF0Zm9ybSA/IHBsYXRmb3JtIDogJ2lvcydcbiAgICB9KTtcbiAgICBjb25zdCBwcm9wcyA9IE1vZGFsLl9pbml0Q29uZmlnKGNvbmZpZywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIE1vZGFsLl9vcGVuKHByb3BzLCB0aGlzLl9tb2RhbENvbXBGYWN0b3J5KTtcbiAgfVxuXG4gIHN0YXRpYyBvcGVyYXRpb24oYWN0aW9ucz86IGFueSwgcGxhdGZvcm0/OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IG9wdGlvbnM6IEJhc2VPcHRpb25zID0gbmV3IEJhc2VPcHRpb25zKCk7XG4gICAgb3B0aW9ucy52aXNpYmxlID0gdHJ1ZTtcbiAgICBvcHRpb25zLnRyYW5zcGFyZW50ID0gdHJ1ZTtcbiAgICBvcHRpb25zLmNsb3NhYmxlID0gZmFsc2U7XG4gICAgb3B0aW9ucy5tYXNrQ2xvc2FibGUgPSBmYWxzZTtcbiAgICBvcHRpb25zLm9wZXJhdGlvbiA9IHRydWU7XG4gICAgb3B0aW9ucy5jbGFzc05hbWUgPSAnYW0tbW9kYWwtb3BlcmF0aW9uJztcbiAgICBjb25zdCBmb290ZXIgPSBnZXRGb290ZXIoYWN0aW9ucyk7XG5cbiAgICBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGFjdGlvbnM6IGZvb3RlciA/IGZvb3RlciA6IFt7IHRleHQ6ICfDp8Khwq7DpcKuwponIH1dLFxuICAgICAgcGxhdGZvcm06IHBsYXRmb3JtID8gcGxhdGZvcm0gOiAnaW9zJ1xuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gTW9kYWwuX2luaXRDb25maWcoY29uZmlnLCBvcHRpb25zKTtcbiAgICByZXR1cm4gTW9kYWwuX29wZW4ocHJvcHMsIHRoaXMuX21vZGFsQ29tcEZhY3RvcnkpO1xuICB9XG5cbiAgc3RhdGljIGNsb3NlKCkge1xuICAgIGlmIChNb2RhbC5jb21wUmVmKSB7XG4gICAgICBNb2RhbC5jb21wUmVmLmRlc3Ryb3koKTtcbiAgICAgIE1vZGFsLmNvbXBSZWYgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRGb290ZXIoYWN0aW9ucykge1xuICByZXR1cm4gYWN0aW9ucy5tYXAoKGJ1dHRvbjogQWN0aW9uKSA9PiB7XG4gICAgY29uc3Qgb3JnaW5QcmVzcyA9IGJ1dHRvbi5vblByZXNzIHx8IGZ1bmN0aW9uKCkge307XG4gICAgYnV0dG9uLm9uUHJlc3MgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBvcmdpblByZXNzKCk7XG4gICAgICBpZiAocmVzICYmIHJlcy50aGVuKSB7XG4gICAgICAgIHJlcy50aGVuKCgpID0+IHtcbiAgICAgICAgICBNb2RhbC5jbG9zZVdpdGhBbmltYXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBNb2RhbC5jbG9zZVdpdGhBbmltYXRpb24oKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBidXR0b247XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFjdGlvblNoZWV0T3B0aW9ucyB7XG4gIHByZWZpeENscz86IHN0cmluZztcbiAgbWFza0Nsb3NhYmxlPzogYm9vbGVhbjtcbiAgY2FuY2VsQnV0dG9uSW5kZXg/OiBudW1iZXI7XG4gIGRlc3RydWN0aXZlQnV0dG9uSW5kZXg/OiBudW1iZXI7XG4gIHRpdGxlPzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgbWVzc2FnZT86IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgdHJhbnNpdGlvbk5hbWU/OiBzdHJpbmcgPSAnYW0tc2xpZGUtdXAnO1xuICBtYXNrVHJhbnNpdGlvbk5hbWU/OiBzdHJpbmcgPSAnYW0tZmFkZSc7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTaGFyZU9wdGlvbiB7XG4gIGljb246IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gIHRpdGxlOiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTaGFyZUFjdGlvblNoZWV0V2l0aE9wdGlvbnMgZXh0ZW5kcyBBY3Rpb25TaGVldE9wdGlvbnMge1xuICBvcHRpb25zOiBTaGFyZU9wdGlvbltdIHwgU2hhcmVPcHRpb25bXVtdO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQWN0aW9uU2hlZXRXaXRoT3B0aW9ucyBleHRlbmRzIEFjdGlvblNoZWV0T3B0aW9ucyB7XG4gIG9wdGlvbnM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgdHlwZSBBY3Rpb25DYWxsQmFjayA9IChpbmRleDogbnVtYmVyLCByb3dJbmRleD86IG51bWJlcikgPT4gUHJvbWlzZUxpa2U8YW55PiB8IHZvaWQ7XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBDb21wb25lbnRSZWYsIENvbXBvbmVudEZhY3RvcnksIEFwcGxpY2F0aW9uUmVmLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGlvblNoZWV0Q29tcG9uZW50IH0gZnJvbSAnLi9hY3Rpb24tc2hlZXQuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIEFjdGlvbkNhbGxCYWNrLFxuICBBY3Rpb25TaGVldE9wdGlvbnMsXG4gIEFjdGlvblNoZWV0V2l0aE9wdGlvbnMsXG4gIFNoYXJlQWN0aW9uU2hlZXRXaXRoT3B0aW9uc1xufSBmcm9tICcuL2FjdGlvbi1zaGVldC1vcHRpb25zLnByb3ZpZGVyJztcbmltcG9ydCB7IEFjdGlvblNoZWV0U3ViamVjdCB9IGZyb20gJy4vYWN0aW9uLXNoZWV0LXN1YmplY3Quc2VydmljZSc7XG5cbmNvbnN0IE5PUk1BTCA9ICdOT1JNQUwnO1xuY29uc3QgU0hBUkUgPSAnU0hBUkUnO1xuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBY3Rpb25TaGVldCB7XG4gIHN0YXRpYyBjb21wUmVmOiBDb21wb25lbnRSZWY8YW55PiA9IG51bGw7XG4gIHN0YXRpYyBfYWN0aW9uU2hlZXRDb21wRmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxBY3Rpb25TaGVldENvbXBvbmVudD4gPSBudWxsO1xuICBzdGF0aWMgYXBwUmVmOiBBcHBsaWNhdGlvblJlZiA9IG51bGw7XG5cbiAgc3RhdGljIGluc3RhbmNlID0gbnVsbDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfYXBwUmVmOiBBcHBsaWNhdGlvblJlZiwgcHJpdmF0ZSBfY2ZyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpIHtcbiAgICBBY3Rpb25TaGVldC5hcHBSZWYgPSB0aGlzLl9hcHBSZWY7XG4gICAgQWN0aW9uU2hlZXQuX2FjdGlvblNoZWV0Q29tcEZhY3RvcnkgPSB0aGlzLl9jZnIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoQWN0aW9uU2hlZXRDb21wb25lbnQpO1xuICB9XG5cbiAgc3RhdGljIF9pbml0Q29uZmlnKGNvbmZpZzogQWN0aW9uU2hlZXRPcHRpb25zLCBvcHRpb25zOiBPYmplY3QgPSB7fSk6IEFjdGlvblNoZWV0T3B0aW9ucyB7XG4gICAgY29uc3QgcHJvcHM6IEFjdGlvblNoZWV0T3B0aW9ucyA9IG5ldyBBY3Rpb25TaGVldE9wdGlvbnMoKTtcbiAgICBjb25zdCBvcHRpb25hbFBhcmFtczogc3RyaW5nW10gPSBbXG4gICAgICAncHJlZml4Q2xzJyxcbiAgICAgICdtYXNrQ2xvc2FibGUnLFxuICAgICAgJ2NhbmNlbEJ1dHRvbkluZGV4JyxcbiAgICAgICdkZXN0cnVjdGl2ZUJ1dHRvbkluZGV4JyxcbiAgICAgICd0aXRsZScsXG4gICAgICAnbWVzc2FnZScsXG4gICAgICAnY2xhc3NOYW1lJyxcbiAgICAgICd0cmFuc2l0aW9uTmFtZScsXG4gICAgICAnbWFza1RyYW5zaXRpb25OYW1lJyxcbiAgICAgICdvcHRpb25zJ1xuICAgIF07XG4gICAgY29uZmlnID0gT2JqZWN0LmFzc2lnbihvcHRpb25zLCBjb25maWcpO1xuICAgIG9wdGlvbmFsUGFyYW1zLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChjb25maWdba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW2tleV0gPSBjb25maWdba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcHJvcHM7XG4gIH1cblxuICBzdGF0aWMgX29wZW4ocHJvcHM6IEFjdGlvblNoZWV0T3B0aW9ucywgZmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxhbnk+KTogQWN0aW9uU2hlZXRTdWJqZWN0IHtcbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVFbGVtZW50KGZhY3Rvcnkuc2VsZWN0b3IpLCBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQpO1xuICAgIGxldCBzdWJqZWN0OiBhbnk7XG5cbiAgICBBY3Rpb25TaGVldC5jb21wUmVmID0gQWN0aW9uU2hlZXQuYXBwUmVmLmJvb3RzdHJhcChmYWN0b3J5KTtcbiAgICBBY3Rpb25TaGVldC5pbnN0YW5jZSA9IEFjdGlvblNoZWV0LmNvbXBSZWYuaW5zdGFuY2U7XG4gICAgc3ViamVjdCA9IEFjdGlvblNoZWV0Lmluc3RhbmNlLnN1YmplY3Q7XG4gICAgT2JqZWN0LmFzc2lnbihBY3Rpb25TaGVldC5pbnN0YW5jZSwgcHJvcHMpO1xuICAgIHJldHVybiBzdWJqZWN0O1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUFjdGlvblNoZWV0KFxuICAgIGZsYWc6IHN0cmluZyxcbiAgICBjb25maWc6IEFjdGlvblNoZWV0V2l0aE9wdGlvbnMgfCBTaGFyZUFjdGlvblNoZWV0V2l0aE9wdGlvbnMsXG4gICAgY2FsbGJhY2s6IEFjdGlvbkNhbGxCYWNrXG4gICkge1xuICAgIGNvbnN0IG9wdGlvbnM6IEFjdGlvblNoZWV0T3B0aW9ucyA9IG5ldyBBY3Rpb25TaGVldE9wdGlvbnMoKTtcbiAgICBjb25zdCB0cmFuc2l0aW9uTmFtZSA9IGNvbmZpZy50cmFuc2l0aW9uTmFtZSA/IGNvbmZpZy50cmFuc2l0aW9uTmFtZSA6IG9wdGlvbnMudHJhbnNpdGlvbk5hbWU7XG4gICAgb3B0aW9ucy50cmFuc2l0aW9uTmFtZSA9IGAke3RyYW5zaXRpb25OYW1lfS1lbnRlciAke3RyYW5zaXRpb25OYW1lfS1lbnRlci1hY3RpdmVgO1xuICAgIGNvbnN0IG1hc2tUcmFuc2l0aW9uTmFtZSA9IGNvbmZpZy5tYXNrVHJhbnNpdGlvbk5hbWUgPyBjb25maWcubWFza1RyYW5zaXRpb25OYW1lIDogb3B0aW9ucy5tYXNrVHJhbnNpdGlvbk5hbWU7XG4gICAgb3B0aW9ucy5tYXNrVHJhbnNpdGlvbk5hbWUgPSBgJHttYXNrVHJhbnNpdGlvbk5hbWV9LWVudGVyICR7bWFza1RyYW5zaXRpb25OYW1lfS1lbnRlci1hY3RpdmVgO1xuICAgIGNvbnN0IHByb3BzID0gQWN0aW9uU2hlZXQuX2luaXRDb25maWcoY29uZmlnLCBvcHRpb25zKTtcbiAgICBPYmplY3QuYXNzaWduKHByb3BzLCB7IG9uUHJlc3M6IGNiIH0sIHsgZmxhZzogZmxhZyB9KTtcbiAgICBmdW5jdGlvbiBjYihpbmRleDogYW55LCByb3dJbmRleCA9IDAsIGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHJlcyA9IGNhbGxiYWNrKGluZGV4LCByb3dJbmRleCk7XG4gICAgICBpZiAocmVzICYmIHJlcy50aGVuKSB7XG4gICAgICAgIHJlcy50aGVuKCgpID0+IHtcbiAgICAgICAgICBBY3Rpb25TaGVldC5jbG9zZVdpdGhBbmltYXRpb24odHJhbnNpdGlvbk5hbWUsIG1hc2tUcmFuc2l0aW9uTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQWN0aW9uU2hlZXQuY2xvc2VXaXRoQW5pbWF0aW9uKHRyYW5zaXRpb25OYW1lLCBtYXNrVHJhbnNpdGlvbk5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQWN0aW9uU2hlZXQuX29wZW4ocHJvcHMsIEFjdGlvblNoZWV0Ll9hY3Rpb25TaGVldENvbXBGYWN0b3J5KTtcbiAgfVxuXG4gIHN0YXRpYyBjbG9zZVdpdGhBbmltYXRpb24odHJhbnNpdGlvbk5hbWUsIG1hc2tUcmFuc2l0aW9uTmFtZSkge1xuICAgIEFjdGlvblNoZWV0Lmluc3RhbmNlLnRyYW5zaXRpb25OYW1lID0gYCR7dHJhbnNpdGlvbk5hbWV9LWxlYXZlICR7dHJhbnNpdGlvbk5hbWV9LWxlYXZlLWFjdGl2ZWA7XG4gICAgQWN0aW9uU2hlZXQuaW5zdGFuY2UubWFza1RyYW5zaXRpb25OYW1lID0gYCR7bWFza1RyYW5zaXRpb25OYW1lfS1sZWF2ZSAke21hc2tUcmFuc2l0aW9uTmFtZX0tbGVhdmUtYWN0aXZlYDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIEFjdGlvblNoZWV0LmNsb3NlKCk7XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIHN0YXRpYyBzaG93QWN0aW9uU2hlZXRXaXRoT3B0aW9ucyhjb25maWc6IEFjdGlvblNoZWV0V2l0aE9wdGlvbnMsIGNhbGxiYWNrOiBBY3Rpb25DYWxsQmFjayA9IG5vb3ApIHtcbiAgICBBY3Rpb25TaGVldC5jcmVhdGVBY3Rpb25TaGVldChOT1JNQUwsIGNvbmZpZywgY2FsbGJhY2spO1xuICB9XG5cbiAgc3RhdGljIHNob3dTaGFyZUFjdGlvblNoZWV0V2l0aE9wdGlvbnMoY29uZmlnOiBTaGFyZUFjdGlvblNoZWV0V2l0aE9wdGlvbnMsIGNhbGxiYWNrOiBBY3Rpb25DYWxsQmFjayA9IG5vb3ApIHtcbiAgICBBY3Rpb25TaGVldC5jcmVhdGVBY3Rpb25TaGVldChTSEFSRSwgY29uZmlnLCBjYWxsYmFjayk7XG4gIH1cblxuICBzdGF0aWMgY2xvc2UoKSB7XG4gICAgaWYgKEFjdGlvblNoZWV0LmNvbXBSZWYpIHtcbiAgICAgIEFjdGlvblNoZWV0LmNvbXBSZWYuZGVzdHJveSgpO1xuICAgICAgQWN0aW9uU2hlZXQuY29tcFJlZiA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBpY2tlckNhbGxCYWNrLCBQaWNrZXJPcHRpb25zIH0gZnJvbSAnLi9waWNrZXItb3B0aW9ucy5wcm92aWRlcic7XG5pbXBvcnQgeyBQb3B1cFNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL2NvcmUubW9kdWxlJztcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQaWNrZXIgZXh0ZW5kcyBQb3B1cFNlcnZpY2Uge1xuICBzdGF0aWMgZGVmYXVsdE9wdGlvbnM6IFBpY2tlck9wdGlvbnMgPSBuZXcgUGlja2VyT3B0aW9ucygpO1xuXG4gIHN0YXRpYyBzaG93UGlja2VyKFxuICAgIGNvbmZpZzogUGlja2VyT3B0aW9ucyA9IFBpY2tlci5kZWZhdWx0T3B0aW9ucyxcbiAgICBjb25maXJtQ2FsbGJhY2s/OiBQaWNrZXJDYWxsQmFjayxcbiAgICBjYW5jZWxDYWxsYmFjaz86IFBpY2tlckNhbGxCYWNrXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBuZXcgUGlja2VyT3B0aW9ucygpO1xuICAgIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgY29uZmlnLCB7XG4gICAgICBoaWRlUGlja2VyOiAoZXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5oaWRlUGlja2VyKCk7XG4gICAgICB9LFxuICAgICAgY29uZmlybTogKGV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChjb25maXJtQ2FsbGJhY2spIHtcbiAgICAgICAgICBjb25maXJtQ2FsbGJhY2soZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2FuY2VsOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChjYW5jZWxDYWxsYmFjaykge1xuICAgICAgICAgIGNhbmNlbENhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IG9wdGlvbmFsUGFyYW1zOiBBcnJheTxhbnk+ID0gW1xuICAgICAgJ2RhdGEnLFxuICAgICAgJ3ZhbHVlJyxcbiAgICAgICdjb2xzJyxcbiAgICAgICdtYXNrJyxcbiAgICAgICd0aXRsZScsXG4gICAgICAnb2tUZXh0JyxcbiAgICAgICdkaXNtaXNzVGV4dCcsXG4gICAgICAnZGlzYWJsZWQnLFxuICAgICAgJ2Nhc2NhZGUnLFxuICAgICAgJ29uT2snLFxuICAgICAgJ29uUGlja2VyQ2hhbmdlJyxcbiAgICAgICdpbmRpY2F0b3JTdHlsZSdcbiAgICBdO1xuICAgIG9wdGlvbmFsUGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzW3BhcmFtXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKG9wdGlvbnMgYXMgYW55KVtwYXJhbV0gPSB0aGlzW3BhcmFtXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBjaGlsZEluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKFtcbiAgICAgIHtcbiAgICAgICAgcHJvdmlkZTogUGlja2VyT3B0aW9ucyxcbiAgICAgICAgdXNlVmFsdWU6IG9wdGlvbnNcbiAgICAgIH1cbiAgICBdKTtcbiAgICBQaWNrZXIuc2hvd1BvcHVwKFBpY2tlckNvbXBvbmVudCwgY2hpbGRJbmplY3Rvcik7XG4gIH1cblxuICBzdGF0aWMgaGlkZVBpY2tlcigpOiB2b2lkIHtcbiAgICBQaWNrZXIuaGlkZVBvcHVwKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFjdGl2aXR5SW5kaWNhdG9yTW9kdWxlIH0gZnJvbSAnLi9hY3Rpdml0eS1pbmRpY2F0b3IvYWN0aXZpdHktaW5kaWNhdG9yLm1vZHVsZSc7XG5pbXBvcnQgeyBDYXJkTW9kdWxlIH0gZnJvbSAnLi9jYXJkL2NhcmQubW9kdWxlJztcbmltcG9ydCB7IEJhZGdlTW9kdWxlIH0gZnJvbSAnLi9iYWRnZS9iYWRnZS5tb2R1bGUnO1xuaW1wb3J0IHsgSW5wdXRJdGVtTW9kdWxlIH0gZnJvbSAnLi9pbnB1dC1pdGVtL2lucHV0LWl0ZW0ubW9kdWxlJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJy4vYnV0dG9uL2J1dHRvbi5tb2R1bGUnO1xuaW1wb3J0IHsgU3dpdGNoTW9kdWxlIH0gZnJvbSAnLi9zd2l0Y2gvc3dpdGNoLm1vZHVsZSc7XG5pbXBvcnQgeyBTZWFyY2hCYXJNb2R1bGUgfSBmcm9tICcuL3NlYXJjaC1iYXIvc2VhcmNoLWJhci5tb2R1bGUnO1xuaW1wb3J0IHsgU3RlcHBlck1vZHVsZSB9IGZyb20gJy4vc3RlcHBlci9zdGVwcGVyLm1vZHVsZSc7XG5pbXBvcnQgeyBTdGVwc01vZHVsZSB9IGZyb20gJy4vc3RlcHMvc3RlcHMubW9kdWxlJztcbmltcG9ydCB7IENhcm91c2VsTW9kdWxlIH0gZnJvbSAnLi9jYXJvdXNlbC9jYXJvdXNlbC5tb2R1bGUnO1xuaW1wb3J0IHsgQ2hlY2tib3hNb2R1bGUgfSBmcm9tICcuL2NoZWNrYm94L2NoZWNrYm94Lm1vZHVsZSc7XG5pbXBvcnQgeyBSYWRpb01vZHVsZSB9IGZyb20gJy4vcmFkaW8vcmFkaW8ubW9kdWxlJztcbmltcG9ydCB7IFByb2dyZXNzTW9kdWxlIH0gZnJvbSAnLi9wcm9ncmVzcy9wcm9ncmVzcy5tb2R1bGUnO1xuaW1wb3J0IHsgQWNjb3JkaW9uTW9kdWxlIH0gZnJvbSAnLi9hY2NvcmRpb24vYWNjb3JkaW9uLm1vZHVsZSc7XG5pbXBvcnQgeyBOb3RpY2VCYXJNb2R1bGUgfSBmcm9tICcuL25vdGljZS1iYXIvbm90aWNlLWJhci5tb2R1bGUnO1xuaW1wb3J0IHsgSWNvbk1vZHVsZSB9IGZyb20gJy4vaWNvbi9pY29uLm1vZHVsZSc7XG5pbXBvcnQgeyBUb2FzdE1vZHVsZSB9IGZyb20gJy4vdG9hc3QvdG9hc3QubW9kdWxlJztcbmltcG9ydCB7IE1vZGFsTW9kdWxlIH0gZnJvbSAnLi9tb2RhbC9tb2RhbC5tb2R1bGUnO1xuaW1wb3J0IHsgUG9wb3Zlck1vZHVsZSB9IGZyb20gJy4vcG9wb3Zlci9wb3BvdmVyLm1vZHVsZSc7XG5pbXBvcnQgeyBOYXZCYXJNb2R1bGUgfSBmcm9tICcuL25hdi1iYXIvbmF2LWJhci5tb2R1bGUnO1xuaW1wb3J0IHsgTGlzdE1vZHVsZSB9IGZyb20gJy4vbGlzdC9saXN0Lm1vZHVsZSc7XG5pbXBvcnQgeyBDYWxlbmRhck1vZHVsZSB9IGZyb20gJy4vY2FsZW5kYXIvY2FsZW5kYXIubW9kdWxlJztcbmltcG9ydCB7IFBvcG92ZXJJdGVtTW9kdWxlIH0gZnJvbSAnLi9wb3BvdmVyL3BvcG92ZXItaXRlbS9wb3BvdmVyLWl0ZW0ubW9kdWxlJztcbmltcG9ydCB7IEZsZXhNb2R1bGUgfSBmcm9tICcuL2ZsZXgvZmxleC5tb2R1bGUnO1xuaW1wb3J0IHsgR3JpZE1vZHVsZSB9IGZyb20gJy4vZ3JpZC9ncmlkLm1vZHVsZSc7XG5pbXBvcnQgeyBBY3Rpb25TaGVldE1vZHVsZSB9IGZyb20gJy4vYWN0aW9uLXNoZWV0L2FjdGlvbi1zaGVldC5tb2R1bGUnO1xuaW1wb3J0IHsgU2VnbWVudGVkQ29udHJvbE1vZHVsZSB9IGZyb20gJy4vc2VnbWVudGVkLWNvbnRyb2wvc2VnbWVudGVkLWNvbnRyb2wubW9kdWxlJztcblxuaW1wb3J0IHsgVGV4dGFyZWFJdGVtTW9kdWxlIH0gZnJvbSAnLi90ZXh0YXJlYS1pdGVtL3RleHRhcmVhLWl0ZW0ubW9kdWxlJztcbmltcG9ydCB7IE5nWm9ycm9BbnRkTW9iaWxlUGlwZXNNb2R1bGUgfSBmcm9tICcuL3BpcGVzL25nLXpvcnJvLWFudGQtbW9iaWxlLnBpcGVzLm1vZHVsZSc7XG5pbXBvcnQgeyBUYWJzTW9kdWxlIH0gZnJvbSAnLi90YWJzL3RhYnMubW9kdWxlJztcbmltcG9ydCB7IFRhYkJhck1vZHVsZSB9IGZyb20gJy4vdGFiLWJhci90YWItYmFyLm1vZHVsZSc7XG5pbXBvcnQgeyBQaWNrZXJNb2R1bGUgfSBmcm9tICcuL3BpY2tlci9waWNrZXIubW9kdWxlJztcbmltcG9ydCB7IFBpY2tlclZpZXdNb2R1bGUgfSBmcm9tICcuL3BpY2tlci12aWV3L3BpY2tlci12aWV3Lm1vZHVsZSc7XG5pbXBvcnQgeyBJbWFnZVBpY2tlck1vZHVsZSB9IGZyb20gJy4vaW1hZ2UtcGlja2VyL2ltYWdlLXBpY2tlci5tb2R1bGUnO1xuaW1wb3J0IHsgUmVzdWx0TW9kdWxlIH0gZnJvbSAnLi9yZXN1bHQvcmVzdWx0Lm1vZHVsZSc7XG5pbXBvcnQgeyBXaGl0ZVNwYWNlTW9kdWxlIH0gZnJvbSAnLi93aGl0ZS1zcGFjZS93aGl0ZS1zcGFjZS5tb2R1bGUnO1xuaW1wb3J0IHsgV2luZ0JsYW5rTW9kdWxlIH0gZnJvbSAnLi93aW5nLWJsYW5rL3dpbmctYmxhbmsubW9kdWxlJztcbmltcG9ydCB7IFJhbmdlTW9kdWxlIH0gZnJvbSAnLi9yYW5nZS9yYW5nZS5tb2R1bGUnO1xuaW1wb3J0IHsgU2xpZGVyTW9kdWxlIH0gZnJvbSAnLi9zbGlkZXIvc2xpZGVyLm1vZHVsZSc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uTW9kdWxlIH0gZnJvbSAnLi9wYWdpbmF0aW9uL3BhZ2luYXRpb24ubW9kdWxlJztcbmltcG9ydCB7IFRhZ01vZHVsZSB9IGZyb20gJy4vdGFnL3RhZy5tb2R1bGUnO1xuaW1wb3J0IHsgTWVudU1vZHVsZSB9IGZyb20gJy4vbWVudS9tZW51Lm1vZHVsZSc7XG5pbXBvcnQgeyBEYXRlUGlja2VyTW9kdWxlIH0gZnJvbSAnLi9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5tb2R1bGUnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlclZpZXdNb2R1bGUgfSBmcm9tICcuL2RhdGUtcGlja2VyLXZpZXcvZGF0ZS1waWNrZXItdmlldy5tb2R1bGUnO1xuaW1wb3J0IHsgRHJhd2VyTW9kdWxlIH0gZnJvbSAnLi9kcmF3ZXIvZHJhd2VyLm1vZHVsZSc7XG5pbXBvcnQgeyBTd2lwZUFjdGlvbk1vZHVsZSB9IGZyb20gJy4vc3dpcGUtYWN0aW9uL3N3aXBlLWFjdGlvbi5tb2R1bGUnO1xuaW1wb3J0IHsgUHVsbFRvUmVmcmVzaE1vZHVsZSB9IGZyb20gJy4vcHVsbC10by1yZWZyZXNoL3B1bGwtdG8tcmVmcmVzaC5tb2R1bGUnO1xuaW1wb3J0IHsgTG9jYWxlUHJvdmlkZXJNb2R1bGUgfSBmcm9tICcuL2xvY2FsZS1wcm92aWRlci9sb2NhbGUtcHJvdmlkZXIubW9kdWxlJztcblxuZXhwb3J0IHsgQWN0aXZpdHlJbmRpY2F0b3JNb2R1bGUgfSBmcm9tICcuL2FjdGl2aXR5LWluZGljYXRvci9hY3Rpdml0eS1pbmRpY2F0b3IubW9kdWxlJztcbmV4cG9ydCB7IENhcmRNb2R1bGUgfSBmcm9tICcuL2NhcmQvY2FyZC5tb2R1bGUnO1xuZXhwb3J0IHsgUmVzdWx0TW9kdWxlIH0gZnJvbSAnLi9yZXN1bHQvcmVzdWx0Lm1vZHVsZSc7XG5leHBvcnQgeyBXaGl0ZVNwYWNlTW9kdWxlIH0gZnJvbSAnLi93aGl0ZS1zcGFjZS93aGl0ZS1zcGFjZS5tb2R1bGUnO1xuZXhwb3J0IHsgV2luZ0JsYW5rTW9kdWxlIH0gZnJvbSAnLi93aW5nLWJsYW5rL3dpbmctYmxhbmsubW9kdWxlJztcbmV4cG9ydCB7IFRhYnNNb2R1bGUgfSBmcm9tICcuL3RhYnMvdGFicy5tb2R1bGUnO1xuZXhwb3J0IHsgVGFiQmFyTW9kdWxlIH0gZnJvbSAnLi90YWItYmFyL3RhYi1iYXIubW9kdWxlJztcbmV4cG9ydCB7IEJhZGdlTW9kdWxlIH0gZnJvbSAnLi9iYWRnZS9iYWRnZS5tb2R1bGUnO1xuZXhwb3J0IHsgSW5wdXRJdGVtTW9kdWxlIH0gZnJvbSAnLi9pbnB1dC1pdGVtL2lucHV0LWl0ZW0ubW9kdWxlJztcbmV4cG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJy4vYnV0dG9uL2J1dHRvbi5tb2R1bGUnO1xuZXhwb3J0IHsgU3dpdGNoTW9kdWxlIH0gZnJvbSAnLi9zd2l0Y2gvc3dpdGNoLm1vZHVsZSc7XG5leHBvcnQgeyBTZWFyY2hCYXJNb2R1bGUgfSBmcm9tICcuL3NlYXJjaC1iYXIvc2VhcmNoLWJhci5tb2R1bGUnO1xuZXhwb3J0IHsgU3RlcHBlck1vZHVsZSB9IGZyb20gJy4vc3RlcHBlci9zdGVwcGVyLm1vZHVsZSc7XG5leHBvcnQgeyBTdGVwc01vZHVsZSB9IGZyb20gJy4vc3RlcHMvc3RlcHMubW9kdWxlJztcbmV4cG9ydCB7IENhcm91c2VsTW9kdWxlIH0gZnJvbSAnLi9jYXJvdXNlbC9jYXJvdXNlbC5tb2R1bGUnO1xuZXhwb3J0IHsgQ2hlY2tib3hNb2R1bGUgfSBmcm9tICcuL2NoZWNrYm94L2NoZWNrYm94Lm1vZHVsZSc7XG5leHBvcnQgeyBSYWRpb01vZHVsZSB9IGZyb20gJy4vcmFkaW8vcmFkaW8ubW9kdWxlJztcbmV4cG9ydCB7IFByb2dyZXNzTW9kdWxlIH0gZnJvbSAnLi9wcm9ncmVzcy9wcm9ncmVzcy5tb2R1bGUnO1xuZXhwb3J0IHsgQWNjb3JkaW9uTW9kdWxlIH0gZnJvbSAnLi9hY2NvcmRpb24vYWNjb3JkaW9uLm1vZHVsZSc7XG5leHBvcnQgeyBOb3RpY2VCYXJNb2R1bGUgfSBmcm9tICcuL25vdGljZS1iYXIvbm90aWNlLWJhci5tb2R1bGUnO1xuZXhwb3J0IHsgSWNvbk1vZHVsZSB9IGZyb20gJy4vaWNvbi9pY29uLm1vZHVsZSc7XG5leHBvcnQgeyBUb2FzdE1vZHVsZSB9IGZyb20gJy4vdG9hc3QvdG9hc3QubW9kdWxlJztcbmV4cG9ydCB7IE1vZGFsTW9kdWxlIH0gZnJvbSAnLi9tb2RhbC9tb2RhbC5tb2R1bGUnO1xuZXhwb3J0IHsgUG9wb3Zlck1vZHVsZSB9IGZyb20gJy4vcG9wb3Zlci9wb3BvdmVyLm1vZHVsZSc7XG5leHBvcnQgeyBOYXZCYXJNb2R1bGUgfSBmcm9tICcuL25hdi1iYXIvbmF2LWJhci5tb2R1bGUnO1xuZXhwb3J0IHsgTGlzdE1vZHVsZSB9IGZyb20gJy4vbGlzdC9saXN0Lm1vZHVsZSc7XG5leHBvcnQgeyBQb3BvdmVySXRlbU1vZHVsZSB9IGZyb20gJy4vcG9wb3Zlci9wb3BvdmVyLWl0ZW0vcG9wb3Zlci1pdGVtLm1vZHVsZSc7XG5leHBvcnQgeyBGbGV4TW9kdWxlIH0gZnJvbSAnLi9mbGV4L2ZsZXgubW9kdWxlJztcbmV4cG9ydCB7IEdyaWRNb2R1bGUgfSBmcm9tICcuL2dyaWQvZ3JpZC5tb2R1bGUnO1xuZXhwb3J0IHsgQWN0aW9uU2hlZXRNb2R1bGUgfSBmcm9tICcuL2FjdGlvbi1zaGVldC9hY3Rpb24tc2hlZXQubW9kdWxlJztcbmV4cG9ydCB7IFNlZ21lbnRlZENvbnRyb2xNb2R1bGUgfSBmcm9tICcuL3NlZ21lbnRlZC1jb250cm9sL3NlZ21lbnRlZC1jb250cm9sLm1vZHVsZSc7XG5cbmV4cG9ydCB7IFRleHRhcmVhSXRlbU1vZHVsZSB9IGZyb20gJy4vdGV4dGFyZWEtaXRlbS90ZXh0YXJlYS1pdGVtLm1vZHVsZSc7XG5leHBvcnQgeyBOZ1pvcnJvQW50ZE1vYmlsZVBpcGVzTW9kdWxlIH0gZnJvbSAnLi9waXBlcy9uZy16b3Jyby1hbnRkLW1vYmlsZS5waXBlcy5tb2R1bGUnO1xuZXhwb3J0IHsgUmFuZ2VNb2R1bGUgfSBmcm9tICcuL3JhbmdlL3JhbmdlLm1vZHVsZSc7XG5leHBvcnQgeyBTbGlkZXJNb2R1bGUgfSBmcm9tICcuL3NsaWRlci9zbGlkZXIubW9kdWxlJztcbmV4cG9ydCB7IFBhZ2luYXRpb25Nb2R1bGUgfSBmcm9tICcuL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5tb2R1bGUnO1xuZXhwb3J0IHsgVGFnTW9kdWxlIH0gZnJvbSAnLi90YWcvdGFnLm1vZHVsZSc7XG5leHBvcnQgeyBNZW51TW9kdWxlIH0gZnJvbSAnLi9tZW51L21lbnUubW9kdWxlJztcbmV4cG9ydCB7IFBpY2tlck1vZHVsZSB9IGZyb20gJy4vcGlja2VyL3BpY2tlci5tb2R1bGUnO1xuZXhwb3J0IHsgUGlja2VyVmlld01vZHVsZSB9IGZyb20gJy4vcGlja2VyLXZpZXcvcGlja2VyLXZpZXcubW9kdWxlJztcbmV4cG9ydCB7IEltYWdlUGlja2VyTW9kdWxlIH0gZnJvbSAnLi9pbWFnZS1waWNrZXIvaW1hZ2UtcGlja2VyLm1vZHVsZSc7XG5leHBvcnQgeyBEYXRlUGlja2VyTW9kdWxlIH0gZnJvbSAnLi9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5tb2R1bGUnO1xuZXhwb3J0IHsgRGF0ZVBpY2tlclZpZXdNb2R1bGUgfSBmcm9tICcuL2RhdGUtcGlja2VyLXZpZXcvZGF0ZS1waWNrZXItdmlldy5tb2R1bGUnO1xuZXhwb3J0IHsgRHJhd2VyTW9kdWxlIH0gZnJvbSAnLi9kcmF3ZXIvZHJhd2VyLm1vZHVsZSc7XG5leHBvcnQgeyBTd2lwZUFjdGlvbk1vZHVsZSB9IGZyb20gJy4vc3dpcGUtYWN0aW9uL3N3aXBlLWFjdGlvbi5tb2R1bGUnO1xuZXhwb3J0IHsgUHVsbFRvUmVmcmVzaE1vZHVsZSB9IGZyb20gJy4vcHVsbC10by1yZWZyZXNoL3B1bGwtdG8tcmVmcmVzaC5tb2R1bGUnO1xuZXhwb3J0IHsgTG9jYWxlUHJvdmlkZXJNb2R1bGUgfSBmcm9tICcuL2xvY2FsZS1wcm92aWRlci9sb2NhbGUtcHJvdmlkZXIubW9kdWxlJztcbmV4cG9ydCB7IExvY2FsZVByb3ZpZGVyU2VydmljZSB9IGZyb20gJy4vbG9jYWxlLXByb3ZpZGVyL2xvY2FsZS1wcm92aWRlci5zZXJ2aWNlJztcbmV4cG9ydCB7IExPQ0FMX1BST1ZJREVSX1RPS0VOIH0gZnJvbSAnLi9sb2NhbGUtcHJvdmlkZXIvbG9jYWxlLXByb3ZpZGVyLnRva2VuJztcbmV4cG9ydCB7IExvY2FsZVByb3ZpZGVyUGlwZSB9IGZyb20gJy4vbG9jYWxlLXByb3ZpZGVyL2xvY2FsZS1wcm92aWRlci5waXBlJztcbmV4cG9ydCAqIGZyb20gJy4vbG9jYWxlLXByb3ZpZGVyL2xhbmd1YWdlcyc7XG5cbmltcG9ydCB7IFRvYXN0IH0gZnJvbSAnLi90b2FzdC90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZGFsIH0gZnJvbSAnLi9tb2RhbC9tb2RhbC5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGlvblNoZWV0IH0gZnJvbSAnLi9hY3Rpb24tc2hlZXQvYWN0aW9uLXNoZWV0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUGlja2VyIH0gZnJvbSAnLi9waWNrZXIvcGlja2VyLnNlcnZpY2UnO1xuXG5leHBvcnQgeyBUb2FzdCB9IGZyb20gJy4vdG9hc3QvdG9hc3Quc2VydmljZSc7XG5leHBvcnQgeyBUb2FzdENvbXBvbmVudCB9IGZyb20gJy4vdG9hc3QvdG9hc3QuY29tcG9uZW50JztcbmV4cG9ydCB7IE1vZGFsIH0gZnJvbSAnLi9tb2RhbC9tb2RhbC5zZXJ2aWNlJztcbmV4cG9ydCB7IE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9tb2RhbC9tb2RhbC5jb21wb25lbnQnO1xuZXhwb3J0IHsgQWN0aW9uU2hlZXQgfSBmcm9tICcuL2FjdGlvbi1zaGVldC9hY3Rpb24tc2hlZXQuc2VydmljZSc7XG5leHBvcnQgeyBBY3Rpb25TaGVldENvbXBvbmVudCB9IGZyb20gJy4vYWN0aW9uLXNoZWV0L2FjdGlvbi1zaGVldC5jb21wb25lbnQnO1xuZXhwb3J0IHsgUGlja2VyIH0gZnJvbSAnLi9waWNrZXIvcGlja2VyLnNlcnZpY2UnO1xuZXhwb3J0IHsgUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9waWNrZXIvcGlja2VyLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIHByb3ZpZGVyczogW10sXG4gIGV4cG9ydHM6IFtcbiAgICBBY3Rpdml0eUluZGljYXRvck1vZHVsZSxcbiAgICBDYXJkTW9kdWxlLFxuICAgIFRhYnNNb2R1bGUsXG4gICAgVGFiQmFyTW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBTd2l0Y2hNb2R1bGUsXG4gICAgU2VhcmNoQmFyTW9kdWxlLFxuICAgIFN0ZXBwZXJNb2R1bGUsXG4gICAgU3RlcHNNb2R1bGUsXG4gICAgQ2hlY2tib3hNb2R1bGUsXG4gICAgUHJvZ3Jlc3NNb2R1bGUsXG4gICAgU2VnbWVudGVkQ29udHJvbE1vZHVsZSxcbiAgICBCYWRnZU1vZHVsZSxcbiAgICBDYXJvdXNlbE1vZHVsZSxcbiAgICBBY3Rpb25TaGVldE1vZHVsZSxcbiAgICBBY2NvcmRpb25Nb2R1bGUsXG4gICAgTm90aWNlQmFyTW9kdWxlLFxuICAgIEljb25Nb2R1bGUsXG4gICAgVG9hc3RNb2R1bGUsXG4gICAgUmFkaW9Nb2R1bGUsXG4gICAgTW9kYWxNb2R1bGUsXG4gICAgUG9wb3Zlck1vZHVsZSxcbiAgICBQb3BvdmVySXRlbU1vZHVsZSxcbiAgICBOYXZCYXJNb2R1bGUsXG4gICAgTGlzdE1vZHVsZSxcbiAgICBDYWxlbmRhck1vZHVsZSxcbiAgICBJbnB1dEl0ZW1Nb2R1bGUsXG4gICAgRmxleE1vZHVsZSxcbiAgICBHcmlkTW9kdWxlLFxuICAgIFJhbmdlTW9kdWxlLFxuICAgIFNsaWRlck1vZHVsZSxcbiAgICBUZXh0YXJlYUl0ZW1Nb2R1bGUsXG4gICAgTmdab3Jyb0FudGRNb2JpbGVQaXBlc01vZHVsZSxcbiAgICBQaWNrZXJNb2R1bGUsXG4gICAgUGlja2VyVmlld01vZHVsZSxcbiAgICBJbWFnZVBpY2tlck1vZHVsZSxcbiAgICBSZXN1bHRNb2R1bGUsXG4gICAgV2hpdGVTcGFjZU1vZHVsZSxcbiAgICBXaW5nQmxhbmtNb2R1bGUsXG4gICAgTG9jYWxlUHJvdmlkZXJNb2R1bGUsXG4gICAgTmdab3Jyb0FudGRNb2JpbGVQaXBlc01vZHVsZSxcbiAgICBQYWdpbmF0aW9uTW9kdWxlLFxuICAgIFRhZ01vZHVsZSxcbiAgICBNZW51TW9kdWxlLFxuICAgIERhdGVQaWNrZXJNb2R1bGUsXG4gICAgRGF0ZVBpY2tlclZpZXdNb2R1bGUsXG4gICAgRHJhd2VyTW9kdWxlLFxuICAgIFB1bGxUb1JlZnJlc2hNb2R1bGUsXG4gICAgU3dpcGVBY3Rpb25Nb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ1pvcnJvQW50ZE1vYmlsZU1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KCk6IE1vZHVsZVdpdGhQcm92aWRlcnMge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogTmdab3Jyb0FudGRNb2JpbGVNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtBY3Rpb25TaGVldCwgVG9hc3QsIE1vZGFsLCBQaWNrZXJdXG4gICAgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIkNhbGVuZGFyIiwiSW5wdXRJdGVtIiwiU2VhcmNoQmFyIiwidG91Y2hFdmVudC5nZXRFdmVudFRhcmdldCIsIlBvc2l0aW9uaW5nLmdldFBvc2l0aW9uRWxlbWVudHMiLCJ6aENOIiwiZW5VUyIsIkRhdGVQaWNrZXIiLCJQaWNrZXIiLCJEYXRlUGlja2VyVmlldyIsIk1lbnUiLCJQYWdpbmF0aW9uIiwiUHVsbFRvUmVmcmVzaCIsInZlbG9jaXR5LmdldFZlbG9jaXR5IiwiRGF0ZVBpY2tlckNv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QUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsSUFBSTtxQkFDTDtpQkFDRjtnQkFDRDtvQkFDRSxLQUFLLEVBQUUsS0FBSztvQkFDWixRQUFRLEVBQUU7d0JBQ1IsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsSUFBSTtxQkFDTDtpQkFDRjtnQkFDRDtvQkFDRSxLQUFLLEVBQUUsS0FBSztvQkFDWixRQUFRLEVBQUU7d0JBQ1IsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsSUFBSTtxQkFDTDtpQkFDRjtnQkFDRDtvQkFDRSxLQUFLLEVBQUUsS0FBSztvQkFDWixRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7aUJBQzNEO2dCQUNEO29CQUNFLEtBQUssRUFBRSxLQUFLO29CQUNaLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7aUJBQzdDO2dCQUNEO29CQUNFLEtBQUssRUFBRSxLQUFLO29CQUNaLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7aUJBQzVDO2dCQUNEO29CQUNFLEtBQUssRUFBRSxLQUFLO29CQUNaLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO2lCQUMvQjtnQkFDRDtvQkFDRSxLQUFLLEVBQUUsS0FB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Szt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLFNBQVM7d0JBQ1QsU0FBUzt3QkFDVCxJQUFJO3FCQUNMO2lCQUNGO2dCQUNEO29CQUNFLEtBQUssRUFBRSxLQUFLO29CQUNaLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7aUJBQ2pFO2dCQUNEO29CQUNFLEtBQUssRUFBRSxLQUFLO29CQUNaLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7aUJBQzlDO2dCQUNEO29CQUNFLEtBQUssRUFBRSxNQUFNO29CQUNiLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7aUJBQzdDO2dCQUNEO29CQUNFLEtBQUssRUFBRSxLQUFLO29CQUNaLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7aUJBQzdDO2dCQUNEO29CQUNFLEtBQUssRUFBRSxLQUFLO29CQUNaLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO2lCQUNwRDtnQkFDRDtvQkFDRSxLQUFLLEVBQUUsS0FBSztvQkFDWixRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7aUJBQzFEO2dCQUNEO29CQUNFLEtBQUssRUFBRSxLQUFLO29CQUNaLFFBQVEsRUFBRTt3QkFDUixLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFL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