parse-server 6.0.0-alpha.2 → 6.0.0-alpha.21
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/README.md +45 -17
- 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 +46 -87
- 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 +13 -10
- 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 +54 -121
- package/lib/ClientSDK.js +3 -11
- package/lib/Config.js +69 -113
- 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 +147 -345
- 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 +154 -344
- package/lib/Controllers/UserController.js +11 -72
- package/lib/Controllers/index.js +19 -68
- package/lib/Controllers/types.js +1 -1
- package/lib/Deprecator/Deprecations.js +1 -8
- 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 +92 -306
- 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 +79 -10
- package/lib/Options/docs.js +23 -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 +144 -182
- 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 +212 -377
- 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 +58 -155
- 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 -92
- 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 +147 -151
- package/lib/password.js +6 -10
- package/lib/request.js +173 -2
- package/lib/requiredParameter.js +1 -3
- package/lib/rest.js +19 -41
- package/lib/triggers.js +54 -252
- package/lib/vendor/mongodbUrl.js +125 -305
- package/package.json +22 -19
- package/lib/cloud-code/HTTPResponse.js +0 -73
- package/lib/cloud-code/httpRequest.js +0 -192
|
@@ -1,21 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _Utils = _interopRequireDefault(require("../Utils"));
|
|
4
|
-
|
|
5
4
|
var _Check = require("./Check");
|
|
6
|
-
|
|
7
5
|
var CheckGroups = _interopRequireWildcard(require("./CheckGroups/CheckGroups"));
|
|
8
|
-
|
|
9
6
|
var _logger = _interopRequireDefault(require("../logger"));
|
|
10
|
-
|
|
11
7
|
var _lodash = require("lodash");
|
|
12
|
-
|
|
13
8
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
14
|
-
|
|
15
9
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
16
|
-
|
|
17
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
|
-
|
|
19
11
|
/**
|
|
20
12
|
* @module SecurityCheck
|
|
21
13
|
*/
|
|
@@ -33,7 +25,6 @@ class CheckRunner {
|
|
|
33
25
|
*/
|
|
34
26
|
constructor(config = {}) {
|
|
35
27
|
this._validateParams(config);
|
|
36
|
-
|
|
37
28
|
const {
|
|
38
29
|
enableCheck = false,
|
|
39
30
|
enableCheckLog = false,
|
|
@@ -43,33 +34,34 @@ class CheckRunner {
|
|
|
43
34
|
this.enableCheckLog = enableCheckLog;
|
|
44
35
|
this.checkGroups = checkGroups;
|
|
45
36
|
}
|
|
37
|
+
|
|
46
38
|
/**
|
|
47
39
|
* Runs all security checks and returns the results.
|
|
48
40
|
* @params
|
|
49
41
|
* @returns {Object} The security check report.
|
|
50
42
|
*/
|
|
51
|
-
|
|
52
|
-
|
|
53
43
|
async run({
|
|
54
44
|
version = '1.0.0'
|
|
55
45
|
} = {}) {
|
|
56
46
|
// Instantiate check groups
|
|
57
|
-
const groups = Object.values(this.checkGroups).filter(c => typeof c === 'function').map(CheckGroup => new CheckGroup());
|
|
47
|
+
const groups = Object.values(this.checkGroups).filter(c => typeof c === 'function').map(CheckGroup => new CheckGroup());
|
|
58
48
|
|
|
59
|
-
|
|
49
|
+
// Run checks
|
|
50
|
+
groups.forEach(group => group.run());
|
|
60
51
|
|
|
52
|
+
// Generate JSON report
|
|
61
53
|
const report = this._generateReport({
|
|
62
54
|
groups,
|
|
63
55
|
version
|
|
64
|
-
});
|
|
65
|
-
|
|
56
|
+
});
|
|
66
57
|
|
|
58
|
+
// If report should be written to logs
|
|
67
59
|
if (this.enableCheckLog) {
|
|
68
60
|
this._logReport(report);
|
|
69
61
|
}
|
|
70
|
-
|
|
71
62
|
return report;
|
|
72
63
|
}
|
|
64
|
+
|
|
73
65
|
/**
|
|
74
66
|
* Generates a security check report in JSON format with schema:
|
|
75
67
|
* ```
|
|
@@ -98,8 +90,6 @@ class CheckRunner {
|
|
|
98
90
|
* @param {String} params.version: The report schema version.
|
|
99
91
|
* @returns {Object} The report.
|
|
100
92
|
*/
|
|
101
|
-
|
|
102
|
-
|
|
103
93
|
_generateReport({
|
|
104
94
|
groups,
|
|
105
95
|
version
|
|
@@ -111,8 +101,9 @@ class CheckRunner {
|
|
|
111
101
|
state: _Check.CheckState.success,
|
|
112
102
|
groups: []
|
|
113
103
|
}
|
|
114
|
-
};
|
|
104
|
+
};
|
|
115
105
|
|
|
106
|
+
// Identify report version
|
|
116
107
|
switch (version) {
|
|
117
108
|
case '1.0.0':
|
|
118
109
|
default:
|
|
@@ -123,53 +114,49 @@ class CheckRunner {
|
|
|
123
114
|
name: group.name(),
|
|
124
115
|
state: _Check.CheckState.success,
|
|
125
116
|
checks: []
|
|
126
|
-
};
|
|
117
|
+
};
|
|
127
118
|
|
|
119
|
+
// Create check reports
|
|
128
120
|
groupReport.checks = group.checks().map(check => {
|
|
129
121
|
const checkReport = {
|
|
130
122
|
title: check.title,
|
|
131
123
|
state: check.checkState()
|
|
132
124
|
};
|
|
133
|
-
|
|
134
125
|
if (check.checkState() == _Check.CheckState.fail) {
|
|
135
126
|
checkReport.warning = check.warning;
|
|
136
127
|
checkReport.solution = check.solution;
|
|
137
128
|
report.report.state = _Check.CheckState.fail;
|
|
138
129
|
groupReport.state = _Check.CheckState.fail;
|
|
139
130
|
}
|
|
140
|
-
|
|
141
131
|
return checkReport;
|
|
142
132
|
});
|
|
143
133
|
report.report.groups.push(groupReport);
|
|
144
134
|
}
|
|
145
|
-
|
|
146
135
|
}
|
|
147
|
-
|
|
148
136
|
return report;
|
|
149
137
|
}
|
|
138
|
+
|
|
150
139
|
/**
|
|
151
140
|
* Logs the security check report.
|
|
152
141
|
* @param {Object} report The report to log.
|
|
153
142
|
*/
|
|
154
|
-
|
|
155
|
-
|
|
156
143
|
_logReport(report) {
|
|
157
144
|
// Determine log level depending on whether any check failed
|
|
158
|
-
const log = report.report.state == _Check.CheckState.success ? s => _logger.default.info(s) : s => _logger.default.warn(s);
|
|
145
|
+
const log = report.report.state == _Check.CheckState.success ? s => _logger.default.info(s) : s => _logger.default.warn(s);
|
|
159
146
|
|
|
147
|
+
// Declare output
|
|
160
148
|
const indent = ' ';
|
|
161
149
|
let output = '';
|
|
162
150
|
let checksCount = 0;
|
|
163
151
|
let failedChecksCount = 0;
|
|
164
|
-
let skippedCheckCount = 0;
|
|
152
|
+
let skippedCheckCount = 0;
|
|
165
153
|
|
|
154
|
+
// Traverse all groups and checks for compose output
|
|
166
155
|
for (const group of report.report.groups) {
|
|
167
156
|
output += `\n- ${group.name}`;
|
|
168
|
-
|
|
169
157
|
for (const check of group.checks) {
|
|
170
158
|
checksCount++;
|
|
171
159
|
output += `\n${indent}${this._getLogIconForState(check.state)} ${check.title}`;
|
|
172
|
-
|
|
173
160
|
if (check.state == _Check.CheckState.fail) {
|
|
174
161
|
failedChecksCount++;
|
|
175
162
|
output += `\n${indent}${indent}Warning: ${check.warning}`;
|
|
@@ -180,36 +167,32 @@ class CheckRunner {
|
|
|
180
167
|
}
|
|
181
168
|
}
|
|
182
169
|
}
|
|
170
|
+
output = `\n###################################` + `\n# #` + `\n# Parse Server Security Check #` + `\n# #` + `\n###################################` + `\n` + `\n${failedChecksCount > 0 ? 'Warning: ' : ''}${failedChecksCount} weak security setting(s) found${failedChecksCount > 0 ? '!' : ''}` + `\n${checksCount} check(s) executed` + `\n${skippedCheckCount} check(s) skipped` + `\n` + `${output}`;
|
|
183
171
|
|
|
184
|
-
|
|
185
|
-
|
|
172
|
+
// Write log
|
|
186
173
|
log(output);
|
|
187
174
|
}
|
|
175
|
+
|
|
188
176
|
/**
|
|
189
177
|
* Returns an icon for use in the report log output.
|
|
190
178
|
* @param {CheckState} state The check state.
|
|
191
179
|
* @returns {String} The icon.
|
|
192
180
|
*/
|
|
193
|
-
|
|
194
|
-
|
|
195
181
|
_getLogIconForState(state) {
|
|
196
182
|
switch (state) {
|
|
197
183
|
case _Check.CheckState.success:
|
|
198
184
|
return '✅';
|
|
199
|
-
|
|
200
185
|
case _Check.CheckState.fail:
|
|
201
186
|
return '❌';
|
|
202
|
-
|
|
203
187
|
default:
|
|
204
188
|
return 'ℹ️';
|
|
205
189
|
}
|
|
206
190
|
}
|
|
191
|
+
|
|
207
192
|
/**
|
|
208
193
|
* Validates the constructor parameters.
|
|
209
194
|
* @param {Object} params The parameters to validate.
|
|
210
195
|
*/
|
|
211
|
-
|
|
212
|
-
|
|
213
196
|
_validateParams(params) {
|
|
214
197
|
_Utils.default.validateParams(params, {
|
|
215
198
|
enableCheck: {
|
|
@@ -229,8 +212,6 @@ class CheckRunner {
|
|
|
229
212
|
}
|
|
230
213
|
});
|
|
231
214
|
}
|
|
232
|
-
|
|
233
215
|
}
|
|
234
|
-
|
|
235
216
|
module.exports = CheckRunner;
|
|
236
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TZWN1cml0eS9DaGVja1J1bm5lci5qcyJdLCJuYW1lcyI6WyJDaGVja1J1bm5lciIsImNvbnN0cnVjdG9yIiwiY29uZmlnIiwiX3ZhbGlkYXRlUGFyYW1zIiwiZW5hYmxlQ2hlY2siLCJlbmFibGVDaGVja0xvZyIsImNoZWNrR3JvdXBzIiwiQ2hlY2tHcm91cHMiLCJydW4iLCJ2ZXJzaW9uIiwiZ3JvdXBzIiwiT2JqZWN0IiwidmFsdWVzIiwiZmlsdGVyIiwiYyIsIm1hcCIsIkNoZWNrR3JvdXAiLCJmb3JFYWNoIiwiZ3JvdXAiLCJyZXBvcnQiLCJfZ2VuZXJhdGVSZXBvcnQiLCJfbG9nUmVwb3J0Iiwic3RhdGUiLCJDaGVja1N0YXRlIiwic3VjY2VzcyIsImdyb3VwUmVwb3J0IiwibmFtZSIsImNoZWNrcyIsImNoZWNrIiwiY2hlY2tSZXBvcnQiLCJ0aXRsZSIsImNoZWNrU3RhdGUiLCJmYWlsIiwid2FybmluZyIsInNvbHV0aW9uIiwicHVzaCIsImxvZyIsInMiLCJsb2dnZXIiLCJpbmZvIiwid2FybiIsImluZGVudCIsIm91dHB1dCIsImNoZWNrc0NvdW50IiwiZmFpbGVkQ2hlY2tzQ291bnQiLCJza2lwcGVkQ2hlY2tDb3VudCIsIl9nZXRMb2dJY29uRm9yU3RhdGUiLCJub25lIiwicGFyYW1zIiwiVXRpbHMiLCJ2YWxpZGF0ZVBhcmFtcyIsInQiLCJ2IiwiaXNCb29sZWFuIiwibyIsImlzQXJyYXkiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOztBQUlBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7OztBQVJBO0FBQ0E7QUFDQTs7QUFRQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSxXQUFOLENBQWtCO0FBQ2hCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0VDLEVBQUFBLFdBQVcsQ0FBQ0MsTUFBTSxHQUFHLEVBQVYsRUFBYztBQUN2QixTQUFLQyxlQUFMLENBQXFCRCxNQUFyQjs7QUFDQSxVQUFNO0FBQUVFLE1BQUFBLFdBQVcsR0FBRyxLQUFoQjtBQUF1QkMsTUFBQUEsY0FBYyxHQUFHLEtBQXhDO0FBQStDQyxNQUFBQSxXQUFXLEdBQUdDO0FBQTdELFFBQTZFTCxNQUFuRjtBQUNBLFNBQUtFLFdBQUwsR0FBbUJBLFdBQW5CO0FBQ0EsU0FBS0MsY0FBTCxHQUFzQkEsY0FBdEI7QUFDQSxTQUFLQyxXQUFMLEdBQW1CQSxXQUFuQjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7O0FBQ1csUUFBSEUsR0FBRyxDQUFDO0FBQUVDLElBQUFBLE9BQU8sR0FBRztBQUFaLE1BQXdCLEVBQXpCLEVBQTZCO0FBQ3BDO0FBQ0EsVUFBTUMsTUFBTSxHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYyxLQUFLTixXQUFuQixFQUNaTyxNQURZLENBQ0xDLENBQUMsSUFBSSxPQUFPQSxDQUFQLEtBQWEsVUFEYixFQUVaQyxHQUZZLENBRVJDLFVBQVUsSUFBSSxJQUFJQSxVQUFKLEVBRk4sQ0FBZixDQUZvQyxDQU1wQzs7QUFDQU4sSUFBQUEsTUFBTSxDQUFDTyxPQUFQLENBQWVDLEtBQUssSUFBSUEsS0FBSyxDQUFDVixHQUFOLEVBQXhCLEVBUG9DLENBU3BDOztBQUNBLFVBQU1XLE1BQU0sR0FBRyxLQUFLQyxlQUFMLENBQXFCO0FBQUVWLE1BQUFBLE1BQUY7QUFBVUQsTUFBQUE7QUFBVixLQUFyQixDQUFmLENBVm9DLENBWXBDOzs7QUFDQSxRQUFJLEtBQUtKLGNBQVQsRUFBeUI7QUFDdkIsV0FBS2dCLFVBQUwsQ0FBZ0JGLE1BQWhCO0FBQ0Q7O0FBQ0QsV0FBT0EsTUFBUDtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFQyxFQUFBQSxlQUFlLENBQUM7QUFBRVYsSUFBQUEsTUFBRjtBQUFVRCxJQUFBQTtBQUFWLEdBQUQsRUFBc0I7QUFDbkM7QUFDQSxVQUFNVSxNQUFNLEdBQUc7QUFDYkEsTUFBQUEsTUFBTSxFQUFFO0FBQ05WLFFBQUFBLE9BRE07QUFFTmEsUUFBQUEsS0FBSyxFQUFFQyxrQkFBV0MsT0FGWjtBQUdOZCxRQUFBQSxNQUFNLEVBQUU7QUFIRjtBQURLLEtBQWYsQ0FGbUMsQ0FVbkM7O0FBQ0EsWUFBUUQsT0FBUjtBQUNFLFdBQUssT0FBTDtBQUNBO0FBQ0U7QUFDQSxhQUFLLE1BQU1TLEtBQVgsSUFBb0JSLE1BQXBCLEVBQTRCO0FBQzFCO0FBQ0EsZ0JBQU1lLFdBQVcsR0FBRztBQUNsQkMsWUFBQUEsSUFBSSxFQUFFUixLQUFLLENBQUNRLElBQU4sRUFEWTtBQUVsQkosWUFBQUEsS0FBSyxFQUFFQyxrQkFBV0MsT0FGQTtBQUdsQkcsWUFBQUEsTUFBTSxFQUFFO0FBSFUsV0FBcEIsQ0FGMEIsQ0FRMUI7O0FBQ0FGLFVBQUFBLFdBQVcsQ0FBQ0UsTUFBWixHQUFxQlQsS0FBSyxDQUFDUyxNQUFOLEdBQWVaLEdBQWYsQ0FBbUJhLEtBQUssSUFBSTtBQUMvQyxrQkFBTUMsV0FBVyxHQUFHO0FBQ2xCQyxjQUFBQSxLQUFLLEVBQUVGLEtBQUssQ0FBQ0UsS0FESztBQUVsQlIsY0FBQUEsS0FBSyxFQUFFTSxLQUFLLENBQUNHLFVBQU47QUFGVyxhQUFwQjs7QUFJQSxnQkFBSUgsS0FBSyxDQUFDRyxVQUFOLE1BQXNCUixrQkFBV1MsSUFBckMsRUFBMkM7QUFDekNILGNBQUFBLFdBQVcsQ0FBQ0ksT0FBWixHQUFzQkwsS0FBSyxDQUFDSyxPQUE1QjtBQUNBSixjQUFBQSxXQUFXLENBQUNLLFFBQVosR0FBdUJOLEtBQUssQ0FBQ00sUUFBN0I7QUFDQWYsY0FBQUEsTUFBTSxDQUFDQSxNQUFQLENBQWNHLEtBQWQsR0FBc0JDLGtCQUFXUyxJQUFqQztBQUNBUCxjQUFBQSxXQUFXLENBQUNILEtBQVosR0FBb0JDLGtCQUFXUyxJQUEvQjtBQUNEOztBQUNELG1CQUFPSCxXQUFQO0FBQ0QsV0Fab0IsQ0FBckI7QUFjQVYsVUFBQUEsTUFBTSxDQUFDQSxNQUFQLENBQWNULE1BQWQsQ0FBcUJ5QixJQUFyQixDQUEwQlYsV0FBMUI7QUFDRDs7QUE1Qkw7O0FBOEJBLFdBQU9OLE1BQVA7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBOzs7QUFDRUUsRUFBQUEsVUFBVSxDQUFDRixNQUFELEVBQVM7QUFDakI7QUFDQSxVQUFNaUIsR0FBRyxHQUNQakIsTUFBTSxDQUFDQSxNQUFQLENBQWNHLEtBQWQsSUFBdUJDLGtCQUFXQyxPQUFsQyxHQUE0Q2EsQ0FBQyxJQUFJQyxnQkFBT0MsSUFBUCxDQUFZRixDQUFaLENBQWpELEdBQWtFQSxDQUFDLElBQUlDLGdCQUFPRSxJQUFQLENBQVlILENBQVosQ0FEekUsQ0FGaUIsQ0FLakI7O0FBQ0EsVUFBTUksTUFBTSxHQUFHLEtBQWY7QUFDQSxRQUFJQyxNQUFNLEdBQUcsRUFBYjtBQUNBLFFBQUlDLFdBQVcsR0FBRyxDQUFsQjtBQUNBLFFBQUlDLGlCQUFpQixHQUFHLENBQXhCO0FBQ0EsUUFBSUMsaUJBQWlCLEdBQUcsQ0FBeEIsQ0FWaUIsQ0FZakI7O0FBQ0EsU0FBSyxNQUFNM0IsS0FBWCxJQUFvQkMsTUFBTSxDQUFDQSxNQUFQLENBQWNULE1BQWxDLEVBQTBDO0FBQ3hDZ0MsTUFBQUEsTUFBTSxJQUFLLE9BQU14QixLQUFLLENBQUNRLElBQUssRUFBNUI7O0FBRUEsV0FBSyxNQUFNRSxLQUFYLElBQW9CVixLQUFLLENBQUNTLE1BQTFCLEVBQWtDO0FBQ2hDZ0IsUUFBQUEsV0FBVztBQUNYRCxRQUFBQSxNQUFNLElBQUssS0FBSUQsTUFBTyxHQUFFLEtBQUtLLG1CQUFMLENBQXlCbEIsS0FBSyxDQUFDTixLQUEvQixDQUFzQyxJQUFHTSxLQUFLLENBQUNFLEtBQU0sRUFBN0U7O0FBRUEsWUFBSUYsS0FBSyxDQUFDTixLQUFOLElBQWVDLGtCQUFXUyxJQUE5QixFQUFvQztBQUNsQ1ksVUFBQUEsaUJBQWlCO0FBQ2pCRixVQUFBQSxNQUFNLElBQUssS0FBSUQsTUFBTyxHQUFFQSxNQUFPLFlBQVdiLEtBQUssQ0FBQ0ssT0FBUSxFQUF4RDtBQUNBUyxVQUFBQSxNQUFNLElBQUssSUFBR2QsS0FBSyxDQUFDTSxRQUFTLEVBQTdCO0FBQ0QsU0FKRCxNQUlPLElBQUlOLEtBQUssQ0FBQ04sS0FBTixJQUFlQyxrQkFBV3dCLElBQTlCLEVBQW9DO0FBQ3pDRixVQUFBQSxpQkFBaUI7QUFDakJILFVBQUFBLE1BQU0sSUFBSyxLQUFJRCxNQUFPLEdBQUVBLE1BQU8sK0VBQS9CO0FBQ0Q7QUFDRjtBQUNGOztBQUVEQyxJQUFBQSxNQUFNLEdBQ0gsdUNBQUQsR0FDQyx1Q0FERCxHQUVDLHVDQUZELEdBR0MsdUNBSEQsR0FJQyx1Q0FKRCxHQUtDLElBTEQsR0FNQyxLQUNDRSxpQkFBaUIsR0FBRyxDQUFwQixHQUF3QixXQUF4QixHQUFzQyxFQUN2QyxHQUFFQSxpQkFBa0Isa0NBQWlDQSxpQkFBaUIsR0FBRyxDQUFwQixHQUF3QixHQUF4QixHQUE4QixFQUFHLEVBUnZGLEdBU0MsS0FBSUQsV0FBWSxvQkFUakIsR0FVQyxLQUFJRSxpQkFBa0IsbUJBVnZCLEdBV0MsSUFYRCxHQVlDLEdBQUVILE1BQU8sRUFiWixDQS9CaUIsQ0E4Q2pCOztBQUNBTixJQUFBQSxHQUFHLENBQUNNLE1BQUQsQ0FBSDtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VJLEVBQUFBLG1CQUFtQixDQUFDeEIsS0FBRCxFQUFRO0FBQ3pCLFlBQVFBLEtBQVI7QUFDRSxXQUFLQyxrQkFBV0MsT0FBaEI7QUFDRSxlQUFPLEdBQVA7O0FBQ0YsV0FBS0Qsa0JBQVdTLElBQWhCO0FBQ0UsZUFBTyxHQUFQOztBQUNGO0FBQ0UsZUFBTyxJQUFQO0FBTko7QUFRRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBOzs7QUFDRTdCLEVBQUFBLGVBQWUsQ0FBQzZDLE1BQUQsRUFBUztBQUN0QkMsbUJBQU1DLGNBQU4sQ0FBcUJGLE1BQXJCLEVBQTZCO0FBQzNCNUMsTUFBQUEsV0FBVyxFQUFFO0FBQUUrQyxRQUFBQSxDQUFDLEVBQUUsU0FBTDtBQUFnQkMsUUFBQUEsQ0FBQyxFQUFFQyxpQkFBbkI7QUFBOEJDLFFBQUFBLENBQUMsRUFBRTtBQUFqQyxPQURjO0FBRTNCakQsTUFBQUEsY0FBYyxFQUFFO0FBQUU4QyxRQUFBQSxDQUFDLEVBQUUsU0FBTDtBQUFnQkMsUUFBQUEsQ0FBQyxFQUFFQyxpQkFBbkI7QUFBOEJDLFFBQUFBLENBQUMsRUFBRTtBQUFqQyxPQUZXO0FBRzNCaEQsTUFBQUEsV0FBVyxFQUFFO0FBQUU2QyxRQUFBQSxDQUFDLEVBQUUsT0FBTDtBQUFjQyxRQUFBQSxDQUFDLEVBQUVHLGVBQWpCO0FBQTBCRCxRQUFBQSxDQUFDLEVBQUU7QUFBN0I7QUFIYyxLQUE3QjtBQUtEOztBQWhNZTs7QUFtTWxCRSxNQUFNLENBQUNDLE9BQVAsR0FBaUJ6RCxXQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBTZWN1cml0eUNoZWNrXG4gKi9cblxuaW1wb3J0IFV0aWxzIGZyb20gJy4uL1V0aWxzJztcbmltcG9ydCB7IENoZWNrU3RhdGUgfSBmcm9tICcuL0NoZWNrJztcbmltcG9ydCAqIGFzIENoZWNrR3JvdXBzIGZyb20gJy4vQ2hlY2tHcm91cHMvQ2hlY2tHcm91cHMnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNCb29sZWFuIH0gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBUaGUgc2VjdXJpdHkgY2hlY2sgcnVubmVyLlxuICovXG5jbGFzcyBDaGVja1J1bm5lciB7XG4gIC8qKlxuICAgKiBUaGUgc2VjdXJpdHkgY2hlY2sgcnVubmVyLlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbmZpZ10gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHtCb29sZWFufSBbY29uZmlnLmVuYWJsZUNoZWNrPWZhbHNlXSBJcyB0cnVlIGlmIFBhcnNlIFNlcnZlciBzaG91bGQgcmVwb3J0IHdlYWsgc2VjdXJpdHkgc2V0dGluZ3MuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2NvbmZpZy5lbmFibGVDaGVja0xvZz1mYWxzZV0gSXMgdHJ1ZSBpZiB0aGUgc2VjdXJpdHkgY2hlY2sgcmVwb3J0IHNob3VsZCBiZSB3cml0dGVuIHRvIGxvZ3MuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY29uZmlnLmNoZWNrR3JvdXBzXSBUaGUgY2hlY2sgZ3JvdXBzIHRvIHJ1bi4gRGVmYXVsdCBhcmUgdGhlIGdyb3VwcyBkZWZpbmVkIGluIGAuL0NoZWNrR3JvdXBzL0NoZWNrR3JvdXBzLmpzYC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZyA9IHt9KSB7XG4gICAgdGhpcy5fdmFsaWRhdGVQYXJhbXMoY29uZmlnKTtcbiAgICBjb25zdCB7IGVuYWJsZUNoZWNrID0gZmFsc2UsIGVuYWJsZUNoZWNrTG9nID0gZmFsc2UsIGNoZWNrR3JvdXBzID0gQ2hlY2tHcm91cHMgfSA9IGNvbmZpZztcbiAgICB0aGlzLmVuYWJsZUNoZWNrID0gZW5hYmxlQ2hlY2s7XG4gICAgdGhpcy5lbmFibGVDaGVja0xvZyA9IGVuYWJsZUNoZWNrTG9nO1xuICAgIHRoaXMuY2hlY2tHcm91cHMgPSBjaGVja0dyb3VwcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFsbCBzZWN1cml0eSBjaGVja3MgYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuXG4gICAqIEBwYXJhbXNcbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIHNlY3VyaXR5IGNoZWNrIHJlcG9ydC5cbiAgICovXG4gIGFzeW5jIHJ1bih7IHZlcnNpb24gPSAnMS4wLjAnIH0gPSB7fSkge1xuICAgIC8vIEluc3RhbnRpYXRlIGNoZWNrIGdyb3Vwc1xuICAgIGNvbnN0IGdyb3VwcyA9IE9iamVjdC52YWx1ZXModGhpcy5jaGVja0dyb3VwcylcbiAgICAgIC5maWx0ZXIoYyA9PiB0eXBlb2YgYyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIC5tYXAoQ2hlY2tHcm91cCA9PiBuZXcgQ2hlY2tHcm91cCgpKTtcblxuICAgIC8vIFJ1biBjaGVja3NcbiAgICBncm91cHMuZm9yRWFjaChncm91cCA9PiBncm91cC5ydW4oKSk7XG5cbiAgICAvLyBHZW5lcmF0ZSBKU09OIHJlcG9ydFxuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMuX2dlbmVyYXRlUmVwb3J0KHsgZ3JvdXBzLCB2ZXJzaW9uIH0pO1xuXG4gICAgLy8gSWYgcmVwb3J0IHNob3VsZCBiZSB3cml0dGVuIHRvIGxvZ3NcbiAgICBpZiAodGhpcy5lbmFibGVDaGVja0xvZykge1xuICAgICAgdGhpcy5fbG9nUmVwb3J0KHJlcG9ydCk7XG4gICAgfVxuICAgIHJldHVybiByZXBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgc2VjdXJpdHkgY2hlY2sgcmVwb3J0IGluIEpTT04gZm9ybWF0IHdpdGggc2NoZW1hOlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgICByZXBvcnQ6IHtcbiAgICogICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsIC8vIFRoZSByZXBvcnQgdmVyc2lvbiwgZGVmaW5lcyB0aGUgc2NoZW1hXG4gICAqICAgICAgc3RhdGU6IFwiZmFpbFwiICAgICAvLyBUaGUgZGlzanVuY3RpdmUgaW5kaWNhdG9yIG9mIGZhaWxlZCBjaGVja3MgaW4gYWxsIGdyb3Vwcy5cbiAgICogICAgICBncm91cHM6IFsgICAgICAgICAvLyBUaGUgY2hlY2sgZ3JvdXBzXG4gICAqICAgICAgICB7XG4gICAqICAgICAgICAgIG5hbWU6IFwiSG91c2VcIiwgICAgICAgICAgICAvLyBUaGUgZ3JvdXAgbmFtZVxuICAgKiAgICAgICAgICBzdGF0ZTogXCJmYWlsXCIgICAgICAgICAgICAgLy8gVGhlIGRpc2p1bmN0aXZlIGluZGljYXRvciBvZiBmYWlsZWQgY2hlY2tzIGluIHRoaXMgZ3JvdXAuXG4gICAqICAgICAgICAgIGNoZWNrczogWyAgICAgICAgICAgICAgICAgLy8gVGhlIGNoZWNrc1xuICAgKiAgICAgICAgICAgIHRpdGxlOiBcIkRvb3IgbG9ja2VkXCIsICAgLy8gVGhlIGNoZWNrIHRpdGxlXG4gICAqICAgICAgICAgICAgc3RhdGU6IFwiZmFpbFwiICAgICAgICAgICAvLyBUaGUgY2hlY2sgc3RhdGVcbiAgICogICAgICAgICAgICB3YXJuaW5nOiBcIkFueW9uZSBjYW4gZW50ZXIgeW91ciBob3VzZS5cIiAgIC8vIFRoZSB3YXJuaW5nLlxuICAgKiAgICAgICAgICAgIHNvbHV0aW9uOiBcIkxvY2sgeW91ciBkb29yLlwiICAgICAgICAgICAgICAgLy8gVGhlIHNvbHV0aW9uLlxuICAgKiAgICAgICAgICBdXG4gICAqICAgICAgICB9LFxuICAgKiAgICAgICAgLi4uXG4gICAqICAgICAgXVxuICAgKiAgICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7QXJyYXk8Q2hlY2tHcm91cD59IHBhcmFtcy5ncm91cHMgVGhlIGNoZWNrIGdyb3Vwcy5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy52ZXJzaW9uOiBUaGUgcmVwb3J0IHNjaGVtYSB2ZXJzaW9uLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcmVwb3J0LlxuICAgKi9cbiAgX2dlbmVyYXRlUmVwb3J0KHsgZ3JvdXBzLCB2ZXJzaW9uIH0pIHtcbiAgICAvLyBDcmVhdGUgcmVwb3J0IHRlbXBsYXRlXG4gICAgY29uc3QgcmVwb3J0ID0ge1xuICAgICAgcmVwb3J0OiB7XG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHN0YXRlOiBDaGVja1N0YXRlLnN1Y2Nlc3MsXG4gICAgICAgIGdyb3VwczogW10sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBJZGVudGlmeSByZXBvcnQgdmVyc2lvblxuICAgIHN3aXRjaCAodmVyc2lvbikge1xuICAgICAgY2FzZSAnMS4wLjAnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gRm9yIGVhY2ggY2hlY2sgZ3JvdXBcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiBncm91cHMpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgZ3JvdXAgcmVwb3J0XG4gICAgICAgICAgY29uc3QgZ3JvdXBSZXBvcnQgPSB7XG4gICAgICAgICAgICBuYW1lOiBncm91cC5uYW1lKCksXG4gICAgICAgICAgICBzdGF0ZTogQ2hlY2tTdGF0ZS5zdWNjZXNzLFxuICAgICAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGNoZWNrIHJlcG9ydHNcbiAgICAgICAgICBncm91cFJlcG9ydC5jaGVja3MgPSBncm91cC5jaGVja3MoKS5tYXAoY2hlY2sgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tSZXBvcnQgPSB7XG4gICAgICAgICAgICAgIHRpdGxlOiBjaGVjay50aXRsZSxcbiAgICAgICAgICAgICAgc3RhdGU6IGNoZWNrLmNoZWNrU3RhdGUoKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoY2hlY2suY2hlY2tTdGF0ZSgpID09IENoZWNrU3RhdGUuZmFpbCkge1xuICAgICAgICAgICAgICBjaGVja1JlcG9ydC53YXJuaW5nID0gY2hlY2sud2FybmluZztcbiAgICAgICAgICAgICAgY2hlY2tSZXBvcnQuc29sdXRpb24gPSBjaGVjay5zb2x1dGlvbjtcbiAgICAgICAgICAgICAgcmVwb3J0LnJlcG9ydC5zdGF0ZSA9IENoZWNrU3RhdGUuZmFpbDtcbiAgICAgICAgICAgICAgZ3JvdXBSZXBvcnQuc3RhdGUgPSBDaGVja1N0YXRlLmZhaWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2hlY2tSZXBvcnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXBvcnQucmVwb3J0Lmdyb3Vwcy5wdXNoKGdyb3VwUmVwb3J0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgdGhlIHNlY3VyaXR5IGNoZWNrIHJlcG9ydC5cbiAgICogQHBhcmFtIHtPYmplY3R9IHJlcG9ydCBUaGUgcmVwb3J0IHRvIGxvZy5cbiAgICovXG4gIF9sb2dSZXBvcnQocmVwb3J0KSB7XG4gICAgLy8gRGV0ZXJtaW5lIGxvZyBsZXZlbCBkZXBlbmRpbmcgb24gd2hldGhlciBhbnkgY2hlY2sgZmFpbGVkXG4gICAgY29uc3QgbG9nID1cbiAgICAgIHJlcG9ydC5yZXBvcnQuc3RhdGUgPT0gQ2hlY2tTdGF0ZS5zdWNjZXNzID8gcyA9PiBsb2dnZXIuaW5mbyhzKSA6IHMgPT4gbG9nZ2VyLndhcm4ocyk7XG5cbiAgICAvLyBEZWNsYXJlIG91dHB1dFxuICAgIGNvbnN0IGluZGVudCA9ICcgICAnO1xuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICBsZXQgY2hlY2tzQ291bnQgPSAwO1xuICAgIGxldCBmYWlsZWRDaGVja3NDb3VudCA9IDA7XG4gICAgbGV0IHNraXBwZWRDaGVja0NvdW50ID0gMDtcblxuICAgIC8vIFRyYXZlcnNlIGFsbCBncm91cHMgYW5kIGNoZWNrcyBmb3IgY29tcG9zZSBvdXRwdXRcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5yZXBvcnQuZ3JvdXBzKSB7XG4gICAgICBvdXRwdXQgKz0gYFxcbi0gJHtncm91cC5uYW1lfWA7XG5cbiAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgZ3JvdXAuY2hlY2tzKSB7XG4gICAgICAgIGNoZWNrc0NvdW50Kys7XG4gICAgICAgIG91dHB1dCArPSBgXFxuJHtpbmRlbnR9JHt0aGlzLl9nZXRMb2dJY29uRm9yU3RhdGUoY2hlY2suc3RhdGUpfSAke2NoZWNrLnRpdGxlfWA7XG5cbiAgICAgICAgaWYgKGNoZWNrLnN0YXRlID09IENoZWNrU3RhdGUuZmFpbCkge1xuICAgICAgICAgIGZhaWxlZENoZWNrc0NvdW50Kys7XG4gICAgICAgICAgb3V0cHV0ICs9IGBcXG4ke2luZGVudH0ke2luZGVudH1XYXJuaW5nOiAke2NoZWNrLndhcm5pbmd9YDtcbiAgICAgICAgICBvdXRwdXQgKz0gYCAke2NoZWNrLnNvbHV0aW9ufWA7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hlY2suc3RhdGUgPT0gQ2hlY2tTdGF0ZS5ub25lKSB7XG4gICAgICAgICAgc2tpcHBlZENoZWNrQ291bnQrKztcbiAgICAgICAgICBvdXRwdXQgKz0gYFxcbiR7aW5kZW50fSR7aW5kZW50fVRlc3QgZGlkIG5vdCBleGVjdXRlLCB0aGlzIGlzIGxpa2VseSBhbiBpbnRlcm5hbCBzZXJ2ZXIgaXNzdWUsIHBsZWFzZSByZXBvcnQuYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dCA9XG4gICAgICBgXFxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNgICtcbiAgICAgIGBcXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2AgK1xuICAgICAgYFxcbiMgICBQYXJzZSBTZXJ2ZXIgU2VjdXJpdHkgQ2hlY2sgICAjYCArXG4gICAgICBgXFxuIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNgICtcbiAgICAgIGBcXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI2AgK1xuICAgICAgYFxcbmAgK1xuICAgICAgYFxcbiR7XG4gICAgICAgIGZhaWxlZENoZWNrc0NvdW50ID4gMCA/ICdXYXJuaW5nOiAnIDogJydcbiAgICAgIH0ke2ZhaWxlZENoZWNrc0NvdW50fSB3ZWFrIHNlY3VyaXR5IHNldHRpbmcocykgZm91bmQke2ZhaWxlZENoZWNrc0NvdW50ID4gMCA/ICchJyA6ICcnfWAgK1xuICAgICAgYFxcbiR7Y2hlY2tzQ291bnR9IGNoZWNrKHMpIGV4ZWN1dGVkYCArXG4gICAgICBgXFxuJHtza2lwcGVkQ2hlY2tDb3VudH0gY2hlY2socykgc2tpcHBlZGAgK1xuICAgICAgYFxcbmAgK1xuICAgICAgYCR7b3V0cHV0fWA7XG5cbiAgICAvLyBXcml0ZSBsb2dcbiAgICBsb2cob3V0cHV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGljb24gZm9yIHVzZSBpbiB0aGUgcmVwb3J0IGxvZyBvdXRwdXQuXG4gICAqIEBwYXJhbSB7Q2hlY2tTdGF0ZX0gc3RhdGUgVGhlIGNoZWNrIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgaWNvbi5cbiAgICovXG4gIF9nZXRMb2dJY29uRm9yU3RhdGUoc3RhdGUpIHtcbiAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICBjYXNlIENoZWNrU3RhdGUuc3VjY2VzczpcbiAgICAgICAgcmV0dXJuICfinIUnO1xuICAgICAgY2FzZSBDaGVja1N0YXRlLmZhaWw6XG4gICAgICAgIHJldHVybiAn4p2MJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAn4oS577iPJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIHRvIHZhbGlkYXRlLlxuICAgKi9cbiAgX3ZhbGlkYXRlUGFyYW1zKHBhcmFtcykge1xuICAgIFV0aWxzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgZW5hYmxlQ2hlY2s6IHsgdDogJ2Jvb2xlYW4nLCB2OiBpc0Jvb2xlYW4sIG86IHRydWUgfSxcbiAgICAgIGVuYWJsZUNoZWNrTG9nOiB7IHQ6ICdib29sZWFuJywgdjogaXNCb29sZWFuLCBvOiB0cnVlIH0sXG4gICAgICBjaGVja0dyb3VwczogeyB0OiAnYXJyYXknLCB2OiBpc0FycmF5LCBvOiB0cnVlIH0sXG4gICAgfSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDaGVja1J1bm5lcjtcbiJdfQ==
|
|
217
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDaGVja1J1bm5lciIsImNvbnN0cnVjdG9yIiwiY29uZmlnIiwiX3ZhbGlkYXRlUGFyYW1zIiwiZW5hYmxlQ2hlY2siLCJlbmFibGVDaGVja0xvZyIsImNoZWNrR3JvdXBzIiwiQ2hlY2tHcm91cHMiLCJydW4iLCJ2ZXJzaW9uIiwiZ3JvdXBzIiwiT2JqZWN0IiwidmFsdWVzIiwiZmlsdGVyIiwiYyIsIm1hcCIsIkNoZWNrR3JvdXAiLCJmb3JFYWNoIiwiZ3JvdXAiLCJyZXBvcnQiLCJfZ2VuZXJhdGVSZXBvcnQiLCJfbG9nUmVwb3J0Iiwic3RhdGUiLCJDaGVja1N0YXRlIiwic3VjY2VzcyIsImdyb3VwUmVwb3J0IiwibmFtZSIsImNoZWNrcyIsImNoZWNrIiwiY2hlY2tSZXBvcnQiLCJ0aXRsZSIsImNoZWNrU3RhdGUiLCJmYWlsIiwid2FybmluZyIsInNvbHV0aW9uIiwicHVzaCIsImxvZyIsInMiLCJsb2dnZXIiLCJpbmZvIiwid2FybiIsImluZGVudCIsIm91dHB1dCIsImNoZWNrc0NvdW50IiwiZmFpbGVkQ2hlY2tzQ291bnQiLCJza2lwcGVkQ2hlY2tDb3VudCIsIl9nZXRMb2dJY29uRm9yU3RhdGUiLCJub25lIiwicGFyYW1zIiwiVXRpbHMiLCJ2YWxpZGF0ZVBhcmFtcyIsInQiLCJ2IiwiaXNCb29sZWFuIiwibyIsImlzQXJyYXkiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL1NlY3VyaXR5L0NoZWNrUnVubmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBTZWN1cml0eUNoZWNrXG4gKi9cblxuaW1wb3J0IFV0aWxzIGZyb20gJy4uL1V0aWxzJztcbmltcG9ydCB7IENoZWNrU3RhdGUgfSBmcm9tICcuL0NoZWNrJztcbmltcG9ydCAqIGFzIENoZWNrR3JvdXBzIGZyb20gJy4vQ2hlY2tHcm91cHMvQ2hlY2tHcm91cHMnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNCb29sZWFuIH0gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBUaGUgc2VjdXJpdHkgY2hlY2sgcnVubmVyLlxuICovXG5jbGFzcyBDaGVja1J1bm5lciB7XG4gIC8qKlxuICAgKiBUaGUgc2VjdXJpdHkgY2hlY2sgcnVubmVyLlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbmZpZ10gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHtCb29sZWFufSBbY29uZmlnLmVuYWJsZUNoZWNrPWZhbHNlXSBJcyB0cnVlIGlmIFBhcnNlIFNlcnZlciBzaG91bGQgcmVwb3J0IHdlYWsgc2VjdXJpdHkgc2V0dGluZ3MuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2NvbmZpZy5lbmFibGVDaGVja0xvZz1mYWxzZV0gSXMgdHJ1ZSBpZiB0aGUgc2VjdXJpdHkgY2hlY2sgcmVwb3J0IHNob3VsZCBiZSB3cml0dGVuIHRvIGxvZ3MuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY29uZmlnLmNoZWNrR3JvdXBzXSBUaGUgY2hlY2sgZ3JvdXBzIHRvIHJ1bi4gRGVmYXVsdCBhcmUgdGhlIGdyb3VwcyBkZWZpbmVkIGluIGAuL0NoZWNrR3JvdXBzL0NoZWNrR3JvdXBzLmpzYC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZyA9IHt9KSB7XG4gICAgdGhpcy5fdmFsaWRhdGVQYXJhbXMoY29uZmlnKTtcbiAgICBjb25zdCB7IGVuYWJsZUNoZWNrID0gZmFsc2UsIGVuYWJsZUNoZWNrTG9nID0gZmFsc2UsIGNoZWNrR3JvdXBzID0gQ2hlY2tHcm91cHMgfSA9IGNvbmZpZztcbiAgICB0aGlzLmVuYWJsZUNoZWNrID0gZW5hYmxlQ2hlY2s7XG4gICAgdGhpcy5lbmFibGVDaGVja0xvZyA9IGVuYWJsZUNoZWNrTG9nO1xuICAgIHRoaXMuY2hlY2tHcm91cHMgPSBjaGVja0dyb3VwcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFsbCBzZWN1cml0eSBjaGVja3MgYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuXG4gICAqIEBwYXJhbXNcbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIHNlY3VyaXR5IGNoZWNrIHJlcG9ydC5cbiAgICovXG4gIGFzeW5jIHJ1bih7IHZlcnNpb24gPSAnMS4wLjAnIH0gPSB7fSkge1xuICAgIC8vIEluc3RhbnRpYXRlIGNoZWNrIGdyb3Vwc1xuICAgIGNvbnN0IGdyb3VwcyA9IE9iamVjdC52YWx1ZXModGhpcy5jaGVja0dyb3VwcylcbiAgICAgIC5maWx0ZXIoYyA9PiB0eXBlb2YgYyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIC5tYXAoQ2hlY2tHcm91cCA9PiBuZXcgQ2hlY2tHcm91cCgpKTtcblxuICAgIC8vIFJ1biBjaGVja3NcbiAgICBncm91cHMuZm9yRWFjaChncm91cCA9PiBncm91cC5ydW4oKSk7XG5cbiAgICAvLyBHZW5lcmF0ZSBKU09OIHJlcG9ydFxuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMuX2dlbmVyYXRlUmVwb3J0KHsgZ3JvdXBzLCB2ZXJzaW9uIH0pO1xuXG4gICAgLy8gSWYgcmVwb3J0IHNob3VsZCBiZSB3cml0dGVuIHRvIGxvZ3NcbiAgICBpZiAodGhpcy5lbmFibGVDaGVja0xvZykge1xuICAgICAgdGhpcy5fbG9nUmVwb3J0KHJlcG9ydCk7XG4gICAgfVxuICAgIHJldHVybiByZXBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgc2VjdXJpdHkgY2hlY2sgcmVwb3J0IGluIEpTT04gZm9ybWF0IHdpdGggc2NoZW1hOlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgICByZXBvcnQ6IHtcbiAgICogICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsIC8vIFRoZSByZXBvcnQgdmVyc2lvbiwgZGVmaW5lcyB0aGUgc2NoZW1hXG4gICAqICAgICAgc3RhdGU6IFwiZmFpbFwiICAgICAvLyBUaGUgZGlzanVuY3RpdmUgaW5kaWNhdG9yIG9mIGZhaWxlZCBjaGVja3MgaW4gYWxsIGdyb3Vwcy5cbiAgICogICAgICBncm91cHM6IFsgICAgICAgICAvLyBUaGUgY2hlY2sgZ3JvdXBzXG4gICAqICAgICAgICB7XG4gICAqICAgICAgICAgIG5hbWU6IFwiSG91c2VcIiwgICAgICAgICAgICAvLyBUaGUgZ3JvdXAgbmFtZVxuICAgKiAgICAgICAgICBzdGF0ZTogXCJmYWlsXCIgICAgICAgICAgICAgLy8gVGhlIGRpc2p1bmN0aXZlIGluZGljYXRvciBvZiBmYWlsZWQgY2hlY2tzIGluIHRoaXMgZ3JvdXAuXG4gICAqICAgICAgICAgIGNoZWNrczogWyAgICAgICAgICAgICAgICAgLy8gVGhlIGNoZWNrc1xuICAgKiAgICAgICAgICAgIHRpdGxlOiBcIkRvb3IgbG9ja2VkXCIsICAgLy8gVGhlIGNoZWNrIHRpdGxlXG4gICAqICAgICAgICAgICAgc3RhdGU6IFwiZmFpbFwiICAgICAgICAgICAvLyBUaGUgY2hlY2sgc3RhdGVcbiAgICogICAgICAgICAgICB3YXJuaW5nOiBcIkFueW9uZSBjYW4gZW50ZXIgeW91ciBob3VzZS5cIiAgIC8vIFRoZSB3YXJuaW5nLlxuICAgKiAgICAgICAgICAgIHNvbHV0aW9uOiBcIkxvY2sgeW91ciBkb29yLlwiICAgICAgICAgICAgICAgLy8gVGhlIHNvbHV0aW9uLlxuICAgKiAgICAgICAgICBdXG4gICAqICAgICAgICB9LFxuICAgKiAgICAgICAgLi4uXG4gICAqICAgICAgXVxuICAgKiAgICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7QXJyYXk8Q2hlY2tHcm91cD59IHBhcmFtcy5ncm91cHMgVGhlIGNoZWNrIGdyb3Vwcy5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy52ZXJzaW9uOiBUaGUgcmVwb3J0IHNjaGVtYSB2ZXJzaW9uLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcmVwb3J0LlxuICAgKi9cbiAgX2dlbmVyYXRlUmVwb3J0KHsgZ3JvdXBzLCB2ZXJzaW9uIH0pIHtcbiAgICAvLyBDcmVhdGUgcmVwb3J0IHRlbXBsYXRlXG4gICAgY29uc3QgcmVwb3J0ID0ge1xuICAgICAgcmVwb3J0OiB7XG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHN0YXRlOiBDaGVja1N0YXRlLnN1Y2Nlc3MsXG4gICAgICAgIGdyb3VwczogW10sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBJZGVudGlmeSByZXBvcnQgdmVyc2lvblxuICAgIHN3aXRjaCAodmVyc2lvbikge1xuICAgICAgY2FzZSAnMS4wLjAnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gRm9yIGVhY2ggY2hlY2sgZ3JvdXBcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiBncm91cHMpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgZ3JvdXAgcmVwb3J0XG4gICAgICAgICAgY29uc3QgZ3JvdXBSZXBvcnQgPSB7XG4gICAgICAgICAgICBuYW1lOiBncm91cC5uYW1lKCksXG4gICAgICAgICAgICBzdGF0ZTogQ2hlY2tTdGF0ZS5zdWNjZXNzLFxuICAgICAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGNoZWNrIHJlcG9ydHNcbiAgICAgICAgICBncm91cFJlcG9ydC5jaGVja3MgPSBncm91cC5jaGVja3MoKS5tYXAoY2hlY2sgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tSZXBvcnQgPSB7XG4gICAgICAgICAgICAgIHRpdGxlOiBjaGVjay50aXRsZSxcbiAgICAgICAgICAgICAgc3RhdGU6IGNoZWNrLmNoZWNrU3RhdGUoKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoY2hlY2suY2hlY2tTdGF0ZSgpID09IENoZWNrU3RhdGUuZmFpbCkge1xuICAgICAgICAgICAgICBjaGVja1JlcG9ydC53YXJuaW5nID0gY2hlY2sud2FybmluZztcbiAgICAgICAgICAgICAgY2hlY2tSZXBvcnQuc29sdXRpb24gPSBjaGVjay5zb2x1dGlvbjtcbiAgICAgICAgICAgICAgcmVwb3J0LnJlcG9ydC5zdGF0ZSA9IENoZWNrU3RhdGUuZmFpbDtcbiAgICAgICAgICAgICAgZ3JvdXBSZXBvcnQuc3RhdGUgPSBDaGVja1N0YXRlLmZhaWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2hlY2tSZXBvcnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXBvcnQucmVwb3J0Lmdyb3Vwcy5wdXNoKGdyb3VwUmVwb3J0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgdGhlIHNlY3VyaXR5IGNoZWNrIHJlcG9ydC5cbiAgICogQHBhcmFtIHtPYmplY3R9IHJlcG9ydCBUaGUgcmVwb3J0IHRvIGxvZy5cbiAgICovXG4gIF9sb2dSZXBvcnQocmVwb3J0KSB7XG4gICAgLy8gRGV0ZXJtaW5lIGxvZyBsZXZlbCBkZXBlbmRpbmcgb24gd2hldGhlciBhbnkgY2hlY2sgZmFpbGVkXG4gICAgY29uc3QgbG9nID1cbiAgICAgIHJlcG9ydC5yZXBvcnQuc3RhdGUgPT0gQ2hlY2tTdGF0ZS5zdWNjZXNzID8gcyA9PiBsb2dnZXIuaW5mbyhzKSA6IHMgPT4gbG9nZ2VyLndhcm4ocyk7XG5cbiAgICAvLyBEZWNsYXJlIG91dHB1dFxuICAgIGNvbnN0IGluZGVudCA9ICcgICAnO1xuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICBsZXQgY2hlY2tzQ291bnQgPSAwO1xuICAgIGxldCBmYWlsZWRDaGVja3NDb3VudCA9IDA7XG4gICAgbGV0IHNraXBwZWRDaGVja0NvdW50ID0gMDtcblxuICAgIC8vIFRyYXZlcnNlIGFsbCBncm91cHMgYW5kIGNoZWNrcyBmb3IgY29tcG9zZSBvdXRwdXRcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5yZXBvcnQuZ3JvdXBzKSB7XG4gICAgICBvdXRwdXQgKz0gYFxcbi0gJHtncm91cC5uYW1lfWA7XG5cbiAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgZ3JvdXAuY2hlY2tzKSB7XG4gICAgICAgIGNoZWNrc0NvdW50Kys7XG4gICAgICAgIG91dHB1dCArPSBgXFxuJHtpbmRlbnR9JHt0aGlzLl9nZXRMb2dJY29uRm9yU3RhdGUoY2hlY2suc3RhdGUpfSAke2NoZWNrLnRpdGxlfWA7XG5cbiAgICAgICAgaWYgKGNoZWNrLnN0YXRlID09IENoZWNrU3RhdGUuZmFpbCkge1xuICAgICAgICAgIGZhaWxlZENoZWNrc0NvdW50Kys7XG4gICAgICAgICAgb3V0cHV0ICs9IGBcXG4ke2luZGVudH0ke2luZGVudH1XYXJuaW5nOiAke2NoZWNrLndhcm5pbmd9YDtcbiAgICAgICAgICBvdXRwdXQgKz0gYCAke2NoZWNrLnNvbHV0aW9ufWA7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hlY2suc3RhdGUgPT0gQ2hlY2tTdGF0ZS5ub25lKSB7XG4gICAgICAgICAgc2tpcHBlZENoZWNrQ291bnQrKztcbiAgICAgICAgICBvdXRwdXQgKz0gYFxcbiR7aW5kZW50fSR7aW5kZW50fVRlc3QgZGlkIG5vdCBleGVjdXRlLCB0aGlzIGlzIGxpa2VseSBhbiBpbnRlcm5hbCBzZXJ2ZXIgaXNzdWUsIHBsZWFzZSByZXBvcnQuYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dCA9XG4gICAgICBgXFxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNgICtcbiAgICAgIGBcXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2AgK1xuICAgICAgYFxcbiMgICBQYXJzZSBTZXJ2ZXIgU2VjdXJpdHkgQ2hlY2sgICAjYCArXG4gICAgICBgXFxuIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNgICtcbiAgICAgIGBcXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI2AgK1xuICAgICAgYFxcbmAgK1xuICAgICAgYFxcbiR7XG4gICAgICAgIGZhaWxlZENoZWNrc0NvdW50ID4gMCA/ICdXYXJuaW5nOiAnIDogJydcbiAgICAgIH0ke2ZhaWxlZENoZWNrc0NvdW50fSB3ZWFrIHNlY3VyaXR5IHNldHRpbmcocykgZm91bmQke2ZhaWxlZENoZWNrc0NvdW50ID4gMCA/ICchJyA6ICcnfWAgK1xuICAgICAgYFxcbiR7Y2hlY2tzQ291bnR9IGNoZWNrKHMpIGV4ZWN1dGVkYCArXG4gICAgICBgXFxuJHtza2lwcGVkQ2hlY2tDb3VudH0gY2hlY2socykgc2tpcHBlZGAgK1xuICAgICAgYFxcbmAgK1xuICAgICAgYCR7b3V0cHV0fWA7XG5cbiAgICAvLyBXcml0ZSBsb2dcbiAgICBsb2cob3V0cHV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGljb24gZm9yIHVzZSBpbiB0aGUgcmVwb3J0IGxvZyBvdXRwdXQuXG4gICAqIEBwYXJhbSB7Q2hlY2tTdGF0ZX0gc3RhdGUgVGhlIGNoZWNrIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgaWNvbi5cbiAgICovXG4gIF9nZXRMb2dJY29uRm9yU3RhdGUoc3RhdGUpIHtcbiAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICBjYXNlIENoZWNrU3RhdGUuc3VjY2VzczpcbiAgICAgICAgcmV0dXJuICfinIUnO1xuICAgICAgY2FzZSBDaGVja1N0YXRlLmZhaWw6XG4gICAgICAgIHJldHVybiAn4p2MJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAn4oS577iPJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIHRvIHZhbGlkYXRlLlxuICAgKi9cbiAgX3ZhbGlkYXRlUGFyYW1zKHBhcmFtcykge1xuICAgIFV0aWxzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgZW5hYmxlQ2hlY2s6IHsgdDogJ2Jvb2xlYW4nLCB2OiBpc0Jvb2xlYW4sIG86IHRydWUgfSxcbiAgICAgIGVuYWJsZUNoZWNrTG9nOiB7IHQ6ICdib29sZWFuJywgdjogaXNCb29sZWFuLCBvOiB0cnVlIH0sXG4gICAgICBjaGVja0dyb3VwczogeyB0OiAnYXJyYXknLCB2OiBpc0FycmF5LCBvOiB0cnVlIH0sXG4gICAgfSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDaGVja1J1bm5lcjtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQTRDO0FBQUE7QUFBQTtBQVI1QztBQUNBO0FBQ0E7O0FBUUE7QUFDQTtBQUNBO0FBQ0EsTUFBTUEsV0FBVyxDQUFDO0VBQ2hCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0VDLFdBQVcsQ0FBQ0MsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQ3ZCLElBQUksQ0FBQ0MsZUFBZSxDQUFDRCxNQUFNLENBQUM7SUFDNUIsTUFBTTtNQUFFRSxXQUFXLEdBQUcsS0FBSztNQUFFQyxjQUFjLEdBQUcsS0FBSztNQUFFQyxXQUFXLEdBQUdDO0lBQVksQ0FBQyxHQUFHTCxNQUFNO0lBQ3pGLElBQUksQ0FBQ0UsV0FBVyxHQUFHQSxXQUFXO0lBQzlCLElBQUksQ0FBQ0MsY0FBYyxHQUFHQSxjQUFjO0lBQ3BDLElBQUksQ0FBQ0MsV0FBVyxHQUFHQSxXQUFXO0VBQ2hDOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7RUFDRSxNQUFNRSxHQUFHLENBQUM7SUFBRUMsT0FBTyxHQUFHO0VBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQ3BDO0lBQ0EsTUFBTUMsTUFBTSxHQUFHQyxNQUFNLENBQUNDLE1BQU0sQ0FBQyxJQUFJLENBQUNOLFdBQVcsQ0FBQyxDQUMzQ08sTUFBTSxDQUFDQyxDQUFDLElBQUksT0FBT0EsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxDQUNwQ0MsR0FBRyxDQUFDQyxVQUFVLElBQUksSUFBSUEsVUFBVSxFQUFFLENBQUM7O0lBRXRDO0lBQ0FOLE1BQU0sQ0FBQ08sT0FBTyxD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
|