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
|
@@ -4,25 +4,17 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _MongoCollection = _interopRequireDefault(require("./MongoCollection"));
|
|
9
|
-
|
|
10
8
|
var _node = _interopRequireDefault(require("parse/node"));
|
|
11
|
-
|
|
12
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
|
-
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
15
|
-
|
|
10
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
16
11
|
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
17
|
-
|
|
18
12
|
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
19
|
-
|
|
20
|
-
function
|
|
21
|
-
|
|
22
|
-
function
|
|
23
|
-
|
|
24
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
25
|
-
|
|
13
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
14
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
15
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
16
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
17
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
26
18
|
function mongoFieldToParseSchemaField(type) {
|
|
27
19
|
if (type[0] === '*') {
|
|
28
20
|
return {
|
|
@@ -30,79 +22,64 @@ function mongoFieldToParseSchemaField(type) {
|
|
|
30
22
|
targetClass: type.slice(1)
|
|
31
23
|
};
|
|
32
24
|
}
|
|
33
|
-
|
|
34
25
|
if (type.startsWith('relation<')) {
|
|
35
26
|
return {
|
|
36
27
|
type: 'Relation',
|
|
37
28
|
targetClass: type.slice('relation<'.length, type.length - 1)
|
|
38
29
|
};
|
|
39
30
|
}
|
|
40
|
-
|
|
41
31
|
switch (type) {
|
|
42
32
|
case 'number':
|
|
43
33
|
return {
|
|
44
34
|
type: 'Number'
|
|
45
35
|
};
|
|
46
|
-
|
|
47
36
|
case 'string':
|
|
48
37
|
return {
|
|
49
38
|
type: 'String'
|
|
50
39
|
};
|
|
51
|
-
|
|
52
40
|
case 'boolean':
|
|
53
41
|
return {
|
|
54
42
|
type: 'Boolean'
|
|
55
43
|
};
|
|
56
|
-
|
|
57
44
|
case 'date':
|
|
58
45
|
return {
|
|
59
46
|
type: 'Date'
|
|
60
47
|
};
|
|
61
|
-
|
|
62
48
|
case 'map':
|
|
63
49
|
case 'object':
|
|
64
50
|
return {
|
|
65
51
|
type: 'Object'
|
|
66
52
|
};
|
|
67
|
-
|
|
68
53
|
case 'array':
|
|
69
54
|
return {
|
|
70
55
|
type: 'Array'
|
|
71
56
|
};
|
|
72
|
-
|
|
73
57
|
case 'geopoint':
|
|
74
58
|
return {
|
|
75
59
|
type: 'GeoPoint'
|
|
76
60
|
};
|
|
77
|
-
|
|
78
61
|
case 'file':
|
|
79
62
|
return {
|
|
80
63
|
type: 'File'
|
|
81
64
|
};
|
|
82
|
-
|
|
83
65
|
case 'bytes':
|
|
84
66
|
return {
|
|
85
67
|
type: 'Bytes'
|
|
86
68
|
};
|
|
87
|
-
|
|
88
69
|
case 'polygon':
|
|
89
70
|
return {
|
|
90
71
|
type: 'Polygon'
|
|
91
72
|
};
|
|
92
73
|
}
|
|
93
74
|
}
|
|
94
|
-
|
|
95
75
|
const nonFieldSchemaKeys = ['_id', '_metadata', '_client_permissions'];
|
|
96
|
-
|
|
97
76
|
function mongoSchemaFieldsToParseSchemaFields(schema) {
|
|
98
77
|
var fieldNames = Object.keys(schema).filter(key => nonFieldSchemaKeys.indexOf(key) === -1);
|
|
99
78
|
var response = fieldNames.reduce((obj, fieldName) => {
|
|
100
79
|
obj[fieldName] = mongoFieldToParseSchemaField(schema[fieldName]);
|
|
101
|
-
|
|
102
80
|
if (schema._metadata && schema._metadata.fields_options && schema._metadata.fields_options[fieldName]) {
|
|
103
81
|
obj[fieldName] = Object.assign({}, obj[fieldName], schema._metadata.fields_options[fieldName]);
|
|
104
82
|
}
|
|
105
|
-
|
|
106
83
|
return obj;
|
|
107
84
|
}, {});
|
|
108
85
|
response.ACL = {
|
|
@@ -119,7 +96,6 @@ function mongoSchemaFieldsToParseSchemaFields(schema) {
|
|
|
119
96
|
};
|
|
120
97
|
return response;
|
|
121
98
|
}
|
|
122
|
-
|
|
123
99
|
const emptyCLPS = Object.freeze({
|
|
124
100
|
find: {},
|
|
125
101
|
count: {},
|
|
@@ -156,21 +132,17 @@ const defaultCLPS = Object.freeze({
|
|
|
156
132
|
'*': []
|
|
157
133
|
}
|
|
158
134
|
});
|
|
159
|
-
|
|
160
135
|
function mongoSchemaToParseSchema(mongoSchema) {
|
|
161
136
|
let clps = defaultCLPS;
|
|
162
137
|
let indexes = {};
|
|
163
|
-
|
|
164
138
|
if (mongoSchema._metadata) {
|
|
165
139
|
if (mongoSchema._metadata.class_permissions) {
|
|
166
140
|
clps = _objectSpread(_objectSpread({}, emptyCLPS), mongoSchema._metadata.class_permissions);
|
|
167
141
|
}
|
|
168
|
-
|
|
169
142
|
if (mongoSchema._metadata.indexes) {
|
|
170
143
|
indexes = _objectSpread({}, mongoSchema._metadata.indexes);
|
|
171
144
|
}
|
|
172
145
|
}
|
|
173
|
-
|
|
174
146
|
return {
|
|
175
147
|
className: mongoSchema._id,
|
|
176
148
|
fields: mongoSchemaFieldsToParseSchemaFields(mongoSchema),
|
|
@@ -178,23 +150,20 @@ function mongoSchemaToParseSchema(mongoSchema) {
|
|
|
178
150
|
indexes: indexes
|
|
179
151
|
};
|
|
180
152
|
}
|
|
181
|
-
|
|
182
153
|
function _mongoSchemaQueryFromNameQuery(name, query) {
|
|
183
154
|
const object = {
|
|
184
155
|
_id: name
|
|
185
156
|
};
|
|
186
|
-
|
|
187
157
|
if (query) {
|
|
188
158
|
Object.keys(query).forEach(key => {
|
|
189
159
|
object[key] = query[key];
|
|
190
160
|
});
|
|
191
161
|
}
|
|
192
|
-
|
|
193
162
|
return object;
|
|
194
|
-
}
|
|
195
|
-
// Does no validation. That is expected to be done in Parse Server.
|
|
196
|
-
|
|
163
|
+
}
|
|
197
164
|
|
|
165
|
+
// Returns a type suitable for inserting into mongo _SCHEMA collection.
|
|
166
|
+
// Does no validation. That is expected to be done in Parse Server.
|
|
198
167
|
function parseFieldTypeToMongoFieldType({
|
|
199
168
|
type,
|
|
200
169
|
targetClass
|
|
@@ -202,51 +171,37 @@ function parseFieldTypeToMongoFieldType({
|
|
|
202
171
|
switch (type) {
|
|
203
172
|
case 'Pointer':
|
|
204
173
|
return `*${targetClass}`;
|
|
205
|
-
|
|
206
174
|
case 'Relation':
|
|
207
175
|
return `relation<${targetClass}>`;
|
|
208
|
-
|
|
209
176
|
case 'Number':
|
|
210
177
|
return 'number';
|
|
211
|
-
|
|
212
178
|
case 'String':
|
|
213
179
|
return 'string';
|
|
214
|
-
|
|
215
180
|
case 'Boolean':
|
|
216
181
|
return 'boolean';
|
|
217
|
-
|
|
218
182
|
case 'Date':
|
|
219
183
|
return 'date';
|
|
220
|
-
|
|
221
184
|
case 'Object':
|
|
222
185
|
return 'object';
|
|
223
|
-
|
|
224
186
|
case 'Array':
|
|
225
187
|
return 'array';
|
|
226
|
-
|
|
227
188
|
case 'GeoPoint':
|
|
228
189
|
return 'geopoint';
|
|
229
|
-
|
|
230
190
|
case 'File':
|
|
231
191
|
return 'file';
|
|
232
|
-
|
|
233
192
|
case 'Bytes':
|
|
234
193
|
return 'bytes';
|
|
235
|
-
|
|
236
194
|
case 'Polygon':
|
|
237
195
|
return 'polygon';
|
|
238
196
|
}
|
|
239
197
|
}
|
|
240
|
-
|
|
241
198
|
class MongoSchemaCollection {
|
|
242
199
|
constructor(collection) {
|
|
243
200
|
this._collection = collection;
|
|
244
201
|
}
|
|
245
|
-
|
|
246
202
|
_fetchAllSchemasFrom_SCHEMA() {
|
|
247
203
|
return this._collection._rawFind({}).then(schemas => schemas.map(mongoSchemaToParseSchema));
|
|
248
204
|
}
|
|
249
|
-
|
|
250
205
|
_fetchOneSchemaFrom_SCHEMA(name) {
|
|
251
206
|
return this._collection._rawFind(_mongoSchemaQueryFromNameQuery(name), {
|
|
252
207
|
limit: 1
|
|
@@ -257,13 +212,12 @@ class MongoSchemaCollection {
|
|
|
257
212
|
throw undefined;
|
|
258
213
|
}
|
|
259
214
|
});
|
|
260
|
-
}
|
|
261
|
-
|
|
215
|
+
}
|
|
262
216
|
|
|
217
|
+
// Atomically find and delete an object based on query.
|
|
263
218
|
findAndDeleteSchema(name) {
|
|
264
219
|
return this._collection._mongoCollection.findOneAndDelete(_mongoSchemaQueryFromNameQuery(name));
|
|
265
220
|
}
|
|
266
|
-
|
|
267
221
|
insertSchema(schema) {
|
|
268
222
|
return this._collection.insertOne(schema).then(() => mongoSchemaToParseSchema(schema)).catch(error => {
|
|
269
223
|
if (error.code === 11000) {
|
|
@@ -274,39 +228,37 @@ class MongoSchemaCollection {
|
|
|
274
228
|
}
|
|
275
229
|
});
|
|
276
230
|
}
|
|
277
|
-
|
|
278
231
|
updateSchema(name, update) {
|
|
279
232
|
return this._collection.updateOne(_mongoSchemaQueryFromNameQuery(name), update);
|
|
280
233
|
}
|
|
281
|
-
|
|
282
234
|
upsertSchema(name, query, update) {
|
|
283
235
|
return this._collection.upsertOne(_mongoSchemaQueryFromNameQuery(name, query), update);
|
|
284
|
-
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Add a field to the schema. If database does not support the field
|
|
285
239
|
// type (e.g. mongo doesn't support more than one GeoPoint in a class) reject with an "Incorrect Type"
|
|
286
240
|
// Parse error with a desciptive message. If the field already exists, this function must
|
|
287
241
|
// not modify the schema, and must reject with DUPLICATE_VALUE error.
|
|
288
242
|
// If this is called for a class that doesn't exist, this function must create that class.
|
|
243
|
+
|
|
289
244
|
// TODO: throw an error if an unsupported field type is passed. Deciding whether a type is supported
|
|
290
245
|
// should be the job of the adapter. Some adapters may not support GeoPoint at all. Others may
|
|
291
246
|
// Support additional types that Mongo doesn't, like Money, or something.
|
|
292
|
-
// TODO: don't spend an extra query on finding the schema if the type we are trying to add isn't a GeoPoint.
|
|
293
|
-
|
|
294
247
|
|
|
248
|
+
// TODO: don't spend an extra query on finding the schema if the type we are trying to add isn't a GeoPoint.
|
|
295
249
|
addFieldIfNotExists(className, fieldName, fieldType) {
|
|
296
250
|
return this._fetchOneSchemaFrom_SCHEMA(className).then(schema => {
|
|
297
251
|
// If a field with this name already exists, it will be handled elsewhere.
|
|
298
252
|
if (schema.fields[fieldName] !== undefined) {
|
|
299
253
|
return;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
|
|
254
|
+
}
|
|
255
|
+
// The schema exists. Check for existing GeoPoints.
|
|
303
256
|
if (fieldType.type === 'GeoPoint') {
|
|
304
257
|
// Make sure there are not other geopoint fields
|
|
305
258
|
if (Object.keys(schema.fields).some(existingField => schema.fields[existingField].type === 'GeoPoint')) {
|
|
306
259
|
throw new _node.default.Error(_node.default.Error.INCORRECT_TYPE, 'MongoDB only supports one GeoPoint field in a class.');
|
|
307
260
|
}
|
|
308
261
|
}
|
|
309
|
-
|
|
310
262
|
return;
|
|
311
263
|
}, error => {
|
|
312
264
|
// If error is undefined, the schema doesn't exist, and we can create the schema with the field.
|
|
@@ -314,17 +266,15 @@ class MongoSchemaCollection {
|
|
|
314
266
|
if (error === undefined) {
|
|
315
267
|
return;
|
|
316
268
|
}
|
|
317
|
-
|
|
318
269
|
throw error;
|
|
319
270
|
}).then(() => {
|
|
320
271
|
const {
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
272
|
+
type,
|
|
273
|
+
targetClass
|
|
274
|
+
} = fieldType,
|
|
275
|
+
fieldOptions = _objectWithoutProperties(fieldType, ["type", "targetClass"]);
|
|
276
|
+
// We use $exists and $set to avoid overwriting the field type if it
|
|
325
277
|
// already exists. (it could have added inbetween the last query and the update)
|
|
326
|
-
|
|
327
|
-
|
|
328
278
|
if (fieldOptions && Object.keys(fieldOptions).length > 0) {
|
|
329
279
|
return this.upsertSchema(className, {
|
|
330
280
|
[fieldName]: {
|
|
@@ -355,10 +305,8 @@ class MongoSchemaCollection {
|
|
|
355
305
|
}
|
|
356
306
|
});
|
|
357
307
|
}
|
|
358
|
-
|
|
359
308
|
async updateFieldOptions(className, fieldName, fieldType) {
|
|
360
309
|
const fieldOptions = _extends({}, fieldType);
|
|
361
|
-
|
|
362
310
|
delete fieldOptions.type;
|
|
363
311
|
delete fieldOptions.targetClass;
|
|
364
312
|
await this.upsertSchema(className, {
|
|
@@ -371,13 +319,12 @@ class MongoSchemaCollection {
|
|
|
371
319
|
}
|
|
372
320
|
});
|
|
373
321
|
}
|
|
322
|
+
}
|
|
374
323
|
|
|
375
|
-
|
|
324
|
+
// Exported for testing reasons and because we haven't moved all mongo schema format
|
|
376
325
|
// related logic into the database adapter yet.
|
|
377
|
-
|
|
378
|
-
|
|
379
326
|
MongoSchemaCollection._TESTmongoSchemaToParseSchema = mongoSchemaToParseSchema;
|
|
380
327
|
MongoSchemaCollection.parseFieldTypeToMongoFieldType = parseFieldTypeToMongoFieldType;
|
|
381
328
|
var _default = MongoSchemaCollection;
|
|
382
329
|
exports.default = _default;
|
|
383
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BZGFwdGVycy9TdG9yYWdlL01vbmdvL01vbmdvU2NoZW1hQ29sbGVjdGlvbi5qcyJdLCJuYW1lcyI6WyJtb25nb0ZpZWxkVG9QYXJzZVNjaGVtYUZpZWxkIiwidHlwZSIsInRhcmdldENsYXNzIiwic2xpY2UiLCJzdGFydHNXaXRoIiwibGVuZ3RoIiwibm9uRmllbGRTY2hlbWFLZXlzIiwibW9uZ29TY2hlbWFGaWVsZHNUb1BhcnNlU2NoZW1hRmllbGRzIiwic2NoZW1hIiwiZmllbGROYW1lcyIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJrZXkiLCJpbmRleE9mIiwicmVzcG9uc2UiLCJyZWR1Y2UiLCJvYmoiLCJmaWVsZE5hbWUiLCJfbWV0YWRhdGEiLCJmaWVsZHNfb3B0aW9ucyIsImFzc2lnbiIsIkFDTCIsImNyZWF0ZWRBdCIsInVwZGF0ZWRBdCIsIm9iamVjdElkIiwiZW1wdHlDTFBTIiwiZnJlZXplIiwiZmluZCIsImNvdW50IiwiZ2V0IiwiY3JlYXRlIiwidXBkYXRlIiwiZGVsZXRlIiwiYWRkRmllbGQiLCJwcm90ZWN0ZWRGaWVsZHMiLCJkZWZhdWx0Q0xQUyIsIm1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYSIsIm1vbmdvU2NoZW1hIiwiY2xwcyIsImluZGV4ZXMiLCJjbGFzc19wZXJtaXNzaW9ucyIsImNsYXNzTmFtZSIsIl9pZCIsImZpZWxkcyIsImNsYXNzTGV2ZWxQZXJtaXNzaW9ucyIsIl9tb25nb1NjaGVtYVF1ZXJ5RnJvbU5hbWVRdWVyeSIsIm5hbWUiLCJxdWVyeSIsIm9iamVjdCIsImZvckVhY2giLCJwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUiLCJNb25nb1NjaGVtYUNvbGxlY3Rpb24iLCJjb25zdHJ1Y3RvciIsImNvbGxlY3Rpb24iLCJfY29sbGVjdGlvbiIsIl9mZXRjaEFsbFNjaGVtYXNGcm9tX1NDSEVNQSIsIl9yYXdGaW5kIiwidGhlbiIsInNjaGVtYXMiLCJtYXAiLCJfZmV0Y2hPbmVTY2hlbWFGcm9tX1NDSEVNQSIsImxpbWl0IiwicmVzdWx0cyIsInVuZGVmaW5lZCIsImZpbmRBbmREZWxldGVTY2hlbWEiLCJfbW9uZ29Db2xsZWN0aW9uIiwiZmluZE9uZUFuZERlbGV0ZSIsImluc2VydFNjaGVtYSIsImluc2VydE9uZSIsImNhdGNoIiwiZXJyb3IiLCJjb2RlIiwiUGFyc2UiLCJFcnJvciIsIkRVUExJQ0FURV9WQUxVRSIsInVwZGF0ZVNjaGVtYSIsInVwZGF0ZU9uZSIsInVwc2VydFNjaGVtYSIsInVwc2VydE9uZSIsImFkZEZpZWxkSWZOb3RFeGlzdHMiLCJmaWVsZFR5cGUiLCJzb21lIiwiZXhpc3RpbmdGaWVsZCIsIklOQ09SUkVDVF9UWVBFIiwiZmllbGRPcHRpb25zIiwiJGV4aXN0cyIsIiRzZXQiLCJ1cGRhdGVGaWVsZE9wdGlvbnMiLCJfVEVTVG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsU0FBU0EsNEJBQVQsQ0FBc0NDLElBQXRDLEVBQTRDO0FBQzFDLE1BQUlBLElBQUksQ0FBQyxDQUFELENBQUosS0FBWSxHQUFoQixFQUFxQjtBQUNuQixXQUFPO0FBQ0xBLE1BQUFBLElBQUksRUFBRSxTQUREO0FBRUxDLE1BQUFBLFdBQVcsRUFBRUQsSUFBSSxDQUFDRSxLQUFMLENBQVcsQ0FBWDtBQUZSLEtBQVA7QUFJRDs7QUFDRCxNQUFJRixJQUFJLENBQUNHLFVBQUwsQ0FBZ0IsV0FBaEIsQ0FBSixFQUFrQztBQUNoQyxXQUFPO0FBQ0xILE1BQUFBLElBQUksRUFBRSxVQUREO0FBRUxDLE1BQUFBLFdBQVcsRUFBRUQsSUFBSSxDQUFDRSxLQUFMLENBQVcsWUFBWUUsTUFBdkIsRUFBK0JKLElBQUksQ0FBQ0ksTUFBTCxHQUFjLENBQTdDO0FBRlIsS0FBUDtBQUlEOztBQUNELFVBQVFKLElBQVI7QUFDRSxTQUFLLFFBQUw7QUFDRSxhQUFPO0FBQUVBLFFBQUFBLElBQUksRUFBRTtB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Q0FBQztBQUMxQ2xELGNBQUFBLElBRDBDO0FBRTFDQyxjQUFBQTtBQUYwQyxhQUFEO0FBRHZDO0FBRFIsU0FISyxDQUFQO0FBWUQ7QUFDRixLQWhFSSxDQUFQO0FBaUVEOztBQUV1QixRQUFsQnNGLGtCQUFrQixDQUFDOUMsU0FBRCxFQUFvQnhCLFNBQXBCLEVBQXVDK0QsU0FBdkMsRUFBdUQ7QUFDN0UsVUFBV0ksWUFBWCxnQkFBNEJKLFNBQTVCOztBQUNBLFdBQU9JLFlBQVksQ0FBQ3BGLElBQXBCO0FBQ0EsV0FBT29GLFlBQVksQ0FBQ25GLFdBQXBCO0FBRUEsVUFBTSxLQUFLNEUsWUFBTCxDQUNKcEMsU0FESSxFQUVKO0FBQUUsT0FBQ3hCLFNBQUQsR0FBYTtBQUFFb0UsUUFBQUEsT0FBTyxFQUFFO0FBQVg7QUFBZixLQUZJLEVBR0o7QUFDRUMsTUFBQUEsSUFBSSxFQUFFO0FBQ0osU0FBRSw0QkFBMkJyRSxTQUFVLEVBQXZDLEdBQTJDbUU7QUFEdkM7QUFEUixLQUhJLENBQU47QUFTRDs7QUEvSXlCLEMsQ0FrSjVCO0FBQ0E7OztBQUNBakMscUJBQXFCLENBQUNxQyw2QkFBdEIsR0FBc0RwRCx3QkFBdEQ7QUFDQWUscUJBQXFCLENBQUNELDhCQUF0QixHQUF1REEsOEJBQXZEO2VBRWVDLHFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1vbmdvQ29sbGVjdGlvbiBmcm9tICcuL01vbmdvQ29sbGVjdGlvbic7XG5pbXBvcnQgUGFyc2UgZnJvbSAncGFyc2Uvbm9kZSc7XG5cbmZ1bmN0aW9uIG1vbmdvRmllbGRUb1BhcnNlU2NoZW1hRmllbGQodHlwZSkge1xuICBpZiAodHlwZVswXSA9PT0gJyonKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdQb2ludGVyJyxcbiAgICAgIHRhcmdldENsYXNzOiB0eXBlLnNsaWNlKDEpLFxuICAgIH07XG4gIH1cbiAgaWYgKHR5cGUuc3RhcnRzV2l0aCgncmVsYXRpb248JykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1JlbGF0aW9uJyxcbiAgICAgIHRhcmdldENsYXNzOiB0eXBlLnNsaWNlKCdyZWxhdGlvbjwnLmxlbmd0aCwgdHlwZS5sZW5ndGggLSAxKSxcbiAgICB9O1xuICB9XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4geyB0eXBlOiAnTnVtYmVyJyB9O1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4geyB0eXBlOiAnU3RyaW5nJyB9O1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ0Jvb2xlYW4nIH07XG4gICAgY2FzZSAnZGF0ZSc6XG4gICAgICByZXR1cm4geyB0eXBlOiAnRGF0ZScgfTtcbiAgICBjYXNlICdtYXAnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICByZXR1cm4geyB0eXBlOiAnT2JqZWN0JyB9O1xuICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdBcnJheScgfTtcbiAgICBjYXNlICdnZW9wb2ludCc6XG4gICAgICByZXR1cm4geyB0eXBlOiAnR2VvUG9pbnQnIH07XG4gICAgY2FzZSAnZmlsZSc6XG4gICAgICByZXR1cm4geyB0eXBlOiAnRmlsZScgfTtcbiAgICBjYXNlICdieXRlcyc6XG4gICAgICByZXR1cm4geyB0eXBlOiAnQnl0ZXMnIH07XG4gICAgY2FzZSAncG9seWdvbic6XG4gICAgICByZXR1cm4geyB0eXBlOiAnUG9seWdvbicgfTtcbiAgfVxufVxuXG5jb25zdCBub25GaWVsZFNjaGVtYUtleXMgPSBbJ19pZCcsICdfbWV0YWRhdGEnLCAnX2NsaWVudF9wZXJtaXNzaW9ucyddO1xuZnVuY3Rpb24gbW9uZ29TY2hlbWFGaWVsZHNUb1BhcnNlU2NoZW1hRmllbGRzKHNjaGVtYSkge1xuICB2YXIgZmllbGROYW1lcyA9IE9iamVjdC5rZXlzKHNjaGVtYSkuZmlsdGVyKGtleSA9PiBub25GaWVsZFNjaGVtYUtleXMuaW5kZXhPZihrZXkpID09PSAtMSk7XG4gIHZhciByZXNwb25zZSA9IGZpZWxkTmFtZXMucmVkdWNlKChvYmosIGZpZWxkTmFtZSkgPT4ge1xuICAgIG9ialtmaWVsZE5hbWVdID0gbW9uZ29GaWVsZFRvUGFyc2VTY2hlbWFGaWVsZChzY2hlbWFbZmllbGROYW1lXSk7XG4gICAgaWYgKFxuICAgICAgc2NoZW1hLl9tZXRhZGF0YSAmJlxuICAgICAgc2NoZW1hLl9tZXRhZGF0YS5maWVsZHNfb3B0aW9ucyAmJlxuICAgICAgc2NoZW1hLl9tZXRhZGF0YS5maWVsZHNfb3B0aW9uc1tmaWVsZE5hbWVdXG4gICAgKSB7XG4gICAgICBvYmpbZmllbGROYW1lXSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgIHt9LFxuICAgICAgICBvYmpbZmllbGROYW1lXSxcbiAgICAgICAgc2NoZW1hLl9tZXRhZGF0YS5maWVsZHNfb3B0aW9uc1tmaWVsZE5hbWVdXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9LCB7fSk7XG4gIHJlc3BvbnNlLkFDTCA9IHsgdHlwZTogJ0FDTCcgfTtcbiAgcmVzcG9uc2UuY3JlYXRlZEF0ID0geyB0eXBlOiAnRGF0ZScgfTtcbiAgcmVzcG9uc2UudXBkYXRlZEF0ID0geyB0eXBlOiAnRGF0ZScgfTtcbiAgcmVzcG9uc2Uub2JqZWN0SWQgPSB7IHR5cGU6ICdTdHJpbmcnIH07XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuY29uc3QgZW1wdHlDTFBTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGZpbmQ6IHt9LFxuICBjb3VudDoge30sXG4gIGdldDoge30sXG4gIGNyZWF0ZToge30sXG4gIHVwZGF0ZToge30sXG4gIGRlbGV0ZToge30sXG4gIGFkZEZpZWxkOiB7fSxcbiAgcHJvdGVjdGVkRmllbGRzOiB7fSxcbn0pO1xuXG5jb25zdCBkZWZhdWx0Q0xQUyA9IE9iamVjdC5mcmVlemUoe1xuICBmaW5kOiB7ICcqJzogdHJ1ZSB9LFxuICBjb3VudDogeyAnKic6IHRydWUgfSxcbiAgZ2V0OiB7ICcqJzogdHJ1ZSB9LFxuICBjcmVhdGU6IHsgJyonOiB0cnVlIH0sXG4gIHVwZGF0ZTogeyAnKic6IHRydWUgfSxcbiAgZGVsZXRlOiB7ICcqJzogdHJ1ZSB9LFxuICBhZGRGaWVsZDogeyAnKic6IHRydWUgfSxcbiAgcHJvdGVjdGVkRmllbGRzOiB7ICcqJzogW10gfSxcbn0pO1xuXG5mdW5jdGlvbiBtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWEobW9uZ29TY2hlbWEpIHtcbiAgbGV0IGNscHMgPSBkZWZhdWx0Q0xQUztcbiAgbGV0IGluZGV4ZXMgPSB7fTtcbiAgaWYgKG1vbmdvU2NoZW1hLl9tZXRhZGF0YSkge1xuICAgIGlmIChtb25nb1NjaGVtYS5fbWV0YWRhdGEuY2xhc3NfcGVybWlzc2lvbnMpIHtcbiAgICAgIGNscHMgPSB7IC4uLmVtcHR5Q0xQUywgLi4ubW9uZ29TY2hlbWEuX21ldGFkYXRhLmNsYXNzX3Blcm1pc3Npb25zIH07XG4gICAgfVxuICAgIGlmIChtb25nb1NjaGVtYS5fbWV0YWRhdGEuaW5kZXhlcykge1xuICAgICAgaW5kZXhlcyA9IHsgLi4ubW9uZ29TY2hlbWEuX21ldGFkYXRhLmluZGV4ZXMgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjbGFzc05hbWU6IG1vbmdvU2NoZW1hLl9pZCxcbiAgICBmaWVsZHM6IG1vbmdvU2NoZW1hRmllbGRzVG9QYXJzZVNjaGVtYUZpZWxkcyhtb25nb1NjaGVtYSksXG4gICAgY2xhc3NMZXZlbFBlcm1pc3Npb25zOiBjbHBzLFxuICAgIGluZGV4ZXM6IGluZGV4ZXMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9tb25nb1NjaGVtYVF1ZXJ5RnJvbU5hbWVRdWVyeShuYW1lOiBzdHJpbmcsIHF1ZXJ5KSB7XG4gIGNvbnN0IG9iamVjdCA9IHsgX2lkOiBuYW1lIH07XG4gIGlmIChxdWVyeSkge1xuICAgIE9iamVjdC5rZXlzKHF1ZXJ5KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBvYmplY3Rba2V5XSA9IHF1ZXJ5W2tleV07XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuLy8gUmV0dXJucyBhIHR5cGUgc3VpdGFibGUgZm9yIGluc2VydGluZyBpbnRvIG1vbmdvIF9TQ0hFTUEgY29sbGVjdGlvbi5cbi8vIERvZXMgbm8gdmFsaWRhdGlvbi4gVGhhdCBpcyBleHBlY3RlZCB0byBiZSBkb25lIGluIFBhcnNlIFNlcnZlci5cbmZ1bmN0aW9uIHBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSh7IHR5cGUsIHRhcmdldENsYXNzIH0pIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnUG9pbnRlcic6XG4gICAgICByZXR1cm4gYCoke3RhcmdldENsYXNzfWA7XG4gICAgY2FzZSAnUmVsYXRpb24nOlxuICAgICAgcmV0dXJuIGByZWxhdGlvbjwke3RhcmdldENsYXNzfT5gO1xuICAgIGNhc2UgJ051bWJlcic6XG4gICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICBjYXNlICdCb29sZWFuJzpcbiAgICAgIHJldHVybiAnYm9vbGVhbic7XG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICByZXR1cm4gJ2RhdGUnO1xuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICByZXR1cm4gJ29iamVjdCc7XG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuICdhcnJheSc7XG4gICAgY2FzZSAnR2VvUG9pbnQnOlxuICAgICAgcmV0dXJuICdnZW9wb2ludCc7XG4gICAgY2FzZSAnRmlsZSc6XG4gICAgICByZXR1cm4gJ2ZpbGUnO1xuICAgIGNhc2UgJ0J5dGVzJzpcbiAgICAgIHJldHVybiAnYnl0ZXMnO1xuICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgICAgcmV0dXJuICdwb2x5Z29uJztcbiAgfVxufVxuXG5jbGFzcyBNb25nb1NjaGVtYUNvbGxlY3Rpb24ge1xuICBfY29sbGVjdGlvbjogTW9uZ29Db2xsZWN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKGNvbGxlY3Rpb246IE1vbmdvQ29sbGVjdGlvbikge1xuICAgIHRoaXMuX2NvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xuICB9XG5cbiAgX2ZldGNoQWxsU2NoZW1hc0Zyb21fU0NIRU1BKCkge1xuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uLl9yYXdGaW5kKHt9KS50aGVuKHNjaGVtYXMgPT4gc2NoZW1hcy5tYXAobW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hKSk7XG4gIH1cblxuICBfZmV0Y2hPbmVTY2hlbWFGcm9tX1NDSEVNQShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvblxuICAgICAgLl9yYXdGaW5kKF9tb25nb1NjaGVtYVF1ZXJ5RnJvbU5hbWVRdWVyeShuYW1lKSwgeyBsaW1pdDogMSB9KVxuICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWEocmVzdWx0c1swXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIEF0b21pY2FsbHkgZmluZCBhbmQgZGVsZXRlIGFuIG9iamVjdCBiYXNlZCBvbiBxdWVyeS5cbiAgZmluZEFuZERlbGV0ZVNjaGVtYShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbi5fbW9uZ29Db2xsZWN0aW9uLmZpbmRPbmVBbmREZWxldGUoX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWUpKTtcbiAgfVxuXG4gIGluc2VydFNjaGVtYShzY2hlbWE6IGFueSkge1xuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uXG4gICAgICAuaW5zZXJ0T25lKHNjaGVtYSlcbiAgICAgIC50aGVuKCgpID0+IG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYShzY2hlbWEpKVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IDExMDAwKSB7XG4gICAgICAgICAgLy9Nb25nbydzIGR1cGxpY2F0ZSBrZXkgZXJyb3JcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuRFVQTElDQVRFX1ZBTFVFLCAnQ2xhc3MgYWxyZWFkeSBleGlzdHMuJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlU2NoZW1hKG5hbWU6IHN0cmluZywgdXBkYXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb24udXBkYXRlT25lKF9tb25nb1NjaGVtYVF1ZXJ5RnJvbU5hbWVRdWVyeShuYW1lKSwgdXBkYXRlKTtcbiAgfVxuXG4gIHVwc2VydFNjaGVtYShuYW1lOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcsIHVwZGF0ZSkge1xuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uLnVwc2VydE9uZShfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkobmFtZSwgcXVlcnkpLCB1cGRhdGUpO1xuICB9XG5cbiAgLy8gQWRkIGEgZmllbGQgdG8gdGhlIHNjaGVtYS4gSWYgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZmllbGRcbiAgLy8gdHlwZSAoZS5nLiBtb25nbyBkb2Vzbid0IHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBHZW9Qb2ludCBpbiBhIGNsYXNzKSByZWplY3Qgd2l0aCBhbiBcIkluY29ycmVjdCBUeXBlXCJcbiAgLy8gUGFyc2UgZXJyb3Igd2l0aCBhIGRlc2NpcHRpdmUgbWVzc2FnZS4gSWYgdGhlIGZpZWxkIGFscmVhZHkgZXhpc3RzLCB0aGlzIGZ1bmN0aW9uIG11c3RcbiAgLy8gbm90IG1vZGlmeSB0aGUgc2NoZW1hLCBhbmQgbXVzdCByZWplY3Qgd2l0aCBEVVBMSUNBVEVfVkFMVUUgZXJyb3IuXG4gIC8vIElmIHRoaXMgaXMgY2FsbGVkIGZvciBhIGNsYXNzIHRoYXQgZG9lc24ndCBleGlzdCwgdGhpcyBmdW5jdGlvbiBtdXN0IGNyZWF0ZSB0aGF0IGNsYXNzLlxuXG4gIC8vIFRPRE86IHRocm93IGFuIGVycm9yIGlmIGFuIHVuc3VwcG9ydGVkIGZpZWxkIHR5cGUgaXMgcGFzc2VkLiBEZWNpZGluZyB3aGV0aGVyIGEgdHlwZSBpcyBzdXBwb3J0ZWRcbiAgLy8gc2hvdWxkIGJlIHRoZSBqb2Igb2YgdGhlIGFkYXB0ZXIuIFNvbWUgYWRhcHRlcnMgbWF5IG5vdCBzdXBwb3J0IEdlb1BvaW50IGF0IGFsbC4gT3RoZXJzIG1heVxuICAvLyBTdXBwb3J0IGFkZGl0aW9uYWwgdHlwZXMgdGhhdCBNb25nbyBkb2Vzbid0LCBsaWtlIE1vbmV5LCBvciBzb21ldGhpbmcuXG5cbiAgLy8gVE9ETzogZG9uJ3Qgc3BlbmQgYW4gZXh0cmEgcXVlcnkgb24gZmluZGluZyB0aGUgc2NoZW1hIGlmIHRoZSB0eXBlIHdlIGFyZSB0cnlpbmcgdG8gYWRkIGlzbid0IGEgR2VvUG9pbnQuXG4gIGFkZEZpZWxkSWZOb3RFeGlzdHMoY2xhc3NOYW1lOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nLCBmaWVsZFR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mZXRjaE9uZVNjaGVtYUZyb21fU0NIRU1BKGNsYXNzTmFtZSlcbiAgICAgIC50aGVuKFxuICAgICAgICBzY2hlbWEgPT4ge1xuICAgICAgICAgIC8vIElmIGEgZmllbGQgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgaGFuZGxlZCBlbHNld2hlcmUuXG4gICAgICAgICAgaWYgKHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRoZSBzY2hlbWEgZXhpc3RzLiBDaGVjayBmb3IgZXhpc3RpbmcgR2VvUG9pbnRzLlxuICAgICAgICAgIGlmIChmaWVsZFR5cGUudHlwZSA9PT0gJ0dlb1BvaW50Jykge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIGFyZSBub3Qgb3RoZXIgZ2VvcG9pbnQgZmllbGRzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHNjaGVtYS5maWVsZHMpLnNvbWUoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdGaWVsZCA9PiBzY2hlbWEuZmllbGRzW2V4aXN0aW5nRmllbGRdLnR5cGUgPT09ICdHZW9Qb2ludCdcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5JTkNPUlJFQ1RfVFlQRSxcbiAgICAgICAgICAgICAgICAnTW9uZ29EQiBvbmx5IHN1cHBvcnRzIG9uZSBHZW9Qb2ludCBmaWVsZCBpbiBhIGNsYXNzLidcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgLy8gSWYgZXJyb3IgaXMgdW5kZWZpbmVkLCB0aGUgc2NoZW1hIGRvZXNuJ3QgZXhpc3QsIGFuZCB3ZSBjYW4gY3JlYXRlIHRoZSBzY2hlbWEgd2l0aCB0aGUgZmllbGQuXG4gICAgICAgICAgLy8gSWYgc29tZSBvdGhlciBlcnJvciwgcmVqZWN0IHdpdGggaXQuXG4gICAgICAgICAgaWYgKGVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgeyB0eXBlLCB0YXJnZXRDbGFzcywgLi4uZmllbGRPcHRpb25zIH0gPSBmaWVsZFR5cGU7XG4gICAgICAgIC8vIFdlIHVzZSAkZXhpc3RzIGFuZCAkc2V0IHRvIGF2b2lkIG92ZXJ3cml0aW5nIHRoZSBmaWVsZCB0eXBlIGlmIGl0XG4gICAgICAgIC8vIGFscmVhZHkgZXhpc3RzLiAoaXQgY291bGQgaGF2ZSBhZGRlZCBpbmJldHdlZW4gdGhlIGxhc3QgcXVlcnkgYW5kIHRoZSB1cGRhdGUpXG4gICAgICAgIGlmIChmaWVsZE9wdGlvbnMgJiYgT2JqZWN0LmtleXMoZmllbGRPcHRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudXBzZXJ0U2NoZW1hKFxuICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgeyBbZmllbGROYW1lXTogeyAkZXhpc3RzOiBmYWxzZSB9IH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICRzZXQ6IHtcbiAgICAgICAgICAgICAgICBbZmllbGROYW1lXTogcGFyc2VGaWVsZFR5cGVUb01vbmdvRmllbGRUeXBlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICB0YXJnZXRDbGFzcyxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBbYF9tZXRhZGF0YS5maWVsZHNfb3B0aW9ucy4ke2ZpZWxkTmFtZX1gXTogZmllbGRPcHRpb25zLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudXBzZXJ0U2NoZW1hKFxuICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgeyBbZmllbGROYW1lXTogeyAkZXhpc3RzOiBmYWxzZSB9IH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICRzZXQ6IHtcbiAgICAgICAgICAgICAgICBbZmllbGROYW1lXTogcGFyc2VGaWVsZFR5cGVUb01vbmdvRmllbGRUeXBlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICB0YXJnZXRDbGFzcyxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpZWxkT3B0aW9ucyhjbGFzc05hbWU6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcsIGZpZWxkVHlwZTogYW55KSB7XG4gICAgY29uc3QgeyAuLi5maWVsZE9wdGlvbnMgfSA9IGZpZWxkVHlwZTtcbiAgICBkZWxldGUgZmllbGRPcHRpb25zLnR5cGU7XG4gICAgZGVsZXRlIGZpZWxkT3B0aW9ucy50YXJnZXRDbGFzcztcblxuICAgIGF3YWl0IHRoaXMudXBzZXJ0U2NoZW1hKFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgeyBbZmllbGROYW1lXTogeyAkZXhpc3RzOiB0cnVlIH0gfSxcbiAgICAgIHtcbiAgICAgICAgJHNldDoge1xuICAgICAgICAgIFtgX21ldGFkYXRhLmZpZWxkc19vcHRpb25zLiR7ZmllbGROYW1lfWBdOiBmaWVsZE9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vLyBFeHBvcnRlZCBmb3IgdGVzdGluZyByZWFzb25zIGFuZCBiZWNhdXNlIHdlIGhhdmVuJ3QgbW92ZWQgYWxsIG1vbmdvIHNjaGVtYSBmb3JtYXRcbi8vIHJlbGF0ZWQgbG9naWMgaW50byB0aGUgZGF0YWJhc2UgYWRhcHRlciB5ZXQuXG5Nb25nb1NjaGVtYUNvbGxlY3Rpb24uX1RFU1Rtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWEgPSBtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWE7XG5Nb25nb1NjaGVtYUNvbGxlY3Rpb24ucGFyc2VGaWVsZFR5cGVUb01vbmdvRmllbGRUeXBlID0gcGFyc2VGaWVsZFR5cGVUb01vbmdvRmllbGRUeXBlO1xuXG5leHBvcnQgZGVmYXVsdCBNb25nb1NjaGVtYUNvbGxlY3Rpb247XG4iXX0=
|
|
330
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb25nb0ZpZWxkVG9QYXJzZVNjaGVtYUZpZWxkIiwidHlwZSIsInRhcmdldENsYXNzIiwic2xpY2UiLCJzdGFydHNXaXRoIiwibGVuZ3RoIiwibm9uRmllbGRTY2hlbWFLZXlzIiwibW9uZ29TY2hlbWFGaWVsZHNUb1BhcnNlU2NoZW1hRmllbGRzIiwic2NoZW1hIiwiZmllbGROYW1lcyIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJrZXkiLCJpbmRleE9mIiwicmVzcG9uc2UiLCJyZWR1Y2UiLCJvYmoiLCJmaWVsZE5hbWUiLCJfbWV0YWRhdGEiLCJmaWVsZHNfb3B0aW9ucyIsImFzc2lnbiIsIkFDTCIsImNyZWF0ZWRBdCIsInVwZGF0ZWRBdCIsIm9iamVjdElkIiwiZW1wdHlDTFBTIiwiZnJlZXplIiwiZmluZCIsImNvdW50IiwiZ2V0IiwiY3JlYXRlIiwidXBkYXRlIiwiZGVsZXRlIiwiYWRkRmllbGQiLCJwcm90ZWN0ZWRGaWVsZHMiLCJkZWZhdWx0Q0xQUyIsIm1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYSIsIm1vbmdvU2NoZW1hIiwiY2xwcyIsImluZGV4ZXMiLCJjbGFzc19wZXJtaXNzaW9ucyIsImNsYXNzTmFtZSIsIl9pZCIsImZpZWxkcyIsImNsYXNzTGV2ZWxQZXJtaXNzaW9ucyIsIl9tb25nb1NjaGVtYVF1ZXJ5RnJvbU5hbWVRdWVyeSIsIm5hbWUiLCJxdWVyeSIsIm9iamVjdCIsImZvckVhY2giLCJwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUiLCJNb25nb1NjaGVtYUNvbGxlY3Rpb24iLCJjb25zdHJ1Y3RvciIsImNvbGxlY3Rpb24iLCJfY29sbGVjdGlvbiIsIl9mZXRjaEFsbFNjaGVtYXNGcm9tX1NDSEVNQSIsIl9yYXdGaW5kIiwidGhlbiIsInNjaGVtYXMiLCJtYXAiLCJfZmV0Y2hPbmVTY2hlbWFGcm9tX1NDSEVNQSIsImxpbWl0IiwicmVzdWx0cyIsInVuZGVmaW5lZCIsImZpbmRBbmREZWxldGVTY2hlbWEiLCJfbW9uZ29Db2xsZWN0aW9uIiwiZmluZE9uZUFuZERlbGV0ZSIsImluc2VydFNjaGVtYSIsImluc2VydE9uZSIsImNhdGNoIiwiZXJyb3IiLCJjb2RlIiwiUGFyc2UiLCJFcnJvciIsIkRVUExJQ0FURV9WQUxVRSIsInVwZGF0ZVNjaGVtYSIsInVwZGF0ZU9uZSIsInVwc2VydFNjaGVtYSIsInVwc2VydE9uZSIsImFkZEZpZWxkSWZOb3RFeGlzdHMiLCJmaWVsZFR5cGUiLCJzb21lIiwiZXhpc3RpbmdGaWVsZCIsIklOQ09SUkVDVF9UWVBFIiwiZmllbGRPcHRpb25zIiwiJGV4aXN0cyIsIiRzZXQiLCJ1cGRhdGVGaWVsZE9wdGlvbnMiLCJfVEVTVG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BZGFwdGVycy9TdG9yYWdlL01vbmdvL01vbmdvU2NoZW1hQ29sbGVjdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTW9uZ29Db2xsZWN0aW9uIGZyb20gJy4vTW9uZ29Db2xsZWN0aW9uJztcbmltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcblxuZnVuY3Rpb24gbW9uZ29GaWVsZFRvUGFyc2VTY2hlbWFGaWVsZCh0eXBlKSB7XG4gIGlmICh0eXBlWzBdID09PSAnKicpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1BvaW50ZXInLFxuICAgICAgdGFyZ2V0Q2xhc3M6IHR5cGUuc2xpY2UoMSksXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZS5zdGFydHNXaXRoKCdyZWxhdGlvbjwnKSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnUmVsYXRpb24nLFxuICAgICAgdGFyZ2V0Q2xhc3M6IHR5cGUuc2xpY2UoJ3JlbGF0aW9uPCcubGVuZ3RoLCB0eXBlLmxlbmd0aCAtIDEpLFxuICAgIH07XG4gIH1cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdOdW1iZXInIH07XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdTdHJpbmcnIH07XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4geyB0eXBlOiAnQm9vbGVhbicgfTtcbiAgICBjYXNlICdkYXRlJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdEYXRlJyB9O1xuICAgIGNhc2UgJ21hcCc6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdPYmplY3QnIH07XG4gICAgY2FzZSAnYXJyYXknOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ0FycmF5JyB9O1xuICAgIGNhc2UgJ2dlb3BvaW50JzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdHZW9Qb2ludCcgfTtcbiAgICBjYXNlICdmaWxlJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdGaWxlJyB9O1xuICAgIGNhc2UgJ2J5dGVzJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdCeXRlcycgfTtcbiAgICBjYXNlICdwb2x5Z29uJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdQb2x5Z29uJyB9O1xuICB9XG59XG5cbmNvbnN0IG5vbkZpZWxkU2NoZW1hS2V5cyA9IFsnX2lkJywgJ19tZXRhZGF0YScsICdfY2xpZW50X3Blcm1pc3Npb25zJ107XG5mdW5jdGlvbiBtb25nb1NjaGVtYUZpZWxkc1RvUGFyc2VTY2hlbWFGaWVsZHMoc2NoZW1hKSB7XG4gIHZhciBmaWVsZE5hbWVzID0gT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoa2V5ID0+IG5vbkZpZWxkU2NoZW1hS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKTtcbiAgdmFyIHJlc3BvbnNlID0gZmllbGROYW1lcy5yZWR1Y2UoKG9iaiwgZmllbGROYW1lKSA9PiB7XG4gICAgb2JqW2ZpZWxkTmFtZV0gPSBtb25nb0ZpZWxkVG9QYXJzZVNjaGVtYUZpZWxkKHNjaGVtYVtmaWVsZE5hbWVdKTtcbiAgICBpZiAoXG4gICAgICBzY2hlbWEuX21ldGFkYXRhICYmXG4gICAgICBzY2hlbWEuX21ldGFkYXRhLmZpZWxkc19vcHRpb25zICYmXG4gICAgICBzY2hlbWEuX21ldGFkYXRhLmZpZWxkc19vcHRpb25zW2ZpZWxkTmFtZV1cbiAgICApIHtcbiAgICAgIG9ialtmaWVsZE5hbWVdID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIG9ialtmaWVsZE5hbWVdLFxuICAgICAgICBzY2hlbWEuX21ldGFkYXRhLmZpZWxkc19vcHRpb25zW2ZpZWxkTmFtZV1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcbiAgcmVzcG9uc2UuQUNMID0geyB0eXBlOiAnQUNMJyB9O1xuICByZXNwb25zZS5jcmVhdGVkQXQgPSB7IHR5cGU6ICdEYXRlJyB9O1xuICByZXNwb25zZS51cGRhdGVkQXQgPSB7IHR5cGU6ICdEYXRlJyB9O1xuICByZXNwb25zZS5vYmplY3RJZCA9IHsgdHlwZTogJ1N0cmluZycgfTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5jb25zdCBlbXB0eUNMUFMgPSBPYmplY3QuZnJlZXplKHtcbiAgZmluZDoge30sXG4gIGNvdW50OiB7fSxcbiAgZ2V0OiB7fSxcbiAgY3JlYXRlOiB7fSxcbiAgdXBkYXRlOiB7fSxcbiAgZGVsZXRlOiB7fSxcbiAgYWRkRmllbGQ6IHt9LFxuICBwcm90ZWN0ZWRGaWVsZHM6IHt9LFxufSk7XG5cbmNvbnN0IGRlZmF1bHRDTFBTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGZpbmQ6IHsgJyonOiB0cnVlIH0sXG4gIGNvdW50OiB7ICcqJzogdHJ1ZSB9LFxuICBnZXQ6IHsgJyonOiB0cnVlIH0sXG4gIGNyZWF0ZTogeyAnKic6IHRydWUgfSxcbiAgdXBkYXRlOiB7ICcqJzogdHJ1ZSB9LFxuICBkZWxldGU6IHsgJyonOiB0cnVlIH0sXG4gIGFkZEZpZWxkOiB7ICcqJzogdHJ1ZSB9LFxuICBwcm90ZWN0ZWRGaWVsZHM6IHsgJyonOiBbXSB9LFxufSk7XG5cbmZ1bmN0aW9uIG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYShtb25nb1NjaGVtYSkge1xuICBsZXQgY2xwcyA9IGRlZmF1bHRDTFBTO1xuICBsZXQgaW5kZXhlcyA9IHt9O1xuICBpZiAobW9uZ29TY2hlbWEuX21ldGFkYXRhKSB7XG4gICAgaWYgKG1vbmdvU2NoZW1hLl9tZXRhZGF0YS5jbGFzc19wZXJtaXNzaW9ucykge1xuICAgICAgY2xwcyA9IHsgLi4uZW1wdHlDTFBTLCAuLi5tb25nb1NjaGVtYS5fbWV0YWRhdGEuY2xhc3NfcGVybWlzc2lvbnMgfTtcbiAgICB9XG4gICAgaWYgKG1vbmdvU2NoZW1hLl9tZXRhZGF0YS5pbmRleGVzKSB7XG4gICAgICBpbmRleGVzID0geyAuLi5tb25nb1NjaGVtYS5fbWV0YWRhdGEuaW5kZXhlcyB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGNsYXNzTmFtZTogbW9uZ29TY2hlbWEuX2lkLFxuICAgIGZpZWxkczogbW9uZ29TY2hlbWFGaWVsZHNUb1BhcnNlU2NoZW1hRmllbGRzKG1vbmdvU2NoZW1hKSxcbiAgICBjbGFzc0xldmVsUGVybWlzc2lvbnM6IGNscHMsXG4gICAgaW5kZXhlczogaW5kZXhlcyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWU6IHN0cmluZywgcXVlcnkpIHtcbiAgY29uc3Qgb2JqZWN0ID0geyBfaWQ6IG5hbWUgfTtcbiAgaWYgKHF1ZXJ5KSB7XG4gICAgT2JqZWN0LmtleXMocXVlcnkpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIG9iamVjdFtrZXldID0gcXVlcnlba2V5XTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG4vLyBSZXR1cm5zIGEgdHlwZSBzdWl0YWJsZSBmb3IgaW5zZXJ0aW5nIGludG8gbW9uZ28gX1NDSEVNQSBjb2xsZWN0aW9uLlxuLy8gRG9lcyBubyB2YWxpZGF0aW9uLiBUaGF0IGlzIGV4cGVjdGVkIHRvIGJlIGRvbmUgaW4gUGFyc2UgU2VydmVyLlxuZnVuY3Rpb24gcGFyc2VGaWVsZFR5cGVUb01vbmdvRmllbGRUeXBlKHsgdHlwZSwgdGFyZ2V0Q2xhc3MgfSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdQb2ludGVyJzpcbiAgICAgIHJldHVybiBgKiR7dGFyZ2V0Q2xhc3N9YDtcbiAgICBjYXNlICdSZWxhdGlvbic6XG4gICAgICByZXR1cm4gYHJlbGF0aW9uPCR7dGFyZ2V0Q2xhc3N9PmA7XG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICByZXR1cm4gJ2FycmF5JztcbiAgICBjYXNlICdHZW9Qb2ludCc6XG4gICAgICByZXR1cm4gJ2dlb3BvaW50JztcbiAgICBjYXNlICdGaWxlJzpcbiAgICAgIHJldHVybiAnZmlsZSc7XG4gICAgY2FzZSAnQnl0ZXMnOlxuICAgICAgcmV0dXJuICdieXRlcyc7XG4gICAgY2FzZSAnUG9seWdvbic6XG4gICAgICByZXR1cm4gJ3BvbHlnb24nO1xuICB9XG59XG5cbmNsYXNzIE1vbmdvU2NoZW1hQ29sbGVjdGlvbiB7XG4gIF9jb2xsZWN0aW9uOiBNb25nb0NvbGxlY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29sbGVjdGlvbjogTW9uZ29Db2xsZWN0aW9uKSB7XG4gICAgdGhpcy5fY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gIH1cblxuICBfZmV0Y2hBbGxTY2hlbWFzRnJvbV9TQ0hFTUEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb24uX3Jhd0ZpbmQoe30pLnRoZW4oc2NoZW1hcyA9PiBzY2hlbWFzLm1hcChtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWEpKTtcbiAgfVxuXG4gIF9mZXRjaE9uZVNjaGVtYUZyb21fU0NIRU1BKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uXG4gICAgICAuX3Jhd0ZpbmQoX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWUpLCB7IGxpbWl0OiAxIH0pXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYShyZXN1bHRzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gQXRvbWljYWxseSBmaW5kIGFuZCBkZWxldGUgYW4gb2JqZWN0IGJhc2VkIG9uIHF1ZXJ5LlxuICBmaW5kQW5kRGVsZXRlU2NoZW1hKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uLl9tb25nb0NvbGxlY3Rpb24uZmluZE9uZUFuZERlbGV0ZShfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkobmFtZSkpO1xuICB9XG5cbiAgaW5zZXJ0U2NoZW1hKHNjaGVtYTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb25cbiAgICAgIC5pbnNlcnRPbmUoc2NoZW1hKVxuICAgICAgLnRoZW4oKCkgPT4gbW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hKHNjaGVtYSkpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gMTEwMDApIHtcbiAgICAgICAgICAvL01vbmdvJ3MgZHVwbGljYXRlIGtleSBlcnJvclxuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUsICdDbGFzcyBhbHJlYWR5IGV4aXN0cy4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICB1cGRhdGVTY2hlbWEobmFtZTogc3RyaW5nLCB1cGRhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbi51cGRhdGVPbmUoX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWUpLCB1cGRhdGUpO1xuICB9XG5cbiAgdXBzZXJ0U2NoZW1hKG5hbWU6IHN0cmluZywgcXVlcnk6IHN0cmluZywgdXBkYXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb24udXBzZXJ0T25lKF9tb25nb1NjaGVtYVF1ZXJ5RnJvbU5hbWVRdWVyeShuYW1lLCBxdWVyeSksIHVwZGF0ZSk7XG4gIH1cblxuICAvLyBBZGQgYSBmaWVsZCB0byB0aGUgc2NoZW1hLiBJZiBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmaWVsZFxuICAvLyB0eXBlIChlLmcuIG1vbmdvIGRvZXNuJ3Qgc3VwcG9ydCBtb3JlIHRoYW4gb25lIEdlb1BvaW50IGluIGEgY2xhc3MpIHJlamVjdCB3aXRoIGFuIFwiSW5jb3JyZWN0IFR5cGVcIlxuICAvLyBQYXJzZSBlcnJvciB3aXRoIGEgZGVzY2lwdGl2ZSBtZXNzYWdlLiBJZiB0aGUgZmllbGQgYWxyZWFkeSBleGlzdHMsIHRoaXMgZnVuY3Rpb24gbXVzdFxuICAvLyBub3QgbW9kaWZ5IHRoZSBzY2hlbWEsIGFuZCBtdXN0IHJlamVjdCB3aXRoIERVUExJQ0FURV9WQUxVRSBlcnJvci5cbiAgLy8gSWYgdGhpcyBpcyBjYWxsZWQgZm9yIGEgY2xhc3MgdGhhdCBkb2Vzbid0IGV4aXN0LCB0aGlzIGZ1bmN0aW9uIG11c3QgY3JlYXRlIHRoYXQgY2xhc3MuXG5cbiAgLy8gVE9ETzogdGhyb3cgYW4gZXJyb3IgaWYgYW4gdW5zdXBwb3J0ZWQgZmllbGQgdHlwZSBpcyBwYXNzZWQuIERlY2lkaW5nIHdoZXRoZXIgYSB0eXBlIGlzIHN1cHBvcnRlZFxuICAvLyBzaG91bGQgYmUgdGhlIGpvYiBvZiB0aGUgYWRhcHRlci4gU29tZSBhZGFwdGVycyBtYXkgbm90IHN1cHBvcnQgR2VvUG9pbnQgYXQgYWxsLiBPdGhlcnMgbWF5XG4gIC8vIFN1cHBvcnQgYWRkaXRpb25hbCB0eXBlcyB0aGF0IE1vbmdvIGRvZXNuJ3QsIGxpa2UgTW9uZXksIG9yIHNvbWV0aGluZy5cblxuICAvLyBUT0RPOiBkb24ndCBzcGVuZCBhbiBleHRyYSBxdWVyeSBvbiBmaW5kaW5nIHRoZSBzY2hlbWEgaWYgdGhlIHR5cGUgd2UgYXJlIHRyeWluZyB0byBhZGQgaXNuJ3QgYSBHZW9Qb2ludC5cbiAgYWRkRmllbGRJZk5vdEV4aXN0cyhjbGFzc05hbWU6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcsIGZpZWxkVHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoT25lU2NoZW1hRnJvbV9TQ0hFTUEoY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oXG4gICAgICAgIHNjaGVtYSA9PiB7XG4gICAgICAgICAgLy8gSWYgYSBmaWVsZCB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBoYW5kbGVkIGVsc2V3aGVyZS5cbiAgICAgICAgICBpZiAoc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVGhlIHNjaGVtYSBleGlzdHMuIENoZWNrIGZvciBleGlzdGluZyBHZW9Qb2ludHMuXG4gICAgICAgICAgaWYgKGZpZWxkVHlwZS50eXBlID09PSAnR2VvUG9pbnQnKSB7XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vdCBvdGhlciBnZW9wb2ludCBmaWVsZHNcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hLmZpZWxkcykuc29tZShcbiAgICAgICAgICAgICAgICBleGlzdGluZ0ZpZWxkID0+IHNjaGVtYS5maWVsZHNbZXhpc3RpbmdGaWVsZF0udHlwZSA9PT0gJ0dlb1BvaW50J1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICAgIFBhcnNlLkVycm9yLklOQ09SUkVDVF9UWVBFLFxuICAgICAgICAgICAgICAgICdNb25nb0RCIG9ubHkgc3VwcG9ydHMgb25lIEdlb1BvaW50IGZpZWxkIGluIGEgY2xhc3MuJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAvLyBJZiBlcnJvciBpcyB1bmRlZmluZWQsIHRoZSBzY2hlbWEgZG9lc24ndCBleGlzdCwgYW5kIHdlIGNhbiBjcmVhdGUgdGhlIHNjaGVtYSB3aXRoIHRoZSBmaWVsZC5cbiAgICAgICAgICAvLyBJZiBzb21lIG90aGVyIGVycm9yLCByZWplY3Qgd2l0aCBpdC5cbiAgICAgICAgICBpZiAoZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHR5cGUsIHRhcmdldENsYXNzLCAuLi5maWVsZE9wdGlvbnMgfSA9IGZpZWxkVHlwZTtcbiAgICAgICAgLy8gV2UgdXNlICRleGlzdHMgYW5kICRzZXQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgdGhlIGZpZWxkIHR5cGUgaWYgaXRcbiAgICAgICAgLy8gYWxyZWFkeSBleGlzdHMuIChpdCBjb3VsZCBoYXZlIGFkZGVkIGluYmV0d2VlbiB0aGUgbGFzdCBxdWVyeSBhbmQgdGhlIHVwZGF0ZSlcbiAgICAgICAgaWYgKGZpZWxkT3B0aW9ucyAmJiBPYmplY3Qua2V5cyhmaWVsZE9wdGlvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy51cHNlcnRTY2hlbWEoXG4gICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICB7IFtmaWVsZE5hbWVdOiB7ICRleGlzdHM6IGZhbHNlIH0gfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgICAgIFtmaWVsZE5hbWVdOiBwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUoe1xuICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgIHRhcmdldENsYXNzLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIFtgX21ldGFkYXRhLmZpZWxkc19vcHRpb25zLiR7ZmllbGROYW1lfWBdOiBmaWVsZE9wdGlvbnMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy51cHNlcnRTY2hlbWEoXG4gICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICB7IFtmaWVsZE5hbWVdOiB7ICRleGlzdHM6IGZhbHNlIH0gfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgICAgIFtmaWVsZE5hbWVdOiBwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUoe1xuICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgIHRhcmdldENsYXNzLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRmllbGRPcHRpb25zKGNsYXNzTmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgZmllbGRUeXBlOiBhbnkpIHtcbiAgICBjb25zdCB7IC4uLmZpZWxkT3B0aW9ucyB9ID0gZmllbGRUeXBlO1xuICAgIGRlbGV0ZSBmaWVsZE9wdGlvbnMudHlwZTtcbiAgICBkZWxldGUgZmllbGRPcHRpb25zLnRhcmdldENsYXNzO1xuXG4gICAgYXdhaXQgdGhpcy51cHNlcnRTY2hlbWEoXG4gICAgICBjbGFzc05hbWUsXG4gICAgICB7IFtmaWVsZE5hbWVdOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAge1xuICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgW2BfbWV0YWRhdGEuZmllbGRzX29wdGlvbnMuJHtmaWVsZE5hbWV9YF06IGZpZWxkT3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbi8vIEV4cG9ydGVkIGZvciB0ZXN0aW5nIHJlYXNvbnMgYW5kIGJlY2F1c2Ugd2UgaGF2ZW4ndCBtb3ZlZCBhbGwgbW9uZ28gc2NoZW1hIGZvcm1hdFxuLy8gcmVsYXRlZCBsb2dpYyBpbnRvIHRoZSBkYXRhYmFzZSBhZGFwdGVyIHlldC5cbk1vbmdvU2NoZW1hQ29sbGVjdGlvbi5fVEVTVG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYSA9IG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYTtcbk1vbmdvU2NoZW1hQ29sbGVjdGlvbi5wYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUgPSBwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGU7XG5cbmV4cG9ydCBkZWZhdWx0IE1vbmdvU2NoZW1hQ29sbGVjdGlvbjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUErQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFL0IsU0FBU0EsNEJBQTRCLENBQUNDLElBQUksRUFBRTtFQUMxQyxJQUFJQSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO0lB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
|