UNPKG

@ema/js-base-library

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.

485 lines 34.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; var BaseApi = /** @class */ (function () { function BaseApi() { this.headers = {}; this.routes = {}; this.baseUrl = '/api'; this.idField = 'id'; this.requestCredentials = 'same-origin'; // include, same-origin, *omit (default) // include, same-origin, *omit (default) this.corsMode = 'same-origin'; // no-cors, cors, *same-origin (default) // no-cors, cors, *same-origin (default) this.cachePolicy = 'no-cache'; // *default, no-cache, reload, force-cache, only-if-cached this.entities = {}; this.hasDebugger = false; } /** * @param {?} settings * @return {?} */ BaseApi.prototype.init = /** * @param {?} settings * @return {?} */ function (settings) { var _this = this; this.settings = settings; if (this.settings.host) { this.baseUrl = settings.host; } if (this.settings.routes) { this.initApiRoutes(this.settings.routes); } if (this.settings.headers) { /** @type {?} */ var self_1 = this; this.settings.headers.forEach((/** * @param {?} obj * @return {?} */ function (obj) { for (var k in obj) { self_1.headers[k] = obj[k]; } })); } if (this['httpHeaders']) { // AngularJs only Object.keys(this.headers).forEach((/** * @param {?} k * @return {?} */ function (k) { _this['httpHeaders'].set(k, _this.headers[k]); })); } // if ('withCredentials' in new XMLHttpRequest) { // this.cors = true; // } }; ; /** * @param {?} url * @return {?} */ BaseApi.prototype.route = /** * @param {?} url * @return {?} */ function (url) { var _this = this; /** @type {?} */ var mappedUrl; Object.keys(this.routes).forEach((/** * @param {?} k * @return {?} */ function (k) { if (k === url) { mappedUrl = _this.routes[k]; } })); if (mappedUrl) { return mappedUrl; } else { return url; } }; // CRUD // CRUD /** * @param {?} path * @param {?} data * @return {?} */ BaseApi.prototype.post = // CRUD /** * @param {?} path * @param {?} data * @return {?} */ function (path, data) { return tslib_1.__awaiter(this, void 0, void 0, function () { var result; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, fetch("" + this.baseUrl + path, { body: JSON.stringify(data), // must match 'Content-Type' header cache: this.cachePolicy, credentials: this.requestCredentials, headers: this.headers, mode: this.corsMode, method: 'POST', }) .then((/** * @param {?} response * @return {?} */ function (response) { if (response.status >= 400) { console.log(response); console.error('Bad response from server'); return response; } return response.json(); })) .catch(this.errorHandler) .then((/** * @param {?} data * @return {?} */ function (data) { return data; }))]; case 1: result = _a.sent(); return [2 /*return*/, result]; } }); }); }; /** * @param {?} path * @param {?=} params * @return {?} */ BaseApi.prototype.get = /** * @param {?} path * @param {?=} params * @return {?} */ function (path, params) { if (params === void 0) { params = undefined; } return tslib_1.__awaiter(this, void 0, void 0, function () { var result; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (params) { path += '?'; Object.keys(params).forEach((/** * @param {?} key * @return {?} */ function (key) { return path += key + '=' + params[key] + '&'; })); } return [4 /*yield*/, fetch("" + this.baseUrl + path, { cache: this.cachePolicy, credentials: this.requestCredentials, headers: this.headers, mode: this.corsMode, method: 'GET', }).then((/** * @param {?} response * @return {?} */ function (response) { if (response.status >= 400) { console.log(response); console.log('Bad response from server'); return response; } return response.json(); })) .catch(this.errorHandler) .then((/** * @param {?} data * @return {?} */ function (data) { return data; }))]; case 1: result = _a.sent(); return [2 /*return*/, result]; } }); }); }; // todo: patch // todo: patch /** * @param {?} path * @param {?} id * @param {?} data * @return {?} */ BaseApi.prototype.patch = // todo: patch /** * @param {?} path * @param {?} id * @param {?} data * @return {?} */ function (path, id, data) { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, fetch("" + this.baseUrl + path + "/" + id, { headers: this.headers, // method: 'PATCH', method: 'patch', body: JSON.stringify(data) })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; // fixme: causes php server error on drupal content page // fixme: causes php server error on drupal content page /** * @param {?} path * @param {?} id * @return {?} */ BaseApi.prototype.delete = // fixme: causes php server error on drupal content page /** * @param {?} path * @param {?} id * @return {?} */ function (path, id) { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { console.log(path, id); return [2 /*return*/]; }); }); }; /** * @param {?} username * @param {?} password * @return {?} */ BaseApi.prototype.login = /** * @param {?} username * @param {?} password * @return {?} */ function (username, password) { console.log(username, password.length); }; /** * @param {?=} namespace * @param {?=} refresh * @return {?} */ BaseApi.prototype.logout = /** * @param {?=} namespace * @param {?=} refresh * @return {?} */ function (namespace, refresh) { if (namespace === void 0) { namespace = 'app:authData'; } if (refresh === void 0) { refresh = false; } this.clearCredentials(namespace); this.settings.authenticated = false; if (refresh) { // location.href = location.origin; location.href = location.href; } }; // todo: use btoa + atob // todo: use btoa + atob /** * @param {?} credentials * @param {?=} namespace * @return {?} */ BaseApi.prototype.setCredentials = // todo: use btoa + atob /** * @param {?} credentials * @param {?=} namespace * @return {?} */ function (credentials, namespace) { if (namespace === void 0) { namespace = 'app-auth'; } this.credentials = credentials; // window.localStorage.setItem(namespace, btoa(JSON.stringify(credentials))); if (typeof window !== 'undefined' && window.localStorage) { window.localStorage.setItem(namespace, JSON.stringify(credentials)); } }; /** * @param {?=} namespace * @return {?} */ BaseApi.prototype.getCredentials = /** * @param {?=} namespace * @return {?} */ function (namespace) { if (namespace === void 0) { namespace = 'app:authData'; } if (typeof window !== 'undefined' && window.localStorage && window.localStorage.getItem(namespace)) { // return JSON.parse(atob(window.localStorage.getItem(namespace))); return JSON.parse(window.localStorage.getItem(namespace)); } }; /** * @param {?=} namespace * @return {?} */ BaseApi.prototype.clearCredentials = /** * @param {?=} namespace * @return {?} */ function (namespace) { if (namespace === void 0) { namespace = 'app:authData'; } if (typeof window !== 'undefined' && window.localStorage.getItem(namespace)) { window.localStorage.removeItem(namespace); } }; /** * @param {?} routes * @return {?} */ BaseApi.prototype.initApiRoutes = /** * @param {?} routes * @return {?} */ function (routes) { /** @type {?} */ var self = this; routes.forEach((/** * @param {?} obj * @return {?} */ function (obj) { for (var k in obj) { self.routes[k] = obj[k]; } })); if (self.settings.dev && self.settings.routes_dev) { self.settings.routes_dev.forEach((/** * @param {?} obj * @return {?} */ function (obj) { for (var k in obj) { self.routes[k] = obj[k]; } })); } }; // todo // todo /** * @param {?} error * @return {?} */ BaseApi.prototype.errorHandler = // todo /** * @param {?} error * @return {?} */ function (error) { // AppService.scope.$broadcast('formError', error); console.error(error); if (!error) { return; } // if(error.data === "token expired"){ //     toastr.warning($filter('translate')('LOGIN EXPIRED')+'.'); //     service.logOut(); //     return; // } // if (error.statusText === 'Bad Request' || error.status == 400) { //     if (error.data.message) { //         toastr.warning($filter('translate')(error.data.message)); //     } else { //         toastr.warning($filter('translate')('ERROR BAD REQUEST') + '.'); //     } // } // if(error.statusText === 'Unauthorized' || error.status == 401){ //     toastr.warning($filter('translate')('UNAUTHORIZED ERROR')+'.'); //     service.logOut(); //     return; // } // if(error.statusText === 'Not found' || error.status == 404){ //     toastr.warning($filter('translate')('ERROR NOT FOUND')+'.'); // } }; // entities local storage todo: move to storage.js // entities local storage todo: move to storage.js /** * @param {?} resource * @return {?} */ BaseApi.prototype.saveLocalResource = // entities local storage todo: move to storage.js /** * @param {?} resource * @return {?} */ function (resource) { localStorage.setItem(resource[this.idField], resource); }; /** * @param {?} ID * @return {?} */ BaseApi.prototype.loadLocalResource = /** * @param {?} ID * @return {?} */ function (ID) { if (localStorage.getItem(ID)) { localStorage.getItem(ID); } }; /** * @param {?} ID * @return {?} */ BaseApi.prototype.flushLocalResource = /** * @param {?} ID * @return {?} */ function (ID) { if (localStorage.getItem(ID)) { localStorage.removeItem(ID); } }; return BaseApi; }()); export { BaseApi }; if (false) { /** @type {?} */ BaseApi.prototype.headers; /** @type {?} */ BaseApi.prototype.settings; /** @type {?} */ BaseApi.prototype.routes; /** @type {?} */ BaseApi.prototype.baseUrl; /** @type {?} */ BaseApi.prototype.idField; /** @type {?} */ BaseApi.prototype.requestCredentials; /** @type {?} */ BaseApi.prototype.corsMode; /** @type {?} */ BaseApi.prototype.cachePolicy; /** @type {?} */ BaseApi.prototype.credentials; /** @type {?} */ BaseApi.prototype.entities; /** @type {?} */ BaseApi.prototype.hasDebugger; /* Skipping unhandled member: ;*/ } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1hcGkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZW1hL2pzLWJhc2UtbGlicmFyeS8iLCJzb3VyY2VzIjpbImxpYi9iYXNlL2Jhc2UtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUE7SUFjSTtRQVpPLFlBQU8sR0FBUSxFQUFFLENBQUM7UUFFbEIsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLFlBQU8sR0FBRyxNQUFNLENBQUM7UUFDakIsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLHVCQUFrQixHQUFHLGFBQWEsQ0FBQyxDQUFDLHdDQUF3Qzs7UUFDNUUsYUFBUSxHQUFHLGFBQWEsQ0FBQyxDQUFDLHdDQUF3Qzs7UUFDbEUsZ0JBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQywwREFBMEQ7UUFFcEYsYUFBUSxHQUFRLEVBQUUsQ0FBQztRQUNuQixnQkFBVyxHQUFHLEtBQUssQ0FBQztJQUVYLENBQUM7Ozs7O0lBRVYsc0JBQUk7Ozs7SUFBWCxVQUFZLFFBQVE7UUFBcEIsaUJBeUJDO1FBeEJHLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDNUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFOztnQkFDakIsTUFBSSxHQUFHLElBQUk7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTzs7OztZQUFDLFVBQUMsR0FBRztnQkFDOUIsS0FBSyxJQUFNLENBQUMsSUFBSSxHQUFHLEVBQUU7b0JBQ2pCLE1BQUksQ0FBQyxPQUFPLENBQUMs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OztJQUMxQiw4QkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJkZWNsYXJlIHZhciBmZXRjaDogYW55O1xyXG5cclxuZXhwb3J0IGNsYXNzIEJhc2VBcGkge1xyXG5cclxuICAgIHB1YmxpYyBoZWFkZXJzOiBhbnkgPSB7fTtcclxuICAgIHB1YmxpYyBzZXR0aW5nczogYW55O1xyXG4gICAgcHVibGljIHJvdXRlcyA9IHt9O1xyXG4gICAgcHVibGljIGJhc2VVcmwgPSAnL2FwaSc7XHJcbiAgICBwdWJsaWMgaWRGaWVsZCA9ICdpZCc7XHJcbiAgICBwdWJsaWMgcmVxdWVzdENyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJzsgLy8gaW5jbHVkZSwgc2FtZS1vcmlnaW4sICpvbWl0IChkZWZhdWx0KVxyXG4gICAgcHVibGljIGNvcnNNb2RlID0gJ3NhbWUtb3JpZ2luJzsgLy8gbm8tY29ycywgY29ycywgKnNhbWUtb3JpZ2luIChkZWZhdWx0KVxyXG4gICAgcHVibGljIGNhY2hlUG9saWN5ID0gJ25vLWNhY2hlJzsgLy8gKmRlZmF1bHQsIG5vLWNhY2hlLCByZWxvYWQsIGZvcmNlLWNhY2hlLCBvbmx5LWlmLWNhY2hlZFxyXG4gICAgcHVibGljIGNyZWRlbnRpYWxzOiBhbnk7XHJcbiAgICBwdWJsaWMgZW50aXRpZXM6IGFueSA9IHt9O1xyXG4gICAgcHVibGljIGhhc0RlYnVnZ2VyID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdChzZXR0aW5ncykge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5ob3N0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFzZVVybCA9IHNldHRpbmdzLmhvc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnJvdXRlcykge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRBcGlSb3V0ZXModGhpcy5zZXR0aW5ncy5yb3V0ZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5oZWFkZXJzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLmhlYWRlcnMuZm9yRWFjaCgob2JqKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJzW2tdID0gb2JqW2tdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpc1snaHR0cEhlYWRlcnMnXSkge1xyXG4gICAgICAgICAgICAvLyBBbmd1bGFySnMgb25seVxyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmhlYWRlcnMpLmZvckVhY2goKGspID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXNbJ2h0dHBIZWFkZXJzJ10uc2V0KGssIHRoaXMuaGVhZGVyc1trXSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiAoJ3dpdGhDcmVkZW50aWFscycgaW4gbmV3IFhNTEh0dHBSZXF1ZXN0KSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuY29ycyA9IHRydWU7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgcm91dGUodXJsOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgbWFwcGVkVXJsOiBzdHJpbmc7XHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5yb3V0ZXMpLmZvckVhY2goKGspID0+IHtcclxuICAgICAgICAgICAgaWYoayA9PT0gdXJsKSB7XHJcbiAgICAgICAgICAgICAgICBtYXBwZWRVcmwgPSB0aGlzLnJvdXRlc1trXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKG1hcHBlZFVybCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbWFwcGVkVXJsO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDUlVEXHJcbiAgICBwdWJsaWMgYXN5bmMgcG9zdChwYXRoLCBkYXRhOiBhbnkpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IGF3YWl0IGZldGNoKGAke3RoaXMuYmFzZVVybH0ke3BhdGh9YCwge1xyXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSwgLy8gbXVzdCBtYXRjaCAnQ29udGVudC1UeXBlJyBoZWFkZXJcclxuICAgICAgICAgICAgY2FjaGU6IHRoaXMuY2FjaGVQb2xpY3ksXHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiB0aGlzLnJlcXVlc3RDcmVkZW50aWFscyxcclxuICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxyXG4gICAgICAgICAgICBtb2RlOiB0aGlzLmNvcnNNb2RlLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgLy8gcmVkaXJlY3Q6ICdmb2xsb3cnLCAvLyBtYW51YWwsICpmb2xsb3csIGVycm9yXHJcbiAgICAgICAgICAgIC8vIHJlZmVycmVyOiAnbm8tcmVmZXJyZXInLCAvLyAqY2xpZW50LCBuby1yZWZlcnJlclxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSA0MDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQmFkIHJlc3BvbnNlIGZyb20gc2VydmVyJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKHRoaXMuZXJyb3JIYW5kbGVyKVxyXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldChwYXRoOiBzdHJpbmcsIHBhcmFtczogYW55ID0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHBhcmFtcykge1xyXG4gICAgICAgICAgICBwYXRoICs9ICc/JztcclxuICAgICAgICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKGtleSA9PiBwYXRoICs9IGtleSArICc9JyArIHBhcmFtc1trZXldICsgJyYnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmJhc2VVcmx9JHtwYXRofWAsIHtcclxuICAgICAgICAgICAgY2FjaGU6IHRoaXMuY2FjaGVQb2xpY3ksXHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiB0aGlzLnJlcXVlc3RDcmVkZW50aWFscyxcclxuICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxyXG4gICAgICAgICAgICBtb2RlOiB0aGlzLmNvcnNNb2RlLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICAvLyByZWRpcmVjdDogJ2ZvbGxvdycsIC8vIG1hbnVhbCwgKmZvbGxvdywgZXJyb3JcclxuICAgICAgICAgICAgLy8gcmVmZXJyZXI6ICduby1yZWZlcnJlcicsIC8vICpjbGllbnQsIG5vLXJlZmVycmVyXHJcbiAgICAgICAgfSkudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPj0gNDAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdCYWQgcmVzcG9uc2UgZnJvbSBzZXJ2ZXInKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2godGhpcy5lcnJvckhhbmRsZXIpXHJcbiAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0b2RvOiBwYXRjaFxyXG4gICAgcHVibGljIGFzeW5jIHBhdGNoKHBhdGgsIGlkLCBkYXRhKSB7XHJcbiAgICAgICAgYXdhaXQgZmV0Y2goYCR7dGhpcy5iYXNlVXJsfSR7cGF0aH0vYCtpZCwge1xyXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXHJcbiAgICAgICAgICAgIC8vIG1ldGhvZDogJ1BBVENIJyxcclxuICAgICAgICAgICAgbWV0aG9kOiAncGF0Y2gnLFxyXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSggZGF0YSApXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gZml4bWU6IGNhdXNlcyBwaHAgc2VydmVyIGVycm9yIG9uIGRydXBhbCBjb250ZW50IHBhZ2VcclxuICAgIHB1YmxpYyBhc3luYyBkZWxldGUocGF0aCwgaWQpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhwYXRoLGlkKTtcclxuICAgICAgICAvLyBhd2FpdCBmZXRjaChgJHt0aGlzLmJhc2VVcmx9JHtwYXRofS9gICsgaWQsIHtcclxuICAgICAgICAvL+KAguKAguKAguKAgiBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXHJcbiAgICAgICAgLy8gLy/igILigIJtZXRob2Q6ICdERUxFVEUnXHJcbiAgICAgICAgLy/igILigILigILigIIgbWV0aG9kOiAnZGVsZXRlJ1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBsb2dpbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2codXNlcm5hbWUscGFzc3dvcmQubGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2dvdXQobmFtZXNwYWNlOiBzdHJpbmcgPSAnYXBwOmF1dGhEYXRhJywgcmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckNyZWRlbnRpYWxzKG5hbWVzcGFjZSk7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5hdXRoZW50aWNhdGVkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHJlZnJlc2gpIHtcclxuICAgICAgICAgICAgLy8gbG9jYXRpb24uaHJlZiA9IGxvY2F0aW9uLm9yaWdpbjtcclxuICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IGxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHRvZG86IHVzZSBidG9hICsgYXRvYlxyXG4gICAgc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHM6IGFueSwgbmFtZXNwYWNlOiBzdHJpbmcgPSAnYXBwLWF1dGgnKSB7XHJcbiAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzO1xyXG4gICAgICAgIC8vIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lc3BhY2UsIGJ0b2EoSlNPTi5zdHJpbmdpZnkoY3JlZGVudGlhbHMpKSk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UpIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWVzcGFjZSwgSlNPTi5zdHJpbmdpZnkoY3JlZGVudGlhbHMpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3JlZGVudGlhbHMobmFtZXNwYWNlOiBzdHJpbmcgPSAnYXBwOmF1dGhEYXRhJykge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubG9jYWxTdG9yYWdlICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lc3BhY2UpKSB7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiBKU09OLnBhcnNlKGF0b2Iod2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWVzcGFjZSkpKTtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uod2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWVzcGFjZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbGVhckNyZWRlbnRpYWxzKG5hbWVzcGFjZTogc3RyaW5nID0gJ2FwcDphdXRoRGF0YScpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWVzcGFjZSkpIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWVzcGFjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRBcGlSb3V0ZXMocm91dGVzKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcm91dGVzLmZvckVhY2goKG9iaikgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrIGluIG9iaikge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5yb3V0ZXNba10gPSBvYmpba107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoc2VsZi5zZXR0aW5ncy5kZXYgJiYgc2VsZi5zZXR0aW5ncy5yb3V0ZXNfZGV2KSB7XHJcbiAgICAgICAgICAgIHNlbGYuc2V0dGluZ3Mucm91dGVzX2Rldi5mb3JFYWNoKChvYmopID0+IHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGsgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5yb3V0ZXNba10gPSBvYmpba107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyB0b2RvXHJcbiAgICBlcnJvckhhbmRsZXIoZXJyb3IpIHtcclxuICAgICAgICAvLyBBcHBTZXJ2aWNlLnNjb3BlLiRicm9hZGNhc3QoJ2Zvcm1FcnJvcicsIGVycm9yKTtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICBpZiAoIWVycm9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYoZXJyb3IuZGF0YSA9PT0gXCJ0b2tlbiBleHBpcmVkXCIpe1xyXG4gICAgICAgIC8v4oCC4oCC4oCC4oCCIHRvYXN0ci53YXJuaW5nKCRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCdMT0dJTiBFWFBJUkVEJykrJy4nKTtcclxuICAgICAgICAvL+KAguKAguKAguKAgiBzZXJ2aWNlLmxvZ091dCgpO1xyXG4gICAgICAgIC8v4oCC4oCC4oCC4oCCIHJldHVybjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gaWYgKGVycm9yLnN0YXR1c1RleHQgPT09ICdCYWQgUmVxdWVzdCcgfHwgZXJyb3Iuc3RhdHVzID09IDQwMCkge1xyXG4gICAgICAgIC8v4oCC4oCC4oCC4oCCIGlmIChlcnJvci5kYXRhLm1lc3NhZ2UpIHtcclxuICAgICAgICAvL+KAguKAguKAguKAguKAguKAguKAguKAgiB0b2FzdHIud2FybmluZygkZmlsdGVyKCd0cmFuc2xhdGUnKShlcnJvci5kYXRhLm1lc3NhZ2UpKTtcclxuICAgICAgICAvL+KAguKAguKAguKAgiB9IGVsc2Uge1xyXG4gICAgICAgIC8v4oCC4oCC4oCC4oCC4oCC4oCC4oCC4oCCIHRvYXN0ci53YXJuaW5nKCRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCdFUlJPUiBCQUQgUkVRVUVTVCcpICsgJy4nKTtcclxuICAgICAgICAvL+KAguKAguKAguKAgiB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGlmKGVycm9yLnN0YXR1c1RleHQgPT09ICdVbmF1dGhvcml6ZWQnIHx8IGVycm9yLnN0YXR1cyA9PSA0MDEpe1xyXG4gICAgICAgIC8v4oCC4oCC4oCC4oCCIHRvYXN0ci53YXJuaW5nKCRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCdVTkFVVEhPUklaRUQgRVJST1InKSsnLicpO1xyXG4gICAgICAgIC8v4oCC4oCC4oCC4oCCIHNlcnZpY2UubG9nT3V0KCk7XHJcbiAgICAgICAgLy/igILigILigILigIIgcmV0dXJuO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBpZihlcnJvci5zdGF0dXNUZXh0ID09PSAnTm90IGZvdW5kJyB8fCBlcnJvci5zdGF0dXMgPT0gNDA0KXtcclxuICAgICAgICAvL+KAguKAguKAguKAgiB0b2FzdHIud2FybmluZygkZmlsdGVyKCd0cmFuc2xhdGUnKSgnRVJST1IgTk9UIEZPVU5EJykrJy4nKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZW50aXRpZXMgbG9jYWwgc3RvcmFnZSB0b2RvOiBtb3ZlIHRvIHN0b3JhZ2UuanNcclxuICAgIHNhdmVMb2NhbFJlc291cmNlKHJlc291cmNlKSB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocmVzb3VyY2VbdGhpcy5pZEZpZWxkXSwgcmVzb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRMb2NhbFJlc291cmNlKElEKSB7XHJcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKElEKSkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShJRCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZsdXNoTG9jYWxSZXNvdXJjZShJRCkge1xyXG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShJRCkpIHtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oSUQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSJdfQ==