angular-magic-breadcrumb
Version:
AngularMagicBreadcrumb is a library for self-generated breadcrumb in angular 7
216 lines • 21.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/custom-breadcrumb.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input } from '@angular/core';
import { NavigationEnd, Router } from "@angular/router";
import { AngularMagicBreadcrumbService } from "./angular-magic-breadcrumb.service";
import { filter } from "rxjs/operators";
import { Location } from '@angular/common';
export class CustomBreadcrumbComponent {
/**
* @param {?} router
* @param {?} breadcrumbService
* @param {?} location
*/
constructor(router, breadcrumbService, location) {
this.router = router;
this.breadcrumbService = breadcrumbService;
this.location = location;
// this variable will handle the current url split into a list structure
this.currentsplitUrl = [];
// this variable will handle the full breadcrumb itself, this variable will be used in the HTML template
this.breadcumValue = [];
// this variable is a flag that indicates if the Breadcrumb must be shown in a specific view
this.showBreadcrum = true;
}
/**
* @return {?}
*/
ngOnInit() {
this.setUrls();
this.getBreadcrum();
}
/**
* Checks if the part of the breadcrumb is active or not, and make the redirection to the specific url of the part
* @param {?} breadcrum -> part of the full breadcrumb
* @return {?}
*/
redirectToView(breadcrum) {
if (breadcrum.active) {
return;
}
this.router.navigate([breadcrum.url]);
}
/**
* Make the subscriptions to the two observables, and saves the value of them into a specific variable
* saves the breadcrumb and if should be shown or not
* @return {?}
*/
getBreadcrum() {
this.breadcrumbService.breadcrumbStructure_.subscribe((/**
* @param {?} value
* @return {?}
*/
value => {
/** @type {?} */
let newBreadcrum = [];
value.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
if (item.show == true) {
newBreadcrum.push(item);
}
}));
this.breadcumValue = newBreadcrum;
}));
this.breadcrumbService.showBreadcrumbStructure_.subscribe((/**
* @param {?} value
* @return {?}
*/
value => {
this.showBreadcrum = value;
}));
}
/**
* @return {?}
*/
setUrls() {
this._mainRoot = this.mainRoot;
this.router.events.pipe(
// Just executed when an navigation event ends
filter((/**
* @param {?} event
* @return {?}
*/
event => event instanceof NavigationEnd))).subscribe((/**
* @return {?}
*/
() => {
// returns and save the breadcrumb into a new temporal variable
/** @type {?} */
const currentBreadCrumStructure = this.getBreadcrumbStructure();
// resets the structure of the breadcrumb
this.breadcrumbService.resetBreadcrumbStructure();
// this variable will hold the url to add to the breadcrumb structure
/** @type {?} */
let setsUrl = '';
/** @type {?} */
const pathnameUrl = this.location.path().split('#')[0].split('?')[0];
// this condition is when the breadcrumb is in a platform that has got a route that we don't want to show in the breadcrumb
if (pathnameUrl.includes('/' + this._mainRoot + '/')) {
setsUrl = '/' + this._mainRoot;
}
if (pathnameUrl != this.lastPathname) {
// the breadcrumb must be shown if the first item change
this.showBreadcrum = true;
}
// splits the url by the route on the condition above and splits it by the '/' separator
// Removes the /plataforma/ and params if the url have one of them
/** @type {?} */
let splitUrl = pathnameUrl.split('/' + this._mainRoot + '/').join('').split('/');
// this line assure us that the url split has no blanks or null or empty elements
splitUrl = splitUrl.filter(Boolean);
splitUrl.forEach((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
(item, index) => {
setsUrl = setsUrl + '/' + item;
// a variable that holds the new part that will be added to the breadcrumb
/** @type {?} */
let newBreadcrum = {};
// if one part of the breadcrumb did'nt change, the last known value will be added (remains the same)
if (this.currentsplitUrl[index] === item) {
newBreadcrum = currentBreadCrumStructure[index];
}
else {
// else... a new structure is created
newBreadcrum = {
value: item,
url: setsUrl,
active: splitUrl.length - 1 === index,
show: true
};
}
// the new part of the breadcrumb is added to the structure that will be shown
this.setItemBreadcrumbStructure(newBreadcrum, index);
if (splitUrl.length - 1 === index) {
// in the last item of the route, the current route split is setted into the variable, to use it later when another navigation
// event happens
this.currentsplitUrl = splitUrl;
}
}));
this.lastPathname = pathnameUrl;
}));
}
/**
* @param {?} newBreadcrum
* @param {?} index
* @return {?}
*/
setItemBreadcrumbStructure(newBreadcrum, index) {
this.breadcrumbService.setItemBreadcrumbStructure(newBreadcrum, index);
}
/**
* @return {?}
*/
getBreadcrumbStructure() {
return this.breadcrumbService.getBreadcrumbStructure();
}
/**
* @param {?} value
* @return {?}
*/
changeVisibilityBreadcrumb(value) {
this.breadcrumbService.changeVisibilityBreadcrumb(value);
}
}
CustomBreadcrumbComponent.decorators = [
{ type: Component, args: [{
selector: 'lng-self-generated-breadcrumb',
template: "<div class=\"dynamic-breadcrumb\">\r\n <nav aria-label=\"breadcrumb\" class=\"navigation\" *ngIf=\"showBreadcrum\">\r\n <ol class=\"breadcrumb\">\r\n <li class=\"breadcrumb-item\" [class.active]=\"breadcrum.active\"\r\n (click)=\"redirectToView(breadcrum)\"\r\n style=\"text-transform: capitalize\"\r\n *ngFor=\"let breadcrum of breadcumValue\">{{breadcrum.value}}</li>\r\n </ol>\r\n </nav>\r\n</div>\r\n",
providers: [AngularMagicBreadcrumbService],
styles: [".dynamic-breadcrumb{background-color:#fff}.navigation{display:block}.breadcrumb{display:flex;flex-wrap:wrap;list-style:none;border-radius:.25rem;background-color:#fff;font-size:15px;padding:31px 30px 10px;color:#898989;font-weight:300;max-width:1216px;margin:0 auto}.breadcrumb .breadcrumb-item+.breadcrumb-item::before{display:inline-block;color:#6c757d;content:\"/\";padding-right:5px}.breadcrumb .breadcrumb-item{padding-left:5px}.breadcrumb .breadcrumb-item:not(.active){cursor:pointer}.breadcrumb .breadcrumb-item.active{color:#707070;font-weight:400}@media (min-width:768px){.breadcrumb{padding-left:30px;padding-bottom:22px}}@media (min-width:992px){.breadcrumb{padding-left:45px}}@media (min-width:1200px){.breadcrumb{font-size:17px;padding:40px 50px 10px}}"]
}] }
];
/** @nocollapse */
CustomBreadcrumbComponent.ctorParameters = () => [
{ type: Router },
{ type: AngularMagicBreadcrumbService },
{ type: Location }
];
CustomBreadcrumbComponent.propDecorators = {
mainRoot: [{ type: Input }]
};
if (false) {
/** @type {?} */
CustomBreadcrumbComponent.prototype.mainRoot;
/** @type {?} */
CustomBreadcrumbComponent.prototype._mainRoot;
/** @type {?} */
CustomBreadcrumbComponent.prototype.lastPathname;
/** @type {?} */
CustomBreadcrumbComponent.prototype.currentsplitUrl;
/** @type {?} */
CustomBreadcrumbComponent.prototype.breadcumValue;
/** @type {?} */
CustomBreadcrumbComponent.prototype.showBreadcrum;
/**
* @type {?}
* @private
*/
CustomBreadcrumbComponent.prototype.router;
/** @type {?} */
CustomBreadcrumbComponent.prototype.breadcrumbService;
/**
* @type {?}
* @private
*/
CustomBreadcrumbComponent.prototype.location;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWJyZWFkY3J1bWIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1tYWdpYy1icmVhZGNydW1iLyIsInNvdXJjZXMiOlsibGliL2N1c3RvbS1icmVhZGNydW1iLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxhQUFhLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDakYsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQVF6QyxNQUFNLE9BQU8seUJBQXlCOzs7Ozs7SUFlcEMsWUFDVSxNQUFjLEVBQ2YsaUJBQWdELEVBQy9DLFFBQWtCO1FBRmxCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZixzQkFBaUIsR0FBakIsaUJBQWlCLENBQStCO1FBQy9DLGFBQVEsR0FBUixRQUFRLENBQVU7O1FBYjVCLG9CQUFlLEdBQUcsRUFBRSxDQUFDOztRQUVyQixrQkFBYSxHQUlQLEVBQUUsQ0FBQzs7UUFFVCxrQkFBYSxHQUFHLElBQUksQ0FBQztJQU1qQixDQUFDOzs7O0lBRUwsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDOzs7Ozs7SUFNRCxjQUFjLENBQUMsU0FBUztRQUN0QixJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDcEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDOzs7Ozs7SUFN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RSxLQUFLLENBQUMsQ0FBQztnQkFFckQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxLQUFLLEVBQUU7b0JBQ2pDLDhIQUE4SDtvQkFDOUgsZ0JBQWdCO29CQUNoQixJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztpQkFDakM7WUFFSCxDQUFDLEVBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQ2xDLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7O0lBRUQsMEJBQTBCLENBQUMsWUFBWSxFQUFFLEtBQUs7UUFDNUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLDBCQUEwQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6RSxDQUFDOzs7O0lBRUQsc0JBQXNCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLENBQUE7SUFDeEQsQ0FBQzs7Ozs7SUFFRCwwQkFBMEIsQ0FBQyxLQUFjO1FBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMxRCxDQUFDOzs7WUFsSUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSwrQkFBK0I7Z0JBQ3pDLHdjQUFpRDtnQkFFakQsU0FBUyxFQUFFLENBQUMsNkJBQTZCLENBQUM7O2FBQzNDOzs7O1lBVnNCLE1BQU07WUFDckIsNkJBQTZCO1lBRTdCLFFBQVE7Ozt1QkFTYixLQUFLOzs7O0lBQU4sNkNBQTBCOztJQUMxQiw4Q0FBa0I7O0lBQ2xCLGlEQUFxQjs7SUFFckIsb0RBQXFCOztJQUVyQixrREFJUzs7SUFFVCxrREFBcUI7Ozs7O0lBR25CLDJDQUFzQjs7SUFDdEIsc0RBQXVEOzs7OztJQUN2RCw2Q0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TmF2aWdhdGlvbkVuZCwgUm91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7QW5ndWxhck1hZ2ljQnJlYWRjcnVtYlNlcnZpY2V9IGZyb20gXCIuL2FuZ3VsYXItbWFnaWMtYnJlYWRjcnVtYi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7ZmlsdGVyfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtMb2NhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbG5nLXNlbGYtZ2VuZXJhdGVkLWJyZWFkY3J1bWInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jdXN0b20tYnJlYWRjcnVtYi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY3VzdG9tLWJyZWFkY3J1bWIuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFtBbmd1bGFyTWFnaWNCcmVhZGNydW1iU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEN1c3RvbUJyZWFkY3J1bWJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIG1haW5Sb290OiBTdHJpbmc7XHJcbiAgX21haW5Sb290OiBTdHJpbmc7XHJcbiAgbGFzdFBhdGhuYW1lOiBzdHJpbmc7XHJcbiAgLy8gdGhpcyB2YXJpYWJsZSB3aWxsIGhhbmRsZSB0aGUgY3VycmVudCB1cmwgc3BsaXQgaW50byBhIGxpc3Qgc3RydWN0dXJlXHJcbiAgY3VycmVudHNwbGl0VXJsID0gW107XHJcbiAgLy8gdGhpcyB2YXJpYWJsZSB3aWxsIGhhbmRsZSB0aGUgZnVsbCBicmVhZGNydW1iIGl0c2VsZiwgdGhpcyB2YXJpYWJsZSB3aWxsIGJlIHVzZWQgaW4gdGhlIEhUTUwgdGVtcGxhdGVcclxuICBicmVhZGN1bVZhbHVlOiB7XHJcbiAgICB1cmw6IHN0cmluZyxcclxuICAgIGFjdGl2ZTogYm9vbGVhbixcclxuICAgIHZhbHVlOiBzdHJpbmdcclxuICB9W10gPSBbXTtcclxuICAvLyB0aGlzIHZhcmlhYmxlIGlzIGEgZmxhZyB0aGF0IGluZGljYXRlcyBpZiB0aGUgQnJlYWRjcnVtYiBtdXN0IGJlIHNob3duIGluIGEgc3BlY2lmaWMgdmlld1xyXG4gIHNob3dCcmVhZGNydW0gPSB0cnVlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwdWJsaWMgYnJlYWRjcnVtYlNlcnZpY2U6IEFuZ3VsYXJNYWdpY0JyZWFkY3J1bWJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb25cclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuc2V0VXJscygpO1xyXG4gICAgdGhpcy5nZXRCcmVhZGNydW0oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiB0aGUgcGFydCBvZiB0aGUgYnJlYWRjcnVtYiBpcyBhY3RpdmUgb3Igbm90LCBhbmQgbWFrZSB0aGUgcmVkaXJlY3Rpb24gdG8gdGhlIHNwZWNpZmljIHVybCBvZiB0aGUgcGFydFxyXG4gICAqIEBwYXJhbSBicmVhZGNydW0gLT4gcGFydCBvZiB0aGUgZnVsbCBicmVhZGNydW1iXHJcbiAgICovXHJcbiAgcmVkaXJlY3RUb1ZpZXcoYnJlYWRjcnVtKSB7XHJcbiAgICBpZiAoYnJlYWRjcnVtLmFjdGl2ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYnJlYWRjcnVtLnVybF0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFrZSB0aGUgc3Vic2NyaXB0aW9ucyB0byB0aGUgdHdvIG9ic2VydmFibGVzLCBhbmQgc2F2ZXMgdGhlIHZhbHVlIG9mIHRoZW0gaW50byBhIHNwZWNpZmljIHZhcmlhYmxlXHJcbiAgICogc2F2ZXMgdGhlIGJyZWFkY3J1bWIgYW5kIGlmIHNob3VsZCBiZSBzaG93biBvciBub3RcclxuICAgKi9cclxuICBnZXRCcmVhZGNydW0oKSB7XHJcbiAgICB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLmJyZWFkY3J1bWJTdHJ1Y3R1cmVfLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgIGxldCBuZXdCcmVhZGNydW0gPSBbXTtcclxuICAgICAgdmFsdWUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpZiAoaXRlbS5zaG93ID09IHRydWUpIHtcclxuICAgICAgICAgIG5ld0JyZWFkY3J1bS5wdXNoKGl0ZW0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5icmVhZGN1bVZhbHVlID0gbmV3QnJlYWRjcnVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5icmVhZGNydW1iU2VydmljZS5zaG93QnJlYWRjcnVtYlN0cnVjdHVyZV8uc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgdGhpcy5zaG93QnJlYWRjcnVtID0gdmFsdWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldFVybHMoKSB7XHJcbiAgICB0aGlzLl9tYWluUm9vdCA9IHRoaXMubWFpblJvb3Q7XHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHMucGlwZShcclxuICAgICAgLy8gSnVzdCBleGVjdXRlZCB3aGVuIGFuIG5hdmlnYXRpb24gZXZlbnQgZW5kc1xyXG4gICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKVxyXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAvLyByZXR1cm5zIGFuZCBzYXZlIHRoZSBicmVhZGNydW1iIGludG8gYSBuZXcgdGVtcG9yYWwgdmFyaWFibGVcclxuICAgICAgY29uc3QgY3VycmVudEJyZWFkQ3J1bVN0cnVjdHVyZSA9IHRoaXMuZ2V0QnJlYWRjcnVtYlN0cnVjdHVyZSgpO1xyXG4gICAgICAvLyByZXNldHMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgYnJlYWRjcnVtYlxyXG4gICAgICB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLnJlc2V0QnJlYWRjcnVtYlN0cnVjdHVyZSgpO1xyXG4gICAgICAvLyB0aGlzIHZhcmlhYmxlIHdpbGwgaG9sZCB0aGUgdXJsIHRvIGFkZCB0byB0aGUgYnJlYWRjcnVtYiBzdHJ1Y3R1cmVcclxuICAgICAgbGV0IHNldHNVcmwgPSAnJztcclxuICAgICAgY29uc3QgcGF0aG5hbWVVcmwgPSB0aGlzLmxvY2F0aW9uLnBhdGgoKS5zcGxpdCgnIycpWzBdLnNwbGl0KCc/JylbMF07XHJcbiAgICAgIC8vIHRoaXMgY29uZGl0aW9uIGlzIHdoZW4gdGhlIGJyZWFkY3J1bWIgaXMgaW4gYSBwbGF0Zm9ybSB0aGF0IGhhcyBnb3QgYSByb3V0ZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gc2hvdyBpbiB0aGUgYnJlYWRjcnVtYlxyXG4gICAgICBpZiAocGF0aG5hbWVVcmwuaW5jbHVkZXMoJy8nKyB0aGlzLl9tYWluUm9vdCArJy8nKSkge1xyXG4gICAgICAgIHNldHNVcmwgPSAnLycrIHRoaXMuX21haW5Sb290O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwYXRobmFtZVVybCAhPSB0aGlzLmxhc3RQYXRobmFtZSkge1xyXG4gICAgICAgIC8vIHRoZSBicmVhZGNydW1iIG11c3QgYmUgc2hvd24gaWYgdGhlIGZpcnN0IGl0ZW0gY2hhbmdlXHJcbiAgICAgICAgdGhpcy5zaG93QnJlYWRjcnVtID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc3BsaXRzIHRoZSB1cmwgYnkgdGhlIHJvdXRlIG9uIHRoZSBjb25kaXRpb24gYWJvdmUgYW5kIHNwbGl0cyBpdCBieSB0aGUgJy8nIHNlcGFyYXRvclxyXG4gICAgICAvLyBSZW1vdmVzIHRoZSAvcGxhdGFmb3JtYS8gYW5kIHBhcmFtcyBpZiB0aGUgdXJsIGhhdmUgb25lIG9mIHRoZW1cclxuICAgICAgbGV0IHNwbGl0VXJsID0gcGF0aG5hbWVVcmwuc3BsaXQoJy8nKyB0aGlzLl9tYWluUm9vdCArJy8nKS5qb2luKCcnKS5zcGxpdCgnLycpO1xyXG4gICAgICAvLyB0aGlzIGxpbmUgYXNzdXJlIHVzIHRoYXQgdGhlIHVybCBzcGxpdCBoYXMgbm8gYmxhbmtzIG9yIG51bGwgb3IgZW1wdHkgZWxlbWVudHNcclxuICAgICAgc3BsaXRVcmwgPSBzcGxpdFVybC5maWx0ZXIoQm9vbGVhbik7XHJcbiAgICAgIHNwbGl0VXJsLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgc2V0c1VybCA9IHNldHNVcmwgKyAnLycgKyBpdGVtO1xyXG4gICAgICAgIC8vIGEgdmFyaWFibGUgdGhhdCBob2xkcyB0aGUgbmV3IHBhcnQgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBicmVhZGNydW1iXHJcbiAgICAgICAgbGV0IG5ld0JyZWFkY3J1bSA9IHt9O1xyXG4gICAgICAgIC8vIGlmIG9uZSBwYXJ0IG9mIHRoZSBicmVhZGNydW1iIGRpZCdudCBjaGFuZ2UsIHRoZSBsYXN0IGtub3duIHZhbHVlIHdpbGwgYmUgYWRkZWQgKHJlbWFpbnMgdGhlIHNhbWUpXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudHNwbGl0VXJsW2luZGV4XSA9PT0gaXRlbSkge1xyXG4gICAgICAgICAgbmV3QnJlYWRjcnVtID0gY3VycmVudEJyZWFkQ3J1bVN0cnVjdHVyZVtpbmRleF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGVsc2UuLi4gYSBuZXcgc3RydWN0dXJlIGlzIGNyZWF0ZWRcclxuICAgICAgICAgIG5ld0JyZWFkY3J1bSA9IHtcclxuICAgICAgICAgICAgdmFsdWU6IGl0ZW0sXHJcbiAgICAgICAgICAgIHVybDogc2V0c1VybCxcclxuICAgICAgICAgICAgYWN0aXZlOiBzcGxpdFVybC5sZW5ndGggLSAxID09PSBpbmRleCxcclxuICAgICAgICAgICAgc2hvdzogdHJ1ZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhlIG5ldyBwYXJ0IG9mIHRoZSBicmVhZGNydW1iIGlzIGFkZGVkIHRvIHRoZSBzdHJ1Y3R1cmUgdGhhdCB3aWxsIGJlIHNob3duXHJcbiAgICAgICAgdGhpcy5zZXRJdGVtQnJlYWRjcnVtYlN0cnVjdHVyZShuZXdCcmVhZGNydW0sIGluZGV4KTtcclxuXHJcbiAgICAgICAgaWYgKHNwbGl0VXJsLmxlbmd0aCAtIDEgPT09IGluZGV4KSB7XHJcbiAgICAgICAgICAvLyBpbiB0aGUgbGFzdCBpdGVtIG9mIHRoZSByb3V0ZSwgdGhlIGN1cnJlbnQgcm91dGUgc3BsaXQgaXMgc2V0dGVkIGludG8gdGhlIHZhcmlhYmxlLCB0byB1c2UgaXQgbGF0ZXIgd2hlbiBhbm90aGVyIG5hdmlnYXRpb25cclxuICAgICAgICAgIC8vIGV2ZW50IGhhcHBlbnNcclxuICAgICAgICAgIHRoaXMuY3VycmVudHNwbGl0VXJsID0gc3BsaXRVcmw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMubGFzdFBhdGhuYW1lID0gcGF0aG5hbWVVcmw7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldEl0ZW1CcmVhZGNydW1iU3RydWN0dXJlKG5ld0JyZWFkY3J1bSwgaW5kZXgpIHtcclxuICAgIHRoaXMuYnJlYWRjcnVtYlNlcnZpY2Uuc2V0SXRlbUJyZWFkY3J1bWJTdHJ1Y3R1cmUobmV3QnJlYWRjcnVtLCBpbmRleCk7XHJcbiAgfVxyXG5cclxuICBnZXRCcmVhZGNydW1iU3RydWN0dXJlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYnJlYWRjcnVtYlNlcnZpY2UuZ2V0QnJlYWRjcnVtYlN0cnVjdHVyZSgpXHJcbiAgfVxyXG5cclxuICBjaGFuZ2VWaXNpYmlsaXR5QnJlYWRjcnVtYih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5icmVhZGNydW1iU2VydmljZS5jaGFuZ2VWaXNpYmlsaXR5QnJlYWRjcnVtYih2YWx1ZSlcclxuICB9XHJcblxyXG59XHJcbiJdfQ==