@decaf-ts/for-angular 0.0.20 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/components/list/list.component.mjs +5 -3
- package/esm2022/components/list-item/list-item.component.mjs +4 -2
- package/esm2022/components/pagination/pagination.component.mjs +4 -5
- package/fesm2022/decaf-ts-for-angular.mjs +7 -6
- package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -15,6 +15,7 @@ import { ComponentRendererComponent } from '../component-renderer/component-rend
|
|
|
15
15
|
import { PaginationComponent } from '../pagination/pagination.component';
|
|
16
16
|
import { ListComponentsTypes } from './constants';
|
|
17
17
|
import { FilterComponent } from '../filter/filter.component';
|
|
18
|
+
import { TranslatePipe } from '@ngx-translate/core';
|
|
18
19
|
import * as i0 from "@angular/core";
|
|
19
20
|
/**
|
|
20
21
|
* @description A versatile list component that supports various data display modes.
|
|
@@ -1141,7 +1142,7 @@ let ListComponent = class ListComponent extends NgxBaseComponent {
|
|
|
1141
1142
|
}, []);
|
|
1142
1143
|
}
|
|
1143
1144
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1144
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ListComponent, isStandalone: true, selector: "ngx-decaf-list", inputs: { type: "type", translatable: "translatable", showSearchbar: "showSearchbar", data: "data", source: "source", start: "start", limit: "limit", loadMoreData: "loadMoreData", lines: "lines", inset: "inset", scrollThreshold: "scrollThreshold", scrollPosition: "scrollPosition", loadingText: "loadingText", showRefresher: "showRefresher", loadingSpinner: "loadingSpinner", enableFilter: "enableFilter", sortDirection: "sortDirection", sortBy: "sortBy", disableSort: "disableSort", emptyIcon: "emptyIcon", empty: "empty" }, outputs: { refreshEvent: "refreshEvent", clickEvent: "clickEvent" }, host: { listeners: { "window:ListItemClickEvent": "handleClick($event)", "window:searchbarEvent": "handleSearch($event)", "window:BackButtonNavigationEndEvent": "refresh($event)" } }, usesInheritance: true, ngImport: i0, template: "\n@if(showRefresher) {\n <ion-refresher slot=\"fixed\" [pullFactor]=\"1\" [pullMin]=\"100\" [pullMax]=\"200\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content />\n </ion-refresher>\n}\n\n@if(showSearchbar) {\n @if(model && enableFilter) {\n <ngx-decaf-filter\n [model]=\"model\"\n [sortDirection]=\"sortDirection\"\n [disableSort]=\"disableSort\"\n (filterEvent)=\"handleFilter($event)\"\n (searchEvent)=\"handleSearch($event)\"\n />\n } @else {\n <ngx-decaf-searchbar [emitEventToWindow]=\"false\" [debounce]=\"500\" (searchEvent)=\"handleSearch($event)\" />\n }\n}\n\n@if(data?.length) {\n <ion-list [id]=\"uid\" [inset]=\"inset\" [lines]=\"lines\" #component>\n @if(item?.tag) {\n @for(child of items; track trackItemFn($index, child)) {\n <ngx-decaf-component-renderer\n [tag]=\"item.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{\n item: child,\n mapper: mapper,\n route: route\n }'>\n </ngx-decaf-component-renderer>\n }\n } @else {\n <ng-content></ng-content>\n }\n </ion-list>\n\n @if(loadMoreData) {\n @if(pages > 0 && type === 'paginated' && !searchValue?.length) {\n <ngx-decaf-pagination\n [totalPages]=\"pages\"\n [current]=\"page\"\n (clickEvent)=\"handlePaginate($event)\"\n />\n\n } @else {\n <ion-infinite-scroll\n [class]=\"searchValue?.length ? 'dcf-hidden' : ''\"\n [position]=\"scrollPosition\"\n [threshold]=\"scrollThreshold\"\n (ionInfinite)=\"handleRefresh($event)\">\n <ion-infinite-scroll-content [loadingSpinner]=\"loadingSpinner\" [loadingText]=\"loadingText\" />\n </ion-infinite-scroll>\n }\n }\n} @else {\n @if(refreshing) {\n @for(skl of skeletonData; track skl) {\n <ion-item>\n <ion-thumbnail slot=\"start\">\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n </ion-thumbnail>\n <ion-label>\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n </ion-label>\n </ion-item>\n }\n\n } @else {\n @if(!searchValue?.length) {\n <ngx-decaf-empty-state\n [title]=\"(locale + '.'+ empty.title) | translate\"\n [subtitle]=\"(locale + '.'+ empty.subtitle) | translate\"\n [buttonText]=\"empty.showButton ? (locale + '.'+ empty.button | translate) : ''\"\n [buttonLink]=\"empty.showButton ? empty.route : ''\"\n />\n } @else {\n <ngx-decaf-empty-state\n icon=\"search-outline\"\n ngClass=\"empty-search\"\n [translatable]=\"true\"\n title=\"search.title\"\n subtitle=\"search.subtitle\"\n [searchValue]=\"searchValue\"\n />\n }\n }\n}\n\n", styles: ["ion-infinite-scroll-
|
|
1145
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ListComponent, isStandalone: true, selector: "ngx-decaf-list", inputs: { type: "type", translatable: "translatable", showSearchbar: "showSearchbar", data: "data", source: "source", start: "start", limit: "limit", loadMoreData: "loadMoreData", lines: "lines", inset: "inset", scrollThreshold: "scrollThreshold", scrollPosition: "scrollPosition", loadingText: "loadingText", showRefresher: "showRefresher", loadingSpinner: "loadingSpinner", enableFilter: "enableFilter", sortDirection: "sortDirection", sortBy: "sortBy", disableSort: "disableSort", emptyIcon: "emptyIcon", empty: "empty" }, outputs: { refreshEvent: "refreshEvent", clickEvent: "clickEvent" }, host: { listeners: { "window:ListItemClickEvent": "handleClick($event)", "window:searchbarEvent": "handleSearch($event)", "window:BackButtonNavigationEndEvent": "refresh($event)" } }, usesInheritance: true, ngImport: i0, template: "\n@if(showRefresher) {\n <ion-refresher slot=\"fixed\" [pullFactor]=\"1\" [pullMin]=\"100\" [pullMax]=\"200\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content />\n </ion-refresher>\n}\n\n@if(showSearchbar && data?.length) {\n @if(model && enableFilter) {\n <ngx-decaf-filter\n [model]=\"model\"\n [sortDirection]=\"sortDirection\"\n [disableSort]=\"disableSort\"\n (filterEvent)=\"handleFilter($event)\"\n (searchEvent)=\"handleSearch($event)\"\n />\n } @else {\n <ngx-decaf-searchbar [emitEventToWindow]=\"false\" [debounce]=\"500\" (searchEvent)=\"handleSearch($event)\" />\n }\n}\n\n@if(data?.length) {\n <ion-list [id]=\"uid\" [inset]=\"inset\" [lines]=\"lines\" #component>\n @if(item?.tag) {\n @for(child of items; track trackItemFn($index, child)) {\n <ngx-decaf-component-renderer\n [tag]=\"item.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{\n item: child,\n mapper: mapper,\n route: route\n }'>\n </ngx-decaf-component-renderer>\n }\n } @else {\n <ng-content></ng-content>\n }\n </ion-list>\n\n @if(loadMoreData) {\n @if(pages > 0 && type === 'paginated' && !searchValue?.length) {\n <ngx-decaf-pagination\n [totalPages]=\"pages\"\n [current]=\"page\"\n (clickEvent)=\"handlePaginate($event)\"\n />\n\n } @else {\n <ion-infinite-scroll\n [class]=\"searchValue?.length ? 'dcf-hidden' : ''\"\n\n [position]=\"scrollPosition\"\n [threshold]=\"scrollThreshold\"\n (ionInfinite)=\"handleRefresh($event)\">\n <ion-infinite-scroll-content [loadingSpinner]=\"loadingSpinner\" [loadingText]=\"loadingText\" />\n </ion-infinite-scroll>\n }\n }\n} @else {\n @if(refreshing) {\n @for(skl of skeletonData; track skl) {\n <ion-item>\n <ion-thumbnail slot=\"start\">\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n </ion-thumbnail>\n <ion-label>\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n </ion-label>\n </ion-item>\n }\n\n } @else {\n @if(!searchValue?.length) {\n <ngx-decaf-empty-state\n [title]=\"(locale + '.'+ empty.title) | translate\"\n [subtitle]=\"(locale + '.'+ empty.subtitle) | translate\"\n [buttonText]=\"empty.showButton ? (locale + '.'+ empty.button | translate) : ''\"\n [buttonLink]=\"empty.showButton ? empty.route : ''\"\n />\n } @else {\n <ngx-decaf-empty-state\n icon=\"search-outline\"\n ngClass=\"empty-search\"\n [translatable]=\"true\"\n title=\"search.title\"\n subtitle=\"search.subtitle\"\n [searchValue]=\"searchValue\"\n />\n }\n }\n}\n\n", styles: ["ion-infinite-scroll{max-height:50px}ion-infinite-scroll:not(.infinite-scroll-loading) ::ng-deep{max-height:1.5rem}ion-infinite-scroll ::ng-deep ion-spinner{--color: var(--dcf-color-primary);padding-top:1rem}@media (max-width: 768px){#end,[slot=end]{display:none!important}}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: PaginationComponent, selector: "ngx-decaf-pagination", inputs: ["totalPages", "current"], outputs: ["clickEvent"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonThumbnail, selector: "ion-thumbnail" }, { kind: "component", type: IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }, { kind: "component", type: SearchbarComponent, selector: "ngx-decaf-searchbar", inputs: ["autocomplete", "autocorrect", "animated", "buttonCancelText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value", "queryKeys", "isVisible", "wrapper", "wrapperColor", "emitEventToWindow"], outputs: ["searchEvent"] }, { kind: "component", type: EmptyStateComponent, selector: "ngx-decaf-empty-state", inputs: ["title", "titleColor", "subtitle", "subtitleColor", "showIcon", "icon", "iconSize", "iconColor", "buttonLink", "buttonText", "buttonFill", "buttonColor", "buttonSize", "searchValue"] }, { kind: "component", type: FilterComponent, selector: "ngx-decaf-filter", inputs: ["indexes", "conditions", "sortBy", "disableSort"], outputs: ["filterEvent", "searchEvent"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "model", "parent"], outputs: ["listenEvent"] }] }); }
|
|
1145
1146
|
};
|
|
1146
1147
|
ListComponent = __decorate([
|
|
1147
1148
|
Dynamic(),
|
|
@@ -1151,6 +1152,7 @@ export { ListComponent };
|
|
|
1151
1152
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ListComponent, decorators: [{
|
|
1152
1153
|
type: Component,
|
|
1153
1154
|
args: [{ selector: 'ngx-decaf-list', standalone: true, imports: [
|
|
1155
|
+
TranslatePipe,
|
|
1154
1156
|
IonRefresher,
|
|
1155
1157
|
IonLoading,
|
|
1156
1158
|
PaginationComponent,
|
|
@@ -1170,7 +1172,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1170
1172
|
ListItemComponent,
|
|
1171
1173
|
FilterComponent,
|
|
1172
1174
|
ComponentRendererComponent
|
|
1173
|
-
], template: "\n@if(showRefresher) {\n <ion-refresher slot=\"fixed\" [pullFactor]=\"1\" [pullMin]=\"100\" [pullMax]=\"200\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content />\n </ion-refresher>\n}\n\n@if(showSearchbar) {\n @if(model && enableFilter) {\n <ngx-decaf-filter\n [model]=\"model\"\n [sortDirection]=\"sortDirection\"\n [disableSort]=\"disableSort\"\n (filterEvent)=\"handleFilter($event)\"\n (searchEvent)=\"handleSearch($event)\"\n />\n } @else {\n <ngx-decaf-searchbar [emitEventToWindow]=\"false\" [debounce]=\"500\" (searchEvent)=\"handleSearch($event)\" />\n }\n}\n\n@if(data?.length) {\n <ion-list [id]=\"uid\" [inset]=\"inset\" [lines]=\"lines\" #component>\n @if(item?.tag) {\n @for(child of items; track trackItemFn($index, child)) {\n <ngx-decaf-component-renderer\n [tag]=\"item.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{\n item: child,\n mapper: mapper,\n route: route\n }'>\n </ngx-decaf-component-renderer>\n }\n } @else {\n <ng-content></ng-content>\n }\n </ion-list>\n\n @if(loadMoreData) {\n @if(pages > 0 && type === 'paginated' && !searchValue?.length) {\n <ngx-decaf-pagination\n [totalPages]=\"pages\"\n [current]=\"page\"\n (clickEvent)=\"handlePaginate($event)\"\n />\n\n } @else {\n <ion-infinite-scroll\n [class]=\"searchValue?.length ? 'dcf-hidden' : ''\"\n [position]=\"scrollPosition\"\n [threshold]=\"scrollThreshold\"\n (ionInfinite)=\"handleRefresh($event)\">\n <ion-infinite-scroll-content [loadingSpinner]=\"loadingSpinner\" [loadingText]=\"loadingText\" />\n </ion-infinite-scroll>\n }\n }\n} @else {\n @if(refreshing) {\n @for(skl of skeletonData; track skl) {\n <ion-item>\n <ion-thumbnail slot=\"start\">\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n </ion-thumbnail>\n <ion-label>\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n </ion-label>\n </ion-item>\n }\n\n } @else {\n @if(!searchValue?.length) {\n <ngx-decaf-empty-state\n [title]=\"(locale + '.'+ empty.title) | translate\"\n [subtitle]=\"(locale + '.'+ empty.subtitle) | translate\"\n [buttonText]=\"empty.showButton ? (locale + '.'+ empty.button | translate) : ''\"\n [buttonLink]=\"empty.showButton ? empty.route : ''\"\n />\n } @else {\n <ngx-decaf-empty-state\n icon=\"search-outline\"\n ngClass=\"empty-search\"\n [translatable]=\"true\"\n title=\"search.title\"\n subtitle=\"search.subtitle\"\n [searchValue]=\"searchValue\"\n />\n }\n }\n}\n\n", styles: ["ion-infinite-scroll-
|
|
1175
|
+
], template: "\n@if(showRefresher) {\n <ion-refresher slot=\"fixed\" [pullFactor]=\"1\" [pullMin]=\"100\" [pullMax]=\"200\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content />\n </ion-refresher>\n}\n\n@if(showSearchbar && data?.length) {\n @if(model && enableFilter) {\n <ngx-decaf-filter\n [model]=\"model\"\n [sortDirection]=\"sortDirection\"\n [disableSort]=\"disableSort\"\n (filterEvent)=\"handleFilter($event)\"\n (searchEvent)=\"handleSearch($event)\"\n />\n } @else {\n <ngx-decaf-searchbar [emitEventToWindow]=\"false\" [debounce]=\"500\" (searchEvent)=\"handleSearch($event)\" />\n }\n}\n\n@if(data?.length) {\n <ion-list [id]=\"uid\" [inset]=\"inset\" [lines]=\"lines\" #component>\n @if(item?.tag) {\n @for(child of items; track trackItemFn($index, child)) {\n <ngx-decaf-component-renderer\n [tag]=\"item.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{\n item: child,\n mapper: mapper,\n route: route\n }'>\n </ngx-decaf-component-renderer>\n }\n } @else {\n <ng-content></ng-content>\n }\n </ion-list>\n\n @if(loadMoreData) {\n @if(pages > 0 && type === 'paginated' && !searchValue?.length) {\n <ngx-decaf-pagination\n [totalPages]=\"pages\"\n [current]=\"page\"\n (clickEvent)=\"handlePaginate($event)\"\n />\n\n } @else {\n <ion-infinite-scroll\n [class]=\"searchValue?.length ? 'dcf-hidden' : ''\"\n\n [position]=\"scrollPosition\"\n [threshold]=\"scrollThreshold\"\n (ionInfinite)=\"handleRefresh($event)\">\n <ion-infinite-scroll-content [loadingSpinner]=\"loadingSpinner\" [loadingText]=\"loadingText\" />\n </ion-infinite-scroll>\n }\n }\n} @else {\n @if(refreshing) {\n @for(skl of skeletonData; track skl) {\n <ion-item>\n <ion-thumbnail slot=\"start\">\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n </ion-thumbnail>\n <ion-label>\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n </ion-label>\n </ion-item>\n }\n\n } @else {\n @if(!searchValue?.length) {\n <ngx-decaf-empty-state\n [title]=\"(locale + '.'+ empty.title) | translate\"\n [subtitle]=\"(locale + '.'+ empty.subtitle) | translate\"\n [buttonText]=\"empty.showButton ? (locale + '.'+ empty.button | translate) : ''\"\n [buttonLink]=\"empty.showButton ? empty.route : ''\"\n />\n } @else {\n <ngx-decaf-empty-state\n icon=\"search-outline\"\n ngClass=\"empty-search\"\n [translatable]=\"true\"\n title=\"search.title\"\n subtitle=\"search.subtitle\"\n [searchValue]=\"searchValue\"\n />\n }\n }\n}\n\n", styles: ["ion-infinite-scroll{max-height:50px}ion-infinite-scroll:not(.infinite-scroll-loading) ::ng-deep{max-height:1.5rem}ion-infinite-scroll ::ng-deep ion-spinner{--color: var(--dcf-color-primary);padding-top:1rem}@media (max-width: 768px){#end,[slot=end]{display:none!important}}\n"] }]
|
|
1174
1176
|
}], ctorParameters: () => [], propDecorators: { type: [{
|
|
1175
1177
|
type: Input
|
|
1176
1178
|
}], translatable: [{
|
|
@@ -1227,4 +1229,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1227
1229
|
type: HostListener,
|
|
1228
1230
|
args: ['window:BackButtonNavigationEndEvent', ['$event']]
|
|
1229
1231
|
}] } });
|
|
1230
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGlzdC9saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9saXN0L2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXpHLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLE9BQU8sRUFDUCxZQUFZLEVBQ1osVUFBVSxFQUNYLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBWSxjQUFjLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBRUwsT0FBTyxFQUNQLGNBQWMsRUFDZCxrQkFBa0IsRUFLbkIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxD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ImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQsIEhvc3RMaXN0ZW5lciwgT25EZXN0cm95ICB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCwgUmVmcmVzaGVyQ3VzdG9tRXZlbnQsIFNwaW5uZXJUeXBlcyB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7XG4gIElvbkluZmluaXRlU2Nyb2xsLFxuICBJb25JbmZpbml0ZVNjcm9sbENvbnRlbnQsXG4gIElvbkl0ZW0sXG4gIElvbkxhYmVsLFxuICBJb25MaXN0LFxuICBJb25SZWZyZXNoZXIsXG4gIElvblJlZnJlc2hlckNvbnRlbnQsXG4gIElvblNrZWxldG9uVGV4dCxcbiAgSW9uVGV4dCxcbiAgSW9uVGh1bWJuYWlsLFxuICBJb25Mb2FkaW5nXG59IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSAnQGRlY2FmLXRzL2RiLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgTW9kZWwsIFByaW1pdGl2ZXMgfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuaW1wb3J0IHsgQ29uZGl0aW9uLCBPYnNlcnZlciwgT3JkZXJEaXJlY3Rpb24sIFBhZ2luYXRvciB9IGZyb20gJ0BkZWNhZi10cy9jb3JlJztcbmltcG9ydCB7XG4gIEJhc2VDdXN0b21FdmVudCxcbiAgRHluYW1pYyxcbiAgRXZlbnRDb25zdGFudHMsXG4gIENvbXBvbmVudHNUYWdOYW1lcyxcbiAgUmVuZGVyZXJDdXN0b21FdmVudCxcbiAgU3RyaW5nT3JCb29sZWFuLFxuICBLZXlWYWx1ZSxcbiAgTGlzdEl0ZW1DdXN0b21FdmVudFxufSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgTmd4QmFzZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2VuZ2luZS9OZ3hCYXNlQ29tcG9uZW50JztcbmltcG9ydCB7XG4gIHN0cmluZ1RvQm9vbGVhbixcbiAgZm9ybWF0RGF0ZSxcbiAgaXNWYWxpZERhdGVcbn0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQgeyBTZWFyY2hiYXJDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2hiYXIvc2VhcmNoYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IExpc3RJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGlzdC1pdGVtL2xpc3QtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uQ3VzdG9tRXZlbnQgfSBmcm9tICcuLi9wYWdpbmF0aW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJTGlzdEVtcHR5UmVzdWx0LCBMaXN0Q29tcG9uZW50c1R5cGVzLCBEZWNhZlJlcG9zaXRvcnkgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBGdW5jdGlvbkxpa2UsIElGaWx0ZXJRdWVyeSwgSUZpbHRlclF1ZXJ5SXRlbSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgdmVyc2F0aWxlIGxpc3QgY29tcG9uZW50IHRoYXQgc3VwcG9ydHMgdmFyaW91cyBkYXRhIGRpc3BsYXkgbW9kZXMuXG4gKiBAc3VtbWFyeSBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZsZXhpYmxlIHdheSB0byBkaXNwbGF5IGxpc3RzIG9mIGRhdGEgd2l0aCBzdXBwb3J0XG4gKiBmb3IgaW5maW5pdGUgc2Nyb2xsaW5nLCBwYWdpbmF0aW9uLCBzZWFyY2hpbmcsIGFuZCBjdXN0b20gaXRlbSByZW5kZXJpbmcuIEl0IGNhbiBmZXRjaFxuICogZGF0YSBmcm9tIHZhcmlvdXMgc291cmNlcyBpbmNsdWRpbmcgbW9kZWxzLCBmdW5jdGlvbnMsIG9yIGRpcmVjdCBkYXRhIGlucHV0LlxuICpcbiAqIFRoZSBjb21wb25lbnQgc3VwcG9ydHMgdHdvIG1haW4gZGlzcGxheSB0eXBlczpcbiAqIDEuIEluZmluaXRlIHNjcm9sbGluZyAtIExvYWRzIG1vcmUgZGF0YSBhcyB0aGUgdXNlciBzY3JvbGxzXG4gKiAyLiBQYWdpbmF0aW9uIC0gRGlzcGxheXMgZGF0YSBpbiBwYWdlcyB3aXRoIG5hdmlnYXRpb24gY29udHJvbHNcbiAqXG4gKiBBZGRpdGlvbmFsIGZlYXR1cmVzIGluY2x1ZGU6XG4gKiAtIFB1bGwtdG8tcmVmcmVzaCBmdW5jdGlvbmFsaXR5XG4gKiAtIFNlYXJjaCBmaWx0ZXJpbmdcbiAqIC0gRW1wdHkgc3RhdGUgY3VzdG9taXphdGlvblxuICogLSBDdXN0b20gaXRlbSByZW5kZXJpbmdcbiAqIC0gRXZlbnQgZW1pc3Npb24gZm9yIGludGVyYWN0aW9uc1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gKiAgIHBhcnRpY2lwYW50IEwgYXMgTGlzdENvbXBvbmVudFxuICogICBwYXJ0aWNpcGFudCBEIGFzIERhdGEgU291cmNlXG4gKiAgIHBhcnRpY2lwYW50IEUgYXMgRXh0ZXJuYWwgQ29tcG9uZW50c1xuICpcbiAqICAgVS0+Pkw6IEluaXRpYWxpemUgY29tcG9uZW50XG4gKiAgIEwtPj5MOiBuZ09uSW5pdCgpXG4gKiAgIEwtPj5EOiBSZXF1ZXN0IGluaXRpYWwgZGF0YVxuICogICBELS0+Pkw6IFJldHVybiBkYXRhXG4gKiAgIEwtPj5MOiBQcm9jZXNzIGFuZCBkaXNwbGF5IGRhdGFcbiAqXG4gKiAgIGFsdCBVc2VyIHNjcm9sbHMgKEluZmluaXRlIG1vZGUpXG4gKiAgICAgVS0+Pkw6IFNjcm9sbCB0byBib3R0b21cbiAqICAgICBMLT4+RDogUmVxdWVzdCBtb3JlIGRhdGFcbiAqICAgICBELS0+Pkw6IFJldHVybiBhZGRpdGlvbmFsIGRhdGFcbiAqICAgICBMLT4+TDogQXBwZW5kIHRvIGV4aXN0aW5nIGRhdGFcbiAqICAgZWxzZSBVc2VyIGNoYW5nZXMgcGFnZSAoUGFnaW5hdGVkIG1vZGUpXG4gKiAgICAgVS0+Pkw6IENsaWNrIHBhZ2UgbnVtYmVyXG4gKiAgICAgTC0+Pkw6IGhhbmRsZVBhZ2luYXRlKClcbiAqICAgICBMLT4+RDogUmVxdWVzdCBkYXRhIGZvciBwYWdlXG4gKiAgICAgRC0tPj5MOiBSZXR1cm4gcGFnZSBkYXRhXG4gKiAgICAgTC0+Pkw6IFJlcGxhY2UgZGlzcGxheWVkIGRhdGFcbiAqICAgZW5kXG4gKlxuICogICBhbHQgVXNlciBzZWFyY2hlc1xuICogICAgIFUtPj5MOiBFbnRlciBzZWFyY2ggdGVybVxuICogICAgIEwtPj5MOiBoYW5kbGVTZWFyY2goKVxuICogICAgIEwtPj5EOiBGaWx0ZXIgZGF0YSBieSBzZWFyY2ggdGVybVxuICogICAgIEQtLT4+TDogUmV0dXJuIGZpbHRlcmVkIGRhdGFcbiAqICAgICBMLT4+TDogVXBkYXRlIGRpc3BsYXllZCBkYXRhXG4gKiAgIGVuZFxuICpcbiAqICAgYWx0IFVzZXIgY2xpY2tzIGl0ZW1cbiAqICAgICBVLT4+TDogQ2xpY2sgbGlzdCBpdGVtXG4gKiAgICAgTC0+Pkw6IGhhbmRsZUNsaWNrKClcbiAqICAgICBMLT4+RTogRW1pdCBjbGlja0V2ZW50XG4gKiAgIGVuZFxuICpcbiAqIEBleGFtcGxlXG4gKiA8bmd4LWRlY2FmLWxpc3RcbiAqICAgW3NvdXJjZV09XCJkYXRhU291cmNlXCJcbiAqICAgW2xpbWl0XT1cIjEwXCJcbiAqICAgW3R5cGVdPVwiJ2luZmluaXRlJ1wiXG4gKiAgIFtzaG93U2VhcmNoYmFyXT1cInRydWVcIlxuICogICAoY2xpY2tFdmVudCk9XCJoYW5kbGVJdGVtQ2xpY2soJGV2ZW50KVwiXG4gKiAgIChyZWZyZXNoRXZlbnQpPVwiaGFuZGxlUmVmcmVzaCgkZXZlbnQpXCI+XG4gKiA8L25neC1kZWNhZi1saXN0PlxuICpcbiAqIEBleHRlbmRzIHtOZ3hCYXNlQ29tcG9uZW50fVxuICogQGltcGxlbWVudHMge09uSW5pdH1cbiAqL1xuQER5bmFtaWMoKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWRlY2FmLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIElvblJlZnJlc2hlcixcbiAgICBJb25Mb2FkaW5nLFxuICAgIFBhZ2luYXRpb25Db21wb25lbnQsXG4gICAgSW9uTGlzdCxcbiAgICBJb25JdGVtLFxuICAgIElvblRodW1ibmFpbCxcbiAgICBJb25Ta2VsZXRvblRleHQsXG4gICAgSW9uTGFiZWwsXG4gICAgSW9uVGV4dCxcbiAgICBJb25SZWZyZXNoZXJDb250ZW50LFxuICAgIElvbkluZmluaXRlU2Nyb2xsLFxuICAgIElvbkluZmluaXRlU2Nyb2xsQ29udGVudCxcbiAgICBJb25UaHVtYm5haWwsXG4gICAgSW9uU2tlbGV0b25UZXh0LFxuICAgIFNlYXJjaGJhckNvbXBvbmVudCxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIExpc3RJdGVtQ29tcG9uZW50LFxuICAgIEZpbHRlckNvbXBvbmVudCxcbiAgICBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpc3RDb21wb25lbnQgZXh0ZW5kcyBOZ3hCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGRpc3BsYXkgbW9kZSBmb3IgdGhlIGxpc3QgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGhvdyB0aGUgbGlzdCBkYXRhIGlzIGxvYWRlZCBhbmQgZGlzcGxheWVkLiBPcHRpb25zIGluY2x1ZGU6XG4gICAqIC0gSU5GSU5JVEU6IExvYWRzIG1vcmUgZGF0YSBhcyB0aGUgdXNlciBzY3JvbGxzIChpbmZpbml0ZSBzY3JvbGxpbmcpXG4gICAqIC0gUEFHSU5BVEVEOiBEaXNwbGF5cyBkYXRhIGluIHBhZ2VzIHdpdGggbmF2aWdhdGlvbiBjb250cm9sc1xuICAgKlxuICAgKiBAdHlwZSB7TGlzdENvbXBvbmVudHNUeXBlc31cbiAgICogQGRlZmF1bHQgTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdHlwZTogTGlzdENvbXBvbmVudHNUeXBlcyA9IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHRoZSBjb21wb25lbnQgdXNlcyB0cmFuc2xhdGlvbiBzZXJ2aWNlcy5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGNvbXBvbmVudCB3aWxsIGF0dGVtcHQgdG8gdXNlIHRyYW5zbGF0aW9uIHNlcnZpY2VzXG4gICAqIGZvciBhbnkgdGV4dCBjb250ZW50LiBUaGlzIGFsbG93cyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gb2YgdGhlIGxpc3QgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSB0cmFuc2xhdGFibGU6IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgc2VhcmNoIGJhci5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZGlzcGxheXMgYSBzZWFyY2ggYmFyIGF0IHRoZSB0b3Agb2YgdGhlIGxpc3QgdGhhdCBhbGxvd3NcbiAgICogdXNlcnMgdG8gZmlsdGVyIHRoZSBsaXN0IGl0ZW1zLiBUaGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgd29ya3MgYnkgZmlsdGVyaW5nIHRoZVxuICAgKiBleGlzdGluZyBkYXRhIG9yIGJ5IHRyaWdnZXJpbmcgYSBuZXcgZGF0YSBmZXRjaCB3aXRoIHNlYXJjaCBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzaG93U2VhcmNoYmFyOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGlyZWN0IGRhdGEgaW5wdXQgZm9yIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSB3YXkgdG8gZGlyZWN0bHkgcGFzcyBkYXRhIHRvIHRoZSBsaXN0IGNvbXBvbmVudCBpbnN0ZWFkIG9mXG4gICAqIGZldGNoaW5nIGl0IGZyb20gYSBzb3VyY2UuIFdoZW4gYm90aCBkYXRhIGFuZCBzb3VyY2UgYXJlIHByb3ZpZGVkLCB0aGUgY29tcG9uZW50XG4gICAqIHdpbGwgdXNlIHRoZSBzb3VyY2UgdG8gZmV0Y2ggZGF0YSBvbmx5IGlmIHRoZSBkYXRhIGFycmF5IGlzIGVtcHR5LlxuICAgKlxuICAgKiBAdHlwZSB7S2V5VmFsdWVbXSB8IHVuZGVmaW5lZH1cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBkYXRhPzogS2V5VmFsdWVbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIGxpc3QgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hlcmUgdGhlIGxpc3Qgc2hvdWxkIGZldGNoIGl0cyBkYXRhIGZyb20uIFRoaXMgY2FuIGJlIGVpdGhlcjpcbiAgICogLSBBIHN0cmluZyBVUkwgb3IgZW5kcG9pbnQgaWRlbnRpZmllclxuICAgKiAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGRhdGEgd2hlbiBjYWxsZWRcbiAgICogVGhlIGNvbXBvbmVudCB3aWxsIGNhbGwgdGhpcyBzb3VyY2Ugd2hlbiBpdCBuZWVkcyB0byBsb2FkIG9yIHJlZnJlc2ggZGF0YS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IEZ1bmN0aW9uTGlrZX1cbiAgICogQHJlcXVpcmVkXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzb3VyY2UhOiBzdHJpbmcgfCBGdW5jdGlvbkxpa2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc3RhcnRpbmcgaW5kZXggZm9yIGRhdGEgZmV0Y2hpbmcuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgaW5kZXggZnJvbSB3aGljaCB0byBzdGFydCBmZXRjaGluZyBkYXRhLiBUaGlzIGlzIHVzZWRcbiAgICogZm9yIHBhZ2luYXRpb24gYW5kIGluZmluaXRlIHNjcm9sbGluZyB0byBkZXRlcm1pbmUgd2hpY2ggc3Vic2V0IG9mIGRhdGEgdG8gbG9hZC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc3RhcnQ6IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGZldGNoIHBlciBwYWdlIG9yIGxvYWQgb3BlcmF0aW9uLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGhvdyBtYW55IGl0ZW1zIGFyZSBsb2FkZWQgYXQgb25jZSBkdXJpbmcgcGFnaW5hdGlvbiBvclxuICAgKiBpbmZpbml0ZSBzY3JvbGxpbmcuIFRoaXMgYWZmZWN0cyB0aGUgc2l6ZSBvZiBkYXRhIGNodW5rcyByZXF1ZXN0ZWQgZnJvbSB0aGUgc291cmNlLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAxMFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbGltaXQ6IG51bWJlciA9IDEwO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciBtb3JlIGRhdGEgY2FuIGJlIGxvYWRlZC5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGNvbXBvbmVudCB3aWxsIGFsbG93IGxvYWRpbmcgYWRkaXRpb25hbCBkYXRhXG4gICAqIHRocm91Z2ggaW5maW5pdGUgc2Nyb2xsaW5nIG9yIHBhZ2luYXRpb24uIFdoZW4gZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBub3RcbiAgICogYXR0ZW1wdCB0byBsb2FkIG1vcmUgZGF0YSBiZXlvbmQgd2hhdCBpcyBpbml0aWFsbHkgZGlzcGxheWVkLlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsb2FkTW9yZURhdGE6IFN0cmluZ09yQm9vbGVhbiA9IHRydWVcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzdHlsZSBvZiBkaXZpZGluZyBsaW5lcyBiZXR3ZWVuIGxpc3QgaXRlbXMuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaG93IGRpdmlkaW5nIGxpbmVzIGFwcGVhciBiZXR3ZWVuIGxpc3QgaXRlbXMuIE9wdGlvbnMgaW5jbHVkZTpcbiAgICogLSBcImluc2V0XCI6IExpbmVzIGFyZSBpbnNldCBmcm9tIHRoZSBlZGdlc1xuICAgKiAtIFwiZnVsbFwiOiBMaW5lcyBleHRlbmQgdGhlIGZ1bGwgd2lkdGhcbiAgICogLSBcIm5vbmVcIjogTm8gZGl2aWRpbmcgbGluZXNcbiAgICpcbiAgICogQHR5cGUge1wiaW5zZXRcIiB8IFwiZnVsbFwiIHwgXCJub25lXCJ9XG4gICAqIEBkZWZhdWx0IFwiZnVsbFwiXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsaW5lczogXCJpbnNldFwiIHwgXCJmdWxsXCIgfCBcIm5vbmVcIiA9IFwiZnVsbFwiO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgbGlzdCBoYXMgaW5zZXQgc3R5bGluZy5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGxpc3Qgd2lsbCBoYXZlIGluc2V0IHN0eWxpbmcgd2l0aCByb3VuZGVkIGNvcm5lcnNcbiAgICogYW5kIG1hcmdpbiBhcm91bmQgdGhlIGVkZ2VzLiBUaGlzIGNyZWF0ZXMgYSBjYXJkLWxpa2UgYXBwZWFyYW5jZSBmb3IgdGhlIGxpc3QuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBpbnNldDogU3RyaW5nT3JCb29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdGhyZXNob2xkIGZvciB0cmlnZ2VyaW5nIGluZmluaXRlIHNjcm9sbCBsb2FkaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IGNsb3NlIHRvIHRoZSBib3R0b20gb2YgdGhlIGxpc3QgdGhlIHVzZXIgbXVzdCBzY3JvbGxcbiAgICogYmVmb3JlIHRoZSBjb21wb25lbnQgdHJpZ2dlcnMgbG9hZGluZyBvZiBhZGRpdGlvbmFsIGRhdGEuIFRoaXMgaXMgZXhwcmVzc2VkXG4gICAqIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgbGlzdCBoZWlnaHQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0IFwiMTUlXCJcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNjcm9sbFRocmVzaG9sZDogc3RyaW5nID0gXCIxNSVcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwb3NpdGlvbiB3aGVyZSBuZXcgaXRlbXMgYXJlIGFkZGVkIGR1cmluZyBpbmZpbml0ZSBzY3JvbGxpbmcuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciBuZXcgaXRlbXMgYXJlIGFkZGVkIHRvIHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBsaXN0XG4gICAqIHdoZW4gbG9hZGluZyBtb3JlIGRhdGEgdGhyb3VnaCBpbmZpbml0ZSBzY3JvbGxpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtcImJvdHRvbVwiIHwgXCJ0b3BcIn1cbiAgICogQGRlZmF1bHQgXCJib3R0b21cIlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc2Nyb2xsUG9zaXRpb246IFwiYm90dG9tXCIgfCBcInRvcFwiID0gXCJib3R0b21cIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1c3RvbSB0ZXh0IHRvIGRpc3BsYXkgZHVyaW5nIGxvYWRpbmcgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSB0ZXh0IHNob3duIGluIHRoZSBsb2FkaW5nIGluZGljYXRvciB3aGVuIHRoZSBjb21wb25lbnRcbiAgICogaXMgZmV0Y2hpbmcgZGF0YS4gSWYgbm90IHByb3ZpZGVkLCBhIGRlZmF1bHQgbG9hZGluZyBtZXNzYWdlIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmdUZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHB1bGwtdG8tcmVmcmVzaCBmZWF0dXJlLlxuICAgKiBAc3VtbWFyeSBXaGVuIHNldCB0byB0cnVlLCBlbmFibGVzIHRoZSBwdWxsLXRvLXJlZnJlc2ggZnVuY3Rpb25hbGl0eSB0aGF0IGFsbG93c1xuICAgKiB1c2VycyB0byByZWZyZXNoIHRoZSBsaXN0IGRhdGEgYnkgcHVsbGluZyBkb3duIGZyb20gdGhlIHRvcCBvZiB0aGUgbGlzdC5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc2hvd1JlZnJlc2hlcjogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0eXBlIG9mIHNwaW5uZXIgdG8gZGlzcGxheSBkdXJpbmcgbG9hZGluZyBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHZpc3VhbCBzdHlsZSBvZiB0aGUgbG9hZGluZyBzcGlubmVyIHNob3duIGR1cmluZyBkYXRhXG4gICAqIGZldGNoaW5nIG9wZXJhdGlvbnMuIFVzZXMgSW9uaWMncyBwcmVkZWZpbmVkIHNwaW5uZXIgdHlwZXMuXG4gICAqXG4gICAqIEB0eXBlIHtTcGlubmVyVHlwZXN9XG4gICAqIEBkZWZhdWx0IFwiY2lyY3VsYXJcIlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbG9hZGluZ1NwaW5uZXI6IFNwaW5uZXJUeXBlcyA9IFwiY2lyY3VsYXJcIjtcblxuICAvLyAvKipcbiAgLy8gICogQGRlc2NyaXB0aW9uIFF1ZXJ5IHBhcmFtZXRlcnMgZm9yIGRhdGEgZmV0Y2hpbmcuXG4gIC8vICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBhZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgZGF0YSBmcm9tXG4gIC8vICAqIHRoZSBzb3VyY2UuIFRoaXMgY2FuIGJlIHByb3ZpZGVkIGFzIGEgc3RyaW5nIChKU09OKSBvciBhIGRpcmVjdCBvYmplY3QuXG4gIC8vICAqXG4gIC8vICAqIEB0eXBlIHtzdHJpbmcgfCBLZXlWYWx1ZSB8IHVuZGVmaW5lZH1cbiAgLy8gICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgLy8gICovXG4gIC8vIEBJbnB1dCgpXG4gIC8vIHF1ZXJ5Pzogc3RyaW5nIHwgS2V5VmFsdWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHRoZSBmaWx0ZXJpbmcgZnVuY3Rpb25hbGl0eSBpcyBlbmFibGVkLlxuICAgKiBAc3VtbWFyeSBXaGVuIHNldCB0byB0cnVlLCBlbmFibGVzIHRoZSBmaWx0ZXIgY29tcG9uZW50IHRoYXQgYWxsb3dzIHVzZXJzIHRvIGNyZWF0ZVxuICAgKiBjb21wbGV4IHNlYXJjaCBjcml0ZXJpYSB3aXRoIG11bHRpcGxlIGZpZWxkIGZpbHRlcnMsIGNvbmRpdGlvbnMsIGFuZCB2YWx1ZXMuXG4gICAqIFdoZW4gZmFsc2UsIGRpc2FibGVzIHRoZSBmaWx0ZXIgaW50ZXJmYWNlIGVudGlyZWx5LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBlbmFibGVGaWx0ZXI6IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTb3J0aW5nIHBhcmFtZXRlcnMgZm9yIGRhdGEgZmV0Y2hpbmcuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgdGhlIGZldGNoZWQgZGF0YSBzaG91bGQgYmUgc29ydGVkLiBUaGlzIGNhbiBiZSBwcm92aWRlZFxuICAgKiBhcyBhIHN0cmluZyAoZmllbGQgbmFtZSB3aXRoIG9wdGlvbmFsIGRpcmVjdGlvbikgb3IgYSBkaXJlY3Qgb2JqZWN0LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgS2V5VmFsdWUgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzb3J0RGlyZWN0aW9uOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkRTQztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU29ydGluZyBwYXJhbWV0ZXJzIGZvciBkYXRhIGZldGNoaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IHRoZSBmZXRjaGVkIGRhdGEgc2hvdWxkIGJlIHNvcnRlZC4gVGhpcyBjYW4gYmUgcHJvdmlkZWRcbiAgICogYXMgYSBzdHJpbmcgKGZpZWxkIG5hbWUgd2l0aCBvcHRpb25hbCBkaXJlY3Rpb24pIG9yIGEgZGlyZWN0IG9iamVjdC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IEtleVZhbHVlIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc29ydEJ5ITogc3RyaW5nO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHNvcnRpbmcgZnVuY3Rpb25hbGl0eSBpcyBkaXNhYmxlZC5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgdGhlIHNvcnQgY29udHJvbHMgYW5kIHByZXZlbnRzIHVzZXJzIGZyb21cbiAgICogY2hhbmdpbmcgdGhlIHNvcnQgb3JkZXIgb3IgZmllbGQuIFRoZSBsaXN0IHdpbGwgbWFpbnRhaW4gaXRzIGRlZmF1bHQgb3JcbiAgICogcHJvZ3JhbW1hdGljYWxseSBzZXQgc29ydCBjb25maWd1cmF0aW9uIHdpdGhvdXQgdXNlciBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGRpc2FibGVTb3J0OiBTdHJpbmdPckJvb2xlYW4gPSBmYWxzZTtcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSWNvbiB0byBkaXNwbGF5IHdoZW4gdGhlIGxpc3QgaXMgZW1wdHkuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgaWNvbiBzaG93biBpbiB0aGUgZW1wdHkgc3RhdGUgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICogVGhpcyBjYW4gYmUgYW55IGljb24gbmFtZSBzdXBwb3J0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uJ3MgaWNvbiBzeXN0ZW0uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBkZWZhdWx0ICd0aS1kYXRhYmFzZS1leGNsYW1hdGlvbidcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGVtcHR5SWNvbj86IHN0cmluZyA9ICd0aS1kYXRhYmFzZS1leGNsYW1hdGlvbic7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZvciB0aGUgZW1wdHkgc3RhdGUgZGlzcGxheS5cbiAgICogQHN1bW1hcnkgQ3VzdG9taXplcyBob3cgdGhlIGVtcHR5IHN0YXRlIGlzIGRpc3BsYXllZCB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgKiBUaGlzIGluY2x1ZGVzIHRoZSB0aXRsZSwgc3VidGl0bGUsIGJ1dHRvbiB0ZXh0LCBpY29uLCBhbmQgbmF2aWdhdGlvbiBsaW5rLlxuICAgKlxuICAgKiBAdHlwZSB7UGFydGlhbDxJTGlzdEVtcHR5UmVzdWx0Pn1cbiAgICogQGRlZmF1bHQge1xuICAgKiAgIHRpdGxlOiAnZW1wdHkudGl0bGUnLFxuICAgKiAgIHN1YnRpdGxlOiAnZW1wdHkuc3VidGl0bGUnLFxuICAgKiAgIHNob3dCdXR0b246IGZhbHNlLFxuICAgKiAgIGljb246ICdhbGVydC1jaXJjbGUtb3V0bGluZScsXG4gICAqICAgYnV0dG9uVGV4dDogJ2xvY2FsZS5lbXB0eS5idXR0b24nLFxuICAgKiAgIGxpbms6ICcnXG4gICAqIH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGVtcHR5OiBQYXJ0aWFsPElMaXN0RW1wdHlSZXN1bHQ+ID0ge1xuICAgIHRpdGxlOiAnZW1wdHkudGl0bGUnLFxuICAgIHN1YnRpdGxlOiAnZW1wdHkuc3VidGl0bGUnLFxuICAgIHNob3dCdXR0b246IGZhbHNlLFxuICAgIGljb246ICdhbGVydC1jaXJjbGUtb3V0bGluZScsXG4gICAgYnV0dG9uVGV4dDogJ2xvY2FsZS5lbXB0eS5idXR0b24nLFxuICAgIGxpbms6ICcnXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50IHBhZ2UgbnVtYmVyIGluIHBhZ2luYXRlZCBtb2RlLlxuICAgKiBAc3VtbWFyeSBUcmFja3Mgd2hpY2ggcGFnZSBpcyBjdXJyZW50bHkgYmVpbmcgZGlzcGxheWVkIHdoZW4gdGhlIGNvbXBvbmVudFxuICAgKiBpcyBpbiBwYWdpbmF0ZWQgbW9kZS4gVGhpcyBpcyB1c2VkIGZvciBwYWdpbmF0aW9uIGNvbnRyb2xzIGFuZCBkYXRhIGZldGNoaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAxXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwYWdlOiBudW1iZXIgPSAxO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBhdmFpbGFibGUuXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY2FsY3VsYXRlZCB0b3RhbCBudW1iZXIgb2YgcGFnZXMgYmFzZWQgb24gdGhlIGRhdGEgc2l6ZVxuICAgKiBhbmQgbGltaXQuIFRoaXMgaXMgdXNlZCBmb3IgcGFnaW5hdGlvbiBjb250cm9scyBhbmQgYm91bmRhcnkgY2hlY2tpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwYWdlcyE6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB3aGV0aGVyIGEgcmVmcmVzaCBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuXG4gICAqIEBzdW1tYXJ5IFdoZW4gdHJ1ZSwgdGhlIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgZmV0Y2hpbmcgbmV3IGRhdGEuIFRoaXMgaXMgdXNlZFxuICAgKiB0byBjb250cm9sIGxvYWRpbmcgaW5kaWNhdG9ycyBhbmQgcHJldmVudCBkdXBsaWNhdGUgcmVmcmVzaCBvcGVyYXRpb25zIGZyb21cbiAgICogYmVpbmcgdHJpZ2dlcmVkIHNpbXVsdGFuZW91c2x5LlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHJlZnJlc2hpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFycmF5IHVzZWQgZm9yIHJlbmRlcmluZyBza2VsZXRvbiBsb2FkaW5nIHBsYWNlaG9sZGVycy5cbiAgICogQHN1bW1hcnkgQ29udGFpbnMgcGxhY2Vob2xkZXIgaXRlbXMgdGhhdCBhcmUgZGlzcGxheWVkIGR1cmluZyBkYXRhIGxvYWRpbmcuXG4gICAqIFRoZSBsZW5ndGggb2YgdGhpcyBhcnJheSBkZXRlcm1pbmVzIGhvdyBtYW55IHNrZWxldG9uIGl0ZW1zIGFyZSBzaG93bi5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ1tdfVxuICAgKiBAZGVmYXVsdCBuZXcgQXJyYXkoMilcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHNrZWxldG9uRGF0YTogc3RyaW5nW10gPSBuZXcgQXJyYXkoMik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcHJvY2Vzc2VkIGxpc3QgaXRlbXMgcmVhZHkgZm9yIGRpc3BsYXkuXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBzZXQgb2YgaXRlbXMgYmVpbmcgZGlzcGxheWVkIGluIHRoZSBsaXN0IGFmdGVyXG4gICAqIHByb2Nlc3NpbmcgZnJvbSB0aGUgcmF3IGRhdGEgc291cmNlLiBUaGlzIG1heSBiZSBhIHN1YnNldCBvZiB0aGUgZnVsbCBkYXRhXG4gICAqIHdoZW4gdXNpbmcgcGFnaW5hdGlvbiBvciBpbmZpbml0ZSBzY3JvbGxpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtLZXlWYWx1ZVtdfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgaXRlbXMhOiBLZXlWYWx1ZVtdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGN1cnJlbnQgc2VhcmNoIHF1ZXJ5IHZhbHVlLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGUgc2VhcmNoIGJhci4gVGhpcyBpcyB1c2VkIHRvIGZpbHRlclxuICAgKiB0aGUgbGlzdCBkYXRhIG9yIHRvIHNlbmQgYXMgYSBzZWFyY2ggcGFyYW1ldGVyIHdoZW4gZmV0Y2hpbmcgbmV3IGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBzZWFyY2hWYWx1ZT86IHN0cmluZyB8IElGaWx0ZXJRdWVyeSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEEgcGFnaW5hdG9yIG9iamVjdCBmb3IgaGFuZGxpbmcgcGFnaW5hdGlvbiBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHBhZ2luYXRvciBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbmQgbmF2aWdhdGVcbiAgICogdGhyb3VnaCBkYXRhIGluIGNodW5rcywgcmVkdWNpbmcgbWVtb3J5IHVzYWdlIGFuZCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UuXG4gICAqXG4gICAqIFRoZSBwYWdpbmF0b3Igb2JqZWN0IGlzIGluaXRpYWxpemVkIGluIHRoZSBgbmdPbkluaXRgIGxpZmVjeWNsZSBob29rIGFuZCBpc1xuICAgKiB1c2VkIHRvIGZldGNoIGFuZCBkaXNwbGF5IGRhdGEgaW4gdGhlIHBhZ2luYXRpb24gY29tcG9uZW50LiBJdCBpcyBhbiBpbnN0YW5jZVxuICAgKiBvZiB0aGUgYFBhZ2luYXRvcmAgY2xhc3MgZnJvbSB0aGUgYEBkZWNhZi10cy9jb3JlYCBwYWNrYWdlLCB3aGljaCBwcm92aWRlc1xuICAgKiBtZXRob2RzIGZvciBxdWVyeWluZyBhbmQgbWFuaXB1bGF0aW5nIHBhZ2luYXRlZCBkYXRhLlxuICAgKlxuICAgKiBAdHlwZSB7UGFnaW5hdG9yPE1vZGVsPn1cbiAgICogQG1lbWJlck9mIFBhZ2luYXRpb25Db21wb25lbnRcbiAgICovXG4gIHBhZ2luYXRvciE6IFBhZ2luYXRvcjxNb2RlbD4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbGFzdCBwYWdlIG51bWJlciB0aGF0IHdhcyBkaXNwbGF5ZWQuXG4gICAqIEBzdW1tYXJ5IEtlZXBzIHRyYWNrIG9mIHRoZSBwcmV2aW91c2x5IGRpc3BsYXllZCBwYWdlIG51bWJlciwgd2hpY2ggaXMgdXNlZnVsXG4gICAqIGZvciBoYW5kbGluZyBuYXZpZ2F0aW9uIGFuZCBzZWFyY2ggb3BlcmF0aW9ucyBpbiBwYWdpbmF0ZWQgbW9kZS5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgbGFzdFBhZ2U6IG51bWJlciA9IDFcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGVtaXR0ZXIgZm9yIHJlZnJlc2ggb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgbGlzdCBkYXRhIGlzIHJlZnJlc2hlZCwgZWl0aGVyIHRocm91Z2ggcHVsbC10by1yZWZyZXNoXG4gICAqIG9yIHByb2dyYW1tYXRpYyByZWZyZXNoLiBUaGUgZXZlbnQgaW5jbHVkZXMgdGhlIHJlZnJlc2hlZCBkYXRhIGFuZCBjb21wb25lbnQgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8QmFzZUN1c3RvbUV2ZW50Pn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKVxuICByZWZyZXNoRXZlbnQ6IEV2ZW50RW1pdHRlcjxCYXNlQ3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxCYXNlQ3VzdG9tRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciBpdGVtIGNsaWNrIGludGVyYWN0aW9ucy5cbiAgICogQHN1bW1hcnkgRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGxpc3QgaXRlbSBpcyBjbGlja2VkLiBUaGUgZXZlbnQgaW5jbHVkZXMgdGhlIGRhdGFcbiAgICogb2YgdGhlIGNsaWNrZWQgaXRlbSwgYWxsb3dpbmcgcGFyZW50IGNvbXBvbmVudHMgdG8gcmVzcG9uZCB0byB0aGUgaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8S2V5VmFsdWU+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIGNsaWNrRXZlbnQ6ICBFdmVudEVtaXR0ZXI8TGlzdEl0ZW1DdXN0b21FdmVudHxSZW5kZXJlckN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8TGlzdEl0ZW1DdXN0b21FdmVudHxSZW5kZXJlckN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3ViamVjdCBmb3IgZGVib3VuY2luZyBjbGljayBldmVudHMuXG4gICAqIEBzdW1tYXJ5IFVzZXMgUnhKUyBTdWJqZWN0IHRvIGNvbGxlY3QgY2xpY2sgZXZlbnRzIGFuZCBlbWl0IHRoZW0gYWZ0ZXIgYSBkZWJvdW5jZVxuICAgKiBwZXJpb2QuIFRoaXMgcHJldmVudHMgbXVsdGlwbGUgcmFwaWQgY2xpY2tzIGZyb20gdHJpZ2dlcmluZyBtdWx0aXBsZSBldmVudHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtTdWJqZWN0PEN1c3RvbUV2ZW50IHwgTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBjbGlja0l0ZW1TdWJqZWN0OiBTdWJqZWN0PEN1c3RvbUV2ZW50IHwgTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQ+ID0gbmV3IFN1YmplY3Q8Q3VzdG9tRXZlbnQgfCBMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudD4oKTtcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3ViamVjdCBmb3IgZGVib3VuY2luZyByZXBvc2l0b3J5IG9ic2VydmF0aW9uIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgUnhKUyBTdWJqZWN0IHRoYXQgY29sbGVjdHMgcmVwb3NpdG9yeSBjaGFuZ2UgZXZlbnRzIGFuZCBlbWl0cyB0aGVtIGFmdGVyXG4gICAqIGEgZGVib3VuY2UgcGVyaW9kLiBUaGlzIHByZXZlbnRzIG11bHRpcGxlIHJhcGlkIHJlcG9zaXRvcnkgY2hhbmdlcyBmcm9tIHRyaWdnZXJpbmdcbiAgICogbXVsdGlwbGUgbGlzdCByZWZyZXNoIG9wZXJhdGlvbnMsIGltcHJvdmluZyBwZXJmb3JtYW5jZSBhbmQgdXNlciBleHBlcmllbmNlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7U3ViamVjdDxhbnk+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBvYnNlcnZlclN1YmpldDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT2JzZXJ2ZXIgb2JqZWN0IGZvciByZXBvc2l0b3J5IGNoYW5nZSBub3RpZmljYXRpb25zLlxuICAgKiBAc3VtbWFyeSBJbXBsZW1lbnRzIHRoZSBPYnNlcnZlciBpbnRlcmZhY2UgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gdGhlXG4gICAqIHVuZGVybHlpbmcgZGF0YSByZXBvc2l0b3J5IGNoYW5nZXMuIFRoaXMgZW5hYmxlcyBhdXRvbWF0aWMgbGlzdCB1cGRhdGVzIHdoZW5cbiAgICogZGF0YSBpcyBjcmVhdGVkLCB1cGRhdGVkLCBvciBkZWxldGVkIHRocm91Z2ggdGhlIHJlcG9zaXRvcnkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtPYnNlcnZlcn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgb2JzZXJ2ZXI6IE9ic2VydmVyID0geyByZWZyZXNoOiBhc3luYyAoLi4uIGFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dm9pZD4gPT4gdGhpcy5vYnNlcnZlUmVwb3NpdG9yeSguLi5hcmdzKX1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3Qgb2YgYXZhaWxhYmxlIGluZGV4ZXMgZm9yIGRhdGEgcXVlcnlpbmcgYW5kIGZpbHRlcmluZy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBsaXN0IG9mIGluZGV4IG5hbWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3B0aW1pemUgZGF0YSBxdWVyeWluZyBhbmQgZmlsdGVyaW5nXG4gICAqIG9wZXJhdGlvbnMsIGVzcGVjaWFsbHkgaW4gc2NlbmFyaW9zIHdpdGggbGFyZ2UgZGF0YXNldHMuXG4gICAqXG4gICAqIEluZGV4ZXMgY2FuIHNpZ25pZmljYW50bHkgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgZGF0YSByZXRyaWV2YWwgYnkgYWxsb3dpbmcgdGhlIGRhdGFiYXNlXG4gICAqIHRvIHF1aWNrbHkgbG9jYXRlIGFuZCByZXRyaWV2ZSByZWxldmFudCBkYXRhIGJhc2VkIG9uIGluZGV4ZWQgZmllbGRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nW119XG4gICAqIEBkZWZhdWx0IFtdXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBpbmRleGVzITogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgTGlzdENvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBMaXN0Q29tcG9uZW50IGFuZCBzZXRzIHVwIHRoZSBiYXNlIGNvbXBvbmVudCB3aXRoIHRoZSBhcHByb3ByaWF0ZVxuICAgKiBjb21wb25lbnQgbmFtZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgd2hlbiBBbmd1bGFyIGluc3RhbnRpYXRlcyB0aGUgY29tcG9uZW50IGFuZFxuICAgKiBiZWZvcmUgYW55IGlucHV0IHByb3BlcnRpZXMgYXJlIHNldC4gSXQgcGFzc2VzIHRoZSBjb21wb25lbnQgbmFtZSB0byB0aGUgcGFyZW50IGNsYXNzXG4gICAqIGNvbnN0cnVjdG9yIHRvIGVuYWJsZSBwcm9wZXIgbG9jYWxpemF0aW9uIGFuZCBjb21wb25lbnQgaWRlbnRpZmljYXRpb24uXG4gICAqXG4gICAqIFRoZSBjb25zdHJ1Y3RvciBpcyBpbnRlbnRpb25hbGx5IG1pbmltYWwsIHdpdGggbW9zdCBpbml0aWFsaXphdGlvbiBsb2dpYyBkZWZlcnJlZCB0b1xuICAgKiB0aGUgbmdPbkluaXQgbGlmZWN5Y2xlIGhvb2suIFRoaXMgZm9sbG93cyBBbmd1bGFyIGJlc3QgcHJhY3RpY2VzIGJ5IGtlZXBpbmcgdGhlIGNvbnN0cnVjdG9yXG4gICAqIGZvY3VzZWQgb24gZGVwZW5kZW5jeSBpbmplY3Rpb24gYW5kIGJhc2ljIHNldHVwLCB3aGlsZSBjb21wbGV4IGluaXRpYWxpemF0aW9uIHRoYXQgZGVwZW5kc1xuICAgKiBvbiBpbnB1dCBwcm9wZXJ0aWVzIGlzIGhhbmRsZWQgaW4gbmdPbkluaXQuXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIkxpc3RDb21wb25lbnRcIik7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCBhZnRlciBBbmd1bGFyIHNldHMgdGhlIGlucHV0IHByb3BlcnRpZXMuXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgdGhlIGNvbXBvbmVudCBieSBpbml0aWFsaXppbmcgZXZlbnQgc3Vic2NyaXB0aW9ucywgcHJvY2Vzc2luZyBib29sZWFuXG4gICAqIGlucHV0cywgYW5kIGxvYWRpbmcgdGhlIGluaXRpYWwgZGF0YS4gVGhpcyBtZXRob2QgcHJlcGFyZXMgdGhlIGNvbXBvbmVudCBmb3IgdXNlclxuICAgKiBpbnRlcmFjdGlvbiBieSBlbnN1cmluZyBhbGwgcHJvcGVydGllcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYW5kIGRhdGEgaXMgbG9hZGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBbmd1bGFyIExpZmVjeWNsZVxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTGlzdENvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgRGF0YSBTb3VyY2VcbiAgICpcbiAgICogICBBLT4+TDogbmdPbkluaXQoKVxuICAgKiAgIEwtPj5MOiBTZXQgdXAgY2xpY2sgZXZlbnQgZGVib3VuY2luZ1xuICAgKiAgIEwtPj5MOiBQcm9jZXNzIGJvb2xlYW4gaW5wdXRzXG4gICAqICAgTC0+Pkw6IENvbmZpZ3VyZSBjb21wb25lbnQgYmFzZWQgb24gaW5wdXRzXG4gICAqICAgTC0+Pkw6IHJlZnJlc2goKVxuICAgKiAgIEwtPj5EOiBSZXF1ZXN0IGluaXRpYWwgZGF0YVxuICAgKiAgIEQtLT4+TDogUmV0dXJuIGRhdGFcbiAgICogICBMLT4+TDogUHJvY2VzcyBhbmQgZGlzcGxheSBkYXRhXG4gICAqICAgTC0+Pkw6IENvbmZpZ3VyZSBlbXB0eSBzdGF0ZSBpZiBuZWVkZWRcbiAgICogICBMLT4+TDogaW5pdGlhbGl6ZSgpXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsaWNrSXRlbVN1YmplY3QucGlwZShkZWJvdW5jZVRpbWUoMTAwKSkuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuY2xpY2tFdmVudEVtaXQoZXZlbnQgYXMgTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQpKTtcbiAgICB0aGlzLm9ic2VydmVyU3ViamV0LnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLnN1YnNjcmliZShhcmdzID0+IHRoaXMuaGFuZGxlT2JzZXJ2ZUV2ZW50KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pKTtcbiAgICB0aGlzLmVuYWJsZUZpbHRlciA9IHN0cmluZ1RvQm9vbGVhbih0aGlzLmVuYWJsZUZpbHRlcik7XG4gICAgdGhpcy5saW1pdCA9IE51bWJlcih0aGlzLmxpbWl0KTtcbiAgICB0aGlzLnN0YXJ0ID0gTnVtYmVyKHRoaXMuc3RhcnQpO1xuICAgIHRoaXMuaW5zZXQgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5pbnNldCk7XG4gICAgdGhpcy5zaG93UmVmcmVzaGVyID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuc2hvd1JlZnJlc2hlcik7XG4gICAgdGhpcy5sb2FkTW9yZURhdGEgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5sb2FkTW9yZURhdGEpO1xuICAgIHRoaXMuc2hvd1NlYXJjaGJhciA9IHN0cmluZ1RvQm9vbGVhbih0aGlzLnNob3dTZWFyY2hiYXIpO1xuICAgIHRoaXMuZGlzYWJsZVNvcnQgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5kaXNhYmxlU29ydCk7XG4gICAgaWYodHlwZW9mIHRoaXMuaXRlbT8uWyd0YWcnXSA9PT0gJ2Jvb2xlYW4nICYmIHRoaXMuaXRlbT8uWyd0YWcnXSA9PT0gdHJ1ZSlcbiAgICAgIHRoaXMuaXRlbVsndGFnJ10gPSBDb21wb25lbnRzVGFnTmFtZXMuTElTVF9JVEVNIGFzIHN0cmluZztcblxuICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuXG4gICAgaWYodGhpcy5vcGVyYXRpb25zLmluY2x1ZGVzKE9wZXJhdGlvbktleXMuQ1JFQVRFKSAmJiB0aGlzLnJvdXRlKVxuICAgICAgdGhpcy5lbXB0eS5saW5rID0gYCR7dGhpcy5yb3V0ZX0vJHtPcGVyYXRpb25LZXlzLkNSRUFURX1gO1xuXG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG5cbiAgICBpZih0aGlzLm1vZGVsIGluc3RhbmNlb2YgTW9kZWwgJiYgdGhpcy5fcmVwb3NpdG9yeSlcbiAgICAgIHRoaXMuX3JlcG9zaXRvcnkub2JzZXJ2ZSh0aGlzLm9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xlYW5zIHVwIHJlc291cmNlcyB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLlxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBjbGVhbnVwIG9wZXJhdGlvbnMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgRE9NLlxuICAgKiBUaGlzIGluY2x1ZGVzIGNsZWFyaW5nIHJlZmVyZW5jZXMgdG8gbW9kZWxzIGFuZCBkYXRhIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmKHRoaXMuX3JlcG9zaXRvcnkpXG4gICAgICB0aGlzLl9yZXBvc2l0b3J5LnVuT2JzZXJ2ZSh0aGlzLm9ic2VydmVyKTtcbiAgICB0aGlzLmRhdGEgPSAgdGhpcy5tb2RlbCA9IHRoaXMuX3JlcG9zaXRvcnkgPSB0aGlzLnBhZ2luYXRvciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyByZXBvc2l0b3J5IG9ic2VydmF0aW9uIGV2ZW50cyB3aXRoIGRlYm91bmNpbmcuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyByZXBvc2l0b3J5IGNoYW5nZSBub3RpZmljYXRpb25zIGFuZCByb3V0ZXMgdGhlbSBhcHByb3ByaWF0ZWx5LlxuICAgKiBGb3IgQ1JFQVRFIGV2ZW50cyB3aXRoIGEgVUlELCBoYW5kbGVzIHRoZW0gaW1tZWRpYXRlbHkuIEZvciBvdGhlciBldmVudHMsXG4gICAqIHBhc3NlcyB0aGVtIHRvIHRoZSBkZWJvdW5jZWQgb2JzZXJ2ZXIgc3ViamVjdCB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB1cGRhdGVzLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLnVua25vd25bXX0gYXJncyAtIFRoZSByZXBvc2l0b3J5IGV2ZW50IGFyZ3VtZW50cyBpbmNsdWRpbmcgdGFibGUsIGV2ZW50IHR5cGUsIGFuZCBVSURcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBhc3luYyBvYnNlcnZlUmVwb3NpdG9yeSguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBbdGFibGUsIGV2ZW50LCB1aWRdID0gYXJncztcbiAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUgJiYgISF1aWQpXG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVPYnNlcnZlRXZlbnQodGFibGUgYXMgc3RyaW5nLCBldmVudCwgdWlkIGFzIHN0cmluZyB8IG51bWJlcik7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJTdWJqZXQubmV4dChhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBzcGVjaWZpYyByZXBvc2l0b3J5IGV2ZW50cyBhbmQgdXBkYXRlcyB0aGUgbGlzdCBhY2NvcmRpbmdseS5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIHJlcG9zaXRvcnkgY2hhbmdlIGV2ZW50cyAoQ1JFQVRFLCBVUERBVEUsIERFTEVURSkgYW5kIHBlcmZvcm1zXG4gICAqIHRoZSBhcHByb3ByaWF0ZSBsaXN0IG9wZXJhdGlvbnMuIFRoaXMgaW5jbHVkZXMgYWRkaW5nIG5ldyBpdGVtcywgdXBkYXRpbmcgZXhpc3RpbmdcbiAgICogb25lcywgb3IgcmVtb3ZpbmcgZGVsZXRlZCBpdGVtcyBmcm9tIHRoZSBsaXN0IGRpc3BsYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZS9tb2RlbCBuYW1lIHRoYXQgY2hhbmdlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIChDUkVBVEUsIFVQREFURSwgREVMRVRFKVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdWlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhZmZlY3RlZCBpdGVtXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgaGFuZGxlT2JzZXJ2ZUV2ZW50KHRhYmxlOiBzdHJpbmcsIGV2ZW50OiBPcGVyYXRpb25LZXlzLCB1aWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmKGV2ZW50ID09PSBPcGVyYXRpb25LZXlzLkNSRUFURSkge1xuICAgICAgaWYodWlkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ3JlYXRlKHVpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2godHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKGV2ZW50ID09PSBPcGVyYXRpb25LZXlzLlVQREFURSlcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVVcGRhdGUodWlkKTtcbiAgICAgIGlmKGV2ZW50ID09PSBPcGVyYXRpb25LZXlzLkRFTEVURSlcbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGUodWlkKTtcbiAgICAgIHRoaXMucmVmcmVzaEV2ZW50RW1pdCgpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiBmb3IgdHJhY2tpbmcgaXRlbXMgaW4gdGhlIGxpc3QuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgdHJhY2tpbmcgZnVuY3Rpb24gZm9yIHRoZSBgKm5nRm9yYCBkaXJlY3RpdmUgaW4gdGhlIGNvbXBvbmVudCB0ZW1wbGF0ZS5cbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuZCBjb250cm9sIHRoZSByZW5kZXJpbmcgb2YgaXRlbXMgaW4gdGhlIGxpc3QsXG4gICAqIHByZXZlbnRpbmcgZHVwbGljYXRlIG9yIHVubmVjZXNzYXJ5IHJlbmRlcmluZy5cbiAgICpcbiAgICogVGhlIGB0cmFja0l0ZW1GbmAgZnVuY3Rpb24gdGFrZXMgdHdvIHBhcmFtZXRlcnM6IGBpbmRleGAgKHRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgbGlzdClcbiAgICogYW5kIGBpdGVtYCAodGhlIGFjdHVhbCBpdGVtIGZyb20gdGhlIGxpc3QpLiBJdCByZXR1cm5zIHRoZSB0cmFja2luZyBrZXksIHdoaWNoIGluIHRoaXMgY2FzZVxuICAgKiBpcyB0aGUgdW5pb24gb2YgdGhlIGB1aWRgIG9mIHRoZSBpdGVtIHdpdGggdGhlIG1vZGVsIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgbGlzdC5cblxuICAgKiBAcGFyYW0ge0tleVZhbHVlIHwgc3RyaW5nIHwgbnVtYmVyfSBpdGVtIC0gVGhlIGFjdHVhbCBpdGVtIGZyb20gdGhlIGxpc3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXJ9IFRoZSB0cmFja2luZyBrZXkgZm9yIHRoZSBpdGVtLlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgb3ZlcnJpZGUgdHJhY2tJdGVtRm4oaW5kZXg6IG51bWJlciwgaXRlbTogS2V5VmFsdWUgfCBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiBgJHsgKGl0ZW0gYXMgS2V5VmFsdWUpPy5bJ3VpZCddIHx8IChpdGVtIGFzIEtleVZhbHVlKT8uW3RoaXMucGtdfS0ke2luZGV4fWA7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBjcmVhdGUgZXZlbnQgZnJvbSB0aGUgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHVpZCAtIFRoZSBJRCBvZiB0aGUgaXRlbSB0byBjcmVhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBpdGVtIGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBsaXN0LlxuICAgKi9cbiAgYXN5bmMgaGFuZGxlQ3JlYXRlKHVpZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fcmVwb3NpdG9yeT8ucmVhZCh1aWQpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm1hcFJlc3VsdHMoW3Jlc3VsdCBhcyBLZXlWYWx1ZV0pWzBdO1xuICAgIHRoaXMuaXRlbXMgPSB0aGlzLmRhdGEgPSBbaXRlbSwgLi4udGhpcy5pdGVtcyB8fCBbXV07XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB0aGUgdXBkYXRlIGV2ZW50IGZyb20gdGhlIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgdGhlIGxpc3QgaXRlbSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgYmFzZWQgb24gdGhlIG5ldyBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdWlkIC0gVGhlIElEIG9mIHRoZSBpdGVtIHRvIHVwZGF0ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGhhbmRsZVVwZGF0ZSh1aWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGl0ZW06IEtleVZhbHVlID0gdGhpcy5pdGVtTWFwcGVyKGF3YWl0IHRoaXMuX3JlcG9zaXRvcnk/LnJlYWQodWlkKSB8fCB7fSwgdGhpcy5tYXBwZXIpO1xuICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgIGZvcihjb25zdCBrZXkgaW4gdGhpcy5pdGVtcyBhcyBLZXlWYWx1ZVtdKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5pdGVtc1trZXldIGFzIEtleVZhbHVlO1xuICAgICAgICBpZihjaGlsZFsndWlkJ10gPT09IGl0ZW1bJ3VpZCddKSB7XG4gICAgICAgICAgdGhpcy5pdGVtc1trZXldID0gT2JqZWN0LmFzc2lnbih7fSwgY2hpbGQsIGl0ZW0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhID0gWyAuLi50aGlzLml0ZW1zXTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGxpc3QgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IEZpbHRlcnMgb3V0IGFuIGl0ZW0gd2l0aCB0aGUgc3BlY2lmaWVkIElEIGZyb20gdGhlIGRhdGEgYXJyYXkgYW5kXG4gICAqIHJlZnJlc2hlcyB0aGUgbGlzdCBkaXNwbGF5LiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGFmdGVyIGEgZGVsZXRlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVpZCAtIFRoZSBJRCBvZiB0aGUgaXRlbSB0byBkZWxldGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gVGhlIHByaW1hcnkga2V5IGZpZWxkIG5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVEZWxldGUodWlkOiBzdHJpbmcgfCBudW1iZXIsIHBrPzogc3RyaW5nKTogdm9pZCAge1xuICAgIGlmKCFwaylcbiAgICAgIHBrID0gdGhpcy5waztcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhPy5maWx0ZXIoKGl0ZW06IEtleVZhbHVlKSA9PiBpdGVtWyd1aWQnXSAhPT0gdWlkKSB8fCBbXTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGNsaWNrIGV2ZW50cyBmcm9tIGxpc3QgaXRlbXMuXG4gICAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGdsb2JhbCBMaXN0SXRlbUNsaWNrRXZlbnQgZXZlbnRzIGFuZCBwYXNzZXMgdGhlbSB0byB0aGVcbiAgICogZGVib3VuY2VkIGNsaWNrIHN1YmplY3QuIFRoaXMgYWxsb3dzIHRoZSBjb21wb25lbnQgdG8gcmVzcG9uZCB0byBjbGlja3Mgb25cbiAgICogbGlzdCBpdGVtcyByZWdhcmRsZXNzIG9mIHdoZXJlIHRoZXkgb3JpZ2luYXRlIGZyb20uXG4gICAqXG4gICAqIEBwYXJhbSB7TGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIGNsaWNrIGV2ZW50XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93Okxpc3RJdGVtQ2xpY2tFdmVudCcsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUNsaWNrKGV2ZW50OiBMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2xpY2tJdGVtU3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBzZWFyY2ggZXZlbnRzIGZyb20gdGhlIHNlYXJjaCBiYXIuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBzZWFyY2ggcXVlcmllcyBmcm9tIHRoZSBzZWFyY2ggYmFyIGNvbXBvbmVudCwgdXBkYXRpbmcgdGhlXG4gICAqIGRpc3BsYXllZCBkYXRhIGJhc2VkIG9uIHRoZSBzZWFyY2ggdGVybS4gVGhlIGJlaGF2aW9yIGRpZmZlcnMgYmV0d2VlbiBpbmZpbml0ZVxuICAgKiBhbmQgcGFnaW5hdGVkIG1vZGVzIHRvIHByb3ZpZGUgdGhlIGJlc3QgdXNlciBleHBlcmllbmNlIGZvciBlYWNoIG1vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB2YWx1ZSAtIFRoZSBzZWFyY2ggdGVybSBvciB1bmRlZmluZWQgdG8gY2xlYXIgc2VhcmNoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBmbG93Y2hhcnQgVERcbiAgICogICBBW1NlYXJjaCBFdmVudF0gLS0+IEJ7VHlwZSBpcyBJbmZpbml0ZT99XG4gICAqICAgQiAtLT58WWVzfCBDW0Rpc2FibGUgbG9hZE1vcmVEYXRhXVxuICAgKiAgIEIgLS0+fE5vfCBEW0VuYWJsZSBsb2FkTW9yZURhdGFdXG4gICAqICAgQyAtLT4gRXtTZWFyY2ggdmFsdWUgdW5kZWZpbmVkP31cbiAgICogICBFIC0tPnxZZXN8IEZbRW5hYmxlIGxvYWRNb3JlRGF0YV1cbiAgICogICBFIC0tPnxOb3wgR1tTdG9yZSBzZWFyY2ggdmFsdWVdXG4gICAqICAgRCAtLT4gR1xuICAgKiAgIEYgLS0+IEhbUmVzZXQgcGFnZSB0byAxXVxuICAgKiAgIEcgLS0+IElbUmVmcmVzaCBkYXRhXVxuICAgKiAgIEggLS0+IElcbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzZWFyY2hiYXJFdmVudCcsIFsnJGV2ZW50J10pXG4gIGFzeW5jIGhhbmRsZVNlYXJjaCh2YWx1ZTogc3RyaW5nIHwgSUZpbHRlclF1ZXJ5IHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYodGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFKSB7XG4gICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IGZhbHNlO1xuICAgICAgaWYodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IHRydWU7XG4gICAgICAgIHRoaXMucGFnZSA9IDE7XG4gICAgICB9XG4gICAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2godHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHRoaXMucGFnZSA9IHRoaXMubGFzdFBhZ2U7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2godHJ1ZSk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgZmlsdGVyIGV2ZW50cyBmcm9tIHRoZSBmaWx0ZXIgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgZmlsdGVyIHF1ZXJpZXMgZnJvbSB0aGUgZmlsdGVyIGNvbXBvbmVudCBhbmQgYXBwbGllcyB0aGVtXG4gICAqIHRvIHRoZSBsaXN0IGRhdGEuIFRoaXMgbWV0aG9kIGFjdHMgYXMgYSBicmlkZ2UgYmV0d2VlbiB0aGUgZmlsdGVyIGNvbXBvbmVudFxuICAgKiBhbmQgdGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5LCBjb252ZXJ0aW5nIGZpbHRlciBxdWVyaWVzIGludG8gc2VhcmNoIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7SUZpbHRlclF1ZXJ5IHwgdW5kZWZpbmVkfSB2YWx1ZSAtIFRoZSBmaWx0ZXIgcXVlcnkgb2JqZWN0IG9yIHVuZGVmaW5lZCB0byBjbGVhciBmaWx0ZXJzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgaGFuZGxlRmlsdGVyKHZhbHVlOiBJRmlsdGVyUXVlcnkgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVNlYXJjaCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsZWFycyB0aGUgY3VycmVudCBzZWFyY2ggYW5kIHJlc2V0cyB0aGUgbGlzdC5cbiAgICogQHN1bW1hcnkgQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY2xlYXJzIHRoZSBzZWFyY2ggYnkgY2FsbGluZyBoYW5kbGVTZWFyY2hcbiAgICogd2l0aCB1bmRlZmluZWQuIFRoaXMgcmVzZXRzIHRoZSBsaXN0IHRvIHNob3cgYWxsIGRhdGEgd2l0aG91dCBmaWx0ZXJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgY2xlYXJTZWFyY2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVTZWFyY2godW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW1pdHMgYSByZWZyZXNoIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgZGF0YS5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhbmQgZW1pdHMgYSByZWZyZXNoIGV2ZW50IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgbGlzdCBkYXRhLlxuICAgKiBUaGlzIG5vdGlmaWVzIHBhcmVudCBjb21wb25lbnRzIHRoYXQgdGhlIGxpc3QgZGF0YSBoYXMgYmVlbiByZWZyZXNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5VmFsdWVbXX0gW2RhdGFdIC0gT3B0aW9uYWwgZGF0YSB0byBpbmNsdWRlIGluIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHJlZnJlc2hFdmVudEVtaXQoZGF0YT86IEtleVZhbHVlW10pOiB2b2lkIHtcbiAgICBpZighZGF0YSlcbiAgICAgIGRhdGEgPSB0aGlzLml0ZW1zO1xuICAgIHRoaXMuc2tlbGV0b25EYXRhID0gbmV3IEFycmF5KGRhdGE/Lmxlbmd0aCB8fCAyKTtcbiAgICB0aGlzLnJlZnJlc2hFdmVudC5lbWl0KHtcbiAgICAgIG5hbWU6IEV2ZW50Q29uc3RhbnRzLlJFRlJFU0gsXG4gICAgICBkYXRhOiBkYXRhIHx8IFtdLFxuICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudE5hbWVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW1pdHMgYSBjbGljayBldmVudCBmb3IgYSBsaXN0IGl0ZW0uXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhbmQgZW1pdHMgYSBjbGljayBldmVudCB3aGVuIGEgbGlzdCBpdGVtIGlzIGNsaWNrZWQuXG4gICAqIFRoaXMgZXh0cmFjdHMgdGhlIHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgZXZlbnQgYW5kIHBhc3NlcyBpdCB0byBwYXJlbnQgY29tcG9uZW50cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgY2xpY2sgZXZlbnRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGNsaWNrRXZlbnRFbWl0KGV2ZW50OiBMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmcmVzaGVzIHRoZSBsaXN0IGRhdGEgZnJvbSB0aGUgY29uZmlndXJlZCBzb3VyY2UuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGhhbmRsZXMgYm90aCBpbml0aWFsIGRhdGEgbG9hZGluZyBhbmQgc3Vic2VxdWVudCByZWZyZXNoIG9wZXJhdGlvbnMsXG4gICAqIGluY2x1ZGluZyBwdWxsLXRvLXJlZnJlc2ggYW5kIGluZmluaXRlIHNjcm9sbGluZy4gSXQgbWFuYWdlcyB0aGUgZGF0YSBmZXRjaGluZyBwcm9jZXNzLFxuICAgKiB1cGRhdGVzIHRoZSBjb21wb25lbnQncyBzdGF0ZSwgYW5kIGhhbmRsZXMgcGFnaW5hdGlvbiBvciBpbmZpbml0ZSBzY3JvbGxpbmcgbG9naWMgYmFzZWRcbiAgICogb24gdGhlIGNvbXBvbmVudCdzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFRoZSBtZXRob2QgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgICogMS4gU2V0cyB0aGUgcmVmcmVzaGluZyBmbGFnIHRvIGluZGljYXRlIGEgZGF0YSBmZXRjaCBpcyBpbiBwcm9ncmVzc1xuICAgKiAyLiBDYWxjdWxhdGVzIHRoZSBhcHByb3ByaWF0ZSBzdGFydCBhbmQgbGltaXQgdmFsdWVzIGJhc2VkIG9uIHBhZ2luYXRpb24gc2V0dGluZ3NcbiAgICogMy4gRmV0Y2hlcyBkYXRhIGZyb20gdGhlIGFwcHJvcHJpYXRlIHNvdXJjZSAobW9kZWwgb3IgcmVxdWVzdClcbiAgICogNC4gVXBkYXRlcyB0aGUgY29tcG9uZW50J3MgZGF0YSBhbmQgZW1pdHMgYSByZWZyZXNoIGV2ZW50XG4gICAqIDUuIEhhbmRsZXMgcGFnaW5hdGlvbiBvciBpbmZpbml0ZSBzY3JvbGxpbmcgc3RhdGUgdXBkYXRlc1xuICAgKiA2LiBDb21wbGV0ZXMgYW55IHByb3ZpZGVkIGV2ZW50IChsaWtlIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQpXG4gICAqXG4gICAqIEBwYXJhbSB7SW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8IFJlZnJlc2hlckN1c3RvbUV2ZW50IHwgYm9vbGVhbn0gZXZlbnQgLSBUaGUgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHJlZnJlc2gsXG4gICAqIG9yIGEgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgdGhpcyBpcyBhIGZvcmNlZCByZWZyZXNoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWZyZXNoIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExpc3RDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIERhdGEgU291cmNlXG4gICAqICAgcGFydGljaXBhbnQgRSBhcyBFdmVudCBTeXN0ZW1cbiAgICpcbiAgICogICBMLT4+TDogcmVmcmVzaChldmVudClcbiAgICogICBMLT4+TDogU2V0IHJlZnJlc2hpbmcgZmxhZ1xuICAgKiAgIEwtPj5MOiBDYWxjdWxhdGUgc3RhcnQgYW5kIGxpbWl0XG4gICAqICAgYWx0IFVzaW5nIG1vZGVsXG4gICAqICAgICBMLT4+RDogZ2V0RnJvbU1vZGVsKGZvcmNlLCBzdGFydCwgbGltaXQpXG4gICAqICAgICBELS0+Pkw6IFJldHVybiBkYXRhXG4gICAqICAgZWxzZSBVc2luZyByZXF1ZXN0XG4gICAqICAgICBMLT4+RDogZ2V0RnJvbVJlcXVlc3QoZm9yY2UsIHN0YXJ0LCBsaW1pdClcbiAgICogICAgIEQtLT4+TDogUmV0dXJuIGRhdGFcbiAgICogICBlbmRcbiAgICogICBMLT4+RTogcmVmcmVzaEV2ZW50RW1pdCgpXG4gICAqICAgYWx0IEluZmluaXRlIHNjcm9sbGluZyBtb2RlXG4gICAqICAgICBMLT4+TDogQ2hlY2sgaWYgcmVhY2hlZCBsYXN0IHBhZ2VcbiAgICogICAgIGFsdCBMYXN0IHBhZ2UgcmVhY2hlZFxuICAgKiAgICAgICBMLT4+TDogQ29tcGxldGUgc2Nyb2xsIGV2ZW50XG4gICAqICAgICAgIEwtPj5MOiBEaXNhYmxlIGxvYWRNb3JlRGF0YVxuICAgKiAgICAgZWxzZSBNb3JlIHBhZ2VzIGF2YWlsYWJsZVxuICAgKiAgICAgICBMLT4+TDogSW5jcmVtZW50IHBhZ2UgbnVtYmVyXG4gICAqICAgICAgIEwtPj5MOiBDb21wbGV0ZSBzY3JvbGwgZXZlbnQgYWZ0ZXIgZGVsYXlcbiAgICogICAgIGVuZFxuICAgKiAgIGVsc2UgUGFnaW5hdGVkIG1vZGVcbiAgICogICAgIEwtPj5MOiBDbGVhciByZWZyZXNoaW5nIGZsYWcgYWZ0ZXIgZGVsYXlcbiAgICogICBlbmRcbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpCYWNrQnV0dG9uTmF2aWdhdGlvbkVuZEV2ZW50JywgWyckZXZlbnQnXSlcbiAgYXN5bmMgcmVmcmVzaChldmVudDogSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8IFJlZnJlc2hlckN1c3RvbUV2ZW50IHwgYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gIGlmKHR5cGVvZiBmb3JjZSAhPT0gJ2Jvb2xlYW4nICYmIGZvcmNlLnR5cGUgPT09IEV2ZW50Q29uc3RhbnRzLkJBQ0tfQlVUVE9OX05BVklHQVRJT04pIHtcbiAgICAvLyAgICBjb25zdCB7cmVmcmVzaH0gPSAoZm9yY2UgYXMgQ3VzdG9tRXZlbnQpLmRldGFpbDtcbiAgICAvLyAgICBpZighcmVmcmVzaClcbiAgICAvLyAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyAgfVxuXG4gICAgdGhpcy5yZWZyZXNoaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBzdGFydDogbnVtYmVyID0gdGhpcy5wYWdlID4gMSA/ICh0aGlzLnBhZ2UgLSAxKSAqIHRoaXMubGltaXQgOiB0aGlzLnN0YXJ0O1xuICAgIGNvbnN0IGxpbWl0OiBudW1iZXIgPSAodGhpcy5wYWdlICogKHRoaXMubGltaXQgPiAxMiA/IDEyIDogdGhpcy5saW1pdCkpO1xuXG4gICAgdGhpcy5kYXRhID0gIXRoaXMubW9kZWwgP1xuICAgICAgYXdhaXQgdGhpcy5nZXRGcm9tUmVxdWVzdCghIWV2ZW50LCBzdGFydCwgbGltaXQpXG4gICAgICA6IGF3YWl0IHRoaXMuZ2V0RnJvbU1vZGVsKCEhZXZlbnQpIGFzIEtleVZhbHVlW107XG5cbiAgICB0aGlzLnJlZnJlc2hFdmVudEVtaXQoKTtcblxuICAgIGlmKHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURSkge1xuICAgICAgaWYodGhpcy5wYWdlID09PSB0aGlzLnBhZ2VzKSB7XG4gICAgICAgIGlmKChldmVudCBhcyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50KT8udGFyZ2V0KVxuICAgICAgICAgIChldmVudCBhcyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50KS50YXJnZXQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGFnZSArPSAxO1xuICAgICAgICB0aGlzLnJlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZigoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCk/LnRhcmdldCAmJiAoZXZlbnQgYXMgQ3VzdG9tRXZlbnQpPy50eXBlICE9PSBFdmVudENvbnN0YW50cy5CQUNLX0JVVFRPTl9OQVZJR0FUSU9OKVxuICAgICAgICAgICAgICAoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCkudGFyZ2V0LmNvbXBsZXRlKCk7XG4gICAgICAgIH0sIDIwMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBhZ2luYXRpb24gZXZlbnRzIGZyb20gdGhlIHBhZ2luYXRpb24gY29tcG9uZW50LlxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIHBhZ2luYXRpb24gZXZlbnRzIGJ5IHVwZGF0aW5nIHRoZSBjdXJyZW50IHBhZ2UgbnVtYmVyIGFuZFxuICogcmVmcmVzaGluZyB0aGUgbGlzdCBkYXRhIHRvIGRpc3BsYXkgdGhlIHNlbGVjdGVkIHBhZ2UuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZFxuICogd2hlbiBhIHVzZXIgaW50ZXJhY3RzIHdpdGggdGhlIHBhZ2luYXRpb24gY29udHJvbHMgdG8gbmF2aWdhdGUgYmV0d2VlbiBwYWdlcy5cbiAqXG4gKiBAcGFyYW0ge1BhZ2luYXRpb25DdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgcGFnaW5hdGlvbiBldmVudCBjb250YWluaW5nIHBhZ2UgaW5mb3JtYXRpb25cbiAqIEByZXR1cm5zIHt2b2lkfVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmhhbmRsZVBhZ2luYXRlKGV2ZW50OiBQYWdpbmF0aW9uQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgY29uc3QgeyBwYWdlfSA9IGV2ZW50LmRhdGE7XG4gIHRoaXMucGFnZSA9IHBhZ2U7XG4gIHRoaXMucmVmcmVzaCh0cnVlKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBwdWxsLXRvLXJlZnJlc2ggZXZlbnRzIGZyb20gdGhlIHJlZnJlc2hlciBjb21wb25lbnQuXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgcmVmcmVzaCBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIHB1bGxpbmcgZG93biBvbiB0aGUgbGlzdFxuICogb3IgYnkgcHJvZ3JhbW1hdGljIHJlZnJlc2ggcmVxdWVzdHMuIFRoaXMgbWV0aG9kIHJlZnJlc2hlcyB0aGUgbGlzdCBkYXRhIGFuZFxuICogY29tcGxldGVzIHRoZSByZWZyZXNoZXIgYW5pbWF0aW9uIHdoZW4gdGhlIGRhdGEgaXMgbG9hZGVkLlxuICpcbiAqIEBwYXJhbSB7SW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8IEN1c3RvbUV2ZW50fSBbZXZlbnRdIC0gVGhlIHJlZnJlc2ggZXZlbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWZyZXNoIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmFzeW5jIGhhbmRsZVJlZnJlc2goZXZlbnQ/OiBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50IHwgQ3VzdG9tRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgdGhpcy5yZWZyZXNoKGV2ZW50IGFzIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfHwgdHJ1ZSk7XG4gIGlmKGV2ZW50IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBBbnkgY2FsbHMgdG8gbG9hZCBkYXRhIGdvIGhlcmVcbiAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTElvblJlZnJlc2hlckVsZW1lbnQpLmNvbXBsZXRlKCk7XG4gICAgfSwgNDAwKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmlsdGVycyBkYXRhIGJhc2VkIG9uIGEgc2VhcmNoIHN0cmluZy5cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyB0aGUgY3VycmVudCBkYXRhIGFycmF5IHRvIGZpbmQgaXRlbXMgdGhhdCBtYXRjaCB0aGUgcHJvdmlkZWRcbiAqIHNlYXJjaCBzdHJpbmcuIFRoaXMgdXNlcyB0aGUgYXJyYXlRdWVyeUJ5U3RyaW5nIHV0aWxpdHkgdG8gcGVyZm9ybSB0aGUgZmlsdGVyaW5nXG4gKiBhY3Jvc3MgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7S2V5VmFsdWVbXX0gcmVzdWx0cyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBzZWFyY2ggdGhyb3VnaFxuICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaCAtIFRoZSBzZWFyY2ggc3RyaW5nIHRvIGZpbHRlciBieVxuICogQHJldHVybnMge0tleVZhbHVlW119IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmaWx0ZXJlZCBhcnJheSBvZiBpdGVtc1xuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbiAgcGFyc2VTZWFyY2hSZXN1bHRzKHJlc3VsdHM6IEtleVZhbHVlW10sIHNlYXJjaDogc3RyaW5nKTogS2V5VmFsdWVbXSB7XG4gICAgcmV0dXJuIHJlc3VsdHMuZmlsdGVyKChpdGVtOiBLZXlWYWx1ZSkgPT5cbiAgICAgIE9iamVjdC52YWx1ZXMoaXRlbSkuc29tZSh2YWx1ZSA9PlxuICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygoc2VhcmNoIGFzIHN0cmluZyk/LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgIClcbiAgICApO1xuICB9XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZldGNoZXMgZGF0YSBmcm9tIGEgcmVxdWVzdCBzb3VyY2UuXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgZGF0YSBmcm9tIHRoZSBjb25maWd1cmVkIHNvdXJjZSBmdW5jdGlvbiBvciBVUkwsIHByb2Nlc3NlcyBpdCxcbiAqIGFuZCB1cGRhdGVzIHRoZSBjb21wb25lbnQncyBkYXRhIHN0YXRlLiBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggaW5pdGlhbCBkYXRhIGxvYWRpbmdcbiAqIGFuZCBzdWJzZXF1ZW50IHJlZnJlc2ggb3BlcmF0aW9ucyB3aGVuIHVzaW5nIGFuIGV4dGVybmFsIGRhdGEgc291cmNlIHJhdGhlciB0aGFuIGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBmb3JjZSAtIFdoZXRoZXIgdG8gZm9yY2UgYSByZWZyZXNoIGV2ZW4gaWYgZGF0YSBhbHJlYWR5IGV4aXN0c1xuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gVGhlIHN0YXJ0aW5nIGluZGV4IGZvciBwYWdpbmF0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0cmlldmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPEtleVZhbHVlW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZmV0Y2hlZCBkYXRhXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xuYXN5bmMgZ2V0RnJvbVJlcXVlc3QoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSwgc3RhcnQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8S2V5VmFsdWVbXT4ge1xuICBsZXQgcmVxdWVzdDogS2V5VmFsdWVbXSA9IFtdO1xuICBpZighdGhpcy5kYXRhPy5sZW5ndGggfHwgZm9yY2UgfHwgKHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nKT8ubGVuZ3RoIHx8ICEhKHRoaXMuc2VhcmNoVmFsdWUgYXMgSUZpbHRlclF1ZXJ5KSkge1xuICAgIC8vIChzZWxmLmRhdGEgYXMgTGlzdEl0ZW1bXSkgPSBbXTtcbiAgICBpZighKHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nKT8ubGVuZ3RoICYmICEodGhpcy5zZWFyY2hWYWx1ZSBhcyBJRmlsdGVyUXVlcnkpKSB7XG4gICAgICBpZighdGhpcy5zb3VyY2UgJiYgIXRoaXMuZGF0YT8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ05vIGRhdGEgYW5kIHNvdXJjZSBwYXNzZWQgdG8gaW5maW5pdGUgbGlzdCcpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGlmKHRoaXMuc291cmNlIGluc3RhbmNlb2YgRnVuY3Rpb24pXG4gICAgICAgIHJlcXVlc3QgPSBhd2FpdCB0aGlzLnNvdXJjZSgpO1xuXG4gICAgICBpZighQXJyYXkuaXNBcnJheShyZXF1ZXN0KSlcbiAgICAgICAgcmVxdWVzdCA9IHJlcXVlc3Q/LlsncmVzcG9uc2UnXT8uWydkYXRhJ10gfHwgcmVxdWVzdD8uWydyZXN1bHRzJ10gfHwgW107XG4gICAgICB0aGlzLmRhdGEgPSBbLi4uIGF3YWl0IHRoaXMucGFyc2VSZXN1bHQocmVxdWVzdCldO1xuICAgICAgaWYodGhpcy5kYXRhPy5sZW5ndGgpXG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEUgP1xuICAgICAgICAgICh0aGlzLml0ZW1zIHx8IFtdKS5jb25jYXQoWy4uLnRoaXMuZGF0YS5zbGljZShzdGFydCwgbGltaXQpXSkgOiBbLi4ucmVxdWVzdC5zbGljZShzdGFydCwgbGltaXQpIGFzIEtleVZhbHVlW11dO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLnBhcnNlU2VhcmNoUmVzdWx0cyh0aGlzLmRhdGEgYXMgW10sIHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmRhdGE7XG4gICAgfVxuICB9XG5cbiAgaWYodGhpcy5sb2FkTW9yZURhdGEgJiYgdGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLlBBR0lOQVRFRClcbiAgICB0aGlzLmdldE1vcmVEYXRhKHRoaXMuZGF0YT8ubGVuZ3RoIHx8IDApO1xuICByZXR1cm4gdGhpcy5kYXRhIHx8IFtdIGFzIEtleVZhbHVlW107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZldGNoZXMgZGF0YSBmcm9tIGEgbW9kZWwgc291cmNlLlxuICogQHN1bW1hcnkgUmV0cmlldmVzIGRhdGEgZnJvbSB0aGUgY29uZmlndXJlZCBtb2RlbCB1c2luZyBpdHMgcGFnaW5hdGlvbiBvciBmaW5kIG1ldGhvZHMsXG4gKiBwcm9jZXNzZXMgaXQsIGFuZCB1cGRhdGVzIHRoZSBjb21wb25lbnQncyBkYXRhIHN0YXRlLiBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggaW5pdGlhbFxuICogZGF0YSBsb2FkaW5nIGFuZCBzdWJzZXF1ZW50IHJlZnJlc2ggb3BlcmF0aW9ucyB3aGVuIHVzaW5nIGEgbW9kZWwgYXMgdGhlIGRhdGEgc291cmNlLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBXaGV0aGVyIHRvIGZvcmNlIGEgcmVmcmVzaCBldmVuIGlmIGRhdGEgYWxyZWFkeSBleGlzdHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIFRoZSBzdGFydGluZyBpbmRleCBmb3IgcGFnaW5hdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHJpZXZlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxLZXlWYWx1ZVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZldGNoZWQgZGF0YVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmFzeW5jIGdldEZyb21Nb2RlbChmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxLZXlWYWx1ZVtdPiB7XG4gIGxldCBkYXRhID0gWyAuLi4gdGhpcy5kYXRhIHx8IFtdXTtcbiAgbGV0IHJlcXVlc3Q6IEtleVZhbHVlW10gPSBbXTtcblxuICAvLyBnZXR0aW5nIG1vZGVsIHJlcG9zaXRvcnlcbiAgaWYoIXRoaXMuX3JlcG9zaXRvcnkpXG4gICAgdGhpcy5fcmVwb3NpdG9yeSA9IHRoaXMucmVwb3NpdG9yeTtcbiAgY29uc3QgcmVwbyA9IHRoaXMuX3JlcG9zaXRvcnkgYXMgRGVjYWZSZXBvc2l0b3J5PE1vZGVsPjtcbiAgaWYoIXRoaXMuZGF0YT8ubGVuZ3RoIHx8IGZvcmNlIHx8ICh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCB8fCAhISh0aGlzLnNlYXJjaFZhbHVlIGFzIElGaWx0ZXJRdWVyeSkpIHtcbiAgICB0cnkge1xuICAgICBpZighKHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nKT8ubGVuZ3RoICYmICEodGhpcy5zZWFyY2hWYWx1ZSBhcyBJRmlsdGVyUXVlcnkpKSB7XG4gICAgICAgICh0aGlzLmRhdGEgYXMgS2V5VmFsdWVbXSkgPSBbXTtcbiAgICAgICAgLy8gY29uc3QgcmF3UXVlcnkgPSB0aGlzLnBhcnNlUXVlcnkoc2VsZi5tb2RlbCBhcyBSZXBvc2l0b3J5PE1vZGVsPiwgc3RhcnQsIGxpbWl0KTtcbiAgICAgICAgLy8gcmVxdWVzdCA9IHRoaXMucGFyc2VSZXN1bHQoYXdhaXQgKHRoaXMubW9kZWwgYXMgYW55KT8ucGFnaW5hdGUoc3RhcnQsIGxpbWl0KSk7XG4gICAgICAgICAgaWYoIXRoaXMucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRvciA9IGF3YWl0IHJlcG9cbiAgICAgICAgICAgICAgLnNlbGVjdCgpXG4gICAgICAgICAgICAgIC5vcmRlckJ5KFt0aGlzLnBrIGFzIGtleW9mIE1vZGVsLCB0aGlzLnNvcnREaXJlY3Rpb25dKVxuICAgICAgICAgICAgICAucGFnaW5hdGUodGhpcy5saW1pdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlcXVlc3QgPSBhd2FpdCB0aGlzLnBhcnNlUmVzdWx0KHRoaXMucGFnaW5hdG9yKTtcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYoIXRoaXMuaW5kZXhlcylcbiAgICAgICAgICB0aGlzLmluZGV4ZXMgPSAoT2JqZWN0LnZhbHVlcyh0aGlzLm1hcHBlcikgfHwgW3RoaXMucGtdKTtcblxuICAgICAgICBjb25zdCBjb25kaXRpb24gPSB0aGlzLnBhcnNlQ29uZGl0aW9ucyh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyB8IG51bWJlciB8IElGaWx0ZXJRdWVyeSk7XG4gICAgICAgIHJlcXVlc3QgPSBhd2FpdCB0aGlzLnBhcnNlUmVzdWx0KGF3YWl0IHJlcG8ucXVlcnkoY29uZGl0aW9uLCAodGhpcy5zb3J0QnkgfHwgdGhpcy5waykgYXMga2V5b2YgTW9kZWwsIHRoaXMuc29ydERpcmVjdGlvbikpO1xuICAgICAgICBkYXRhID0gW107XG4gICAgICB9XG4gICAgICBkYXRhID0gdGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFID8gWy4uLiAoZGF0YSkuY29uY2F0KHJlcXVlc3QpXSA6IFsuLi5yZXF1ZXN0XTtcbiAgICB9IGNhdGNoKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoZXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IGBVbmFibGUgdG8gZmluZCAke3RoaXMubW9kZWx9IG9uIHJlZ2lzdHJ5LiBSZXR1cm4gZW1wdHkgYXJyYXkgZnJvbSBjb21wb25lbnRgKTtcbiAgICB9XG4gIH1cblxuICBpZihkYXRhPy5sZW5ndGgpIHtcbiAgICBpZih0aGlzLnNlYXJjaFZhbHVlKSB7XG4gICAgICB0aGlzLml0ZW1zID0gWy4uLmRhdGFdO1xuICAgICAgaWYodGhpcy5pdGVtcz8ubGVuZ3RoIDw9IHRoaXMubGltaXQpXG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXRlbXMgPSBbLi4uZGF0YV07XG4gICAgfVxuICB9XG4gIGlmKHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5QQUdJTkFURUQgJiYgdGhpcy5wYWdpbmF0b3IpXG4gICAgICB0aGlzLmdldE1vcmVEYXRhKHRoaXMucGFnaW5hdG9yLnRvdGFsKTtcbiAgcmV0dXJuIGRhdGEgfHwgW10gYXMgS2V5VmFsdWVbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgc2VhcmNoIHZhbHVlcyBvciBmaWx0ZXIgcXVlcmllcyBpbnRvIGRhdGFiYXNlIGNvbmRpdGlvbnMuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHNlYXJjaCBpbnB1dCBvciBjb21wbGV4IGZpbHRlciBxdWVyaWVzIGludG8gQ29uZGl0aW9uIG9iamVjdHNcbiAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRhdGFiYXNlIHF1ZXJ5aW5nLiBIYW5kbGVzIGJvdGggc2ltcGxlIHN0cmluZy9udW1iZXIgc2VhcmNoZXNcbiAqIGFjcm9zcyBpbmRleGVkIGZpZWxkcyBhbmQgY29tcGxleCBmaWx0ZXIgcXVlcmllcyB3aXRoIG11bHRpcGxlIGNyaXRlcmlhLlxuICpcbiAqIEZvciBzaW1wbGUgc2VhcmNoZXMgKHN0cmluZy9udW1iZXIpOlxuICogLSBDcmVhdGVzIGNvbmRpdGlvbnMgdGhhdCBzZWFyY2ggYWNyb3NzIGFsbCBpbmRleGVkIGZpZWxkc1xuICogLSBVc2VzIGVxdWFsaXR5IGZvciBudW1lcmljIHZhbHVlcyBhbmQgcmVnZXggZm9yIHN0cmluZyB2YWx1ZXNcbiAqIC0gQ29tYmluZXMgY29uZGl0aW9ucyB3aXRoIE9SIGxvZ2ljIHRvIHNlYXJjaCBtdWx0aXBsZSBmaWVsZHNcbiAqXG4gKiBGb3IgY29tcGxleCBmaWx0ZXIgcXVlcmllczpcbiAqIC0gUHJvY2Vzc2VzIGVhY2ggZmlsdGVyIGl0ZW0gd2l0aCBpdHMgc3BlY2lmaWMgY29uZGl0aW9uIHR5cGVcbiAqIC0gU3VwcG9ydHMgRXF1YWwsIE5vdCBFcXVhbCwgQ29udGFpbnMsIE5vdCBDb250YWlucywgR3JlYXRlciBUaGFuLCBMZXNzIFRoYW5cbiAqIC0gVXBkYXRlcyBzb3J0IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhlIGZpbHRlciBxdWVyeVxuICogLSBDb21iaW5lcyBtdWx0aXBsZSBmaWx0ZXIgY29uZGl0aW9ucyB3aXRoIE9SIGxvZ2ljXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBJRmlsdGVyUXVlcnl9IHZhbHVlIC0gVGhlIHNlYXJjaCB2YWx1ZSBvciBmaWx0ZXIgcXVlcnkgb2JqZWN0XG4gKiBAcmV0dXJucyB7Q29uZGl0aW9uPE1vZGVsPn0gQSBDb25kaXRpb24gb2JqZWN0IGZvciBkYXRhYmFzZSBxdWVyeWluZ1xuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xucGFyc2VDb25kaXRpb25zKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBJRmlsdGVyUXVlcnkpOiBDb25kaXRpb248TW9kZWw+IHtcbiAgbGV0IF9jb25kaXRpb246IENvbmRpdGlvbjxNb2RlbD47XG4gIGlmKHR5cGVvZiB2YWx1ZSA9PT0gUHJpbWl0aXZlcy5TVFJJTkcgfHwgdHlwZW9mIHZhbHVlID09PSBQcmltaXRpdmVzLk5VTUJFUikge1xuICAgIF9jb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPih0aGlzLnBrIGFzIGtleW9mIE1vZGVsKS5lcSghaXNOYU4odmFsdWUgYXMgbnVtYmVyKSA/IE51bWJlcih2YWx1ZSkgOiB2YWx1ZSk7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiB0aGlzLmluZGV4ZXMpIHtcbiAgICAgICAgaWYoaW5kZXggPT09IHRoaXMucGspXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGxldCBvckNvbmRpdGlvbjtcbiAgICAgICAgaWYoIWlzTmFOKHZhbHVlIGFzIG51bWJlcikpIHtcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5lcShOdW1iZXIodmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5yZWdleHAodmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBfY29uZGl0aW9uID0gX2NvbmRpdGlvbi5vcihvckNvbmRpdGlvbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHtxdWVyeSwgc29ydH0gPSB2YWx1ZSBhcyBJRmlsdGVyUXVlcnk7XG4gICAgX2NvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KHRoaXMucGsgYXMga2V5b2YgTW9kZWwpLmRpZignbnVsbCcpO1xuXG4gICAgaWYocXVlcnk/Lmxlbmd0aClcbiAgICAgIF9jb25kaXRpb24gPSB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBDb25kaXRpb248TW9kZWw+O1xuXG4gICAgKHF1ZXJ5IHx8IFtdKS5mb3JFYWNoKChpdGVtOiBJRmlsdGVyUXVlcnlJdGVtKSA9PiB7XG4gICAgICBjb25zdCB7dmFsdWUsIGNvbmRpdGlvbiwgaW5kZXh9ID0gaXRlbTtcbiAgICAgIGxldCB2YWwgPSB2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBpZihpbmRleCA9PT0gdGhpcy5wayB8fCAhaXNOYU4odmFsIGFzIG51bWJlcikpXG4gICAgICAgIHZhbCA9IE51bWJlcih2YWwpO1xuICAgICAgbGV0IG9yQ29uZGl0aW9uO1xuICAgICAgc3dpdGNoIChjb25kaXRpb24pIHtcbiAgICAgICAgY2FzZSBcIkVxdWFsXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkuZXEodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk5vdCBFcXVhbFwiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLmRpZih2YWwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTm90IENvbnRhaW5zXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSAhQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLnJlZ2V4cChuZXcgUmVnRXhwKGBeKD8hLioke3ZhbH0pLiokYCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQ29udGFpbnNcIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5yZWdleHAodmFsIGFzIHN0cmluZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJHcmVhdGVyIFRoYW5cIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5ndGUodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkxlc3MgVGhhblwiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLmx0ZSh2YWwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgX2NvbmRpdGlvbiA9ICghX2NvbmRpdGlvbiA/XG4gICAgICAgIG9yQ29uZGl0aW9uIDogX2NvbmRpdGlvbi5hbmQob3JDb25kaXRpb24gYXMgdW5rbm93biBhcyBDb25kaXRpb248TW9kZWw+KSkgYXMgQ29uZGl0aW9uPE1vZGVsPjtcbiAgICB9KTtcblxuICAgIHRoaXMuc29ydEJ5ID0gc29ydD8udmFsdWUgYXMga2V5b2YgTW9kZWwgfHwgdGhpcy5waztcbiAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSBzb3J0Py5kaXJlY3Rpb24gfHwgdGhpcy5zb3J0RGlyZWN0aW9uO1xuICB9XG4gIHJldHVybiBfY29uZGl0aW9uIGFzIENvbmRpdGlvbjxNb2RlbD47XG5cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIHF1ZXJ5IHJlc3VsdHMgaW50byBhIHN0YW5kYXJkaXplZCBmb3JtYXQuXG4gKiBAc3VtbWFyeSBIYW5kbGVzIGRpZmZlcmVudCByZXN1bHQgZm9ybWF0cyBmcm9tIHZhcmlvdXMgZGF0YSBzb3VyY2VzLCBleHRyYWN0aW5nXG4gKiBwYWdpbmF0aW9uIGluZm9ybWF0aW9uIHdoZW4gYXZhaWxhYmxlIGFuZCBhcHBseWluZyBhbnkgY29uZmlndXJlZCBkYXRhIG1hcHBpbmcuXG4gKiBUaGlzIGVuc3VyZXMgY29uc2lzdGVudCBkYXRhIHN0cnVjdHVyZSByZWdhcmRsZXNzIG9mIHRoZSBzb3VyY2UuXG4gKlxuICogQHByb3RlY3RlZFxuICogQHBhcmFtIHtLZXlWYWx1ZVtdIHwgUGFnaW5hdG9yfSByZXN1bHQgLSBUaGUgcmF3IHF1ZXJ5IHJlc3VsdFxuICogQHJldHVybnMge0tleVZhbHVlW119IFRoZSBwcm9jZXNzZWQgYXJyYXkgb2YgaXRlbXNcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5wcm90ZWN0ZWQgYXN5bmMgcGFyc2VSZXN1bHQocmVzdWx0OiBLZXlWYWx1ZVtdIHwgUGFnaW5hdG9yPE1vZGVsPik6IFByb21pc2U8S2V5VmFsdWVbXT4ge1xuICBpZighQXJyYXkuaXNBcnJheShyZXN1bHQpICYmICgncGFnZScgaW4gcmVzdWx0ICYmICd0b3RhbCcgaW4gcmVzdWx0KSkge1xuICAgIGNvbnN0IHBhZ2luYXRvciA9IHJlc3VsdCBhcyBQYWdpbmF0b3I8TW9kZWw+O1xuICAgIHJlc3VsdCA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKHRoaXMucGFnZSk7XG4gICAgLy8gVE9ETzogQ2hhZ2UgZm9yIHJlc3VsdC50b3RhbDtcbiAgICB0aGlzLmdldE1vcmVEYXRhKHBhZ2luYXRvci50b3RhbCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5nZXRNb3JlRGF0YSgocmVzdWx0IGFzIEtleVZhbHVlW10pPy5sZW5ndGggfHwgMCk7XG4gIH1cbiAgcmV0dXJuIChPYmplY3Qua2V5cyh0aGlzLm1hcHBlciB8fCB7fSkubGVuZ3RoKSA/XG4gICAgdGhpcy5tYXBSZXN1bHRzKHJlc3VsdCkgOiByZXN1bHQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgcGFnaW5hdGlvbiBzdGF0ZSBiYXNlZCBvbiBkYXRhIGxlbmd0aC5cbiAqIEBzdW1tYXJ5IENhbGN1bGF0ZXMgd2hldGhlciBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBob3cgbWFueSBwYWdlcyBleGlzdFxuICogYmFzZWQgb24gdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBhbmQgdGhlIGNvbmZpZ3VyZWQgbGltaXQgcGVyIHBhZ2UuXG4gKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gY29udHJvbCBwYWdpbmF0aW9uIFVJIGFuZCBpbmZpbml0ZSBzY3JvbGxpbmcgYmVoYXZpb3IuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgYXZhaWxhYmxlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5nZXRNb3JlRGF0YShsZW5ndGg6IG51bWJlcik6IHZvaWQge1xuICBpZih0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEUpIHtcbiAgICBpZih0aGlzLnBhZ2luYXRvcilcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCAqIHRoaXMubGltaXQ7XG4gICAgaWYobGVuZ3RoIDw9IHRoaXMubGltaXQpIHtcbiAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnZXMgPSBNYXRoLmZsb29yKGxlbmd0aCAvIHRoaXMubGltaXQpO1xuICAgICAgaWYoKHRoaXMucGFnZXMgKiB0aGlzLmxpbWl0KSA8IGxlbmd0aClcbiAgICAgICAgdGhpcy5wYWdlcyArPSAxO1xuICAgICAgaWYodGhpcy5wYWdlcyA9PT0gMSlcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5wYWdlcyA9IGxlbmd0aDtcbiAgICBpZih0aGlzLnBhZ2VzID09PSAxKVxuICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIGEgc2luZ2xlIGl0ZW0gdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWFwcGVyLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyBhIGRhdGEgaXRlbSBhY2NvcmRpbmcgdG8gdGhlIG1hcHBpbmcgY29uZmlndXJhdGlvbixcbiAqIGV4dHJhY3RpbmcgbmVzdGVkIHByb3BlcnRpZXMgYW5kIGZvcm1hdHRpbmcgdmFsdWVzIGFzIG5lZWRlZC4gVGhpcyBhbGxvd3NcbiAqIHRoZSBjb21wb25lbnQgdG8gZGlzcGxheSBkYXRhIGluIGEgZm9ybWF0IGRpZmZlcmVudCBmcm9tIGhvdyBpdCdzIHN0b3JlZC5cbiAqXG4gKiBAcHJvdGVjdGVkXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBpdGVtIC0gVGhlIGl0ZW0gdG8gbWFwXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBtYXBwZXIgLSBUaGUgbWFwcGluZyBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBbcHJvcHNdIC0gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGluY2x1ZGVcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZX0gVGhlIG1hcHBlZCBpdGVtXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xucHJvdGVjdGVkIGl0ZW1NYXBwZXIoaXRlbTogS2V5VmFsdWUsIG1hcHBlcjogS2V5VmFsdWUsIHByb3BzPzogS2V5VmFsdWUpOiBLZXlWYWx1ZSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhtYXBwZXIpLnJlZHVjZSgoYWNjdW06IEtleVZhbHVlLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBhcnJheVZhbHVlID0gdmFsdWUuc3BsaXQoJy4nKTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcnJheVZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB2YWx1ZSA9IGl0ZW0/Llt2YWx1ZV0gPyBpdGVtW3ZhbHVlXSA6IHZhbHVlICE9PSBrZXkgPyB2YWx1ZSA6IFwiXCI7XG4gICAgICAgIGlmKGlzVmFsaWREYXRlKHZhbHVlKSlcbiAgICAgICAgICB2YWx1ZSA9IGAke2Zvcm1hdERhdGUodmFsdWUpfWA7XG4gICAgICAgIGFjY3VtW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB2YWw7XG5cbiAgICAgICAgZm9yIChjb25zdCBfdmFsdWUgb2YgYXJyYXlWYWx1ZSlcbiAgICAgICAgICB2YWwgPSAhdmFsXG4gICAgICAgICAgICA/IGl0ZW1bX3ZhbHVlXVxuICAgICAgICAgICAgOiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHZhbCkgOiB2YWwpW192YWx1ZV07XG5cblxuICAgICAgICBpZiAoaXNWYWxpZERhdGUobmV3IERhdGUodmFsKSkpXG4gICAgICAgICAgdmFsID0gYCR7Zm9ybWF0RGF0ZSh2YWwpfWA7XG5cbiAgICAgICAgYWNjdW1ba2V5XSA9IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMgfHwge30sIGFjY3VtKTtcbiAgfSwge30pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIGFsbCByZXN1bHQgaXRlbXMgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWFwcGVyLlxuICogQHN1bW1hcnkgQXBwbGllcyB0aGUgaXRlbU1hcHBlciB0byBlYWNoIGl0ZW0gaW4gdGhlIHJlc3VsdCBzZXQsIGFkZGluZ1xuICogY29tbW9uIHByb3BlcnRpZXMgbGlrZSBvcGVyYXRpb25zIGFuZCByb3V0ZSBpbmZvcm1hdGlvbi4gVGhpcyB0cmFuc2Zvcm1zXG4gKiB0aGUgcmF3IGRhdGEgaW50byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZSBsaXN0IGl0ZW0gY29tcG9uZW50cy5cbiAqXG4gKiBAcGFyYW0ge0tleVZhbHVlW119IGRhdGEgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gbWFwXG4gKiBAcmV0dXJucyB7S2V5VmFsdWVbXX0gVGhlIGFycmF5IG9mIG1hcHBlZCBpdGVtc1xuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbiAgbWFwUmVzdWx0cyhkYXRhOiBLZXlWYWx1ZVtdKTogS2V5VmFsdWVbXSB7XG4gICAgaWYoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKVxuICAgICAgcmV0dXJuIFtdO1xuICAgIC8vIHBhc3NpbmcgdWlkIGFzIHByb3AgdG8gbWFwcGVyXG4gICAgdGhpcy5tYXBwZXIgPSB7Li4uIHRoaXMubWFwcGVyLCAuLi4ge3VpZDogdGhpcy5wa319O1xuICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBvcGVyYXRpb25zOiB0aGlzLm9wZXJhdGlvbnMsXG4gICAgICByb3V0ZTogdGhpcy5yb3V0ZSxcbiAgICAgIC4uLiAgT2JqZWN0LmtleXModGhpcy5pdGVtKS5yZWR1Y2UoKGFjYzogS2V5VmFsdWUsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gdGhpcy5pdGVtW2tleV07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSksXG4gICAgICAvLyAuLi4gKCF0aGlzLml0ZW0ucmVuZGVyID8ge30gOiAgT2JqZWN0LmtleXModGhpcy5pdGVtKS5yZWR1Y2UoKGFjYzogS2V5VmFsdWUsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAvLyAgIGFjY1trZXldID0gdGhpcy5pdGVtW2tleSBhcyBrZXlvZiBJTGlzdEl0ZW1Qcm9wXTtcbiAgICAgIC8vICAgcmV0dXJuIGFjYztcbiAgICAgIC8vIH0sIHt9KSlcbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YS5yZWR1Y2UoKGFjY3VtOiBLZXlWYWx1ZVtdLCBjdXJyKSA9PiB7XG4gICAgICAgIGFjY3VtLnB1c2goey4uLiB0aGlzLml0ZW1NYXBwZXIoY3VyciwgdGhpcy5tYXBwZXIgYXMgS2V5VmFsdWUsIHByb3BzKSwgLi4uIHtwazogdGhpcy5wa319KTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgfVxufVxuXG4iLCJcbkBpZihzaG93UmVmcmVzaGVyKSB7XG4gIDxpb24tcmVmcmVzaGVyIHNsb3Q9XCJmaXhlZFwiIFtwdWxsRmFjdG9yXT1cIjFcIiBbcHVsbE1pbl09XCIxMDBcIiBbcHVsbE1heF09XCIyMDBcIiAoaW9uUmVmcmVzaCk9XCJoYW5kbGVSZWZyZXNoKCRldmVudClcIj5cbiAgICA8aW9uLXJlZnJlc2hlci1jb250ZW50IC8+XG4gIDwvaW9uLXJlZnJlc2hlcj5cbn1cblxuQGlmKHNob3dTZWFyY2hiYXIpIHtcbiAgQGlmKG1vZGVsICYmIGVuYWJsZUZpbHRlcikge1xuICAgIDxuZ3gtZGVjYWYtZmlsdGVyXG4gICAgICBbbW9kZWxdPVwibW9kZWxcIlxuICAgICAgW3NvcnREaXJlY3Rpb25dPVwic29ydERpcmVjdGlvblwiXG4gICAgICBbZGlzYWJsZVNvcnRdPVwiZGlzYWJsZVNvcnRcIlxuICAgICAgKGZpbHRlckV2ZW50KT1cImhhbmRsZUZpbHRlcigkZXZlbnQpXCJcbiAgICAgIChzZWFyY2hFdmVudCk9XCJoYW5kbGVTZWFyY2goJGV2ZW50KVwiXG4gICAgLz5cbiAgfSBAZWxzZSB7XG4gICAgPG5neC1kZWNhZi1zZWFyY2hiYXIgW2VtaXRFdmVudFRvV2luZG93XT1cImZhbHNlXCIgW2RlYm91bmNlXT1cIjUwMFwiIChzZWFyY2hFdmVudCk9XCJoYW5kbGVTZWFyY2goJGV2ZW50KVwiIC8+XG4gIH1cbn1cblxuQGlmKGRhdGE/Lmxlbmd0aCkge1xuICA8aW9uLWxpc3QgW2lkXT1cInVpZFwiIFtpbnNldF09XCJpbnNldFwiIFtsaW5lc109XCJsaW5lc1wiICNjb21wb25lbnQ+XG4gICAgQGlmKGl0ZW0/LnRhZykge1xuICAgICAgQGZvcihjaGlsZCBvZiBpdGVtczsgdHJhY2sgdHJhY2tJdGVtRm4oJGluZGV4LCBjaGlsZCkpIHtcbiAgICAgICAgPG5neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXJcbiAgICAgICAgICBbdGFnXT1cIml0ZW0udGFnXCJcbiAgICAgICAgICAobGlzdGVuRXZlbnQpPVwiaGFuZGxlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgW2dsb2JhbHNdPSd7XG4gICAgICAgICAgICBpdGVtOiBjaGlsZCxcbiAgICAgICAgICAgIG1hcHBlcjogbWFwcGVyLFxuICAgICAgICAgICAgcm91dGU6IHJvdXRlXG4gICAgICAgICAgfSc+XG4gICAgICAgICAgPC9uZ3gtZGVjYWYtY29tcG9uZW50LXJlbmRlcmVyPlxuICAgICAgICB9XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgfVxuICA8L2lvbi1saXN0PlxuXG4gIEBpZihsb2FkTW9yZURhdGEpIHtcbiAgICBAaWYocGFnZXMgPiAwICYmIHR5cGUgPT09ICdwYWdpbmF0ZWQnICYmICFzZWFyY2hWYWx1ZT8ubGVuZ3RoKSB7XG4gICAgICA8bmd4LWRlY2FmLXBhZ2luYXRpb25cbiAgICAgICAgW3RvdGFsUGFnZXNdPVwicGFnZXNcIlxuICAgICAgICBbY3VycmVudF09XCJwYWdlXCJcbiAgICAgICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlUGFnaW5hdGUoJGV2ZW50KVwiXG4gICAgICAvPlxuXG4gICAgfSBAZWxzZSB7XG4gICAgICA8aW9uLWluZmluaXRlLXNjcm9sbFxuICAgICAgICBbY2xhc3NdPVwic2VhcmNoVmFsdWU/Lmxlbmd0aCA/ICdkY2YtaGlkZGVuJyA6ICcnXCJcbiAgICAgICAgW3Bvc2l0aW9uXT1cInNjcm9sbFBvc2l0aW9uXCJcbiAgICAgICAgW3RocmVzaG9sZF09XCJzY3JvbGxUaHJlc2hvbGRcIlxuICAgICAgICAoaW9uSW5maW5pdGUpPVwiaGFuZGxlUmVmcmVzaCgkZXZlbnQpXCI+XG4gICAgICAgIDxpb24taW5maW5pdGUtc2Nyb2xsLWNvbnRlbnQgW2xvYWRpbmdTcGlubmVyXT1cImxvYWRpbmdTcGlubmVyXCIgW2xvYWRpbmdUZXh0XT1cImxvYWRpbmdUZXh0XCIgLz5cbiAgICAgIDwvaW9uLWluZmluaXRlLXNjcm9sbD5cbiAgICB9XG4gIH1cbn0gQGVsc2Uge1xuICBAaWYocmVmcmVzaGluZykge1xuICAgIEBmb3Ioc2tsIG9mIHNrZWxldG9uRGF0YTsgdHJhY2sgc2tsKSB7XG4gICAgICA8aW9uLWl0ZW0+XG4gICAgICAgIDxpb24tdGh1bWJuYWlsIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgIDwvaW9uLXRodW1ibmFpbD5cbiAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImRhdGVcIiBzdHlsZT1cIndpZHRoOiAyMCU7XCI+PGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCI+PC9pb24tc2tlbGV0b24tdGV4dD48L2lvbi10ZXh0PlxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgfVxuXG4gIH0gQGVsc2Uge1xuICAgIEBpZighc2VhcmNoVmFsdWU/Lmxlbmd0aCkge1xuICAgICAgPG5neC1kZWNhZi1lbXB0eS1zdGF0ZVxuICAgICAgICBbdGl0bGVdPVwiKGxvY2FsZSArICcuJysgZW1wdHkudGl0bGUpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3N1YnRpdGxlXT1cIihsb2NhbGUgKyAnLicrIGVtcHR5LnN1YnRpdGxlKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtidXR0b25UZXh0XT1cImVtcHR5LnNob3dCdXR0b24gPyAobG9jYWxlICsgJy4nKyBlbXB0eS5idXR0b24gfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICBbYnV0dG9uTGlua109XCJlbXB0eS5zaG93QnV0dG9uID8gZW1wdHkucm91dGUgOiAnJ1wiXG4gICAgICAvPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5neC1kZWNhZi1lbXB0eS1zdGF0ZVxuICAgICAgICBpY29uPVwic2VhcmNoLW91dGxpbmVcIlxuICAgICAgICBuZ0NsYXNzPVwiZW1wdHktc2VhcmNoXCJcbiAgICAgICAgW3RyYW5zbGF0YWJsZV09XCJ0cnVlXCJcbiAgICAgICAgdGl0bGU9XCJzZWFyY2gudGl0bGVcIlxuICAgICAgICBzdWJ0aXRsZT1cInNlYXJjaC5zdWJ0aXRsZVwiXG4gICAgICAgIFtzZWFyY2hWYWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAvPlxuICAgIH1cbiAgfVxufVxuXG4iXX0=
|
|
1232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGlzdC9saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9saXN0L2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXpHLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLE9BQU8sRUFDUCxZQUFZLEVBQ1osVUFBVSxFQUNYLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBWSxjQUFjLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBRUwsT0FBTyxFQUNQLGNBQWMsRUFDZCxrQkFBa0IsRUFLbkIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxD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TztzQkFEWixZQUFZO3VCQUFDLHFDQUFxQyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3kgIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50LCBSZWZyZXNoZXJDdXN0b21FdmVudCwgU3Bpbm5lclR5cGVzIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtcbiAgSW9uSW5maW5pdGVTY3JvbGwsXG4gIElvbkluZmluaXRlU2Nyb2xsQ29udGVudCxcbiAgSW9uSXRlbSxcbiAgSW9uTGFiZWwsXG4gIElvbkxpc3QsXG4gIElvblJlZnJlc2hlcixcbiAgSW9uUmVmcmVzaGVyQ29udGVudCxcbiAgSW9uU2tlbGV0b25UZXh0LFxuICBJb25UZXh0LFxuICBJb25UaHVtYm5haWwsXG4gIElvbkxvYWRpbmdcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBNb2RlbCwgUHJpbWl0aXZlcyB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBDb25kaXRpb24sIE9ic2VydmVyLCBPcmRlckRpcmVjdGlvbiwgUGFnaW5hdG9yIH0gZnJvbSAnQGRlY2FmLXRzL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmFzZUN1c3RvbUV2ZW50LFxuICBEeW5hbWljLFxuICBFdmVudENvbnN0YW50cyxcbiAgQ29tcG9uZW50c1RhZ05hbWVzLFxuICBSZW5kZXJlckN1c3RvbUV2ZW50LFxuICBTdHJpbmdPckJvb2xlYW4sXG4gIEtleVZhbHVlLFxuICBMaXN0SXRlbUN1c3RvbUV2ZW50XG59IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBOZ3hCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL05neEJhc2VDb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgc3RyaW5nVG9Cb29sZWFuLFxuICBmb3JtYXREYXRlLFxuICBpc1ZhbGlkRGF0ZVxufSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IFNlYXJjaGJhckNvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaGJhci9zZWFyY2hiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9saXN0LWl0ZW0vbGlzdC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1yZW5kZXJlci9jb21wb25lbnQtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRpb25DdXN0b21FdmVudCB9IGZyb20gJy4uL3BhZ2luYXRpb24vY29uc3RhbnRzJztcbmltcG9ydCB7IElMaXN0RW1wdHlSZXN1bHQsIExpc3RDb21wb25lbnRzVHlwZXMsIERlY2FmUmVwb3NpdG9yeSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEZ1bmN0aW9uTGlrZSwgSUZpbHRlclF1ZXJ5LCBJRmlsdGVyUXVlcnlJdGVtIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4uL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSB2ZXJzYXRpbGUgbGlzdCBjb21wb25lbnQgdGhhdCBzdXBwb3J0cyB2YXJpb3VzIGRhdGEgZGlzcGxheSBtb2Rlcy5cbiAqIEBzdW1tYXJ5IFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZmxleGlibGUgd2F5IHRvIGRpc3BsYXkgbGlzdHMgb2YgZGF0YSB3aXRoIHN1cHBvcnRcbiAqIGZvciBpbmZpbml0ZSBzY3JvbGxpbmcsIHBhZ2luYXRpb24sIHNlYXJjaGluZywgYW5kIGN1c3RvbSBpdGVtIHJlbmRlcmluZy4gSXQgY2FuIGZldGNoXG4gKiBkYXRhIGZyb20gdmFyaW91cyBzb3VyY2VzIGluY2x1ZGluZyBtb2RlbHMsIGZ1bmN0aW9ucywgb3IgZGlyZWN0IGRhdGEgaW5wdXQuXG4gKlxuICogVGhlIGNvbXBvbmVudCBzdXBwb3J0cyB0d28gbWFpbiBkaXNwbGF5IHR5cGVzOlxuICogMS4gSW5maW5pdGUgc2Nyb2xsaW5nIC0gTG9hZHMgbW9yZSBkYXRhIGFzIHRoZSB1c2VyIHNjcm9sbHNcbiAqIDIuIFBhZ2luYXRpb24gLSBEaXNwbGF5cyBkYXRhIGluIHBhZ2VzIHdpdGggbmF2aWdhdGlvbiBjb250cm9sc1xuICpcbiAqIEFkZGl0aW9uYWwgZmVhdHVyZXMgaW5jbHVkZTpcbiAqIC0gUHVsbC10by1yZWZyZXNoIGZ1bmN0aW9uYWxpdHlcbiAqIC0gU2VhcmNoIGZpbHRlcmluZ1xuICogLSBFbXB0eSBzdGF0ZSBjdXN0b21pemF0aW9uXG4gKiAtIEN1c3RvbSBpdGVtIHJlbmRlcmluZ1xuICogLSBFdmVudCBlbWlzc2lvbiBmb3IgaW50ZXJhY3Rpb25zXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAqICAgcGFydGljaXBhbnQgTCBhcyBMaXN0Q29tcG9uZW50XG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGF0YSBTb3VyY2VcbiAqICAgcGFydGljaXBhbnQgRSBhcyBFeHRlcm5hbCBDb21wb25lbnRzXG4gKlxuICogICBVLT4+TDogSW5pdGlhbGl6ZSBjb21wb25lbnRcbiAqICAgTC0+Pkw6IG5nT25Jbml0KClcbiAqICAgTC0+PkQ6IFJlcXVlc3QgaW5pdGlhbCBkYXRhXG4gKiAgIEQtLT4+TDogUmV0dXJuIGRhdGFcbiAqICAgTC0+Pkw6IFByb2Nlc3MgYW5kIGRpc3BsYXkgZGF0YVxuICpcbiAqICAgYWx0IFVzZXIgc2Nyb2xscyAoSW5maW5pdGUgbW9kZSlcbiAqICAgICBVLT4+TDogU2Nyb2xsIHRvIGJvdHRvbVxuICogICAgIEwtPj5EOiBSZXF1ZXN0IG1vcmUgZGF0YVxuICogICAgIEQtLT4+TDogUmV0dXJuIGFkZGl0aW9uYWwgZGF0YVxuICogICAgIEwtPj5MOiBBcHBlbmQgdG8gZXhpc3RpbmcgZGF0YVxuICogICBlbHNlIFVzZXIgY2hhbmdlcyBwYWdlIChQYWdpbmF0ZWQgbW9kZSlcbiAqICAgICBVLT4+TDogQ2xpY2sgcGFnZSBudW1iZXJcbiAqICAgICBMLT4+TDogaGFuZGxlUGFnaW5hdGUoKVxuICogICAgIEwtPj5EOiBSZXF1ZXN0IGRhdGEgZm9yIHBhZ2VcbiAqICAgICBELS0+Pkw6IFJldHVybiBwYWdlIGRhdGFcbiAqICAgICBMLT4+TDogUmVwbGFjZSBkaXNwbGF5ZWQgZGF0YVxuICogICBlbmRcbiAqXG4gKiAgIGFsdCBVc2VyIHNlYXJjaGVzXG4gKiAgICAgVS0+Pkw6IEVudGVyIHNlYXJjaCB0ZXJtXG4gKiAgICAgTC0+Pkw6IGhhbmRsZVNlYXJjaCgpXG4gKiAgICAgTC0+PkQ6IEZpbHRlciBkYXRhIGJ5IHNlYXJjaCB0ZXJtXG4gKiAgICAgRC0tPj5MOiBSZXR1cm4gZmlsdGVyZWQgZGF0YVxuICogICAgIEwtPj5MOiBVcGRhdGUgZGlzcGxheWVkIGRhdGFcbiAqICAgZW5kXG4gKlxuICogICBhbHQgVXNlciBjbGlja3MgaXRlbVxuICogICAgIFUtPj5MOiBDbGljayBsaXN0IGl0ZW1cbiAqICAgICBMLT4+TDogaGFuZGxlQ2xpY2soKVxuICogICAgIEwtPj5FOiBFbWl0IGNsaWNrRXZlbnRcbiAqICAgZW5kXG4gKlxuICogQGV4YW1wbGVcbiAqIDxuZ3gtZGVjYWYtbGlzdFxuICogICBbc291cmNlXT1cImRhdGFTb3VyY2VcIlxuICogICBbbGltaXRdPVwiMTBcIlxuICogICBbdHlwZV09XCInaW5maW5pdGUnXCJcbiAqICAgW3Nob3dTZWFyY2hiYXJdPVwidHJ1ZVwiXG4gKiAgIChjbGlja0V2ZW50KT1cImhhbmRsZUl0ZW1DbGljaygkZXZlbnQpXCJcbiAqICAgKHJlZnJlc2hFdmVudCk9XCJoYW5kbGVSZWZyZXNoKCRldmVudClcIj5cbiAqIDwvbmd4LWRlY2FmLWxpc3Q+XG4gKlxuICogQGV4dGVuZHMge05neEJhc2VDb21wb25lbnR9XG4gKiBAaW1wbGVtZW50cyB7T25Jbml0fVxuICovXG5ARHluYW1pYygpXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZGVjYWYtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlUGlwZSxcbiAgICBJb25SZWZyZXNoZXIsXG4gICAgSW9uTG9hZGluZyxcbiAgICBQYWdpbmF0aW9uQ29tcG9uZW50LFxuICAgIElvbkxpc3QsXG4gICAgSW9uSXRlbSxcbiAgICBJb25UaHVtYm5haWwsXG4gICAgSW9uU2tlbGV0b25UZXh0LFxuICAgIElvbkxhYmVsLFxuICAgIElvblRleHQsXG4gICAgSW9uUmVmcmVzaGVyQ29udGVudCxcbiAgICBJb25JbmZpbml0ZVNjcm9sbCxcbiAgICBJb25JbmZpbml0ZVNjcm9sbENvbnRlbnQsXG4gICAgSW9uVGh1bWJuYWlsLFxuICAgIElvblNrZWxldG9uVGV4dCxcbiAgICBTZWFyY2hiYXJDb21wb25lbnQsXG4gICAgRW1wdHlTdGF0ZUNvbXBvbmVudCxcbiAgICBMaXN0SXRlbUNvbXBvbmVudCxcbiAgICBGaWx0ZXJDb21wb25lbnQsXG4gICAgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaXN0Q29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkaXNwbGF5IG1vZGUgZm9yIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBob3cgdGhlIGxpc3QgZGF0YSBpcyBsb2FkZWQgYW5kIGRpc3BsYXllZC4gT3B0aW9ucyBpbmNsdWRlOlxuICAgKiAtIElORklOSVRFOiBMb2FkcyBtb3JlIGRhdGEgYXMgdGhlIHVzZXIgc2Nyb2xscyAoaW5maW5pdGUgc2Nyb2xsaW5nKVxuICAgKiAtIFBBR0lOQVRFRDogRGlzcGxheXMgZGF0YSBpbiBwYWdlcyB3aXRoIG5hdmlnYXRpb24gY29udHJvbHNcbiAgICpcbiAgICogQHR5cGUge0xpc3RDb21wb25lbnRzVHlwZXN9XG4gICAqIEBkZWZhdWx0IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHR5cGU6IExpc3RDb21wb25lbnRzVHlwZXMgPSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgY29tcG9uZW50IHVzZXMgdHJhbnNsYXRpb24gc2VydmljZXMuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBjb21wb25lbnQgd2lsbCBhdHRlbXB0IHRvIHVzZSB0cmFuc2xhdGlvbiBzZXJ2aWNlc1xuICAgKiBmb3IgYW55IHRleHQgY29udGVudC4gVGhpcyBhbGxvd3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uIG9mIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgdHJhbnNsYXRhYmxlOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHNlYXJjaCBiYXIuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIGRpc3BsYXlzIGEgc2VhcmNoIGJhciBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0IHRoYXQgYWxsb3dzXG4gICAqIHVzZXJzIHRvIGZpbHRlciB0aGUgbGlzdCBpdGVtcy4gVGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5IHdvcmtzIGJ5IGZpbHRlcmluZyB0aGVcbiAgICogZXhpc3RpbmcgZGF0YSBvciBieSB0cmlnZ2VyaW5nIGEgbmV3IGRhdGEgZmV0Y2ggd2l0aCBzZWFyY2ggcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc2hvd1NlYXJjaGJhcjogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERpcmVjdCBkYXRhIGlucHV0IGZvciB0aGUgbGlzdCBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgd2F5IHRvIGRpcmVjdGx5IHBhc3MgZGF0YSB0byB0aGUgbGlzdCBjb21wb25lbnQgaW5zdGVhZCBvZlxuICAgKiBmZXRjaGluZyBpdCBmcm9tIGEgc291cmNlLiBXaGVuIGJvdGggZGF0YSBhbmQgc291cmNlIGFyZSBwcm92aWRlZCwgdGhlIGNvbXBvbmVudFxuICAgKiB3aWxsIHVzZSB0aGUgc291cmNlIHRvIGZldGNoIGRhdGEgb25seSBpZiB0aGUgZGF0YSBhcnJheSBpcyBlbXB0eS5cbiAgICpcbiAgICogQHR5cGUge0tleVZhbHVlW10gfCB1bmRlZmluZWR9XG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZGF0YT86IEtleVZhbHVlW10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXJlIHRoZSBsaXN0IHNob3VsZCBmZXRjaCBpdHMgZGF0YSBmcm9tLiBUaGlzIGNhbiBiZSBlaXRoZXI6XG4gICAqIC0gQSBzdHJpbmcgVVJMIG9yIGVuZHBvaW50IGlkZW50aWZpZXJcbiAgICogLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBkYXRhIHdoZW4gY2FsbGVkXG4gICAqIFRoZSBjb21wb25lbnQgd2lsbCBjYWxsIHRoaXMgc291cmNlIHdoZW4gaXQgbmVlZHMgdG8gbG9hZCBvciByZWZyZXNoIGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBGdW5jdGlvbkxpa2V9XG4gICAqIEByZXF1aXJlZFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc291cmNlITogc3RyaW5nIHwgRnVuY3Rpb25MaWtlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0YXJ0aW5nIGluZGV4IGZvciBkYXRhIGZldGNoaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGluZGV4IGZyb20gd2hpY2ggdG8gc3RhcnQgZmV0Y2hpbmcgZGF0YS4gVGhpcyBpcyB1c2VkXG4gICAqIGZvciBwYWdpbmF0aW9uIGFuZCBpbmZpbml0ZSBzY3JvbGxpbmcgdG8gZGV0ZXJtaW5lIHdoaWNoIHN1YnNldCBvZiBkYXRhIHRvIGxvYWQuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDBcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHN0YXJ0OiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG51bWJlciBvZiBpdGVtcyB0byBmZXRjaCBwZXIgcGFnZSBvciBsb2FkIG9wZXJhdGlvbi5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBob3cgbWFueSBpdGVtcyBhcmUgbG9hZGVkIGF0IG9uY2UgZHVyaW5nIHBhZ2luYXRpb24gb3JcbiAgICogaW5maW5pdGUgc2Nyb2xsaW5nLiBUaGlzIGFmZmVjdHMgdGhlIHNpemUgb2YgZGF0YSBjaHVua3MgcmVxdWVzdGVkIGZyb20gdGhlIHNvdXJjZS5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMTBcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxpbWl0OiBudW1iZXIgPSAxMDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgbW9yZSBkYXRhIGNhbiBiZSBsb2FkZWQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBjb21wb25lbnQgd2lsbCBhbGxvdyBsb2FkaW5nIGFkZGl0aW9uYWwgZGF0YVxuICAgKiB0aHJvdWdoIGluZmluaXRlIHNjcm9sbGluZyBvciBwYWdpbmF0aW9uLiBXaGVuIGZhbHNlLCB0aGUgY29tcG9uZW50IHdpbGwgbm90XG4gICAqIGF0dGVtcHQgdG8gbG9hZCBtb3JlIGRhdGEgYmV5b25kIHdoYXQgaXMgaW5pdGlhbGx5IGRpc3BsYXllZC5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbG9hZE1vcmVEYXRhOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc3R5bGUgb2YgZGl2aWRpbmcgbGluZXMgYmV0d2VlbiBsaXN0IGl0ZW1zLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGhvdyBkaXZpZGluZyBsaW5lcyBhcHBlYXIgYmV0d2VlbiBsaXN0IGl0ZW1zLiBPcHRpb25zIGluY2x1ZGU6XG4gICAqIC0gXCJpbnNldFwiOiBMaW5lcyBhcmUgaW5zZXQgZnJvbSB0aGUgZWRnZXNcbiAgICogLSBcImZ1bGxcIjogTGluZXMgZXh0ZW5kIHRoZSBmdWxsIHdpZHRoXG4gICAqIC0gXCJub25lXCI6IE5vIGRpdmlkaW5nIGxpbmVzXG4gICAqXG4gICAqIEB0eXBlIHtcImluc2V0XCIgfCBcImZ1bGxcIiB8IFwibm9uZVwifVxuICAgKiBAZGVmYXVsdCBcImZ1bGxcIlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbGluZXM6IFwiaW5zZXRcIiB8IFwiZnVsbFwiIHwgXCJub25lXCIgPSBcImZ1bGxcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgdGhlIGxpc3QgaGFzIGluc2V0IHN0eWxpbmcuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBsaXN0IHdpbGwgaGF2ZSBpbnNldCBzdHlsaW5nIHdpdGggcm91bmRlZCBjb3JuZXJzXG4gICAqIGFuZCBtYXJnaW4gYXJvdW5kIHRoZSBlZGdlcy4gVGhpcyBjcmVhdGVzIGEgY2FyZC1saWtlIGFwcGVhcmFuY2UgZm9yIHRoZSBsaXN0LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgaW5zZXQ6IFN0cmluZ09yQm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHRocmVzaG9sZCBmb3IgdHJpZ2dlcmluZyBpbmZpbml0ZSBzY3JvbGwgbG9hZGluZy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBjbG9zZSB0byB0aGUgYm90dG9tIG9mIHRoZSBsaXN0IHRoZSB1c2VyIG11c3Qgc2Nyb2xsXG4gICAqIGJlZm9yZSB0aGUgY29tcG9uZW50IHRyaWdnZXJzIGxvYWRpbmcgb2YgYWRkaXRpb25hbCBkYXRhLiBUaGlzIGlzIGV4cHJlc3NlZFxuICAgKiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGxpc3QgaGVpZ2h0LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBcIjE1JVwiXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzY3JvbGxUaHJlc2hvbGQ6IHN0cmluZyA9IFwiMTUlXCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcG9zaXRpb24gd2hlcmUgbmV3IGl0ZW1zIGFyZSBhZGRlZCBkdXJpbmcgaW5maW5pdGUgc2Nyb2xsaW5nLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoZXRoZXIgbmV3IGl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgbGlzdFxuICAgKiB3aGVuIGxvYWRpbmcgbW9yZSBkYXRhIHRocm91Z2ggaW5maW5pdGUgc2Nyb2xsaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7XCJib3R0b21cIiB8IFwidG9wXCJ9XG4gICAqIEBkZWZhdWx0IFwiYm90dG9tXCJcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNjcm9sbFBvc2l0aW9uOiBcImJvdHRvbVwiIHwgXCJ0b3BcIiA9IFwiYm90dG9tXCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXN0b20gdGV4dCB0byBkaXNwbGF5IGR1cmluZyBsb2FkaW5nIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgdGV4dCBzaG93biBpbiB0aGUgbG9hZGluZyBpbmRpY2F0b3Igd2hlbiB0aGUgY29tcG9uZW50XG4gICAqIGlzIGZldGNoaW5nIGRhdGEuIElmIG5vdCBwcm92aWRlZCwgYSBkZWZhdWx0IGxvYWRpbmcgbWVzc2FnZSB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsb2FkaW5nVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBwdWxsLXRvLXJlZnJlc2ggZmVhdHVyZS5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZW5hYmxlcyB0aGUgcHVsbC10by1yZWZyZXNoIGZ1bmN0aW9uYWxpdHkgdGhhdCBhbGxvd3NcbiAgICogdXNlcnMgdG8gcmVmcmVzaCB0aGUgbGlzdCBkYXRhIGJ5IHB1bGxpbmcgZG93biBmcm9tIHRoZSB0b3Agb2YgdGhlIGxpc3QuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNob3dSZWZyZXNoZXI6IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdHlwZSBvZiBzcGlubmVyIHRvIGRpc3BsYXkgZHVyaW5nIGxvYWRpbmcgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIGxvYWRpbmcgc3Bpbm5lciBzaG93biBkdXJpbmcgZGF0YVxuICAgKiBmZXRjaGluZyBvcGVyYXRpb25zLiBVc2VzIElvbmljJ3MgcHJlZGVmaW5lZCBzcGlubmVyIHR5cGVzLlxuICAgKlxuICAgKiBAdHlwZSB7U3Bpbm5lclR5cGVzfVxuICAgKiBAZGVmYXVsdCBcImNpcmN1bGFyXCJcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmdTcGlubmVyOiBTcGlubmVyVHlwZXMgPSBcImNpcmN1bGFyXCI7XG5cbiAgLy8gLyoqXG4gIC8vICAqIEBkZXNjcmlwdGlvbiBRdWVyeSBwYXJhbWV0ZXJzIGZvciBkYXRhIGZldGNoaW5nLlxuICAvLyAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgYWRkaXRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZldGNoaW5nIGRhdGEgZnJvbVxuICAvLyAgKiB0aGUgc291cmNlLiBUaGlzIGNhbiBiZSBwcm92aWRlZCBhcyBhIHN0cmluZyAoSlNPTikgb3IgYSBkaXJlY3Qgb2JqZWN0LlxuICAvLyAgKlxuICAvLyAgKiBAdHlwZSB7c3RyaW5nIHwgS2V5VmFsdWUgfCB1bmRlZmluZWR9XG4gIC8vICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gIC8vICAqL1xuICAvLyBASW5wdXQoKVxuICAvLyBxdWVyeT86IHN0cmluZyB8IEtleVZhbHVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgZmlsdGVyaW5nIGZ1bmN0aW9uYWxpdHkgaXMgZW5hYmxlZC5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZW5hYmxlcyB0aGUgZmlsdGVyIGNvbXBvbmVudCB0aGF0IGFsbG93cyB1c2VycyB0byBjcmVhdGVcbiAgICogY29tcGxleCBzZWFyY2ggY3JpdGVyaWEgd2l0aCBtdWx0aXBsZSBmaWVsZCBmaWx0ZXJzLCBjb25kaXRpb25zLCBhbmQgdmFsdWVzLlxuICAgKiBXaGVuIGZhbHNlLCBkaXNhYmxlcyB0aGUgZmlsdGVyIGludGVyZmFjZSBlbnRpcmVseS5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZW5hYmxlRmlsdGVyOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU29ydGluZyBwYXJhbWV0ZXJzIGZvciBkYXRhIGZldGNoaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IHRoZSBmZXRjaGVkIGRhdGEgc2hvdWxkIGJlIHNvcnRlZC4gVGhpcyBjYW4gYmUgcHJvdmlkZWRcbiAgICogYXMgYSBzdHJpbmcgKGZpZWxkIG5hbWUgd2l0aCBvcHRpb25hbCBkaXJlY3Rpb24pIG9yIGEgZGlyZWN0IG9iamVjdC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IEtleVZhbHVlIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc29ydERpcmVjdGlvbjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5EU0M7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNvcnRpbmcgcGFyYW1ldGVycyBmb3IgZGF0YSBmZXRjaGluZy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyB0aGUgZmV0Y2hlZCBkYXRhIHNob3VsZCBiZSBzb3J0ZWQuIFRoaXMgY2FuIGJlIHByb3ZpZGVkXG4gICAqIGFzIGEgc3RyaW5nIChmaWVsZCBuYW1lIHdpdGggb3B0aW9uYWwgZGlyZWN0aW9uKSBvciBhIGRpcmVjdCBvYmplY3QuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBLZXlWYWx1ZSB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNvcnRCeSE6IHN0cmluZztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciBzb3J0aW5nIGZ1bmN0aW9uYWxpdHkgaXMgZGlzYWJsZWQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIGRpc2FibGVzIHRoZSBzb3J0IGNvbnRyb2xzIGFuZCBwcmV2ZW50cyB1c2VycyBmcm9tXG4gICAqIGNoYW5naW5nIHRoZSBzb3J0IG9yZGVyIG9yIGZpZWxkLiBUaGUgbGlzdCB3aWxsIG1haW50YWluIGl0cyBkZWZhdWx0IG9yXG4gICAqIHByb2dyYW1tYXRpY2FsbHkgc2V0IHNvcnQgY29uZmlndXJhdGlvbiB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBkaXNhYmxlU29ydDogU3RyaW5nT3JCb29sZWFuID0gZmFsc2U7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEljb24gdG8gZGlzcGxheSB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5LlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGljb24gc2hvd24gaW4gdGhlIGVtcHR5IHN0YXRlIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUuXG4gICAqIFRoaXMgY2FuIGJlIGFueSBpY29uIG5hbWUgc3VwcG9ydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbidzIGljb24gc3lzdGVtLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAZGVmYXVsdCAndGktZGF0YWJhc2UtZXhjbGFtYXRpb24nXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBlbXB0eUljb24/OiBzdHJpbmcgPSAndGktZGF0YWJhc2UtZXhjbGFtYXRpb24nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmb3IgdGhlIGVtcHR5IHN0YXRlIGRpc3BsYXkuXG4gICAqIEBzdW1tYXJ5IEN1c3RvbWl6ZXMgaG93IHRoZSBlbXB0eSBzdGF0ZSBpcyBkaXNwbGF5ZWQgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICogVGhpcyBpbmNsdWRlcyB0aGUgdGl0bGUsIHN1YnRpdGxlLCBidXR0b24gdGV4dCwgaWNvbiwgYW5kIG5hdmlnYXRpb24gbGluay5cbiAgICpcbiAgICogQHR5cGUge1BhcnRpYWw8SUxpc3RFbXB0eVJlc3VsdD59XG4gICAqIEBkZWZhdWx0IHtcbiAgICogICB0aXRsZTogJ2VtcHR5LnRpdGxlJyxcbiAgICogICBzdWJ0aXRsZTogJ2VtcHR5LnN1YnRpdGxlJyxcbiAgICogICBzaG93QnV0dG9uOiBmYWxzZSxcbiAgICogICBpY29uOiAnYWxlcnQtY2lyY2xlLW91dGxpbmUnLFxuICAgKiAgIGJ1dHRvblRleHQ6ICdsb2NhbGUuZW1wdHkuYnV0dG9uJyxcbiAgICogICBsaW5rOiAnJ1xuICAgKiB9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBlbXB0eTogUGFydGlhbDxJTGlzdEVtcHR5UmVzdWx0PiA9IHtcbiAgICB0aXRsZTogJ2VtcHR5LnRpdGxlJyxcbiAgICBzdWJ0aXRsZTogJ2VtcHR5LnN1YnRpdGxlJyxcbiAgICBzaG93QnV0dG9uOiBmYWxzZSxcbiAgICBpY29uOiAnYWxlcnQtY2lyY2xlLW91dGxpbmUnLFxuICAgIGJ1dHRvblRleHQ6ICdsb2NhbGUuZW1wdHkuYnV0dG9uJyxcbiAgICBsaW5rOiAnJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY3VycmVudCBwYWdlIG51bWJlciBpbiBwYWdpbmF0ZWQgbW9kZS5cbiAgICogQHN1bW1hcnkgVHJhY2tzIHdoaWNoIHBhZ2UgaXMgY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZCB3aGVuIHRoZSBjb21wb25lbnRcbiAgICogaXMgaW4gcGFnaW5hdGVkIG1vZGUuIFRoaXMgaXMgdXNlZCBmb3IgcGFnaW5hdGlvbiBjb250cm9scyBhbmQgZGF0YSBmZXRjaGluZy5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcGFnZTogbnVtYmVyID0gMTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGNhbGN1bGF0ZWQgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGJhc2VkIG9uIHRoZSBkYXRhIHNpemVcbiAgICogYW5kIGxpbWl0LiBUaGlzIGlzIHVzZWQgZm9yIHBhZ2luYXRpb24gY29udHJvbHMgYW5kIGJvdW5kYXJ5IGNoZWNraW5nLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcGFnZXMhOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRpY2F0ZXMgd2hldGhlciBhIHJlZnJlc2ggb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLlxuICAgKiBAc3VtbWFyeSBXaGVuIHRydWUsIHRoZSBjb21wb25lbnQgaXMgY3VycmVudGx5IGZldGNoaW5nIG5ldyBkYXRhLiBUaGlzIGlzIHVzZWRcbiAgICogdG8gY29udHJvbCBsb2FkaW5nIGluZGljYXRvcnMgYW5kIHByZXZlbnQgZHVwbGljYXRlIHJlZnJlc2ggb3BlcmF0aW9ucyBmcm9tXG4gICAqIGJlaW5nIHRyaWdnZXJlZCBzaW11bHRhbmVvdXNseS5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICByZWZyZXNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSB1c2VkIGZvciByZW5kZXJpbmcgc2tlbGV0b24gbG9hZGluZyBwbGFjZWhvbGRlcnMuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIHBsYWNlaG9sZGVyIGl0ZW1zIHRoYXQgYXJlIGRpc3BsYXllZCBkdXJpbmcgZGF0YSBsb2FkaW5nLlxuICAgKiBUaGUgbGVuZ3RoIG9mIHRoaXMgYXJyYXkgZGV0ZXJtaW5lcyBob3cgbWFueSBza2VsZXRvbiBpdGVtcyBhcmUgc2hvd24uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmdbXX1cbiAgICogQGRlZmF1bHQgbmV3IEFycmF5KDIpXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBza2VsZXRvbkRhdGE6IHN0cmluZ1tdID0gbmV3IEFycmF5KDIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHByb2Nlc3NlZCBsaXN0IGl0ZW1zIHJlYWR5IGZvciBkaXNwbGF5LlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgc2V0IG9mIGl0ZW1zIGJlaW5nIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBhZnRlclxuICAgKiBwcm9jZXNzaW5nIGZyb20gdGhlIHJhdyBkYXRhIHNvdXJjZS4gVGhpcyBtYXkgYmUgYSBzdWJzZXQgb2YgdGhlIGZ1bGwgZGF0YVxuICAgKiB3aGVuIHVzaW5nIHBhZ2luYXRpb24gb3IgaW5maW5pdGUgc2Nyb2xsaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7S2V5VmFsdWVbXX1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGl0ZW1zITogS2V5VmFsdWVbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50IHNlYXJjaCBxdWVyeSB2YWx1ZS5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhlIHNlYXJjaCBiYXIuIFRoaXMgaXMgdXNlZCB0byBmaWx0ZXJcbiAgICogdGhlIGxpc3QgZGF0YSBvciB0byBzZW5kIGFzIGEgc2VhcmNoIHBhcmFtZXRlciB3aGVuIGZldGNoaW5nIG5ldyBkYXRhLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgc2VhcmNoVmFsdWU/OiBzdHJpbmcgfCBJRmlsdGVyUXVlcnkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBIHBhZ2luYXRvciBvYmplY3QgZm9yIGhhbmRsaW5nIHBhZ2luYXRpb24gb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBwYWdpbmF0b3Igb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYW5kIG5hdmlnYXRlXG4gICAqIHRocm91Z2ggZGF0YSBpbiBjaHVua3MsIHJlZHVjaW5nIG1lbW9yeSB1c2FnZSBhbmQgaW1wcm92aW5nIHBlcmZvcm1hbmNlLlxuICAgKlxuICAgKiBUaGUgcGFnaW5hdG9yIG9iamVjdCBpcyBpbml0aWFsaXplZCBpbiB0aGUgYG5nT25Jbml0YCBsaWZlY3ljbGUgaG9vayBhbmQgaXNcbiAgICogdXNlZCB0byBmZXRjaCBhbmQgZGlzcGxheSBkYXRhIGluIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudC4gSXQgaXMgYW4gaW5zdGFuY2VcbiAgICogb2YgdGhlIGBQYWdpbmF0b3JgIGNsYXNzIGZyb20gdGhlIGBAZGVjYWYtdHMvY29yZWAgcGFja2FnZSwgd2hpY2ggcHJvdmlkZXNcbiAgICogbWV0aG9kcyBmb3IgcXVlcnlpbmcgYW5kIG1hbmlwdWxhdGluZyBwYWdpbmF0ZWQgZGF0YS5cbiAgICpcbiAgICogQHR5cGUge1BhZ2luYXRvcjxNb2RlbD59XG4gICAqIEBtZW1iZXJPZiBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqL1xuICBwYWdpbmF0b3IhOiBQYWdpbmF0b3I8TW9kZWw+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxhc3QgcGFnZSBudW1iZXIgdGhhdCB3YXMgZGlzcGxheWVkLlxuICAgKiBAc3VtbWFyeSBLZWVwcyB0cmFjayBvZiB0aGUgcHJldmlvdXNseSBkaXNwbGF5ZWQgcGFnZSBudW1iZXIsIHdoaWNoIGlzIHVzZWZ1bFxuICAgKiBmb3IgaGFuZGxpbmcgbmF2aWdhdGlvbiBhbmQgc2VhcmNoIG9wZXJhdGlvbnMgaW4gcGFnaW5hdGVkIG1vZGUuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDFcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGxhc3RQYWdlOiBudW1iZXIgPSAxXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciByZWZyZXNoIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGxpc3QgZGF0YSBpcyByZWZyZXNoZWQsIGVpdGhlciB0aHJvdWdoIHB1bGwtdG8tcmVmcmVzaFxuICAgKiBvciBwcm9ncmFtbWF0aWMgcmVmcmVzaC4gVGhlIGV2ZW50IGluY2x1ZGVzIHRoZSByZWZyZXNoZWQgZGF0YSBhbmQgY29tcG9uZW50IGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPEJhc2VDdXN0b21FdmVudD59XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBAT3V0cHV0KClcbiAgcmVmcmVzaEV2ZW50OiBFdmVudEVtaXR0ZXI8QmFzZUN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QmFzZUN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZW1pdHRlciBmb3IgaXRlbSBjbGljayBpbnRlcmFjdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBsaXN0IGl0ZW0gaXMgY2xpY2tlZC4gVGhlIGV2ZW50IGluY2x1ZGVzIHRoZSBkYXRhXG4gICAqIG9mIHRoZSBjbGlja2VkIGl0ZW0sIGFsbG93aW5nIHBhcmVudCBjb21wb25lbnRzIHRvIHJlc3BvbmQgdG8gdGhlIGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPEtleVZhbHVlPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKVxuICBjbGlja0V2ZW50OiAgRXZlbnRFbWl0dGVyPExpc3RJdGVtQ3VzdG9tRXZlbnR8UmVuZGVyZXJDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPExpc3RJdGVtQ3VzdG9tRXZlbnR8UmVuZGVyZXJDdXN0b21FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1YmplY3QgZm9yIGRlYm91bmNpbmcgY2xpY2sgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBVc2VzIFJ4SlMgU3ViamVjdCB0byBjb2xsZWN0IGNsaWNrIGV2ZW50cyBhbmQgZW1pdCB0aGVtIGFmdGVyIGEgZGVib3VuY2VcbiAgICogcGVyaW9kLiBUaGlzIHByZXZlbnRzIG11bHRpcGxlIHJhcGlkIGNsaWNrcyBmcm9tIHRyaWdnZXJpbmcgbXVsdGlwbGUgZXZlbnRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7U3ViamVjdDxDdXN0b21FdmVudCB8IExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50Pn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgY2xpY2tJdGVtU3ViamVjdDogU3ViamVjdDxDdXN0b21FdmVudCB8IExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50PiA9IG5ldyBTdWJqZWN0PEN1c3RvbUV2ZW50IHwgTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQ+KCk7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1YmplY3QgZm9yIGRlYm91bmNpbmcgcmVwb3NpdG9yeSBvYnNlcnZhdGlvbiBldmVudHMuXG4gICAqIEBzdW1tYXJ5IFJ4SlMgU3ViamVjdCB0aGF0IGNvbGxlY3RzIHJlcG9zaXRvcnkgY2hhbmdlIGV2ZW50cyBhbmQgZW1pdHMgdGhlbSBhZnRlclxuICAgKiBhIGRlYm91bmNlIHBlcmlvZC4gVGhpcyBwcmV2ZW50cyBtdWx0aXBsZSByYXBpZCByZXBvc2l0b3J5IGNoYW5nZXMgZnJvbSB0cmlnZ2VyaW5nXG4gICAqIG11bHRpcGxlIGxpc3QgcmVmcmVzaCBvcGVyYXRpb25zLCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UgYW5kIHVzZXIgZXhwZXJpZW5jZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1N1YmplY3Q8YW55Pn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgb2JzZXJ2ZXJTdWJqZXQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9ic2VydmVyIG9iamVjdCBmb3IgcmVwb3NpdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5cbiAgICogQHN1bW1hcnkgSW1wbGVtZW50cyB0aGUgT2JzZXJ2ZXIgaW50ZXJmYWNlIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyB3aGVuIHRoZVxuICAgKiB1bmRlcmx5aW5nIGRhdGEgcmVwb3NpdG9yeSBjaGFuZ2VzLiBUaGlzIGVuYWJsZXMgYXV0b21hdGljIGxpc3QgdXBkYXRlcyB3aGVuXG4gICAqIGRhdGEgaXMgY3JlYXRlZCwgdXBkYXRlZCwgb3IgZGVsZXRlZCB0aHJvdWdoIHRoZSByZXBvc2l0b3J5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7T2JzZXJ2ZXJ9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIG9ic2VydmVyOiBPYnNlcnZlciA9IHsgcmVmcmVzaDogYXN5bmMgKC4uLiBhcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMub2JzZXJ2ZVJlcG9zaXRvcnkoLi4uYXJncyl9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0IG9mIGF2YWlsYWJsZSBpbmRleGVzIGZvciBkYXRhIHF1ZXJ5aW5nIGFuZCBmaWx0ZXJpbmcuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgbGlzdCBvZiBpbmRleCBuYW1lcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIGRhdGEgcXVlcnlpbmcgYW5kIGZpbHRlcmluZ1xuICAgKiBvcGVyYXRpb25zLCBlc3BlY2lhbGx5IGluIHNjZW5hcmlvcyB3aXRoIGxhcmdlIGRhdGFzZXRzLlxuICAgKlxuICAgKiBJbmRleGVzIGNhbiBzaWduaWZpY2FudGx5IGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIGRhdGEgcmV0cmlldmFsIGJ5IGFsbG93aW5nIHRoZSBkYXRhYmFzZVxuICAgKiB0byBxdWlja2x5IGxvY2F0ZSBhbmQgcmV0cmlldmUgcmVsZXZhbnQgZGF0YSBiYXNlZCBvbiBpbmRleGVkIGZpZWxkcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ1tdfVxuICAgKiBAZGVmYXVsdCBbXVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgaW5kZXhlcyE6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIExpc3RDb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgTGlzdENvbXBvbmVudCBhbmQgc2V0cyB1cCB0aGUgYmFzZSBjb21wb25lbnQgd2l0aCB0aGUgYXBwcm9wcmlhdGVcbiAgICogY29tcG9uZW50IG5hbWUuIFRoaXMgY29uc3RydWN0b3IgaXMgY2FsbGVkIHdoZW4gQW5ndWxhciBpbnN0YW50aWF0ZXMgdGhlIGNvbXBvbmVudCBhbmRcbiAgICogYmVmb3JlIGFueSBpbnB1dCBwcm9wZXJ0aWVzIGFyZSBzZXQuIEl0IHBhc3NlcyB0aGUgY29tcG9uZW50IG5hbWUgdG8gdGhlIHBhcmVudCBjbGFzc1xuICAgKiBjb25zdHJ1Y3RvciB0byBlbmFibGUgcHJvcGVyIGxvY2FsaXphdGlvbiBhbmQgY29tcG9uZW50IGlkZW50aWZpY2F0aW9uLlxuICAgKlxuICAgKiBUaGUgY29uc3RydWN0b3IgaXMgaW50ZW50aW9uYWxseSBtaW5pbWFsLCB3aXRoIG1vc3QgaW5pdGlhbGl6YXRpb24gbG9naWMgZGVmZXJyZWQgdG9cbiAgICogdGhlIG5nT25Jbml0IGxpZmVjeWNsZSBob29rLiBUaGlzIGZvbGxvd3MgQW5ndWxhciBiZXN0IHByYWN0aWNlcyBieSBrZWVwaW5nIHRoZSBjb25zdHJ1Y3RvclxuICAgKiBmb2N1c2VkIG9uIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGFuZCBiYXNpYyBzZXR1cCwgd2hpbGUgY29tcGxleCBpbml0aWFsaXphdGlvbiB0aGF0IGRlcGVuZHNcbiAgICogb24gaW5wdXQgcHJvcGVydGllcyBpcyBoYW5kbGVkIGluIG5nT25Jbml0LlxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJMaXN0Q29tcG9uZW50XCIpO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYWZ0ZXIgQW5ndWxhciBzZXRzIHRoZSBpbnB1dCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBjb21wb25lbnQgYnkgaW5pdGlhbGl6aW5nIGV2ZW50IHN1YnNjcmlwdGlvbnMsIHByb2Nlc3NpbmcgYm9vbGVhblxuICAgKiBpbnB1dHMsIGFuZCBsb2FkaW5nIHRoZSBpbml0aWFsIGRhdGEuIFRoaXMgbWV0aG9kIHByZXBhcmVzIHRoZSBjb21wb25lbnQgZm9yIHVzZXJcbiAgICogaW50ZXJhY3Rpb24gYnkgZW5zdXJpbmcgYWxsIHByb3BlcnRpZXMgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGFuZCBkYXRhIGlzIGxvYWRlZC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQW5ndWxhciBMaWZlY3ljbGVcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExpc3RDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIERhdGEgU291cmNlXG4gICAqXG4gICAqICAgQS0+Pkw6IG5nT25Jbml0KClcbiAgICogICBMLT4+TDogU2V0IHVwIGNsaWNrIGV2ZW50IGRlYm91bmNpbmdcbiAgICogICBMLT4+TDogUHJvY2VzcyBib29sZWFuIGlucHV0c1xuICAgKiAgIEwtPj5MOiBDb25maWd1cmUgY29tcG9uZW50IGJhc2VkIG9uIGlucHV0c1xuICAgKiAgIEwtPj5MOiByZWZyZXNoKClcbiAgICogICBMLT4+RDogUmVxdWVzdCBpbml0aWFsIGRhdGFcbiAgICogICBELS0+Pkw6IFJldHVybiBkYXRhXG4gICAqICAgTC0+Pkw6IFByb2Nlc3MgYW5kIGRpc3BsYXkgZGF0YVxuICAgKiAgIEwtPj5MOiBDb25maWd1cmUgZW1wdHkgc3RhdGUgaWYgbmVlZGVkXG4gICAqICAgTC0+Pkw6IGluaXRpYWxpemUoKVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbGlja0l0ZW1TdWJqZWN0LnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLnN1YnNjcmliZShldmVudCA9PiB0aGlzLmNsaWNrRXZlbnRFbWl0KGV2ZW50IGFzIExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50KSk7XG4gICAgdGhpcy5vYnNlcnZlclN1YmpldC5waXBlKGRlYm91bmNlVGltZSgxMDApKS5zdWJzY3JpYmUoYXJncyA9PiB0aGlzLmhhbmRsZU9ic2VydmVFdmVudChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKSk7XG4gICAgdGhpcy5lbmFibGVGaWx0ZXIgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5lbmFibGVGaWx0ZXIpO1xuICAgIHRoaXMubGltaXQgPSBOdW1iZXIodGhpcy5saW1pdCk7XG4gICAgdGhpcy5zdGFydCA9IE51bWJlcih0aGlzLnN0YXJ0KTtcbiAgICB0aGlzLmluc2V0ID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuaW5zZXQpO1xuICAgIHRoaXMuc2hvd1JlZnJlc2hlciA9IHN0cmluZ1RvQm9vbGVhbih0aGlzLnNob3dSZWZyZXNoZXIpO1xuICAgIHRoaXMubG9hZE1vcmVEYXRhID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMubG9hZE1vcmVEYXRhKTtcbiAgICB0aGlzLnNob3dTZWFyY2hiYXIgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5zaG93U2VhcmNoYmFyKTtcbiAgICB0aGlzLmRpc2FibGVTb3J0ID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuZGlzYWJsZVNvcnQpO1xuICAgIGlmKHR5cGVvZiB0aGlzLml0ZW0/LlsndGFnJ10gPT09ICdib29sZWFuJyAmJiB0aGlzLml0ZW0/LlsndGFnJ10gPT09IHRydWUpXG4gICAgICB0aGlzLml0ZW1bJ3RhZyddID0gQ29tcG9uZW50c1RhZ05hbWVzLkxJU1RfSVRFTSBhcyBzdHJpbmc7XG5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcblxuICAgIGlmKHRoaXMub3BlcmF0aW9ucy5pbmNsdWRlcyhPcGVyYXRpb25LZXlzLkNSRUFURSkgJiYgdGhpcy5yb3V0ZSlcbiAgICAgIHRoaXMuZW1wdHkubGluayA9IGAke3RoaXMucm91dGV9LyR7T3BlcmF0aW9uS2V5cy5DUkVBVEV9YDtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG4gICAgaWYodGhpcy5tb2RlbCBpbnN0YW5jZW9mIE1vZGVsICYmIHRoaXMuX3JlcG9zaXRvcnkpXG4gICAgICB0aGlzLl9yZXBvc2l0b3J5Lm9ic2VydmUodGhpcy5vYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsZWFucyB1cCByZXNvdXJjZXMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgY2xlYW51cCBvcGVyYXRpb25zIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIERPTS5cbiAgICogVGhpcyBpbmNsdWRlcyBjbGVhcmluZyByZWZlcmVuY2VzIHRvIG1vZGVscyBhbmQgZGF0YSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZih0aGlzLl9yZXBvc2l0b3J5KVxuICAgICAgdGhpcy5fcmVwb3NpdG9yeS51bk9ic2VydmUodGhpcy5vYnNlcnZlcik7XG4gICAgdGhpcy5kYXRhID0gIHRoaXMubW9kZWwgPSB0aGlzLl9yZXBvc2l0b3J5ID0gdGhpcy5wYWdpbmF0b3IgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcmVwb3NpdG9yeSBvYnNlcnZhdGlvbiBldmVudHMgd2l0aCBkZWJvdW5jaW5nLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgcmVwb3NpdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhbmQgcm91dGVzIHRoZW0gYXBwcm9wcmlhdGVseS5cbiAgICogRm9yIENSRUFURSBldmVudHMgd2l0aCBhIFVJRCwgaGFuZGxlcyB0aGVtIGltbWVkaWF0ZWx5LiBGb3Igb3RoZXIgZXZlbnRzLFxuICAgKiBwYXNzZXMgdGhlbSB0byB0aGUgZGVib3VuY2VkIG9ic2VydmVyIHN1YmplY3QgdG8gcHJldmVudCBleGNlc3NpdmUgdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHsuLi51bmtub3duW119IGFyZ3MgLSBUaGUgcmVwb3NpdG9yeSBldmVudCBhcmd1bWVudHMgaW5jbHVkaW5nIHRhYmxlLCBldmVudCB0eXBlLCBhbmQgVUlEXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgb2JzZXJ2ZVJlcG9zaXRvcnkoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgW3RhYmxlLCBldmVudCwgdWlkXSA9IGFyZ3M7XG4gICAgaWYoZXZlbnQgPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFICYmICEhdWlkKVxuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlT2JzZXJ2ZUV2ZW50KHRhYmxlIGFzIHN0cmluZywgZXZlbnQsIHVpZCBhcyBzdHJpbmcgfCBudW1iZXIpO1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyU3ViamV0Lm5leHQoYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc3BlY2lmaWMgcmVwb3NpdG9yeSBldmVudHMgYW5kIHVwZGF0ZXMgdGhlIGxpc3QgYWNjb3JkaW5nbHkuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyByZXBvc2l0b3J5IGNoYW5nZSBldmVudHMgKENSRUFURSwgVVBEQVRFLCBERUxFVEUpIGFuZCBwZXJmb3Jtc1xuICAgKiB0aGUgYXBwcm9wcmlhdGUgbGlzdCBvcGVyYXRpb25zLiBUaGlzIGluY2x1ZGVzIGFkZGluZyBuZXcgaXRlbXMsIHVwZGF0aW5nIGV4aXN0aW5nXG4gICAqIG9uZXMsIG9yIHJlbW92aW5nIGRlbGV0ZWQgaXRlbXMgZnJvbSB0aGUgbGlzdCBkaXNwbGF5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvbW9kZWwgbmFtZSB0aGF0IGNoYW5nZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiAoQ1JFQVRFLCBVUERBVEUsIERFTEVURSlcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHVpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYWZmZWN0ZWQgaXRlbVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGhhbmRsZU9ic2VydmVFdmVudCh0YWJsZTogc3RyaW5nLCBldmVudDogT3BlcmF0aW9uS2V5cywgdWlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUpIHtcbiAgICAgIGlmKHVpZCkge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUNyZWF0ZSh1aWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5VUERBVEUpXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVXBkYXRlKHVpZCk7XG4gICAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5ERUxFVEUpXG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRlKHVpZCk7XG4gICAgICB0aGlzLnJlZnJlc2hFdmVudEVtaXQoKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gZm9yIHRyYWNraW5nIGl0ZW1zIGluIHRoZSBsaXN0LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHRyYWNraW5nIGZ1bmN0aW9uIGZvciB0aGUgYCpuZ0ZvcmAgZGlyZWN0aXZlIGluIHRoZSBjb21wb25lbnQgdGVtcGxhdGUuXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpZGVudGlmeSBhbmQgY29udHJvbCB0aGUgcmVuZGVyaW5nIG9mIGl0ZW1zIGluIHRoZSBsaXN0LFxuICAgKiBwcmV2ZW50aW5nIGR1cGxpY2F0ZSBvciB1bm5lY2Vzc2FyeSByZW5kZXJpbmcuXG4gICAqXG4gICAqIFRoZSBgdHJhY2tJdGVtRm5gIGZ1bmN0aW9uIHRha2VzIHR3byBwYXJhbWV0ZXJzOiBgaW5kZXhgICh0aGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIGxpc3QpXG4gICAqIGFuZCBgaXRlbWAgKHRoZSBhY3R1YWwgaXRlbSBmcm9tIHRoZSBsaXN0KS4gSXQgcmV0dXJucyB0aGUgdHJhY2tpbmcga2V5LCB3aGljaCBpbiB0aGlzIGNhc2VcbiAgICogaXMgdGhlIHVuaW9uIG9mIHRoZSBgdWlkYCBvZiB0aGUgaXRlbSB3aXRoIHRoZSBtb2RlbCBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIGxpc3QuXG5cbiAgICogQHBhcmFtIHtLZXlWYWx1ZSB8IHN0cmluZyB8IG51bWJlcn0gaXRlbSAtIFRoZSBhY3R1YWwgaXRlbSBmcm9tIHRoZSBsaXN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyfSBUaGUgdHJhY2tpbmcga2V5IGZvciB0aGUgaXRlbS5cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIG92ZXJyaWRlIHRyYWNrSXRlbUZuKGluZGV4OiBudW1iZXIsIGl0ZW06IEtleVZhbHVlIHwgc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gYCR7IChpdGVtIGFzIEtleVZhbHVlKT8uWyd1aWQnXSB8fCAoaXRlbSBhcyBLZXlWYWx1ZSk/Llt0aGlzLnBrXX0tJHtpbmRleH1gO1xuICB9XG5cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50IGZyb20gdGhlIHJlcG9zaXRvcnkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB1aWQgLSBUaGUgSUQgb2YgdGhlIGl0ZW0gdG8gY3JlYXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaXRlbSBpcyBjcmVhdGVkIGFuZCBhZGRlZCB0byB0aGUgbGlzdC5cbiAgICovXG4gIGFzeW5jIGhhbmRsZUNyZWF0ZSh1aWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX3JlcG9zaXRvcnk/LnJlYWQodWlkKTtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5tYXBSZXN1bHRzKFtyZXN1bHQgYXMgS2V5VmFsdWVdKVswXTtcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhID0gW2l0ZW0sIC4uLnRoaXMuaXRlbXMgfHwgW11dO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgdGhlIHVwZGF0ZSBldmVudCBmcm9tIHRoZSByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIHRoZSBsaXN0IGl0ZW0gd2l0aCB0aGUgc3BlY2lmaWVkIElEIGJhc2VkIG9uIHRoZSBuZXcgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHVpZCAtIFRoZSBJRCBvZiB0aGUgaXRlbSB0byB1cGRhdGVcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBhc3luYyBoYW5kbGVVcGRhdGUodWlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpdGVtOiBLZXlWYWx1ZSA9IHRoaXMuaXRlbU1hcHBlcihhd2FpdCB0aGlzLl9yZXBvc2l0b3J5Py5yZWFkKHVpZCkgfHwge30sIHRoaXMubWFwcGVyKTtcbiAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICBmb3IoY29uc3Qga2V5IGluIHRoaXMuaXRlbXMgYXMgS2V5VmFsdWVbXSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMuaXRlbXNba2V5XSBhcyBLZXlWYWx1ZTtcbiAgICAgICAgaWYoY2hpbGRbJ3VpZCddID09PSBpdGVtWyd1aWQnXSkge1xuICAgICAgICAgIHRoaXMuaXRlbXNba2V5XSA9IE9iamVjdC5hc3NpZ24oe30sIGNoaWxkLCBpdGVtKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YSA9IFsgLi4udGhpcy5pdGVtc107XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBsaXN0IGJ5IElELlxuICAgKiBAc3VtbWFyeSBGaWx0ZXJzIG91dCBhbiBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBJRCBmcm9tIHRoZSBkYXRhIGFycmF5IGFuZFxuICAgKiByZWZyZXNoZXMgdGhlIGxpc3QgZGlzcGxheS4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBhZnRlciBhIGRlbGV0ZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1aWQgLSBUaGUgSUQgb2YgdGhlIGl0ZW0gdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIFRoZSBwcmltYXJ5IGtleSBmaWVsZCBuYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlRGVsZXRlKHVpZDogc3RyaW5nIHwgbnVtYmVyLCBwaz86IHN0cmluZyk6IHZvaWQgIHtcbiAgICBpZighcGspXG4gICAgICBwayA9IHRoaXMucGs7XG4gICAgdGhpcy5pdGVtcyA9IHRoaXMuZGF0YT8uZmlsdGVyKChpdGVtOiBLZXlWYWx1ZSkgPT4gaXRlbVsndWlkJ10gIT09IHVpZCkgfHwgW107XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBjbGljayBldmVudHMgZnJvbSBsaXN0IGl0ZW1zLlxuICAgKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBnbG9iYWwgTGlzdEl0ZW1DbGlja0V2ZW50IGV2ZW50cyBhbmQgcGFzc2VzIHRoZW0gdG8gdGhlXG4gICAqIGRlYm91bmNlZCBjbGljayBzdWJqZWN0LiBUaGlzIGFsbG93cyB0aGUgY29tcG9uZW50IHRvIHJlc3BvbmQgdG8gY2xpY2tzIG9uXG4gICAqIGxpc3QgaXRlbXMgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGV5IG9yaWdpbmF0ZSBmcm9tLlxuICAgKlxuICAgKiBAcGFyYW0ge0xpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50fSBldmVudCAtIFRoZSBjbGljayBldmVudFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpMaXN0SXRlbUNsaWNrRXZlbnQnLCBbJyRldmVudCddKVxuICBoYW5kbGVDbGljayhldmVudDogTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrSXRlbVN1YmplY3QubmV4dChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc2VhcmNoIGV2ZW50cyBmcm9tIHRoZSBzZWFyY2ggYmFyLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgc2VhcmNoIHF1ZXJpZXMgZnJvbSB0aGUgc2VhcmNoIGJhciBjb21wb25lbnQsIHVwZGF0aW5nIHRoZVxuICAgKiBkaXNwbGF5ZWQgZGF0YSBiYXNlZCBvbiB0aGUgc2VhcmNoIHRlcm0uIFRoZSBiZWhhdmlvciBkaWZmZXJzIGJldHdlZW4gaW5maW5pdGVcbiAgICogYW5kIHBhZ2luYXRlZCBtb2RlcyB0byBwcm92aWRlIHRoZSBiZXN0IHVzZXIgZXhwZXJpZW5jZSBmb3IgZWFjaCBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdmFsdWUgLSBUaGUgc2VhcmNoIHRlcm0gb3IgdW5kZWZpbmVkIHRvIGNsZWFyIHNlYXJjaFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogZmxvd2NoYXJ0IFREXG4gICAqICAgQVtTZWFyY2ggRXZlbnRdIC0tPiBCe1R5cGUgaXMgSW5maW5pdGU/fVxuICAgKiAgIEIgLS0+fFllc3wgQ1tEaXNhYmxlIGxvYWRNb3JlRGF0YV1cbiAgICogICBCIC0tPnxOb3wgRFtFbmFibGUgbG9hZE1vcmVEYXRhXVxuICAgKiAgIEMgLS0+IEV7U2VhcmNoIHZhbHVlIHVuZGVmaW5lZD99XG4gICAqICAgRSAtLT58WWVzfCBGW0VuYWJsZSBsb2FkTW9yZURhdGFdXG4gICAqICAgRSAtLT58Tm98IEdbU3RvcmUgc2VhcmNoIHZhbHVlXVxuICAgKiAgIEQgLS0+IEdcbiAgICogICBGIC0tPiBIW1Jlc2V0IHBhZ2UgdG8gMV1cbiAgICogICBHIC0tPiBJW1JlZnJlc2ggZGF0YV1cbiAgICogICBIIC0tPiBJXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2VhcmNoYmFyRXZlbnQnLCBbJyRldmVudCddKVxuICBhc3luYyBoYW5kbGVTZWFyY2godmFsdWU6IHN0cmluZyB8IElGaWx0ZXJRdWVyeSB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmKHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURSkge1xuICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IHRydWU7XG4gICAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICB0aGlzLnBhZ2UgPSB0aGlzLmxhc3RQYWdlO1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGZpbHRlciBldmVudHMgZnJvbSB0aGUgZmlsdGVyIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGZpbHRlciBxdWVyaWVzIGZyb20gdGhlIGZpbHRlciBjb21wb25lbnQgYW5kIGFwcGxpZXMgdGhlbVxuICAgKiB0byB0aGUgbGlzdCBkYXRhLiBUaGlzIG1ldGhvZCBhY3RzIGFzIGEgYnJpZGdlIGJldHdlZW4gdGhlIGZpbHRlciBjb21wb25lbnRcbiAgICogYW5kIHRoZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSwgY29udmVydGluZyBmaWx0ZXIgcXVlcmllcyBpbnRvIHNlYXJjaCBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0lGaWx0ZXJRdWVyeSB8IHVuZGVmaW5lZH0gdmFsdWUgLSBUaGUgZmlsdGVyIHF1ZXJ5IG9iamVjdCBvciB1bmRlZmluZWQgdG8gY2xlYXIgZmlsdGVyc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGhhbmRsZUZpbHRlcih2YWx1ZTogSUZpbHRlclF1ZXJ5IHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVTZWFyY2godmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbGVhcnMgdGhlIGN1cnJlbnQgc2VhcmNoIGFuZCByZXNldHMgdGhlIGxpc3QuXG4gICAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNsZWFycyB0aGUgc2VhcmNoIGJ5IGNhbGxpbmcgaGFuZGxlU2VhcmNoXG4gICAqIHdpdGggdW5kZWZpbmVkLiBUaGlzIHJlc2V0cyB0aGUgbGlzdCB0byBzaG93IGFsbCBkYXRhIHdpdGhvdXQgZmlsdGVyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGNsZWFyU2VhcmNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuaGFuZGxlU2VhcmNoKHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVtaXRzIGEgcmVmcmVzaCBldmVudCB3aXRoIHRoZSBjdXJyZW50IGRhdGEuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYW5kIGVtaXRzIGEgcmVmcmVzaCBldmVudCBjb250YWluaW5nIHRoZSBjdXJyZW50IGxpc3QgZGF0YS5cbiAgICogVGhpcyBub3RpZmllcyBwYXJlbnQgY29tcG9uZW50cyB0aGF0IHRoZSBsaXN0IGRhdGEgaGFzIGJlZW4gcmVmcmVzaGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0tleVZhbHVlW119IFtkYXRhXSAtIE9wdGlvbmFsIGRhdGEgdG8gaW5jbHVkZSBpbiB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICByZWZyZXNoRXZlbnRFbWl0KGRhdGE/OiBLZXlWYWx1ZVtdKTogdm9pZCB7XG4gICAgaWYoIWRhdGEpXG4gICAgICBkYXRhID0gdGhpcy5pdGVtcztcbiAgICB0aGlzLnNrZWxldG9uRGF0YSA9IG5ldyBBcnJheShkYXRhPy5sZW5ndGggfHwgMik7XG4gICAgdGhpcy5yZWZyZXNoRXZlbnQuZW1pdCh7XG4gICAgICBuYW1lOiBFdmVudENvbnN0YW50cy5SRUZSRVNILFxuICAgICAgZGF0YTogZGF0YSB8fCBbXSxcbiAgICAgIGNvbXBvbmVudDogdGhpcy5jb21wb25lbnROYW1lXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVtaXRzIGEgY2xpY2sgZXZlbnQgZm9yIGEgbGlzdCBpdGVtLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgYW5kIGVtaXRzIGEgY2xpY2sgZXZlbnQgd2hlbiBhIGxpc3QgaXRlbSBpcyBjbGlja2VkLlxuICAgKiBUaGlzIGV4dHJhY3RzIHRoZSByZWxldmFudCBkYXRhIGZyb20gdGhlIGV2ZW50IGFuZCBwYXNzZXMgaXQgdG8gcGFyZW50IGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7TGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIGNsaWNrIGV2ZW50XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBjbGlja0V2ZW50RW1pdChldmVudDogTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZnJlc2hlcyB0aGUgbGlzdCBkYXRhIGZyb20gdGhlIGNvbmZpZ3VyZWQgc291cmNlLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggaW5pdGlhbCBkYXRhIGxvYWRpbmcgYW5kIHN1YnNlcXVlbnQgcmVmcmVzaCBvcGVyYXRpb25zLFxuICAgKiBpbmNsdWRpbmcgcHVsbC10by1yZWZyZXNoIGFuZCBpbmZpbml0ZSBzY3JvbGxpbmcuIEl0IG1hbmFnZXMgdGhlIGRhdGEgZmV0Y2hpbmcgcHJvY2VzcyxcbiAgICogdXBkYXRlcyB0aGUgY29tcG9uZW50J3Mgc3RhdGUsIGFuZCBoYW5kbGVzIHBhZ2luYXRpb24gb3IgaW5maW5pdGUgc2Nyb2xsaW5nIGxvZ2ljIGJhc2VkXG4gICAqIG9uIHRoZSBjb21wb25lbnQncyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBUaGUgbWV0aG9kIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gICAqIDEuIFNldHMgdGhlIHJlZnJlc2hpbmcgZmxhZyB0byBpbmRpY2F0ZSBhIGRhdGEgZmV0Y2ggaXMgaW4gcHJvZ3Jlc3NcbiAgICogMi4gQ2FsY3VsYXRlcyB0aGUgYXBwcm9wcmlhdGUgc3RhcnQgYW5kIGxpbWl0IHZhbHVlcyBiYXNlZCBvbiBwYWdpbmF0aW9uIHNldHRpbmdzXG4gICAqIDMuIEZldGNoZXMgZGF0YSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBzb3VyY2UgKG1vZGVsIG9yIHJlcXVlc3QpXG4gICAqIDQuIFVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzIGRhdGEgYW5kIGVtaXRzIGEgcmVmcmVzaCBldmVudFxuICAgKiA1LiBIYW5kbGVzIHBhZ2luYXRpb24gb3IgaW5maW5pdGUgc2Nyb2xsaW5nIHN0YXRlIHVwZGF0ZXNcbiAgICogNi4gQ29tcGxldGVzIGFueSBwcm92aWRlZCBldmVudCAobGlrZSBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50KVxuICAgKlxuICAgKiBAcGFyYW0ge0luZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfCBSZWZyZXNoZXJDdXN0b21FdmVudCB8IGJvb2xlYW59IGV2ZW50IC0gVGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSByZWZyZXNoLFxuICAgKiBvciBhIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgaXMgYSBmb3JjZWQgcmVmcmVzaFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVmcmVzaCBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBMaXN0Q29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBEYXRhIFNvdXJjZVxuICAgKiAgIHBhcnRpY2lwYW50IEUgYXMgRXZlbnQgU3lzdGVtXG4gICAqXG4gICAqICAgTC0+Pkw6IHJlZnJlc2goZXZlbnQpXG4gICAqICAgTC0+Pkw6IFNldCByZWZyZXNoaW5nIGZsYWdcbiAgICogICBMLT4+TDogQ2FsY3VsYXRlIHN0YXJ0IGFuZCBsaW1pdFxuICAgKiAgIGFsdCBVc2luZyBtb2RlbFxuICAgKiAgICAgTC0+PkQ6IGdldEZyb21Nb2RlbChmb3JjZSwgc3RhcnQsIGxpbWl0KVxuICAgKiAgICAgRC0tPj5MOiBSZXR1cm4gZGF0YVxuICAgKiAgIGVsc2UgVXNpbmcgcmVxdWVzdFxuICAgKiAgICAgTC0+PkQ6IGdldEZyb21SZXF1ZXN0KGZvcmNlLCBzdGFydCwgbGltaXQpXG4gICAqICAgICBELS0+Pkw6IFJldHVybiBkYXRhXG4gICAqICAgZW5kXG4gICAqICAgTC0+PkU6IHJlZnJlc2hFdmVudEVtaXQoKVxuICAgKiAgIGFsdCBJbmZpbml0ZSBzY3JvbGxpbmcgbW9kZVxuICAgKiAgICAgTC0+Pkw6IENoZWNrIGlmIHJlYWNoZWQgbGFzdCBwYWdlXG4gICAqICAgICBhbHQgTGFzdCBwYWdlIHJlYWNoZWRcbiAgICogICAgICAgTC0+Pkw6IENvbXBsZXRlIHNjcm9sbCBldmVudFxuICAgKiAgICAgICBMLT4+TDogRGlzYWJsZSBsb2FkTW9yZURhdGFcbiAgICogICAgIGVsc2UgTW9yZSBwYWdlcyBhdmFpbGFibGVcbiAgICogICAgICAgTC0+Pkw6IEluY3JlbWVudCBwYWdlIG51bWJlclxuICAgKiAgICAgICBMLT4+TDogQ29tcGxldGUgc2Nyb2xsIGV2ZW50IGFmdGVyIGRlbGF5XG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIFBhZ2luYXRlZCBtb2RlXG4gICAqICAgICBMLT4+TDogQ2xlYXIgcmVmcmVzaGluZyBmbGFnIGFmdGVyIGRlbGF5XG4gICAqICAgZW5kXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6QmFja0J1dHRvbk5hdmlnYXRpb25FbmRFdmVudCcsIFsnJGV2ZW50J10pXG4gIGFzeW5jIHJlZnJlc2goZXZlbnQ6IEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfCBSZWZyZXNoZXJDdXN0b21FdmVudCB8IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vICBpZih0eXBlb2YgZm9yY2UgIT09ICdib29sZWFuJyAmJiBmb3JjZS50eXBlID09PSBFdmVudENvbnN0YW50cy5CQUNLX0JVVFRPTl9OQVZJR0FUSU9OKSB7XG4gICAgLy8gICAgY29uc3Qge3JlZnJlc2h9ID0gKGZvcmNlIGFzIEN1c3RvbUV2ZW50KS5kZXRhaWw7XG4gICAgLy8gICAgaWYoIXJlZnJlc2gpXG4gICAgLy8gICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gIH1cblxuICAgIHRoaXMucmVmcmVzaGluZyA9IHRydWU7XG4gICAgY29uc3Qgc3RhcnQ6IG51bWJlciA9IHRoaXMucGFnZSA+IDEgPyAodGhpcy5wYWdlIC0gMSkgKiB0aGlzLmxpbWl0IDogdGhpcy5zdGFydDtcbiAgICBjb25zdCBsaW1pdDogbnVtYmVyID0gKHRoaXMucGFnZSAqICh0aGlzLmxpbWl0ID4gMTIgPyAxMiA6IHRoaXMubGltaXQpKTtcblxuICAgIHRoaXMuZGF0YSA9ICF0aGlzLm1vZGVsID9cbiAgICAgIGF3YWl0IHRoaXMuZ2V0RnJvbVJlcXVlc3QoISFldmVudCwgc3RhcnQsIGxpbWl0KVxuICAgICAgOiBhd2FpdCB0aGlzLmdldEZyb21Nb2RlbCghIWV2ZW50KSBhcyBLZXlWYWx1ZVtdO1xuXG4gICAgdGhpcy5yZWZyZXNoRXZlbnRFbWl0KCk7XG5cbiAgICBpZih0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEUpIHtcbiAgICAgIGlmKHRoaXMucGFnZSA9PT0gdGhpcy5wYWdlcykge1xuICAgICAgICBpZigoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCk/LnRhcmdldClcbiAgICAgICAgICAoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCkudGFyZ2V0LmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhZ2UgKz0gMTtcbiAgICAgICAgdGhpcy5yZWZyZXNoaW5nID0gZmFsc2U7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYoKGV2ZW50IGFzIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQpPy50YXJnZXQgJiYgKGV2ZW50IGFzIEN1c3RvbUV2ZW50KT8udHlwZSAhPT0gRXZlbnRDb25zdGFudHMuQkFDS19CVVRUT05fTkFWSUdBVElPTilcbiAgICAgICAgICAgICAgKGV2ZW50IGFzIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQpLnRhcmdldC5jb21wbGV0ZSgpO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWZyZXNoaW5nID0gZmFsc2U7XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBwYWdpbmF0aW9uIGV2ZW50cyBmcm9tIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudC5cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBwYWdpbmF0aW9uIGV2ZW50cyBieSB1cGRhdGluZyB0aGUgY3VycmVudCBwYWdlIG51bWJlciBhbmRcbiAqIHJlZnJlc2hpbmcgdGhlIGxpc3QgZGF0YSB0byBkaXNwbGF5IHRoZSBzZWxlY3RlZCBwYWdlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWRcbiAqIHdoZW4gYSB1c2VyIGludGVyYWN0cyB3aXRoIHRoZSBwYWdpbmF0aW9uIGNvbnRyb2xzIHRvIG5hdmlnYXRlIGJldHdlZW4gcGFnZXMuXG4gKlxuICogQHBhcmFtIHtQYWdpbmF0aW9uQ3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIHBhZ2luYXRpb24gZXZlbnQgY29udGFpbmluZyBwYWdlIGluZm9ybWF0aW9uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5oYW5kbGVQYWdpbmF0ZShldmVudDogUGFnaW5hdGlvbkN1c3RvbUV2ZW50KTogdm9pZCB7XG4gIGNvbnN0IHsgcGFnZX0gPSBldmVudC5kYXRhO1xuICB0aGlzLnBhZ2UgPSBwYWdlO1xuICB0aGlzLnJlZnJlc2godHJ1ZSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcHVsbC10by1yZWZyZXNoIGV2ZW50cyBmcm9tIHRoZSByZWZyZXNoZXIgY29tcG9uZW50LlxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIHJlZnJlc2ggZXZlbnRzIHRyaWdnZXJlZCBieSB0aGUgdXNlciBwdWxsaW5nIGRvd24gb24gdGhlIGxpc3RcbiAqIG9yIGJ5IHByb2dyYW1tYXRpYyByZWZyZXNoIHJlcXVlc3RzLiBUaGlzIG1ldGhvZCByZWZyZXNoZXMgdGhlIGxpc3QgZGF0YSBhbmRcbiAqIGNvbXBsZXRlcyB0aGUgcmVmcmVzaGVyIGFuaW1hdGlvbiB3aGVuIHRoZSBkYXRhIGlzIGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0ge0luZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfCBDdXN0b21FdmVudH0gW2V2ZW50XSAtIFRoZSByZWZyZXNoIGV2ZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVmcmVzaCBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5hc3luYyBoYW5kbGVSZWZyZXNoKGV2ZW50PzogSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8IEN1c3RvbUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHRoaXMucmVmcmVzaChldmVudCBhcyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50IHx8IHRydWUpO1xuICBpZihldmVudCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gQW55IGNhbGxzIHRvIGxvYWQgZGF0YSBnbyBoZXJlXG4gICAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJb25SZWZyZXNoZXJFbGVtZW50KS5jb21wbGV0ZSgpO1xuICAgIH0sIDQwMCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZpbHRlcnMgZGF0YSBiYXNlZCBvbiBhIHNlYXJjaCBzdHJpbmcuXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgdGhlIGN1cnJlbnQgZGF0YSBhcnJheSB0byBmaW5kIGl0ZW1zIHRoYXQgbWF0Y2ggdGhlIHByb3ZpZGVkXG4gKiBzZWFyY2ggc3RyaW5nLiBUaGlzIHVzZXMgdGhlIGFycmF5UXVlcnlCeVN0cmluZyB1dGlsaXR5IHRvIHBlcmZvcm0gdGhlIGZpbHRlcmluZ1xuICogYWNyb3NzIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBpdGVtcy5cbiAqXG4gKiBAcGFyYW0ge0tleVZhbHVlW119IHJlc3VsdHMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gc2VhcmNoIHRocm91Z2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWFyY2ggLSBUaGUgc2VhcmNoIHN0cmluZyB0byBmaWx0ZXIgYnlcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZVtdfSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZmlsdGVyZWQgYXJyYXkgb2YgaXRlbXNcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG4gIHBhcnNlU2VhcmNoUmVzdWx0cyhyZXN1bHRzOiBLZXlWYWx1ZVtdLCBzZWFyY2g6IHN0cmluZyk6IEtleVZhbHVlW10ge1xuICAgIHJldHVybiByZXN1bHRzLmZpbHRlcigoaXRlbTogS2V5VmFsdWUpID0+XG4gICAgICBPYmplY3QudmFsdWVzKGl0ZW0pLnNvbWUodmFsdWUgPT5cbiAgICAgICAgICB2YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoKHNlYXJjaCBhcyBzdHJpbmcpPy50b0xvd2VyQ2FzZSgpKVxuICAgICAgICApXG4gICAgKTtcbiAgfVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGZXRjaGVzIGRhdGEgZnJvbSBhIHJlcXVlc3Qgc291cmNlLlxuICogQHN1bW1hcnkgUmV0cmlldmVzIGRhdGEgZnJvbSB0aGUgY29uZmlndXJlZCBzb3VyY2UgZnVuY3Rpb24gb3IgVVJMLCBwcm9jZXNzZXMgaXQsXG4gKiBhbmQgdXBkYXRlcyB0aGUgY29tcG9uZW50J3MgZGF0YSBzdGF0ZS4gVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIGluaXRpYWwgZGF0YSBsb2FkaW5nXG4gKiBhbmQgc3Vic2VxdWVudCByZWZyZXNoIG9wZXJhdGlvbnMgd2hlbiB1c2luZyBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZSByYXRoZXIgdGhhbiBhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBXaGV0aGVyIHRvIGZvcmNlIGEgcmVmcmVzaCBldmVuIGlmIGRhdGEgYWxyZWFkeSBleGlzdHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIFRoZSBzdGFydGluZyBpbmRleCBmb3IgcGFnaW5hdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHJpZXZlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxLZXlWYWx1ZVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZldGNoZWQgZGF0YVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmFzeW5jIGdldEZyb21SZXF1ZXN0KGZvcmNlOiBib29sZWFuID0gZmFsc2UsIHN0YXJ0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPEtleVZhbHVlW10+IHtcbiAgbGV0IHJlcXVlc3Q6IEtleVZhbHVlW10gPSBbXTtcbiAgaWYoIXRoaXMuZGF0YT8ubGVuZ3RoIHx8IGZvcmNlIHx8ICh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCB8fCAhISh0aGlzLnNlYXJjaFZhbHVlIGFzIElGaWx0ZXJRdWVyeSkpIHtcbiAgICAvLyAoc2VsZi5kYXRhIGFzIExpc3RJdGVtW10pID0gW107XG4gICAgaWYoISh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCAmJiAhKHRoaXMuc2VhcmNoVmFsdWUgYXMgSUZpbHRlclF1ZXJ5KSkge1xuICAgICAgaWYoIXRoaXMuc291cmNlICYmICF0aGlzLmRhdGE/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdObyBkYXRhIGFuZCBzb3VyY2UgcGFzc2VkIHRvIGluZmluaXRlIGxpc3QnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBpZih0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxuICAgICAgICByZXF1ZXN0ID0gYXdhaXQgdGhpcy5zb3VyY2UoKTtcblxuICAgICAgaWYoIUFycmF5LmlzQXJyYXkocmVxdWVzdCkpXG4gICAgICAgIHJlcXVlc3QgPSByZXF1ZXN0Py5bJ3Jlc3BvbnNlJ10/LlsnZGF0YSddIHx8IHJlcXVlc3Q/LlsncmVzdWx0cyddIHx8IFtdO1xuICAgICAgdGhpcy5kYXRhID0gWy4uLiBhd2FpdCB0aGlzLnBhcnNlUmVzdWx0KHJlcXVlc3QpXTtcbiAgICAgIGlmKHRoaXMuZGF0YT8ubGVuZ3RoKVxuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFID9cbiAgICAgICAgICAodGhpcy5pdGVtcyB8fCBbXSkuY29uY2F0KFsuLi50aGlzLmRhdGEuc2xpY2Uoc3RhcnQsIGxpbWl0KV0pIDogWy4uLnJlcXVlc3Quc2xpY2Uoc3RhcnQsIGxpbWl0KSBhcyBLZXlWYWx1ZVtdXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0gdGhpcy5wYXJzZVNlYXJjaFJlc3VsdHModGhpcy5kYXRhIGFzIFtdLCB0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk7XG4gICAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhO1xuICAgIH1cbiAgfVxuXG4gIGlmKHRoaXMubG9hZE1vcmVEYXRhICYmIHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5QQUdJTkFURUQpXG4gICAgdGhpcy5nZXRNb3JlRGF0YSh0aGlzLmRhdGE/Lmxlbmd0aCB8fCAwKTtcbiAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXSBhcyBLZXlWYWx1ZVtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGZXRjaGVzIGRhdGEgZnJvbSBhIG1vZGVsIHNvdXJjZS5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyBkYXRhIGZyb20gdGhlIGNvbmZpZ3VyZWQgbW9kZWwgdXNpbmcgaXRzIHBhZ2luYXRpb24gb3IgZmluZCBtZXRob2RzLFxuICogcHJvY2Vzc2VzIGl0LCBhbmQgdXBkYXRlcyB0aGUgY29tcG9uZW50J3MgZGF0YSBzdGF0ZS4gVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIGluaXRpYWxcbiAqIGRhdGEgbG9hZGluZyBhbmQgc3Vic2VxdWVudCByZWZyZXNoIG9wZXJhdGlvbnMgd2hlbiB1c2luZyBhIG1vZGVsIGFzIHRoZSBkYXRhIHNvdXJjZS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gV2hldGhlciB0byBmb3JjZSBhIHJlZnJlc2ggZXZlbiBpZiBkYXRhIGFscmVhZHkgZXhpc3RzXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBUaGUgc3RhcnRpbmcgaW5kZXggZm9yIHBhZ2luYXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byByZXRyaWV2ZVxuICogQHJldHVybnMge1Byb21pc2U8S2V5VmFsdWVbXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmZXRjaGVkIGRhdGFcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5hc3luYyBnZXRGcm9tTW9kZWwoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8S2V5VmFsdWVbXT4ge1xuICBsZXQgZGF0YSA9IFsgLi4uIHRoaXMuZGF0YSB8fCBbXV07XG4gIGxldCByZXF1ZXN0OiBLZXlWYWx1ZVtdID0gW107XG5cbiAgLy8gZ2V0dGluZyBtb2RlbCByZXBvc2l0b3J5XG4gIGlmKCF0aGlzLl9yZXBvc2l0b3J5KVxuICAgIHRoaXMuX3JlcG9zaXRvcnkgPSB0aGlzLnJlcG9zaXRvcnk7XG4gIGNvbnN0IHJlcG8gPSB0aGlzLl9yZXBvc2l0b3J5IGFzIERlY2FmUmVwb3NpdG9yeTxNb2RlbD47XG4gIGlmKCF0aGlzLmRhdGE/Lmxlbmd0aCB8fCBmb3JjZSB8fCAodGhpcy5zZWFyY2hWYWx1ZSBhcyBzdHJpbmcpPy5sZW5ndGggfHwgISEodGhpcy5zZWFyY2hWYWx1ZSBhcyBJRmlsdGVyUXVlcnkpKSB7XG4gICAgdHJ5IHtcbiAgICAgaWYoISh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCAmJiAhKHRoaXMuc2VhcmNoVmFsdWUgYXMgSUZpbHRlclF1ZXJ5KSkge1xuICAgICAgICAodGhpcy5kYXRhIGFzIEtleVZhbHVlW10pID0gW107XG4gICAgICAgIC8vIGNvbnN0IHJhd1F1ZXJ5ID0gdGhpcy5wYXJzZVF1ZXJ5KHNlbGYubW9kZWwgYXMgUmVwb3NpdG9yeTxNb2RlbD4sIHN0YXJ0LCBsaW1pdCk7XG4gICAgICAgIC8vIHJlcXVlc3QgPSB0aGlzLnBhcnNlUmVzdWx0KGF3YWl0ICh0aGlzLm1vZGVsIGFzIGFueSk/LnBhZ2luYXRlKHN0YXJ0LCBsaW1pdCkpO1xuICAgICAgICAgIGlmKCF0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IgPSBhd2FpdCByZXBvXG4gICAgICAgICAgICAgIC5zZWxlY3QoKVxuICAgICAgICAgICAgICAub3JkZXJCeShbdGhpcy5wayBhcyBrZXlvZiBNb2RlbCwgdGhpcy5zb3J0RGlyZWN0aW9uXSlcbiAgICAgICAgICAgICAgLnBhZ2luYXRlKHRoaXMubGltaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXF1ZXN0ID0gYXdhaXQgdGhpcy5wYXJzZVJlc3VsdCh0aGlzLnBhZ2luYXRvcik7XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmKCF0aGlzLmluZGV4ZXMpXG4gICAgICAgICAgdGhpcy5pbmRleGVzID0gKE9iamVjdC52YWx1ZXModGhpcy5tYXBwZXIpIHx8IFt0aGlzLnBrXSk7XG5cbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gdGhpcy5wYXJzZUNvbmRpdGlvbnModGhpcy5zZWFyY2hWYWx1ZSBhcyBzdHJpbmcgfCBudW1iZXIgfCBJRmlsdGVyUXVlcnkpO1xuICAgICAgICByZXF1ZXN0ID0gYXdhaXQgdGhpcy5wYXJzZVJlc3VsdChhd2FpdCByZXBvLnF1ZXJ5KGNvbmRpdGlvbiwgKHRoaXMuc29ydEJ5IHx8IHRoaXMucGspIGFzIGtleW9mIE1vZGVsLCB0aGlzLnNvcnREaXJlY3Rpb24pKTtcbiAgICAgICAgZGF0YSA9IFtdO1xuICAgICAgfVxuICAgICAgZGF0YSA9IHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURSA/IFsuLi4gKGRhdGEpLmNvbmNhdChyZXF1ZXN0KV0gOiBbLi4ucmVxdWVzdF07XG4gICAgfSBjYXRjaChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKGVycm9yIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBgVW5hYmxlIHRvIGZpbmQgJHt0aGlzLm1vZGVsfSBvbiByZWdpc3RyeS4gUmV0dXJuIGVtcHR5IGFycmF5IGZyb20gY29tcG9uZW50YCk7XG4gICAgfVxuICB9XG5cbiAgaWYoZGF0YT8ubGVuZ3RoKSB7XG4gICAgaWYodGhpcy5zZWFyY2hWYWx1ZSkge1xuICAgICAgdGhpcy5pdGVtcyA9IFsuLi5kYXRhXTtcbiAgICAgIGlmKHRoaXMuaXRlbXM/Lmxlbmd0aCA8PSB0aGlzLmxpbWl0KVxuICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLml0ZW1zID0gWy4uLmRhdGFdO1xuICAgIH1cbiAgfVxuICBpZih0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuUEFHSU5BVEVEICYmIHRoaXMucGFnaW5hdG9yKVxuICAgICAgdGhpcy5nZXRNb3JlRGF0YSh0aGlzLnBhZ2luYXRvci50b3RhbCk7XG4gIHJldHVybiBkYXRhIHx8IFtdIGFzIEtleVZhbHVlW107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIHNlYXJjaCB2YWx1ZXMgb3IgZmlsdGVyIHF1ZXJpZXMgaW50byBkYXRhYmFzZSBjb25kaXRpb25zLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyBzZWFyY2ggaW5wdXQgb3IgY29tcGxleCBmaWx0ZXIgcXVlcmllcyBpbnRvIENvbmRpdGlvbiBvYmplY3RzXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGZvciBkYXRhYmFzZSBxdWVyeWluZy4gSGFuZGxlcyBib3RoIHNpbXBsZSBzdHJpbmcvbnVtYmVyIHNlYXJjaGVzXG4gKiBhY3Jvc3MgaW5kZXhlZCBmaWVsZHMgYW5kIGNvbXBsZXggZmlsdGVyIHF1ZXJpZXMgd2l0aCBtdWx0aXBsZSBjcml0ZXJpYS5cbiAqXG4gKiBGb3Igc2ltcGxlIHNlYXJjaGVzIChzdHJpbmcvbnVtYmVyKTpcbiAqIC0gQ3JlYXRlcyBjb25kaXRpb25zIHRoYXQgc2VhcmNoIGFjcm9zcyBhbGwgaW5kZXhlZCBmaWVsZHNcbiAqIC0gVXNlcyBlcXVhbGl0eSBmb3IgbnVtZXJpYyB2YWx1ZXMgYW5kIHJlZ2V4IGZvciBzdHJpbmcgdmFsdWVzXG4gKiAtIENvbWJpbmVzIGNvbmRpdGlvbnMgd2l0aCBPUiBsb2dpYyB0byBzZWFyY2ggbXVsdGlwbGUgZmllbGRzXG4gKlxuICogRm9yIGNvbXBsZXggZmlsdGVyIHF1ZXJpZXM6XG4gKiAtIFByb2Nlc3NlcyBlYWNoIGZpbHRlciBpdGVtIHdpdGggaXRzIHNwZWNpZmljIGNvbmRpdGlvbiB0eXBlXG4gKiAtIFN1cHBvcnRzIEVxdWFsLCBOb3QgRXF1YWwsIENvbnRhaW5zLCBOb3QgQ29udGFpbnMsIEdyZWF0ZXIgVGhhbiwgTGVzcyBUaGFuXG4gKiAtIFVwZGF0ZXMgc29ydCBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBmaWx0ZXIgcXVlcnlcbiAqIC0gQ29tYmluZXMgbXVsdGlwbGUgZmlsdGVyIGNvbmRpdGlvbnMgd2l0aCBPUiBsb2dpY1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgSUZpbHRlclF1ZXJ5fSB2YWx1ZSAtIFRoZSBzZWFyY2ggdmFsdWUgb3IgZmlsdGVyIHF1ZXJ5IG9iamVjdFxuICogQHJldHVybnMge0NvbmRpdGlvbjxNb2RlbD59IEEgQ29uZGl0aW9uIG9iamVjdCBmb3IgZGF0YWJhc2UgcXVlcnlpbmdcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbnBhcnNlQ29uZGl0aW9ucyh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgSUZpbHRlclF1ZXJ5KTogQ29uZGl0aW9uPE1vZGVsPiB7XG4gIGxldCBfY29uZGl0aW9uOiBDb25kaXRpb248TW9kZWw+O1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFByaW1pdGl2ZXMuU1RSSU5HIHx8IHR5cGVvZiB2YWx1ZSA9PT0gUHJpbWl0aXZlcy5OVU1CRVIpIHtcbiAgICBfY29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4odGhpcy5wayBhcyBrZXlvZiBNb2RlbCkuZXEoIWlzTmFOKHZhbHVlIGFzIG51bWJlcikgPyBOdW1iZXIodmFsdWUpIDogdmFsdWUpO1xuICAgIGZvciAoY29uc3QgaW5kZXggb2YgdGhpcy5pbmRleGVzKSB7XG4gICAgICAgIGlmKGluZGV4ID09PSB0aGlzLnBrKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsZXQgb3JDb25kaXRpb247XG4gICAgICAgIGlmKCFpc05hTih2YWx1ZSBhcyBudW1iZXIpKSB7XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkuZXEoTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkucmVnZXhwKHZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgX2NvbmRpdGlvbiA9IF9jb25kaXRpb24ub3Iob3JDb25kaXRpb24pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7cXVlcnksIHNvcnR9ID0gdmFsdWUgYXMgSUZpbHRlclF1ZXJ5O1xuICAgIF9jb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPih0aGlzLnBrIGFzIGtleW9mIE1vZGVsKS5kaWYoJ251bGwnKTtcblxuICAgIGlmKHF1ZXJ5Py5sZW5ndGgpXG4gICAgICBfY29uZGl0aW9uID0gdW5kZWZpbmVkIGFzIHVua25vd24gYXMgQ29uZGl0aW9uPE1vZGVsPjtcblxuICAgIChxdWVyeSB8fCBbXSkuZm9yRWFjaCgoaXRlbTogSUZpbHRlclF1ZXJ5SXRlbSkgPT4ge1xuICAgICAgY29uc3Qge3ZhbHVlLCBjb25kaXRpb24sIGluZGV4fSA9IGl0ZW07XG4gICAgICBsZXQgdmFsID0gdmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYoaW5kZXggPT09IHRoaXMucGsgfHwgIWlzTmFOKHZhbCBhcyBudW1iZXIpKVxuICAgICAgICB2YWwgPSBOdW1iZXIodmFsKTtcbiAgICAgIGxldCBvckNvbmRpdGlvbjtcbiAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJFcXVhbFwiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLmVxKHZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJOb3QgRXF1YWxcIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5kaWYodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk5vdCBDb250YWluc1wiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gIUNvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5yZWdleHAobmV3IFJlZ0V4cChgXig/IS4qJHt2YWx9KS4qJGApKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkNvbnRhaW5zXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkucmVnZXhwKHZhbCBhcyBzdHJpbmcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiR3JlYXRlciBUaGFuXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkuZ3RlKHZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJMZXNzIFRoYW5cIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5sdGUodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIF9jb25kaXRpb24gPSAoIV9jb25kaXRpb24gP1xuICAgICAgICBvckNvbmRpdGlvbiA6IF9jb25kaXRpb24uYW5kKG9yQ29uZGl0aW9uIGFzIHVua25vd24gYXMgQ29uZGl0aW9uPE1vZGVsPikpIGFzIENvbmRpdGlvbjxNb2RlbD47XG4gICAgfSk7XG5cbiAgICB0aGlzLnNvcnRCeSA9IHNvcnQ/LnZhbHVlIGFzIGtleW9mIE1vZGVsIHx8IHRoaXMucGs7XG4gICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gc29ydD8uZGlyZWN0aW9uIHx8IHRoaXMuc29ydERpcmVjdGlvbjtcbiAgfVxuICByZXR1cm4gX2NvbmRpdGlvbiBhcyBDb25kaXRpb248TW9kZWw+O1xuXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBxdWVyeSByZXN1bHRzIGludG8gYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LlxuICogQHN1bW1hcnkgSGFuZGxlcyBkaWZmZXJlbnQgcmVzdWx0IGZvcm1hdHMgZnJvbSB2YXJpb3VzIGRhdGEgc291cmNlcywgZXh0cmFjdGluZ1xuICogcGFnaW5hdGlvbiBpbmZvcm1hdGlvbiB3aGVuIGF2YWlsYWJsZSBhbmQgYXBwbHlpbmcgYW55IGNvbmZpZ3VyZWQgZGF0YSBtYXBwaW5nLlxuICogVGhpcyBlbnN1cmVzIGNvbnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiB0aGUgc291cmNlLlxuICpcbiAqIEBwcm90ZWN0ZWRcbiAqIEBwYXJhbSB7S2V5VmFsdWVbXSB8IFBhZ2luYXRvcn0gcmVzdWx0IC0gVGhlIHJhdyBxdWVyeSByZXN1bHRcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZVtdfSBUaGUgcHJvY2Vzc2VkIGFycmF5IG9mIGl0ZW1zXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xucHJvdGVjdGVkIGFzeW5jIHBhcnNlUmVzdWx0KHJlc3VsdDogS2V5VmFsdWVbXSB8IFBhZ2luYXRvcjxNb2RlbD4pOiBQcm9taXNlPEtleVZhbHVlW10+IHtcbiAgaWYoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiAoJ3BhZ2UnIGluIHJlc3VsdCAmJiAndG90YWwnIGluIHJlc3VsdCkpIHtcbiAgICBjb25zdCBwYWdpbmF0b3IgPSByZXN1bHQgYXMgUGFnaW5hdG9yPE1vZGVsPjtcbiAgICByZXN1bHQgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSh0aGlzLnBhZ2UpO1xuICAgIC8vIFRPRE86IENoYWdlIGZvciByZXN1bHQudG90YWw7XG4gICAgdGhpcy5nZXRNb3JlRGF0YShwYWdpbmF0b3IudG90YWwpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZ2V0TW9yZURhdGEoKHJlc3VsdCBhcyBLZXlWYWx1ZVtdKT8ubGVuZ3RoIHx8IDApO1xuICB9XG4gIHJldHVybiAoT2JqZWN0LmtleXModGhpcy5tYXBwZXIgfHwge30pLmxlbmd0aCkgP1xuICAgIHRoaXMubWFwUmVzdWx0cyhyZXN1bHQpIDogcmVzdWx0O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIHBhZ2luYXRpb24gc3RhdGUgYmFzZWQgb24gZGF0YSBsZW5ndGguXG4gKiBAc3VtbWFyeSBDYWxjdWxhdGVzIHdoZXRoZXIgbW9yZSBkYXRhIGlzIGF2YWlsYWJsZSBhbmQgaG93IG1hbnkgcGFnZXMgZXhpc3RcbiAqIGJhc2VkIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgYW5kIHRoZSBjb25maWd1cmVkIGxpbWl0IHBlciBwYWdlLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGNvbnRyb2wgcGFnaW5hdGlvbiBVSSBhbmQgaW5maW5pdGUgc2Nyb2xsaW5nIGJlaGF2aW9yLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggLSBUaGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGF2YWlsYWJsZVxuICogQHJldHVybnMge3ZvaWR9XG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xuZ2V0TW9yZURhdGEobGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYodGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFKSB7XG4gICAgaWYodGhpcy5wYWdpbmF0b3IpXG4gICAgICBsZW5ndGggPSBsZW5ndGggKiB0aGlzLmxpbWl0O1xuICAgIGlmKGxlbmd0aCA8PSB0aGlzLmxpbWl0KSB7XG4gICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VzID0gTWF0aC5mbG9vcihsZW5ndGggLyB0aGlzLmxpbWl0KTtcbiAgICAgIGlmKCh0aGlzLnBhZ2VzICogdGhpcy5saW1pdCkgPCBsZW5ndGgpXG4gICAgICAgIHRoaXMucGFnZXMgKz0gMTtcbiAgICAgIGlmKHRoaXMucGFnZXMgPT09IDEpXG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMucGFnZXMgPSBsZW5ndGg7XG4gICAgaWYodGhpcy5wYWdlcyA9PT0gMSlcbiAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBhIHNpbmdsZSBpdGVtIHVzaW5nIHRoZSBjb25maWd1cmVkIG1hcHBlci5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgYSBkYXRhIGl0ZW0gYWNjb3JkaW5nIHRvIHRoZSBtYXBwaW5nIGNvbmZpZ3VyYXRpb24sXG4gKiBleHRyYWN0aW5nIG5lc3RlZCBwcm9wZXJ0aWVzIGFuZCBmb3JtYXR0aW5nIHZhbHVlcyBhcyBuZWVkZWQuIFRoaXMgYWxsb3dzXG4gKiB0aGUgY29tcG9uZW50IHRvIGRpc3BsYXkgZGF0YSBpbiBhIGZvcm1hdCBkaWZmZXJlbnQgZnJvbSBob3cgaXQncyBzdG9yZWQuXG4gKlxuICogQHByb3RlY3RlZFxuICogQHBhcmFtIHtLZXlWYWx1ZX0gaXRlbSAtIFRoZSBpdGVtIHRvIG1hcFxuICogQHBhcmFtIHtLZXlWYWx1ZX0gbWFwcGVyIC0gVGhlIG1hcHBpbmcgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtLZXlWYWx1ZX0gW3Byb3BzXSAtIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBpbmNsdWRlXG4gKiBAcmV0dXJucyB7S2V5VmFsdWV9IFRoZSBtYXBwZWQgaXRlbVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbnByb3RlY3RlZCBpdGVtTWFwcGVyKGl0ZW06IEtleVZhbHVlLCBtYXBwZXI6IEtleVZhbHVlLCBwcm9wcz86IEtleVZhbHVlKTogS2V5VmFsdWUge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMobWFwcGVyKS5yZWR1Y2UoKGFjY3VtOiBLZXlWYWx1ZSwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgY29uc3QgYXJyYXlWYWx1ZSA9IHZhbHVlLnNwbGl0KCcuJyk7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgYWNjdW1ba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXJyYXlWYWx1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdmFsdWUgPSBpdGVtPy5bdmFsdWVdID8gaXRlbVt2YWx1ZV0gOiB2YWx1ZSAhPT0ga2V5ID8gdmFsdWUgOiBcIlwiO1xuICAgICAgICBpZihpc1ZhbGlkRGF0ZSh2YWx1ZSkpXG4gICAgICAgICAgdmFsdWUgPSBgJHtmb3JtYXREYXRlKHZhbHVlKX1gO1xuICAgICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgdmFsO1xuXG4gICAgICAgIGZvciAoY29uc3QgX3ZhbHVlIG9mIGFycmF5VmFsdWUpXG4gICAgICAgICAgdmFsID0gIXZhbFxuICAgICAgICAgICAgPyBpdGVtW192YWx1ZV1cbiAgICAgICAgICAgIDogKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZSh2YWwpIDogdmFsKVtfdmFsdWVdO1xuXG5cbiAgICAgICAgaWYgKGlzVmFsaWREYXRlKG5ldyBEYXRlKHZhbCkpKVxuICAgICAgICAgIHZhbCA9IGAke2Zvcm1hdERhdGUodmFsKX1gO1xuXG4gICAgICAgIGFjY3VtW2tleV0gPSB2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHByb3BzIHx8IHt9LCBhY2N1bSk7XG4gIH0sIHt9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBhbGwgcmVzdWx0IGl0ZW1zIHVzaW5nIHRoZSBjb25maWd1cmVkIG1hcHBlci5cbiAqIEBzdW1tYXJ5IEFwcGxpZXMgdGhlIGl0ZW1NYXBwZXIgdG8gZWFjaCBpdGVtIGluIHRoZSByZXN1bHQgc2V0LCBhZGRpbmdcbiAqIGNvbW1vbiBwcm9wZXJ0aWVzIGxpa2Ugb3BlcmF0aW9ucyBhbmQgcm91dGUgaW5mb3JtYXRpb24uIFRoaXMgdHJhbnNmb3Jtc1xuICogdGhlIHJhdyBkYXRhIGludG8gdGhlIGZvcm1hdCBleHBlY3RlZCBieSB0aGUgbGlzdCBpdGVtIGNvbXBvbmVudHMuXG4gKlxuICogQHBhcmFtIHtLZXlWYWx1ZVtdfSBkYXRhIC0gVGhlIGFycmF5IG9mIGl0ZW1zIHRvIG1hcFxuICogQHJldHVybnMge0tleVZhbHVlW119IFRoZSBhcnJheSBvZiBtYXBwZWQgaXRlbXNcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG4gIG1hcFJlc3VsdHMoZGF0YTogS2V5VmFsdWVbXSk6IEtleVZhbHVlW10ge1xuICAgIGlmKCFkYXRhIHx8ICFkYXRhLmxlbmd0aClcbiAgICAgIHJldHVybiBbXTtcbiAgICAvLyBwYXNzaW5nIHVpZCBhcyBwcm9wIHRvIG1hcHBlclxuICAgIHRoaXMubWFwcGVyID0gey4uLiB0aGlzLm1hcHBlciwgLi4uIHt1aWQ6IHRoaXMucGt9fTtcbiAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgb3BlcmF0aW9uczogdGhpcy5vcGVyYXRpb25zLFxuICAgICAgcm91dGU6IHRoaXMucm91dGUsXG4gICAgICAuLi4gIE9iamVjdC5rZXlzKHRoaXMuaXRlbSkucmVkdWNlKChhY2M6IEtleVZhbHVlLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBhY2Nba2V5XSA9IHRoaXMuaXRlbVtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30pLFxuICAgICAgLy8gLi4uICghdGhpcy5pdGVtLnJlbmRlciA/IHt9IDogIE9iamVjdC5rZXlzKHRoaXMuaXRlbSkucmVkdWNlKChhY2M6IEtleVZhbHVlLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgLy8gICBhY2Nba2V5XSA9IHRoaXMuaXRlbVtrZXkgYXMga2V5b2YgSUxpc3RJdGVtUHJvcF07XG4gICAgICAvLyAgIHJldHVybiBhY2M7XG4gICAgICAvLyB9LCB7fSkpXG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGEucmVkdWNlKChhY2N1bTogS2V5VmFsdWVbXSwgY3VycikgPT4ge1xuICAgICAgICBhY2N1bS5wdXNoKHsuLi4gdGhpcy5pdGVtTWFwcGVyKGN1cnIsIHRoaXMubWFwcGVyIGFzIEtleVZhbHVlLCBwcm9wcyksIC4uLiB7cGs6IHRoaXMucGt9fSk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG4gIH1cbn1cblxuIiwiXG5AaWYoc2hvd1JlZnJlc2hlcikge1xuICA8aW9uLXJlZnJlc2hlciBzbG90PVwiZml4ZWRcIiBbcHVsbEZhY3Rvcl09XCIxXCIgW3B1bGxNaW5dPVwiMTAwXCIgW3B1bGxNYXhdPVwiMjAwXCIgKGlvblJlZnJlc2gpPVwiaGFuZGxlUmVmcmVzaCgkZXZlbnQpXCI+XG4gICAgPGlvbi1yZWZyZXNoZXItY29udGVudCAvPlxuICA8L2lvbi1yZWZyZXNoZXI+XG59XG5cbkBpZihzaG93U2VhcmNoYmFyICYmIGRhdGE/Lmxlbmd0aCkge1xuICBAaWYobW9kZWwgJiYgZW5hYmxlRmlsdGVyKSB7XG4gICAgPG5neC1kZWNhZi1maWx0ZXJcbiAgICAgIFttb2RlbF09XCJtb2RlbFwiXG4gICAgICBbc29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCJcbiAgICAgIFtkaXNhYmxlU29ydF09XCJkaXNhYmxlU29ydFwiXG4gICAgICAoZmlsdGVyRXZlbnQpPVwiaGFuZGxlRmlsdGVyKCRldmVudClcIlxuICAgICAgKHNlYXJjaEV2ZW50KT1cImhhbmRsZVNlYXJjaCgkZXZlbnQpXCJcbiAgICAvPlxuICB9IEBlbHNlIHtcbiAgICA8bmd4LWRlY2FmLXNlYXJjaGJhciBbZW1pdEV2ZW50VG9XaW5kb3ddPVwiZmFsc2VcIiBbZGVib3VuY2VdPVwiNTAwXCIgKHNlYXJjaEV2ZW50KT1cImhhbmRsZVNlYXJjaCgkZXZlbnQpXCIgLz5cbiAgfVxufVxuXG5AaWYoZGF0YT8ubGVuZ3RoKSB7XG4gIDxpb24tbGlzdCBbaWRdPVwidWlkXCIgW2luc2V0XT1cImluc2V0XCIgW2xpbmVzXT1cImxpbmVzXCIgI2NvbXBvbmVudD5cbiAgICBAaWYoaXRlbT8udGFnKSB7XG4gICAgICBAZm9yKGNoaWxkIG9mIGl0ZW1zOyB0cmFjayB0cmFja0l0ZW1GbigkaW5kZXgsIGNoaWxkKSkge1xuICAgICAgICA8bmd4LWRlY2FmLWNvbXBvbmVudC1yZW5kZXJlclxuICAgICAgICAgIFt0YWddPVwiaXRlbS50YWdcIlxuICAgICAgICAgIChsaXN0ZW5FdmVudCk9XCJoYW5kbGVFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICBbZ2xvYmFsc109J3tcbiAgICAgICAgICAgIGl0ZW06IGNoaWxkLFxuICAgICAgICAgICAgbWFwcGVyOiBtYXBwZXIsXG4gICAgICAgICAgICByb3V0ZTogcm91dGVcbiAgICAgICAgICB9Jz5cbiAgICAgICAgICA8L25neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXI+XG4gICAgICAgIH1cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICB9XG4gIDwvaW9uLWxpc3Q+XG5cbiAgQGlmKGxvYWRNb3JlRGF0YSkge1xuICAgIEBpZihwYWdlcyA+IDAgJiYgdHlwZSA9PT0gJ3BhZ2luYXRlZCcgJiYgIXNlYXJjaFZhbHVlPy5sZW5ndGgpIHtcbiAgICAgIDxuZ3gtZGVjYWYtcGFnaW5hdGlvblxuICAgICAgICBbdG90YWxQYWdlc109XCJwYWdlc1wiXG4gICAgICAgIFtjdXJyZW50XT1cInBhZ2VcIlxuICAgICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVQYWdpbmF0ZSgkZXZlbnQpXCJcbiAgICAgIC8+XG5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxpb24taW5maW5pdGUtc2Nyb2xsXG4gICAgICAgIFtjbGFzc109XCJzZWFyY2hWYWx1ZT8ubGVuZ3RoID8gJ2RjZi1oaWRkZW4nIDogJydcIlxuXG4gICAgICAgIFtwb3NpdGlvbl09XCJzY3JvbGxQb3NpdGlvblwiXG4gICAgICAgIFt0aHJlc2hvbGRdPVwic2Nyb2xsVGhyZXNob2xkXCJcbiAgICAgICAgKGlvbkluZmluaXRlKT1cImhhbmRsZVJlZnJlc2goJGV2ZW50KVwiPlxuICAgICAgICA8aW9uLWluZmluaXRlLXNjcm9sbC1jb250ZW50IFtsb2FkaW5nU3Bpbm5lcl09XCJsb2FkaW5nU3Bpbm5lclwiIFtsb2FkaW5nVGV4dF09XCJsb2FkaW5nVGV4dFwiIC8+XG4gICAgICA8L2lvbi1pbmZpbml0ZS1zY3JvbGw+XG4gICAgfVxuICB9XG59IEBlbHNlIHtcbiAgQGlmKHJlZnJlc2hpbmcpIHtcbiAgICBAZm9yKHNrbCBvZiBza2VsZXRvbkRhdGE7IHRyYWNrIHNrbCkge1xuICAgICAgPGlvbi1pdGVtPlxuICAgICAgICA8aW9uLXRodW1ibmFpbCBzbG90PVwic3RhcnRcIj5cbiAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICA8L2lvbi10aHVtYm5haWw+XG4gICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJkYXRlXCIgc3R5bGU9XCJ3aWR0aDogMjAlO1wiPjxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+PC9pb24tdGV4dD5cbiAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIH1cblxuICB9IEBlbHNlIHtcbiAgICBAaWYoIXNlYXJjaFZhbHVlPy5sZW5ndGgpIHtcbiAgICAgIDxuZ3gtZGVjYWYtZW1wdHktc3RhdGVcbiAgICAgICAgW3RpdGxlXT1cIihsb2NhbGUgKyAnLicrIGVtcHR5LnRpdGxlKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtzdWJ0aXRsZV09XCIobG9jYWxlICsgJy4nKyBlbXB0eS5zdWJ0aXRsZSkgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbYnV0dG9uVGV4dF09XCJlbXB0eS5zaG93QnV0dG9uID8gKGxvY2FsZSArICcuJysgZW1wdHkuYnV0dG9uIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgW2J1dHRvbkxpbmtdPVwiZW1wdHkuc2hvd0J1dHRvbiA/IGVtcHR5LnJvdXRlIDogJydcIlxuICAgICAgLz5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxuZ3gtZGVjYWYtZW1wdHktc3RhdGVcbiAgICAgICAgaWNvbj1cInNlYXJjaC1vdXRsaW5lXCJcbiAgICAgICAgbmdDbGFzcz1cImVtcHR5LXNlYXJjaFwiXG4gICAgICAgIFt0cmFuc2xhdGFibGVdPVwidHJ1ZVwiXG4gICAgICAgIHRpdGxlPVwic2VhcmNoLnRpdGxlXCJcbiAgICAgICAgc3VidGl0bGU9XCJzZWFyY2guc3VidGl0bGVcIlxuICAgICAgICBbc2VhcmNoVmFsdWVdPVwic2VhcmNoVmFsdWVcIlxuICAgICAgLz5cbiAgICB9XG4gIH1cbn1cblxuIl19
|