parse-server 6.0.0-alpha.9 → 6.0.0-beta.1
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/LICENSE +167 -25
- package/NOTICE +10 -0
- package/README.md +57 -33
- package/lib/AccountLockout.js +11 -26
- package/lib/Adapters/AdapterLoader.js +8 -14
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +2 -8
- package/lib/Adapters/Auth/AuthAdapter.js +7 -16
- package/lib/Adapters/Auth/OAuth1Client.js +32 -57
- package/lib/Adapters/Auth/apple.js +6 -22
- package/lib/Adapters/Auth/facebook.js +7 -37
- package/lib/Adapters/Auth/gcenter.js +8 -37
- package/lib/Adapters/Auth/github.js +7 -10
- package/lib/Adapters/Auth/google.js +11 -34
- package/lib/Adapters/Auth/gpgames.js +5 -8
- package/lib/Adapters/Auth/httpsRequest.js +1 -7
- package/lib/Adapters/Auth/index.js +20 -65
- package/lib/Adapters/Auth/instagram.js +5 -9
- package/lib/Adapters/Auth/janraincapture.js +8 -12
- package/lib/Adapters/Auth/janrainengage.js +7 -11
- package/lib/Adapters/Auth/keycloak.js +5 -19
- package/lib/Adapters/Auth/ldap.js +1 -15
- package/lib/Adapters/Auth/line.js +7 -10
- package/lib/Adapters/Auth/linkedin.js +7 -12
- package/lib/Adapters/Auth/meetup.js +7 -10
- package/lib/Adapters/Auth/microsoft.js +7 -10
- package/lib/Adapters/Auth/oauth2.js +6 -18
- package/lib/Adapters/Auth/phantauth.js +8 -10
- package/lib/Adapters/Auth/qq.js +7 -13
- package/lib/Adapters/Auth/spotify.js +7 -14
- package/lib/Adapters/Auth/twitter.js +5 -15
- package/lib/Adapters/Auth/vkontakte.js +9 -15
- package/lib/Adapters/Auth/wechat.js +7 -10
- package/lib/Adapters/Auth/weibo.js +7 -11
- package/lib/Adapters/Cache/CacheAdapter.js +4 -12
- package/lib/Adapters/Cache/InMemoryCache.js +5 -19
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +1 -11
- package/lib/Adapters/Cache/LRUCache.js +1 -11
- package/lib/Adapters/Cache/NullCacheAdapter.js +1 -8
- package/lib/Adapters/Cache/RedisCacheAdapter.js +3 -30
- package/lib/Adapters/Cache/SchemaCache.js +1 -6
- package/lib/Adapters/Email/MailAdapter.js +2 -7
- package/lib/Adapters/Files/FilesAdapter.js +7 -21
- package/lib/Adapters/Files/GridFSBucketAdapter.js +6 -44
- package/lib/Adapters/Files/GridStoreAdapter.js +1 -1
- package/lib/Adapters/Logger/LoggerAdapter.js +2 -11
- package/lib/Adapters/Logger/WinstonLogger.js +3 -30
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +5 -16
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +3 -20
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +1 -16
- package/lib/Adapters/PubSub/PubSubAdapter.js +2 -9
- package/lib/Adapters/PubSub/RedisPubSub.js +12 -7
- package/lib/Adapters/Push/PushAdapter.js +2 -8
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +12 -37
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +26 -79
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +78 -209
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +82 -371
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +1 -13
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +1 -20
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +119 -446
- package/lib/Adapters/Storage/Postgres/sql/index.js +4 -7
- package/lib/Adapters/Storage/StorageAdapter.js +1 -1
- package/lib/Adapters/WebSocketServer/WSAdapter.js +3 -12
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +7 -12
- package/lib/Auth.js +68 -121
- package/lib/ClientSDK.js +3 -11
- package/lib/Config.js +73 -115
- package/lib/Controllers/AdaptableController.js +6 -18
- package/lib/Controllers/AnalyticsController.js +1 -9
- package/lib/Controllers/CacheController.js +3 -23
- package/lib/Controllers/DatabaseController.js +171 -364
- package/lib/Controllers/FilesController.js +5 -34
- package/lib/Controllers/HooksController.js +1 -51
- package/lib/Controllers/LiveQueryController.js +4 -23
- package/lib/Controllers/LoggerController.js +15 -54
- package/lib/Controllers/ParseGraphQLController.js +49 -104
- package/lib/Controllers/PushController.js +20 -59
- package/lib/Controllers/SchemaController.js +162 -348
- package/lib/Controllers/UserController.js +17 -78
- package/lib/Controllers/index.js +19 -68
- package/lib/Controllers/types.js +1 -1
- package/lib/Deprecator/Deprecations.js +1 -1
- package/lib/Deprecator/Deprecator.js +9 -18
- package/lib/GraphQL/ParseGraphQLSchema.js +16 -100
- package/lib/GraphQL/ParseGraphQLServer.js +2 -29
- package/lib/GraphQL/helpers/objectsMutations.js +2 -12
- package/lib/GraphQL/helpers/objectsQueries.js +18 -76
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +1 -9
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +1 -8
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +9 -115
- package/lib/GraphQL/loaders/defaultRelaySchema.js +6 -18
- package/lib/GraphQL/loaders/filesMutations.js +2 -19
- package/lib/GraphQL/loaders/functionsMutations.js +6 -17
- package/lib/GraphQL/loaders/parseClassMutations.js +6 -44
- package/lib/GraphQL/loaders/parseClassQueries.js +1 -26
- package/lib/GraphQL/loaders/parseClassTypes.js +10 -64
- package/lib/GraphQL/loaders/schemaDirectives.js +1 -17
- package/lib/GraphQL/loaders/schemaMutations.js +1 -20
- package/lib/GraphQL/loaders/schemaQueries.js +1 -14
- package/lib/GraphQL/loaders/schemaTypes.js +2 -6
- package/lib/GraphQL/loaders/usersMutations.js +6 -28
- package/lib/GraphQL/loaders/usersQueries.js +4 -26
- package/lib/GraphQL/parseGraphQLUtils.js +6 -19
- package/lib/GraphQL/transformers/className.js +1 -4
- package/lib/GraphQL/transformers/constraintType.js +1 -20
- package/lib/GraphQL/transformers/inputType.js +1 -20
- package/lib/GraphQL/transformers/mutation.js +6 -51
- package/lib/GraphQL/transformers/outputType.js +1 -20
- package/lib/GraphQL/transformers/query.js +6 -42
- package/lib/GraphQL/transformers/schemaFields.js +7 -34
- package/lib/KeyPromiseQueue.js +1 -12
- package/lib/LiveQuery/Client.js +1 -25
- package/lib/LiveQuery/Id.js +1 -7
- package/lib/LiveQuery/ParseCloudCodePublisher.js +13 -19
- package/lib/LiveQuery/ParseLiveQueryServer.js +111 -307
- package/lib/LiveQuery/ParsePubSub.js +1 -12
- package/lib/LiveQuery/ParseWebSocketServer.js +4 -26
- package/lib/LiveQuery/QueryTools.js +14 -116
- package/lib/LiveQuery/RequestSchema.js +1 -1
- package/lib/LiveQuery/SessionTokenCache.js +1 -17
- package/lib/LiveQuery/Subscription.js +4 -18
- package/lib/LiveQuery/equalObjects.js +2 -14
- package/lib/Options/Definitions.js +88 -8
- package/lib/Options/docs.js +25 -3
- package/lib/Options/index.js +4 -12
- package/lib/Options/parsers.js +1 -18
- package/lib/Page.js +1 -9
- package/lib/ParseMessageQueue.js +1 -10
- package/lib/ParseServer.js +175 -207
- package/lib/ParseServerRESTController.js +6 -33
- package/lib/PromiseRouter.js +16 -50
- package/lib/Push/PushQueue.js +3 -15
- package/lib/Push/PushWorker.js +7 -32
- package/lib/Push/utils.js +9 -38
- package/lib/RestQuery.js +105 -242
- package/lib/RestWrite.js +224 -389
- package/lib/Routers/AggregateRouter.js +14 -51
- package/lib/Routers/AnalyticsRouter.js +2 -8
- package/lib/Routers/AudiencesRouter.js +1 -15
- package/lib/Routers/ClassesRouter.js +3 -53
- package/lib/Routers/CloudCodeRouter.js +1 -19
- package/lib/Routers/FeaturesRouter.js +1 -10
- package/lib/Routers/FilesRouter.js +29 -76
- package/lib/Routers/FunctionsRouter.js +5 -28
- package/lib/Routers/GlobalConfigRouter.js +4 -18
- package/lib/Routers/GraphQLRouter.js +1 -14
- package/lib/Routers/HooksRouter.js +1 -29
- package/lib/Routers/IAPValidationRouter.js +6 -29
- package/lib/Routers/InstallationsRouter.js +2 -12
- package/lib/Routers/LogsRouter.js +4 -16
- package/lib/Routers/PagesRouter.js +69 -129
- package/lib/Routers/PublicAPIRouter.js +3 -62
- package/lib/Routers/PurgeRouter.js +1 -15
- package/lib/Routers/PushRouter.js +2 -18
- package/lib/Routers/RolesRouter.js +1 -7
- package/lib/Routers/SchemasRouter.js +4 -34
- package/lib/Routers/SecurityRouter.js +1 -12
- package/lib/Routers/SessionsRouter.js +3 -19
- package/lib/Routers/UsersRouter.js +48 -135
- package/lib/SchemaMigrations/DefinedSchemas.js +56 -115
- package/lib/SchemaMigrations/Migrations.js +2 -8
- package/lib/Security/Check.js +8 -16
- package/lib/Security/CheckGroup.js +4 -11
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +8 -18
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +5 -15
- package/lib/Security/CheckGroups/CheckGroups.js +1 -4
- package/lib/Security/CheckRunner.js +22 -41
- package/lib/StatusHandler.js +12 -69
- package/lib/TestUtils.js +1 -6
- package/lib/Utils.js +27 -66
- package/lib/batch.js +17 -28
- package/lib/cache.js +1 -3
- package/lib/cli/definitions/parse-live-query-server.js +1 -3
- package/lib/cli/definitions/parse-server.js +1 -3
- package/lib/cli/parse-live-query-server.js +1 -6
- package/lib/cli/parse-server.js +11 -21
- package/lib/cli/utils/commander.js +13 -51
- package/lib/cli/utils/runner.js +1 -14
- package/lib/cloud-code/Parse.Cloud.js +71 -81
- package/lib/cryptoUtils.js +11 -19
- package/lib/defaults.js +2 -14
- package/lib/deprecated.js +1 -2
- package/lib/index.js +16 -34
- package/lib/logger.js +6 -13
- package/lib/middlewares.js +166 -148
- package/lib/password.js +6 -10
- package/lib/request.js +8 -42
- package/lib/requiredParameter.js +1 -3
- package/lib/rest.js +25 -47
- package/lib/triggers.js +54 -252
- package/lib/vendor/mongodbUrl.js +129 -310
- package/package.json +13 -10
- package/PATENTS +0 -37
|
@@ -4,73 +4,52 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.UserController = void 0;
|
|
7
|
-
|
|
8
7
|
var _cryptoUtils = require("../cryptoUtils");
|
|
9
|
-
|
|
10
8
|
var _triggers = require("../triggers");
|
|
11
|
-
|
|
12
9
|
var _AdaptableController = _interopRequireDefault(require("./AdaptableController"));
|
|
13
|
-
|
|
14
10
|
var _MailAdapter = _interopRequireDefault(require("../Adapters/Email/MailAdapter"));
|
|
15
|
-
|
|
16
11
|
var _rest = _interopRequireDefault(require("../rest"));
|
|
17
|
-
|
|
18
12
|
var _node = _interopRequireDefault(require("parse/node"));
|
|
19
|
-
|
|
20
13
|
var _AccountLockout = _interopRequireDefault(require("../AccountLockout"));
|
|
21
|
-
|
|
22
14
|
var _Config = _interopRequireDefault(require("../Config"));
|
|
23
|
-
|
|
24
15
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
|
-
|
|
26
16
|
var RestQuery = require('../RestQuery');
|
|
27
|
-
|
|
28
17
|
var Auth = require('../Auth');
|
|
29
|
-
|
|
30
18
|
class UserController extends _AdaptableController.default {
|
|
31
19
|
constructor(adapter, appId, options = {}) {
|
|
32
20
|
super(adapter, appId, options);
|
|
33
21
|
}
|
|
34
|
-
|
|
35
22
|
get config() {
|
|
36
23
|
return _Config.default.get(this.appId);
|
|
37
24
|
}
|
|
38
|
-
|
|
39
25
|
validateAdapter(adapter) {
|
|
40
26
|
// Allow no adapter
|
|
41
27
|
if (!adapter && !this.shouldVerifyEmails) {
|
|
42
28
|
return;
|
|
43
29
|
}
|
|
44
|
-
|
|
45
30
|
super.validateAdapter(adapter);
|
|
46
31
|
}
|
|
47
|
-
|
|
48
32
|
expectedAdapterType() {
|
|
49
33
|
return _MailAdapter.default;
|
|
50
34
|
}
|
|
51
|
-
|
|
52
35
|
get shouldVerifyEmails() {
|
|
53
36
|
return this.options.verifyUserEmails;
|
|
54
37
|
}
|
|
55
|
-
|
|
56
38
|
setEmailVerifyToken(user) {
|
|
57
39
|
if (this.shouldVerifyEmails) {
|
|
58
40
|
user._email_verify_token = (0, _cryptoUtils.randomString)(25);
|
|
59
41
|
user.emailVerified = false;
|
|
60
|
-
|
|
61
42
|
if (this.config.emailVerifyTokenValidityDuration) {
|
|
62
43
|
user._email_verify_token_expires_at = _node.default._encode(this.config.generateEmailVerifyTokenExpiresAt());
|
|
63
44
|
}
|
|
64
45
|
}
|
|
65
46
|
}
|
|
66
|
-
|
|
67
47
|
verifyEmail(username, token) {
|
|
68
48
|
if (!this.shouldVerifyEmails) {
|
|
69
49
|
// Trying to verify email when not enabled
|
|
70
50
|
// TODO: Better error here.
|
|
71
51
|
throw undefined;
|
|
72
52
|
}
|
|
73
|
-
|
|
74
53
|
const query = {
|
|
75
54
|
username: username,
|
|
76
55
|
_email_verify_token: token
|
|
@@ -80,9 +59,10 @@ class UserController extends _AdaptableController.default {
|
|
|
80
59
|
_email_verify_token: {
|
|
81
60
|
__op: 'Delete'
|
|
82
61
|
}
|
|
83
|
-
};
|
|
84
|
-
// add additional query params and additional fields that need to be updated
|
|
62
|
+
};
|
|
85
63
|
|
|
64
|
+
// if the email verify token needs to be validated then
|
|
65
|
+
// add additional query params and additional fields that need to be updated
|
|
86
66
|
if (this.config.emailVerifyTokenValidityDuration) {
|
|
87
67
|
query.emailVerified = false;
|
|
88
68
|
query._email_verify_token_expires_at = {
|
|
@@ -92,10 +72,9 @@ class UserController extends _AdaptableController.default {
|
|
|
92
72
|
__op: 'Delete'
|
|
93
73
|
};
|
|
94
74
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
username: username
|
|
75
|
+
const maintenanceAuth = Auth.maintenance(this.config);
|
|
76
|
+
var findUserForEmailVerification = new RestQuery(this.config, maintenanceAuth, '_User', {
|
|
77
|
+
username
|
|
99
78
|
});
|
|
100
79
|
return findUserForEmailVerification.execute().then(result => {
|
|
101
80
|
if (result.results.length && result.results[0].emailVerified) {
|
|
@@ -103,68 +82,54 @@ class UserController extends _AdaptableController.default {
|
|
|
103
82
|
} else if (result.results.length) {
|
|
104
83
|
query.objectId = result.results[0].objectId;
|
|
105
84
|
}
|
|
106
|
-
|
|
107
|
-
return _rest.default.update(this.config, masterAuth, '_User', query, updateFields);
|
|
85
|
+
return _rest.default.update(this.config, maintenanceAuth, '_User', query, updateFields);
|
|
108
86
|
});
|
|
109
87
|
}
|
|
110
|
-
|
|
111
88
|
checkResetTokenValidity(username, token) {
|
|
112
89
|
return this.config.database.find('_User', {
|
|
113
90
|
username: username,
|
|
114
91
|
_perishable_token: token
|
|
115
92
|
}, {
|
|
116
93
|
limit: 1
|
|
117
|
-
}).then(results => {
|
|
94
|
+
}, Auth.maintenance(this.config)).then(results => {
|
|
118
95
|
if (results.length != 1) {
|
|
119
96
|
throw 'Failed to reset password: username / email / token is invalid';
|
|
120
97
|
}
|
|
121
|
-
|
|
122
98
|
if (this.config.passwordPolicy && this.config.passwordPolicy.resetTokenValidityDuration) {
|
|
123
99
|
let expiresDate = results[0]._perishable_token_expires_at;
|
|
124
|
-
|
|
125
100
|
if (expiresDate && expiresDate.__type == 'Date') {
|
|
126
101
|
expiresDate = new Date(expiresDate.iso);
|
|
127
102
|
}
|
|
128
|
-
|
|
129
103
|
if (expiresDate < new Date()) throw 'The password reset link has expired';
|
|
130
104
|
}
|
|
131
|
-
|
|
132
105
|
return results[0];
|
|
133
106
|
});
|
|
134
107
|
}
|
|
135
|
-
|
|
136
108
|
getUserIfNeeded(user) {
|
|
137
109
|
if (user.username && user.email) {
|
|
138
110
|
return Promise.resolve(user);
|
|
139
111
|
}
|
|
140
|
-
|
|
141
112
|
var where = {};
|
|
142
|
-
|
|
143
113
|
if (user.username) {
|
|
144
114
|
where.username = user.username;
|
|
145
115
|
}
|
|
146
|
-
|
|
147
116
|
if (user.email) {
|
|
148
117
|
where.email = user.email;
|
|
149
118
|
}
|
|
150
|
-
|
|
151
119
|
var query = new RestQuery(this.config, Auth.master(this.config), '_User', where);
|
|
152
120
|
return query.execute().then(function (result) {
|
|
153
121
|
if (result.results.length != 1) {
|
|
154
122
|
throw undefined;
|
|
155
123
|
}
|
|
156
|
-
|
|
157
124
|
return result.results[0];
|
|
158
125
|
});
|
|
159
126
|
}
|
|
160
|
-
|
|
161
127
|
sendVerificationEmail(user) {
|
|
162
128
|
if (!this.shouldVerifyEmails) {
|
|
163
129
|
return;
|
|
164
130
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
131
|
+
const token = encodeURIComponent(user._email_verify_token);
|
|
132
|
+
// We may need to fetch the user in case of update email
|
|
168
133
|
this.getUserIfNeeded(user).then(user => {
|
|
169
134
|
const username = encodeURIComponent(user.username);
|
|
170
135
|
const link = buildEmailLink(this.config.verifyEmailURL, username, token, this.config);
|
|
@@ -173,7 +138,6 @@ class UserController extends _AdaptableController.default {
|
|
|
173
138
|
link: link,
|
|
174
139
|
user: (0, _triggers.inflate)('_User', user)
|
|
175
140
|
};
|
|
176
|
-
|
|
177
141
|
if (this.adapter.sendVerificationEmail) {
|
|
178
142
|
this.adapter.sendVerificationEmail(options);
|
|
179
143
|
} else {
|
|
@@ -181,14 +145,13 @@ class UserController extends _AdaptableController.default {
|
|
|
181
145
|
}
|
|
182
146
|
});
|
|
183
147
|
}
|
|
148
|
+
|
|
184
149
|
/**
|
|
185
150
|
* Regenerates the given user's email verification token
|
|
186
151
|
*
|
|
187
152
|
* @param user
|
|
188
153
|
* @returns {*}
|
|
189
154
|
*/
|
|
190
|
-
|
|
191
|
-
|
|
192
155
|
regenerateEmailVerifyToken(user) {
|
|
193
156
|
const {
|
|
194
157
|
_email_verify_token
|
|
@@ -196,21 +159,17 @@ class UserController extends _AdaptableController.default {
|
|
|
196
159
|
let {
|
|
197
160
|
_email_verify_token_expires_at
|
|
198
161
|
} = user;
|
|
199
|
-
|
|
200
162
|
if (_email_verify_token_expires_at && _email_verify_token_expires_at.__type === 'Date') {
|
|
201
163
|
_email_verify_token_expires_at = _email_verify_token_expires_at.iso;
|
|
202
164
|
}
|
|
203
|
-
|
|
204
165
|
if (this.config.emailVerifyTokenReuseIfValid && this.config.emailVerifyTokenValidityDuration && _email_verify_token && new Date() < new Date(_email_verify_token_expires_at)) {
|
|
205
166
|
return Promise.resolve();
|
|
206
167
|
}
|
|
207
|
-
|
|
208
168
|
this.setEmailVerifyToken(user);
|
|
209
169
|
return this.config.database.update('_User', {
|
|
210
170
|
username: user.username
|
|
211
171
|
}, user);
|
|
212
172
|
}
|
|
213
|
-
|
|
214
173
|
resendVerificationEmail(username) {
|
|
215
174
|
return this.getUserIfNeeded({
|
|
216
175
|
username: username
|
|
@@ -218,22 +177,18 @@ class UserController extends _AdaptableController.default {
|
|
|
218
177
|
if (!aUser || aUser.emailVerified) {
|
|
219
178
|
throw undefined;
|
|
220
179
|
}
|
|
221
|
-
|
|
222
180
|
return this.regenerateEmailVerifyToken(aUser).then(() => {
|
|
223
181
|
this.sendVerificationEmail(aUser);
|
|
224
182
|
});
|
|
225
183
|
});
|
|
226
184
|
}
|
|
227
|
-
|
|
228
185
|
setPasswordResetToken(email) {
|
|
229
186
|
const token = {
|
|
230
187
|
_perishable_token: (0, _cryptoUtils.randomString)(25)
|
|
231
188
|
};
|
|
232
|
-
|
|
233
189
|
if (this.config.passwordPolicy && this.config.passwordPolicy.resetTokenValidityDuration) {
|
|
234
190
|
token._perishable_token_expires_at = _node.default._encode(this.config.generatePasswordResetTokenExpiresAt());
|
|
235
191
|
}
|
|
236
|
-
|
|
237
192
|
return this.config.database.update('_User', {
|
|
238
193
|
$or: [{
|
|
239
194
|
email
|
|
@@ -245,14 +200,13 @@ class UserController extends _AdaptableController.default {
|
|
|
245
200
|
}]
|
|
246
201
|
}, token, {}, true);
|
|
247
202
|
}
|
|
248
|
-
|
|
249
203
|
async sendPasswordResetEmail(email) {
|
|
250
204
|
if (!this.adapter) {
|
|
251
|
-
throw 'Trying to send a reset password but no adapter is set';
|
|
205
|
+
throw 'Trying to send a reset password but no adapter is set';
|
|
206
|
+
// TODO: No adapter?
|
|
252
207
|
}
|
|
253
208
|
|
|
254
209
|
let user;
|
|
255
|
-
|
|
256
210
|
if (this.config.passwordPolicy && this.config.passwordPolicy.resetTokenReuseIfValid && this.config.passwordPolicy.resetTokenValidityDuration) {
|
|
257
211
|
const results = await this.config.database.find('_User', {
|
|
258
212
|
$or: [{
|
|
@@ -271,25 +225,20 @@ class UserController extends _AdaptableController.default {
|
|
|
271
225
|
}]
|
|
272
226
|
}, {
|
|
273
227
|
limit: 1
|
|
274
|
-
});
|
|
275
|
-
|
|
228
|
+
}, Auth.maintenance(this.config));
|
|
276
229
|
if (results.length == 1) {
|
|
277
230
|
let expiresDate = results[0]._perishable_token_expires_at;
|
|
278
|
-
|
|
279
231
|
if (expiresDate && expiresDate.__type == 'Date') {
|
|
280
232
|
expiresDate = new Date(expiresDate.iso);
|
|
281
233
|
}
|
|
282
|
-
|
|
283
234
|
if (expiresDate > new Date()) {
|
|
284
235
|
user = results[0];
|
|
285
236
|
}
|
|
286
237
|
}
|
|
287
238
|
}
|
|
288
|
-
|
|
289
239
|
if (!user || !user._perishable_token) {
|
|
290
240
|
user = await this.setPasswordResetToken(email);
|
|
291
241
|
}
|
|
292
|
-
|
|
293
242
|
const token = encodeURIComponent(user._perishable_token);
|
|
294
243
|
const username = encodeURIComponent(user.username);
|
|
295
244
|
const link = buildEmailLink(this.config.requestResetPasswordURL, username, token, this.config);
|
|
@@ -298,16 +247,13 @@ class UserController extends _AdaptableController.default {
|
|
|
298
247
|
link: link,
|
|
299
248
|
user: (0, _triggers.inflate)('_User', user)
|
|
300
249
|
};
|
|
301
|
-
|
|
302
250
|
if (this.adapter.sendPasswordResetEmail) {
|
|
303
251
|
this.adapter.sendPasswordResetEmail(options);
|
|
304
252
|
} else {
|
|
305
253
|
this.adapter.sendMail(this.defaultResetPasswordEmail(options));
|
|
306
254
|
}
|
|
307
|
-
|
|
308
255
|
return Promise.resolve(user);
|
|
309
256
|
}
|
|
310
|
-
|
|
311
257
|
updatePassword(username, token, password) {
|
|
312
258
|
return this.checkResetTokenValidity(username, token).then(user => updateUserPassword(user, password, this.config)).then(user => {
|
|
313
259
|
const accountLockoutPolicy = new _AccountLockout.default(user, this.config);
|
|
@@ -321,7 +267,6 @@ class UserController extends _AdaptableController.default {
|
|
|
321
267
|
}
|
|
322
268
|
});
|
|
323
269
|
}
|
|
324
|
-
|
|
325
270
|
defaultVerificationEmail({
|
|
326
271
|
link,
|
|
327
272
|
user,
|
|
@@ -336,7 +281,6 @@ class UserController extends _AdaptableController.default {
|
|
|
336
281
|
subject
|
|
337
282
|
};
|
|
338
283
|
}
|
|
339
|
-
|
|
340
284
|
defaultResetPasswordEmail({
|
|
341
285
|
link,
|
|
342
286
|
user,
|
|
@@ -351,12 +295,10 @@ class UserController extends _AdaptableController.default {
|
|
|
351
295
|
subject
|
|
352
296
|
};
|
|
353
297
|
}
|
|
298
|
+
}
|
|
354
299
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
300
|
+
// Mark this private
|
|
358
301
|
exports.UserController = UserController;
|
|
359
|
-
|
|
360
302
|
function updateUserPassword(user, password, config) {
|
|
361
303
|
return _rest.default.update(config, Auth.master(config), '_User', {
|
|
362
304
|
objectId: user.objectId
|
|
@@ -364,10 +306,8 @@ function updateUserPassword(user, password, config) {
|
|
|
364
306
|
password: password
|
|
365
307
|
}).then(() => user);
|
|
366
308
|
}
|
|
367
|
-
|
|
368
309
|
function buildEmailLink(destination, username, token, config) {
|
|
369
310
|
const usernameAndToken = `token=${token}&username=${username}`;
|
|
370
|
-
|
|
371
311
|
if (config.parseFrameURL) {
|
|
372
312
|
const destinationWithoutHost = destination.replace(config.publicServerURL, '');
|
|
373
313
|
return `${config.parseFrameURL}?link=${encodeURIComponent(destinationWithoutHost)}&${usernameAndToken}`;
|
|
@@ -375,7 +315,6 @@ function buildEmailLink(destination, username, token, config) {
|
|
|
375
315
|
return `${destination}?${usernameAndToken}`;
|
|
376
316
|
}
|
|
377
317
|
}
|
|
378
|
-
|
|
379
318
|
var _default = UserController;
|
|
380
319
|
exports.default = _default;
|
|
381
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db250cm9sbGVycy9Vc2VyQ29udHJvbGxlci5qcyJdLCJuYW1lcyI6WyJSZXN0UXVlcnkiLCJyZXF1aXJlIiwiQXV0aCIsIlVzZXJDb250cm9sbGVyIiwiQWRhcHRhYmxlQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsImFwcElkIiwib3B0aW9ucyIsImNvbmZpZyIsIkNvbmZpZyIsImdldCIsInZhbGlkYXRlQWRhcHRlciIsInNob3VsZFZlcmlmeUVtYWlscyIsImV4cGVjdGVkQWRhcHRlclR5cGUiLCJNYWlsQWRhcHRlciIsInZlcmlmeVVzZXJFbWFpbHMiLCJzZXRFbWFpbFZlcmlmeVRva2VuIiwidXNlciIsIl9lbWFpbF92ZXJpZnlfdG9rZW4iLCJlbWFpbFZlcmlmaWVkIiwiZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQiLCJQYXJzZSIsIl9lbmNvZGUiLCJnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQiLCJ2ZXJpZnlFbWFpbCIsInVzZXJuYW1lIiwidG9rZW4iLCJ1bmRlZmluZWQiLCJxdWVyeSIsInVwZGF0ZUZpZWxkcyIsIl9fb3AiLCIkZ3QiLCJEYXRlIiwibWFzdGVyQXV0aCIsIm1hc3RlciIsImZpbmRVc2VyRm9yRW1haWxWZXJpZmljYXRpb24iLCJleGVjdXRlIiwidGhlbiIsInJlc3VsdCIsInJlc3VsdHMiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9iamVjdElkIiwicmVzdCIsInVwZGF0ZSIsImNoZWNrUmVzZXRUb2tlblZhbGlkaXR5IiwiZGF0YWJhc2UiLCJmaW5kIiwiX3BlcmlzaGFibGVfdG9rZW4iLCJsaW1pdCIsInBhc3N3b3JkUG9saWN5IiwicmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJleHBpcmVzRGF0ZSIsIl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQiLCJfX3R5cGUiLCJpc28iLCJnZXRVc2VySWZOZWVkZWQiLCJlbWFpbCIsIndoZXJlIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibGluayIsImJ1aWxkRW1haWxMaW5rIiwidmVyaWZ5RW1haWxVUkwiLCJhcHBOYW1lIiwic2VuZE1haWwiLCJkZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwiLCJyZWdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbiIsImVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQiLCJyZXNlbmRWZXJpZmljYXRpb25FbWFpbCIsImFVc2VyIiwic2V0UGFzc3dvcmRSZXNldFRva2VuIiwiZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQiLCIkb3IiLCIkZXhpc3RzIiwic2VuZFBhc3N3b3JkUmVzZXRFbWFpbCIsInJlc2V0VG9rZW5SZXVzZUlmVmFsaWQiLCJyZXF1ZXN0UmVzZXRQYXNzd29yZFVSTCIsImRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwiLCJ1cGRhdGVQYXNzd29yZCIsInBhc3N3b3JkIiwidXBkYXRlVXNlclBhc3N3b3JkIiwiYWNjb3VudExvY2tvdXRQb2xpY3kiLCJBY2NvdW50TG9ja291dCIsInVubG9ja0FjY291bnQiLCJjYXRjaCIsImVycm9yIiwibWVzc2FnZSIsInJlamVjdCIsInRleHQiLCJ0byIsInN1YmplY3QiLCJkZXN0aW5hdGlvbiIsInVzZXJuYW1lQW5kVG9rZW4iLCJwYXJzZUZyYW1lVVJMIiwiZGVzdGluYXRpb25XaXRob3V0SG9zdCIsInJlcGxhY2UiLCJwdWJsaWNTZXJ2ZXJVUkwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLElBQUlBLFNBQVMsR0FBR0MsT0FBTyxDQUFDLGNBQUQsQ0FBdkI7O0FBQ0EsSUFBSUMsSUFBSSxHQUFHRCxPQUFPLENBQUMsU0FBRCxDQUFsQjs7QUFFTyxNQUFNRSxjQUFOLFNBQTZCQyw0QkFBN0Is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RUFLSDtBQUFFb0MsSUFBQUEsUUFBUSxFQUFFM0IsSUFBSSxDQUFDMkI7QUFBakIsR0FMRyxFQU1IO0FBQ0VzQyxJQUFBQSxRQUFRLEVBQUVBO0FBRFosR0FORyxFQVVKNUMsSUFWSSxDQVVDLE1BQU1yQixJQVZQLENBQVA7QUFXRDs7QUFFRCxTQUFTK0MsY0FBVCxDQUF3QjhCLFdBQXhCLEVBQXFDcEUsUUFBckMsRUFBK0NDLEtBQS9DLEVBQXNEbkIsTUFBdEQsRUFBOEQ7QUFDNUQsUUFBTXVGLGdCQUFnQixHQUFJLFNBQVFwRSxLQUFNLGFBQVlELFFBQVMsRUFBN0Q7O0FBRUEsTUFBSWxCLE1BQU0sQ0FBQ3dGLGFBQVgsRUFBMEI7QUFDeEIsVUFBTUMsc0JBQXNCLEdBQUdILFdBQVcsQ0FBQ0ksT0FBWixDQUFvQjFGLE1BQU0sQ0FBQzJGLGVBQTNCLEVBQTRDLEVBQTVDLENBQS9CO0FBRUEsV0FBUSxHQUFFM0YsTUFBTSxDQUFDd0YsYUFBYyxTQUFRbEMsa0JBQWtCLENBQ3ZEbUMsc0JBRHVELENBRXZELElBQUdGLGdCQUFpQixFQUZ0QjtBQUdELEdBTkQsTUFNTztBQUNMLFdBQVEsR0FBRUQsV0FBWSxJQUFHQyxnQkFBaUIsRUFBMUM7QUFDRDtBQUNGOztlQUVjN0YsYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVN0cmluZyB9IGZyb20gJy4uL2NyeXB0b1V0aWxzJztcbmltcG9ydCB7IGluZmxhdGUgfSBmcm9tICcuLi90cmlnZ2Vycyc7XG5pbXBvcnQgQWRhcHRhYmxlQ29udHJvbGxlciBmcm9tICcuL0FkYXB0YWJsZUNvbnRyb2xsZXInO1xuaW1wb3J0IE1haWxBZGFwdGVyIGZyb20gJy4uL0FkYXB0ZXJzL0VtYWlsL01haWxBZGFwdGVyJztcbmltcG9ydCByZXN0IGZyb20gJy4uL3Jlc3QnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IEFjY291bnRMb2Nrb3V0IGZyb20gJy4uL0FjY291bnRMb2Nrb3V0JztcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vQ29uZmlnJztcblxudmFyIFJlc3RRdWVyeSA9IHJlcXVpcmUoJy4uL1Jlc3RRdWVyeScpO1xudmFyIEF1dGggPSByZXF1aXJlKCcuLi9BdXRoJyk7XG5cbmV4cG9ydCBjbGFzcyBVc2VyQ29udHJvbGxlciBleHRlbmRzIEFkYXB0YWJsZUNvbnRyb2xsZXIge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyLCBhcHBJZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgYXBwSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gQ29uZmlnLmdldCh0aGlzLmFwcElkKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWRhcHRlcihhZGFwdGVyKSB7XG4gICAgLy8gQWxsb3cgbm8gYWRhcHRlclxuICAgIGlmICghYWRhcHRlciAmJiAhdGhpcy5zaG91bGRWZXJpZnlFbWFpbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIudmFsaWRhdGVBZGFwdGVyKGFkYXB0ZXIpO1xuICB9XG5cbiAgZXhwZWN0ZWRBZGFwdGVyVHlwZSgpIHtcbiAgICByZXR1cm4gTWFpbEFkYXB0ZXI7XG4gIH1cblxuICBnZXQgc2hvdWxkVmVyaWZ5RW1haWxzKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudmVyaWZ5VXNlckVtYWlscztcbiAgfVxuXG4gIHNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGlmICh0aGlzLnNob3VsZFZlcmlmeUVtYWlscykge1xuICAgICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuID0gcmFuZG9tU3RyaW5nKDI1KTtcbiAgICAgIHVzZXIuZW1haWxWZXJpZmllZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcuZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSBQYXJzZS5fZW5jb2RlKFxuICAgICAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbkV4cGlyZXNBdCgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmVyaWZ5RW1haWwodXNlcm5hbWUsIHRva2VuKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFZlcmlmeUVtYWlscykge1xuICAgICAgLy8gVHJ5aW5nIHRvIHZlcmlmeSBlbWFpbCB3aGVuIG5vdCBlbmFibGVkXG4gICAgICAvLyBUT0RPOiBCZXR0ZXIgZXJyb3IgaGVyZS5cbiAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeSA9IHsgdXNlcm5hbWU6IHVzZXJuYW1lLCBfZW1haWxfdmVyaWZ5X3Rva2VuOiB0b2tlbiB9O1xuICAgIGNvbnN0IHVwZGF0ZUZpZWxkcyA9IHtcbiAgICAgIGVtYWlsVmVyaWZpZWQ6IHRydWUsXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuOiB7IF9fb3A6ICdEZWxldGUnIH0sXG4gICAgfTtcblxuICAgIC8vIGlmIHRoZSBlbWFpbCB2ZXJpZnkgdG9rZW4gbmVlZHMgdG8gYmUgdmFsaWRhdGVkIHRoZW5cbiAgICAvLyBhZGQgYWRkaXRpb25hbCBxdWVyeSBwYXJhbXMgYW5kIGFkZGl0aW9uYWwgZmllbGRzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkXG4gICAgaWYgKHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICBxdWVyeS5lbWFpbFZlcmlmaWVkID0gZmFsc2U7XG4gICAgICBxdWVyeS5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSB7ICRndDogUGFyc2UuX2VuY29kZShuZXcgRGF0ZSgpKSB9O1xuXG4gICAgICB1cGRhdGVGaWVsZHMuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0ID0geyBfX29wOiAnRGVsZXRlJyB9O1xuICAgIH1cbiAgICBjb25zdCBtYXN0ZXJBdXRoID0gQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpO1xuICAgIHZhciBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uID0gbmV3IFJlc3RRdWVyeShcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpLFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgdXNlcm5hbWU6IHVzZXJuYW1lIH1cbiAgICApO1xuICAgIHJldHVybiBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uLmV4ZWN1dGUoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICYmIHJlc3VsdC5yZXN1bHRzWzBdLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQucmVzdWx0cy5sZW5ndGhbMF0pO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQucmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgcXVlcnkub2JqZWN0SWQgPSByZXN1bHQucmVzdWx0c1swXS5vYmplY3RJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN0LnVwZGF0ZSh0aGlzLmNvbmZpZywgbWFzdGVyQXV0aCwgJ19Vc2VyJywgcXVlcnksIHVwZGF0ZUZpZWxkcyk7XG4gICAgfSk7XG4gIH1cblxuICBjaGVja1Jlc2V0VG9rZW5WYWxpZGl0eSh1c2VybmFtZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5maW5kKFxuICAgICAgICAnX1VzZXInLFxuICAgICAgICB7XG4gICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgIF9wZXJpc2hhYmxlX3Rva2VuOiB0b2tlbixcbiAgICAgICAgfSxcbiAgICAgICAgeyBsaW1pdDogMSB9XG4gICAgICApXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyAnRmFpbGVkIHRvIHJlc2V0IHBhc3N3b3JkOiB1c2VybmFtZSAvIGVtYWlsIC8gdG9rZW4gaXMgaW52YWxpZCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kgJiYgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgICBsZXQgZXhwaXJlc0RhdGUgPSByZXN1bHRzWzBdLl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQ7XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICAgIGV4cGlyZXNEYXRlID0gbmV3IERhdGUoZXhwaXJlc0RhdGUuaXNvKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlIDwgbmV3IERhdGUoKSkgdGhyb3cgJ1RoZSBwYXNzd29yZCByZXNldCBsaW5rIGhhcyBleHBpcmVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0c1swXTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0VXNlcklmTmVlZGVkKHVzZXIpIHtcbiAgICBpZiAodXNlci51c2VybmFtZSAmJiB1c2VyLmVtYWlsKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXIpO1xuICAgIH1cbiAgICB2YXIgd2hlcmUgPSB7fTtcbiAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgd2hlcmUudXNlcm5hbWUgPSB1c2VyLnVzZXJuYW1lO1xuICAgIH1cbiAgICBpZiAodXNlci5lbWFpbCkge1xuICAgICAgd2hlcmUuZW1haWwgPSB1c2VyLmVtYWlsO1xuICAgIH1cblxuICAgIHZhciBxdWVyeSA9IG5ldyBSZXN0UXVlcnkodGhpcy5jb25maWcsIEF1dGgubWFzdGVyKHRoaXMuY29uZmlnKSwgJ19Vc2VyJywgd2hlcmUpO1xuICAgIHJldHVybiBxdWVyeS5leGVjdXRlKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHRzWzBdO1xuICAgIH0pO1xuICB9XG5cbiAgc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHVzZXIpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkVmVyaWZ5RW1haWxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbik7XG4gICAgLy8gV2UgbWF5IG5lZWQgdG8gZmV0Y2ggdGhlIHVzZXIgaW4gY2FzZSBvZiB1cGRhdGUgZW1haWxcbiAgICB0aGlzLmdldFVzZXJJZk5lZWRlZCh1c2VyKS50aGVuKHVzZXIgPT4ge1xuICAgICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICAgIGNvbnN0IGxpbmsgPSBidWlsZEVtYWlsTGluayh0aGlzLmNvbmZpZy52ZXJpZnlFbWFpbFVSTCwgdXNlcm5hbWUsIHRva2VuLCB0aGlzLmNvbmZpZyk7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgICBsaW5rOiBsaW5rLFxuICAgICAgICB1c2VyOiBpbmZsYXRlKCdfVXNlcicsIHVzZXIpLFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKSB7XG4gICAgICAgIHRoaXMuYWRhcHRlci5zZW5kVmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkYXB0ZXIuc2VuZE1haWwodGhpcy5kZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2VuZXJhdGVzIHRoZSBnaXZlbiB1c2VyJ3MgZW1haWwgdmVyaWZpY2F0aW9uIHRva2VuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGNvbnN0IHsgX2VtYWlsX3ZlcmlmeV90b2tlbiB9ID0gdXNlcjtcbiAgICBsZXQgeyBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgfSA9IHVzZXI7XG4gICAgaWYgKF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCAmJiBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQuX190eXBlID09PSAnRGF0ZScpIHtcbiAgICAgIF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCA9IF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdC5pc287XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQgJiZcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uICYmXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuICYmXG4gICAgICBuZXcgRGF0ZSgpIDwgbmV3IERhdGUoX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0KVxuICAgICkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICB0aGlzLnNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLnVwZGF0ZSgnX1VzZXInLCB7IHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lIH0sIHVzZXIpO1xuICB9XG5cbiAgcmVzZW5kVmVyaWZpY2F0aW9uRW1haWwodXNlcm5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRVc2VySWZOZWVkZWQoeyB1c2VybmFtZTogdXNlcm5hbWUgfSkudGhlbihhVXNlciA9PiB7XG4gICAgICBpZiAoIWFVc2VyIHx8IGFVc2VyLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4oYVVzZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNlbmRWZXJpZmljYXRpb25FbWFpbChhVXNlcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFBhc3N3b3JkUmVzZXRUb2tlbihlbWFpbCkge1xuICAgIGNvbnN0IHRva2VuID0geyBfcGVyaXNoYWJsZV90b2tlbjogcmFuZG9tU3RyaW5nKDI1KSB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICB0b2tlbi5fcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0ID0gUGFyc2UuX2VuY29kZShcbiAgICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudXBkYXRlKFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgJG9yOiBbeyBlbWFpbCB9LCB7IHVzZXJuYW1lOiBlbWFpbCwgZW1haWw6IHsgJGV4aXN0czogZmFsc2UgfSB9XSB9LFxuICAgICAgdG9rZW4sXG4gICAgICB7fSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChlbWFpbCkge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICB0aHJvdyAnVHJ5aW5nIHRvIHNlbmQgYSByZXNldCBwYXNzd29yZCBidXQgbm8gYWRhcHRlciBpcyBzZXQnO1xuICAgICAgLy8gIFRPRE86IE5vIGFkYXB0ZXI/XG4gICAgfVxuICAgIGxldCB1c2VyO1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuUmV1c2VJZlZhbGlkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvblxuICAgICkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHtcbiAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgIHsgZW1haWwsIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgICAgeyB1c2VybmFtZTogZW1haWwsIGVtYWlsOiB7ICRleGlzdHM6IGZhbHNlIH0sIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGltaXQ6IDEgfVxuICAgICAgKTtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIGxldCBleHBpcmVzRGF0ZSA9IHJlc3VsdHNbMF0uX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdDtcbiAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICBleHBpcmVzRGF0ZSA9IG5ldyBEYXRlKGV4cGlyZXNEYXRlLmlzbyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGlyZXNEYXRlID4gbmV3IERhdGUoKSkge1xuICAgICAgICAgIHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdXNlciB8fCAhdXNlci5fcGVyaXNoYWJsZV90b2tlbikge1xuICAgICAgdXNlciA9IGF3YWl0IHRoaXMuc2V0UGFzc3dvcmRSZXNldFRva2VuKGVtYWlsKTtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSBlbmNvZGVVUklDb21wb25lbnQodXNlci5fcGVyaXNoYWJsZV90b2tlbik7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICBjb25zdCBsaW5rID0gYnVpbGRFbWFpbExpbmsodGhpcy5jb25maWcucmVxdWVzdFJlc2V0UGFzc3dvcmRVUkwsIHVzZXJuYW1lLCB0b2tlbiwgdGhpcy5jb25maWcpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgbGluazogbGluayxcbiAgICAgIHVzZXI6IGluZmxhdGUoJ19Vc2VyJywgdXNlciksXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCkge1xuICAgICAgdGhpcy5hZGFwdGVyLnNlbmRQYXNzd29yZFJlc2V0RW1haWwob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRhcHRlci5zZW5kTWFpbCh0aGlzLmRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwob3B0aW9ucykpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXNlcik7XG4gIH1cblxuICB1cGRhdGVQYXNzd29yZCh1c2VybmFtZSwgdG9rZW4sIHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tSZXNldFRva2VuVmFsaWRpdHkodXNlcm5hbWUsIHRva2VuKVxuICAgICAgLnRoZW4odXNlciA9PiB1cGRhdGVVc2VyUGFzc3dvcmQodXNlciwgcGFzc3dvcmQsIHRoaXMuY29uZmlnKSlcbiAgICAgIC50aGVuKHVzZXIgPT4ge1xuICAgICAgICBjb25zdCBhY2NvdW50TG9ja291dFBvbGljeSA9IG5ldyBBY2NvdW50TG9ja291dCh1c2VyLCB0aGlzLmNvbmZpZyk7XG4gICAgICAgIHJldHVybiBhY2NvdW50TG9ja291dFBvbGljeS51bmxvY2tBY2NvdW50KCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAvLyBpbiBjYXNlIG9mIFBhcnNlLkVycm9yLCBmYWlsIHdpdGggdGhlIGVycm9yIG1lc3NhZ2Ugb25seVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGRlZmF1bHRWZXJpZmljYXRpb25FbWFpbCh7IGxpbmssIHVzZXIsIGFwcE5hbWUgfSkge1xuICAgIGNvbnN0IHRleHQgPVxuICAgICAgJ0hpLFxcblxcbicgK1xuICAgICAgJ1lvdSBhcmUgYmVpbmcgYXNrZWQgdG8gY29uZmlybSB0aGUgZS1tYWlsIGFkZHJlc3MgJyArXG4gICAgICB1c2VyLmdldCgnZW1haWwnKSArXG4gICAgICAnIHdpdGggJyArXG4gICAgICBhcHBOYW1lICtcbiAgICAgICdcXG5cXG4nICtcbiAgICAgICcnICtcbiAgICAgICdDbGljayBoZXJlIHRvIGNvbmZpcm0gaXQ6XFxuJyArXG4gICAgICBsaW5rO1xuICAgIGNvbnN0IHRvID0gdXNlci5nZXQoJ2VtYWlsJyk7XG4gICAgY29uc3Qgc3ViamVjdCA9ICdQbGVhc2UgdmVyaWZ5IHlvdXIgZS1tYWlsIGZvciAnICsgYXBwTmFtZTtcbiAgICByZXR1cm4geyB0ZXh0LCB0bywgc3ViamVjdCB9O1xuICB9XG5cbiAgZGVmYXVsdFJlc2V0UGFzc3dvcmRFbWFpbCh7IGxpbmssIHVzZXIsIGFwcE5hbWUgfSkge1xuICAgIGNvbnN0IHRleHQgPVxuICAgICAgJ0hpLFxcblxcbicgK1xuICAgICAgJ1lvdSByZXF1ZXN0ZWQgdG8gcmVzZXQgeW91ciBwYXNzd29yZCBmb3IgJyArXG4gICAgICBhcHBOYW1lICtcbiAgICAgICh1c2VyLmdldCgndXNlcm5hbWUnKSA/IFwiICh5b3VyIHVzZXJuYW1lIGlzICdcIiArIHVzZXIuZ2V0KCd1c2VybmFtZScpICsgXCInKVwiIDogJycpICtcbiAgICAgICcuXFxuXFxuJyArXG4gICAgICAnJyArXG4gICAgICAnQ2xpY2sgaGVyZSB0byByZXNldCBpdDpcXG4nICtcbiAgICAgIGxpbms7XG4gICAgY29uc3QgdG8gPSB1c2VyLmdldCgnZW1haWwnKSB8fCB1c2VyLmdldCgndXNlcm5hbWUnKTtcbiAgICBjb25zdCBzdWJqZWN0ID0gJ1Bhc3N3b3JkIFJlc2V0IGZvciAnICsgYXBwTmFtZTtcbiAgICByZXR1cm4geyB0ZXh0LCB0bywgc3ViamVjdCB9O1xuICB9XG59XG5cbi8vIE1hcmsgdGhpcyBwcml2YXRlXG5mdW5jdGlvbiB1cGRhdGVVc2VyUGFzc3dvcmQodXNlciwgcGFzc3dvcmQsIGNvbmZpZykge1xuICByZXR1cm4gcmVzdFxuICAgIC51cGRhdGUoXG4gICAgICBjb25maWcsXG4gICAgICBBdXRoLm1hc3Rlcihjb25maWcpLFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgb2JqZWN0SWQ6IHVzZXIub2JqZWN0SWQgfSxcbiAgICAgIHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgfVxuICAgIClcbiAgICAudGhlbigoKSA9PiB1c2VyKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbWFpbExpbmsoZGVzdGluYXRpb24sIHVzZXJuYW1lLCB0b2tlbiwgY29uZmlnKSB7XG4gIGNvbnN0IHVzZXJuYW1lQW5kVG9rZW4gPSBgdG9rZW49JHt0b2tlbn0mdXNlcm5hbWU9JHt1c2VybmFtZX1gO1xuXG4gIGlmIChjb25maWcucGFyc2VGcmFtZVVSTCkge1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uV2l0aG91dEhvc3QgPSBkZXN0aW5hdGlvbi5yZXBsYWNlKGNvbmZpZy5wdWJsaWNTZXJ2ZXJVUkwsICcnKTtcblxuICAgIHJldHVybiBgJHtjb25maWcucGFyc2VGcmFtZVVSTH0/bGluaz0ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGRlc3RpbmF0aW9uV2l0aG91dEhvc3RcbiAgICApfSYke3VzZXJuYW1lQW5kVG9rZW59YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYCR7ZGVzdGluYXRpb259PyR7dXNlcm5hbWVBbmRUb2tlbn1gO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVzZXJDb250cm9sbGVyO1xuIl19
|
|
320
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZXN0UXVlcnkiLCJyZXF1aXJlIiwiQXV0aCIsIlVzZXJDb250cm9sbGVyIiwiQWRhcHRhYmxlQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsImFwcElkIiwib3B0aW9ucyIsImNvbmZpZyIsIkNvbmZpZyIsImdldCIsInZhbGlkYXRlQWRhcHRlciIsInNob3VsZFZlcmlmeUVtYWlscyIsImV4cGVjdGVkQWRhcHRlclR5cGUiLCJNYWlsQWRhcHRlciIsInZlcmlmeVVzZXJFbWFpbHMiLCJzZXRFbWFpbFZlcmlmeVRva2VuIiwidXNlciIsIl9lbWFpbF92ZXJpZnlfdG9rZW4iLCJyYW5kb21TdHJpbmciLCJlbWFpbFZlcmlmaWVkIiwiZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQiLCJQYXJzZSIsIl9lbmNvZGUiLCJnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQiLCJ2ZXJpZnlFbWFpbCIsInVzZXJuYW1lIiwidG9rZW4iLCJ1bmRlZmluZWQiLCJxdWVyeSIsInVwZGF0ZUZpZWxkcyIsIl9fb3AiLCIkZ3QiLCJEYXRlIiwibWFpbnRlbmFuY2VBdXRoIiwibWFpbnRlbmFuY2UiLCJmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uIiwiZXhlY3V0ZSIsInRoZW4iLCJyZXN1bHQiLCJyZXN1bHRzIiwibGVuZ3RoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvYmplY3RJZCIsInJlc3QiLCJ1cGRhdGUiLCJjaGVja1Jlc2V0VG9rZW5WYWxpZGl0eSIsImRhdGFiYXNlIiwiZmluZCIsIl9wZXJpc2hhYmxlX3Rva2VuIiwibGltaXQiLCJwYXNzd29yZFBvbGljeSIsInJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uIiwiZXhwaXJlc0RhdGUiLCJfcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0IiwiX190eXBlIiwiaXNvIiwiZ2V0VXNlcklmTmVlZGVkIiwiZW1haWwiLCJ3aGVyZSIsIm1hc3RlciIsInNlbmRWZXJpZmljYXRpb25FbWFpbCIsImVuY29kZVVSSUNvbXBvbmVudCIsImxpbmsiLCJidWlsZEVtYWlsTGluayIsInZlcmlmeUVtYWlsVVJMIiwiYXBwTmFtZSIsImluZmxhdGUiLCJzZW5kTWFpbCIsImRlZmF1bHRWZXJpZmljYXRpb25FbWFpbCIsInJlZ2VuZXJhdGVFbWFpbFZlcmlmeVRva2VuIiwiZW1haWxWZXJpZnlUb2tlblJldXNlSWZWYWxpZCIsInJlc2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiYVVzZXIiLCJzZXRQYXNzd29yZFJlc2V0VG9rZW4iLCJnZW5lcmF0ZVBhc3N3b3JkUmVzZXRUb2tlbkV4cGlyZXNBdCIsIiRvciIsIiRleGlzdHMiLCJzZW5kUGFzc3dvcmRSZXNldEVtYWlsIiwicmVzZXRUb2tlblJldXNlSWZWYWxpZCIsInJlcXVlc3RSZXNldFBhc3N3b3JkVVJMIiwiZGVmYXVsdFJlc2V0UGFzc3dvcmRFbWFpbCIsInVwZGF0ZVBhc3N3b3JkIiwicGFzc3dvcmQiLCJ1cGRhdGVVc2VyUGFzc3dvcmQiLCJhY2NvdW50TG9ja291dFBvbGljeSIsIkFjY291bnRMb2Nrb3V0IiwidW5sb2NrQWNjb3VudCIsImNhdGNoIiwiZXJyb3IiLCJtZXNzYWdlIiwicmVqZWN0IiwidGV4dCIsInRvIiwic3ViamVjdCIsImRlc3RpbmF0aW9uIiwidXNlcm5hbWVBbmRUb2tlbiIsInBhcnNlRnJhbWVVUkwiLCJkZXN0aW5hdGlvbldpdGhvdXRIb3N0IiwicmVwbGFjZSIsInB1YmxpY1NlcnZlclVSTCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db250cm9sbGVycy9Vc2VyQ29udHJvbGxlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21TdHJpbmcgfSBmcm9tICcuLi9jcnlwdG9VdGlscyc7XG5pbXBvcnQgeyBpbmZsYXRlIH0gZnJvbSAnLi4vdHJpZ2dlcnMnO1xuaW1wb3J0IEFkYXB0YWJsZUNvbnRyb2xsZXIgZnJvbSAnLi9BZGFwdGFibGVDb250cm9sbGVyJztcbmltcG9ydCBNYWlsQWRhcHRlciBmcm9tICcuLi9BZGFwdGVycy9FbWFpbC9NYWlsQWRhcHRlcic7XG5pbXBvcnQgcmVzdCBmcm9tICcuLi9yZXN0JztcbmltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcbmltcG9ydCBBY2NvdW50TG9ja291dCBmcm9tICcuLi9BY2NvdW50TG9ja291dCc7XG5pbXBvcnQgQ29uZmlnIGZyb20gJy4uL0NvbmZpZyc7XG5cbnZhciBSZXN0UXVlcnkgPSByZXF1aXJlKCcuLi9SZXN0UXVlcnknKTtcbnZhciBBdXRoID0gcmVxdWlyZSgnLi4vQXV0aCcpO1xuXG5leHBvcnQgY2xhc3MgVXNlckNvbnRyb2xsZXIgZXh0ZW5kcyBBZGFwdGFibGVDb250cm9sbGVyIHtcbiAgY29uc3RydWN0b3IoYWRhcHRlciwgYXBwSWQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIGFwcElkLCBvcHRpb25zKTtcbiAgfVxuXG4gIGdldCBjb25maWcoKSB7XG4gICAgcmV0dXJuIENvbmZpZy5nZXQodGhpcy5hcHBJZCk7XG4gIH1cblxuICB2YWxpZGF0ZUFkYXB0ZXIoYWRhcHRlcikge1xuICAgIC8vIEFsbG93IG5vIGFkYXB0ZXJcbiAgICBpZiAoIWFkYXB0ZXIgJiYgIXRoaXMuc2hvdWxkVmVyaWZ5RW1haWxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLnZhbGlkYXRlQWRhcHRlcihhZGFwdGVyKTtcbiAgfVxuXG4gIGV4cGVjdGVkQWRhcHRlclR5cGUoKSB7XG4gICAgcmV0dXJuIE1haWxBZGFwdGVyO1xuICB9XG5cbiAgZ2V0IHNob3VsZFZlcmlmeUVtYWlscygpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnZlcmlmeVVzZXJFbWFpbHM7XG4gIH1cblxuICBzZXRFbWFpbFZlcmlmeVRva2VuKHVzZXIpIHtcbiAgICBpZiAodGhpcy5zaG91bGRWZXJpZnlFbWFpbHMpIHtcbiAgICAgIHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbiA9IHJhbmRvbVN0cmluZygyNSk7XG4gICAgICB1c2VyLmVtYWlsVmVyaWZpZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICAgIHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0ID0gUGFyc2UuX2VuY29kZShcbiAgICAgICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZlcmlmeUVtYWlsKHVzZXJuYW1lLCB0b2tlbikge1xuICAgIGlmICghdGhpcy5zaG91bGRWZXJpZnlFbWFpbHMpIHtcbiAgICAgIC8vIFRyeWluZyB0byB2ZXJpZnkgZW1haWwgd2hlbiBub3QgZW5hYmxlZFxuICAgICAgLy8gVE9ETzogQmV0dGVyIGVycm9yIGhlcmUuXG4gICAgICB0aHJvdyB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnkgPSB7IHVzZXJuYW1lOiB1c2VybmFtZSwgX2VtYWlsX3ZlcmlmeV90b2tlbjogdG9rZW4gfTtcbiAgICBjb25zdCB1cGRhdGVGaWVsZHMgPSB7XG4gICAgICBlbWFpbFZlcmlmaWVkOiB0cnVlLFxuICAgICAgX2VtYWlsX3ZlcmlmeV90b2tlbjogeyBfX29wOiAnRGVsZXRlJyB9LFxuICAgIH07XG5cbiAgICAvLyBpZiB0aGUgZW1haWwgdmVyaWZ5IHRva2VuIG5lZWRzIHRvIGJlIHZhbGlkYXRlZCB0aGVuXG4gICAgLy8gYWRkIGFkZGl0aW9uYWwgcXVlcnkgcGFyYW1zIGFuZCBhZGRpdGlvbmFsIGZpZWxkcyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZFxuICAgIGlmICh0aGlzLmNvbmZpZy5lbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbikge1xuICAgICAgcXVlcnkuZW1haWxWZXJpZmllZCA9IGZhbHNlO1xuICAgICAgcXVlcnkuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0ID0geyAkZ3Q6IFBhcnNlLl9lbmNvZGUobmV3IERhdGUoKSkgfTtcblxuICAgICAgdXBkYXRlRmllbGRzLl9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCA9IHsgX19vcDogJ0RlbGV0ZScgfTtcbiAgICB9XG4gICAgY29uc3QgbWFpbnRlbmFuY2VBdXRoID0gQXV0aC5tYWludGVuYW5jZSh0aGlzLmNvbmZpZyk7XG4gICAgdmFyIGZpbmRVc2VyRm9yRW1haWxWZXJpZmljYXRpb24gPSBuZXcgUmVzdFF1ZXJ5KHRoaXMuY29uZmlnLCBtYWludGVuYW5jZUF1dGgsICdfVXNlcicsIHtcbiAgICAgIHVzZXJuYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uLmV4ZWN1dGUoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICYmIHJlc3VsdC5yZXN1bHRzWzBdLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQucmVzdWx0cy5sZW5ndGhbMF0pO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQucmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgcXVlcnkub2JqZWN0SWQgPSByZXN1bHQucmVzdWx0c1swXS5vYmplY3RJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN0LnVwZGF0ZSh0aGlzLmNvbmZpZywgbWFpbnRlbmFuY2VBdXRoLCAnX1VzZXInLCBxdWVyeSwgdXBkYXRlRmllbGRzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNoZWNrUmVzZXRUb2tlblZhbGlkaXR5KHVzZXJuYW1lLCB0b2tlbikge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHtcbiAgICAgICAgICB1c2VybmFtZTogdXNlcm5hbWUsXG4gICAgICAgICAgX3BlcmlzaGFibGVfdG9rZW46IHRva2VuLFxuICAgICAgICB9LFxuICAgICAgICB7IGxpbWl0OiAxIH0sXG4gICAgICAgIEF1dGgubWFpbnRlbmFuY2UodGhpcy5jb25maWcpXG4gICAgICApXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyAnRmFpbGVkIHRvIHJlc2V0IHBhc3N3b3JkOiB1c2VybmFtZSAvIGVtYWlsIC8gdG9rZW4gaXMgaW52YWxpZCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kgJiYgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgICBsZXQgZXhwaXJlc0RhdGUgPSByZXN1bHRzWzBdLl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQ7XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICAgIGV4cGlyZXNEYXRlID0gbmV3IERhdGUoZXhwaXJlc0RhdGUuaXNvKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlIDwgbmV3IERhdGUoKSkgdGhyb3cgJ1RoZSBwYXNzd29yZCByZXNldCBsaW5rIGhhcyBleHBpcmVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0c1swXTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0VXNlcklmTmVlZGVkKHVzZXIpIHtcbiAgICBpZiAodXNlci51c2VybmFtZSAmJiB1c2VyLmVtYWlsKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXIpO1xuICAgIH1cbiAgICB2YXIgd2hlcmUgPSB7fTtcbiAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgd2hlcmUudXNlcm5hbWUgPSB1c2VyLnVzZXJuYW1lO1xuICAgIH1cbiAgICBpZiAodXNlci5lbWFpbCkge1xuICAgICAgd2hlcmUuZW1haWwgPSB1c2VyLmVtYWlsO1xuICAgIH1cblxuICAgIHZhciBxdWVyeSA9IG5ldyBSZXN0UXVlcnkodGhpcy5jb25maWcsIEF1dGgubWFzdGVyKHRoaXMuY29uZmlnKSwgJ19Vc2VyJywgd2hlcmUpO1xuICAgIHJldHVybiBxdWVyeS5leGVjdXRlKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHRzWzBdO1xuICAgIH0pO1xuICB9XG5cbiAgc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHVzZXIpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkVmVyaWZ5RW1haWxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbik7XG4gICAgLy8gV2UgbWF5IG5lZWQgdG8gZmV0Y2ggdGhlIHVzZXIgaW4gY2FzZSBvZiB1cGRhdGUgZW1haWxcbiAgICB0aGlzLmdldFVzZXJJZk5lZWRlZCh1c2VyKS50aGVuKHVzZXIgPT4ge1xuICAgICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICAgIGNvbnN0IGxpbmsgPSBidWlsZEVtYWlsTGluayh0aGlzLmNvbmZpZy52ZXJpZnlFbWFpbFVSTCwgdXNlcm5hbWUsIHRva2VuLCB0aGlzLmNvbmZpZyk7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgICBsaW5rOiBsaW5rLFxuICAgICAgICB1c2VyOiBpbmZsYXRlKCdfVXNlcicsIHVzZXIpLFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKSB7XG4gICAgICAgIHRoaXMuYWRhcHRlci5zZW5kVmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkYXB0ZXIuc2VuZE1haWwodGhpcy5kZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2VuZXJhdGVzIHRoZSBnaXZlbiB1c2VyJ3MgZW1haWwgdmVyaWZpY2F0aW9uIHRva2VuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGNvbnN0IHsgX2VtYWlsX3ZlcmlmeV90b2tlbiB9ID0gdXNlcjtcbiAgICBsZXQgeyBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgfSA9IHVzZXI7XG4gICAgaWYgKF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCAmJiBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQuX190eXBlID09PSAnRGF0ZScpIHtcbiAgICAgIF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCA9IF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdC5pc287XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQgJiZcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uICYmXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuICYmXG4gICAgICBuZXcgRGF0ZSgpIDwgbmV3IERhdGUoX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0KVxuICAgICkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICB0aGlzLnNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLnVwZGF0ZSgnX1VzZXInLCB7IHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lIH0sIHVzZXIpO1xuICB9XG5cbiAgcmVzZW5kVmVyaWZpY2F0aW9uRW1haWwodXNlcm5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRVc2VySWZOZWVkZWQoeyB1c2VybmFtZTogdXNlcm5hbWUgfSkudGhlbihhVXNlciA9PiB7XG4gICAgICBpZiAoIWFVc2VyIHx8IGFVc2VyLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4oYVVzZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNlbmRWZXJpZmljYXRpb25FbWFpbChhVXNlcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFBhc3N3b3JkUmVzZXRUb2tlbihlbWFpbCkge1xuICAgIGNvbnN0IHRva2VuID0geyBfcGVyaXNoYWJsZV90b2tlbjogcmFuZG9tU3RyaW5nKDI1KSB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICB0b2tlbi5fcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0ID0gUGFyc2UuX2VuY29kZShcbiAgICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudXBkYXRlKFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgJG9yOiBbeyBlbWFpbCB9LCB7IHVzZXJuYW1lOiBlbWFpbCwgZW1haWw6IHsgJGV4aXN0czogZmFsc2UgfSB9XSB9LFxuICAgICAgdG9rZW4sXG4gICAgICB7fSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChlbWFpbCkge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICB0aHJvdyAnVHJ5aW5nIHRvIHNlbmQgYSByZXNldCBwYXNzd29yZCBidXQgbm8gYWRhcHRlciBpcyBzZXQnO1xuICAgICAgLy8gIFRPRE86IE5vIGFkYXB0ZXI/XG4gICAgfVxuICAgIGxldCB1c2VyO1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuUmV1c2VJZlZhbGlkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvblxuICAgICkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHtcbiAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgIHsgZW1haWwsIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgICAgeyB1c2VybmFtZTogZW1haWwsIGVtYWlsOiB7ICRleGlzdHM6IGZhbHNlIH0sIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGltaXQ6IDEgfSxcbiAgICAgICAgQXV0aC5tYWludGVuYW5jZSh0aGlzLmNvbmZpZylcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT0gMSkge1xuICAgICAgICBsZXQgZXhwaXJlc0RhdGUgPSByZXN1bHRzWzBdLl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQ7XG4gICAgICAgIGlmIChleHBpcmVzRGF0ZSAmJiBleHBpcmVzRGF0ZS5fX3R5cGUgPT0gJ0RhdGUnKSB7XG4gICAgICAgICAgZXhwaXJlc0RhdGUgPSBuZXcgRGF0ZShleHBpcmVzRGF0ZS5pc28pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHBpcmVzRGF0ZSA+IG5ldyBEYXRlKCkpIHtcbiAgICAgICAgICB1c2VyID0gcmVzdWx0c1swXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXVzZXIgfHwgIXVzZXIuX3BlcmlzaGFibGVfdG9rZW4pIHtcbiAgICAgIHVzZXIgPSBhd2FpdCB0aGlzLnNldFBhc3N3b3JkUmVzZXRUb2tlbihlbWFpbCk7XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuX3BlcmlzaGFibGVfdG9rZW4pO1xuICAgIGNvbnN0IHVzZXJuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIudXNlcm5hbWUpO1xuXG4gICAgY29uc3QgbGluayA9IGJ1aWxkRW1haWxMaW5rKHRoaXMuY29uZmlnLnJlcXVlc3RSZXNldFBhc3N3b3JkVVJMLCB1c2VybmFtZSwgdG9rZW4sIHRoaXMuY29uZmlnKTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgYXBwTmFtZTogdGhpcy5jb25maWcuYXBwTmFtZSxcbiAgICAgIGxpbms6IGxpbmssXG4gICAgICB1c2VyOiBpbmZsYXRlKCdfVXNlcicsIHVzZXIpLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5hZGFwdGVyLnNlbmRQYXNzd29yZFJlc2V0RW1haWwpIHtcbiAgICAgIHRoaXMuYWRhcHRlci5zZW5kUGFzc3dvcmRSZXNldEVtYWlsKG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkYXB0ZXIuc2VuZE1haWwodGhpcy5kZWZhdWx0UmVzZXRQYXNzd29yZEVtYWlsKG9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXIpO1xuICB9XG5cbiAgdXBkYXRlUGFzc3dvcmQodXNlcm5hbWUsIHRva2VuLCBwYXNzd29yZCkge1xuICAgIHJldHVybiB0aGlzLmNoZWNrUmVzZXRUb2tlblZhbGlkaXR5KHVzZXJuYW1lLCB0b2tlbilcbiAgICAgIC50aGVuKHVzZXIgPT4gdXBkYXRlVXNlclBhc3N3b3JkKHVzZXIsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZykpXG4gICAgICAudGhlbih1c2VyID0+IHtcbiAgICAgICAgY29uc3QgYWNjb3VudExvY2tvdXRQb2xpY3kgPSBuZXcgQWNjb3VudExvY2tvdXQodXNlciwgdGhpcy5jb25maWcpO1xuICAgICAgICByZXR1cm4gYWNjb3VudExvY2tvdXRQb2xpY3kudW5sb2NrQWNjb3VudCgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgLy8gaW4gY2FzZSBvZiBQYXJzZS5FcnJvciwgZmFpbCB3aXRoIHRoZSBlcnJvciBtZXNzYWdlIG9ubHlcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBkZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwoeyBsaW5rLCB1c2VyLCBhcHBOYW1lIH0pIHtcbiAgICBjb25zdCB0ZXh0ID1cbiAgICAgICdIaSxcXG5cXG4nICtcbiAgICAgICdZb3UgYXJlIGJlaW5nIGFza2VkIHRvIGNvbmZpcm0gdGhlIGUtbWFpbCBhZGRyZXNzICcgK1xuICAgICAgdXNlci5nZXQoJ2VtYWlsJykgK1xuICAgICAgJyB3aXRoICcgK1xuICAgICAgYXBwTmFtZSArXG4gICAgICAnXFxuXFxuJyArXG4gICAgICAnJyArXG4gICAgICAnQ2xpY2sgaGVyZSB0byBjb25maXJtIGl0OlxcbicgK1xuICAgICAgbGluaztcbiAgICBjb25zdCB0byA9IHVzZXIuZ2V0KCdlbWFpbCcpO1xuICAgIGNvbnN0IHN1YmplY3QgPSAnUGxlYXNlIHZlcmlmeSB5b3VyIGUtbWFpbCBmb3IgJyArIGFwcE5hbWU7XG4gICAgcmV0dXJuIHsgdGV4dCwgdG8sIHN1YmplY3QgfTtcbiAgfVxuXG4gIGRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwoeyBsaW5rLCB1c2VyLCBhcHBOYW1lIH0pIHtcbiAgICBjb25zdCB0ZXh0ID1cbiAgICAgICdIaSxcXG5cXG4nICtcbiAgICAgICdZb3UgcmVxdWVzdGVkIHRvIHJlc2V0IHlvdXIgcGFzc3dvcmQgZm9yICcgK1xuICAgICAgYXBwTmFtZSArXG4gICAgICAodXNlci5nZXQoJ3VzZXJuYW1lJykgPyBcIiAoeW91ciB1c2VybmFtZSBpcyAnXCIgKyB1c2VyLmdldCgndXNlcm5hbWUnKSArIFwiJylcIiA6ICcnKSArXG4gICAgICAnLlxcblxcbicgK1xuICAgICAgJycgK1xuICAgICAgJ0NsaWNrIGhlcmUgdG8gcmVzZXQgaXQ6XFxuJyArXG4gICAgICBsaW5rO1xuICAgIGNvbnN0IHRvID0gdXNlci5nZXQoJ2VtYWlsJykgfHwgdXNlci5nZXQoJ3VzZXJuYW1lJyk7XG4gICAgY29uc3Qgc3ViamVjdCA9ICdQYXNzd29yZCBSZXNldCBmb3IgJyArIGFwcE5hbWU7XG4gICAgcmV0dXJuIHsgdGV4dCwgdG8sIHN1YmplY3QgfTtcbiAgfVxufVxuXG4vLyBNYXJrIHRoaXMgcHJpdmF0ZVxuZnVuY3Rpb24gdXBkYXRlVXNlclBhc3N3b3JkKHVzZXIsIHBhc3N3b3JkLCBjb25maWcpIHtcbiAgcmV0dXJuIHJlc3RcbiAgICAudXBkYXRlKFxuICAgICAgY29uZmlnLFxuICAgICAgQXV0aC5tYXN0ZXIoY29uZmlnKSxcbiAgICAgICdfVXNlcicsXG4gICAgICB7IG9iamVjdElkOiB1c2VyLm9iamVjdElkIH0sXG4gICAgICB7XG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgIH1cbiAgICApXG4gICAgLnRoZW4oKCkgPT4gdXNlcik7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRW1haWxMaW5rKGRlc3RpbmF0aW9uLCB1c2VybmFtZSwgdG9rZW4sIGNvbmZpZykge1xuICBjb25zdCB1c2VybmFtZUFuZFRva2VuID0gYHRva2VuPSR7dG9rZW59JnVzZXJuYW1lPSR7dXNlcm5hbWV9YDtcblxuICBpZiAoY29uZmlnLnBhcnNlRnJhbWVVUkwpIHtcbiAgICBjb25zdCBkZXN0aW5hdGlvbldpdGhvdXRIb3N0ID0gZGVzdGluYXRpb24ucmVwbGFjZShjb25maWcucHVibGljU2VydmVyVVJMLCAnJyk7XG5cbiAgICByZXR1cm4gYCR7Y29uZmlnLnBhcnNlRnJhbWVVUkx9P2xpbms9JHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBkZXN0aW5hdGlvbldpdGhvdXRIb3N0XG4gICAgKX0mJHt1c2VybmFtZUFuZFRva2VufWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke2Rlc3RpbmF0aW9ufT8ke3VzZXJuYW1lQW5kVG9rZW59YDtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVc2VyQ29udHJvbGxlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUErQjtBQUUvQixJQUFJQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxjQUFjLENBQUM7QUFDdkMsSUFBSUMsSUFBSSxHQUFHRCxPQUFPLENBQUMsU0FBUyxDQUFDO0FBRXRCLE1BQU1FLGNBQWMsU0FBU0MsNEJBQW1CLENBQUM7RUFDdERDLFdBQVcsQ0FBQ0MsT0FBTyxFQUFFQyxLQUFLLEVBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRTtJQUN4QyxLQUFLLENBQUNGLE9BQU8sRUFBRUMsS0FBSyxFQUFFQyxPQUFPLENBQUM7RUFDaEM7RUFFQSxJQUFJQyxNQUFNLEdBQUc7SUFDWCxPQUFPQyxlQUFNLENBQUND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
|