@myrmidon/auth-jwt-admin 0.0.2 → 0.0.3
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/{esm2015/lib/auth-jwt-admin.module.js → esm2020/lib/auth-jwt-admin.module.mjs} +4 -4
- package/esm2020/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +203 -0
- package/{esm2015/lib/components/confirm-dialog/confirm-dialog.component.js → esm2020/lib/components/confirm-dialog/confirm-dialog.component.mjs} +5 -10
- package/{esm2015/lib/components/password-strength-bar/password-strength-bar.component.js → esm2020/lib/components/password-strength-bar/password-strength-bar.component.mjs} +5 -9
- package/{esm2015/lib/components/state/users.paginator.js → esm2020/lib/components/state/users.paginator.mjs} +0 -0
- package/{esm2015/lib/components/state/users.query.js → esm2020/lib/components/state/users.query.mjs} +3 -3
- package/esm2020/lib/components/state/users.service.mjs +65 -0
- package/{esm2015/lib/components/state/users.store.js → esm2020/lib/components/state/users.store.mjs} +3 -3
- package/esm2020/lib/components/user-editor/user-editor.component.mjs +112 -0
- package/esm2020/lib/components/user-filter/user-filter.component.mjs +58 -0
- package/esm2020/lib/components/user-list/user-list.component.mjs +134 -0
- package/{esm2015/lib/services/auth-jwt-account.service.js → esm2020/lib/services/auth-jwt-account.service.mjs} +3 -3
- package/{esm2015/lib/services/dialog.service.js → esm2020/lib/services/dialog.service.mjs} +3 -3
- package/{esm2015/lib/validators/password.validators.js → esm2020/lib/validators/password.validators.mjs} +0 -0
- package/{esm2015/myrmidon-auth-jwt-admin.js → esm2020/myrmidon-auth-jwt-admin.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/myrmidon-auth-jwt-admin.mjs +1061 -0
- package/fesm2015/myrmidon-auth-jwt-admin.mjs.map +1 -0
- package/{fesm2015/myrmidon-auth-jwt-admin.js → fesm2020/myrmidon-auth-jwt-admin.mjs} +50 -78
- package/fesm2020/myrmidon-auth-jwt-admin.mjs.map +1 -0
- package/package.json +22 -9
- package/bundles/myrmidon-auth-jwt-admin.umd.js +0 -1466
- package/bundles/myrmidon-auth-jwt-admin.umd.js.map +0 -1
- package/esm2015/lib/components/auth-jwt-registration/auth-jwt-registration.component.js +0 -207
- package/esm2015/lib/components/state/users.service.js +0 -65
- package/esm2015/lib/components/user-editor/user-editor.component.js +0 -118
- package/esm2015/lib/components/user-filter/user-filter.component.js +0 -63
- package/esm2015/lib/components/user-list/user-list.component.js +0 -138
- package/fesm2015/myrmidon-auth-jwt-admin.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"myrmidon-auth-jwt-admin.umd.js","sources":["../../../../projects/myrmidon/auth-jwt-admin/src/lib/validators/password.validators.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/services/auth-jwt-account.service.ts","../../../../node_modules/tslib/tslib.es6.js","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/password-strength-bar/password-strength-bar.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/password-strength-bar/password-strength-bar.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/auth-jwt-registration/auth-jwt-registration.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/auth-jwt-registration/auth-jwt-registration.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/state/users.store.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/state/users.query.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/state/users.service.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-filter/user-filter.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-filter/user-filter.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/state/users.paginator.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/confirm-dialog/confirm-dialog.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/confirm-dialog/confirm-dialog.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/services/dialog.service.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-editor/user-editor.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-editor/user-editor.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-list/user-list.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-list/user-list.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/auth-jwt-admin.module.ts","../../../../projects/myrmidon/auth-jwt-admin/src/public-api.ts","../../../../projects/myrmidon/auth-jwt-admin/src/myrmidon-auth-jwt-admin.ts"],"sourcesContent":["import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport class PasswordValidators {\r\n /** \"Standard\" password validator for my API services. */\r\n public static standard(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n if (control.value.length < 8) {\r\n return {\r\n passwordTooShort: true,\r\n };\r\n }\r\n\r\n if (!/.*[A-Z].*/.test(control.value)) {\r\n return {\r\n noUpperInPassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[a-z].*/.test(control.value)) {\r\n return {\r\n noLowerInPassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[A-Z].*/.test(control.value)) {\r\n return {\r\n noUpperInPassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[-`~!@#$%^&*()_+=\\[\\]{};:'\",.<>/?|\\\\].*/.test(control.value)) {\r\n return {\r\n noSymbolInPassword: true,\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { retry, catchError } from 'rxjs/operators';\nimport { DataPage, EnvService, ErrorService } from '@myrmidon/ng-tools';\nimport { User } from '@myrmidon/auth-jwt-login';\n\n/**\n * User registration model. You can expand this interface to add more data.\n */\nexport interface RegistrationModel {\n email: string;\n name: string;\n firstName?: string;\n lastName?: string;\n password: string;\n}\n\n/**\n * Result of an existing resource check.\n */\nexport interface ExistResult {\n entry: string;\n isExisting: boolean;\n}\n\n/**\n * Password change data.\n */\nexport interface PasswordChange {\n email: string;\n oldPassword: string;\n newPassword: string;\n confirmPassword: string;\n}\n\n/**\n * User filter parameters.\n */\nexport interface UserFilter {\n pageNumber: number;\n pageSize: number;\n name?: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthJwtAccountService {\n constructor(\n private _http: HttpClient,\n private _error: ErrorService,\n private _env: EnvService\n ) {}\n\n /**\n * Checks if the specified email address is registered on the server.\n * @param email email address to test.\n * @returns result.\n */\n public isEmailRegistered(email: string): Observable<ExistResult> {\n return this._http.get<ExistResult>(\n this._env.get('apiUrl') +\n 'accounts/emailexists/' +\n encodeURIComponent(email)\n );\n }\n\n /**\n * Checks if the specified user's given name is registered on the server.\n * This name is a nickname chosen by users during registration, and is the key\n * used for referencing users when talking to the server.\n * @param name name to test.\n * @returns result.\n */\n public isNameRegistered(name: string): Observable<ExistResult> {\n return this._http.get<ExistResult>(\n this._env.get('apiUrl') +\n 'accounts/nameexists/' +\n encodeURIComponent(name)\n );\n }\n\n /**\n * Register the user with the specified registration data.\n * @param registration The registration data.\n */\n public register(registration: RegistrationModel): Observable<any> {\n // const options = {\n // headers: this.createAuthHeaders({\n // 'Content-Type': 'application/json',\n // }),\n // };\n return this._http.post(\n this._env.get('apiUrl') + 'accounts/register',\n registration\n // options\n );\n }\n\n /**\n * Resend the confirmation email to the specified address.\n * @param email address.\n */\n public resendConfirmEmail(email: string): Observable<any> {\n // const options = {\n // headers: this.createAuthHeaders({\n // 'Content-Type': 'application/json',\n // }),\n // };\n return this._http.get(\n this._env.get('apiUrl') +\n 'accounts/resendconfirm/' +\n encodeURIComponent(email)\n // options\n );\n }\n\n /**\n * Request a password reset for the specified email address.\n * @param email Email address.\n */\n public requestPasswordReset(email: string): Observable<any> {\n return this._http.post(\n this._env.get('apiUrl') + 'accounts/resetpassword/request',\n { email }\n );\n }\n\n public getAllUsers(): Observable<DataPage<User>> {\n return this._http\n .get<DataPage<User>>(this._env.get('apiUrl') + 'users', {\n params: new HttpParams().set('pageNumber', '1'),\n })\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n public getUsers(filter: UserFilter): Observable<DataPage<User>> {\n let httpParams = new HttpParams();\n httpParams = httpParams.set('pageNumber', filter.pageNumber.toString());\n httpParams = httpParams.set('pageSize', filter.pageSize.toString());\n if (filter.name) {\n httpParams = httpParams.set('name', filter.name);\n }\n\n return this._http\n .get<DataPage<User>>(this._env.get('apiUrl') + 'users', {\n params: httpParams,\n })\n .pipe(retry(3), catchError(this._error.handleError));\n }\n /**\n * Get the top N users matching the specified name filter.\n * @param nameFilter The user name filter.\n * @param limit The maximum number of users to get.\n */\n public getTopUsers(nameFilter: string, limit = 10): Observable<User[]> {\n let httpParams = new HttpParams();\n httpParams = httpParams.set('pageNumber', '1');\n httpParams = httpParams.set('pageSize', limit.toString());\n if (nameFilter) {\n httpParams = httpParams.set('name', nameFilter);\n }\n const options =\n httpParams.keys().length > 0\n ? {\n params: httpParams,\n }\n : {};\n\n return this._http\n .get<User[]>(this._env.get('apiUrl') + 'users', options)\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n /**\n * Get information about all the users listed in the specified names.\n * @param names User(s) names.\n */\n public getUsersFromNames(names: string[]): Observable<User[]> {\n let httpParams = new HttpParams();\n if (names && names.length > 0) {\n httpParams = httpParams.set('names', names.join(','));\n }\n const options =\n httpParams.keys().length > 0\n ? {\n params: httpParams,\n }\n : {};\n\n return this._http\n .get<User[]>(this._env.get('apiUrl') + 'users-from-names', options)\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n /**\n * Get data about the specified user.\n * @param name The user name.\n */\n public getUser(name: string): Observable<User> {\n return this._http\n .get<User>(this._env.get('apiUrl') + 'users/' + name)\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n /**\n * Update the editable data for the specified user.\n * @param user The user to update.\n */\n public updateUser(user: User): Observable<any> {\n return this._http\n .put(this._env.get('apiUrl') + 'users', user)\n .pipe(catchError(this._error.handleError));\n }\n\n /**\n * Request a password reset email for the specified email address.\n * @param email The email address to receive the reset message.\n */\n public resetPassword(email: string): Observable<any> {\n return this._http\n .post(this._env.get('apiUrl') + 'accounts/resetpassword/request', {\n email: email,\n })\n .pipe(catchError(this._error.handleError));\n }\n\n /**\n * Change the password.\n * @param change The password change data.\n */\n public changePassword(change: PasswordChange): Observable<any> {\n return this._http\n .post(this._env.get('apiUrl') + 'accounts/changepassword', change)\n .pipe(catchError(this._error.handleError));\n }\n\n /**\n * Delete the user with the specified username.\n * @param name The user name.\n */\n public deleteUser(name: string): Observable<any> {\n return this._http\n .delete(this._env.get('apiUrl') + 'accounts/' + name)\n .pipe(catchError(this._error.handleError));\n }\n}\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","import {\n Component,\n OnChanges,\n EventEmitter,\n Input,\n Output,\n SimpleChange,\n} from '@angular/core';\n\n@Component({\n selector: 'auth-jwt-password-strength-bar',\n templateUrl: './password-strength-bar.component.html',\n styleUrls: ['./password-strength-bar.component.css'],\n})\nexport class PasswordStrengthBarComponent implements OnChanges {\n private _colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0'];\n\n @Input() passwordToCheck: string | undefined;\n\n @Output() strengthChange = new EventEmitter<number>();\n\n public bars: string[];\n\n constructor() {\n this.strengthChange = new EventEmitter<number>();\n this.bars = [];\n }\n\n private measureStrength(p: string): number {\n let force = 0;\n const regex = /[$-/:-?{-~!\"^_`\\[\\]]/g; // \"\n\n const lowerLetters = /[a-z]+/.test(p);\n const upperLetters = /[A-Z]+/.test(p);\n const numbers = /[0-9]+/.test(p);\n const symbols = regex.test(p);\n\n const flags = [lowerLetters, upperLetters, numbers, symbols];\n\n let passedMatches = 0;\n for (const flag of flags) {\n passedMatches += flag === true ? 1 : 0;\n }\n\n force += 2 * p.length + (p.length >= 10 ? 1 : 0);\n force += passedMatches * 10;\n\n // penalty (short password)\n force = p.length <= 6 ? Math.min(force, 10) : force;\n\n // penalty (poor letiety of characters)\n force = passedMatches === 1 ? Math.min(force, 10) : force;\n force = passedMatches === 2 ? Math.min(force, 20) : force;\n force = passedMatches === 3 ? Math.min(force, 40) : force;\n\n return force;\n }\n\n private getColor(s: number) {\n let idx = 0;\n if (s <= 10) {\n idx = 0;\n } else if (s <= 20) {\n idx = 1;\n } else if (s <= 30) {\n idx = 2;\n } else if (s <= 40) {\n idx = 3;\n } else {\n idx = 4;\n }\n return {\n idx: idx + 1,\n col: this._colors[idx],\n };\n }\n\n ngOnChanges(changes: { [propName: string]: SimpleChange }): void {\n const password = changes['passwordToCheck'].currentValue;\n this.setBarColors(5, '#DDD');\n if (password) {\n const strength = this.measureStrength(password);\n const c = this.getColor(strength);\n this.setBarColors(c.idx, c.col);\n this.strengthChange.emit(strength);\n }\n }\n\n private setBarColors(count: number, col: string) {\n for (let n = 0; n < count; n++) {\n this.bars[n] = col;\n }\n }\n}\n","<div id=\"strength\">\n <small>strength:</small>\n <ul id=\"strengthBar\">\n <li class=\"point\" [style.background-color]=\"bars[0]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[1]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[2]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[3]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[4]\"></li>\n </ul>\n</div>\n","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport {\n FormGroup,\n FormControl,\n FormBuilder,\n Validators,\n AbstractControl,\n ValidationErrors,\n} from '@angular/forms';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Observable } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport {\n AuthJwtAccountService,\n ExistResult,\n RegistrationModel,\n} from '../../services/auth-jwt-account.service';\n\nimport { PasswordValidators } from '../../validators/password.validators';\n\n@Component({\n selector: 'auth-jwt-registration',\n templateUrl: './auth-jwt-registration.component.html',\n styleUrls: ['./auth-jwt-registration.component.css'],\n})\nexport class AuthJwtRegistrationComponent implements OnInit {\n public busy: boolean | undefined;\n // form\n public registration: FormGroup;\n public email: FormControl;\n public name: FormControl;\n public firstName: FormControl;\n public lastName: FormControl;\n public passwords: FormGroup;\n public password: FormControl;\n public confirmPassword: FormControl;\n\n /**\n * Emitted when a user was successfully registered. Usually\n * you should handle this to move away from the registration\n * page.\n */\n @Output()\n public registered: EventEmitter<any>;\n\n constructor(\n formBuilder: FormBuilder,\n private _snackbar: MatSnackBar,\n private _accountService: AuthJwtAccountService\n ) {\n this.registered = new EventEmitter<any>();\n // form\n this.email = formBuilder.control(\n '',\n [Validators.required, Validators.email],\n this.getUniqueEmailValidator(this._accountService).bind(this)\n );\n\n this.name = formBuilder.control(\n '',\n Validators.required,\n this.getUniqueNameValidator(this._accountService).bind(this)\n );\n\n this.firstName = formBuilder.control('', [\n Validators.required,\n Validators.maxLength(50),\n ]);\n this.lastName = formBuilder.control('', [\n Validators.required,\n Validators.maxLength(50),\n ]);\n\n // http://stackoverflow.com/questions/35474991/angular-2-form-validating-for-repeat-password\n this.password = formBuilder.control(\n '',\n Validators.compose([Validators.required, PasswordValidators.standard])\n );\n this.confirmPassword = formBuilder.control('', Validators.required);\n this.passwords = formBuilder.group(\n {\n password: this.password,\n confirmPassword: this.confirmPassword,\n },\n { validator: this.areEqual.bind(this) }\n );\n\n this.registration = formBuilder.group({\n email: this.email,\n name: this.name,\n firstName: this.firstName,\n lastName: this.lastName,\n passwords: this.passwords,\n });\n }\n\n private areEqual(group: FormGroup): { [key: string]: boolean } | null {\n if (this.password.value === this.confirmPassword.value) {\n return null;\n }\n return {\n areEqual: true,\n };\n }\n\n /**\n * Creates a unique name validator. There is no dependency injection at this level,\n * but we can use closures. As a matter of fact, we have access to the service instance\n * from the component where we register validators. So we will implement a function\n * that will accept the service as parameter, and create the actual validation function.\n * This function will have access to the service when called during the validation process.\n * See http://restlet.com/blog/2016/02/17/implementing-angular2-forms-beyond-basics-part-2/.\n */\n private getUniqueNameValidator(service: AuthJwtAccountService) {\n return (\n control: AbstractControl\n ):\n | Promise<ValidationErrors | null>\n | Observable<ValidationErrors | null> => {\n return new Promise((resolve, reject) => {\n // avoid checking if empty\n if (!control.value) {\n resolve(null);\n } else {\n service.isNameRegistered(control.value).subscribe(\n (data: ExistResult) => {\n if (!data.isExisting) {\n resolve(null);\n } else {\n resolve({ uniqueName: true });\n }\n },\n (err) => {\n resolve({ uniqueName: true });\n }\n );\n }\n });\n };\n }\n\n private getUniqueEmailValidator(service: AuthJwtAccountService) {\n return (\n control: AbstractControl\n ):\n | Promise<ValidationErrors | null>\n | Observable<ValidationErrors | null> => {\n return new Promise((resolve, reject) => {\n // avoid checking if empty\n if (!control.value) {\n resolve(null);\n } else {\n service.isEmailRegistered(control.value).subscribe(\n (data: ExistResult) => {\n if (!data.isExisting) {\n resolve(null);\n } else {\n resolve({ uniqueEmail: true });\n }\n },\n (err) => {\n resolve({ uniqueEmail: true });\n }\n );\n }\n });\n };\n }\n\n ngOnInit(): void {}\n\n public getEmailErrorLabel(): string | null {\n if (!this.email.dirty) {\n return null;\n }\n\n if (this.email.hasError('required')) {\n return 'email address required';\n }\n if (this.email.hasError('email')) {\n return 'invalid email address';\n }\n if (this.email.hasError('uniqueEmail') && !this.email.pending) {\n return 'email address already registered';\n }\n return null;\n }\n\n public getNameErrorLabel(): string | null {\n if (!this.name.dirty) {\n return null;\n }\n\n if (this.name.hasError('required')) {\n return 'username required';\n }\n\n if (this.name.hasError('pattern')) {\n return 'invalid username';\n }\n\n if (this.name.hasError('uniqueName') && !this.name.pending) {\n return 'username already taken';\n }\n\n return null;\n }\n\n public getPasswordErrorLabel(): string | null {\n if (!this.password.dirty) {\n return null;\n }\n\n if (this.password.hasError('required')) {\n return 'password required';\n }\n if (this.password.hasError('passwordTooShort')) {\n let s = 'at least 8 characters';\n if (this.password.value) {\n s += ` (now ${this.password.value.length})`;\n }\n return s;\n }\n if (this.password.hasError('noUpperInPassword')) {\n return 'at least 1 uppercase letter';\n }\n if (this.password.hasError('noLowerInPassword')) {\n return 'at least 1 lowercase letter';\n }\n if (this.password.hasError('noSymbolInPassword')) {\n return 'at least 1 punctuation or symbol';\n }\n\n return null;\n }\n\n public onSubmit(): void {\n if (\n !this.registration.valid ||\n this.busy ||\n this.name.pending ||\n this.email.pending\n ) {\n return;\n }\n\n const model: RegistrationModel = {\n email: this.email.value,\n name: this.name.value,\n firstName: this.firstName.value,\n lastName: this.lastName.value,\n password: this.password.value,\n };\n\n this.busy = true;\n this._accountService\n .register(model)\n .pipe(take(1))\n .subscribe(\n () => {\n this.busy = false;\n this._snackbar.open('Registration succeeded', 'OK');\n // this.registration.reset();\n // this.registration.clearValidators();\n // this.registration.markAsPristine();\n this.registered.emit();\n },\n (error) => {\n this.busy = false;\n console.error(error);\n this._snackbar.open('Registration error', 'OK');\n }\n );\n }\n}\n","<div>\n <div>\n <p>\n To register a new user, you must provide his email address, choose a\n password, and choose a username, which must be unique (you will be\n notified if another user has already taken that name). The username must\n include only letters/digits, start with a letter, and be no shorter than 3\n characters, nor longer than 50.\n </p>\n <p>\n To promote a decent security level, the password must include at least 8\n characters, uppercase and lowercase letters, digits, and punctuation (like\n dashes, stops, parentheses, etc.).\n </p>\n <p>\n Once registered, the user will receive an email message to the email\n address you specified; he will have to click on the provided link to\n complete the registration process.\n </p>\n </div>\n\n <form role=\"form\" [formGroup]=\"registration\" (submit)=\"onSubmit()\">\n <fieldset>\n <label>register user</label>\n <!-- email -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"email\"\n id=\"email\"\n maxlength=\"256\"\n required\n autofocus\n spellcheck=\"false\"\n placeholder=\"email\"\n formControlName=\"email\"\n />\n <mat-error>{{ getEmailErrorLabel() }}</mat-error>\n <mat-icon *ngIf=\"email.pending\">hourglass</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"name\"\n maxlength=\"50\"\n required\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\n spellcheck=\"false\"\n placeholder=\"username\"\n formControlName=\"name\"\n />\n <mat-error>{{ getNameErrorLabel() }}</mat-error>\n <mat-icon *ngIf=\"name.pending\">hourglass</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- first name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"firstName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"first name\"\n formControlName=\"firstName\"\n />\n <mat-error\n *ngIf=\"\n firstName.hasError('required') &&\n (firstName.dirty || firstName.touched)\n \"\n class=\"text-danger small\"\n >\n first name required\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- last name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"lastName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"last name\"\n formControlName=\"lastName\"\n />\n <mat-error\n *ngIf=\"\n lastName.hasError('required') &&\n (lastName.dirty || lastName.touched)\n \"\n class=\"text-danger small\"\n >\n last name required\n </mat-error>\n </mat-form-field>\n </div>\n\n <div [formGroup]=\"passwords\">\n <!-- password -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"password\"\n name=\"password\"\n autocomplete=\"new-password\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"password\"\n formControlName=\"password\"\n />\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\n </auth-jwt-password-strength-bar>\n <mat-error>{{ getPasswordErrorLabel() }}</mat-error>\n </mat-form-field>\n </div>\n\n <!-- confirm password -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"password\"\n name=\"confirmPassword\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"confirm password\"\n formControlName=\"confirmPassword\"\n />\n <mat-error\n *ngIf=\"\n passwords.hasError('areEqual') &&\n (confirmPassword.dirty || confirmPassword.touched)\n \"\n >\n password differs from confirmation password\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n\n <button\n mat-raised-button\n type=\"submit\"\n color=\"primary\"\n [disabled]=\"\n !registration.valid || busy || name.pending || email.pending\n \"\n >\n register\n </button>\n <mat-progress-spinner\n diameter=\"20\"\n *ngIf=\"busy\"\n aria-label=\"Busy\"\n ></mat-progress-spinner>\n </fieldset>\n </form>\n</div>\n","import { StoreConfig, EntityStore, EntityState, ActiveState } from '@datorama/akita';\r\nimport { Injectable } from '@angular/core';\r\nimport { User } from '@myrmidon/auth-jwt-login';\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\n\r\n// https://netbasal.gitbook.io/akita/entity-store/entity-store/active-state\r\nexport interface UsersState\r\n extends EntityState<User, string>,\r\n ActiveState<string> {\r\n filter: UserFilter;\r\n active: string | null;\r\n}\r\n\r\nconst initialState: UsersState = {\r\n filter: {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n },\r\n active: null\r\n};\r\n\r\n@Injectable({ providedIn: 'root' })\r\n@StoreConfig({ name: 'Users', idKey: 'userName', resettable: true })\r\nexport class UsersStore extends EntityStore<UsersState> {\r\n constructor() {\r\n super(initialState);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { QueryEntity } from '@datorama/akita';\r\nimport { Observable } from 'rxjs';\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\nimport { UsersState, UsersStore } from './users.store';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UsersQuery extends QueryEntity<UsersState> {\r\n constructor(protected _store: UsersStore) {\r\n super(_store);\r\n }\r\n\r\n public selectFilter(): Observable<UserFilter> {\r\n return this.select((state: UsersState) => state.filter);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { User } from '@myrmidon/auth-jwt-login';\r\nimport {\r\n AuthJwtAccountService,\r\n UserFilter,\r\n} from '../../services/auth-jwt-account.service';\r\nimport { UsersStore } from './users.store';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UsersService {\r\n constructor(\r\n private _store: UsersStore,\r\n private _accountService: AuthJwtAccountService\r\n ) {}\r\n\r\n /**\r\n * Update the filter in the store.\r\n * @param filter The filter.\r\n */\r\n public updateFilter(filter: UserFilter): void {\r\n this._store.update({\r\n filter: filter,\r\n });\r\n }\r\n\r\n public setActive(name: string | null): void {\r\n this._store.setActive(name);\r\n }\r\n\r\n public updateActive(user: User): Promise<boolean> {\r\n const promise: Promise<boolean> = new Promise((resolve, reject) => {\r\n this._store.setLoading(true);\r\n\r\n this._accountService.updateUser(user).subscribe(\r\n (_) => {\r\n this._store.setLoading(false);\r\n this._store.setError(null);\r\n this._store.updateActive((u) => {\r\n return { ...user };\r\n });\r\n resolve(true);\r\n },\r\n (error) => {\r\n console.error(error);\r\n this._store.setLoading(false);\r\n this._store.setError('Error updating user');\r\n resolve(false);\r\n }\r\n );\r\n });\r\n return promise;\r\n }\r\n\r\n public deleteUser(name: string): Promise<boolean> {\r\n const promise: Promise<boolean> = new Promise((resolve, reject) => {\r\n this._store.setLoading(true);\r\n\r\n this._accountService.deleteUser(name).subscribe(\r\n (_) => {\r\n this._store.setLoading(false);\r\n this._store.setError(null);\r\n this._store.remove(name);\r\n resolve(true);\r\n },\r\n (error) => {\r\n console.error(error);\r\n this._store.setLoading(false);\r\n this._store.setError('Error deleting user');\r\n reject(error);\r\n }\r\n );\r\n });\r\n return promise;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { UserFilter } from '../../services/auth-jwt-account.service';\nimport { UsersQuery } from '../state/users.query';\nimport { UsersService } from '../state/users.service';\n\n@Component({\n selector: 'auth-jwt-user-filter',\n templateUrl: './user-filter.component.html',\n styleUrls: ['./user-filter.component.css'],\n})\nexport class UserFilterComponent implements OnInit {\n @Input()\n public disabled: boolean | undefined;\n\n public filter$: Observable<UserFilter>;\n\n public name: FormControl;\n public form: FormGroup;\n\n constructor(\n formBuilder: FormBuilder,\n query: UsersQuery,\n private _corporaService: UsersService\n ) {\n this.filter$ = query.selectFilter();\n\n // form\n this.name = formBuilder.control(null);\n this.form = formBuilder.group({\n name: this.name,\n });\n }\n\n ngOnInit(): void {\n this.filter$.subscribe((f) => {\n this.updateForm(f);\n });\n }\n\n private updateForm(filter: UserFilter): void {\n this.name.setValue(filter.name);\n this.form.markAsPristine();\n }\n\n public reset(): void {\n this.form.reset();\n this.apply();\n }\n\n private getFilter(): UserFilter {\n return {\n pageNumber: 1, // not used\n pageSize: 20, // not used\n name: this.name.value?.trim(),\n };\n }\n\n public apply(): void {\n if (this.form.invalid) {\n return;\n }\n const filter = this.getFilter();\n\n // update filter in state\n this._corporaService.updateFilter(filter);\n }\n}\n","<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\n <mat-form-field>\n <input matInput [formControl]=\"name\" placeholder=\"name or ID\" />\n <button\n mat-icon-button\n matSuffix\n type=\"button\"\n (click)=\"reset()\"\n color=\"warn\"\n matTooltip=\"Reset filters\"\n [disabled]=\"disabled\"\n >\n <mat-icon>clear</mat-icon>\n </button>\n </mat-form-field>\n\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"disabled\"\n matTooltip=\"Apply filters\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n</form>\n","import { inject, InjectionToken } from '@angular/core';\r\nimport { PaginatorPlugin } from '@datorama/akita';\r\nimport { UsersQuery } from './users.query';\r\n\r\n// create a factory provider for the paginator\r\nexport const USERS_PAGINATOR = new InjectionToken('USERS_PAGINATOR', {\r\n providedIn: 'root',\r\n factory: () => {\r\n const query = inject(UsersQuery);\r\n return new PaginatorPlugin(query).withControls().withRange();\r\n },\r\n});\r\n","import { Component, OnInit, Inject, Optional } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\n\r\n// https://medium.com/@tarik.nzl/making-use-of-dialogs-in-material-2-mddialog-7533d27df41\r\n\r\n@Component({\r\n // https://github.com/angular/components/issues/7718\r\n // selector: 'cadmus-confirm-dialog',\r\n templateUrl: './confirm-dialog.component.html',\r\n styleUrls: ['./confirm-dialog.component.css'],\r\n})\r\nexport class ConfirmDialogComponent implements OnInit {\r\n public title: string;\r\n public prompt: string;\r\n public ok: string;\r\n public cancel: string;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<ConfirmDialogComponent>,\r\n @Optional() @Inject(MAT_DIALOG_DATA) public data: any\r\n ) {\r\n this.title = 'Confirm';\r\n this.prompt = 'Confirm operation?';\r\n this.ok = 'yes';\r\n this.cancel = 'no';\r\n }\r\n\r\n ngOnInit() {}\r\n}\r\n","<h1 mat-dialog-title>{{ title }}</h1>\r\n<mat-dialog-content>\r\n {{ prompt }}\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button\r\n type=\"button\"\r\n mat-raised-button\r\n color=\"warn\"\r\n (click)=\"dialogRef.close(true)\"\r\n >\r\n {{ ok }}\r\n </button>\r\n <button type=\"button\" mat-button (click)=\"dialogRef.close()\">\r\n {{ cancel }}\r\n </button>\r\n</mat-dialog-actions>\r\n","import { Injectable } from '@angular/core';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { ConfirmDialogComponent } from '../components/confirm-dialog/confirm-dialog.component';\r\nimport { Observable } from 'rxjs';\r\n\r\n// https://medium.com/@tarik.nzl/making-use-of-dialogs-in-material-2-mddialog-7533d27df41\r\n\r\n/**\r\n * This service acts as a wrapper for MatDialog to simplify the process of calling\r\n * the dialog and subscribing to it. What it will do is create an Instance of\r\n * MatDialog with our custom component (ConfirmDialogComponent). Then it will set\r\n * any public properties it needs to by setting the properties on the\r\n * componentInstance object. It will return the observable afterClosed()\r\n * to the caller so they can subscribe to it. This will emit an event whenever\r\n * the dialog is closed.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DialogService {\r\n\r\n constructor(private dialog: MatDialog) { }\r\n\r\n public confirm(title: string, prompt: string, ok = 'yes', cancel = 'no'):\r\n Observable<boolean> {\r\n\r\n let dialogRef: MatDialogRef<ConfirmDialogComponent>;\r\n\r\n dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n dialogRef.componentInstance.title = title;\r\n dialogRef.componentInstance.prompt = prompt;\r\n dialogRef.componentInstance.ok = ok;\r\n dialogRef.componentInstance.cancel = cancel;\r\n\r\n return dialogRef.afterClosed();\r\n }\r\n}\r\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport {\n FormGroup,\n FormControl,\n FormBuilder,\n Validators,\n} from '@angular/forms';\nimport { AuthJwtService, User } from '@myrmidon/auth-jwt-login';\n\n@Component({\n selector: 'auth-jwt-user-editor',\n templateUrl: './user-editor.component.html',\n styleUrls: ['./user-editor.component.css'],\n})\nexport class UserEditorComponent implements OnInit {\n private _user: User | undefined;\n\n public email: FormControl;\n public emailConfirmed: FormControl;\n public lockoutEnabled: FormControl;\n public firstName: FormControl;\n public lastName: FormControl;\n public roles: FormControl;\n public form: FormGroup;\n\n public unlocked: boolean | undefined;\n\n @Input() public set user(value: User | undefined) {\n this._user = value;\n this.updateForm(value);\n }\n public get user(): User | undefined {\n return this._user;\n }\n\n @Output() userChange: EventEmitter<User>;\n @Output() editorClose: EventEmitter<any>;\n\n constructor(formBuilder: FormBuilder, private _authService: AuthJwtService) {\n // events\n this.userChange = new EventEmitter<User>();\n this.editorClose = new EventEmitter<any>();\n // form\n this.email = formBuilder.control(null, [\n Validators.required,\n Validators.email,\n ]);\n this.emailConfirmed = formBuilder.control(false);\n this.lockoutEnabled = formBuilder.control(false);\n this.firstName = formBuilder.control(null, [\n Validators.required,\n Validators.maxLength(50),\n ]);\n this.lastName = formBuilder.control(null, [\n Validators.required,\n Validators.maxLength(50),\n ]);\n this.roles = formBuilder.control(null, Validators.maxLength(200));\n\n this.form = formBuilder.group({\n email: this.email,\n emailConfirmed: this.emailConfirmed,\n lockoutEnabled: this.lockoutEnabled,\n firstName: this.firstName,\n lastName: this.lastName,\n roles: this.roles,\n });\n }\n\n ngOnInit(): void {}\n\n private updateForm(user: User | undefined): void {\n if (!user) {\n this.form.reset();\n } else {\n this.email.setValue(user.email);\n this.emailConfirmed.setValue(user.emailConfirmed);\n this.lockoutEnabled.setValue(user.lockoutEnabled);\n this.firstName.setValue(user.firstName);\n this.lastName.setValue(user.lastName);\n if (user.roles?.length > 0) {\n this.roles.setValue(user.roles.join(' '));\n } else {\n this.roles.setValue(null);\n }\n }\n }\n\n private getUserFromForm(): User {\n return {\n userName: this._user?.userName || '',\n email: this.email.value,\n emailConfirmed: this.emailConfirmed.value,\n lockoutEnabled: this.lockoutEnabled.value,\n firstName: this.firstName.value,\n lastName: this.lastName.value,\n roles: this.roles.value\n ? this.roles.value.split(' ').filter((s: string) => s)\n : [],\n };\n }\n\n public endLockout(): void {\n if (this.unlocked) {\n return;\n }\n this._user!.lockoutEnd = this._authService.getUTCDate();\n this.unlocked = true;\n }\n\n public close(): void {\n this.editorClose.emit();\n }\n\n public save(): void {\n if (this.form.invalid) {\n return;\n }\n this.userChange.emit(this.getUserFromForm());\n }\n}\n","<form [formGroup]=\"form\" (submit)=\"save()\">\n <!-- email -->\n <div>\n <mat-form-field>\n <input type=\"text\" matInput [formControl]=\"email\" placeholder=\"email\" />\n <mat-error\n *ngIf=\"email.hasError('required') && (email.dirty || email.touched)\"\n >\n email address required\n </mat-error>\n <mat-error\n *ngIf=\"email.hasError('pattern') && (email.dirty || email.touched)\"\n >\n invalid email address\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- emailConfirmed -->\n <div>\n <mat-checkbox [formControl]=\"emailConfirmed\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div>\n <mat-checkbox [formControl]=\"lockoutEnabled\"\n >lockout enabled</mat-checkbox\n >\n \n <button\n mat-stroked-button\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n matTooltip=\"Unlock this user if locked\"\n >\n unlock\n </button>\n </div>\n\n <!-- firstName -->\n <div>\n <mat-form-field>\n <input\n type=\"text\"\n matInput\n [formControl]=\"firstName\"\n placeholder=\"first name\"\n />\n <mat-error\n *ngIf=\"\n firstName.hasError('required') &&\n (firstName.dirty || firstName.touched)\n \"\n >\n first name required\n </mat-error>\n <mat-error\n *ngIf=\"\n firstName.hasError('maxlength') &&\n (firstName.dirty || firstName.touched)\n \"\n >\n first name too long\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- lastName -->\n <div>\n <mat-form-field>\n <input\n type=\"text\"\n matInput\n [formControl]=\"lastName\"\n placeholder=\"last name\"\n />\n <mat-error\n *ngIf=\"\n lastName.hasError('required') && (lastName.dirty || lastName.touched)\n \"\n >\n last name required\n </mat-error>\n <mat-error\n *ngIf=\"\n lastName.hasError('maxlength') && (lastName.dirty || lastName.touched)\n \"\n >\n last name too long\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field>\n <input\n type=\"text\"\n matInput\n [formControl]=\"roles\"\n placeholder=\"roles (separated by space)\"\n />\n <mat-error\n *ngIf=\"roles.hasError('maxlength') && (roles.dirty || roles.touched)\"\n >\n too long\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button mat-icon-button color=\"warn\" matTooltip=\"Close\" (click)=\"close()\">\n <mat-icon>cancel</mat-icon>\n </button>\n \n <button\n type=\"submit\"\n mat-button\n color=\"primary\"\n [disabled]=\"form.invalid\"\n matTooltip=\"Save user data\"\n >\n <mat-icon>check_circle</mat-icon> save\n </button>\n </div>\n</form>\n","import { Component, Inject, OnDestroy } from '@angular/core';\nimport { FormBuilder, FormControl } from '@angular/forms';\nimport { PageEvent } from '@angular/material/paginator';\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\nimport { map, startWith, switchMap, take, tap } from 'rxjs/operators';\nimport { PaginationResponse, PaginatorPlugin } from '@datorama/akita';\n\nimport { GravatarService, User } from '@myrmidon/auth-jwt-login';\nimport { DataPage } from '@myrmidon/ng-tools';\n\nimport {\n AuthJwtAccountService,\n UserFilter,\n} from '../../services/auth-jwt-account.service';\nimport { USERS_PAGINATOR } from '../state/users.paginator';\nimport { UsersState } from '../state/users.store';\nimport { UsersQuery } from '../state/users.query';\nimport { DialogService } from '../../services/dialog.service';\nimport { UsersService } from '../state/users.service';\n\n@Component({\n selector: 'auth-jwt-user-list',\n templateUrl: './user-list.component.html',\n styleUrls: ['./user-list.component.css'],\n})\nexport class UserListComponent implements OnDestroy {\n private _refresh$: BehaviorSubject<number>;\n private _filter$: Observable<UserFilter>;\n\n public pagination$: Observable<PaginationResponse<User>>;\n public pageSize: FormControl;\n public active$: Observable<User | undefined>;\n\n constructor(\n @Inject(USERS_PAGINATOR)\n public paginator: PaginatorPlugin<UsersState>,\n userQuery: UsersQuery,\n private _accountService: AuthJwtAccountService,\n private _usersService: UsersService,\n private _dialogService: DialogService,\n private _gravatarService: GravatarService,\n formBuilder: FormBuilder\n ) {\n this.pageSize = formBuilder.control(20);\n this._refresh$ = new BehaviorSubject(0);\n this._filter$ = userQuery.selectFilter();\n // https://netbasal.com/manage-your-entities-with-akita-like-a-boss-768732f8d4d1\n this.active$ = userQuery.selectActive<User>();\n\n this.pagination$ = combineLatest([\n this.paginator.pageChanges,\n this.pageSize.valueChanges.pipe(\n // we are required to emit at least the initial value\n // as combineLatest emits only if ALL observables have emitted\n startWith(20),\n // clear the cache when page size changes\n tap((_) => {\n this.paginator.clearCache();\n })\n ),\n this._filter$.pipe(\n // clear the cache when filters changed\n tap((_) => {\n this.paginator.clearCache();\n })\n ),\n this._refresh$.pipe(\n // clear the cache when forcing refresh\n tap((_) => {\n this.paginator.clearCache();\n })\n ),\n ]).pipe(\n // for each emitted value, combine into a filter and use it\n // to request the page from server\n switchMap(([pageNumber, pageSize, filter, refresh]) => {\n // const filter = { ...this._docsQuery.getValue().filter };\n const f = { ...filter };\n f.pageNumber = pageNumber;\n f.pageSize = pageSize;\n const request = this.getRequest(f);\n // update saved filters\n this.paginator.metadata.set('filter', f);\n return this.paginator.getPage(request);\n })\n );\n }\n\n ngOnDestroy(): void {\n this.paginator.destroy();\n }\n\n private getRequest(\n filter: UserFilter\n ): () => Observable<PaginationResponse<User>> {\n return () =>\n this._accountService.getUsers(filter).pipe(\n // adapt server results to the paginator plugin\n map((p: DataPage<User>) => {\n return {\n currentPage: p.pageNumber,\n perPage: p.pageSize,\n lastPage: p.pageCount,\n data: p.items,\n total: p.total,\n };\n })\n );\n }\n\n public pageChange(event: PageEvent): void {\n // https://material.angular.io/components/paginator/api\n this.paginator.setPage(event.pageIndex + 1);\n if (event.pageSize !== this.pageSize.value) {\n this.pageSize.setValue(event.pageSize);\n }\n }\n\n public refresh(): void {\n this.paginator.clearCache();\n this._refresh$.next(this._refresh$.value + 1);\n }\n\n public deleteUser(user: User): void {\n this._dialogService\n .confirm('Confirm', `Delete User ${user.userName}?`)\n .pipe(take(1))\n .subscribe((yes) => {\n if (!yes) {\n return;\n }\n this._usersService.deleteUser(user.userName).finally(() => {\n this.refresh();\n });\n });\n }\n\n public setActiveUser(user: User | null): void {\n this._usersService.setActive(user?.userName || null);\n }\n\n public resetActiveUser(): void {\n this._usersService.setActive(null);\n }\n\n public saveActiveUser(user: User): void {\n this._usersService.updateActive(user).finally(() => {\n this.refresh();\n });\n }\n\n public onUserEditorClose(): void {\n this.setActiveUser(null);\n }\n\n public getGravatarUrl(email: string, size = 80): string | null {\n return this._gravatarService.buildGravatarUrl(email, size);\n }\n}\n","<div\n gdAreas=\"filters | progress | list | pager | editor\"\n gdRows=\"80px 64px 2fr 40px 1fr\"\n gdColumns=\"1fr\"\n gdGap=\"8px\"\n>\n <div>\n <!-- filters -->\n <div gdArea=\"filters\">\n <auth-jwt-user-filter></auth-jwt-user-filter>\n </div>\n\n <!-- progress -->\n <div *ngIf=\"paginator.isLoading$ | async\" gdArea=\"progress\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n\n <!-- list -->\n <div gdArea=\"list\" *ngIf=\"pagination$ | async as pagination\">\n <table>\n <thead>\n <td></td>\n <td></td>\n <td></td>\n <th>name</th>\n <th>first</th>\n <th>last</th>\n <th>email</th>\n <th>roles</th>\n <th>lock end</th>\n </thead>\n <tbody>\n <tr *ngFor=\"let user of pagination.data\">\n <td class=\"command\">\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Edit {{ user.userName }}\"\n color=\"primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon>mode_edit</mat-icon>\n </button>\n </td>\n <td class=\"command\">\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Delete {{ user.userName }}\"\n color=\"warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon>remove_circle</mat-icon>\n </button>\n </td>\n <td>\n <img\n [src]=\"getGravatarUrl(user.email, 32)\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td>{{ user.firstName }}</td>\n <td>{{ user.lastName }}</td>\n <td>\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles?.join(\" \") }}</td>\n <td>{{ user.lockoutEnd }}</td>\n </tr>\n </tbody>\n </table>\n <!-- pagination -->\n <mat-paginator\n gdArea=\"pager\"\n gdAlignColumns=\"center\"\n gdAlignRows=\"start\"\n [length]=\"pagination.total\"\n [pageSize]=\"pageSize?.value\"\n [pageSizeOptions]=\"[20, 50, 75, 100]\"\n [pageIndex]=\"pagination.currentPage - 1\"\n [showFirstLastButtons]=\"true\"\n (page)=\"pageChange($event)\"\n ></mat-paginator>\n </div>\n </div>\n\n <!-- editor -->\n <div gdArea=\"editor\" *ngIf=\"active$ | async as active\">\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { RouterModule } from '@angular/router';\nimport { AuthJwtLoginModule } from '@myrmidon/auth-jwt-login';\nimport { NgToolsModule } from '@myrmidon/ng-tools';\n\nimport { AuthJwtRegistrationComponent } from './components/auth-jwt-registration/auth-jwt-registration.component';\nimport { PasswordStrengthBarComponent } from './components/password-strength-bar/password-strength-bar.component';\nimport { UserFilterComponent } from './components/user-filter/user-filter.component';\nimport { UserListComponent } from './components/user-list/user-list.component';\nimport { ConfirmDialogComponent } from './components/confirm-dialog/confirm-dialog.component';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { UserEditorComponent } from './components/user-editor/user-editor.component';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatPaginatorModule } from '@angular/material/paginator';\n\n@NgModule({\n declarations: [\n AuthJwtRegistrationComponent,\n PasswordStrengthBarComponent,\n UserFilterComponent,\n UserListComponent,\n ConfirmDialogComponent,\n UserEditorComponent,\n ],\n imports: [\n CommonModule,\n HttpClientModule,\n FormsModule,\n RouterModule,\n ReactiveFormsModule,\n // material\n MatButtonModule,\n MatCardModule,\n MatCheckboxModule,\n MatDialogModule,\n MatIconModule,\n MatInputModule,\n MatPaginatorModule,\n MatProgressBarModule,\n MatProgressSpinnerModule,\n MatSnackBarModule,\n MatTooltipModule,\n AuthJwtLoginModule,\n NgToolsModule\n ],\n exports: [\n AuthJwtRegistrationComponent,\n PasswordStrengthBarComponent,\n UserFilterComponent,\n UserListComponent\n ],\n})\nexport class AuthJwtAdminModule {}\n","/*\n * Public API Surface of auth-jwt-admin\n */\n\nexport * from './lib/components/auth-jwt-registration/auth-jwt-registration.component';\nexport * from './lib/components/password-strength-bar/password-strength-bar.component';\nexport * from './lib/components/user-filter/user-filter.component';\nexport * from './lib/components/user-list/user-list.component';\nexport * from './lib/services/auth-jwt-account.service';\nexport * from './lib/validators/password.validators';\nexport * from './lib/auth-jwt-admin.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["HttpParams","retry","catchError","Injectable","EventEmitter","Component","Input","Output","Validators","take","EntityStore","StoreConfig","QueryEntity","InjectionToken","inject","PaginatorPlugin","MAT_DIALOG_DATA","Optional","Inject","BehaviorSubject","combineLatest","startWith","tap","switchMap","map","CommonModule","HttpClientModule","FormsModule","RouterModule","ReactiveFormsModule","MatButtonModule","MatCardModule","MatCheckboxModule","MatDialogModule","MatIconModule","MatInputModule","MatPaginatorModule","MatProgressBarModule","MatProgressSpinnerModule","MatSnackBarModule","MatTooltipModule","AuthJwtLoginModule","NgToolsModule","NgModule"],"mappings":"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"}
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Output } from '@angular/core';
|
|
2
|
-
import { Validators, } from '@angular/forms';
|
|
3
|
-
import { take } from 'rxjs/operators';
|
|
4
|
-
import { PasswordValidators } from '../../validators/password.validators';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/forms";
|
|
7
|
-
import * as i2 from "@angular/material/snack-bar";
|
|
8
|
-
import * as i3 from "../../services/auth-jwt-account.service";
|
|
9
|
-
import * as i4 from "@angular/material/form-field";
|
|
10
|
-
import * as i5 from "@angular/material/icon";
|
|
11
|
-
import * as i6 from "../password-strength-bar/password-strength-bar.component";
|
|
12
|
-
import * as i7 from "@angular/material/button";
|
|
13
|
-
import * as i8 from "@angular/material/progress-spinner";
|
|
14
|
-
import * as i9 from "@angular/material/input";
|
|
15
|
-
import * as i10 from "@angular/common";
|
|
16
|
-
export class AuthJwtRegistrationComponent {
|
|
17
|
-
constructor(formBuilder, _snackbar, _accountService) {
|
|
18
|
-
this._snackbar = _snackbar;
|
|
19
|
-
this._accountService = _accountService;
|
|
20
|
-
this.registered = new EventEmitter();
|
|
21
|
-
// form
|
|
22
|
-
this.email = formBuilder.control('', [Validators.required, Validators.email], this.getUniqueEmailValidator(this._accountService).bind(this));
|
|
23
|
-
this.name = formBuilder.control('', Validators.required, this.getUniqueNameValidator(this._accountService).bind(this));
|
|
24
|
-
this.firstName = formBuilder.control('', [
|
|
25
|
-
Validators.required,
|
|
26
|
-
Validators.maxLength(50),
|
|
27
|
-
]);
|
|
28
|
-
this.lastName = formBuilder.control('', [
|
|
29
|
-
Validators.required,
|
|
30
|
-
Validators.maxLength(50),
|
|
31
|
-
]);
|
|
32
|
-
// http://stackoverflow.com/questions/35474991/angular-2-form-validating-for-repeat-password
|
|
33
|
-
this.password = formBuilder.control('', Validators.compose([Validators.required, PasswordValidators.standard]));
|
|
34
|
-
this.confirmPassword = formBuilder.control('', Validators.required);
|
|
35
|
-
this.passwords = formBuilder.group({
|
|
36
|
-
password: this.password,
|
|
37
|
-
confirmPassword: this.confirmPassword,
|
|
38
|
-
}, { validator: this.areEqual.bind(this) });
|
|
39
|
-
this.registration = formBuilder.group({
|
|
40
|
-
email: this.email,
|
|
41
|
-
name: this.name,
|
|
42
|
-
firstName: this.firstName,
|
|
43
|
-
lastName: this.lastName,
|
|
44
|
-
passwords: this.passwords,
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
areEqual(group) {
|
|
48
|
-
if (this.password.value === this.confirmPassword.value) {
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
return {
|
|
52
|
-
areEqual: true,
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Creates a unique name validator. There is no dependency injection at this level,
|
|
57
|
-
* but we can use closures. As a matter of fact, we have access to the service instance
|
|
58
|
-
* from the component where we register validators. So we will implement a function
|
|
59
|
-
* that will accept the service as parameter, and create the actual validation function.
|
|
60
|
-
* This function will have access to the service when called during the validation process.
|
|
61
|
-
* See http://restlet.com/blog/2016/02/17/implementing-angular2-forms-beyond-basics-part-2/.
|
|
62
|
-
*/
|
|
63
|
-
getUniqueNameValidator(service) {
|
|
64
|
-
return (control) => {
|
|
65
|
-
return new Promise((resolve, reject) => {
|
|
66
|
-
// avoid checking if empty
|
|
67
|
-
if (!control.value) {
|
|
68
|
-
resolve(null);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
service.isNameRegistered(control.value).subscribe((data) => {
|
|
72
|
-
if (!data.isExisting) {
|
|
73
|
-
resolve(null);
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
resolve({ uniqueName: true });
|
|
77
|
-
}
|
|
78
|
-
}, (err) => {
|
|
79
|
-
resolve({ uniqueName: true });
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
getUniqueEmailValidator(service) {
|
|
86
|
-
return (control) => {
|
|
87
|
-
return new Promise((resolve, reject) => {
|
|
88
|
-
// avoid checking if empty
|
|
89
|
-
if (!control.value) {
|
|
90
|
-
resolve(null);
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
service.isEmailRegistered(control.value).subscribe((data) => {
|
|
94
|
-
if (!data.isExisting) {
|
|
95
|
-
resolve(null);
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
resolve({ uniqueEmail: true });
|
|
99
|
-
}
|
|
100
|
-
}, (err) => {
|
|
101
|
-
resolve({ uniqueEmail: true });
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
ngOnInit() { }
|
|
108
|
-
getEmailErrorLabel() {
|
|
109
|
-
if (!this.email.dirty) {
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
if (this.email.hasError('required')) {
|
|
113
|
-
return 'email address required';
|
|
114
|
-
}
|
|
115
|
-
if (this.email.hasError('email')) {
|
|
116
|
-
return 'invalid email address';
|
|
117
|
-
}
|
|
118
|
-
if (this.email.hasError('uniqueEmail') && !this.email.pending) {
|
|
119
|
-
return 'email address already registered';
|
|
120
|
-
}
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
getNameErrorLabel() {
|
|
124
|
-
if (!this.name.dirty) {
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
127
|
-
if (this.name.hasError('required')) {
|
|
128
|
-
return 'username required';
|
|
129
|
-
}
|
|
130
|
-
if (this.name.hasError('pattern')) {
|
|
131
|
-
return 'invalid username';
|
|
132
|
-
}
|
|
133
|
-
if (this.name.hasError('uniqueName') && !this.name.pending) {
|
|
134
|
-
return 'username already taken';
|
|
135
|
-
}
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
getPasswordErrorLabel() {
|
|
139
|
-
if (!this.password.dirty) {
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
if (this.password.hasError('required')) {
|
|
143
|
-
return 'password required';
|
|
144
|
-
}
|
|
145
|
-
if (this.password.hasError('passwordTooShort')) {
|
|
146
|
-
let s = 'at least 8 characters';
|
|
147
|
-
if (this.password.value) {
|
|
148
|
-
s += ` (now ${this.password.value.length})`;
|
|
149
|
-
}
|
|
150
|
-
return s;
|
|
151
|
-
}
|
|
152
|
-
if (this.password.hasError('noUpperInPassword')) {
|
|
153
|
-
return 'at least 1 uppercase letter';
|
|
154
|
-
}
|
|
155
|
-
if (this.password.hasError('noLowerInPassword')) {
|
|
156
|
-
return 'at least 1 lowercase letter';
|
|
157
|
-
}
|
|
158
|
-
if (this.password.hasError('noSymbolInPassword')) {
|
|
159
|
-
return 'at least 1 punctuation or symbol';
|
|
160
|
-
}
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
onSubmit() {
|
|
164
|
-
if (!this.registration.valid ||
|
|
165
|
-
this.busy ||
|
|
166
|
-
this.name.pending ||
|
|
167
|
-
this.email.pending) {
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
const model = {
|
|
171
|
-
email: this.email.value,
|
|
172
|
-
name: this.name.value,
|
|
173
|
-
firstName: this.firstName.value,
|
|
174
|
-
lastName: this.lastName.value,
|
|
175
|
-
password: this.password.value,
|
|
176
|
-
};
|
|
177
|
-
this.busy = true;
|
|
178
|
-
this._accountService
|
|
179
|
-
.register(model)
|
|
180
|
-
.pipe(take(1))
|
|
181
|
-
.subscribe(() => {
|
|
182
|
-
this.busy = false;
|
|
183
|
-
this._snackbar.open('Registration succeeded', 'OK');
|
|
184
|
-
// this.registration.reset();
|
|
185
|
-
// this.registration.clearValidators();
|
|
186
|
-
// this.registration.markAsPristine();
|
|
187
|
-
this.registered.emit();
|
|
188
|
-
}, (error) => {
|
|
189
|
-
this.busy = false;
|
|
190
|
-
console.error(error);
|
|
191
|
-
this._snackbar.open('Registration error', 'OK');
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
AuthJwtRegistrationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AuthJwtRegistrationComponent, deps: [{ token: i1.FormBuilder }, { token: i2.MatSnackBar }, { token: i3.AuthJwtAccountService }], target: i0.ɵɵFactoryTarget.Component });
|
|
196
|
-
AuthJwtRegistrationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: AuthJwtRegistrationComponent, selector: "auth-jwt-registration", outputs: { registered: "registered" }, ngImport: i0, template: "<div>\n <div>\n <p>\n To register a new user, you must provide his email address, choose a\n password, and choose a username, which must be unique (you will be\n notified if another user has already taken that name). The username must\n include only letters/digits, start with a letter, and be no shorter than 3\n characters, nor longer than 50.\n </p>\n <p>\n To promote a decent security level, the password must include at least 8\n characters, uppercase and lowercase letters, digits, and punctuation (like\n dashes, stops, parentheses, etc.).\n </p>\n <p>\n Once registered, the user will receive an email message to the email\n address you specified; he will have to click on the provided link to\n complete the registration process.\n </p>\n </div>\n\n <form role=\"form\" [formGroup]=\"registration\" (submit)=\"onSubmit()\">\n <fieldset>\n <label>register user</label>\n <!-- email -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"email\"\n id=\"email\"\n maxlength=\"256\"\n required\n autofocus\n spellcheck=\"false\"\n placeholder=\"email\"\n formControlName=\"email\"\n />\n <mat-error>{{ getEmailErrorLabel() }}</mat-error>\n <mat-icon *ngIf=\"email.pending\">hourglass</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"name\"\n maxlength=\"50\"\n required\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\n spellcheck=\"false\"\n placeholder=\"username\"\n formControlName=\"name\"\n />\n <mat-error>{{ getNameErrorLabel() }}</mat-error>\n <mat-icon *ngIf=\"name.pending\">hourglass</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- first name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"firstName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"first name\"\n formControlName=\"firstName\"\n />\n <mat-error\n *ngIf=\"\n firstName.hasError('required') &&\n (firstName.dirty || firstName.touched)\n \"\n class=\"text-danger small\"\n >\n first name required\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- last name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"lastName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"last name\"\n formControlName=\"lastName\"\n />\n <mat-error\n *ngIf=\"\n lastName.hasError('required') &&\n (lastName.dirty || lastName.touched)\n \"\n class=\"text-danger small\"\n >\n last name required\n </mat-error>\n </mat-form-field>\n </div>\n\n <div [formGroup]=\"passwords\">\n <!-- password -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"password\"\n name=\"password\"\n autocomplete=\"new-password\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"password\"\n formControlName=\"password\"\n />\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\n </auth-jwt-password-strength-bar>\n <mat-error>{{ getPasswordErrorLabel() }}</mat-error>\n </mat-form-field>\n </div>\n\n <!-- confirm password -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"password\"\n name=\"confirmPassword\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"confirm password\"\n formControlName=\"confirmPassword\"\n />\n <mat-error\n *ngIf=\"\n passwords.hasError('areEqual') &&\n (confirmPassword.dirty || confirmPassword.touched)\n \"\n >\n password differs from confirmation password\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n\n <button\n mat-raised-button\n type=\"submit\"\n color=\"primary\"\n [disabled]=\"\n !registration.valid || busy || name.pending || email.pending\n \"\n >\n register\n </button>\n <mat-progress-spinner\n diameter=\"20\"\n *ngIf=\"busy\"\n aria-label=\"Busy\"\n ></mat-progress-spinner>\n </fieldset>\n </form>\n</div>\n", styles: ["mat-form-field{width:400px}fieldset{border:1px solid silver;border-radius:8px;padding:16px}\n"], components: [{ type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.PasswordStrengthBarComponent, selector: "auth-jwt-password-strength-bar", inputs: ["passwordToCheck"], outputs: ["strengthChange"] }, { type: i7.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i8.MatProgressSpinner, selector: "mat-progress-spinner", inputs: ["color", "mode", "diameter", "strokeWidth", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i4.MatError, selector: "mat-error", inputs: ["id"] }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }] });
|
|
197
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AuthJwtRegistrationComponent, decorators: [{
|
|
198
|
-
type: Component,
|
|
199
|
-
args: [{
|
|
200
|
-
selector: 'auth-jwt-registration',
|
|
201
|
-
templateUrl: './auth-jwt-registration.component.html',
|
|
202
|
-
styleUrls: ['./auth-jwt-registration.component.css'],
|
|
203
|
-
}]
|
|
204
|
-
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.MatSnackBar }, { type: i3.AuthJwtAccountService }]; }, propDecorators: { registered: [{
|
|
205
|
-
type: Output
|
|
206
|
-
}] } });
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9hdXRoLWp3dC1yZWdpc3RyYXRpb24vYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9hdXRoLWp3dC1yZWdpc3RyYXRpb24vYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBSUwsVUFBVSxHQUdYLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBT3RDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7Ozs7Ozs7QUFPMUUsTUFBTSxPQUFPLDRCQUE0QjtJQW9CdkMsWUFDRSxXQUF3QixFQUNoQixTQUFzQixFQUN0QixlQUFzQztRQUR0QyxjQUFTLEdBQVQsU0FBUyxDQUFhO1FBQ3RCLG9CQUFlLEdBQWYsZUFBZSxDQUF1QjtRQUU5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDMUMsT0FBTztRQUNQLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FDOUIsRUFBRSxFQUNGLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM5RCxDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUM3QixFQUFFLEVBQ0YsVUFBVSxDQUFDLFFBQVEsRUFDbkIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQzdELENBQUM7UUFFRixJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLFVBQVUsQ0FBQyxRQUFRO1lBQ25CLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1NBQ3pCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUU7WUFDdEMsVUFBVSxDQUFDLFFBQVE7WUFDbkIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7U0FDekIsQ0FBQyxDQUFDO1FBRUgsNEZBQTRGO1FBQzVGLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FDakMsRUFBRSxFQUNGLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQ3ZFLENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQ2hDO1lBQ0UsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtTQUN0QyxFQUNELEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ3hDLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDcEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxRQUFRLENBQUMsS0FBZ0I7UUFDL0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRTtZQUN0RCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssc0JBQXNCLENBQUMsT0FBOEI7UUFDM0QsT0FBTyxDQUNMLE9BQXdCLEVBR2MsRUFBRTtZQUN4QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNyQywwQkFBMEI7Z0JBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO29CQUNsQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2Y7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQy9DLENBQUMsSUFBaUIsRUFBRSxFQUFFO3dCQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTs0QkFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUNmOzZCQUFNOzRCQUNMLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3lCQUMvQjtvQkFDSCxDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTt3QkFDTixPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDaEMsQ0FBQyxDQUNGLENBQUM7aUJBQ0g7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxPQUE4QjtRQUM1RCxPQUFPLENBQ0wsT0FBd0IsRUFHYyxFQUFFO1lBQ3hDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3JDLDBCQUEwQjtnQkFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7b0JBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDZjtxQkFBTTtvQkFDTCxPQUFPLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FDaEQsQ0FBQyxJQUFpQixFQUFFLEVBQUU7d0JBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFOzRCQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ2Y7NkJBQU07NEJBQ0wsT0FBTyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7eUJBQ2hDO29CQUNILENBQUMsRUFDRCxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNOLE9BQU8sQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNqQyxDQUFDLENBQ0YsQ0FBQztpQkFDSDtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELFFBQVEsS0FBVSxDQUFDO0lBRVosa0JBQWtCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNuQyxPQUFPLHdCQUF3QixDQUFDO1NBQ2pDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNoQyxPQUFPLHVCQUF1QixDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQzdELE9BQU8sa0NBQWtDLENBQUM7U0FDM0M7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2xDLE9BQU8sbUJBQW1CLENBQUM7U0FDNUI7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sa0JBQWtCLENBQUM7U0FDM0I7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDMUQsT0FBTyx3QkFBd0IsQ0FBQztTQUNqQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLHFCQUFxQjtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdEMsT0FBTyxtQkFBbUIsQ0FBQztTQUM1QjtRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsR0FBRyx1QkFBdUIsQ0FBQztZQUNoQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO2dCQUN2QixDQUFDLElBQUksU0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQzthQUM3QztZQUNELE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDL0MsT0FBTyw2QkFBNkIsQ0FBQztTQUN0QztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUMvQyxPQUFPLDZCQUE2QixDQUFDO1NBQ3RDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQ2hELE9BQU8sa0NBQWtDLENBQUM7U0FDM0M7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFDRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztZQUN4QixJQUFJLENBQUMsSUFBSTtZQUNULElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFDbEI7WUFDQSxPQUFPO1NBQ1I7UUFFRCxNQUFNLEtBQUssR0FBc0I7WUFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSztZQUN2QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUs7WUFDL0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSztZQUM3QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLO1NBQzlCLENBQUM7UUFFRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsZUFBZTthQUNqQixRQUFRLENBQUMsS0FBSyxDQUFDO2FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNiLFNBQVMsQ0FDUixHQUFHLEVBQUU7WUFDSCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCw2QkFBNkI7WUFDN0IsdUNBQXVDO1lBQ3ZDLHNDQUFzQztZQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQ0YsQ0FBQztJQUNOLENBQUM7O3lIQXhQVSw0QkFBNEI7NkdBQTVCLDRCQUE0QixvR0N6QnpDLHNtS0FnTEE7MkZEdkphLDRCQUE0QjtrQkFMeEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsdUJBQXVCO29CQUNqQyxXQUFXLEVBQUUsd0NBQXdDO29CQUNyRCxTQUFTLEVBQUUsQ0FBQyx1Q0FBdUMsQ0FBQztpQkFDckQ7Z0tBbUJRLFVBQVU7c0JBRGhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1Hcm91cCxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1CdWlsZGVyLFxuICBWYWxpZGF0b3JzLFxuICBBYnN0cmFjdENvbnRyb2wsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBBdXRoSnd0QWNjb3VudFNlcnZpY2UsXG4gIEV4aXN0UmVzdWx0LFxuICBSZWdpc3RyYXRpb25Nb2RlbCxcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC1qd3QtYWNjb3VudC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgUGFzc3dvcmRWYWxpZGF0b3JzIH0gZnJvbSAnLi4vLi4vdmFsaWRhdG9ycy9wYXNzd29yZC52YWxpZGF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXV0aC1qd3QtcmVnaXN0cmF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dGgtand0LXJlZ2lzdHJhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F1dGgtand0LXJlZ2lzdHJhdGlvbi5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEF1dGhKd3RSZWdpc3RyYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwdWJsaWMgYnVzeTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgLy8gZm9ybVxuICBwdWJsaWMgcmVnaXN0cmF0aW9uOiBGb3JtR3JvdXA7XG4gIHB1YmxpYyBlbWFpbDogRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBuYW1lOiBGb3JtQ29udHJvbDtcbiAgcHVibGljIGZpcnN0TmFtZTogRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBsYXN0TmFtZTogRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBwYXNzd29yZHM6IEZvcm1Hcm91cDtcbiAgcHVibGljIHBhc3N3b3JkOiBGb3JtQ29udHJvbDtcbiAgcHVibGljIGNvbmZpcm1QYXNzd29yZDogRm9ybUNvbnRyb2w7XG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHVzZXIgd2FzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLiBVc3VhbGx5XG4gICAqIHlvdSBzaG91bGQgaGFuZGxlIHRoaXMgdG8gbW92ZSBhd2F5IGZyb20gdGhlIHJlZ2lzdHJhdGlvblxuICAgKiBwYWdlLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWdpc3RlcmVkOiBFdmVudEVtaXR0ZXI8YW55PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBfc25hY2tiYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgX2FjY291bnRTZXJ2aWNlOiBBdXRoSnd0QWNjb3VudFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5yZWdpc3RlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgLy8gZm9ybVxuICAgIHRoaXMuZW1haWwgPSBmb3JtQnVpbGRlci5jb250cm9sKFxuICAgICAgJycsXG4gICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5lbWFpbF0sXG4gICAgICB0aGlzLmdldFVuaXF1ZUVtYWlsVmFsaWRhdG9yKHRoaXMuX2FjY291bnRTZXJ2aWNlKS5iaW5kKHRoaXMpXG4gICAgKTtcblxuICAgIHRoaXMubmFtZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2woXG4gICAgICAnJyxcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICB0aGlzLmdldFVuaXF1ZU5hbWVWYWxpZGF0b3IodGhpcy5fYWNjb3VudFNlcnZpY2UpLmJpbmQodGhpcylcbiAgICApO1xuXG4gICAgdGhpcy5maXJzdE5hbWUgPSBmb3JtQnVpbGRlci5jb250cm9sKCcnLCBbXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApLFxuICAgIF0pO1xuICAgIHRoaXMubGFzdE5hbWUgPSBmb3JtQnVpbGRlci5jb250cm9sKCcnLCBbXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApLFxuICAgIF0pO1xuXG4gICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTQ3NDk5MS9hbmd1bGFyLTItZm9ybS12YWxpZGF0aW5nLWZvci1yZXBlYXQtcGFzc3dvcmRcbiAgICB0aGlzLnBhc3N3b3JkID0gZm9ybUJ1aWxkZXIuY29udHJvbChcbiAgICAgICcnLFxuICAgICAgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBQYXNzd29yZFZhbGlkYXRvcnMuc3RhbmRhcmRdKVxuICAgICk7XG4gICAgdGhpcy5jb25maXJtUGFzc3dvcmQgPSBmb3JtQnVpbGRlci5jb250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICB0aGlzLnBhc3N3b3JkcyA9IGZvcm1CdWlsZGVyLmdyb3VwKFxuICAgICAge1xuICAgICAgICBwYXNzd29yZDogdGhpcy5wYXNzd29yZCxcbiAgICAgICAgY29uZmlybVBhc3N3b3JkOiB0aGlzLmNvbmZpcm1QYXNzd29yZCxcbiAgICAgIH0sXG4gICAgICB7IHZhbGlkYXRvcjogdGhpcy5hcmVFcXVhbC5iaW5kKHRoaXMpIH1cbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RyYXRpb24gPSBmb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBlbWFpbDogdGhpcy5lbWFpbCxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGZpcnN0TmFtZTogdGhpcy5maXJzdE5hbWUsXG4gICAgICBsYXN0TmFtZTogdGhpcy5sYXN0TmFtZSxcbiAgICAgIHBhc3N3b3JkczogdGhpcy5wYXNzd29yZHMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFyZUVxdWFsKGdyb3VwOiBGb3JtR3JvdXApOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSB8IG51bGwge1xuICAgIGlmICh0aGlzLnBhc3N3b3JkLnZhbHVlID09PSB0aGlzLmNvbmZpcm1QYXNzd29yZC52YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhcmVFcXVhbDogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmlxdWUgbmFtZSB2YWxpZGF0b3IuIFRoZXJlIGlzIG5vIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGF0IHRoaXMgbGV2ZWwsXG4gICAqIGJ1dCB3ZSBjYW4gdXNlIGNsb3N1cmVzLiBBcyBhIG1hdHRlciBvZiBmYWN0LCB3ZSBoYXZlIGFjY2VzcyB0byB0aGUgc2VydmljZSBpbnN0YW5jZVxuICAgKiBmcm9tIHRoZSBjb21wb25lbnQgd2hlcmUgd2UgcmVnaXN0ZXIgdmFsaWRhdG9ycy4gU28gd2Ugd2lsbCBpbXBsZW1lbnQgYSBmdW5jdGlvblxuICAgKiB0aGF0IHdpbGwgYWNjZXB0IHRoZSBzZXJ2aWNlIGFzIHBhcmFtZXRlciwgYW5kIGNyZWF0ZSB0aGUgYWN0dWFsIHZhbGlkYXRpb24gZnVuY3Rpb24uXG4gICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBoYXZlIGFjY2VzcyB0byB0aGUgc2VydmljZSB3aGVuIGNhbGxlZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcHJvY2Vzcy5cbiAgICogU2VlIGh0dHA6Ly9yZXN0bGV0LmNvbS9ibG9nLzIwMTYvMDIvMTcvaW1wbGVtZW50aW5nLWFuZ3VsYXIyLWZvcm1zLWJleW9uZC1iYXNpY3MtcGFydC0yLy5cbiAgICovXG4gIHByaXZhdGUgZ2V0VW5pcXVlTmFtZVZhbGlkYXRvcihzZXJ2aWNlOiBBdXRoSnd0QWNjb3VudFNlcnZpY2UpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sXG4gICAgKTpcbiAgICAgIHwgUHJvbWlzZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD5cbiAgICAgIHwgT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gYXZvaWQgY2hlY2tpbmcgaWYgZW1wdHlcbiAgICAgICAgaWYgKCFjb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXJ2aWNlLmlzTmFtZVJlZ2lzdGVyZWQoY29udHJvbC52YWx1ZSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgKGRhdGE6IEV4aXN0UmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgIGlmICghZGF0YS5pc0V4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgdW5pcXVlTmFtZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVuaXF1ZU5hbWU6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VW5pcXVlRW1haWxWYWxpZGF0b3Ioc2VydmljZTogQXV0aEp3dEFjY291bnRTZXJ2aWNlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbFxuICAgICk6XG4gICAgICB8IFByb21pc2U8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+XG4gICAgICB8IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+ID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIGF2b2lkIGNoZWNraW5nIGlmIGVtcHR5XG4gICAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VydmljZS5pc0VtYWlsUmVnaXN0ZXJlZChjb250cm9sLnZhbHVlKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoZGF0YTogRXhpc3RSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFkYXRhLmlzRXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoeyB1bmlxdWVFbWFpbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVuaXF1ZUVtYWlsOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgcHVibGljIGdldEVtYWlsRXJyb3JMYWJlbCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuZW1haWwuZGlydHkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVtYWlsLmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICByZXR1cm4gJ2VtYWlsIGFkZHJlc3MgcmVxdWlyZWQnO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbWFpbC5oYXNFcnJvcignZW1haWwnKSkge1xuICAgICAgcmV0dXJuICdpbnZhbGlkIGVtYWlsIGFkZHJlc3MnO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbWFpbC5oYXNFcnJvcigndW5pcXVlRW1haWwnKSAmJiAhdGhpcy5lbWFpbC5wZW5kaW5nKSB7XG4gICAgICByZXR1cm4gJ2VtYWlsIGFkZHJlc3MgYWxyZWFkeSByZWdpc3RlcmVkJztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0TmFtZUVycm9yTGFiZWwoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLm5hbWUuZGlydHkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcbiAgICAgIHJldHVybiAndXNlcm5hbWUgcmVxdWlyZWQnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5hbWUuaGFzRXJyb3IoJ3BhdHRlcm4nKSkge1xuICAgICAgcmV0dXJuICdpbnZhbGlkIHVzZXJuYW1lJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uYW1lLmhhc0Vycm9yKCd1bmlxdWVOYW1lJykgJiYgIXRoaXMubmFtZS5wZW5kaW5nKSB7XG4gICAgICByZXR1cm4gJ3VzZXJuYW1lIGFscmVhZHkgdGFrZW4nO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldFBhc3N3b3JkRXJyb3JMYWJlbCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMucGFzc3dvcmQuZGlydHkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBhc3N3b3JkLmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICByZXR1cm4gJ3Bhc3N3b3JkIHJlcXVpcmVkJztcbiAgICB9XG4gICAgaWYgKHRoaXMucGFzc3dvcmQuaGFzRXJyb3IoJ3Bhc3N3b3JkVG9vU2hvcnQnKSkge1xuICAgICAgbGV0IHMgPSAnYXQgbGVhc3QgOCBjaGFyYWN0ZXJzJztcbiAgICAgIGlmICh0aGlzLnBhc3N3b3JkLnZhbHVlKSB7XG4gICAgICAgIHMgKz0gYCAobm93ICR7dGhpcy5wYXNzd29yZC52YWx1ZS5sZW5ndGh9KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgaWYgKHRoaXMucGFzc3dvcmQuaGFzRXJyb3IoJ25vVXBwZXJJblBhc3N3b3JkJykpIHtcbiAgICAgIHJldHVybiAnYXQgbGVhc3QgMSB1cHBlcmNhc2UgbGV0dGVyJztcbiAgICB9XG4gICAgaWYgKHRoaXMucGFzc3dvcmQuaGFzRXJyb3IoJ25vTG93ZXJJblBhc3N3b3JkJykpIHtcbiAgICAgIHJldHVybiAnYXQgbGVhc3QgMSBsb3dlcmNhc2UgbGV0dGVyJztcbiAgICB9XG4gICAgaWYgKHRoaXMucGFzc3dvcmQuaGFzRXJyb3IoJ25vU3ltYm9sSW5QYXNzd29yZCcpKSB7XG4gICAgICByZXR1cm4gJ2F0IGxlYXN0IDEgcHVuY3R1YXRpb24gb3Igc3ltYm9sJztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBvblN1Ym1pdCgpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5yZWdpc3RyYXRpb24udmFsaWQgfHxcbiAgICAgIHRoaXMuYnVzeSB8fFxuICAgICAgdGhpcy5uYW1lLnBlbmRpbmcgfHxcbiAgICAgIHRoaXMuZW1haWwucGVuZGluZ1xuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsOiBSZWdpc3RyYXRpb25Nb2RlbCA9IHtcbiAgICAgIGVtYWlsOiB0aGlzLmVtYWlsLnZhbHVlLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLnZhbHVlLFxuICAgICAgZmlyc3ROYW1lOiB0aGlzLmZpcnN0TmFtZS52YWx1ZSxcbiAgICAgIGxhc3ROYW1lOiB0aGlzLmxhc3ROYW1lLnZhbHVlLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMucGFzc3dvcmQudmFsdWUsXG4gICAgfTtcblxuICAgIHRoaXMuYnVzeSA9IHRydWU7XG4gICAgdGhpcy5fYWNjb3VudFNlcnZpY2VcbiAgICAgIC5yZWdpc3Rlcihtb2RlbClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5idXN5ID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5fc25hY2tiYXIub3BlbignUmVnaXN0cmF0aW9uIHN1Y2NlZWRlZCcsICdPSycpO1xuICAgICAgICAgIC8vIHRoaXMucmVnaXN0cmF0aW9uLnJlc2V0KCk7XG4gICAgICAgICAgLy8gdGhpcy5yZWdpc3RyYXRpb24uY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgLy8gdGhpcy5yZWdpc3RyYXRpb24ubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyZWQuZW1pdCgpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB0aGlzLl9zbmFja2Jhci5vcGVuKCdSZWdpc3RyYXRpb24gZXJyb3InLCAnT0snKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxufVxuIiwiPGRpdj5cbiAgPGRpdj5cbiAgICA8cD5cbiAgICAgIFRvIHJlZ2lzdGVyIGEgbmV3IHVzZXIsIHlvdSBtdXN0IHByb3ZpZGUgaGlzIGVtYWlsIGFkZHJlc3MsIGNob29zZSBhXG4gICAgICBwYXNzd29yZCwgYW5kIGNob29zZSBhIHVzZXJuYW1lLCB3aGljaCBtdXN0IGJlIHVuaXF1ZSAoeW91IHdpbGwgYmVcbiAgICAgIG5vdGlmaWVkIGlmIGFub3RoZXIgdXNlciBoYXMgYWxyZWFkeSB0YWtlbiB0aGF0IG5hbWUpLiBUaGUgdXNlcm5hbWUgbXVzdFxuICAgICAgaW5jbHVkZSBvbmx5IGxldHRlcnMvZGlnaXRzLCBzdGFydCB3aXRoIGEgbGV0dGVyLCBhbmQgYmUgbm8gc2hvcnRlciB0aGFuIDNcbiAgICAgIGNoYXJhY3RlcnMsIG5vciBsb25nZXIgdGhhbiA1MC5cbiAgICA8L3A+XG4gICAgPHA+XG4gICAgICBUbyBwcm9tb3RlIGEgZGVjZW50IHNlY3VyaXR5IGxldmVsLCB0aGUgcGFzc3dvcmQgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IDhcbiAgICAgIGNoYXJhY3RlcnMsIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlIGxldHRlcnMsIGRpZ2l0cywgYW5kIHB1bmN0dWF0aW9uIChsaWtlXG4gICAgICBkYXNoZXMsIHN0b3BzLCBwYXJlbnRoZXNlcywgZXRjLikuXG4gICAgPC9wPlxuICAgIDxwPlxuICAgICAgT25jZSByZWdpc3RlcmVkLCB0aGUgdXNlciB3aWxsIHJlY2VpdmUgYW4gZW1haWwgbWVzc2FnZSB0byB0aGUgZW1haWxcbiAgICAgIGFkZHJlc3MgeW91IHNwZWNpZmllZDsgaGUgd2lsbCBoYXZlIHRvIGNsaWNrIG9uIHRoZSBwcm92aWRlZCBsaW5rIHRvXG4gICAgICBjb21wbGV0ZSB0aGUgcmVnaXN0cmF0aW9uIHByb2Nlc3MuXG4gICAgPC9wPlxuICA8L2Rpdj5cblxuICA8Zm9ybSByb2xlPVwiZm9ybVwiIFtmb3JtR3JvdXBdPVwicmVnaXN0cmF0aW9uXCIgKHN1Ym1pdCk9XCJvblN1Ym1pdCgpXCI+XG4gICAgPGZpZWxkc2V0PlxuICAgICAgPGxhYmVsPnJlZ2lzdGVyIHVzZXI8L2xhYmVsPlxuICAgICAgPCEtLSBlbWFpbCAtLT5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICAgICAgaWQ9XCJlbWFpbFwiXG4gICAgICAgICAgICBtYXhsZW5ndGg9XCIyNTZcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIGF1dG9mb2N1c1xuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZW1haWxcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZW1haWxcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPG1hdC1lcnJvcj57eyBnZXRFbWFpbEVycm9yTGFiZWwoKSB9fTwvbWF0LWVycm9yPlxuICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImVtYWlsLnBlbmRpbmdcIj5ob3VyZ2xhc3M8L21hdC1pY29uPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gbmFtZSAtLT5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBpZD1cIm5hbWVcIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIHBhdHRlcm49XCJeW2EtekEtWl1bYS16QS1aMC05XXsyLDQ5fSRcIlxuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwidXNlcm5hbWVcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bWF0LWVycm9yPnt7IGdldE5hbWVFcnJvckxhYmVsKCkgfX08L21hdC1lcnJvcj5cbiAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJuYW1lLnBlbmRpbmdcIj5ob3VyZ2xhc3M8L21hdC1pY29uPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gZmlyc3QgbmFtZSAtLT5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBpZD1cImZpcnN0TmFtZVwiXG4gICAgICAgICAgICBtYXhsZW5ndGg9XCI1MFwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZmlyc3QgbmFtZVwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXJzdE5hbWVcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgZmlyc3ROYW1lLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmXG4gICAgICAgICAgICAgIChmaXJzdE5hbWUuZGlydHkgfHwgZmlyc3ROYW1lLnRvdWNoZWQpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlciBzbWFsbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgZmlyc3QgbmFtZSByZXF1aXJlZFxuICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gbGFzdCBuYW1lIC0tPlxuICAgICAgPGRpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGlkPVwibGFzdE5hbWVcIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImxhc3QgbmFtZVwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsYXN0TmFtZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBsYXN0TmFtZS5oYXNFcnJvcigncmVxdWlyZWQnKSAmJlxuICAgICAgICAgICAgICAobGFzdE5hbWUuZGlydHkgfHwgbGFzdE5hbWUudG91Y2hlZClcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyIHNtYWxsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBsYXN0IG5hbWUgcmVxdWlyZWRcbiAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IFtmb3JtR3JvdXBdPVwicGFzc3dvcmRzXCI+XG4gICAgICAgIDwhLS0gcGFzc3dvcmQgLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICAgIG5hbWU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm5ldy1wYXNzd29yZFwiXG4gICAgICAgICAgICAgIG1heGxlbmd0aD1cIjUwXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8YXV0aC1qd3QtcGFzc3dvcmQtc3RyZW5ndGgtYmFyIFtwYXNzd29yZFRvQ2hlY2tdPVwicGFzc3dvcmQudmFsdWVcIj5cbiAgICAgICAgICAgIDwvYXV0aC1qd3QtcGFzc3dvcmQtc3RyZW5ndGgtYmFyPlxuICAgICAgICAgICAgPG1hdC1lcnJvcj57eyBnZXRQYXNzd29yZEVycm9yTGFiZWwoKSB9fTwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gY29uZmlybSBwYXNzd29yZCAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgbmFtZT1cImNvbmZpcm1QYXNzd29yZFwiXG4gICAgICAgICAgICAgIG1heGxlbmd0aD1cIjUwXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJjb25maXJtIHBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29uZmlybVBhc3N3b3JkXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgcGFzc3dvcmRzLmhhc0Vycm9yKCdhcmVFcXVhbCcpICYmXG4gICAgICAgICAgICAgICAgKGNvbmZpcm1QYXNzd29yZC5kaXJ0eSB8fCBjb25maXJtUGFzc3dvcmQudG91Y2hlZClcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgcGFzc3dvcmQgZGlmZmVycyBmcm9tIGNvbmZpcm1hdGlvbiBwYXNzd29yZFxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICFyZWdpc3RyYXRpb24udmFsaWQgfHwgYnVzeSB8fCBuYW1lLnBlbmRpbmcgfHwgZW1haWwucGVuZGluZ1xuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICByZWdpc3RlclxuICAgICAgPC9idXR0b24+XG4gICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICAgICAgZGlhbWV0ZXI9XCIyMFwiXG4gICAgICAgICpuZ0lmPVwiYnVzeVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJCdXN5XCJcbiAgICAgID48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgIDwvZmllbGRzZXQ+XG4gIDwvZm9ybT5cbjwvZGl2PlxuIl19
|