@bixi/label
Version:
388 lines • 33.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { Subscription } from 'rxjs';
import { delayWhen, filter } from 'rxjs/operators';
import { EVENTS } from './label.event';
import { LabelHub } from './label.hub';
import { functionProxy } from './label.util';
export class BixiLabelCoreComponent {
/**
* @param {?} sanitizer
* @param {?} cdr
*/
constructor(sanitizer, cdr) {
this.sanitizer = sanitizer;
this.cdr = cdr;
this.subscription = new Subscription();
this.hoverInLabelsEvent = null;
this.labelingEvent = null;
this.labelTooltipDisabled = false;
this.labelModalDisabled = false;
this.startLabeling = new EventEmitter();
this.deleteLabels = new EventEmitter();
this.clickLabels = new EventEmitter();
this.pdfLoadFailed = new EventEmitter();
this.pdfScrolling = new EventEmitter();
this.mergeTables = new EventEmitter();
this.splitTable = new EventEmitter();
this.tblOperationRecords = new EventEmitter();
this.messageHandler = (/**
* @param {?} e
* @return {?}
*/
(e) => {
const { id, event, data } = e.data;
if (this.hub.id !== id)
return;
if (this.hub.logAllEvents) {
if (!this.hub.logIgnoreEvents.includes(event)) {
console.log(`[/label] Event(${this.hub.id})`, e.data);
}
}
switch (event) {
case EVENTS.ready: {
// 初始化标注器
this.hub.setReady(true);
this.hub.innerSetPagination({
pageCount: data.pageCount
});
break;
}
case EVENTS.zoomChange: {
this.hub.setZoom(data.zoom);
break;
}
case EVENTS.startLabeling: {
this.hub.startLabeling(data);
this.startLabeling.emit(data);
break;
}
case EVENTS.deleteLabels: {
this.hub.deleteLabels(data);
this.deleteLabels.emit(data);
break;
}
case EVENTS.paginationChange: {
this.hub.innerSetPagination({
pageNumber: data.pageNumber
});
break;
}
case EVENTS.searchResult: {
this.hub.setSearchResult(data);
break;
}
case EVENTS.clickLabels: {
this.clickLabels.emit(data);
break;
}
case EVENTS.hoverInLabel: {
this.hub.hoverInLabels(data);
break;
}
case EVENTS.hoverOutLabel: {
this.hub.hoverInLabels(null);
break;
}
case EVENTS.pdfScrolling: {
if (this.hub.hoverInLabelsEvent) {
this.hub.hoverInLabels(null);
}
this.pdfScrolling.emit(true);
break;
}
case EVENTS.pdfLoadFailed: {
this.pdfLoadFailed.emit();
break;
}
case EVENTS.log: {
this.hub.setLog(data);
break;
}
case EVENTS.resize: {
this.hub.resize$.next();
break;
}
case EVENTS.mergeTables: {
this.mergeTables.emit(data);
break;
}
case EVENTS.splitTable: {
this.splitTable.emit(data);
break;
}
case EVENTS.tblOperationRecords: {
this.tblOperationRecords.emit(data);
break;
}
default: {
if (this.hub.logUnhandledEvents) {
if (!this.hub.logIgnoreEvents.includes(event)) {
console.warn(`[/label] Unhandled Event(${this.hub.id}) `, event, data);
}
}
break;
}
}
});
}
/**
* @param {?} val
* @return {?}
*/
set engine(val) {
this.url = this.sanitizer.bypassSecurityTrustResourceUrl(`${val || './bixi-label/index.html'}`);
this._engine = val;
}
/**
* @return {?}
*/
get engine() {
return this._engine;
}
/**
* @return {?}
*/
onLoad() {
if (!this.hub)
return;
/** @type {?} */
const api = this.api;
this.hub.setApi(api);
this.hub.setLoaded(!!api);
}
/**
* @return {?}
*/
get api() {
if (!this.iframe)
return;
/** @type {?} */
const service = this.iframe.element.nativeElement.contentWindow.ProxyApiService2;
if (this.hub.dev) {
return functionProxy(service);
}
return service;
}
/**
* @return {?}
*/
ngOnInit() {
this.subscription.add(this.hub.init$
.pipe(filter((/**
* @param {?} i
* @return {?}
*/
i => !!i)), delayWhen((/**
* @return {?}
*/
() => this.hub.loaded$.pipe(filter((/**
* @param {?} r
* @return {?}
*/
r => r === true))))))
.subscribe((/**
* @param {?} options
* @return {?}
*/
options => {
if (!this.api)
return;
this.api.init(options);
})));
this.subscription.add(this.hub.labels$
.pipe(filter((/**
* @param {?} i
* @return {?}
*/
i => !!i)), delayWhen((/**
* @return {?}
*/
() => this.hub.ready$.pipe(filter((/**
* @param {?} r
* @return {?}
*/
r => r === true))))))
.subscribe((/**
* @param {?} labels
* @return {?}
*/
(labels) => {
if (!this.api)
return;
this.api.setLabels(labels);
})));
this.subscription.add(this.hub.tables$
.pipe(filter((/**
* @param {?} i
* @return {?}
*/
i => !!i)), delayWhen((/**
* @return {?}
*/
() => this.hub.ready$.pipe(filter((/**
* @param {?} r
* @return {?}
*/
r => r === true))))))
.subscribe((/**
* @param {?} tables
* @return {?}
*/
(tables) => {
if (!this.api)
return;
this.api.setTables(tables);
})));
this.subscription.add(this.hub.hoverInLabelsEvent$
.subscribe((/**
* @param {?} event
* @return {?}
*/
event => {
this.hoverInLabelsEvent = event;
this.cdr.detectChanges();
})));
this.subscription.add(this.hub.labelingEvent$
.subscribe((/**
* @param {?} event
* @return {?}
*/
event => {
this.labelingEvent = event;
this.cdr.detectChanges();
})));
window.addEventListener('message', this.messageHandler);
}
/**
* @return {?}
*/
onCloseLabelModal() {
this.hub.stopLabeling();
this.hub.restore();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.subscription.unsubscribe();
this.hub.destory();
window.removeEventListener('message', this.messageHandler);
}
}
BixiLabelCoreComponent.decorators = [
{ type: Component, args: [{
selector: 'bixi-label-core',
template: `
<div class="bixi-label-core">
<iframe
#iframe
[src]="url"
(load)="onLoad()"
[attr.id]="hub.id"
[title]="hub.id">
</iframe>
<bixi-label-tooltip
*ngIf="hoverInLabelsEvent && !labelTooltipDisabled"
[tooltip]="hoverInLabelsEvent"
[content]="labelTooltipContent">
</bixi-label-tooltip>
<bixi-label-modal
*ngIf="labelModalContent && labelingEvent && !labelModalDisabled"
[dragBoundary]="dragBoundary"
(close)="onCloseLabelModal()"
[labeling]="labelingEvent"
[title]="labelModalTitle"
[content]="labelModalContent">
</bixi-label-modal>
</div>
`,
exportAs: 'bixiLabelText',
encapsulation: ViewEncapsulation.None,
preserveWhitespaces: true,
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [".bixi-label-core{position:relative;width:100%;height:100%}.bixi-label-core iframe{width:100%;height:100%;vertical-align:top;border:none}.bixi-label-modal-backdrop{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1000;background-color:rgba(0,0,0,.5);-webkit-tap-highlight-color:transparent;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1);pointer-events:auto}.bixi-label-modal-backdrop.cdk-overlay-backdrop-showing{opacity:1}.bixi-label-modal,.bixi-label-tooltip{position:absolute;top:0;left:0}.bixi-label-tooltip{pointer-events:none}.bixi-label-modal{display:flex;flex-direction:column;background:#fff;border-radius:2px;box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05)}.bixi-label-modal-header{height:32px;font-size:12px;border-bottom:1px solid #d9d9d9;cursor:move}.bixi-label-modal-header-inner{display:flex;justify-content:space-between;height:100%;line-height:32px}.bixi-label-modal-content{height:calc(100% - 32px);overflow:auto}.bixi-label-modal .bixi-label-modal-title{padding-left:8px;font-weight:500}.bixi-label-modal .bixi-label-modal-close-icon{width:36px;height:100%;text-align:center;cursor:pointer;-webkit-user-drag:none}"]
}] }
];
/** @nocollapse */
BixiLabelCoreComponent.ctorParameters = () => [
{ type: DomSanitizer },
{ type: ChangeDetectorRef }
];
BixiLabelCoreComponent.propDecorators = {
dragBoundary: [{ type: Input }],
iframe: [{ type: ViewChild, args: ['iframe', { read: ViewContainerRef },] }],
hub: [{ type: Input }],
engine: [{ type: Input }],
labelTooltipContent: [{ type: Input }],
labelTooltipDisabled: [{ type: Input }],
labelModalTitle: [{ type: Input }],
labelModalDisabled: [{ type: Input }],
labelModalContent: [{ type: Input }],
startLabeling: [{ type: Output }],
deleteLabels: [{ type: Output }],
clickLabels: [{ type: Output }],
pdfLoadFailed: [{ type: Output }],
pdfScrolling: [{ type: Output }],
mergeTables: [{ type: Output }],
splitTable: [{ type: Output }],
tblOperationRecords: [{ type: Output }]
};
if (false) {
/** @type {?} */
BixiLabelCoreComponent.prototype.subscription;
/** @type {?} */
BixiLabelCoreComponent.prototype._engine;
/** @type {?} */
BixiLabelCoreComponent.prototype.url;
/** @type {?} */
BixiLabelCoreComponent.prototype.hoverInLabelsEvent;
/** @type {?} */
BixiLabelCoreComponent.prototype.labelingEvent;
/** @type {?} */
BixiLabelCoreComponent.prototype.dragBoundary;
/** @type {?} */
BixiLabelCoreComponent.prototype.iframe;
/** @type {?} */
BixiLabelCoreComponent.prototype.hub;
/** @type {?} */
BixiLabelCoreComponent.prototype.labelTooltipContent;
/** @type {?} */
BixiLabelCoreComponent.prototype.labelTooltipDisabled;
/** @type {?} */
BixiLabelCoreComponent.prototype.labelModalTitle;
/** @type {?} */
BixiLabelCoreComponent.prototype.labelModalDisabled;
/** @type {?} */
BixiLabelCoreComponent.prototype.labelModalContent;
/** @type {?} */
BixiLabelCoreComponent.prototype.startLabeling;
/** @type {?} */
BixiLabelCoreComponent.prototype.deleteLabels;
/** @type {?} */
BixiLabelCoreComponent.prototype.clickLabels;
/** @type {?} */
BixiLabelCoreComponent.prototype.pdfLoadFailed;
/** @type {?} */
BixiLabelCoreComponent.prototype.pdfScrolling;
/** @type {?} */
BixiLabelCoreComponent.prototype.mergeTables;
/** @type {?} */
BixiLabelCoreComponent.prototype.splitTable;
/** @type {?} */
BixiLabelCoreComponent.prototype.tblOperationRecords;
/** @type {?} */
BixiLabelCoreComponent.prototype.messageHandler;
/** @type {?} */
BixiLabelCoreComponent.prototype.sanitizer;
/**
* @type {?}
* @private
*/
BixiLabelCoreComponent.prototype.cdr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwtY29yZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYml4aS9sYWJlbC8iLCJzb3VyY2VzIjpbInNyYy9sYWJlbC1jb3JlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQW1CLE1BQU0sMkJBQTJCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV2QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBbUM3QyxNQUFNLE9BQU8sc0JBQXNCOzs7OztJQThCakMsWUFDUyxTQUF1QixFQUN0QixHQUFzQjtRQUR2QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3RCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBL0JoQyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFHbEMsdUJBQWtCLEdBQStCLElBQUksQ0FBQztRQUN0RCxrQkFBYSxHQUEwQixJQUFJLENBQUM7UUFhbkMseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBRXRDLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUVuQyxrQkFBYSxHQUFpQyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUNqRixpQkFBWSxHQUFxQyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUN4RixnQkFBVyxHQUFvQyxJ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O0lBQzdDLG1EQUE4RDs7SUFDOUQsK0NBQTJGOztJQUMzRiw4Q0FBa0c7O0lBQ2xHLDZDQUErRjs7SUFDL0YsK0NBQTZDOztJQUM3Qyw4Q0FBNEM7O0lBQzVDLDZDQUF5RTs7SUFDekUsNENBQXdFOztJQUN4RSxxREFBMEY7O0lBb0UxRixnREE2RkM7O0lBL0pDLDJDQUE4Qjs7Ozs7SUFDOUIscUNBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlUmVzb3VyY2VVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVsYXlXaGVuLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFVkVOVFMgfSBmcm9tICcuL2xhYmVsLmV2ZW50JztcbmltcG9ydCB7IExhYmVsSHViIH0gZnJvbSAnLi9sYWJlbC5odWInO1xuaW1wb3J0IHsgSUNsaWNrTGFiZWxzRXZlbnQsIElEZWxldGVMYWJlbHNFdmVudCwgSUhvdmVySW5MYWJlbHNFdmVudCwgSUxhYmVsaW5nRXZlbnQsIElTYWZlQW55LCBJVGFibGVNYXRyaXgsIElUYWJsZU9wZXJhdGlvblJlY29yZCB9IGZyb20gJy4vbGFiZWwudHlwZSc7XG5pbXBvcnQgeyBmdW5jdGlvblByb3h5IH0gZnJvbSAnLi9sYWJlbC51dGlsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYml4aS1sYWJlbC1jb3JlJyxcbiAgdGVtcGxhdGU6IGBcbiAgPGRpdiBjbGFzcz1cImJpeGktbGFiZWwtY29yZVwiPlxuICAgIDxpZnJhbWVcbiAgICAgICNpZnJhbWVcbiAgICAgIFtzcmNdPVwidXJsXCJcbiAgICAgIChsb2FkKT1cIm9uTG9hZCgpXCJcbiAgICAgIFthdHRyLmlkXT1cImh1Yi5pZFwiXG4gICAgICBbdGl0bGVdPVwiaHViLmlkXCI+XG4gICAgPC9pZnJhbWU+XG4gICAgPGJpeGktbGFiZWwtdG9vbHRpcFxuICAgICAgKm5nSWY9XCJob3ZlckluTGFiZWxzRXZlbnQgJiYgIWxhYmVsVG9vbHRpcERpc2FibGVkXCJcbiAgICAgIFt0b29sdGlwXT1cImhvdmVySW5MYWJlbHNFdmVudFwiXG4gICAgICBbY29udGVudF09XCJsYWJlbFRvb2x0aXBDb250ZW50XCI+XG4gICAgPC9iaXhpLWxhYmVsLXRvb2x0aXA+XG4gICAgPGJpeGktbGFiZWwtbW9kYWxcbiAgICAgICpuZ0lmPVwibGFiZWxNb2RhbENvbnRlbnQgJiYgbGFiZWxpbmdFdmVudCAmJiAhbGFiZWxNb2RhbERpc2FibGVkXCJcbiAgICAgIFtkcmFnQm91bmRhcnldPVwiZHJhZ0JvdW5kYXJ5XCJcbiAgICAgIChjbG9zZSk9XCJvbkNsb3NlTGFiZWxNb2RhbCgpXCJcbiAgICAgIFtsYWJlbGluZ109XCJsYWJlbGluZ0V2ZW50XCJcbiAgICAgIFt0aXRsZV09XCJsYWJlbE1vZGFsVGl0bGVcIlxuICAgICAgW2NvbnRlbnRdPVwibGFiZWxNb2RhbENvbnRlbnRcIj5cbiAgICA8L2JpeGktbGFiZWwtbW9kYWw+XG4gICA8L2Rpdj5cbiAgYCxcbiAgZXhwb3J0QXM6ICdiaXhpTGFiZWxUZXh0JyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIC8vIFRPRE8g5YGa5Li76aKY5YiH5o2iXG4gIHN0eWxlVXJsczogWycuL3N0eWxlL2luZGV4Lmxlc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBCaXhpTGFiZWxDb3JlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIF9lbmdpbmU6IHN0cmluZztcbiAgdXJsOiBTYWZlUmVzb3VyY2VVcmw7XG4gIGhvdmVySW5MYWJlbHNFdmVudDogSUhvdmVySW5MYWJlbHNFdmVudCB8IG51bGwgPSBudWxsO1xuICBsYWJlbGluZ0V2ZW50OiBJTGFiZWxpbmdFdmVudCB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBkcmFnQm91bmRhcnk6IHN0cmluZztcbiAgQFZpZXdDaGlsZCgnaWZyYW1lJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIGlmcmFtZTogVmlld0NvbnRhaW5lclJlZjtcbiAgQElucHV0KCkgaHViOiBMYWJlbEh1YjtcbiAgQElucHV0KClcbiAgc2V0IGVuZ2luZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMudXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGAke3ZhbCB8fCAnLi9iaXhpLWxhYmVsL2luZGV4Lmh0bWwnfWApO1xuICAgIHRoaXMuX2VuZ2luZSA9IHZhbDtcbiAgfVxuICBnZXQgZW5naW5lKCkge1xuICAgIHJldHVybiB0aGlzLl9lbmdpbmU7XG4gIH1cbiAgQElucHV0KCkgbGFiZWxUb29sdGlwQ29udGVudDogVGVtcGxhdGVSZWY8SVNhZmVBbnk+IHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBsYWJlbFRvb2x0aXBEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBsYWJlbE1vZGFsVGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgbGFiZWxNb2RhbERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxhYmVsTW9kYWxDb250ZW50OiBUZW1wbGF0ZVJlZjxJU2FmZUFueT4gfCB1bmRlZmluZWQ7XG4gIEBPdXRwdXQoKSBzdGFydExhYmVsaW5nOiBFdmVudEVtaXR0ZXI8SUxhYmVsaW5nRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJTGFiZWxpbmdFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZUxhYmVsczogRXZlbnRFbWl0dGVyPElEZWxldGVMYWJlbHNFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPElEZWxldGVMYWJlbHNFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNsaWNrTGFiZWxzOiBFdmVudEVtaXR0ZXI8SUNsaWNrTGFiZWxzRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2xpY2tMYWJlbHNFdmVudD4oKTtcbiAgQE91dHB1dCgpIHBkZkxvYWRGYWlsZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwZGZTY3JvbGxpbmcgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBtZXJnZVRhYmxlczogRXZlbnRFbWl0dGVyPElUYWJsZU1hdHJpeFtdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNwbGl0VGFibGU6IEV2ZW50RW1pdHRlcjxJVGFibGVNYXRyaXhbXT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSB0YmxPcGVyYXRpb25SZWNvcmRzOiBFdmVudEVtaXR0ZXI8SVRhYmxlT3BlcmF0aW9uUmVjb3JkW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkgeyB9XG5cbiAgb25Mb2FkKCkge1xuICAgIGlmICghdGhpcy5odWIpIHJldHVybjtcbiAgICBjb25zdCBhcGkgPSB0aGlzLmFwaTtcbiAgICB0aGlzLmh1Yi5zZXRBcGkoYXBpKTtcbiAgICB0aGlzLmh1Yi5zZXRMb2FkZWQoISFhcGkpO1xuICB9XG5cbiAgZ2V0IGFwaSgpIHtcbiAgICBpZiAoIXRoaXMuaWZyYW1lKSByZXR1cm47XG4gICAgY29uc3Qgc2VydmljZSA9IHRoaXMuaWZyYW1lLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250ZW50V2luZG93LlByb3h5QXBpU2VydmljZTI7XG4gICAgaWYgKHRoaXMuaHViLmRldikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uUHJveHkoc2VydmljZSk7XG4gICAgfVxuICAgIHJldHVybiBzZXJ2aWNlO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuaHViLmluaXQkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGkgPT4gISFpKSxcbiAgICAgICAgZGVsYXlXaGVuKCgpID0+IHRoaXMuaHViLmxvYWRlZCQucGlwZShmaWx0ZXIociA9PiByID09PSB0cnVlKSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKG9wdGlvbnMgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYXBpKSByZXR1cm47XG4gICAgICAgIHRoaXMuYXBpLmluaXQob3B0aW9ucyk7XG4gICAgICB9KSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuaHViLmxhYmVscyRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoaSA9PiAhIWkpLFxuICAgICAgICBkZWxheVdoZW4oKCkgPT4gdGhpcy5odWIucmVhZHkkLnBpcGUoZmlsdGVyKHIgPT4gciA9PT0gdHJ1ZSkpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgobGFiZWxzKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hcGkpIHJldHVybjtcbiAgICAgICAgdGhpcy5hcGkuc2V0TGFiZWxzKGxhYmVscyk7XG4gICAgICB9KSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuaHViLnRhYmxlcyRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoaSA9PiAhIWkpLFxuICAgICAgICBkZWxheVdoZW4oKCkgPT4gdGhpcy5odWIucmVhZHkkLnBpcGUoZmlsdGVyKHIgPT4gciA9PT0gdHJ1ZSkpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgodGFibGVzKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hcGkpIHJldHVybjtcbiAgICAgICAgdGhpcy5hcGkuc2V0VGFibGVzKHRhYmxlcyk7XG4gICAgICB9KSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuaHViLmhvdmVySW5MYWJlbHNFdmVudCRcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICB0aGlzLmhvdmVySW5MYWJlbHNFdmVudCA9IGV2ZW50O1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuaHViLmxhYmVsaW5nRXZlbnQkXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5sYWJlbGluZ0V2ZW50ID0gZXZlbnQ7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMubWVzc2FnZUhhbmRsZXIpO1xuICB9XG5cbiAgb25DbG9zZUxhYmVsTW9kYWwoKSB7XG4gICAgdGhpcy5odWIuc3RvcExhYmVsaW5nKCk7XG4gICAgdGhpcy5odWIucmVzdG9yZSgpO1xuICB9XG5cbiAgbWVzc2FnZUhhbmRsZXIgPSAoZTogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBpZCwgZXZlbnQsIGRhdGEgfSA9IGUuZGF0YTtcbiAgICBpZiAodGhpcy5odWIuaWQgIT09IGlkKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaHViLmxvZ0FsbEV2ZW50cykge1xuICAgICAgaWYgKCF0aGlzLmh1Yi5sb2dJZ25vcmVFdmVudHMuaW5jbHVkZXMoZXZlbnQpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbQGJpeGkvbGFiZWxdIEV2ZW50KCR7dGhpcy5odWIuaWR9KWAsIGUuZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAoZXZlbnQpIHtcbiAgICAgIGNhc2UgRVZFTlRTLnJlYWR5OiB7XG4gICAgICAgIC8vIOWIneWni+WMluagh+azqOWZqFxuICAgICAgICB0aGlzLmh1Yi5zZXRSZWFkeSh0cnVlKTtcbiAgICAgICAgdGhpcy5odWIuaW5uZXJTZXRQYWdpbmF0aW9uKHtcbiAgICAgICAgICBwYWdlQ291bnQ6IGRhdGEucGFnZUNvdW50XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRVZFTlRTLnpvb21DaGFuZ2U6IHtcbiAgICAgICAgdGhpcy5odWIuc2V0Wm9vbShkYXRhLnpvb20pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRVZFTlRTLnN0YXJ0TGFiZWxpbmc6IHtcbiAgICAgICAgdGhpcy5odWIuc3RhcnRMYWJlbGluZyhkYXRhKTtcbiAgICAgICAgdGhpcy5zdGFydExhYmVsaW5nLmVtaXQoZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBFVkVOVFMuZGVsZXRlTGFiZWxzOiB7XG4gICAgICAgIHRoaXMuaHViLmRlbGV0ZUxhYmVscyhkYXRhKTtcbiAgICAgICAgdGhpcy5kZWxldGVMYWJlbHMuZW1pdChkYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEVWRU5UUy5wYWdpbmF0aW9uQ2hhbmdlOiB7XG4gICAgICAgIHRoaXMuaHViLmlubmVyU2V0UGFnaW5hdGlvbih7XG4gICAgICAgICAgcGFnZU51bWJlcjogZGF0YS5wYWdlTnVtYmVyXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRVZFTlRTLnNlYXJjaFJlc3VsdDoge1xuICAgICAgICB0aGlzLmh1Yi5zZXRTZWFyY2hSZXN1bHQoZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBFVkVOVFMuY2xpY2tMYWJlbHM6IHtcbiAgICAgICAgdGhpcy5jbGlja0xhYmVscy5lbWl0KGRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRVZFTlRTLmhvdmVySW5MYWJlbDoge1xuICAgICAgICB0aGlzLmh1Yi5ob3ZlckluTGFiZWxzKGRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRVZFTlRTLmhvdmVyT3V0TGFiZWw6IHtcbiAgICAgICAgdGhpcy5odWIuaG92ZXJJbkxhYmVscyhudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEVWRU5UUy5wZGZTY3JvbGxpbmc6IHtcbiAgICAgICAgaWYgKHRoaXMuaHViLmhvdmVySW5MYWJlbHNFdmVudCkge1xuICAgICAgICAgIHRoaXMuaHViLmhvdmVySW5MYWJlbHMobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZGZTY3JvbGxpbmcuZW1pdCh0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEVWRU5UUy5wZGZMb2FkRmFpbGVkOiB7XG4gICAgICAgIHRoaXMucGRmTG9hZEZhaWxlZC5lbWl0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBFVkVOVFMubG9nOiB7XG4gICAgICAgIHRoaXMuaHViLnNldExvZyhkYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEVWRU5UUy5yZXNpemU6IHtcbiAgICAgICAgdGhpcy5odWIucmVzaXplJC5uZXh0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBFVkVOVFMubWVyZ2VUYWJsZXM6IHtcbiAgICAgICAgdGhpcy5tZXJnZVRhYmxlcy5lbWl0KGRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRVZFTlRTLnNwbGl0VGFibGU6IHtcbiAgICAgICAgdGhpcy5zcGxpdFRhYmxlLmVtaXQoZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBFVkVOVFMudGJsT3BlcmF0aW9uUmVjb3Jkczoge1xuICAgICAgICB0aGlzLnRibE9wZXJhdGlvblJlY29yZHMuZW1pdChkYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGlmICh0aGlzLmh1Yi5sb2dVbmhhbmRsZWRFdmVudHMpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaHViLmxvZ0lnbm9yZUV2ZW50cy5pbmNsdWRlcyhldmVudCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW0BiaXhpL2xhYmVsXSBVbmhhbmRsZWQgRXZlbnQoJHt0aGlzLmh1Yi5pZH0pIGAsIGV2ZW50LCBkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmh1Yi5kZXN0b3J5KCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLm1lc3NhZ2VIYW5kbGVyKTtcbiAgfVxufVxuIl19