go-captcha-angular
Version:
GoCaptcha for Angular, which implements click mode, slider mode, drag-drop mode and rotation mode.
233 lines • 39 kB
JavaScript
import { Component, Input, ViewChild, ViewEncapsulation } from '@angular/core';
import { checkTargetFather, mergeTo } from "../../helper/helper";
import { defaultSlideRegionConfig } from "./slide-region-instance";
import * as i0 from "@angular/core";
import * as i1 from "../../icons/close-icon.component";
import * as i2 from "../../icons/refresh-icon.component";
import * as i3 from "../../icons/loading-icon.component";
export class SlideRegionComponent {
constructor() {
this.localConfig = defaultSlideRegionConfig();
this.localData = {
thumbX: 0,
thumbY: 0,
thumbWidth: 0,
thumbHeight: 0,
image: "",
thumb: ""
};
this.localEvents = {};
this.state = { x: this.localData.thumbX || 0, y: this.localData.thumbY || 0 };
this.isFreeze = false;
this.dsFn = (event) => event.preventDefault();
}
set config(config) {
mergeTo(this.localConfig, config);
this.localConfig = config;
}
set data(data) {
mergeTo(this.localData, data);
this.localData = data;
this.updateState();
}
set events(events) {
mergeTo(this.localEvents, events);
this.localEvents = events;
}
get hasDisplayWrapperState() {
return (this.localConfig.width || 0) > 0 || (this.localConfig.height || 0) > 0;
}
get hasDisplayImageState() {
return (this.localData.image && this.localData.image.length > 0) || (this.localData.thumb && this.localData.thumb.length > 0);
}
ngAfterViewInit() {
this.tileRef.nativeElement && this.tileRef.nativeElement.addEventListener('dragstart', this.dsFn);
}
ngOnDestroy() {
this.tileRef.nativeElement && this.tileRef.nativeElement.removeEventListener('dragstart', this.dsFn);
}
updateState() {
if (!this.isFreeze) {
this.state.x = (this.localData.thumbX || 0);
this.state.y = (this.localData.thumbY || 0);
}
}
dragEvent(e) {
if (!checkTargetFather(this.containerRef.nativeElement, e)) {
return;
}
const touch = e.touches && e.touches[0];
const offsetLeft = this.tileRef.nativeElement.offsetLeft;
const offsetTop = this.tileRef.nativeElement.offsetTop;
const width = this.containerRef.nativeElement.offsetWidth;
const height = this.containerRef.nativeElement.offsetHeight;
const tileWidth = this.tileRef.nativeElement.offsetWidth;
const tileHeight = this.tileRef.nativeElement.offsetHeight;
const maxWidth = width - tileWidth;
const maxHeight = height - tileHeight;
let isMoving = false;
let tmpLeaveDragEvent = null;
let startX = 0;
let startY = 0;
let tileLeft = 0;
let tileTop = 0;
if (touch) {
startX = touch.pageX - offsetLeft;
startY = touch.pageY - offsetTop;
}
else {
startX = e.clientX - offsetLeft;
startY = e.clientY - offsetTop;
}
const moveEvent = (e) => {
isMoving = true;
const mTouche = e.touches && e.touches[0];
let left = 0;
let top = 0;
if (mTouche) {
left = mTouche.pageX - startX;
top = mTouche.pageY - startY;
}
else {
left = e.clientX - startX;
top = e.clientY - startY;
}
if (left <= 0) {
left = 0;
}
if (top <= 0) {
top = 0;
}
if (left >= maxWidth) {
left = maxWidth;
}
if (top >= maxHeight) {
top = maxHeight;
}
this.state.x = left;
this.state.y = top;
tileLeft = left;
tileTop = top;
this.localEvents.move && this.localEvents.move(left, top);
e.cancelBubble = true;
e.preventDefault();
};
const upEvent = (e) => {
if (!checkTargetFather(this.containerRef.nativeElement, e)) {
return;
}
clearEvent();
if (!isMoving) {
return;
}
isMoving = false;
if (tileLeft < 0 || tileTop < 0) {
return;
}
this.localEvents.confirm && this.localEvents.confirm({ x: tileLeft, y: tileTop }, () => {
this.reset();
});
e.cancelBubble = true;
e.preventDefault();
};
const leaveDragBlockEvent = (e) => {
tmpLeaveDragEvent = e;
};
const enterDragBlockEvent = () => {
tmpLeaveDragEvent = null;
};
const leaveUpEvent = (_) => {
if (!tmpLeaveDragEvent) {
return;
}
upEvent(tmpLeaveDragEvent);
clearEvent();
};
const scope = this.localConfig.scope;
const dragDom = scope ? this.rootRef.nativeElement : this.dragBarRef.nativeElement;
const scopeDom = scope ? this.rootRef.nativeElement : document.body;
const clearEvent = () => {
scopeDom.removeEventListener("mousemove", moveEvent, false);
scopeDom.removeEventListener("touchmove", moveEvent, { passive: false });
dragDom.removeEventListener("mouseup", upEvent, false);
dragDom.removeEventListener("mouseenter", enterDragBlockEvent, false);
dragDom.removeEventListener("mouseleave", leaveDragBlockEvent, false);
dragDom.removeEventListener("touchend", upEvent, false);
scopeDom.removeEventListener("mouseleave", upEvent, false);
scopeDom.removeEventListener("mouseup", leaveUpEvent, false);
this.isFreeze = false;
};
this.isFreeze = true;
scopeDom.addEventListener("mousemove", moveEvent, false);
scopeDom.addEventListener("touchmove", moveEvent, { passive: false });
dragDom.addEventListener("mouseup", upEvent, false);
dragDom.addEventListener("mouseenter", enterDragBlockEvent, false);
dragDom.addEventListener("mouseleave", leaveDragBlockEvent, false);
dragDom.addEventListener("touchend", upEvent, false);
scopeDom.addEventListener("mouseleave", upEvent, false);
scopeDom.addEventListener("mouseup", leaveUpEvent, false);
}
closeEvent(e) {
this.close();
e.cancelBubble = true;
e.preventDefault();
return false;
}
refreshEvent(e) {
this.refresh();
e.cancelBubble = true;
e.preventDefault();
return false;
}
reset() {
this.state.x = this.localData.thumbX || 0;
this.state.y = this.localData.thumbY || 0;
}
clear() {
this.reset();
setTimeout(() => {
this.localData.image = '';
this.localData.thumb = '';
this.localData.thumbX = 0;
this.localData.thumbY = 0;
this.localData.thumbHeight = 0;
this.localData.thumbWidth = 0;
}, 0);
}
close() {
this.localEvents.close && this.localEvents.close();
this.reset();
}
refresh() {
this.localEvents.refresh && this.localEvents.refresh();
this.reset();
}
}
SlideRegionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SlideRegionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
SlideRegionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: SlideRegionComponent, selector: "go-captcha-slide-region", inputs: { config: "config", data: "data", events: "events" }, viewQueries: [{ propertyName: "rootRef", first: true, predicate: ["rootRef"], descendants: true }, { propertyName: "containerRef", first: true, predicate: ["containerRef"], descendants: true }, { propertyName: "dragBlockRef", first: true, predicate: ["dragBlockRef"], descendants: true }, { propertyName: "dragBarRef", first: true, predicate: ["dragBarRef"], descendants: true }, { propertyName: "tileRef", first: true, predicate: ["tileRef"], descendants: true }], ngImport: i0, template: "<div\n class=\"go-captcha gc-wrapper\"\n [class]=\"{'gc-theme': localConfig.showTheme}\"\n [style]=\"{\n width: (localConfig.width || 0) + ( localConfig.horizontalPadding * 2) + (localConfig.showTheme ? 2 : 0) + 'px',\n paddingLeft: localConfig.horizontalPadding + 'px',\n paddingRight: localConfig.horizontalPadding + 'px',\n paddingTop: localConfig.verticalPadding + 'px',\n paddingBottom: localConfig.verticalPadding + 'px',\n display: hasDisplayWrapperState ? 'block' : 'none'\n }\"\n #rootRef\n>\n <div class=\"gc-header gc-header2\">\n <span>{{ localConfig.title }}</span>\n </div>\n <div\n class=\"gc-body\"\n #containerRef\n [style]=\"{width: localConfig.width + 'px', height: localConfig.height + 'px'}\"\n >\n <div class=\"gc-loading\">\n <loading-icon></loading-icon>\n </div>\n <img\n class=\"gc-picture\"\n [class]=\"{'gc-hide': localData.image == ''}\"\n [style]=\"{display: hasDisplayImageState ? 'block' : 'none'}\"\n [attr.src]=\"localData.image\"\n alt=\"\"\n />\n <div\n class=\"gc-tile\"\n #tileRef\n [style]=\"{\n width: localData.thumbWidth + 'px',\n height: localData.thumbHeight + 'px',\n top: state.y + 'px',\n left: state.x + 'px'\n }\"\n (mousedown)=\"dragEvent($event)\"\n (touchstart)=\"dragEvent($event)\"\n >\n <img\n [class]=\"{'gc-hide': localData.thumb == ''}\"\n [style]=\"{display: hasDisplayImageState ? 'block' : 'none'}\"\n [attr.src]=\"localData.thumb\"\n alt=\"\"\n />\n </div>\n </div>\n <div class=\"gc-footer\">\n <div class=\"gc-icon-block\">\n <close-icon\n [width]=\"localConfig.iconSize\"\n [height]=\"localConfig.iconSize\"\n (click)=\"closeEvent($event)\"\n ></close-icon>\n <refresh-icon\n [width]=\"localConfig.iconSize\"\n [height]=\"localConfig.iconSize\"\n (click)=\"refreshEvent($event)\"\n ></refresh-icon>\n </div>\n </div>\n</div>", styles: [".go-captcha .gc-header2{text-align:center}.go-captcha .gc-tile{position:absolute;z-index:2;cursor:pointer}.go-captcha .gc-tile img{display:block;cursor:pointer;width:100%;height:100%}\n"], dependencies: [{ kind: "component", type: i1.CloseIconComponent, selector: "close-icon", inputs: ["width", "height"] }, { kind: "component", type: i2.RefreshIconComponent, selector: "refresh-icon", inputs: ["width", "height"] }, { kind: "component", type: i3.LoadingIconComponent, selector: "loading-icon", inputs: ["width", "height"] }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SlideRegionComponent, decorators: [{
type: Component,
args: [{ selector: 'go-captcha-slide-region', encapsulation: ViewEncapsulation.None, template: "<div\n class=\"go-captcha gc-wrapper\"\n [class]=\"{'gc-theme': localConfig.showTheme}\"\n [style]=\"{\n width: (localConfig.width || 0) + ( localConfig.horizontalPadding * 2) + (localConfig.showTheme ? 2 : 0) + 'px',\n paddingLeft: localConfig.horizontalPadding + 'px',\n paddingRight: localConfig.horizontalPadding + 'px',\n paddingTop: localConfig.verticalPadding + 'px',\n paddingBottom: localConfig.verticalPadding + 'px',\n display: hasDisplayWrapperState ? 'block' : 'none'\n }\"\n #rootRef\n>\n <div class=\"gc-header gc-header2\">\n <span>{{ localConfig.title }}</span>\n </div>\n <div\n class=\"gc-body\"\n #containerRef\n [style]=\"{width: localConfig.width + 'px', height: localConfig.height + 'px'}\"\n >\n <div class=\"gc-loading\">\n <loading-icon></loading-icon>\n </div>\n <img\n class=\"gc-picture\"\n [class]=\"{'gc-hide': localData.image == ''}\"\n [style]=\"{display: hasDisplayImageState ? 'block' : 'none'}\"\n [attr.src]=\"localData.image\"\n alt=\"\"\n />\n <div\n class=\"gc-tile\"\n #tileRef\n [style]=\"{\n width: localData.thumbWidth + 'px',\n height: localData.thumbHeight + 'px',\n top: state.y + 'px',\n left: state.x + 'px'\n }\"\n (mousedown)=\"dragEvent($event)\"\n (touchstart)=\"dragEvent($event)\"\n >\n <img\n [class]=\"{'gc-hide': localData.thumb == ''}\"\n [style]=\"{display: hasDisplayImageState ? 'block' : 'none'}\"\n [attr.src]=\"localData.thumb\"\n alt=\"\"\n />\n </div>\n </div>\n <div class=\"gc-footer\">\n <div class=\"gc-icon-block\">\n <close-icon\n [width]=\"localConfig.iconSize\"\n [height]=\"localConfig.iconSize\"\n (click)=\"closeEvent($event)\"\n ></close-icon>\n <refresh-icon\n [width]=\"localConfig.iconSize\"\n [height]=\"localConfig.iconSize\"\n (click)=\"refreshEvent($event)\"\n ></refresh-icon>\n </div>\n </div>\n</div>", styles: [".go-captcha .gc-header2{text-align:center}.go-captcha .gc-tile{position:absolute;z-index:2;cursor:pointer}.go-captcha .gc-tile img{display:block;cursor:pointer;width:100%;height:100%}\n"] }]
}], propDecorators: { rootRef: [{
type: ViewChild,
args: ['rootRef', { static: false }]
}], containerRef: [{
type: ViewChild,
args: ['containerRef', { static: false }]
}], dragBlockRef: [{
type: ViewChild,
args: ['dragBlockRef', { static: false }]
}], dragBarRef: [{
type: ViewChild,
args: ['dragBarRef', { static: false }]
}], tileRef: [{
type: ViewChild,
args: ['tileRef', { static: false }]
}], config: [{
type: Input
}], data: [{
type: Input
}], events: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUtcmVnaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dvLWNhcHRjaGEtYW5ndWxhci9zcmMvbGliL21vZHVsZXMvc2xpZGUtcmVnaW9uL3NsaWRlLXJlZ2lvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nby1jYXB0Y2hhLWFuZ3VsYXIvc3JjL2xpYi9tb2R1bGVzL3NsaWRlLXJlZ2lvbi9zbGlkZS1yZWdpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBYyxLQUFLLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFBO0FBQ3hGLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsd0JBQXdCLEVBQXVELE1BQU0seUJBQXlCLENBQUM7Ozs7O0FBUXZILE1BQU0sT0FBTyxvQkFBb0I7SUFOakM7UUFPSSxnQkFBVyxHQUF1Qix3QkFBd0IsRUFBRSxDQUFBO1FBQzVELGNBQVMsR0FBb0I7WUFDekIsTUFBTSxFQUFFLENBQUM7WUFDVCxNQUFNLEVBQUUsQ0FBQztZQUNULFVBQVUsRUFBRSxDQUFDO1lBQ2IsV0FBVyxFQUFFLENBQUM7WUFDZCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1NBQ08sQ0FBQTtRQUNwQixnQkFBVyxHQUFzQixFQUFFLENBQUE7UUFpQm5DLFVBQUssR0FBMkIsRUFBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUMsQ0FBQTtRQUM5RixhQUFRLEdBQVksS0FBSyxDQUFBO1FBNkJqQixTQUFJLEdBQUcsQ0FBQyxL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c0JBRFQsS0FBSztnQkFPRixJQUFJO3NCQURQLEtBQUs7Z0JBUUYsTUFBTTtzQkFEVCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHtjaGVja1RhcmdldEZhdGhlciwgbWVyZ2VUb30gZnJvbSBcIi4uLy4uL2hlbHBlci9oZWxwZXJcIjtcbmltcG9ydCB7ZGVmYXVsdFNsaWRlUmVnaW9uQ29uZmlnLCBTbGlkZVJlZ2lvbkNvbmZpZywgU2xpZGVSZWdpb25EYXRhLCBTbGlkZVJlZ2lvbkV2ZW50fSBmcm9tIFwiLi9zbGlkZS1yZWdpb24taW5zdGFuY2VcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdnby1jYXB0Y2hhLXNsaWRlLXJlZ2lvbicsXG4gICAgdGVtcGxhdGVVcmw6ICdzbGlkZS1yZWdpb24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydzbGlkZS1yZWdpb24uY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBTbGlkZVJlZ2lvbkNvbXBvbmVudCB7XG4gICAgbG9jYWxDb25maWc/OiBTbGlkZVJlZ2lvbkNvbmZpZyA9IGRlZmF1bHRTbGlkZVJlZ2lvbkNvbmZpZygpXG4gICAgbG9jYWxEYXRhOiBTbGlkZVJlZ2lvbkRhdGEgPSB7XG4gICAgICAgIHRodW1iWDogMCxcbiAgICAgICAgdGh1bWJZOiAwLFxuICAgICAgICB0aHVtYldpZHRoOiAwLFxuICAgICAgICB0aHVtYkhlaWdodDogMCxcbiAgICAgICAgaW1hZ2U6IFwiXCIsXG4gICAgICAgIHRodW1iOiBcIlwiXG4gICAgfSBhcyBTbGlkZVJlZ2lvbkRhdGFcbiAgICBsb2NhbEV2ZW50cz86IFNsaWRlUmVnaW9uRXZlbnQgPSB7fVxuXG4gICAgQFZpZXdDaGlsZCgncm9vdFJlZicsIHtzdGF0aWM6IGZhbHNlfSlcbiAgICByb290UmVmOiBFbGVtZW50UmVmXG5cbiAgICBAVmlld0NoaWxkKCdjb250YWluZXJSZWYnLCB7c3RhdGljOiBmYWxzZX0pXG4gICAgY29udGFpbmVyUmVmOiBFbGVtZW50UmVmXG5cbiAgICBAVmlld0NoaWxkKCdkcmFnQmxvY2tSZWYnLCB7c3RhdGljOiBmYWxzZX0pXG4gICAgZHJhZ0Jsb2NrUmVmOiBFbGVtZW50UmVmXG5cbiAgICBAVmlld0NoaWxkKCdkcmFnQmFyUmVmJywge3N0YXRpYzogZmFsc2V9KVxuICAgIGRyYWdCYXJSZWY6IEVsZW1lbnRSZWZcblxuICAgIEBWaWV3Q2hpbGQoJ3RpbGVSZWYnLCB7c3RhdGljOiBmYWxzZX0pXG4gICAgdGlsZVJlZjogRWxlbWVudFJlZlxuXG4gICAgc3RhdGU6IHt4OiBudW1iZXIsIHk6IG51bWJlcn0gPSB7eDogdGhpcy5sb2NhbERhdGEudGh1bWJYIHx8IDAsIHk6IHRoaXMubG9jYWxEYXRhLnRodW1iWSB8fCAwfVxuICAgIGlzRnJlZXplOiBib29sZWFuID0gZmFsc2VcblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IGNvbmZpZyhjb25maWc6IFNsaWRlUmVnaW9uQ29uZmlnKSB7XG4gICAgICAgIG1lcmdlVG8odGhpcy5sb2NhbENvbmZpZywgY29uZmlnKVxuICAgICAgICB0aGlzLmxvY2FsQ29uZmlnID0gY29uZmlnXG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBzZXQgZGF0YShkYXRhOiBTbGlkZVJlZ2lvbkRhdGEpIHtcbiAgICAgICAgbWVyZ2VUbyh0aGlzLmxvY2FsRGF0YSwgZGF0YSlcbiAgICAgICAgdGhpcy5sb2NhbERhdGEgPSBkYXRhXG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGUoKVxuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IGV2ZW50cyhldmVudHM6IFNsaWRlUmVnaW9uRXZlbnQpIHtcbiAgICAgICAgbWVyZ2VUbyh0aGlzLmxvY2FsRXZlbnRzLCBldmVudHMpXG4gICAgICAgIHRoaXMubG9jYWxFdmVudHMgPSBldmVudHNcbiAgICB9XG5cbiAgICBnZXQgaGFzRGlzcGxheVdyYXBwZXJTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmxvY2FsQ29uZmlnLndpZHRoIHx8IDApID4gMCB8fCAodGhpcy5sb2NhbENvbmZpZy5oZWlnaHQgfHwgMCkgPiAwXG4gICAgfVxuXG4gICAgZ2V0IGhhc0Rpc3BsYXlJbWFnZVN0YXRlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMubG9jYWxEYXRhLmltYWdlICYmIHRoaXMubG9jYWxEYXRhLmltYWdlLmxlbmd0aCA+IDApIHx8ICh0aGlzLmxvY2FsRGF0YS50aHVtYiAmJiB0aGlzLmxvY2FsRGF0YS50aHVtYi5sZW5ndGggPiAwKVxuICAgIH1cblxuICAgIHByaXZhdGUgZHNGbiA9IChldmVudDogYW55KSA9PiBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnRpbGVSZWYubmF0aXZlRWxlbWVudCAmJiB0aGlzLnRpbGVSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmRzRm4pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnRpbGVSZWYubmF0aXZlRWxlbWVudCAmJiB0aGlzLnRpbGVSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmRzRm4pO1xuICAgIH1cblxuICAgIHVwZGF0ZVN0YXRlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNGcmVlemUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUueCA9ICh0aGlzLmxvY2FsRGF0YS50aHVtYlggfHwgMClcbiAgICAgICAgICAgIHRoaXMuc3RhdGUueSA9ICh0aGlzLmxvY2FsRGF0YS50aHVtYlkgfHwgMClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRyYWdFdmVudChlOiBFdmVudHxhbnkpIHtcbiAgICAgICAgaWYgKCFjaGVja1RhcmdldEZhdGhlcih0aGlzLmNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50LCBlKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlcyAmJiBlLnRvdWNoZXNbMF07XG4gICAgICAgIGNvbnN0IG9mZnNldExlZnQgPSB0aGlzLnRpbGVSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0XG4gICAgICAgIGNvbnN0IG9mZnNldFRvcCA9IHRoaXMudGlsZVJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcFxuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuY29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGhcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5jb250YWluZXJSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcbiAgICAgICAgY29uc3QgdGlsZVdpZHRoID0gdGhpcy50aWxlUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGhcbiAgICAgICAgY29uc3QgdGlsZUhlaWdodCA9IHRoaXMudGlsZVJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodFxuICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHdpZHRoIC0gdGlsZVdpZHRoXG4gICAgICAgIGNvbnN0IG1heEhlaWdodCA9IGhlaWdodCAtIHRpbGVIZWlnaHRcblxuICAgICAgICBsZXQgaXNNb3ZpbmcgPSBmYWxzZVxuICAgICAgICBsZXQgdG1wTGVhdmVEcmFnRXZlbnQ6IEV2ZW50fGFueSA9IG51bGxcbiAgICAgICAgbGV0IHN0YXJ0WCA9IDBcbiAgICAgICAgbGV0IHN0YXJ0WSA9IDBcbiAgICAgICAgbGV0IHRpbGVMZWZ0ID0gMFxuICAgICAgICBsZXQgdGlsZVRvcCA9IDBcbiAgICAgICAgaWYgKHRvdWNoKSB7XG4gICAgICAgICAgICBzdGFydFggPSB0b3VjaC5wYWdlWCAtIG9mZnNldExlZnRcbiAgICAgICAgICAgIHN0YXJ0WSA9IHRvdWNoLnBhZ2VZIC0gb2Zmc2V0VG9wXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGFydFggPSBlLmNsaWVudFggLSBvZmZzZXRMZWZ0XG4gICAgICAgICAgICBzdGFydFkgPSBlLmNsaWVudFkgLSBvZmZzZXRUb3BcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vdmVFdmVudCA9IChlOiBFdmVudHxhbnkpID0+IHtcbiAgICAgICAgICAgIGlzTW92aW5nID0gdHJ1ZVxuICAgICAgICAgICAgY29uc3QgbVRvdWNoZSA9IGUudG91Y2hlcyAmJiBlLnRvdWNoZXNbMF07XG5cbiAgICAgICAgICAgIGxldCBsZWZ0ID0gMDtcbiAgICAgICAgICAgIGxldCB0b3AgPSAwO1xuICAgICAgICAgICAgaWYgKG1Ub3VjaGUpIHtcbiAgICAgICAgICAgICAgICBsZWZ0ID0gbVRvdWNoZS5wYWdlWCAtIHN0YXJ0WFxuICAgICAgICAgICAgICAgIHRvcCA9IG1Ub3VjaGUucGFnZVkgLSBzdGFydFlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGVmdCA9IGUuY2xpZW50WCAtIHN0YXJ0WFxuICAgICAgICAgICAgICAgIHRvcCA9IGUuY2xpZW50WSAtIHN0YXJ0WVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGVmdCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgbGVmdCA9IDBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRvcCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdG9wID0gMFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGVmdCA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgICAgIGxlZnQgPSBtYXhXaWR0aFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodG9wID49IG1heEhlaWdodCkge1xuICAgICAgICAgICAgICAgIHRvcCA9IG1heEhlaWdodFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnggPSBsZWZ0XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnkgPSB0b3BcbiAgICAgICAgICAgIHRpbGVMZWZ0ID0gbGVmdFxuICAgICAgICAgICAgdGlsZVRvcCA9IHRvcFxuICAgICAgICAgICAgdGhpcy5sb2NhbEV2ZW50cy5tb3ZlICYmIHRoaXMubG9jYWxFdmVudHMubW92ZShsZWZ0LCB0b3ApXG5cbiAgICAgICAgICAgIGUuY2FuY2VsQnViYmxlID0gdHJ1ZVxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cEV2ZW50ID0gKGU6IEV2ZW50fGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjaGVja1RhcmdldEZhdGhlcih0aGlzLmNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50LCBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbGVhckV2ZW50KClcbiAgICAgICAgICAgIGlmICghaXNNb3ZpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzTW92aW5nID0gZmFsc2VcblxuICAgICAgICAgICAgaWYgKHRpbGVMZWZ0IDwgMCB8fCB0aWxlVG9wIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvY2FsRXZlbnRzLmNvbmZpcm0gJiYgdGhpcy5sb2NhbEV2ZW50cy5jb25maXJtKHt4OiB0aWxlTGVmdCwgeTogdGlsZVRvcH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGUuY2FuY2VsQnViYmxlID0gdHJ1ZVxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsZWF2ZURyYWdCbG9ja0V2ZW50ID0gKGU6IEV2ZW50fGFueSkgPT4ge1xuICAgICAgICAgICAgdG1wTGVhdmVEcmFnRXZlbnQgPSBlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRlckRyYWdCbG9ja0V2ZW50ID0gKCkgPT4ge1xuICAgICAgICAgICAgdG1wTGVhdmVEcmFnRXZlbnQgPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsZWF2ZVVwRXZlbnQgPSAoXzogRXZlbnR8YW55KSA9PiB7XG4gICAgICAgICAgICBpZighdG1wTGVhdmVEcmFnRXZlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdXBFdmVudCh0bXBMZWF2ZURyYWdFdmVudClcbiAgICAgICAgICAgIGNsZWFyRXZlbnQoKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzLmxvY2FsQ29uZmlnLnNjb3BlXG4gICAgICAgIGNvbnN0IGRyYWdEb20gPSBzY29wZSA/IHRoaXMucm9vdFJlZi5uYXRpdmVFbGVtZW50IDogdGhpcy5kcmFnQmFyUmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgY29uc3Qgc2NvcGVEb20gPSBzY29wZSA/IHRoaXMucm9vdFJlZi5uYXRpdmVFbGVtZW50IDogZG9jdW1lbnQuYm9keVxuXG4gICAgICAgIGNvbnN0IGNsZWFyRXZlbnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBzY29wZURvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIG1vdmVFdmVudCwgZmFsc2UpXG4gICAgICAgICAgICBzY29wZURvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIG1vdmVFdmVudCwgeyBwYXNzaXZlOiBmYWxzZSB9KVxuXG4gICAgICAgICAgICBkcmFnRG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwibW91c2V1cFwiLCB1cEV2ZW50LCBmYWxzZSlcbiAgICAgICAgICAgIGRyYWdEb20ucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJtb3VzZWVudGVyXCIsIGVudGVyRHJhZ0Jsb2NrRXZlbnQsIGZhbHNlKVxuICAgICAgICAgICAgZHJhZ0RvbS5yZW1vdmVFdmVudExpc3RlbmVyKCBcIm1vdXNlbGVhdmVcIiwgbGVhdmVEcmFnQmxvY2tFdmVudCwgZmFsc2UpXG4gICAgICAgICAgICBkcmFnRG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCB1cEV2ZW50LCBmYWxzZSlcblxuICAgICAgICAgICAgc2NvcGVEb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgdXBFdmVudCwgZmFsc2UpXG4gICAgICAgICAgICBzY29wZURvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBsZWF2ZVVwRXZlbnQsIGZhbHNlKVxuXG4gICAgICAgICAgICB0aGlzLmlzRnJlZXplID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzRnJlZXplID0gdHJ1ZVxuXG4gICAgICAgIHNjb3BlRG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgbW92ZUV2ZW50LCBmYWxzZSlcbiAgICAgICAgc2NvcGVEb20uYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBtb3ZlRXZlbnQsIHsgcGFzc2l2ZTogZmFsc2UgfSlcblxuICAgICAgICBkcmFnRG9tLmFkZEV2ZW50TGlzdGVuZXIoIFwibW91c2V1cFwiLCB1cEV2ZW50LCBmYWxzZSlcbiAgICAgICAgZHJhZ0RvbS5hZGRFdmVudExpc3RlbmVyKCBcIm1vdXNlZW50ZXJcIiwgZW50ZXJEcmFnQmxvY2tFdmVudCwgZmFsc2UpXG4gICAgICAgIGRyYWdEb20uYWRkRXZlbnRMaXN0ZW5lciggXCJtb3VzZWxlYXZlXCIsIGxlYXZlRHJhZ0Jsb2NrRXZlbnQsIGZhbHNlKVxuICAgICAgICBkcmFnRG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCB1cEV2ZW50LCBmYWxzZSlcblxuICAgICAgICBzY29wZURvbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCB1cEV2ZW50LCBmYWxzZSlcbiAgICAgICAgc2NvcGVEb20uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgbGVhdmVVcEV2ZW50LCBmYWxzZSlcbiAgICB9XG5cbiAgICBjbG9zZUV2ZW50KGU6IEV2ZW50fGFueSl7XG4gICAgICAgIHRoaXMuY2xvc2UoKVxuICAgICAgICBlLmNhbmNlbEJ1YmJsZSA9IHRydWVcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJlZnJlc2hFdmVudChlOiBFdmVudHxhbnkpIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoKClcbiAgICAgICAgZS5jYW5jZWxCdWJibGUgPSB0cnVlXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXNldCgpe1xuICAgICAgICB0aGlzLnN0YXRlLnggPSB0aGlzLmxvY2FsRGF0YS50aHVtYlggfHwgMFxuICAgICAgICB0aGlzLnN0YXRlLnkgPSB0aGlzLmxvY2FsRGF0YS50aHVtYlkgfHwgMFxuICAgIH1cblxuICAgIGNsZWFyKCl7XG4gICAgICAgIHRoaXMucmVzZXQoKVxuICAgICAgICBzZXRUaW1lb3V0KCgpPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2NhbERhdGEuaW1hZ2UgPSAnJ1xuICAgICAgICAgICAgdGhpcy5sb2NhbERhdGEudGh1bWIgPSAnJ1xuICAgICAgICAgICAgdGhpcy5sb2NhbERhdGEudGh1bWJYID0gMFxuICAgICAgICAgICAgdGhpcy5sb2NhbERhdGEudGh1bWJZID0gMFxuICAgICAgICAgICAgdGhpcy5sb2NhbERhdGEudGh1bWJIZWlnaHQgPSAwXG4gICAgICAgICAgICB0aGlzLmxvY2FsRGF0YS50aHVtYldpZHRoID0gMFxuICAgICAgICB9LCAwKVxuICAgIH1cblxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLmxvY2FsRXZlbnRzLmNsb3NlICYmIHRoaXMubG9jYWxFdmVudHMuY2xvc2UoKVxuICAgICAgICB0aGlzLnJlc2V0KClcbiAgICB9XG5cbiAgICByZWZyZXNoKCkge1xuICAgICAgICB0aGlzLmxvY2FsRXZlbnRzLnJlZnJlc2ggJiYgdGhpcy5sb2NhbEV2ZW50cy5yZWZyZXNoKClcbiAgICAgICAgdGhpcy5yZXNldCgpXG4gICAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImdvLWNhcHRjaGEgZ2Mtd3JhcHBlclwiXG4gIFtjbGFzc109XCJ7J2djLXRoZW1lJzogbG9jYWxDb25maWcuc2hvd1RoZW1lfVwiXG4gIFtzdHlsZV09XCJ7XG4gICAgd2lkdGg6ICAobG9jYWxDb25maWcud2lkdGggfHwgMCkgKyAoIGxvY2FsQ29uZmlnLmhvcml6b250YWxQYWRkaW5nICogMikgKyAobG9jYWxDb25maWcuc2hvd1RoZW1lID8gMiA6IDApICsgJ3B4JyxcbiAgICBwYWRkaW5nTGVmdDogbG9jYWxDb25maWcuaG9yaXpvbnRhbFBhZGRpbmcgKyAncHgnLFxuICAgIHBhZGRpbmdSaWdodDogbG9jYWxDb25maWcuaG9yaXpvbnRhbFBhZGRpbmcgKyAncHgnLFxuICAgIHBhZGRpbmdUb3A6IGxvY2FsQ29uZmlnLnZlcnRpY2FsUGFkZGluZyArICdweCcsXG4gICAgcGFkZGluZ0JvdHRvbTogbG9jYWxDb25maWcudmVydGljYWxQYWRkaW5nICsgJ3B4JyxcbiAgICBkaXNwbGF5OiBoYXNEaXNwbGF5V3JhcHBlclN0YXRlID8gJ2Jsb2NrJyA6ICdub25lJ1xuICB9XCJcbiAgI3Jvb3RSZWZcbj5cbiAgPGRpdiBjbGFzcz1cImdjLWhlYWRlciBnYy1oZWFkZXIyXCI+XG4gICAgPHNwYW4+e3sgbG9jYWxDb25maWcudGl0bGUgfX08L3NwYW4+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJnYy1ib2R5XCJcbiAgICAjY29udGFpbmVyUmVmXG4gICAgW3N0eWxlXT1cInt3aWR0aDogbG9jYWxDb25maWcud2lkdGggKyAncHgnLCBoZWlnaHQ6IGxvY2FsQ29uZmlnLmhlaWdodCArICdweCd9XCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJnYy1sb2FkaW5nXCI+XG4gICAgICA8bG9hZGluZy1pY29uPjwvbG9hZGluZy1pY29uPlxuICAgIDwvZGl2PlxuICAgIDxpbWdcbiAgICAgIGNsYXNzPVwiZ2MtcGljdHVyZVwiXG4gICAgICBbY2xhc3NdPVwieydnYy1oaWRlJzogbG9jYWxEYXRhLmltYWdlID09ICcnfVwiXG4gICAgICBbc3R5bGVdPVwie2Rpc3BsYXk6IGhhc0Rpc3BsYXlJbWFnZVN0YXRlID8gJ2Jsb2NrJyA6ICdub25lJ31cIlxuICAgICAgW2F0dHIuc3JjXT1cImxvY2FsRGF0YS5pbWFnZVwiXG4gICAgICBhbHQ9XCJcIlxuICAgIC8+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJnYy10aWxlXCJcbiAgICAgICN0aWxlUmVmXG4gICAgICBbc3R5bGVdPVwie1xuICAgICAgICB3aWR0aDogbG9jYWxEYXRhLnRodW1iV2lkdGggKyAncHgnLFxuICAgICAgICBoZWlnaHQ6IGxvY2FsRGF0YS50aHVtYkhlaWdodCArICdweCcsXG4gICAgICAgIHRvcDogc3RhdGUueSArICdweCcsXG4gICAgICAgIGxlZnQ6IHN0YXRlLnggKyAncHgnXG4gICAgICB9XCJcbiAgICAgIChtb3VzZWRvd24pPVwiZHJhZ0V2ZW50KCRldmVudClcIlxuICAgICAgKHRvdWNoc3RhcnQpPVwiZHJhZ0V2ZW50KCRldmVudClcIlxuICAgID5cbiAgICAgIDxpbWdcbiAgICAgICAgW2NsYXNzXT1cInsnZ2MtaGlkZSc6IGxvY2FsRGF0YS50aHVtYiA9PSAnJ31cIlxuICAgICAgICBbc3R5bGVdPVwie2Rpc3BsYXk6IGhhc0Rpc3BsYXlJbWFnZVN0YXRlID8gJ2Jsb2NrJyA6ICdub25lJ31cIlxuICAgICAgICBbYXR0ci5zcmNdPVwibG9jYWxEYXRhLnRodW1iXCJcbiAgICAgICAgYWx0PVwiXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZ2MtZm9vdGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImdjLWljb24tYmxvY2tcIj5cbiAgICAgIDxjbG9zZS1pY29uXG4gICAgICAgIFt3aWR0aF09XCJsb2NhbENvbmZpZy5pY29uU2l6ZVwiXG4gICAgICAgIFtoZWlnaHRdPVwibG9jYWxDb25maWcuaWNvblNpemVcIlxuICAgICAgICAoY2xpY2spPVwiY2xvc2VFdmVudCgkZXZlbnQpXCJcbiAgICAgID48L2Nsb3NlLWljb24+XG4gICAgICA8cmVmcmVzaC1pY29uXG4gICAgICAgIFt3aWR0aF09XCJsb2NhbENvbmZpZy5pY29uU2l6ZVwiXG4gICAgICAgIFtoZWlnaHRdPVwibG9jYWxDb25maWcuaWNvblNpemVcIlxuICAgICAgICAoY2xpY2spPVwicmVmcmVzaEV2ZW50KCRldmVudClcIlxuICAgICAgPjwvcmVmcmVzaC1pY29uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==