@fdot/angular-staff
Version:
The angular-staff package wraps service calls to FDOT Staff API and also includes pipes and components based on bootstrap 4. ## Installation The angular staff package use a peer dependency of ng-bootstrap so you will need to also perform an NPM install
269 lines (268 loc) • 35.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Injectable, Inject } from '@angular/core';
import { Observable, BehaviorSubject } from 'rxjs';
import { HttpHeaders, HttpParams, HttpClient } from '@angular/common/http';
import { map } from 'rxjs/operators';
import { Config } from './models/config';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
export class AngularStaffService {
/**
* @param {?} http
* @param {?} config
*/
constructor(http, config) {
this.http = http;
this.config = config;
this.staffByIdCache = new Map();
this.staffByRacfIdCache = new Map();
this.staffSearchCache = new Map();
if (!config) {
throw Error('Call AngularStaffmodule with for root passing in the config object');
}
}
/**
* @param {?} staff
* @param {?} format
* @return {?}
*/
Format(staff, format) {
if (format) {
let /** @type {?} */ formattedStr = format.replace('{firstName}', staff.firstName);
formattedStr = formattedStr.replace('{lastName}', staff.lastName);
formattedStr = formattedStr.replace('{racfId}', staff.racfId);
formattedStr = formattedStr.replace('{emailAddress}', staff.emailAddress);
formattedStr = formattedStr.replace('{phone}', staff.phone);
return formattedStr;
}
return `${staff.firstName} ${staff.lastName}`;
}
/**
* Method GetStaffById
* @param {?} id Id for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
GetStaffById(id) {
if (!this.staffByIdCache.get(id)) {
this.staffByIdCache.set(id, new BehaviorSubject(null));
const /** @type {?} */ uri = `/GetStaffById`;
const /** @type {?} */ headers = new HttpHeaders();
let /** @type {?} */ params = new HttpParams();
if (id !== undefined && id !== null) {
params = params.set('id', id + '');
}
this.sendRequest('get', uri, headers, params, null).toPromise().then(r => {
if (r && r.body) {
this.staffByIdCache.get(id).next(r.body);
}
});
}
return this.staffByIdCache.get(id);
}
/**
* Method GetStaffByIds
* @param {?} id Id for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
GetStaffByIds(id) {
const /** @type {?} */ uri = `/GetStaffByIds`;
const /** @type {?} */ headers = new HttpHeaders();
let /** @type {?} */ params = new HttpParams();
if (id !== undefined && id !== null) {
params = params.set('id', id + '');
}
return this.sendRequest('get', uri, headers, params, null).pipe(map(r => {
if (r && r.body) {
return r.body;
}
}));
}
/**
* Method GetStaffByRacfId
* @param {?} racfId RacfId for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
GetStaffByRacfId(racfId) {
if (!this.staffByRacfIdCache.get(racfId)) {
this.staffByRacfIdCache.set(racfId, new BehaviorSubject(null));
const /** @type {?} */ uri = `/GetStaffByRacfId`;
const /** @type {?} */ headers = new HttpHeaders();
let /** @type {?} */ params = new HttpParams();
if (racfId !== undefined && racfId !== null) {
params = params.set('racfId', racfId + '');
}
this.sendRequest('get', uri, headers, params, null).pipe(map(r => {
if (r && r.body) {
this.staffByRacfIdCache.get(racfId).next(r.body);
}
}));
}
return this.staffByRacfIdCache.get(racfId);
}
/**
* Method GetStaffByRacfIds
* @param {?} racfId RacfId for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
GetStaffByRacfIds(racfId) {
const /** @type {?} */ uri = `/GetStaffByRacfIds`;
const /** @type {?} */ headers = new HttpHeaders();
let /** @type {?} */ params = new HttpParams();
if (racfId !== undefined && racfId !== null) {
params = params.set('racfId', racfId + '');
}
return this.sendRequest('get', uri, headers, params, null).pipe(map(r => {
if (r && r.body) {
return r.body;
}
}));
}
/**
* Method SearchStaffBySearchCriteriaGet
* @param {?} racfId RacfId for Staff to retrieve
* @param {?} peopleFirstId The people first id to Search for
* @param {?} status The status code to search for
* @param {?} partialName The partial name to search for
* @param {?} firstName The first name to search for
* @param {?} lastName The last name to search for
* @param {?} districtCode The district to search for
* @param {?} positionNumber The position number to search for
* @param {?} organizationalCode The organization code to search for
* @param {?} emailAddress The email address to search for
* @param {?} staffTypeCode The staff type code to search for
* @param {?} staffId The staff id to search for
* @return {?} Full HTTP response as Observable
*/
SearchStaffBySearchCriteriaGet(racfId, peopleFirstId, status, partialName, firstName, lastName, districtCode, positionNumber, organizationalCode, emailAddress, staffTypeCode, staffId) {
const /** @type {?} */ uri = `/SearchStaffBySearchCriteria`;
const /** @type {?} */ headers = new HttpHeaders();
let /** @type {?} */ params = new HttpParams();
if (racfId !== undefined && racfId !== null) {
params = params.set('racfId', racfId + '');
}
if (peopleFirstId !== undefined && peopleFirstId !== null) {
params = params.set('peopleFirstId', peopleFirstId + '');
}
if (status !== undefined && status !== null) {
params = params.set('status', status + '');
}
if (partialName !== undefined && partialName !== null) {
params = params.set('partialName', partialName + '');
}
if (firstName !== undefined && firstName !== null) {
params = params.set('firstName', firstName + '');
}
if (lastName !== undefined && lastName !== null) {
params = params.set('lastName', lastName + '');
}
if (districtCode !== undefined && districtCode !== null) {
params = params.set('districtCode', districtCode + '');
}
if (positionNumber !== undefined && positionNumber !== null) {
params = params.set('positionNumber', positionNumber + '');
}
if (organizationalCode !== undefined && organizationalCode !== null) {
params = params.set('organizationalCode', organizationalCode + '');
}
if (emailAddress !== undefined && emailAddress !== null) {
params = params.set('emailAddress', emailAddress + '');
}
if (staffTypeCode !== undefined && staffTypeCode !== null) {
params = params.set('staffTypeCode', staffTypeCode + '');
}
if (staffId !== undefined && staffId !== null) {
params = params.set('staffId', staffId + '');
}
return this.sendRequest('get', uri, headers, params, null).pipe(map(r => {
if (r && r.body) {
return r.body;
}
}));
}
/**
* @param {?} name
* @return {?}
*/
SearchActiveStaffByName(name) {
if (!this.staffSearchCache.get(name)) {
this.staffSearchCache.set(name, new BehaviorSubject([]));
this.SearchStaffBySearchCriteriaGet(null, null, 'active', name, null, null, null, null, null, null, null, null).toPromise().then((results) => {
this.staffSearchCache.get(name).next(results);
});
}
return this.staffSearchCache.get(name);
}
/**
* Method SearchStaffBySearchCriteriaPost
* @param {?} searchCriteria RacfId for Staff to retrieve
* @return {?} Full HTTP response as Observable
*/
SearchStaffBySearchCriteriaPost(searchCriteria) {
const /** @type {?} */ uri = `/SearchStaffBySearchCriteria`;
const /** @type {?} */ headers = new HttpHeaders();
const /** @type {?} */ params = new HttpParams();
return this.sendRequest('post', uri, headers, params, JSON.stringify(searchCriteria));
}
/**
* @template T
* @param {?} method
* @param {?} uri
* @param {?} headers
* @param {?} params
* @param {?} body
* @return {?}
*/
sendRequest(method, uri, headers, params, body) {
headers = headers.set('Ocp-Apim-Subscription-Key', this.config.apiKey);
if (method === 'get') {
return this.http.get(this.config.host + uri, { headers: headers.set('Accept', 'application/json'), params: params, observe: 'response' });
}
else if (method === 'put') {
return this.http.put(this.config.host + uri, body, { headers: headers.set('Content-Type', 'application/json'), params: params, observe: 'response' });
}
else if (method === 'post') {
return this.http.post(this.config.host + uri, body, { headers: headers.set('Content-Type', 'application/json'), params: params, observe: 'response' });
}
else if (method === 'delete') {
return this.http.delete(this.config.host + uri, { headers: headers, params: params, observe: 'response' });
}
else {
console.error('Unsupported request: ' + method);
return Observable.throw('Unsupported request: ' + method);
}
}
}
AngularStaffService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] },
];
/** @nocollapse */
AngularStaffService.ctorParameters = () => [
{ type: HttpClient, },
{ type: Config, decorators: [{ type: Inject, args: ['config',] },] },
];
/** @nocollapse */ AngularStaffService.ngInjectableDef = i0.defineInjectable({ factory: function AngularStaffService_Factory() { return new AngularStaffService(i0.inject(i1.HttpClient), i0.inject("config")); }, token: AngularStaffService, providedIn: "root" });
function AngularStaffService_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
AngularStaffService.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
AngularStaffService.ctorParameters;
/** @type {?} */
AngularStaffService.prototype.staffByIdCache;
/** @type {?} */
AngularStaffService.prototype.staffByRacfIdCache;
/** @type {?} */
AngularStaffService.prototype.staffSearchCache;
/** @type {?} */
AngularStaffService.prototype.http;
/** @type {?} */
AngularStaffService.prototype.config;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1zdGFmZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZkb3QvYW5ndWxhci1zdGFmZi8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyLXN0YWZmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVksTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBZ0IsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFLekMsTUFBTTs7Ozs7SUFLSixZQUFvQixJQUFnQixFQUE0QjtRQUE1QyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQTRCLFdBQU0sR0FBTixNQUFNOzhCQUo3QyxJQUFJLEdBQUcsRUFBd0M7a0NBQzNDLElBQUksR0FBRyxFQUF3QztnQ0FDakQsSUFBSSxHQUFHLEVBQTBDO1FBRzFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNaLE1BQU0sS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7U0FDbkY7S0FDRjs7Ozs7O0lBRU0sTUFBTSxDQUFDLEtBQWtCLEVBQUUsTUFBYztRQUM5QyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ1gscUJBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVsRSxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xFLFlBQVksR0FBRyxZ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QyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztTQUM1QztRQUNELEVBQUUsQ0FBQyxDQUFDLFdBQVcsS0FBSyxTQUFTLElBQUksV0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdEQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN0RDtRQUNELEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbEQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNsRDtRQUNELEVBQUUsQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNoRDtRQUNELEVBQUUsQ0FBQyxDQUFDLFlBQVksS0FBSyxTQUFTLElBQUksWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDeEQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN4RDtRQUNELEVBQUUsQ0FBQyxDQUFDLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsRUFBRSxDQUFDLENBQUMsa0JBQWtCLEtB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SSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDL0c7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLENBQUM7U0FDM0Q7Ozs7WUEvTkosVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7O1lBTitDLFVBQVU7WUFFakQsTUFBTSx1QkFVMEIsTUFBTSxTQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPcHRpb25hbCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTdGFmZk1lbWJlciwgU2VhcmNoQ3JpdGVyaWEgfSBmcm9tICcuL21vZGVscyc7XHJcbmltcG9ydCB7IEh0dHBSZXNwb25zZSwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvY29uZmlnJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJTdGFmZlNlcnZpY2Uge1xyXG4gIHByaXZhdGUgc3RhZmZCeUlkQ2FjaGUgPSBuZXcgTWFwPG51bWJlciwgQmVoYXZpb3JTdWJqZWN0PFN0YWZmTWVtYmVyPj4oKTtcclxuICBwcml2YXRlIHN0YWZmQnlSYWNmSWRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBCZWhhdmlvclN1YmplY3Q8U3RhZmZNZW1iZXI+PigpO1xyXG4gIHByaXZhdGUgc3RhZmZTZWFyY2hDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBCZWhhdmlvclN1YmplY3Q8U3RhZmZNZW1iZXJbXT4+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgQEluamVjdCgnY29uZmlnJykgcHJpdmF0ZSBjb25maWc6IENvbmZpZykge1xyXG4gICAgaWYgKCFjb25maWcpIHtcclxuICAgICAgdGhyb3cgRXJyb3IoJ0NhbGwgQW5ndWxhclN0YWZmbW9kdWxlIHdpdGggZm9yIHJvb3QgcGFzc2luZyBpbiB0aGUgY29uZmlnIG9iamVjdCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIEZvcm1hdChzdGFmZjogU3RhZmZNZW1iZXIsIGZvcm1hdDogc3RyaW5nKSB7XHJcbiAgICBpZiAoZm9ybWF0KSB7XHJcbiAgICAgIGxldCBmb3JtYXR0ZWRTdHIgPSBmb3JtYXQucmVwbGFjZSgne2ZpcnN0TmFtZX0nLCBzdGFmZi5maXJzdE5hbWUpO1xyXG5cclxuICAgICAgZm9ybWF0dGVkU3RyID0gZm9ybWF0dGVkU3RyLnJlcGxhY2UoJ3tsYXN0TmFtZX0nLCBzdGFmZi5sYXN0TmFtZSk7XHJcbiAgICAgIGZvcm1hdHRlZFN0ciA9IGZvcm1hdHRlZFN0ci5yZXBsYWNlKCd7cmFjZklkfScsIHN0YWZmLnJhY2ZJZCk7XHJcbiAgICAgIGZvcm1hdHRlZFN0ciA9IGZvcm1hdHRlZFN0ci5yZXBsYWNlKCd7ZW1haWxBZGRyZXNzfScsIHN0YWZmLmVtYWlsQWRkcmVzcyk7XHJcbiAgICAgIGZvcm1hdHRlZFN0ciA9IGZvcm1hdHRlZFN0ci5yZXBsYWNlKCd7cGhvbmV9Jywgc3RhZmYucGhvbmUpO1xyXG5cclxuICAgICAgcmV0dXJuIGZvcm1hdHRlZFN0cjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYCR7c3RhZmYuZmlyc3ROYW1lfSAke3N0YWZmLmxhc3ROYW1lfWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIE1ldGhvZCBHZXRTdGFmZkJ5SWRcclxuICAqIEBwYXJhbSBpZCBJZCBmb3IgU3RhZmYgdG8gcmV0cmlldmVcclxuICAqIEByZXR1cm4gRnVsbCBIVFRQIHJlc3BvbnNlIGFzIE9ic2VydmFibGVcclxuICAqL1xyXG4gIHB1YmxpYyBHZXRTdGFmZkJ5SWQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8U3RhZmZNZW1iZXI+IHtcclxuICAgIGlmICghdGhpcy5zdGFmZkJ5SWRDYWNoZS5nZXQoaWQpKSB7XHJcbiAgICAgIHRoaXMuc3RhZmZCeUlkQ2FjaGUuc2V0KGlkLCBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0YWZmTWVtYmVyPihudWxsKSk7XHJcblxyXG4gICAgICBjb25zdCB1cmkgPSBgL0dldFN0YWZmQnlJZGA7XHJcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIGlkICE9PSBudWxsKSB7XHJcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnaWQnLCBpZCArICcnKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlbmRSZXF1ZXN0PFN0YWZmTWVtYmVyPignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnRvUHJvbWlzZSgpLnRoZW4ociA9PiB7XHJcbiAgICAgICAgaWYgKHIgJiYgci5ib2R5KSB7XHJcbiAgICAgICAgICB0aGlzLnN0YWZmQnlJZENhY2hlLmdldChpZCkubmV4dChyLmJvZHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc3RhZmZCeUlkQ2FjaGUuZ2V0KGlkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIEdldFN0YWZmQnlJZHNcclxuICAqIEBwYXJhbSBpZCBJZCBmb3IgU3RhZmYgdG8gcmV0cmlldmVcclxuICAqIEByZXR1cm4gRnVsbCBIVFRQIHJlc3BvbnNlIGFzIE9ic2VydmFibGVcclxuICAqL1xyXG4gIHB1YmxpYyBHZXRTdGFmZkJ5SWRzKGlkOiBudW1iZXJbXSk6IE9ic2VydmFibGU8U3RhZmZNZW1iZXJbXT4ge1xyXG4gICAgY29uc3QgdXJpID0gYC9HZXRTdGFmZkJ5SWRzYDtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQgJiYgaWQgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnaWQnLCBpZCArICcnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0PGFueT4oJ2dldCcsIHVyaSwgaGVhZGVycywgcGFyYW1zLCBudWxsKS5waXBlKG1hcChyID0+IHtcclxuICAgICAgaWYgKHIgJiYgci5ib2R5KSB7XHJcbiAgICAgICAgcmV0dXJuIHIuYm9keTtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBNZXRob2QgR2V0U3RhZmZCeVJhY2ZJZFxyXG4gICogQHBhcmFtIHJhY2ZJZCBSYWNmSWQgZm9yIFN0YWZmIHRvIHJldHJpZXZlXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0U3RhZmZCeVJhY2ZJZChyYWNmSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8U3RhZmZNZW1iZXI+IHtcclxuICAgIGlmICghdGhpcy5zdGFmZkJ5UmFjZklkQ2FjaGUuZ2V0KHJhY2ZJZCkpIHtcclxuICAgICAgdGhpcy5zdGFmZkJ5UmFjZklkQ2FjaGUuc2V0KHJhY2ZJZCwgbmV3IEJlaGF2aW9yU3ViamVjdDxTdGFmZk1lbWJlcj4obnVsbCkpO1xyXG4gICAgICBjb25zdCB1cmkgPSBgL0dldFN0YWZmQnlSYWNmSWRgO1xyXG4gICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgICBpZiAocmFjZklkICE9PSB1bmRlZmluZWQgJiYgcmFjZklkICE9PSBudWxsKSB7XHJcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgncmFjZklkJywgcmFjZklkICsgJycpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlbmRSZXF1ZXN0PFN0YWZmTWVtYmVyPignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnBpcGUobWFwKHIgPT4ge1xyXG4gICAgICAgIGlmIChyICYmIHIuYm9keSkge1xyXG4gICAgICAgICAgdGhpcy5zdGFmZkJ5UmFjZklkQ2FjaGUuZ2V0KHJhY2ZJZCkubmV4dChyLmJvZHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnN0YWZmQnlSYWNmSWRDYWNoZS5nZXQocmFjZklkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIEdldFN0YWZmQnlSYWNmSWRzXHJcbiAgKiBAcGFyYW0gcmFjZklkIFJhY2ZJZCBmb3IgU3RhZmYgdG8gcmV0cmlldmVcclxuICAqIEByZXR1cm4gRnVsbCBIVFRQIHJlc3BvbnNlIGFzIE9ic2VydmFibGVcclxuICAqL1xyXG4gIHB1YmxpYyBHZXRTdGFmZkJ5UmFjZklkcyhyYWNmSWQ6IG51bWJlcltdKTogT2JzZXJ2YWJsZTxTdGFmZk1lbWJlcltdPiB7XHJcbiAgICBjb25zdCB1cmkgPSBgL0dldFN0YWZmQnlSYWNmSWRzYDtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgaWYgKHJhY2ZJZCAhPT0gdW5kZWZpbmVkICYmIHJhY2ZJZCAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdyYWNmSWQnLCByYWNmSWQgKyAnJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdDxhbnk+KCdnZXQnLCB1cmksIGhlYWRlcnMsIHBhcmFtcywgbnVsbCkucGlwZShtYXAociA9PiB7XHJcbiAgICAgIGlmIChyICYmIHIuYm9keSkge1xyXG4gICAgICAgIHJldHVybiByLmJvZHk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIFNlYXJjaFN0YWZmQnlTZWFyY2hDcml0ZXJpYUdldFxyXG4gICogQHBhcmFtIHJhY2ZJZCBSYWNmSWQgZm9yIFN0YWZmIHRvIHJldHJpZXZlXHJcbiAgKiBAcGFyYW0gcGVvcGxlRmlyc3RJZCBUaGUgcGVvcGxlIGZpcnN0IGlkIHRvIFNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBzdGF0dXMgVGhlIHN0YXR1cyBjb2RlIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBwYXJ0aWFsTmFtZSBUaGUgcGFydGlhbCBuYW1lIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBmaXJzdE5hbWUgVGhlIGZpcnN0IG5hbWUgdG8gc2VhcmNoIGZvclxyXG4gICogQHBhcmFtIGxhc3ROYW1lIFRoZSBsYXN0IG5hbWUgdG8gc2VhcmNoIGZvclxyXG4gICogQHBhcmFtIGRpc3RyaWN0Q29kZSBUaGUgZGlzdHJpY3QgdG8gc2VhcmNoIGZvclxyXG4gICogQHBhcmFtIHBvc2l0aW9uTnVtYmVyIFRoZSBwb3NpdGlvbiBudW1iZXIgdG8gc2VhcmNoIGZvclxyXG4gICogQHBhcmFtIG9yZ2FuaXphdGlvbmFsQ29kZSBUaGUgb3JnYW5pemF0aW9uIGNvZGUgdG8gc2VhcmNoIGZvclxyXG4gICogQHBhcmFtIGVtYWlsQWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZWFyY2ggZm9yXHJcbiAgKiBAcGFyYW0gc3RhZmZUeXBlQ29kZSBUaGUgc3RhZmYgdHlwZSBjb2RlIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBzdGFmZklkIFRoZSBzdGFmZiBpZCB0byBzZWFyY2ggZm9yXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgU2VhcmNoU3RhZmZCeVNlYXJjaENyaXRlcmlhR2V0KHJhY2ZJZDogbnVtYmVyW10sIHBlb3BsZUZpcnN0SWQ6IHN0cmluZywgc3RhdHVzOiBzdHJpbmcsIHBhcnRpYWxOYW1lOiBzdHJpbmcsXHJcbiAgICBmaXJzdE5hbWU6IHN0cmluZywgbGFzdE5hbWU6IHN0cmluZywgZGlzdHJpY3RDb2RlOiBzdHJpbmcsIHBvc2l0aW9uTnVtYmVyOiBzdHJpbmcsIG9yZ2FuaXphdGlvbmFsQ29kZTogc3RyaW5nLFxyXG4gICAgZW1haWxBZGRyZXNzOiBzdHJpbmcsIHN0YWZmVHlwZUNvZGU6IHN0cmluZywgc3RhZmZJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTdGFmZk1lbWJlcltdPiB7XHJcbiAgICBjb25zdCB1cmkgPSBgL1NlYXJjaFN0YWZmQnlTZWFyY2hDcml0ZXJpYWA7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIGlmIChyYWNmSWQgIT09IHVuZGVmaW5lZCAmJiByYWNmSWQgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgncmFjZklkJywgcmFjZklkICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKHBlb3BsZUZpcnN0SWQgIT09IHVuZGVmaW5lZCAmJiBwZW9wbGVGaXJzdElkICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3Blb3BsZUZpcnN0SWQnLCBwZW9wbGVGaXJzdElkICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKHN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1cyAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdzdGF0dXMnLCBzdGF0dXMgKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAocGFydGlhbE5hbWUgIT09IHVuZGVmaW5lZCAmJiBwYXJ0aWFsTmFtZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdwYXJ0aWFsTmFtZScsIHBhcnRpYWxOYW1lICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKGZpcnN0TmFtZSAhPT0gdW5kZWZpbmVkICYmIGZpcnN0TmFtZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdmaXJzdE5hbWUnLCBmaXJzdE5hbWUgKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAobGFzdE5hbWUgIT09IHVuZGVmaW5lZCAmJiBsYXN0TmFtZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdsYXN0TmFtZScsIGxhc3ROYW1lICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKGRpc3RyaWN0Q29kZSAhPT0gdW5kZWZpbmVkICYmIGRpc3RyaWN0Q29kZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdkaXN0cmljdENvZGUnLCBkaXN0cmljdENvZGUgKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAocG9zaXRpb25OdW1iZXIgIT09IHVuZGVmaW5lZCAmJiBwb3NpdGlvbk51bWJlciAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdwb3NpdGlvbk51bWJlcicsIHBvc2l0aW9uTnVtYmVyICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKG9yZ2FuaXphdGlvbmFsQ29kZSAhPT0gdW5kZWZpbmVkICYmIG9yZ2FuaXphdGlvbmFsQ29kZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdvcmdhbml6YXRpb25hbENvZGUnLCBvcmdhbml6YXRpb25hbENvZGUgKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoZW1haWxBZGRyZXNzICE9PSB1bmRlZmluZWQgJiYgZW1haWxBZGRyZXNzICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2VtYWlsQWRkcmVzcycsIGVtYWlsQWRkcmVzcyArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChzdGFmZlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgc3RhZmZUeXBlQ29kZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdzdGFmZlR5cGVDb2RlJywgc3RhZmZUeXBlQ29kZSArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChzdGFmZklkICE9PSB1bmRlZmluZWQgJiYgc3RhZmZJZCAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdzdGFmZklkJywgc3RhZmZJZCArICcnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdDxhbnk+KCdnZXQnLCB1cmksIGhlYWRlcnMsIHBhcmFtcywgbnVsbCkucGlwZShtYXAociA9PiB7XHJcbiAgICAgIGlmIChyICYmIHIuYm9keSkge1xyXG4gICAgICAgIHJldHVybiByLmJvZHk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBTZWFyY2hBY3RpdmVTdGFmZkJ5TmFtZShuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFN0YWZmTWVtYmVyW10+IHtcclxuICAgIGlmICghdGhpcy5zdGFmZlNlYXJjaENhY2hlLmdldChuYW1lKSkge1xyXG4gICAgICB0aGlzLnN0YWZmU2VhcmNoQ2FjaGUuc2V0KG5hbWUsIG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhZmZNZW1iZXJbXT4oW10pKTtcclxuXHJcbiAgICAgIHRoaXMuU2VhcmNoU3RhZmZCeVNlYXJjaENyaXRlcmlhR2V0KG51bGwsIG51bGwsICdhY3RpdmUnLCBuYW1lLFxyXG4gICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpLnRvUHJvbWlzZSgpLnRoZW4oKHJlc3VsdHMpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3RhZmZTZWFyY2hDYWNoZS5nZXQobmFtZSkubmV4dChyZXN1bHRzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnN0YWZmU2VhcmNoQ2FjaGUuZ2V0KG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBNZXRob2QgU2VhcmNoU3RhZmZCeVNlYXJjaENyaXRlcmlhUG9zdFxyXG4gICogQHBhcmFtIHNlYXJjaENyaXRlcmlhIFJhY2ZJZCBmb3IgU3RhZmYgdG8gcmV0cmlldmVcclxuICAqIEByZXR1cm4gRnVsbCBIVFRQIHJlc3BvbnNlIGFzIE9ic2VydmFibGVcclxuICAqL1xyXG4gIHB1YmxpYyBTZWFyY2hTdGFmZkJ5U2VhcmNoQ3JpdGVyaWFQb3N0KHNlYXJjaENyaXRlcmlhOiBTZWFyY2hDcml0ZXJpYSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPGFueT4+IHtcclxuICAgIGNvbnN0IHVyaSA9IGAvU2VhcmNoU3RhZmZCeVNlYXJjaENyaXRlcmlhYDtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdDxhbnk+KCdwb3N0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIEpTT04uc3RyaW5naWZ5KHNlYXJjaENyaXRlcmlhKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbmRSZXF1ZXN0PFQ+KG1ldGhvZDogc3RyaW5nLCB1cmk6IHN0cmluZywgaGVhZGVyczogSHR0cEhlYWRlcnMsIHBhcmFtczogSHR0cFBhcmFtcywgYm9keTogYW55KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VD4+IHtcclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnT2NwLUFwaW0tU3Vic2NyaXB0aW9uLUtleScsIHRoaXMuY29uZmlnLmFwaUtleSk7XHJcbiAgICBpZiAobWV0aG9kID09PSAnZ2V0Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLFxyXG4gICAgICAgIHsgaGVhZGVyczogaGVhZGVycy5zZXQoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdwdXQnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFQ+KHRoaXMuY29uZmlnLmhvc3QgKyB1cmksIGJvZHksXHJcbiAgICAgICAgeyBoZWFkZXJzOiBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKSwgcGFyYW1zOiBwYXJhbXMsIG9ic2VydmU6ICdyZXNwb25zZScgfSk7XHJcbiAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ3Bvc3QnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLCBib2R5LFxyXG4gICAgICAgIHsgaGVhZGVyczogaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdkZWxldGUnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPFQ+KHRoaXMuY29uZmlnLmhvc3QgKyB1cmksIHsgaGVhZGVyczogaGVhZGVycywgcGFyYW1zOiBwYXJhbXMsIG9ic2VydmU6ICdyZXNwb25zZScgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdVbnN1cHBvcnRlZCByZXF1ZXN0OiAnICsgbWV0aG9kKTtcclxuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3coJ1Vuc3VwcG9ydGVkIHJlcXVlc3Q6ICcgKyBtZXRob2QpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=