UNPKG

24.9 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.getUnsupportedTargets = getUnsupportedTargets;
7exports.default = exports.targetMetadata = void 0;
8
9var _data = _interopRequireDefault(require("caniuse-db/fulldata-json/data-2.0.json"));
10
11function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
13// $FlowFixMe: Flow import error
14// HACK: modern targets should be determined once at runtime
15const targetMetadata = {
16 targets: ['chrome', 'firefox', 'opera', 'safari', 'ie', 'edge', 'ios_saf', 'op_mini', 'android', 'bb', 'op_mob', 'and_chr', 'and_ff', 'ie_mob', 'and_uc', 'samsung', 'baidu']
17};
18exports.targetMetadata = targetMetadata;
19const targetNameMappings = {
20 chrome: 'Chrome',
21 firefox: 'Firefox',
22 opera: 'Opera',
23 baidu: 'Baidu',
24 and_qq: 'QQ Browser',
25 safari: 'Safari',
26 android: 'Android Browser',
27 ie: 'IE',
28 edge: 'Edge',
29 ios_saf: 'iOS Safari',
30 op_mini: 'Opera Mini',
31 bb: 'Blackberry Browser',
32 op_mob: 'Opera Mobile',
33 and_chr: 'Android Chrome',
34 and_ff: 'Android Firefox',
35 ie_mob: 'IE Mobile',
36 and_uc: 'Android UC Browser',
37 samsung: 'Samsung Browser'
38};
39/**
40 * Take a target's id and return it's full name by using `targetNameMappings`
41 * ex. {target: and_ff, version: 40} => 'Android FireFox 40'
42 */
43
44function formatTargetNames(target) {
45 return `${targetNameMappings[target.target]} ${target.version}`;
46}
47/**
48 * Check if a browser version is in the range format
49 * ex. 10.0-10.2
50 */
51
52
53function versionIsRange(version) {
54 return version.includes('-');
55}
56/**
57 * Parse version from caniuse and compare with parsed version from browserslist.
58 */
59
60
61function compareRanges(targetVersion, statsVersion) {
62 return targetVersion === parseFloat(statsVersion);
63}
64/*
65 * Check the CanIUse database to see if targets are supported
66 */
67
68
69function canIUseIsNotSupported(node, {
70 version,
71 target,
72 parsedVersion
73}) {
74 const {
75 stats
76 } = _data.default.data[node.caniuseId];
77 const targetStats = stats[target];
78 return versionIsRange(version) ? Object.keys(targetStats).some(statsVersion => versionIsRange(statsVersion) && compareRanges(parsedVersion, statsVersion) ? !targetStats[statsVersion].includes('y') : false) : targetStats[version] && !targetStats[version].includes('y');
79}
80/**
81 * Return an array of all unsupported targets
82 */
83
84
85function getUnsupportedTargets(node, targets) {
86 return targets.filter(target => canIUseIsNotSupported(node, target)).map(formatTargetNames);
87}
88/**
89 * Check if the node has matching object or properties
90 */
91
92
93function isValid(node, eslintNode, targets) {
94 switch (eslintNode.type) {
95 case 'CallExpression':
96 case 'NewExpression':
97 if (!eslintNode.callee) return true;
98 if (eslintNode.callee.name !== node.object) return true;
99 break;
100
101 case 'MemberExpression':
102 // Pass tests if non-matching object or property
103 if (!eslintNode.object || !eslintNode.property) return true;
104 if (eslintNode.object.name !== node.object) return true; // If the property is missing from the rule, it means that only the
105 // object is required to determine compatibility
106
107 if (!node.property) break;
108 if (eslintNode.property.name !== node.property) return true;
109 break;
110
111 default:
112 return true;
113 }
114
115 return !getUnsupportedTargets(node, targets).length;
116}
117
118const CanIUseProvider = [// new ServiceWorker()
119{
120 caniuseId: 'serviceworkers',
121 astNodeType: 'NewExpression',
122 object: 'ServiceWorker'
123}, {
124 caniuseId: 'serviceworkers',
125 astNodeType: 'MemberExpression',
126 object: 'navigator',
127 property: 'serviceWorker'
128}, // document.querySelector()
129{
130 caniuseId: 'queryselector',
131 astNodeType: 'MemberExpression',
132 object: 'document',
133 property: 'querySelector'
134}, // IntersectionObserver
135{
136 caniuseId: 'intersectionobserver',
137 astNodeType: 'NewExpression',
138 object: 'IntersectionObserver'
139}, // PaymentRequest
140{
141 caniuseId: 'payment-request',
142 astNodeType: 'NewExpression',
143 object: 'PaymentRequest'
144}, // Promises
145{
146 caniuseId: 'promises',
147 astNodeType: 'NewExpression',
148 object: 'Promise'
149}, {
150 caniuseId: 'promises',
151 astNodeType: 'MemberExpression',
152 object: 'Promise',
153 property: 'resolve'
154}, {
155 caniuseId: 'promises',
156 astNodeType: 'MemberExpression',
157 object: 'Promise',
158 property: 'all'
159}, {
160 caniuseId: 'promises',
161 astNodeType: 'MemberExpression',
162 object: 'Promise',
163 property: 'race'
164}, {
165 caniuseId: 'promises',
166 astNodeType: 'MemberExpression',
167 object: 'Promise',
168 property: 'reject'
169}, // fetch
170{
171 caniuseId: 'fetch',
172 astNodeType: 'CallExpression',
173 object: 'fetch'
174}, // document.currentScript()
175{
176 caniuseId: 'document-currentscript',
177 astNodeType: 'MemberExpression',
178 object: 'document',
179 property: 'currentScript'
180}, // URL
181{
182 caniuseId: 'url',
183 astNodeType: 'NewExpression',
184 object: 'URL'
185}, // URLSearchParams
186{
187 caniuseId: 'urlsearchparams',
188 astNodeType: 'NewExpression',
189 object: 'URLSearchParams'
190}, // performance.now()
191{
192 caniuseId: 'high-resolution-time',
193 astNodeType: 'MemberExpression',
194 object: 'performance',
195 property: 'now'
196}, {
197 caniuseId: 'typedarrays',
198 astNodeType: 'NewExpression',
199 object: 'TypedArray'
200}, {
201 caniuseId: 'typedarrays',
202 astNodeType: 'NewExpression',
203 object: 'Int8Array'
204}, {
205 caniuseId: 'typedarrays',
206 astNodeType: 'NewExpression',
207 object: 'Uint8Array'
208}, {
209 caniuseId: 'typedarrays',
210 astNodeType: 'NewExpression',
211 object: 'Uint8ClampedArray'
212}, {
213 caniuseId: 'typedarrays',
214 astNodeType: 'NewExpression',
215 object: 'Int16Array'
216}, {
217 caniuseId: 'typedarrays',
218 astNodeType: 'NewExpression',
219 object: 'Uint16Array'
220}, {
221 caniuseId: 'typedarrays',
222 astNodeType: 'NewExpression',
223 object: 'Int32Array'
224}, {
225 caniuseId: 'typedarrays',
226 astNodeType: 'NewExpression',
227 object: 'Uint32Array'
228}, {
229 caniuseId: 'typedarrays',
230 astNodeType: 'NewExpression',
231 object: 'Float32Array'
232}, {
233 caniuseId: 'typedarrays',
234 astNodeType: 'NewExpression',
235 object: 'Float64Array'
236}].map(rule => Object.assign({}, rule, {
237 isValid,
238 getUnsupportedTargets,
239 id: rule.property ? `${rule.object}.${rule.property}` : rule.object,
240 protoChainId: rule.property ? `${rule.object}.${rule.property}` : rule.object,
241 protoChain: rule.property ? [rule.object, rule.property] : [rule.object]
242}));
243var _default = CanIUseProvider;
244exports.default = _default;
245//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm92aWRlcnMvQ2FuSVVzZVByb3ZpZGVyLmpzIl0sIm5hbWVzIjpbInRhcmdldE1ldGFkYXRhIiwidGFyZ2V0cyIsInRhcmdldE5hbWVNYXBwaW5ncyIsImNocm9tZSIsImZpcmVmb3giLCJvcGVyYSIsImJhaWR1IiwiYW5kX3FxIiwic2FmYXJpIiwiYW5kcm9pZCIsImllIiwiZWRnZSIsImlvc19zYWYiLCJvcF9taW5pIiwiYmIiLCJvcF9tb2IiLCJhbmRfY2hyIiwiYW5kX2ZmIiwiaWVfbW9iIiwiYW5kX3VjIiwic2Ftc3VuZyIsImZvcm1hdFRhcmdldE5hbWVzIiwidGFyZ2V0IiwidmVyc2lvbiIsInZlcnNpb25Jc1JhbmdlIiwiaW5jbHVkZXMiLCJjb21wYXJlUmFuZ2VzIiwidGFyZ2V0VmVyc2lvbiIsInN0YXRzVmVyc2lvbiIsInBhcnNlRmxvYXQiLCJjYW5JVXNlSXNOb3RTdXBwb3J0ZWQiLCJub2RlIiwicGFyc2VkVmVyc2lvbiIsInN0YXRzIiwiY2FuaXVzZVJlY29yZHMiLCJkYXRhIiwiY2FuaXVzZUlkIiwidGFyZ2V0U3RhdHMiLCJPYmplY3QiLCJrZXlzIiwic29tZSIsImdldFVuc3VwcG9ydGVkVGFyZ2V0cyIsImZpbHRlciIsIm1hcCIsImlzVmFsaWQiLCJlc2xpbnROb2RlIiwidHlwZSIsImNhbGxlZSIsIm5hbWUiLCJvYmplY3QiLCJwcm9wZXJ0eSIsImxlbmd0aCIsIkNhbklVc2VQcm92aWRlciIsImFzdE5vZGVUeXBlIiwicnVsZSIsImFzc2lnbiIsImlkIiwicHJvdG9DaGFpbklkIiwicHJvdG9DaGFpbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFFQTs7OztBQURBO0FBbUJBO0FBQ08sTUFBTUEsY0FBOEIsR0FBRztBQUM1Q0MsRUFBQUEsT0FBTyxFQUFFLENBQ1AsUUFETyxFQUVQLFNBRk8sRUFHUCxPQUhPLEVBSVAsUUFKTyxFQUtQLElBTE8sRUFNUCxNQU5PLEVBT1AsU0FQTyxFQVFQLFNBUk8sRUFTUCxT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R0FDVCxHQUFFSSxJQUFJLENBQUNMLE1BQU8sSUFBR0ssSUFBSSxDQUFDSixRQUFTLEVBRHRCLEdBRVZJLElBQUksQ0FBQ0wsTUFOYTtBQU90QlMsRUFBQUEsVUFBVSxFQUFFSixJQUFJLENBQUNKLFFBQUwsR0FBZ0IsQ0FBQ0ksSUFBSSxDQUFDTCxNQUFOLEVBQWNLLElBQUksQ0FBQ0osUUFBbkIsQ0FBaEIsR0FBK0MsQ0FBQ0ksSUFBSSxDQUFDTCxNQUFOO0FBUHJDLENBQXhCLENBakptQyxDQUFyQztlQTRKZUcsZSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG4vLyAkRmxvd0ZpeE1lOiBGbG93IGltcG9ydCBlcnJvclxuaW1wb3J0IGNhbml1c2VSZWNvcmRzIGZyb20gJ2Nhbml1c2UtZGIvZnVsbGRhdGEtanNvbi9kYXRhLTIuMC5qc29uJztcbmltcG9ydCB0eXBlIHsgTm9kZSwgRVNMaW50Tm9kZSwgVGFyZ2V0cywgVGFyZ2V0IH0gZnJvbSAnLi4vTGludFR5cGVzJztcblxudHlwZSBUYXJnZXRNZXRhZGF0YSA9IHtcbiAgLy8gVGhlIGxpc3Qgb2YgdGFyZ2V0cyBzdXBwb3J0ZWQgYnkgdGhlIHByb3ZpZGVyXG4gIHRhcmdldHM6IFRhcmdldHNcbn07XG5cbnR5cGUgQ2FuSVVzZVN0YXRzID0ge1xuICBbYnJvd3Nlcjogc3RyaW5nXToge1xuICAgIFt2ZXJzaW9uOiBzdHJpbmddOiBzdHJpbmdcbiAgfVxufTtcblxudHlwZSBDYW5JVXNlUmVjb3JkcyA9IHtcbiAgZGF0YTogQ2FuSVVzZVN0YXRzXG59O1xuXG4vLyBIQUNLOiBtb2Rlcm4gdGFyZ2V0cyBzaG91bGQgYmUgZGV0ZXJtaW5lZCBvbmNlIGF0IHJ1bnRpbWVcbmV4cG9ydCBjb25zdCB0YXJnZXRNZXRhZGF0YTogVGFyZ2V0TWV0YWRhdGEgPSB7XG4gIHRhcmdldHM6IFtcbiAgICAnY2hyb21lJyxcbiAgICAnZmlyZWZveCcsXG4gICAgJ29wZXJhJyxcbiAgICAnc2FmYXJpJyxcbiAgICAnaWUnLFxuICAgICdlZGdlJyxcbiAgICAnaW9zX3NhZicsXG4gICAgJ29wX21pbmknLFxuICAgICdhbmRyb2lkJyxcbiAgICAnYmInLFxuICAgICdvcF9tb2InLFxuICAgICdhbmRfY2hyJyxcbiAgICAnYW5kX2ZmJyxcbiAgICAnaWVfbW9iJyxcbiAgICAnYW5kX3VjJyxcbiAgICAnc2Ftc3VuZycsXG4gICAgJ2JhaWR1J1xuICBdXG59O1xuXG5jb25zdCB0YXJnZXROYW1lTWFwcGluZ3MgPSB7XG4gIGNocm9tZTogJ0Nocm9tZScsXG4gIGZpcmVmb3g6ICdGaXJlZm94JyxcbiAgb3BlcmE6ICdPcGVyYScsXG4gIGJhaWR1OiAnQmFpZHUnLFxuICBhbmRfcXE6ICdRUSBCcm93c2VyJyxcbiAgc2FmYXJpOiAnU2FmYXJpJyxcbiAgYW5kcm9pZDogJ0FuZHJvaWQgQnJvd3NlcicsXG4gIGllOiAnSUUnLFxuICBlZGdlOiAnRWRnZScsXG4gIGlvc19zYWY6ICdpT1MgU2FmYXJpJyxcbiAgb3BfbWluaTogJ09wZXJhIE1pbmknLFxuICBiYjogJ0JsYWNrYmVycnkgQnJvd3NlcicsXG4gIG9wX21vYjogJ09wZXJhIE1vYmlsZScsXG4gIGFuZF9jaHI6ICdBbmRyb2lkIENocm9tZScsXG4gIGFuZF9mZjogJ0FuZHJvaWQgRmlyZWZveCcsXG4gIGllX21vYjogJ0lFIE1vYmlsZScsXG4gIGFuZF91YzogJ0FuZHJvaWQgVUMgQnJvd3NlcicsXG4gIHNhbXN1bmc6ICdTYW1zdW5nIEJyb3dzZXInXG59O1xuXG4vKipcbiAqIFRha2UgYSB0YXJnZXQncyBpZCBhbmQgcmV0dXJuIGl0J3MgZnVsbCBuYW1lIGJ5IHVzaW5nIGB0YXJnZXROYW1lTWFwcGluZ3NgXG4gKiBleC4ge3RhcmdldDogYW5kX2ZmLCB2ZXJzaW9uOiA0MH0gPT4gJ0FuZHJvaWQgRmlyZUZveCA0MCdcbiAqL1xuZnVuY3Rpb24gZm9ybWF0VGFyZ2V0TmFtZXModGFyZ2V0OiBUYXJnZXQpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7dGFyZ2V0TmFtZU1hcHBpbmdzW3RhcmdldC50YXJnZXRdfSAke3RhcmdldC52ZXJzaW9ufWA7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBicm93c2VyIHZlcnNpb24gaXMgaW4gdGhlIHJhbmdlIGZvcm1hdFxuICogZXguIDEwLjAtMTAuMlxuICovXG5mdW5jdGlvbiB2ZXJzaW9uSXNSYW5nZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcnNpb24uaW5jbHVkZXMoJy0nKTtcbn1cblxuLyoqXG4gKiBQYXJzZSB2ZXJzaW9uIGZyb20gY2FuaXVzZSBhbmQgY29tcGFyZSB3aXRoIHBhcnNlZCB2ZXJzaW9uIGZyb20gYnJvd3NlcnNsaXN0LlxuICovXG5mdW5jdGlvbiBjb21wYXJlUmFuZ2VzKHRhcmdldFZlcnNpb246IG51bWJlciwgc3RhdHNWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRhcmdldFZlcnNpb24gPT09IHBhcnNlRmxvYXQoc3RhdHNWZXJzaW9uKTtcbn1cblxuLypcbiAqIENoZWNrIHRoZSBDYW5JVXNlIGRhdGFiYXNlIHRvIHNlZSBpZiB0YXJnZXRzIGFyZSBzdXBwb3J0ZWRcbiAqL1xuZnVuY3Rpb24gY2FuSVVzZUlzTm90U3VwcG9ydGVkKFxuICBub2RlOiBOb2RlLFxuICB7IHZlcnNpb24sIHRhcmdldCwgcGFyc2VkVmVyc2lvbiB9OiBUYXJnZXRcbik6IGJvb2xlYW4ge1xuICBjb25zdCB7IHN0YXRzIH0gPSAoY2FuaXVzZVJlY29yZHM6IENhbklVc2VSZWNvcmRzKS5kYXRhW25vZGUuY2FuaXVzZUlkXTtcbiAgY29uc3QgdGFyZ2V0U3RhdHMgPSBzdGF0c1t0YXJnZXRdO1xuICByZXR1cm4gdmVyc2lvbklzUmFuZ2UodmVyc2lvbilcbiAgICA/IE9iamVjdC5rZXlzKHRhcmdldFN0YXRzKS5zb21lKFxuICAgICAgICAoc3RhdHNWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgICAgICAgdmVyc2lvbklzUmFuZ2Uoc3RhdHNWZXJzaW9uKSAmJlxuICAgICAgICAgIGNvbXBhcmVSYW5nZXMocGFyc2VkVmVyc2lvbiwgc3RhdHNWZXJzaW9uKVxuICAgICAgICAgICAgPyAhdGFyZ2V0U3RhdHNbc3RhdHNWZXJzaW9uXS5pbmNsdWRlcygneScpXG4gICAgICAgICAgICA6IGZhbHNlXG4gICAgICApXG4gICAgOiB0YXJnZXRTdGF0c1t2ZXJzaW9uXSAmJiAhdGFyZ2V0U3RhdHNbdmVyc2lvbl0uaW5jbHVkZXMoJ3knKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXJyYXkgb2YgYWxsIHVuc3VwcG9ydGVkIHRhcmdldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuc3VwcG9ydGVkVGFyZ2V0cyhcbiAgbm9kZTogTm9kZSxcbiAgdGFyZ2V0czogVGFyZ2V0c1xuKTogQXJyYXk8c3RyaW5nPiB7XG4gIHJldHVybiB0YXJnZXRzXG4gICAgLmZpbHRlcih0YXJnZXQgPT4gY2FuSVVzZUlzTm90U3VwcG9ydGVkKG5vZGUsIHRhcmdldCkpXG4gICAgLm1hcChmb3JtYXRUYXJnZXROYW1lcyk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIG5vZGUgaGFzIG1hdGNoaW5nIG9iamVjdCBvciBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWQoXG4gIG5vZGU6IE5vZGUsXG4gIGVzbGludE5vZGU6IEVTTGludE5vZGUsXG4gIHRhcmdldHM6IFRhcmdldHNcbik6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKGVzbGludE5vZGUudHlwZSkge1xuICAgIGNhc2UgJ0NhbGxFeHByZXNzaW9uJzpcbiAgICBjYXNlICdOZXdFeHByZXNzaW9uJzpcbiAgICAgIGlmICghZXNsaW50Tm9kZS5jYWxsZWUpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGVzbGludE5vZGUuY2FsbGVlLm5hbWUgIT09IG5vZGUub2JqZWN0KSByZXR1cm4gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ01lbWJlckV4cHJlc3Npb24nOlxuICAgICAgLy8gUGFzcyB0ZXN0cyBpZiBub24tbWF0Y2hpbmcgb2JqZWN0IG9yIHByb3BlcnR5XG4gICAgICBpZiAoIWVzbGludE5vZGUub2JqZWN0IHx8ICFlc2xpbnROb2RlLnByb3BlcnR5KSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChlc2xpbnROb2RlLm9iamVjdC5uYW1lICE9PSBub2RlLm9iamVjdCkgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nIGZyb20gdGhlIHJ1bGUsIGl0IG1lYW5zIHRoYXQgb25seSB0aGVcbiAgICAgIC8vIG9iamVjdCBpcyByZXF1aXJlZCB0byBkZXRlcm1pbmUgY29tcGF0aWJpbGl0eVxuICAgICAgaWYgKCFub2RlLnByb3BlcnR5KSBicmVhaztcblxuICAgICAgaWYgKGVzbGludE5vZGUucHJvcGVydHkubmFtZSAhPT0gbm9kZS5wcm9wZXJ0eSkgcmV0dXJuIHRydWU7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gIWdldFVuc3VwcG9ydGVkVGFyZ2V0cyhub2RlLCB0YXJnZXRzKS5sZW5ndGg7XG59XG5cbmNvbnN0IENhbklVc2VQcm92aWRlcjogQXJyYXk8Tm9kZT4gPSBbXG4gIC8vIG5ldyBTZXJ2aWNlV29ya2VyKClcbiAge1xuICAgIGNhbml1c2VJZDogJ3NlcnZpY2V3b3JrZXJzJyxcbiAgICBhc3ROb2RlVHlwZTogJ05ld0V4cHJlc3Npb24nLFxuICAgIG9iamVjdDogJ1NlcnZpY2VXb3JrZXInXG4gIH0sXG4gIHtcbiAgICBjYW5pdXNlSWQ6ICdzZXJ2aWNld29ya2VycycsXG4gICAgYXN0Tm9kZVR5cGU6ICdNZW1iZXJFeHByZXNzaW9uJyxcbiAgICBvYmplY3Q6ICduYXZpZ2F0b3InLFxuICAgIHByb3BlcnR5OiAnc2VydmljZVdvcmtlcidcbiAgfSxcbiAgLy8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigpXG4gIHtcbiAgICBjYW5pdXNlSWQ6ICdxdWVyeXNlbGVjdG9yJyxcbiAgICBhc3ROb2RlVHlwZTogJ01lbWJlckV4cHJlc3Npb24nLFxuICAgIG9iamVjdDogJ2RvY3VtZW50JyxcbiAgICBwcm9wZXJ0eTogJ3F1ZXJ5U2VsZWN0b3InXG4gIH0sXG4gIC8vIEludGVyc2VjdGlvbk9ic2VydmVyXG4gIHtcbiAgICBjYW5pdXNlSWQ6ICdpbnRlcnNlY3Rpb25vYnNlcnZlcicsXG4gICAgYXN0Tm9kZVR5cGU6ICdOZXdFeHByZXNzaW9uJyxcbiAgICBvYmplY3Q6ICdJbnRlcnNlY3Rpb25PYnNlcnZlcidcbiAgfSxcbiAgLy8gUGF5bWVudFJlcXVlc3RcbiAge1xuICAgIGNhbml1c2VJZDogJ3BheW1lbnQtcmVxdWVzdCcsXG4gICAgYXN0Tm9kZVR5cGU6ICdOZXdFeHByZXNzaW9uJyxcbiAgICBvYmplY3Q6ICdQYXltZW50UmVxdWVzdCdcbiAgfSxcbiAgLy8gUHJvbWlzZXNcbiAge1xuICAgIGNhbml1c2VJZDogJ3Byb21pc2VzJyxcbiAgICBhc3ROb2RlVHlwZTogJ05ld0V4cHJlc3Npb24nLFxuICAgIG9iamVjdDogJ1Byb21pc2UnXG4gIH0sXG4gIHtcbiAgICBjYW5pdXNlSWQ6ICdwcm9taXNlcycsXG4gICAgYXN0Tm9kZVR5cGU6ICdNZW1iZXJFeHByZXNzaW9uJyxcbiAgICBvYmplY3Q6ICdQcm9taXNlJyxcbiAgICBwcm9wZXJ0eTogJ3Jlc29sdmUnXG4gIH0sXG4gIHtcbiAgICBjYW5pdXNlSWQ6ICdwcm9taXNlcycsXG4gICAgYXN0Tm9kZVR5cGU6ICdNZW1iZXJFeHByZXNzaW9uJyxcbiAgICBvYmplY3Q6ICdQcm9taXNlJyxcbiAgICBwcm9wZXJ0eTogJ2FsbCdcbiAgfSxcbiAge1xuICAgIGNhbml1c2VJZDogJ3Byb21pc2VzJyxcbiAgICBhc3ROb2RlVHlwZTogJ01lbWJlckV4cHJlc3Npb24nLFxuICAgIG9iamVjdDogJ1Byb21pc2UnLFxuICAgIHByb3BlcnR5OiAncmFjZSdcbiAgfSxcbiAge1xuICAgIGNhbml1c2VJZDogJ3Byb21pc2VzJyxcbiAgICBhc3ROb2RlVHlwZTogJ01lbWJlckV4cHJlc3Npb24nLFxuICAgIG9iamVjdDogJ1Byb21pc2UnLFxuICAgIHByb3BlcnR5OiAncmVqZWN0J1xuICB9LFxuICAvLyBmZXRjaFxuICB7XG4gICAgY2FuaXVzZUlkOiAnZmV0Y2gnLFxuICAgIGFzdE5vZGVUeXBlOiAnQ2FsbEV4cHJlc3Npb24nLFxuICAgIG9iamVjdDogJ2ZldGNoJ1xuICB9LFxuICAvLyBkb2N1bWVudC5jdXJyZW50U2NyaXB0KClcbiAge1xuICAgIGNhbml1c2VJZDogJ2RvY3VtZW50LWN1cnJlbnRzY3JpcHQnLFxuICAgIGFzdE5vZGVUeXBlOiAnTWVtYmVyRXhwcmVzc2lvbicsXG4gICAgb2JqZWN0OiAnZG9jdW1lbnQnLFxuICAgIHByb3BlcnR5OiAnY3VycmVudFNjcmlwdCdcbiAgfSxcbiAgLy8gVVJMXG4gIHtcbiAgICBjYW5pdXNlSWQ6ICd1cmwnLFxuICAgIGFzdE5vZGVUeXBlOiAnTmV3RXhwcmVzc2lvbicsXG4gICAgb2JqZWN0OiAnVVJMJ1xuICB9LFxuICAvLyBVUkxTZWFyY2hQYXJhbXNcbiAge1xuICAgIGNhbml1c2VJZDogJ3VybHNlYXJjaHBhcmFtcycsXG4gICAgYXN0Tm9kZVR5cGU6ICdOZXdFeHByZXNzaW9uJyxcbiAgICBvYmplY3Q6ICdVUkxTZWFyY2hQYXJhbXMnXG4gIH0sXG4gIC8vIHBlcmZvcm1hbmNlLm5vdygpXG4gIHtcbiAgICBjYW5pdXNlSWQ6ICdoaWdoLXJlc29sdXRpb24tdGltZScsXG4gICAgYXN0Tm9kZVR5cGU6ICdNZW1iZXJFeHByZXNzaW9uJyxcbiAgICBvYmplY3Q6ICdwZXJmb3JtYW5jZScsXG4gICAgcHJvcGVydHk6ICdub3cnXG4gIH0sXG4gIHtcbiAgICBjYW5pdXNlSWQ6ICd0eXBlZGFycmF5cycsXG4gICAgYXN0Tm9kZVR5cGU6ICdOZXdFeHByZXNzaW9uJyxcbiAgICBvYmplY3Q6ICdUeXBlZEFycmF5J1xuICB9LFxuICB7XG4gICAgY2FuaXVzZUlkOiAndHlwZWRhcnJheXMnLFxuICAgIGFzdE5vZGVUeXBlOiAnTmV3RXhwcmVzc2lvbicsXG4gICAgb2JqZWN0OiAnSW50OEFycmF5J1xuICB9LFxuICB7XG4gICAgY2FuaXVzZUlkOiAndHlwZWRhcnJheXMnLFxuICAgIGFzdE5vZGVUeXBlOiAnTmV3RXhwcmVzc2lvbicsXG4gICAgb2JqZWN0OiAnVWludDhBcnJheSdcbiAgfSxcbiAge1xuICAgIGNhbml1c2VJZDogJ3R5cGVkYXJyYXlzJyxcbiAgICBhc3ROb2RlVHlwZTogJ05ld0V4cHJlc3Npb24nLFxuICAgIG9iamVjdDogJ1VpbnQ4Q2xhbXBlZEFycmF5J1xuICB9LFxuICB7XG4gICAgY2FuaXVzZUlkOiAndHlwZWRhcnJheXMnLFxuICAgIGFzdE5vZGVUeXBlOiAnTmV3RXhwcmVzc2lvbicsXG4gICAgb2JqZWN0OiAnSW50MTZBcnJheSdcbiAgfSxcbiAge1xuICAgIGNhbml1c2VJZDogJ3R5cGVkYXJyYXlzJyxcbiAgICBhc3ROb2RlVHlwZTogJ05ld0V4cHJlc3Npb24nLFxuICAgIG9iamVjdDogJ1VpbnQxNkFycmF5J1xuICB9LFxuICB7XG4gICAgY2FuaXVzZUlkOiAndHlwZWRhcnJheXMnLFxuICAgIGFzdE5vZGVUeXBlOiAnTmV3RXhwcmVzc2lvbicsXG4gICAgb2JqZWN0OiAnSW50MzJBcnJheSdcbiAgfSxcbiAge1xuICAgIGNhbml1c2VJZDogJ3R5cGVkYXJyYXlzJyxcbiAgICBhc3ROb2RlVHlwZTogJ05ld0V4cHJlc3Npb24nLFxuICAgIG9iamVjdDogJ1VpbnQzMkFycmF5J1xuICB9LFxuICB7XG4gICAgY2FuaXVzZUlkOiAndHlwZWRhcnJheXMnLFxuICAgIGFzdE5vZGVUeXBlOiAnTmV3RXhwcmVzc2lvbicsXG4gICAgb2JqZWN0OiAnRmxvYXQzMkFycmF5J1xuICB9LFxuICB7XG4gICAgY2FuaXVzZUlkOiAndHlwZWRhcnJheXMnLFxuICAgIGFzdE5vZGVUeXBlOiAnTmV3RXhwcmVzc2lvbicsXG4gICAgb2JqZWN0OiAnRmxvYXQ2NEFycmF5J1xuICB9XG5dLm1hcChydWxlID0+XG4gIE9iamVjdC5hc3NpZ24oe30sIHJ1bGUsIHtcbiAgICBpc1ZhbGlkLFxuICAgIGdldFVuc3VwcG9ydGVkVGFyZ2V0cyxcbiAgICBpZDogcnVsZS5wcm9wZXJ0eSA/IGAke3J1bGUub2JqZWN0fS4ke3J1bGUucHJvcGVydHl9YCA6IHJ1bGUub2JqZWN0LFxuICAgIHByb3RvQ2hhaW5JZDogcnVsZS5wcm9wZXJ0eVxuICAgICAgPyBgJHtydWxlLm9iamVjdH0uJHtydWxlLnByb3BlcnR5fWBcbiAgICAgIDogcnVsZS5vYmplY3QsXG4gICAgcHJvdG9DaGFpbjogcnVsZS5wcm9wZXJ0eSA/IFtydWxlLm9iamVjdCwgcnVsZS5wcm9wZXJ0eV0gOiBbcnVsZS5vYmplY3RdXG4gIH0pXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBDYW5JVXNlUHJvdmlkZXI7XG4iXX0=
\No newline at end of file