UNPKG

kipon-xrmservice

Version:

Dynamics 365 CE web api wrapper for angular, making life easier when building angular based web resources

239 lines 36.8 kB
import { Injectable } from '@angular/core'; import { HttpHeaders } from '@angular/common/http'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { Entity, Condition, Comparator } from './xrmcontext.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; import * as i2 from "./xrmcontext.service"; export class LabelMeta { } export class DisplayNameMeta { } export class EntityMeta extends Entity { constructor() { super("EntityDefinitions", "MetadataId"); this.DisplayName = null; this.LogicalName = null; this.ObjectTypeCode = null; this.SchemaName = null; this.LogicalCollectionName = null; this.IsActivity = null; this.IsActivityParty = null; this.Attributes = null; } meta() { this.Attributes = [new AttributeMeta()]; return this; } } export class AttributeMeta extends Entity { constructor() { super("Attributes", "MetadataId"); this.AttributeType = null; this.DisplayName = null; this.LogicalName = null; this.Description = null; this.SchemaName = null; } onFetch() { this.selected = false; } } export class OneToManyRelationship { constructor() { this.MetadataId = null; this.RelationshipType = null; this.SchemaName = null; this.ReferencedAttribute = null; this.ReferencingAttribute = null; this.ReferencedEntity = null; this.ReferencingEntity = null; } } export class ManyToManyRelationship { constructor() { this.MetadataId = null; this.Entity1LogicalName = null; this.Entity1NavigationPropertyName = null; this.Entity2LogicalName = null; this.Entity2NavigationPropertyName = null; this.SchemaName = null; this.RelationshipType = null; this.Other = null; this.OtherSchemaName = null; this.Entity1LogicalCollectionName = null; this.Entity2LogicalCollectionName = null; } } export class LookupAttribute { } export class AttributeOptionsetMeta { } class OptionSetMeta { } class OptionSetMetaValue { } class OptionsetLabelMeta { } class OptionsetLabel { } export class XrmMetadataService { constructor(http, xrmService) { this.http = http; this.xrmService = xrmService; this.searchEntityMetaPrototype = new EntityMeta(); this.getEntityMetaPrototype = new EntityMeta().meta(); } search(name, unique = false) { let con = new Condition(); if (!unique) { con .where("LogicalCollectionName", Comparator.ContainsData) .where("LogicalName", Comparator.ContainsData); } else { con.where("LogicalName", Comparator.Equals, name); } return this.xrmService.query(this.searchEntityMetaPrototype, con).pipe(map(_r => { let r = _r; if (name != null && name != '') { let _s = name.toLowerCase(); let ma = []; // Metadata api does not support contains - therefore client site filter r.value.forEach(e => { if (e != null && e.LogicalName != null && e.LogicalName.toLowerCase().indexOf(_s) >= 0) { ma.push(e); } }); r.value = ma; } r.value = r.value.sort((a, b) => a.LogicalName.toLowerCase().localeCompare(b.LogicalName.toLowerCase())); return _r; })); } get(id) { return this.xrmService.get(this.getEntityMetaPrototype, id).pipe(map(_r => { let r = _r; if (r.Attributes != null && r.Attributes.length > 0) { r.Attributes = r.Attributes.sort((a, b) => { if (a.LogicalName == null && b.LogicalName != null) return 1; if (a.LogicalName != null && b.LogicalName == null) return -1; if (a.LogicalName == null && b.LogicalName == null) return 0; return a.LogicalName.toLowerCase().localeCompare(b.LogicalName.toLowerCase()); }); } return r; })); } getManyToManyRelationships(entity) { let headers = new HttpHeaders({ 'Accept': 'application/json' }); headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=*"); let options = { headers: headers }; return this.http.get(this.xrmService.getServiceUrl() + 'EntityDefinitions(' + entity.id + ')' + '/ManyToManyRelationships?$select=MetadataId,Entity1LogicalName,Entity1NavigationPropertyName,Entity2LogicalName,Entity2NavigationPropertyName,SchemaName,RelationshipType', options) .pipe(map(response => { entity.ManyToManyRelations = response["value"]; entity.ManyToManyRelations.forEach(r => { if (r.Entity1LogicalName == entity.LogicalName) { r.Other = r.Entity2LogicalName; r.OtherSchemaName = entity.SchemaName; r.Entity1LogicalCollectionName = entity.LogicalCollectionName; } else { r.Other = r.Entity1LogicalName; r.Entity2LogicalCollectionName = entity.LogicalCollectionName; } }); this.resolveRelationshipNames(entity.ManyToManyRelations); return entity; })); } resolveRelationshipNames(relations) { relations.forEach(r => { if (r.Entity1LogicalCollectionName == null) { this.search(r.Entity1LogicalName, true).subscribe(s => { r.Entity1LogicalCollectionName = s.value[0].LogicalCollectionName; if (r.Other == r.Entity1LogicalName) { r.OtherSchemaName = s.value[0].SchemaName; } }); } if (r.Entity2LogicalCollectionName == null) { this.search(r.Entity2LogicalName, true).subscribe(s => { r.Entity2LogicalCollectionName = s.value[0].LogicalCollectionName; if (r.Other = r.Entity2LogicalName) { r.OtherSchemaName = s.value[0].SchemaName; } }); } }); } getOneToManyRelationships(entity) { let headers = new HttpHeaders({ 'Accept': 'application/json' }); headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=*"); let options = { headers: headers }; return this.http.get(this.xrmService.getServiceUrl() + 'EntityDefinitions(' + entity.id + ')' + '/OneToManyRelationships?$select=MetadataId,RelationshipType,SchemaName,ReferencedAttribute,ReferencingAttribute,ReferencedEntity,ReferencingEntity,ReferencingEntityNavigationPropertyName', options) .pipe(map(response => { entity.OneToManyRelations = response["value"]; return entity; })); } getLookup(entity, attr) { if (attr.AttributeType == 'Lookup') { let headers = new HttpHeaders({ 'Accept': 'application/json' }); headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=*"); let options = { headers: headers }; return this.http.get(this.xrmService.getServiceUrl() + 'EntityDefinitions(' + entity.id + ')/Attributes(' + attr.id + ')/Microsoft.Dynamics.CRM.LookupAttributeMetadata?$select=Targets,LogicalName,SchemaName') .pipe(map(response => { attr.Lookup = response; return entity; })); } if (attr.AttributeType == 'Customer') { attr.Lookup = { LogicalName: attr.LogicalName, SchemaName: attr.SchemaName, Targets: ['account', 'contact'] }; return new Observable(o => { o.next(entity); }); } throw 'unknown Lookup type ' + attr.AttributeType; } getPicklists(entity) { let headers = new HttpHeaders({ 'Accept': 'application/json' }); headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=*"); let options = { headers: headers }; return this.http.get(this.xrmService.getServiceUrl() + 'EntityDefinitions(LogicalName=\'' + entity.LogicalName + '\')/Attributes/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=LogicalName&$expand=OptionSet,GlobalOptionSet').pipe(map(r => r.value)); } } XrmMetadataService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: XrmMetadataService, deps: [{ token: i1.HttpClient }, { token: i2.XrmContextService }], target: i0.ɵɵFactoryTarget.Injectable }); XrmMetadataService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: XrmMetadataService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: XrmMetadataService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.XrmContextService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2tpcG9uLXhybXNlcnZpY2Uvc3JjL2xpYi9tZXRhZGF0YS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBR3BDLE9BQU8sRUFBcUIsTUFBTSxFQUFrQixTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFFeEcsTUFBTSxPQUFPLFNBQVM7Q0FNckI7QUFFRCxNQUFNLE9BQU8sZUFBZTtDQUczQjtBQUVELE1BQU0sT0FBTyxVQUFXLFNBQVEsTUFBTTtJQUNwQztRQUNFLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUczQyxnQkFBVyxHQUFjLElBQUksQ0FBQztRQUM5QixnQkFBVyxHQUFXLElBQUksQ0FBQztRQUMzQixtQkFBYyxHQUFXLElBQUksQ0FBQztRQUM5QixlQUFVLEdBQVcsSUFBSSxDQUFDO1FBQzFCLDBCQUFxQixHQUFXLElBQUksQ0FBQztRQUNyQyxlQUFVLEdBQVksSUFBSSxDQUFDO1FBQzNCLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBQ2hDLGVBQVUsR0FBb0IsSUFBSSxDQUFDO0lBVG5DLENBQUM7SUFjRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksYUFBYSxFQUFFLENBQUMsQ0FBQztRQUN4QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxhQUFjLFNBQVEsTUFBTTtJQUN2QztRQUNFLEtBQUss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Q0FBQyxJQUFJLENBQUMsR0FBRyxDQUFnQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxHQUFHLGtDQUFrQyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsdUhBQXVILENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDblMsQ0FBQzs7K0dBektVLGtCQUFrQjttSEFBbEIsa0JBQWtCOzJGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG5cclxuaW1wb3J0IHsgWHJtU2VydmljZSwgWHJtUXVlcnlSZXN1bHQgfSBmcm9tICcuL3hybS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgWHJtQ29udGV4dFNlcnZpY2UsIEVudGl0eSwgT3B0aW9uU2V0VmFsdWUsIENvbmRpdGlvbiwgQ29tcGFyYXRvciB9IGZyb20gJy4veHJtY29udGV4dC5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBMYWJlbE1ldGEge1xyXG4gIExhYmVsOiBzdHJpbmc7XHJcbiAgTGFuZ3VhZ2VDb2RlOiBudW1iZXI7XHJcbiAgSXNNYW5hZ2VkOiBib29sZWFuO1xyXG4gIE1ldGFkYXRhSWQ6IHN0cmluZztcclxuICBIYXNDaGFuZ2VkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRGlzcGxheU5hbWVNZXRhIHtcclxuICBMb2NhbGl6ZWRMYWJlbHM6IExhYmVsTWV0YVtdO1xyXG4gIFVzZXJMb2NhbGl6ZWRMYWJlbDogTGFiZWxNZXRhO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRW50aXR5TWV0YSBleHRlbmRzIEVudGl0eSB7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcihcIkVudGl0eURlZmluaXRpb25zXCIsIFwiTWV0YWRhdGFJZFwiKTtcclxuICB9XHJcblxyXG4gIERpc3BsYXlOYW1lOiBMYWJlbE1ldGEgPSBudWxsO1xyXG4gIExvZ2ljYWxOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIE9iamVjdFR5cGVDb2RlOiBudW1iZXIgPSBudWxsO1xyXG4gIFNjaGVtYU5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgTG9naWNhbENvbGxlY3Rpb25OYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIElzQWN0aXZpdHk6IGJvb2xlYW4gPSBudWxsO1xyXG4gIElzQWN0aXZpdHlQYXJ0eTogYm9vbGVhbiA9IG51bGw7XHJcbiAgQXR0cmlidXRlczogQXR0cmlidXRlTWV0YVtdID0gbnVsbDtcclxuXHJcbiAgT25lVG9NYW55UmVsYXRpb25zOiBPbmVUb01hbnlSZWxhdGlvbnNoaXBbXTtcclxuICBNYW55VG9NYW55UmVsYXRpb25zOiBNYW55VG9NYW55UmVsYXRpb25zaGlwW107XHJcblxyXG4gIG1ldGEoKTogRW50aXR5TWV0YSB7XHJcbiAgICB0aGlzLkF0dHJpYnV0ZXMgPSBbbmV3IEF0dHJpYnV0ZU1ldGEoKV07XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVNZXRhIGV4dGVuZHMgRW50aXR5IHtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKFwiQXR0cmlidXRlc1wiLCBcIk1ldGFkYXRhSWRcIilcclxuICB9XHJcbiAgQXR0cmlidXRlVHlwZTogc3RyaW5nID0gbnVsbDtcclxuICBEaXNwbGF5TmFtZTogTGFiZWxNZXRhID0gbnVsbDtcclxuICBMb2dpY2FsTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBEZXNjcmlwdGlvbjogTGFiZWxNZXRhID0gbnVsbDtcclxuICBTY2hlbWFOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvLyB2aXJ0dWFsIHByb3BlcnRpZXMgZm9yIHVpIHB1cnBvc2VcclxuICBzZWxlY3RlZDogYm9vbGVhbjtcclxuICBMb29rdXA6IExvb2t1cEF0dHJpYnV0ZTtcclxuXHJcbiAgb25GZXRjaCgpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBPbmVUb01hbnlSZWxhdGlvbnNoaXAge1xyXG4gIE1ldGFkYXRhSWQ6IHN0cmluZyA9IG51bGw7XHJcbiAgUmVsYXRpb25zaGlwVHlwZTogbnVtYmVyID0gbnVsbDtcclxuICBTY2hlbWFOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIFJlZmVyZW5jZWRBdHRyaWJ1dGU6IHN0cmluZyA9IG51bGw7XHJcbiAgUmVmZXJlbmNpbmdBdHRyaWJ1dGU6IHN0cmluZyA9IG51bGw7XHJcbiAgUmVmZXJlbmNlZEVudGl0eTogc3RyaW5nID0gbnVsbDtcclxuICBSZWZlcmVuY2luZ0VudGl0eTogc3RyaW5nID0gbnVsbDtcclxuICBSZWZlcmVuY2luZ0VudGl0eU5hdmlnYXRpb25Qcm9wZXJ0eU5hbWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1hbnlUb01hbnlSZWxhdGlvbnNoaXAge1xyXG4gIE1ldGFkYXRhSWQ6IHN0cmluZyA9IG51bGw7XHJcbiAgRW50aXR5MUxvZ2ljYWxOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIEVudGl0eTFOYXZpZ2F0aW9uUHJvcGVydHlOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIEVudGl0eTJMb2dpY2FsTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBFbnRpdHkyTmF2aWdhdGlvblByb3BlcnR5TmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBTY2hlbWFOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIFJlbGF0aW9uc2hpcFR5cGU6IHN0cmluZyA9IG51bGw7XHJcbiAgT3RoZXI6IHN0cmluZyA9IG51bGw7XHJcbiAgT3RoZXJTY2hlbWFOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIEVudGl0eTFMb2dpY2FsQ29sbGVjdGlvbk5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgRW50aXR5MkxvZ2ljYWxDb2xsZWN0aW9uTmFtZTogc3RyaW5nID0gbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIExvb2t1cEF0dHJpYnV0ZSB7XHJcbiAgVGFyZ2V0czogc3RyaW5nW107XHJcbiAgTG9naWNhbE5hbWU6IHN0cmluZztcclxuICBTY2hlbWFOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQXR0cmlidXRlT3B0aW9uc2V0TWV0YVJlc3VsdCB7XHJcbiAgdmFsdWU6IEF0dHJpYnV0ZU9wdGlvbnNldE1ldGFbXTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZU9wdGlvbnNldE1ldGEge1xyXG4gIHB1YmxpYyBMb2dpY2FsTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBNZXRhZGF0YUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIE9wdGlvblNldDogT3B0aW9uU2V0TWV0YSB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuY2xhc3MgT3B0aW9uU2V0TWV0YSB7XHJcbiAgcHVibGljIE9wdGlvbnM6IE9wdGlvblNldE1ldGFWYWx1ZVtdIHwgdW5kZWZpbmVkO1xyXG5cclxufVxyXG5cclxuY2xhc3MgT3B0aW9uU2V0TWV0YVZhbHVlIHtcclxuICBwdWJsaWMgVmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgTGFiZWw6IE9wdGlvbnNldExhYmVsTWV0YSB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuXHJcbmNsYXNzIE9wdGlvbnNldExhYmVsTWV0YSB7XHJcbiAgcHVibGljIFVzZXJMb2NhbGl6ZWRMYWJlbDogT3B0aW9uc2V0TGFiZWwgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIExvY2FsaXplZExhYmVsczogT3B0aW9uc2V0TGFiZWxbXSB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuXHJcblxyXG5jbGFzcyBPcHRpb25zZXRMYWJlbCB7XHJcbiAgcHVibGljIExhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIExhbmd1YWdlQ29kZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBNZXRhZGF0YUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBYcm1NZXRhZGF0YVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgc2VhcmNoRW50aXR5TWV0YVByb3RvdHlwZSA9IG5ldyBFbnRpdHlNZXRhKCk7XHJcbiAgcHJpdmF0ZSBnZXRFbnRpdHlNZXRhUHJvdG90eXBlID0gbmV3IEVudGl0eU1ldGEoKS5tZXRhKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSB4cm1TZXJ2aWNlOiBYcm1Db250ZXh0U2VydmljZSkgeyB9XHJcblxyXG4gIHNlYXJjaChuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFhybVF1ZXJ5UmVzdWx0PEVudGl0eU1ldGE+PjtcclxuICBzZWFyY2gobmFtZTogc3RyaW5nLCB1bmlxdWU6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPFhybVF1ZXJ5UmVzdWx0PEVudGl0eU1ldGE+PjtcclxuICBzZWFyY2gobmFtZTogc3RyaW5nLCB1bmlxdWU6IGJvb2xlYW4gPSBmYWxzZSk6IE9ic2VydmFibGU8WHJtUXVlcnlSZXN1bHQ8RW50aXR5TWV0YT4+IHtcclxuICAgIGxldCBjb24gPSBuZXcgQ29uZGl0aW9uKCk7XHJcbiAgICBpZiAoIXVuaXF1ZSkge1xyXG4gICAgICBjb25cclxuICAgICAgICAud2hlcmUoXCJMb2dpY2FsQ29sbGVjdGlvbk5hbWVcIiwgQ29tcGFyYXRvci5Db250YWluc0RhdGEpXHJcbiAgICAgICAgLndoZXJlKFwiTG9naWNhbE5hbWVcIiwgQ29tcGFyYXRvci5Db250YWluc0RhdGEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uLndoZXJlKFwiTG9naWNhbE5hbWVcIiwgQ29tcGFyYXRvci5FcXVhbHMsIG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnhybVNlcnZpY2UucXVlcnkodGhpcy5zZWFyY2hFbnRpdHlNZXRhUHJvdG90eXBlLCBjb24pLnBpcGUobWFwKF9yID0+IHtcclxuICAgICAgbGV0IHIgPSBfciBhcyBYcm1RdWVyeVJlc3VsdDxFbnRpdHlNZXRhPjtcclxuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lICE9ICcnKSB7XHJcbiAgICAgICAgbGV0IF9zID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGxldCBtYTogRW50aXR5TWV0YVtdID0gW107XHJcbiAgICAgICAgLy8gTWV0YWRhdGEgYXBpIGRvZXMgbm90IHN1cHBvcnQgY29udGFpbnMgLSB0aGVyZWZvcmUgY2xpZW50IHNpdGUgZmlsdGVyXHJcbiAgICAgICAgci52YWx1ZS5mb3JFYWNoKGUgPT4ge1xyXG4gICAgICAgICAgaWYgKGUgIT0gbnVsbCAmJiBlLkxvZ2ljYWxOYW1lICE9IG51bGwgJiYgZS5Mb2dpY2FsTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoX3MpID49IDApIHtcclxuICAgICAgICAgICAgbWEucHVzaChlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByLnZhbHVlID0gbWE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHIudmFsdWUgPSByLnZhbHVlLnNvcnQoKGEsIGIpID0+IGEuTG9naWNhbE5hbWUudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIuTG9naWNhbE5hbWUudG9Mb3dlckNhc2UoKSkpXHJcbiAgICAgIHJldHVybiBfcjtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGdldChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxFbnRpdHlNZXRhPiB7XHJcbiAgICByZXR1cm4gdGhpcy54cm1TZXJ2aWNlLmdldDxFbnRpdHlNZXRhPih0aGlzLmdldEVudGl0eU1ldGFQcm90b3R5cGUsIGlkKS5waXBlKG1hcChfciA9PiB7XHJcbiAgICAgIGxldCByID0gX3IgYXMgRW50aXR5TWV0YTtcclxuICAgICAgaWYgKHIuQXR0cmlidXRlcyAhPSBudWxsICYmIHIuQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgci5BdHRyaWJ1dGVzID0gci5BdHRyaWJ1dGVzLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgIGlmIChhLkxvZ2ljYWxOYW1lID09IG51bGwgJiYgYi5Mb2dpY2FsTmFtZSAhPSBudWxsKSByZXR1cm4gMTtcclxuICAgICAgICAgIGlmIChhLkxvZ2ljYWxOYW1lICE9IG51bGwgJiYgYi5Mb2dpY2FsTmFtZSA9PSBudWxsKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICBpZiAoYS5Mb2dpY2FsTmFtZSA9PSBudWxsICYmIGIuTG9naWNhbE5hbWUgPT0gbnVsbCkgcmV0dXJuIDA7XHJcbiAgICAgICAgICByZXR1cm4gYS5Mb2dpY2FsTmFtZS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi5Mb2dpY2FsTmFtZS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHI7XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBnZXRNYW55VG9NYW55UmVsYXRpb25zaGlwcyhlbnRpdHk6IEVudGl0eU1ldGEpOiBPYnNlcnZhYmxlPEVudGl0eU1ldGE+IHtcclxuICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHsgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIk9EYXRhLU1heFZlcnNpb25cIiwgXCI0LjBcIik7XHJcbiAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJPRGF0YS1WZXJzaW9uXCIsIFwiNC4wXCIpO1xyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiKTtcclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIlByZWZlclwiLCBcIm9kYXRhLmluY2x1ZGUtYW5ub3RhdGlvbnM9KlwiKTtcclxuXHJcbiAgICBsZXQgb3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGVyczogaGVhZGVyc1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMueHJtU2VydmljZS5nZXRTZXJ2aWNlVXJsKCkgKyAnRW50aXR5RGVmaW5pdGlvbnMoJyArIGVudGl0eS5pZCArICcpJyArICcvTWFueVRvTWFueVJlbGF0aW9uc2hpcHM/JHNlbGVjdD1NZXRhZGF0YUlkLEVudGl0eTFMb2dpY2FsTmFtZSxFbnRpdHkxTmF2aWdhdGlvblByb3BlcnR5TmFtZSxFbnRpdHkyTG9naWNhbE5hbWUsRW50aXR5Mk5hdmlnYXRpb25Qcm9wZXJ0eU5hbWUsU2NoZW1hTmFtZSxSZWxhdGlvbnNoaXBUeXBlJywgb3B0aW9ucylcclxuICAgICAgLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICBlbnRpdHkuTWFueVRvTWFueVJlbGF0aW9ucyA9IHJlc3BvbnNlW1widmFsdWVcIl0gYXMgTWFueVRvTWFueVJlbGF0aW9uc2hpcFtdO1xyXG5cclxuICAgICAgICBlbnRpdHkuTWFueVRvTWFueVJlbGF0aW9ucy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICAgICAgaWYgKHIuRW50aXR5MUxvZ2ljYWxOYW1lID09IGVudGl0eS5Mb2dpY2FsTmFtZSkge1xyXG4gICAgICAgICAgICByLk90aGVyID0gci5FbnRpdHkyTG9naWNhbE5hbWU7XHJcbiAgICAgICAgICAgIHIuT3RoZXJTY2hlbWFOYW1lID0gZW50aXR5LlNjaGVtYU5hbWU7XHJcbiAgICAgICAgICAgIHIuRW50aXR5MUxvZ2ljYWxDb2xsZWN0aW9uTmFtZSA9IGVudGl0eS5Mb2dpY2FsQ29sbGVjdGlvbk5hbWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByLk90aGVyID0gci5FbnRpdHkxTG9naWNhbE5hbWU7XHJcbiAgICAgICAgICAgIHIuRW50aXR5MkxvZ2ljYWxDb2xsZWN0aW9uTmFtZSA9IGVudGl0eS5Mb2dpY2FsQ29sbGVjdGlvbk5hbWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZXNvbHZlUmVsYXRpb25zaGlwTmFtZXMoZW50aXR5Lk1hbnlUb01hbnlSZWxhdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiBlbnRpdHk7XHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHJlc29sdmVSZWxhdGlvbnNoaXBOYW1lcyhyZWxhdGlvbnM6IE1hbnlUb01hbnlSZWxhdGlvbnNoaXBbXSk6IHZvaWQge1xyXG4gICAgcmVsYXRpb25zLmZvckVhY2gociA9PiB7XHJcbiAgICAgIGlmIChyLkVudGl0eTFMb2dpY2FsQ29sbGVjdGlvbk5hbWUgPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuc2VhcmNoKHIuRW50aXR5MUxvZ2ljYWxOYW1lLCB0cnVlKS5zdWJzY3JpYmUocyA9PiB7XHJcbiAgICAgICAgICByLkVudGl0eTFMb2dpY2FsQ29sbGVjdGlvbk5hbWUgPSBzLnZhbHVlWzBdLkxvZ2ljYWxDb2xsZWN0aW9uTmFtZTtcclxuICAgICAgICAgIGlmIChyLk90aGVyID09IHIuRW50aXR5MUxvZ2ljYWxOYW1lKSB7XHJcbiAgICAgICAgICAgIHIuT3RoZXJTY2hlbWFOYW1lID0gcy52YWx1ZVswXS5TY2hlbWFOYW1lO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoci5FbnRpdHkyTG9naWNhbENvbGxlY3Rpb25OYW1lID09IG51bGwpIHtcclxuICAgICAgICB0aGlzLnNlYXJjaChyLkVudGl0eTJMb2dpY2FsTmFtZSwgdHJ1ZSkuc3Vic2NyaWJlKHMgPT4ge1xyXG4gICAgICAgICAgci5FbnRpdHkyTG9naWNhbENvbGxlY3Rpb25OYW1lID0gcy52YWx1ZVswXS5Mb2dpY2FsQ29sbGVjdGlvbk5hbWU7XHJcbiAgICAgICAgICBpZiAoci5PdGhlciA9IHIuRW50aXR5MkxvZ2ljYWxOYW1lKSB7XHJcbiAgICAgICAgICAgIHIuT3RoZXJTY2hlbWFOYW1lID0gcy52YWx1ZVswXS5TY2hlbWFOYW1lO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRPbmVUb01hbnlSZWxhdGlvbnNoaXBzKGVudGl0eTogRW50aXR5TWV0YSk6IE9ic2VydmFibGU8RW50aXR5TWV0YT4ge1xyXG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiT0RhdGEtTWF4VmVyc2lvblwiLCBcIjQuMFwiKTtcclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIk9EYXRhLVZlcnNpb25cIiwgXCI0LjBcIik7XHJcbiAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIpO1xyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiUHJlZmVyXCIsIFwib2RhdGEuaW5jbHVkZS1hbm5vdGF0aW9ucz0qXCIpO1xyXG5cclxuICAgIGxldCBvcHRpb25zID0ge1xyXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy54cm1TZXJ2aWNlLmdldFNlcnZpY2VVcmwoKSArICdFbnRpdHlEZWZpbml0aW9ucygnICsgZW50aXR5LmlkICsgJyknICsgJy9PbmVUb01hbnlSZWxhdGlvbnNoaXBzPyRzZWxlY3Q9TWV0YWRhdGFJZCxSZWxhdGlvbnNoaXBUeXBlLFNjaGVtYU5hbWUsUmVmZXJlbmNlZEF0dHJpYnV0ZSxSZWZlcmVuY2luZ0F0dHJpYnV0ZSxSZWZlcmVuY2VkRW50aXR5LFJlZmVyZW5jaW5nRW50aXR5LFJlZmVyZW5jaW5nRW50aXR5TmF2aWdhdGlvblByb3BlcnR5TmFtZScsIG9wdGlvbnMpXHJcbiAgICAgIC5waXBlKG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgZW50aXR5Lk9uZVRvTWFueVJlbGF0aW9ucyA9IHJlc3BvbnNlW1widmFsdWVcIl0gYXMgT25lVG9NYW55UmVsYXRpb25zaGlwW107XHJcbiAgICAgICAgcmV0dXJuIGVudGl0eTtcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TG9va3VwKGVudGl0eTogRW50aXR5TWV0YSwgYXR0cjogQXR0cmlidXRlTWV0YSk6IE9ic2VydmFibGU8RW50aXR5TWV0YT4ge1xyXG4gICAgaWYgKGF0dHIuQXR0cmlidXRlVHlwZSA9PSAnTG9va3VwJykge1xyXG4gICAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicgfSk7XHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIk9EYXRhLU1heFZlcnNpb25cIiwgXCI0LjBcIik7XHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIk9EYXRhLVZlcnNpb25cIiwgXCI0LjBcIik7XHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIik7XHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIlByZWZlclwiLCBcIm9kYXRhLmluY2x1ZGUtYW5ub3RhdGlvbnM9KlwiKTtcclxuXHJcbiAgICAgIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnNcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TG9va3VwQXR0cmlidXRlPih0aGlzLnhybVNlcnZpY2UuZ2V0U2VydmljZVVybCgpICsgJ0VudGl0eURlZmluaXRpb25zKCcgKyBlbnRpdHkuaWQgKyAnKS9BdHRyaWJ1dGVzKCcgKyBhdHRyLmlkICsgJykvTWljcm9zb2Z0LkR5bmFtaWNzLkNSTS5Mb29rdXBBdHRyaWJ1dGVNZXRhZGF0YT8kc2VsZWN0PVRhcmdldHMsTG9naWNhbE5hbWUsU2NoZW1hTmFtZScpXHJcbiAgICAgICAgLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgIGF0dHIuTG9va3VwID0gcmVzcG9uc2UgYXMgTG9va3VwQXR0cmlidXRlO1xyXG4gICAgICAgICAgcmV0dXJuIGVudGl0eTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGF0dHIuQXR0cmlidXRlVHlwZSA9PSAnQ3VzdG9tZXInKSB7XHJcbiAgICAgIGF0dHIuTG9va3VwID0ge1xyXG4gICAgICAgIExvZ2ljYWxOYW1lOiBhdHRyLkxvZ2ljYWxOYW1lLFxyXG4gICAgICAgIFNjaGVtYU5hbWU6IGF0dHIuU2NoZW1hTmFtZSxcclxuICAgICAgICBUYXJnZXRzOiBbJ2FjY291bnQnLCAnY29udGFjdCddXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxFbnRpdHlNZXRhPihvID0+IHtcclxuICAgICAgICBvLm5leHQoZW50aXR5KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhyb3cgJ3Vua25vd24gTG9va3VwIHR5cGUgJyArIGF0dHIuQXR0cmlidXRlVHlwZTtcclxuICB9XHJcblxyXG4gIGdldFBpY2tsaXN0cyhlbnRpdHk6IEVudGl0eU1ldGEpOiBPYnNlcnZhYmxlPEF0dHJpYnV0ZU9wdGlvbnNldE1ldGFbXT4ge1xyXG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiT0RhdGEtTWF4VmVyc2lvblwiLCBcIjQuMFwiKTtcclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIk9EYXRhLVZlcnNpb25cIiwgXCI0LjBcIik7XHJcbiAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIpO1xyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiUHJlZmVyXCIsIFwib2RhdGEuaW5jbHVkZS1hbm5vdGF0aW9ucz0qXCIpO1xyXG5cclxuICAgIGxldCBvcHRpb25zID0ge1xyXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SUF0dHJpYnV0ZU9wdGlvbnNldE1ldGFSZXN1bHQ+KHRoaXMueHJtU2VydmljZS5nZXRTZXJ2aWNlVXJsKCkgKyAnRW50aXR5RGVmaW5pdGlvbnMoTG9naWNhbE5hbWU9XFwnJyArIGVudGl0eS5Mb2dpY2FsTmFtZSArICdcXCcpL0F0dHJpYnV0ZXMvTWljcm9zb2Z0LkR5bmFtaWNzLkNSTS5QaWNrbGlzdEF0dHJpYnV0ZU1ldGFkYXRhPyRzZWxlY3Q9TG9naWNhbE5hbWUmJGV4cGFuZD1PcHRpb25TZXQsR2xvYmFsT3B0aW9uU2V0JykucGlwZShtYXAociA9PiByLnZhbHVlKSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==