1 | /* MapLibre GL JS is licensed under the 3-Clause BSD License. Full text of license: https://github.com/maplibre/maplibre-gl-js/blob/v2.1.9/LICENSE.txt */
|
2 | (function (global, factory) {
|
3 | typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
4 | typeof define === 'function' && define.amd ? define(factory) :
|
5 | (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.maplibregl = factory());
|
6 | })(this, (function () { 'use strict';
|
7 |
|
8 | /* eslint-disable */
|
9 |
|
10 | var shared, worker, maplibregl;
|
11 | // define gets called three times: one for each chunk. we rely on the order
|
12 | // they're imported to know which is which
|
13 | function define(_, chunk) {
|
14 | if (!shared) {
|
15 | shared = chunk;
|
16 | } else if (!worker) {
|
17 | worker = chunk;
|
18 | } else {
|
19 | var workerBundleString = 'var sharedChunk = {}; (' + shared + ')(sharedChunk); (' + worker + ')(sharedChunk);'
|
20 |
|
21 | var sharedChunk = {};
|
22 | shared(sharedChunk);
|
23 | maplibregl = chunk(sharedChunk);
|
24 | if (typeof window !== 'undefined') {
|
25 | maplibregl.workerUrl = window.URL.createObjectURL(new Blob([workerBundleString], { type: 'text/javascript' }));
|
26 | }
|
27 | }
|
28 | }
|
29 |
|
30 |
|
31 | define(['exports'], (function (exports) { 'use strict';
|
32 |
|
33 | var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
34 |
|
35 | function getDefaultExportFromCjs (x) {
|
36 | return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
37 | }
|
38 |
|
39 | function getDefaultExportFromNamespaceIfPresent (n) {
|
40 | return n && Object.prototype.hasOwnProperty.call(n, 'default') ? n['default'] : n;
|
41 | }
|
42 |
|
43 | function getDefaultExportFromNamespaceIfNotNamed (n) {
|
44 | return n && Object.prototype.hasOwnProperty.call(n, 'default') && Object.keys(n).length === 1 ? n['default'] : n;
|
45 | }
|
46 |
|
47 | function getAugmentedNamespace(n) {
|
48 | if (n.__esModule) return n;
|
49 | var a = Object.defineProperty({}, '__esModule', {value: true});
|
50 | Object.keys(n).forEach(function (k) {
|
51 | var d = Object.getOwnPropertyDescriptor(n, k);
|
52 | Object.defineProperty(a, k, d.get ? d : {
|
53 | enumerable: true,
|
54 | get: function () {
|
55 | return n[k];
|
56 | }
|
57 | });
|
58 | });
|
59 | return a;
|
60 | }
|
61 |
|
62 | function commonjsRequire (path) {
|
63 | throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
|
64 | }
|
65 |
|
66 | var assert$2 = {exports: {}};
|
67 |
|
68 | /*
|
69 | object-assign
|
70 | (c) Sindre Sorhus
|
71 | @license MIT
|
72 | */
|
73 |
|
74 | ;
|
75 | /* eslint-disable no-unused-vars */
|
76 | var getOwnPropertySymbols = Object.getOwnPropertySymbols;
|
77 | var hasOwnProperty = Object.prototype.hasOwnProperty;
|
78 | var propIsEnumerable = Object.prototype.propertyIsEnumerable;
|
79 |
|
80 | function toObject(val) {
|
81 | if (val === null || val === undefined) {
|
82 | throw new TypeError('Object.assign cannot be called with null or undefined');
|
83 | }
|
84 |
|
85 | return Object(val);
|
86 | }
|
87 |
|
88 | function shouldUseNative() {
|
89 | try {
|
90 | if (!Object.assign) {
|
91 | return false;
|
92 | }
|
93 |
|
94 | // Detect buggy property enumeration order in older V8 versions.
|
95 |
|
96 | // https://bugs.chromium.org/p/v8/issues/detail?id=4118
|
97 | var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
|
98 | test1[5] = 'de';
|
99 | if (Object.getOwnPropertyNames(test1)[0] === '5') {
|
100 | return false;
|
101 | }
|
102 |
|
103 | // https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
104 | var test2 = {};
|
105 | for (var i = 0; i < 10; i++) {
|
106 | test2['_' + String.fromCharCode(i)] = i;
|
107 | }
|
108 | var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
|
109 | return test2[n];
|
110 | });
|
111 | if (order2.join('') !== '0123456789') {
|
112 | return false;
|
113 | }
|
114 |
|
115 | // https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
116 | var test3 = {};
|
117 | 'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
|
118 | test3[letter] = letter;
|
119 | });
|
120 | if (Object.keys(Object.assign({}, test3)).join('') !==
|
121 | 'abcdefghijklmnopqrst') {
|
122 | return false;
|
123 | }
|
124 |
|
125 | return true;
|
126 | } catch (err) {
|
127 | // We don't expect any of the above to throw, but better to be safe.
|
128 | return false;
|
129 | }
|
130 | }
|
131 |
|
132 | var objectAssign$1 = shouldUseNative() ? Object.assign : function (target, source) {
|
133 | var from;
|
134 | var to = toObject(target);
|
135 | var symbols;
|
136 |
|
137 | for (var s = 1; s < arguments.length; s++) {
|
138 | from = Object(arguments[s]);
|
139 |
|
140 | for (var key in from) {
|
141 | if (hasOwnProperty.call(from, key)) {
|
142 | to[key] = from[key];
|
143 | }
|
144 | }
|
145 |
|
146 | if (getOwnPropertySymbols) {
|
147 | symbols = getOwnPropertySymbols(from);
|
148 | for (var i = 0; i < symbols.length; i++) {
|
149 | if (propIsEnumerable.call(from, symbols[i])) {
|
150 | to[symbols[i]] = from[symbols[i]];
|
151 | }
|
152 | }
|
153 | }
|
154 | }
|
155 |
|
156 | return to;
|
157 | };
|
158 |
|
159 | var util$1 = {};
|
160 |
|
161 | var isBufferBrowser = function isBuffer(arg) {
|
162 | return arg && typeof arg === 'object'
|
163 | && typeof arg.copy === 'function'
|
164 | && typeof arg.fill === 'function'
|
165 | && typeof arg.readUInt8 === 'function';
|
166 | };
|
167 |
|
168 | var inherits_browser$1 = {exports: {}};
|
169 |
|
170 | if (typeof Object.create === 'function') {
|
171 | // implementation from standard node.js 'util' module
|
172 | inherits_browser$1.exports = function inherits(ctor, superCtor) {
|
173 | ctor.super_ = superCtor;
|
174 | ctor.prototype = Object.create(superCtor.prototype, {
|
175 | constructor: {
|
176 | value: ctor,
|
177 | enumerable: false,
|
178 | writable: true,
|
179 | configurable: true
|
180 | }
|
181 | });
|
182 | };
|
183 | } else {
|
184 | // old school shim for old browsers
|
185 | inherits_browser$1.exports = function inherits(ctor, superCtor) {
|
186 | ctor.super_ = superCtor;
|
187 | var TempCtor = function () {};
|
188 | TempCtor.prototype = superCtor.prototype;
|
189 | ctor.prototype = new TempCtor();
|
190 | ctor.prototype.constructor = ctor;
|
191 | };
|
192 | }
|
193 |
|
194 | var inherits_browser = inherits_browser$1.exports;
|
195 |
|
196 | (function (exports) {
|
197 | // Copyright Joyent, Inc. and other Node contributors.
|
198 | //
|
199 | // Permission is hereby granted, free of charge, to any person obtaining a
|
200 | // copy of this software and associated documentation files (the
|
201 | // "Software"), to deal in the Software without restriction, including
|
202 | // without limitation the rights to use, copy, modify, merge, publish,
|
203 | // distribute, sublicense, and/or sell copies of the Software, and to permit
|
204 | // persons to whom the Software is furnished to do so, subject to the
|
205 | // following conditions:
|
206 | //
|
207 | // The above copyright notice and this permission notice shall be included
|
208 | // in all copies or substantial portions of the Software.
|
209 | //
|
210 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
211 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
212 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
213 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
214 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
215 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
216 | // USE OR OTHER DEALINGS IN THE SOFTWARE.
|
217 |
|
218 | var formatRegExp = /%[sdj%]/g;
|
219 | exports.format = function(f) {
|
220 | if (!isString(f)) {
|
221 | var objects = [];
|
222 | for (var i = 0; i < arguments.length; i++) {
|
223 | objects.push(inspect(arguments[i]));
|
224 | }
|
225 | return objects.join(' ');
|
226 | }
|
227 |
|
228 | var i = 1;
|
229 | var args = arguments;
|
230 | var len = args.length;
|
231 | var str = String(f).replace(formatRegExp, function(x) {
|
232 | if (x === '%%') return '%';
|
233 | if (i >= len) return x;
|
234 | switch (x) {
|
235 | case '%s': return String(args[i++]);
|
236 | case '%d': return Number(args[i++]);
|
237 | case '%j':
|
238 | try {
|
239 | return JSON.stringify(args[i++]);
|
240 | } catch (_) {
|
241 | return '[Circular]';
|
242 | }
|
243 | default:
|
244 | return x;
|
245 | }
|
246 | });
|
247 | for (var x = args[i]; i < len; x = args[++i]) {
|
248 | if (isNull(x) || !isObject(x)) {
|
249 | str += ' ' + x;
|
250 | } else {
|
251 | str += ' ' + inspect(x);
|
252 | }
|
253 | }
|
254 | return str;
|
255 | };
|
256 |
|
257 |
|
258 | // Mark that a method should not be used.
|
259 | // Returns a modified function which warns once by default.
|
260 | // If --no-deprecation is set, then it is a no-op.
|
261 | exports.deprecate = function(fn, msg) {
|
262 | // Allow for deprecating things in the process of starting up.
|
263 | if (isUndefined(global.process)) {
|
264 | return function() {
|
265 | return exports.deprecate(fn, msg).apply(this, arguments);
|
266 | };
|
267 | }
|
268 |
|
269 | if (process.noDeprecation === true) {
|
270 | return fn;
|
271 | }
|
272 |
|
273 | var warned = false;
|
274 | function deprecated() {
|
275 | if (!warned) {
|
276 | if (process.throwDeprecation) {
|
277 | throw new Error(msg);
|
278 | } else if (process.traceDeprecation) {
|
279 | console.trace(msg);
|
280 | } else {
|
281 | console.error(msg);
|
282 | }
|
283 | warned = true;
|
284 | }
|
285 | return fn.apply(this, arguments);
|
286 | }
|
287 |
|
288 | return deprecated;
|
289 | };
|
290 |
|
291 |
|
292 | var debugs = {};
|
293 | var debugEnviron;
|
294 | exports.debuglog = function(set) {
|
295 | if (isUndefined(debugEnviron))
|
296 | debugEnviron = process.env.NODE_DEBUG || '';
|
297 | set = set.toUpperCase();
|
298 | if (!debugs[set]) {
|
299 | if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
|
300 | var pid = process.pid;
|
301 | debugs[set] = function() {
|
302 | var msg = exports.format.apply(exports, arguments);
|
303 | console.error('%s %d: %s', set, pid, msg);
|
304 | };
|
305 | } else {
|
306 | debugs[set] = function() {};
|
307 | }
|
308 | }
|
309 | return debugs[set];
|
310 | };
|
311 |
|
312 |
|
313 | /**
|
314 | * Echos the value of a value. Trys to print the value out
|
315 | * in the best way possible given the different types.
|
316 | *
|
317 | * @param {Object} obj The object to print out.
|
318 | * @param {Object} opts Optional options object that alters the output.
|
319 | */
|
320 | /* legacy: obj, showHidden, depth, colors*/
|
321 | function inspect(obj, opts) {
|
322 | // default options
|
323 | var ctx = {
|
324 | seen: [],
|
325 | stylize: stylizeNoColor
|
326 | };
|
327 | // legacy...
|
328 | if (arguments.length >= 3) ctx.depth = arguments[2];
|
329 | if (arguments.length >= 4) ctx.colors = arguments[3];
|
330 | if (isBoolean(opts)) {
|
331 | // legacy...
|
332 | ctx.showHidden = opts;
|
333 | } else if (opts) {
|
334 | // got an "options" object
|
335 | exports._extend(ctx, opts);
|
336 | }
|
337 | // set default options
|
338 | if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
|
339 | if (isUndefined(ctx.depth)) ctx.depth = 2;
|
340 | if (isUndefined(ctx.colors)) ctx.colors = false;
|
341 | if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
|
342 | if (ctx.colors) ctx.stylize = stylizeWithColor;
|
343 | return formatValue(ctx, obj, ctx.depth);
|
344 | }
|
345 | exports.inspect = inspect;
|
346 |
|
347 |
|
348 | // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
|
349 | inspect.colors = {
|
350 | 'bold' : [1, 22],
|
351 | 'italic' : [3, 23],
|
352 | 'underline' : [4, 24],
|
353 | 'inverse' : [7, 27],
|
354 | 'white' : [37, 39],
|
355 | 'grey' : [90, 39],
|
356 | 'black' : [30, 39],
|
357 | 'blue' : [34, 39],
|
358 | 'cyan' : [36, 39],
|
359 | 'green' : [32, 39],
|
360 | 'magenta' : [35, 39],
|
361 | 'red' : [31, 39],
|
362 | 'yellow' : [33, 39]
|
363 | };
|
364 |
|
365 | // Don't use 'blue' not visible on cmd.exe
|
366 | inspect.styles = {
|
367 | 'special': 'cyan',
|
368 | 'number': 'yellow',
|
369 | 'boolean': 'yellow',
|
370 | 'undefined': 'grey',
|
371 | 'null': 'bold',
|
372 | 'string': 'green',
|
373 | 'date': 'magenta',
|
374 | // "name": intentionally not styling
|
375 | 'regexp': 'red'
|
376 | };
|
377 |
|
378 |
|
379 | function stylizeWithColor(str, styleType) {
|
380 | var style = inspect.styles[styleType];
|
381 |
|
382 | if (style) {
|
383 | return '\u001b[' + inspect.colors[style][0] + 'm' + str +
|
384 | '\u001b[' + inspect.colors[style][1] + 'm';
|
385 | } else {
|
386 | return str;
|
387 | }
|
388 | }
|
389 |
|
390 |
|
391 | function stylizeNoColor(str, styleType) {
|
392 | return str;
|
393 | }
|
394 |
|
395 |
|
396 | function arrayToHash(array) {
|
397 | var hash = {};
|
398 |
|
399 | array.forEach(function(val, idx) {
|
400 | hash[val] = true;
|
401 | });
|
402 |
|
403 | return hash;
|
404 | }
|
405 |
|
406 |
|
407 | function formatValue(ctx, value, recurseTimes) {
|
408 | // Provide a hook for user-specified inspect functions.
|
409 | // Check that value is an object with an inspect function on it
|
410 | if (ctx.customInspect &&
|
411 | value &&
|
412 | isFunction(value.inspect) &&
|
413 | // Filter out the util module, it's inspect function is special
|
414 | value.inspect !== exports.inspect &&
|
415 | // Also filter out any prototype objects using the circular check.
|
416 | !(value.constructor && value.constructor.prototype === value)) {
|
417 | var ret = value.inspect(recurseTimes, ctx);
|
418 | if (!isString(ret)) {
|
419 | ret = formatValue(ctx, ret, recurseTimes);
|
420 | }
|
421 | return ret;
|
422 | }
|
423 |
|
424 | // Primitive types cannot have properties
|
425 | var primitive = formatPrimitive(ctx, value);
|
426 | if (primitive) {
|
427 | return primitive;
|
428 | }
|
429 |
|
430 | // Look up the keys of the object.
|
431 | var keys = Object.keys(value);
|
432 | var visibleKeys = arrayToHash(keys);
|
433 |
|
434 | if (ctx.showHidden) {
|
435 | keys = Object.getOwnPropertyNames(value);
|
436 | }
|
437 |
|
438 | // IE doesn't make error fields non-enumerable
|
439 | // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
|
440 | if (isError(value)
|
441 | && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
|
442 | return formatError(value);
|
443 | }
|
444 |
|
445 | // Some type of object without properties can be shortcutted.
|
446 | if (keys.length === 0) {
|
447 | if (isFunction(value)) {
|
448 | var name = value.name ? ': ' + value.name : '';
|
449 | return ctx.stylize('[Function' + name + ']', 'special');
|
450 | }
|
451 | if (isRegExp(value)) {
|
452 | return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
453 | }
|
454 | if (isDate(value)) {
|
455 | return ctx.stylize(Date.prototype.toString.call(value), 'date');
|
456 | }
|
457 | if (isError(value)) {
|
458 | return formatError(value);
|
459 | }
|
460 | }
|
461 |
|
462 | var base = '', array = false, braces = ['{', '}'];
|
463 |
|
464 | // Make Array say that they are Array
|
465 | if (isArray(value)) {
|
466 | array = true;
|
467 | braces = ['[', ']'];
|
468 | }
|
469 |
|
470 | // Make functions say that they are functions
|
471 | if (isFunction(value)) {
|
472 | var n = value.name ? ': ' + value.name : '';
|
473 | base = ' [Function' + n + ']';
|
474 | }
|
475 |
|
476 | // Make RegExps say that they are RegExps
|
477 | if (isRegExp(value)) {
|
478 | base = ' ' + RegExp.prototype.toString.call(value);
|
479 | }
|
480 |
|
481 | // Make dates with properties first say the date
|
482 | if (isDate(value)) {
|
483 | base = ' ' + Date.prototype.toUTCString.call(value);
|
484 | }
|
485 |
|
486 | // Make error with message first say the error
|
487 | if (isError(value)) {
|
488 | base = ' ' + formatError(value);
|
489 | }
|
490 |
|
491 | if (keys.length === 0 && (!array || value.length == 0)) {
|
492 | return braces[0] + base + braces[1];
|
493 | }
|
494 |
|
495 | if (recurseTimes < 0) {
|
496 | if (isRegExp(value)) {
|
497 | return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
498 | } else {
|
499 | return ctx.stylize('[Object]', 'special');
|
500 | }
|
501 | }
|
502 |
|
503 | ctx.seen.push(value);
|
504 |
|
505 | var output;
|
506 | if (array) {
|
507 | output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
|
508 | } else {
|
509 | output = keys.map(function(key) {
|
510 | return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
|
511 | });
|
512 | }
|
513 |
|
514 | ctx.seen.pop();
|
515 |
|
516 | return reduceToSingleString(output, base, braces);
|
517 | }
|
518 |
|
519 |
|
520 | function formatPrimitive(ctx, value) {
|
521 | if (isUndefined(value))
|
522 | return ctx.stylize('undefined', 'undefined');
|
523 | if (isString(value)) {
|
524 | var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
|
525 | .replace(/'/g, "\\'")
|
526 | .replace(/\\"/g, '"') + '\'';
|
527 | return ctx.stylize(simple, 'string');
|
528 | }
|
529 | if (isNumber(value))
|
530 | return ctx.stylize('' + value, 'number');
|
531 | if (isBoolean(value))
|
532 | return ctx.stylize('' + value, 'boolean');
|
533 | // For some reason typeof null is "object", so special case here.
|
534 | if (isNull(value))
|
535 | return ctx.stylize('null', 'null');
|
536 | }
|
537 |
|
538 |
|
539 | function formatError(value) {
|
540 | return '[' + Error.prototype.toString.call(value) + ']';
|
541 | }
|
542 |
|
543 |
|
544 | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
|
545 | var output = [];
|
546 | for (var i = 0, l = value.length; i < l; ++i) {
|
547 | if (hasOwnProperty(value, String(i))) {
|
548 | output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
549 | String(i), true));
|
550 | } else {
|
551 | output.push('');
|
552 | }
|
553 | }
|
554 | keys.forEach(function(key) {
|
555 | if (!key.match(/^\d+$/)) {
|
556 | output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
557 | key, true));
|
558 | }
|
559 | });
|
560 | return output;
|
561 | }
|
562 |
|
563 |
|
564 | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
|
565 | var name, str, desc;
|
566 | desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
|
567 | if (desc.get) {
|
568 | if (desc.set) {
|
569 | str = ctx.stylize('[Getter/Setter]', 'special');
|
570 | } else {
|
571 | str = ctx.stylize('[Getter]', 'special');
|
572 | }
|
573 | } else {
|
574 | if (desc.set) {
|
575 | str = ctx.stylize('[Setter]', 'special');
|
576 | }
|
577 | }
|
578 | if (!hasOwnProperty(visibleKeys, key)) {
|
579 | name = '[' + key + ']';
|
580 | }
|
581 | if (!str) {
|
582 | if (ctx.seen.indexOf(desc.value) < 0) {
|
583 | if (isNull(recurseTimes)) {
|
584 | str = formatValue(ctx, desc.value, null);
|
585 | } else {
|
586 | str = formatValue(ctx, desc.value, recurseTimes - 1);
|
587 | }
|
588 | if (str.indexOf('\n') > -1) {
|
589 | if (array) {
|
590 | str = str.split('\n').map(function(line) {
|
591 | return ' ' + line;
|
592 | }).join('\n').substr(2);
|
593 | } else {
|
594 | str = '\n' + str.split('\n').map(function(line) {
|
595 | return ' ' + line;
|
596 | }).join('\n');
|
597 | }
|
598 | }
|
599 | } else {
|
600 | str = ctx.stylize('[Circular]', 'special');
|
601 | }
|
602 | }
|
603 | if (isUndefined(name)) {
|
604 | if (array && key.match(/^\d+$/)) {
|
605 | return str;
|
606 | }
|
607 | name = JSON.stringify('' + key);
|
608 | if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
|
609 | name = name.substr(1, name.length - 2);
|
610 | name = ctx.stylize(name, 'name');
|
611 | } else {
|
612 | name = name.replace(/'/g, "\\'")
|
613 | .replace(/\\"/g, '"')
|
614 | .replace(/(^"|"$)/g, "'");
|
615 | name = ctx.stylize(name, 'string');
|
616 | }
|
617 | }
|
618 |
|
619 | return name + ': ' + str;
|
620 | }
|
621 |
|
622 |
|
623 | function reduceToSingleString(output, base, braces) {
|
624 | var numLinesEst = 0;
|
625 | var length = output.reduce(function(prev, cur) {
|
626 | numLinesEst++;
|
627 | if (cur.indexOf('\n') >= 0) numLinesEst++;
|
628 | return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
|
629 | }, 0);
|
630 |
|
631 | if (length > 60) {
|
632 | return braces[0] +
|
633 | (base === '' ? '' : base + '\n ') +
|
634 | ' ' +
|
635 | output.join(',\n ') +
|
636 | ' ' +
|
637 | braces[1];
|
638 | }
|
639 |
|
640 | return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
|
641 | }
|
642 |
|
643 |
|
644 | // NOTE: These type checking functions intentionally don't use `instanceof`
|
645 | // because it is fragile and can be easily faked with `Object.create()`.
|
646 | function isArray(ar) {
|
647 | return Array.isArray(ar);
|
648 | }
|
649 | exports.isArray = isArray;
|
650 |
|
651 | function isBoolean(arg) {
|
652 | return typeof arg === 'boolean';
|
653 | }
|
654 | exports.isBoolean = isBoolean;
|
655 |
|
656 | function isNull(arg) {
|
657 | return arg === null;
|
658 | }
|
659 | exports.isNull = isNull;
|
660 |
|
661 | function isNullOrUndefined(arg) {
|
662 | return arg == null;
|
663 | }
|
664 | exports.isNullOrUndefined = isNullOrUndefined;
|
665 |
|
666 | function isNumber(arg) {
|
667 | return typeof arg === 'number';
|
668 | }
|
669 | exports.isNumber = isNumber;
|
670 |
|
671 | function isString(arg) {
|
672 | return typeof arg === 'string';
|
673 | }
|
674 | exports.isString = isString;
|
675 |
|
676 | function isSymbol(arg) {
|
677 | return typeof arg === 'symbol';
|
678 | }
|
679 | exports.isSymbol = isSymbol;
|
680 |
|
681 | function isUndefined(arg) {
|
682 | return arg === void 0;
|
683 | }
|
684 | exports.isUndefined = isUndefined;
|
685 |
|
686 | function isRegExp(re) {
|
687 | return isObject(re) && objectToString(re) === '[object RegExp]';
|
688 | }
|
689 | exports.isRegExp = isRegExp;
|
690 |
|
691 | function isObject(arg) {
|
692 | return typeof arg === 'object' && arg !== null;
|
693 | }
|
694 | exports.isObject = isObject;
|
695 |
|
696 | function isDate(d) {
|
697 | return isObject(d) && objectToString(d) === '[object Date]';
|
698 | }
|
699 | exports.isDate = isDate;
|
700 |
|
701 | function isError(e) {
|
702 | return isObject(e) &&
|
703 | (objectToString(e) === '[object Error]' || e instanceof Error);
|
704 | }
|
705 | exports.isError = isError;
|
706 |
|
707 | function isFunction(arg) {
|
708 | return typeof arg === 'function';
|
709 | }
|
710 | exports.isFunction = isFunction;
|
711 |
|
712 | function isPrimitive(arg) {
|
713 | return arg === null ||
|
714 | typeof arg === 'boolean' ||
|
715 | typeof arg === 'number' ||
|
716 | typeof arg === 'string' ||
|
717 | typeof arg === 'symbol' || // ES6 symbol
|
718 | typeof arg === 'undefined';
|
719 | }
|
720 | exports.isPrimitive = isPrimitive;
|
721 |
|
722 | exports.isBuffer = isBufferBrowser;
|
723 |
|
724 | function objectToString(o) {
|
725 | return Object.prototype.toString.call(o);
|
726 | }
|
727 |
|
728 |
|
729 | function pad(n) {
|
730 | return n < 10 ? '0' + n.toString(10) : n.toString(10);
|
731 | }
|
732 |
|
733 |
|
734 | var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
|
735 | 'Oct', 'Nov', 'Dec'];
|
736 |
|
737 | // 26 Feb 16:19:34
|
738 | function timestamp() {
|
739 | var d = new Date();
|
740 | var time = [pad(d.getHours()),
|
741 | pad(d.getMinutes()),
|
742 | pad(d.getSeconds())].join(':');
|
743 | return [d.getDate(), months[d.getMonth()], time].join(' ');
|
744 | }
|
745 |
|
746 |
|
747 | // log is just a thin wrapper to console.log that prepends a timestamp
|
748 | exports.log = function() {
|
749 | console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
|
750 | };
|
751 |
|
752 |
|
753 | /**
|
754 | * Inherit the prototype methods from one constructor into another.
|
755 | *
|
756 | * The Function.prototype.inherits from lang.js rewritten as a standalone
|
757 | * function (not on Function.prototype). NOTE: If this file is to be loaded
|
758 | * during bootstrapping this function needs to be rewritten using some native
|
759 | * functions as prototype setup using normal JavaScript does not work as
|
760 | * expected during bootstrapping (see mirror.js in r114903).
|
761 | *
|
762 | * @param {function} ctor Constructor function which needs to inherit the
|
763 | * prototype.
|
764 | * @param {function} superCtor Constructor function to inherit prototype from.
|
765 | */
|
766 | exports.inherits = inherits_browser$1.exports;
|
767 |
|
768 | exports._extend = function(origin, add) {
|
769 | // Don't do anything if add isn't an object
|
770 | if (!add || !isObject(add)) return origin;
|
771 |
|
772 | var keys = Object.keys(add);
|
773 | var i = keys.length;
|
774 | while (i--) {
|
775 | origin[keys[i]] = add[keys[i]];
|
776 | }
|
777 | return origin;
|
778 | };
|
779 |
|
780 | function hasOwnProperty(obj, prop) {
|
781 | return Object.prototype.hasOwnProperty.call(obj, prop);
|
782 | }
|
783 | }(util$1));
|
784 |
|
785 | ;
|
786 |
|
787 | var objectAssign = objectAssign$1;
|
788 |
|
789 | // compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js
|
790 | // original notice:
|
791 |
|
792 | /*!
|
793 | * The buffer module from node.js, for the browser.
|
794 | *
|
795 | * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
|
796 | * @license MIT
|
797 | */
|
798 | function compare$1(a, b) {
|
799 | if (a === b) {
|
800 | return 0;
|
801 | }
|
802 |
|
803 | var x = a.length;
|
804 | var y = b.length;
|
805 |
|
806 | for (var i = 0, len = Math.min(x, y); i < len; ++i) {
|
807 | if (a[i] !== b[i]) {
|
808 | x = a[i];
|
809 | y = b[i];
|
810 | break;
|
811 | }
|
812 | }
|
813 |
|
814 | if (x < y) {
|
815 | return -1;
|
816 | }
|
817 | if (y < x) {
|
818 | return 1;
|
819 | }
|
820 | return 0;
|
821 | }
|
822 | function isBuffer(b) {
|
823 | if (global.Buffer && typeof global.Buffer.isBuffer === 'function') {
|
824 | return global.Buffer.isBuffer(b);
|
825 | }
|
826 | return !!(b != null && b._isBuffer);
|
827 | }
|
828 |
|
829 | // based on node assert, original notice:
|
830 | // NB: The URL to the CommonJS spec is kept just for tradition.
|
831 | // node-assert has evolved a lot since then, both in API and behavior.
|
832 |
|
833 | // http://wiki.commonjs.org/wiki/Unit_Testing/1.0
|
834 | //
|
835 | // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
|
836 | //
|
837 | // Originally from narwhal.js (http://narwhaljs.org)
|
838 | // Copyright (c) 2009 Thomas Robinson <280north.com>
|
839 | //
|
840 | // Permission is hereby granted, free of charge, to any person obtaining a copy
|
841 | // of this software and associated documentation files (the 'Software'), to
|
842 | // deal in the Software without restriction, including without limitation the
|
843 | // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
844 | // sell copies of the Software, and to permit persons to whom the Software is
|
845 | // furnished to do so, subject to the following conditions:
|
846 | //
|
847 | // The above copyright notice and this permission notice shall be included in
|
848 | // all copies or substantial portions of the Software.
|
849 | //
|
850 | // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
851 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
852 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
853 | // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
854 | // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
855 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
856 |
|
857 | var util = util$1;
|
858 | var hasOwn = Object.prototype.hasOwnProperty;
|
859 | var pSlice = Array.prototype.slice;
|
860 | var functionsHaveNames = (function () {
|
861 | return function foo() {}.name === 'foo';
|
862 | }());
|
863 | function pToString (obj) {
|
864 | return Object.prototype.toString.call(obj);
|
865 | }
|
866 | function isView(arrbuf) {
|
867 | if (isBuffer(arrbuf)) {
|
868 | return false;
|
869 | }
|
870 | if (typeof global.ArrayBuffer !== 'function') {
|
871 | return false;
|
872 | }
|
873 | if (typeof ArrayBuffer.isView === 'function') {
|
874 | return ArrayBuffer.isView(arrbuf);
|
875 | }
|
876 | if (!arrbuf) {
|
877 | return false;
|
878 | }
|
879 | if (arrbuf instanceof DataView) {
|
880 | return true;
|
881 | }
|
882 | if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {
|
883 | return true;
|
884 | }
|
885 | return false;
|
886 | }
|
887 | // 1. The assert module provides functions that throw
|
888 | // AssertionError's when particular conditions are not met. The
|
889 | // assert module must conform to the following interface.
|
890 |
|
891 | var assert = assert$2.exports = ok;
|
892 |
|
893 | // 2. The AssertionError is defined in assert.
|
894 | // new assert.AssertionError({ message: message,
|
895 | // actual: actual,
|
896 | // expected: expected })
|
897 |
|
898 | var regex = /\s*function\s+([^\(\s]*)\s*/;
|
899 | // based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js
|
900 | function getName(func) {
|
901 | if (!util.isFunction(func)) {
|
902 | return;
|
903 | }
|
904 | if (functionsHaveNames) {
|
905 | return func.name;
|
906 | }
|
907 | var str = func.toString();
|
908 | var match = str.match(regex);
|
909 | return match && match[1];
|
910 | }
|
911 | assert.AssertionError = function AssertionError(options) {
|
912 | this.name = 'AssertionError';
|
913 | this.actual = options.actual;
|
914 | this.expected = options.expected;
|
915 | this.operator = options.operator;
|
916 | if (options.message) {
|
917 | this.message = options.message;
|
918 | this.generatedMessage = false;
|
919 | } else {
|
920 | this.message = getMessage(this);
|
921 | this.generatedMessage = true;
|
922 | }
|
923 | var stackStartFunction = options.stackStartFunction || fail;
|
924 | if (Error.captureStackTrace) {
|
925 | Error.captureStackTrace(this, stackStartFunction);
|
926 | } else {
|
927 | // non v8 browsers so we can have a stacktrace
|
928 | var err = new Error();
|
929 | if (err.stack) {
|
930 | var out = err.stack;
|
931 |
|
932 | // try to strip useless frames
|
933 | var fn_name = getName(stackStartFunction);
|
934 | var idx = out.indexOf('\n' + fn_name);
|
935 | if (idx >= 0) {
|
936 | // once we have located the function frame
|
937 | // we need to strip out everything before it (and its line)
|
938 | var next_line = out.indexOf('\n', idx + 1);
|
939 | out = out.substring(next_line + 1);
|
940 | }
|
941 |
|
942 | this.stack = out;
|
943 | }
|
944 | }
|
945 | };
|
946 |
|
947 | // assert.AssertionError instanceof Error
|
948 | util.inherits(assert.AssertionError, Error);
|
949 |
|
950 | function truncate(s, n) {
|
951 | if (typeof s === 'string') {
|
952 | return s.length < n ? s : s.slice(0, n);
|
953 | } else {
|
954 | return s;
|
955 | }
|
956 | }
|
957 | function inspect(something) {
|
958 | if (functionsHaveNames || !util.isFunction(something)) {
|
959 | return util.inspect(something);
|
960 | }
|
961 | var rawname = getName(something);
|
962 | var name = rawname ? ': ' + rawname : '';
|
963 | return '[Function' + name + ']';
|
964 | }
|
965 | function getMessage(self) {
|
966 | return truncate(inspect(self.actual), 128) + ' ' +
|
967 | self.operator + ' ' +
|
968 | truncate(inspect(self.expected), 128);
|
969 | }
|
970 |
|
971 | // At present only the three keys mentioned above are used and
|
972 | // understood by the spec. Implementations or sub modules can pass
|
973 | // other keys to the AssertionError's constructor - they will be
|
974 | // ignored.
|
975 |
|
976 | // 3. All of the following functions must throw an AssertionError
|
977 | // when a corresponding condition is not met, with a message that
|
978 | // may be undefined if not provided. All assertion methods provide
|
979 | // both the actual and expected values to the assertion error for
|
980 | // display purposes.
|
981 |
|
982 | function fail(actual, expected, message, operator, stackStartFunction) {
|
983 | throw new assert.AssertionError({
|
984 | message: message,
|
985 | actual: actual,
|
986 | expected: expected,
|
987 | operator: operator,
|
988 | stackStartFunction: stackStartFunction
|
989 | });
|
990 | }
|
991 |
|
992 | // EXTENSION! allows for well behaved errors defined elsewhere.
|
993 | assert.fail = fail;
|
994 |
|
995 | // 4. Pure assertion tests whether a value is truthy, as determined
|
996 | // by !!guard.
|
997 | // assert.ok(guard, message_opt);
|
998 | // This statement is equivalent to assert.equal(true, !!guard,
|
999 | // message_opt);. To test strictly for the value true, use
|
1000 | // assert.strictEqual(true, guard, message_opt);.
|
1001 |
|
1002 | function ok(value, message) {
|
1003 | if (!value) fail(value, true, message, '==', assert.ok);
|
1004 | }
|
1005 | assert.ok = ok;
|
1006 |
|
1007 | // 5. The equality assertion tests shallow, coercive equality with
|
1008 | // ==.
|
1009 | // assert.equal(actual, expected, message_opt);
|
1010 |
|
1011 | assert.equal = function equal(actual, expected, message) {
|
1012 | if (actual != expected) fail(actual, expected, message, '==', assert.equal);
|
1013 | };
|
1014 |
|
1015 | // 6. The non-equality assertion tests for whether two objects are not equal
|
1016 | // with != assert.notEqual(actual, expected, message_opt);
|
1017 |
|
1018 | assert.notEqual = function notEqual(actual, expected, message) {
|
1019 | if (actual == expected) {
|
1020 | fail(actual, expected, message, '!=', assert.notEqual);
|
1021 | }
|
1022 | };
|
1023 |
|
1024 | // 7. The equivalence assertion tests a deep equality relation.
|
1025 | // assert.deepEqual(actual, expected, message_opt);
|
1026 |
|
1027 | assert.deepEqual = function deepEqual(actual, expected, message) {
|
1028 | if (!_deepEqual(actual, expected, false)) {
|
1029 | fail(actual, expected, message, 'deepEqual', assert.deepEqual);
|
1030 | }
|
1031 | };
|
1032 |
|
1033 | assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
|
1034 | if (!_deepEqual(actual, expected, true)) {
|
1035 | fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual);
|
1036 | }
|
1037 | };
|
1038 |
|
1039 | function _deepEqual(actual, expected, strict, memos) {
|
1040 | // 7.1. All identical values are equivalent, as determined by ===.
|
1041 | if (actual === expected) {
|
1042 | return true;
|
1043 | } else if (isBuffer(actual) && isBuffer(expected)) {
|
1044 | return compare$1(actual, expected) === 0;
|
1045 |
|
1046 | // 7.2. If the expected value is a Date object, the actual value is
|
1047 | // equivalent if it is also a Date object that refers to the same time.
|
1048 | } else if (util.isDate(actual) && util.isDate(expected)) {
|
1049 | return actual.getTime() === expected.getTime();
|
1050 |
|
1051 | // 7.3 If the expected value is a RegExp object, the actual value is
|
1052 | // equivalent if it is also a RegExp object with the same source and
|
1053 | // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
|
1054 | } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
|
1055 | return actual.source === expected.source &&
|
1056 | actual.global === expected.global &&
|
1057 | actual.multiline === expected.multiline &&
|
1058 | actual.lastIndex === expected.lastIndex &&
|
1059 | actual.ignoreCase === expected.ignoreCase;
|
1060 |
|
1061 | // 7.4. Other pairs that do not both pass typeof value == 'object',
|
1062 | // equivalence is determined by ==.
|
1063 | } else if ((actual === null || typeof actual !== 'object') &&
|
1064 | (expected === null || typeof expected !== 'object')) {
|
1065 | return strict ? actual === expected : actual == expected;
|
1066 |
|
1067 | // If both values are instances of typed arrays, wrap their underlying
|
1068 | // ArrayBuffers in a Buffer each to increase performance
|
1069 | // This optimization requires the arrays to have the same type as checked by
|
1070 | // Object.prototype.toString (aka pToString). Never perform binary
|
1071 | // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their
|
1072 | // bit patterns are not identical.
|
1073 | } else if (isView(actual) && isView(expected) &&
|
1074 | pToString(actual) === pToString(expected) &&
|
1075 | !(actual instanceof Float32Array ||
|
1076 | actual instanceof Float64Array)) {
|
1077 | return compare$1(new Uint8Array(actual.buffer),
|
1078 | new Uint8Array(expected.buffer)) === 0;
|
1079 |
|
1080 | // 7.5 For all other Object pairs, including Array objects, equivalence is
|
1081 | // determined by having the same number of owned properties (as verified
|
1082 | // with Object.prototype.hasOwnProperty.call), the same set of keys
|
1083 | // (although not necessarily the same order), equivalent values for every
|
1084 | // corresponding key, and an identical 'prototype' property. Note: this
|
1085 | // accounts for both named and indexed properties on Arrays.
|
1086 | } else if (isBuffer(actual) !== isBuffer(expected)) {
|
1087 | return false;
|
1088 | } else {
|
1089 | memos = memos || {actual: [], expected: []};
|
1090 |
|
1091 | var actualIndex = memos.actual.indexOf(actual);
|
1092 | if (actualIndex !== -1) {
|
1093 | if (actualIndex === memos.expected.indexOf(expected)) {
|
1094 | return true;
|
1095 | }
|
1096 | }
|
1097 |
|
1098 | memos.actual.push(actual);
|
1099 | memos.expected.push(expected);
|
1100 |
|
1101 | return objEquiv(actual, expected, strict, memos);
|
1102 | }
|
1103 | }
|
1104 |
|
1105 | function isArguments(object) {
|
1106 | return Object.prototype.toString.call(object) == '[object Arguments]';
|
1107 | }
|
1108 |
|
1109 | function objEquiv(a, b, strict, actualVisitedObjects) {
|
1110 | if (a === null || a === undefined || b === null || b === undefined)
|
1111 | return false;
|
1112 | // if one is a primitive, the other must be same
|
1113 | if (util.isPrimitive(a) || util.isPrimitive(b))
|
1114 | return a === b;
|
1115 | if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))
|
1116 | return false;
|
1117 | var aIsArgs = isArguments(a);
|
1118 | var bIsArgs = isArguments(b);
|
1119 | if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
|
1120 | return false;
|
1121 | if (aIsArgs) {
|
1122 | a = pSlice.call(a);
|
1123 | b = pSlice.call(b);
|
1124 | return _deepEqual(a, b, strict);
|
1125 | }
|
1126 | var ka = objectKeys(a);
|
1127 | var kb = objectKeys(b);
|
1128 | var key, i;
|
1129 | // having the same number of owned properties (keys incorporates
|
1130 | // hasOwnProperty)
|
1131 | if (ka.length !== kb.length)
|
1132 | return false;
|
1133 | //the same set of keys (although not necessarily the same order),
|
1134 | ka.sort();
|
1135 | kb.sort();
|
1136 | //~~~cheap key test
|
1137 | for (i = ka.length - 1; i >= 0; i--) {
|
1138 | if (ka[i] !== kb[i])
|
1139 | return false;
|
1140 | }
|
1141 | //equivalent values for every corresponding key, and
|
1142 | //~~~possibly expensive deep test
|
1143 | for (i = ka.length - 1; i >= 0; i--) {
|
1144 | key = ka[i];
|
1145 | if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))
|
1146 | return false;
|
1147 | }
|
1148 | return true;
|
1149 | }
|
1150 |
|
1151 | // 8. The non-equivalence assertion tests for any deep inequality.
|
1152 | // assert.notDeepEqual(actual, expected, message_opt);
|
1153 |
|
1154 | assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
|
1155 | if (_deepEqual(actual, expected, false)) {
|
1156 | fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
|
1157 | }
|
1158 | };
|
1159 |
|
1160 | assert.notDeepStrictEqual = notDeepStrictEqual;
|
1161 | function notDeepStrictEqual(actual, expected, message) {
|
1162 | if (_deepEqual(actual, expected, true)) {
|
1163 | fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);
|
1164 | }
|
1165 | }
|
1166 |
|
1167 |
|
1168 | // 9. The strict equality assertion tests strict equality, as determined by ===.
|
1169 | // assert.strictEqual(actual, expected, message_opt);
|
1170 |
|
1171 | assert.strictEqual = function strictEqual(actual, expected, message) {
|
1172 | if (actual !== expected) {
|
1173 | fail(actual, expected, message, '===', assert.strictEqual);
|
1174 | }
|
1175 | };
|
1176 |
|
1177 | // 10. The strict non-equality assertion tests for strict inequality, as
|
1178 | // determined by !==. assert.notStrictEqual(actual, expected, message_opt);
|
1179 |
|
1180 | assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
|
1181 | if (actual === expected) {
|
1182 | fail(actual, expected, message, '!==', assert.notStrictEqual);
|
1183 | }
|
1184 | };
|
1185 |
|
1186 | function expectedException(actual, expected) {
|
1187 | if (!actual || !expected) {
|
1188 | return false;
|
1189 | }
|
1190 |
|
1191 | if (Object.prototype.toString.call(expected) == '[object RegExp]') {
|
1192 | return expected.test(actual);
|
1193 | }
|
1194 |
|
1195 | try {
|
1196 | if (actual instanceof expected) {
|
1197 | return true;
|
1198 | }
|
1199 | } catch (e) {
|
1200 | // Ignore. The instanceof check doesn't work for arrow functions.
|
1201 | }
|
1202 |
|
1203 | if (Error.isPrototypeOf(expected)) {
|
1204 | return false;
|
1205 | }
|
1206 |
|
1207 | return expected.call({}, actual) === true;
|
1208 | }
|
1209 |
|
1210 | function _tryBlock(block) {
|
1211 | var error;
|
1212 | try {
|
1213 | block();
|
1214 | } catch (e) {
|
1215 | error = e;
|
1216 | }
|
1217 | return error;
|
1218 | }
|
1219 |
|
1220 | function _throws(shouldThrow, block, expected, message) {
|
1221 | var actual;
|
1222 |
|
1223 | if (typeof block !== 'function') {
|
1224 | throw new TypeError('"block" argument must be a function');
|
1225 | }
|
1226 |
|
1227 | if (typeof expected === 'string') {
|
1228 | message = expected;
|
1229 | expected = null;
|
1230 | }
|
1231 |
|
1232 | actual = _tryBlock(block);
|
1233 |
|
1234 | message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
|
1235 | (message ? ' ' + message : '.');
|
1236 |
|
1237 | if (shouldThrow && !actual) {
|
1238 | fail(actual, expected, 'Missing expected exception' + message);
|
1239 | }
|
1240 |
|
1241 | var userProvidedMessage = typeof message === 'string';
|
1242 | var isUnwantedException = !shouldThrow && util.isError(actual);
|
1243 | var isUnexpectedException = !shouldThrow && actual && !expected;
|
1244 |
|
1245 | if ((isUnwantedException &&
|
1246 | userProvidedMessage &&
|
1247 | expectedException(actual, expected)) ||
|
1248 | isUnexpectedException) {
|
1249 | fail(actual, expected, 'Got unwanted exception' + message);
|
1250 | }
|
1251 |
|
1252 | if ((shouldThrow && actual && expected &&
|
1253 | !expectedException(actual, expected)) || (!shouldThrow && actual)) {
|
1254 | throw actual;
|
1255 | }
|
1256 | }
|
1257 |
|
1258 | // 11. Expected to throw an error:
|
1259 | // assert.throws(block, Error_opt, message_opt);
|
1260 |
|
1261 | assert.throws = function(block, /*optional*/error, /*optional*/message) {
|
1262 | _throws(true, block, error, message);
|
1263 | };
|
1264 |
|
1265 | // EXTENSION! This is annoying to write outside this module.
|
1266 | assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {
|
1267 | _throws(false, block, error, message);
|
1268 | };
|
1269 |
|
1270 | assert.ifError = function(err) { if (err) throw err; };
|
1271 |
|
1272 | // Expose a strict only variant of assert
|
1273 | function strict(value, message) {
|
1274 | if (!value) fail(value, true, message, '==', strict);
|
1275 | }
|
1276 | assert.strict = objectAssign(strict, assert, {
|
1277 | equal: assert.strictEqual,
|
1278 | deepEqual: assert.deepStrictEqual,
|
1279 | notEqual: assert.notStrictEqual,
|
1280 | notDeepEqual: assert.notDeepStrictEqual
|
1281 | });
|
1282 | assert.strict.strict = assert.strict;
|
1283 |
|
1284 | var objectKeys = Object.keys || function (obj) {
|
1285 | var keys = [];
|
1286 | for (var key in obj) {
|
1287 | if (hasOwn.call(obj, key)) keys.push(key);
|
1288 | }
|
1289 | return keys;
|
1290 | };
|
1291 |
|
1292 | var assert$1 = assert$2.exports;
|
1293 |
|
1294 | ;
|
1295 |
|
1296 | var unitbezier = UnitBezier;
|
1297 |
|
1298 | function UnitBezier(p1x, p1y, p2x, p2y) {
|
1299 | // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).
|
1300 | this.cx = 3.0 * p1x;
|
1301 | this.bx = 3.0 * (p2x - p1x) - this.cx;
|
1302 | this.ax = 1.0 - this.cx - this.bx;
|
1303 |
|
1304 | this.cy = 3.0 * p1y;
|
1305 | this.by = 3.0 * (p2y - p1y) - this.cy;
|
1306 | this.ay = 1.0 - this.cy - this.by;
|
1307 |
|
1308 | this.p1x = p1x;
|
1309 | this.p1y = p1y;
|
1310 | this.p2x = p2x;
|
1311 | this.p2y = p2y;
|
1312 | }
|
1313 |
|
1314 | UnitBezier.prototype = {
|
1315 | sampleCurveX: function (t) {
|
1316 | // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.
|
1317 | return ((this.ax * t + this.bx) * t + this.cx) * t;
|
1318 | },
|
1319 |
|
1320 | sampleCurveY: function (t) {
|
1321 | return ((this.ay * t + this.by) * t + this.cy) * t;
|
1322 | },
|
1323 |
|
1324 | sampleCurveDerivativeX: function (t) {
|
1325 | return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx;
|
1326 | },
|
1327 |
|
1328 | solveCurveX: function (x, epsilon) {
|
1329 | if (epsilon === undefined) epsilon = 1e-6;
|
1330 |
|
1331 | if (x < 0.0) return 0.0;
|
1332 | if (x > 1.0) return 1.0;
|
1333 |
|
1334 | var t = x;
|
1335 |
|
1336 | // First try a few iterations of Newton's method - normally very fast.
|
1337 | for (var i = 0; i < 8; i++) {
|
1338 | var x2 = this.sampleCurveX(t) - x;
|
1339 | if (Math.abs(x2) < epsilon) return t;
|
1340 |
|
1341 | var d2 = this.sampleCurveDerivativeX(t);
|
1342 | if (Math.abs(d2) < 1e-6) break;
|
1343 |
|
1344 | t = t - x2 / d2;
|
1345 | }
|
1346 |
|
1347 | // Fall back to the bisection method for reliability.
|
1348 | var t0 = 0.0;
|
1349 | var t1 = 1.0;
|
1350 | t = x;
|
1351 |
|
1352 | for (i = 0; i < 20; i++) {
|
1353 | x2 = this.sampleCurveX(t);
|
1354 | if (Math.abs(x2 - x) < epsilon) break;
|
1355 |
|
1356 | if (x > x2) {
|
1357 | t0 = t;
|
1358 | } else {
|
1359 | t1 = t;
|
1360 | }
|
1361 |
|
1362 | t = (t1 - t0) * 0.5 + t0;
|
1363 | }
|
1364 |
|
1365 | return t;
|
1366 | },
|
1367 |
|
1368 | solve: function (x, epsilon) {
|
1369 | return this.sampleCurveY(this.solveCurveX(x, epsilon));
|
1370 | }
|
1371 | };
|
1372 |
|
1373 | /**
|
1374 | * Deeply compares two object literals.
|
1375 | *
|
1376 | * @private
|
1377 | */
|
1378 | function deepEqual(a, b) {
|
1379 | if (Array.isArray(a)) {
|
1380 | if (!Array.isArray(b) || a.length !== b.length)
|
1381 | return false;
|
1382 | for (let i = 0; i < a.length; i++) {
|
1383 | if (!deepEqual(a[i], b[i]))
|
1384 | return false;
|
1385 | }
|
1386 | return true;
|
1387 | }
|
1388 | if (typeof a === 'object' && a !== null && b !== null) {
|
1389 | if (!(typeof b === 'object'))
|
1390 | return false;
|
1391 | const keys = Object.keys(a);
|
1392 | if (keys.length !== Object.keys(b).length)
|
1393 | return false;
|
1394 | for (const key in a) {
|
1395 | if (!deepEqual(a[key], b[key]))
|
1396 | return false;
|
1397 | }
|
1398 | return true;
|
1399 | }
|
1400 | return a === b;
|
1401 | }
|
1402 |
|
1403 | /**
|
1404 | * @module util
|
1405 | * @private
|
1406 | */
|
1407 | /**
|
1408 | * Given a value `t` that varies between 0 and 1, return
|
1409 | * an interpolation function that eases between 0 and 1 in a pleasing
|
1410 | * cubic in-out fashion.
|
1411 | *
|
1412 | * @private
|
1413 | */
|
1414 | function easeCubicInOut(t) {
|
1415 | if (t <= 0)
|
1416 | return 0;
|
1417 | if (t >= 1)
|
1418 | return 1;
|
1419 | const t2 = t * t, t3 = t2 * t;
|
1420 | return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);
|
1421 | }
|
1422 | /**
|
1423 | * Given given (x, y), (x1, y1) control points for a bezier curve,
|
1424 | * return a function that interpolates along that curve.
|
1425 | *
|
1426 | * @param p1x control point 1 x coordinate
|
1427 | * @param p1y control point 1 y coordinate
|
1428 | * @param p2x control point 2 x coordinate
|
1429 | * @param p2y control point 2 y coordinate
|
1430 | * @private
|
1431 | */
|
1432 | function bezier$1(p1x, p1y, p2x, p2y) {
|
1433 | const bezier = new unitbezier(p1x, p1y, p2x, p2y);
|
1434 | return function (t) {
|
1435 | return bezier.solve(t);
|
1436 | };
|
1437 | }
|
1438 | /**
|
1439 | * A default bezier-curve powered easing function with
|
1440 | * control points (0.25, 0.1) and (0.25, 1)
|
1441 | *
|
1442 | * @private
|
1443 | */
|
1444 | const ease = bezier$1(0.25, 0.1, 0.25, 1);
|
1445 | /**
|
1446 | * constrain n to the given range via min + max
|
1447 | *
|
1448 | * @param n value
|
1449 | * @param min the minimum value to be returned
|
1450 | * @param max the maximum value to be returned
|
1451 | * @returns the clamped value
|
1452 | * @private
|
1453 | */
|
1454 | function clamp(n, min, max) {
|
1455 | return Math.min(max, Math.max(min, n));
|
1456 | }
|
1457 | /**
|
1458 | * constrain n to the given range, excluding the minimum, via modular arithmetic
|
1459 | *
|
1460 | * @param n value
|
1461 | * @param min the minimum value to be returned, exclusive
|
1462 | * @param max the maximum value to be returned, inclusive
|
1463 | * @returns constrained number
|
1464 | * @private
|
1465 | */
|
1466 | function wrap(n, min, max) {
|
1467 | const d = max - min;
|
1468 | const w = ((n - min) % d + d) % d + min;
|
1469 | return (w === min) ? max : w;
|
1470 | }
|
1471 | /*
|
1472 | * Call an asynchronous function on an array of arguments,
|
1473 | * calling `callback` with the completed results of all calls.
|
1474 | *
|
1475 | * @param array input to each call of the async function.
|
1476 | * @param fn an async function with signature (data, callback)
|
1477 | * @param callback a callback run after all async work is done.
|
1478 | * called with an array, containing the results of each async call.
|
1479 | * @private
|
1480 | */
|
1481 | function asyncAll(array, fn, callback) {
|
1482 | if (!array.length) {
|
1483 | return callback(null, []);
|
1484 | }
|
1485 | let remaining = array.length;
|
1486 | const results = new Array(array.length);
|
1487 | let error = null;
|
1488 | array.forEach((item, i) => {
|
1489 | fn(item, (err, result) => {
|
1490 | if (err)
|
1491 | error = err;
|
1492 | results[i] = result; // https://github.com/facebook/flow/issues/2123
|
1493 | if (--remaining === 0)
|
1494 | callback(error, results);
|
1495 | });
|
1496 | });
|
1497 | }
|
1498 | /*
|
1499 | * Compute the difference between the keys in one object and the keys
|
1500 | * in another object.
|
1501 | *
|
1502 | * @returns keys difference
|
1503 | * @private
|
1504 | */
|
1505 | function keysDifference(obj, other) {
|
1506 | const difference = [];
|
1507 | for (const i in obj) {
|
1508 | if (!(i in other)) {
|
1509 | difference.push(i);
|
1510 | }
|
1511 | }
|
1512 | return difference;
|
1513 | }
|
1514 | /**
|
1515 | * Given a destination object and optionally many source objects,
|
1516 | * copy all properties from the source objects into the destination.
|
1517 | * The last source object given overrides properties from previous
|
1518 | * source objects.
|
1519 | *
|
1520 | * @param dest destination object
|
1521 | * @param sources sources from which properties are pulled
|
1522 | * @private
|
1523 | */
|
1524 | function extend$1(dest, ...sources) {
|
1525 | for (const src of sources) {
|
1526 | for (const k in src) {
|
1527 | dest[k] = src[k];
|
1528 | }
|
1529 | }
|
1530 | return dest;
|
1531 | }
|
1532 | /**
|
1533 | * Given an object and a number of properties as strings, return version
|
1534 | * of that object with only those properties.
|
1535 | *
|
1536 | * @param src the object
|
1537 | * @param properties an array of property names chosen
|
1538 | * to appear on the resulting object.
|
1539 | * @returns object with limited properties.
|
1540 | * @example
|
1541 | * var foo = { name: 'Charlie', age: 10 };
|
1542 | * var justName = pick(foo, ['name']);
|
1543 | * // justName = { name: 'Charlie' }
|
1544 | * @private
|
1545 | */
|
1546 | function pick(src, properties) {
|
1547 | const result = {};
|
1548 | for (let i = 0; i < properties.length; i++) {
|
1549 | const k = properties[i];
|
1550 | if (k in src) {
|
1551 | result[k] = src[k];
|
1552 | }
|
1553 | }
|
1554 | return result;
|
1555 | }
|
1556 | let id = 1;
|
1557 | /**
|
1558 | * Return a unique numeric id, starting at 1 and incrementing with
|
1559 | * each call.
|
1560 | *
|
1561 | * @returns unique numeric id.
|
1562 | * @private
|
1563 | */
|
1564 | function uniqueId() {
|
1565 | return id++;
|
1566 | }
|
1567 | /**
|
1568 | * Return whether a given value is a power of two
|
1569 | * @private
|
1570 | */
|
1571 | function isPowerOfTwo(value) {
|
1572 | return (Math.log(value) / Math.LN2) % 1 === 0;
|
1573 | }
|
1574 | /**
|
1575 | * Return the next power of two, or the input value if already a power of two
|
1576 | * @private
|
1577 | */
|
1578 | function nextPowerOfTwo(value) {
|
1579 | if (value <= 1)
|
1580 | return 1;
|
1581 | return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2));
|
1582 | }
|
1583 | /**
|
1584 | * Given an array of member function names as strings, replace all of them
|
1585 | * with bound versions that will always refer to `context` as `this`. This
|
1586 | * is useful for classes where otherwise event bindings would reassign
|
1587 | * `this` to the evented object or some other value: this lets you ensure
|
1588 | * the `this` value always.
|
1589 | *
|
1590 | * @param fns list of member function names
|
1591 | * @param context the context value
|
1592 | * @example
|
1593 | * function MyClass() {
|
1594 | * bindAll(['ontimer'], this);
|
1595 | * this.name = 'Tom';
|
1596 | * }
|
1597 | * MyClass.prototype.ontimer = function() {
|
1598 | * alert(this.name);
|
1599 | * };
|
1600 | * var myClass = new MyClass();
|
1601 | * setTimeout(myClass.ontimer, 100);
|
1602 | * @private
|
1603 | */
|
1604 | function bindAll(fns, context) {
|
1605 | fns.forEach((fn) => {
|
1606 | if (!context[fn]) {
|
1607 | return;
|
1608 | }
|
1609 | context[fn] = context[fn].bind(context);
|
1610 | });
|
1611 | }
|
1612 | /**
|
1613 | * Create an object by mapping all the values of an existing object while
|
1614 | * preserving their keys.
|
1615 | *
|
1616 | * @private
|
1617 | */
|
1618 | function mapObject(input, iterator, context) {
|
1619 | const output = {};
|
1620 | for (const key in input) {
|
1621 | output[key] = iterator.call(context || this, input[key], key, input);
|
1622 | }
|
1623 | return output;
|
1624 | }
|
1625 | /**
|
1626 | * Create an object by filtering out values of an existing object.
|
1627 | *
|
1628 | * @private
|
1629 | */
|
1630 | function filterObject(input, iterator, context) {
|
1631 | const output = {};
|
1632 | for (const key in input) {
|
1633 | if (iterator.call(context || this, input[key], key, input)) {
|
1634 | output[key] = input[key];
|
1635 | }
|
1636 | }
|
1637 | return output;
|
1638 | }
|
1639 | /**
|
1640 | * Deeply clones two objects.
|
1641 | *
|
1642 | * @private
|
1643 | */
|
1644 | function clone$9(input) {
|
1645 | if (Array.isArray(input)) {
|
1646 | return input.map(clone$9);
|
1647 | }
|
1648 | else if (typeof input === 'object' && input) {
|
1649 | return mapObject(input, clone$9);
|
1650 | }
|
1651 | else {
|
1652 | return input;
|
1653 | }
|
1654 | }
|
1655 | /**
|
1656 | * Check if two arrays have at least one common element.
|
1657 | *
|
1658 | * @private
|
1659 | */
|
1660 | function arraysIntersect(a, b) {
|
1661 | for (let l = 0; l < a.length; l++) {
|
1662 | if (b.indexOf(a[l]) >= 0)
|
1663 | return true;
|
1664 | }
|
1665 | return false;
|
1666 | }
|
1667 | /**
|
1668 | * Print a warning message to the console and ensure duplicate warning messages
|
1669 | * are not printed.
|
1670 | *
|
1671 | * @private
|
1672 | */
|
1673 | const warnOnceHistory = {};
|
1674 | function warnOnce(message) {
|
1675 | if (!warnOnceHistory[message]) {
|
1676 | // console isn't defined in some WebWorkers, see #2558
|
1677 | if (typeof console !== 'undefined')
|
1678 | console.warn(message);
|
1679 | warnOnceHistory[message] = true;
|
1680 | }
|
1681 | }
|
1682 | /**
|
1683 | * Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order
|
1684 | *
|
1685 | * @private
|
1686 | * @returns true for a counter clockwise set of points
|
1687 | */
|
1688 | // http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/
|
1689 | function isCounterClockwise(a, b, c) {
|
1690 | return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x);
|
1691 | }
|
1692 | /**
|
1693 | * Returns the signed area for the polygon ring. Positive areas are exterior rings and
|
1694 | * have a clockwise winding. Negative areas are interior rings and have a counter clockwise
|
1695 | * ordering.
|
1696 | *
|
1697 | * @private
|
1698 | * @param ring Exterior or interior ring
|
1699 | */
|
1700 | function calculateSignedArea(ring) {
|
1701 | let sum = 0;
|
1702 | for (let i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
|
1703 | p1 = ring[i];
|
1704 | p2 = ring[j];
|
1705 | sum += (p2.x - p1.x) * (p1.y + p2.y);
|
1706 | }
|
1707 | return sum;
|
1708 | }
|
1709 | /**
|
1710 | * Detects closed polygons, first + last point are equal
|
1711 | *
|
1712 | * @private
|
1713 | * @param points array of points
|
1714 | * @return true if the points are a closed polygon
|
1715 | */
|
1716 | function isClosedPolygon(points) {
|
1717 | // If it is 2 points that are the same then it is a point
|
1718 | // If it is 3 points with start and end the same then it is a line
|
1719 | if (points.length < 4)
|
1720 | return false;
|
1721 | const p1 = points[0];
|
1722 | const p2 = points[points.length - 1];
|
1723 | if (Math.abs(p1.x - p2.x) > 0 ||
|
1724 | Math.abs(p1.y - p2.y) > 0) {
|
1725 | return false;
|
1726 | }
|
1727 | // polygon simplification can produce polygons with zero area and more than 3 points
|
1728 | return Math.abs(calculateSignedArea(points)) > 0.01;
|
1729 | }
|
1730 | /**
|
1731 | * Converts spherical coordinates to cartesian coordinates.
|
1732 | *
|
1733 | * @private
|
1734 | * @param spherical Spherical coordinates, in [radial, azimuthal, polar]
|
1735 | * @return cartesian coordinates in [x, y, z]
|
1736 | */
|
1737 | function sphericalToCartesian([r, azimuthal, polar]) {
|
1738 | // We abstract "north"/"up" (compass-wise) to be 0° when really this is 90° (π/2):
|
1739 | // correct for that here
|
1740 | azimuthal += 90;
|
1741 | // Convert azimuthal and polar angles to radians
|
1742 | azimuthal *= Math.PI / 180;
|
1743 | polar *= Math.PI / 180;
|
1744 | return {
|
1745 | x: r * Math.cos(azimuthal) * Math.sin(polar),
|
1746 | y: r * Math.sin(azimuthal) * Math.sin(polar),
|
1747 | z: r * Math.cos(polar)
|
1748 | };
|
1749 | }
|
1750 | /* global self, WorkerGlobalScope */
|
1751 | /**
|
1752 | * Returns true if the when run in the web-worker context.
|
1753 | *
|
1754 | * @private
|
1755 | * @returns {boolean}
|
1756 | */
|
1757 | function isWorker() {
|
1758 | return typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' &&
|
1759 | self instanceof WorkerGlobalScope;
|
1760 | }
|
1761 | /**
|
1762 | * Parses data from 'Cache-Control' headers.
|
1763 | *
|
1764 | * @private
|
1765 | * @param cacheControl Value of 'Cache-Control' header
|
1766 | * @return object containing parsed header info.
|
1767 | */
|
1768 | function parseCacheControl(cacheControl) {
|
1769 | // Taken from [Wreck](https://github.com/hapijs/wreck)
|
1770 | const re = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g;
|
1771 | const header = {};
|
1772 | cacheControl.replace(re, ($0, $1, $2, $3) => {
|
1773 | const value = $2 || $3;
|
1774 | header[$1] = value ? value.toLowerCase() : true;
|
1775 | return '';
|
1776 | });
|
1777 | if (header['max-age']) {
|
1778 | const maxAge = parseInt(header['max-age'], 10);
|
1779 | if (isNaN(maxAge))
|
1780 | delete header['max-age'];
|
1781 | else
|
1782 | header['max-age'] = maxAge;
|
1783 | }
|
1784 | return header;
|
1785 | }
|
1786 | let _isSafari = null;
|
1787 | /**
|
1788 | * Returns true when run in WebKit derived browsers.
|
1789 | * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to
|
1790 | * transfer data between WebWorkers and the main thread.
|
1791 | * https://github.com/mapbox/mapbox-gl-js/issues/8771
|
1792 | *
|
1793 | * This should be removed once the underlying Safari issue is fixed.
|
1794 | *
|
1795 | * @private
|
1796 | * @param scope {WindowOrWorkerGlobalScope} Since this function is used both on the main thread and WebWorker context,
|
1797 | * let the calling scope pass in the global scope object.
|
1798 | * @returns {boolean}
|
1799 | */
|
1800 | function isSafari(scope) {
|
1801 | if (_isSafari == null) {
|
1802 | const userAgent = scope.navigator ? scope.navigator.userAgent : null;
|
1803 | _isSafari = !!scope.safari ||
|
1804 | !!(userAgent && (/\b(iPad|iPhone|iPod)\b/.test(userAgent) || (!!userAgent.match('Safari') && !userAgent.match('Chrome'))));
|
1805 | }
|
1806 | return _isSafari;
|
1807 | }
|
1808 | function storageAvailable(type) {
|
1809 | try {
|
1810 | const storage = window[type];
|
1811 | storage.setItem('_mapbox_test_', 1);
|
1812 | storage.removeItem('_mapbox_test_');
|
1813 | return true;
|
1814 | }
|
1815 | catch (e) {
|
1816 | return false;
|
1817 | }
|
1818 | }
|
1819 | // The following methods are from https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem
|
1820 | //Unicode compliant base64 encoder for strings
|
1821 | function b64EncodeUnicode(str) {
|
1822 | return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (match, p1) => {
|
1823 | return String.fromCharCode(Number('0x' + p1)); //eslint-disable-line
|
1824 | }));
|
1825 | }
|
1826 | // Unicode compliant decoder for base64-encoded strings
|
1827 | function b64DecodeUnicode(str) {
|
1828 | return decodeURIComponent(atob(str).split('').map((c) => {
|
1829 | return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); //eslint-disable-line
|
1830 | }).join(''));
|
1831 | }
|
1832 | function isImageBitmap(image) {
|
1833 | return typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap;
|
1834 | }
|
1835 |
|
1836 | const now = typeof performance !== 'undefined' && performance && performance.now ?
|
1837 | performance.now.bind(performance) :
|
1838 | Date.now.bind(Date);
|
1839 | let linkEl;
|
1840 | let reducedMotionQuery;
|
1841 | /**
|
1842 | * @private
|
1843 | */
|
1844 | const exported$1 = {
|
1845 | /**
|
1846 | * Provides a function that outputs milliseconds: either performance.now()
|
1847 | * or a fallback to Date.now()
|
1848 | */
|
1849 | now,
|
1850 | frame(fn) {
|
1851 | const frame = requestAnimationFrame(fn);
|
1852 | return { cancel: () => cancelAnimationFrame(frame) };
|
1853 | },
|
1854 | getImageData(img, padding = 0) {
|
1855 | const canvas = window.document.createElement('canvas');
|
1856 | const context = canvas.getContext('2d');
|
1857 | if (!context) {
|
1858 | throw new Error('failed to create canvas 2d context');
|
1859 | }
|
1860 | canvas.width = img.width;
|
1861 | canvas.height = img.height;
|
1862 | context.drawImage(img, 0, 0, img.width, img.height);
|
1863 | return context.getImageData(-padding, -padding, img.width + 2 * padding, img.height + 2 * padding);
|
1864 | },
|
1865 | resolveURL(path) {
|
1866 | if (!linkEl)
|
1867 | linkEl = document.createElement('a');
|
1868 | linkEl.href = path;
|
1869 | return linkEl.href;
|
1870 | },
|
1871 | hardwareConcurrency: typeof navigator !== 'undefined' && navigator.hardwareConcurrency || 4,
|
1872 | get prefersReducedMotion() {
|
1873 | if (!matchMedia)
|
1874 | return false;
|
1875 | //Lazily initialize media query
|
1876 | if (reducedMotionQuery == null) {
|
1877 | reducedMotionQuery = matchMedia('(prefers-reduced-motion: reduce)');
|
1878 | }
|
1879 | return reducedMotionQuery.matches;
|
1880 | },
|
1881 | };
|
1882 |
|
1883 | ;
|
1884 |
|
1885 | var pointGeometry = Point$1;
|
1886 |
|
1887 | /**
|
1888 | * A standalone point geometry with useful accessor, comparison, and
|
1889 | * modification methods.
|
1890 | *
|
1891 | * @class Point
|
1892 | * @param {Number} x the x-coordinate. this could be longitude or screen
|
1893 | * pixels, or any other sort of unit.
|
1894 | * @param {Number} y the y-coordinate. this could be latitude or screen
|
1895 | * pixels, or any other sort of unit.
|
1896 | * @example
|
1897 | * var point = new Point(-77, 38);
|
1898 | */
|
1899 | function Point$1(x, y) {
|
1900 | this.x = x;
|
1901 | this.y = y;
|
1902 | }
|
1903 |
|
1904 | Point$1.prototype = {
|
1905 |
|
1906 | /**
|
1907 | * Clone this point, returning a new point that can be modified
|
1908 | * without affecting the old one.
|
1909 | * @return {Point} the clone
|
1910 | */
|
1911 | clone: function() { return new Point$1(this.x, this.y); },
|
1912 |
|
1913 | /**
|
1914 | * Add this point's x & y coordinates to another point,
|
1915 | * yielding a new point.
|
1916 | * @param {Point} p the other point
|
1917 | * @return {Point} output point
|
1918 | */
|
1919 | add: function(p) { return this.clone()._add(p); },
|
1920 |
|
1921 | /**
|
1922 | * Subtract this point's x & y coordinates to from point,
|
1923 | * yielding a new point.
|
1924 | * @param {Point} p the other point
|
1925 | * @return {Point} output point
|
1926 | */
|
1927 | sub: function(p) { return this.clone()._sub(p); },
|
1928 |
|
1929 | /**
|
1930 | * Multiply this point's x & y coordinates by point,
|
1931 | * yielding a new point.
|
1932 | * @param {Point} p the other point
|
1933 | * @return {Point} output point
|
1934 | */
|
1935 | multByPoint: function(p) { return this.clone()._multByPoint(p); },
|
1936 |
|
1937 | /**
|
1938 | * Divide this point's x & y coordinates by point,
|
1939 | * yielding a new point.
|
1940 | * @param {Point} p the other point
|
1941 | * @return {Point} output point
|
1942 | */
|
1943 | divByPoint: function(p) { return this.clone()._divByPoint(p); },
|
1944 |
|
1945 | /**
|
1946 | * Multiply this point's x & y coordinates by a factor,
|
1947 | * yielding a new point.
|
1948 | * @param {Point} k factor
|
1949 | * @return {Point} output point
|
1950 | */
|
1951 | mult: function(k) { return this.clone()._mult(k); },
|
1952 |
|
1953 | /**
|
1954 | * Divide this point's x & y coordinates by a factor,
|
1955 | * yielding a new point.
|
1956 | * @param {Point} k factor
|
1957 | * @return {Point} output point
|
1958 | */
|
1959 | div: function(k) { return this.clone()._div(k); },
|
1960 |
|
1961 | /**
|
1962 | * Rotate this point around the 0, 0 origin by an angle a,
|
1963 | * given in radians
|
1964 | * @param {Number} a angle to rotate around, in radians
|
1965 | * @return {Point} output point
|
1966 | */
|
1967 | rotate: function(a) { return this.clone()._rotate(a); },
|
1968 |
|
1969 | /**
|
1970 | * Rotate this point around p point by an angle a,
|
1971 | * given in radians
|
1972 | * @param {Number} a angle to rotate around, in radians
|
1973 | * @param {Point} p Point to rotate around
|
1974 | * @return {Point} output point
|
1975 | */
|
1976 | rotateAround: function(a,p) { return this.clone()._rotateAround(a,p); },
|
1977 |
|
1978 | /**
|
1979 | * Multiply this point by a 4x1 transformation matrix
|
1980 | * @param {Array<Number>} m transformation matrix
|
1981 | * @return {Point} output point
|
1982 | */
|
1983 | matMult: function(m) { return this.clone()._matMult(m); },
|
1984 |
|
1985 | /**
|
1986 | * Calculate this point but as a unit vector from 0, 0, meaning
|
1987 | * that the distance from the resulting point to the 0, 0
|
1988 | * coordinate will be equal to 1 and the angle from the resulting
|
1989 | * point to the 0, 0 coordinate will be the same as before.
|
1990 | * @return {Point} unit vector point
|
1991 | */
|
1992 | unit: function() { return this.clone()._unit(); },
|
1993 |
|
1994 | /**
|
1995 | * Compute a perpendicular point, where the new y coordinate
|
1996 | * is the old x coordinate and the new x coordinate is the old y
|
1997 | * coordinate multiplied by -1
|
1998 | * @return {Point} perpendicular point
|
1999 | */
|
2000 | perp: function() { return this.clone()._perp(); },
|
2001 |
|
2002 | /**
|
2003 | * Return a version of this point with the x & y coordinates
|
2004 | * rounded to integers.
|
2005 | * @return {Point} rounded point
|
2006 | */
|
2007 | round: function() { return this.clone()._round(); },
|
2008 |
|
2009 | /**
|
2010 | * Return the magitude of this point: this is the Euclidean
|
2011 | * distance from the 0, 0 coordinate to this point's x and y
|
2012 | * coordinates.
|
2013 | * @return {Number} magnitude
|
2014 | */
|
2015 | mag: function() {
|
2016 | return Math.sqrt(this.x * this.x + this.y * this.y);
|
2017 | },
|
2018 |
|
2019 | /**
|
2020 | * Judge whether this point is equal to another point, returning
|
2021 | * true or false.
|
2022 | * @param {Point} other the other point
|
2023 | * @return {boolean} whether the points are equal
|
2024 | */
|
2025 | equals: function(other) {
|
2026 | return this.x === other.x &&
|
2027 | this.y === other.y;
|
2028 | },
|
2029 |
|
2030 | /**
|
2031 | * Calculate the distance from this point to another point
|
2032 | * @param {Point} p the other point
|
2033 | * @return {Number} distance
|
2034 | */
|
2035 | dist: function(p) {
|
2036 | return Math.sqrt(this.distSqr(p));
|
2037 | },
|
2038 |
|
2039 | /**
|
2040 | * Calculate the distance from this point to another point,
|
2041 | * without the square root step. Useful if you're comparing
|
2042 | * relative distances.
|
2043 | * @param {Point} p the other point
|
2044 | * @return {Number} distance
|
2045 | */
|
2046 | distSqr: function(p) {
|
2047 | var dx = p.x - this.x,
|
2048 | dy = p.y - this.y;
|
2049 | return dx * dx + dy * dy;
|
2050 | },
|
2051 |
|
2052 | /**
|
2053 | * Get the angle from the 0, 0 coordinate to this point, in radians
|
2054 | * coordinates.
|
2055 | * @return {Number} angle
|
2056 | */
|
2057 | angle: function() {
|
2058 | return Math.atan2(this.y, this.x);
|
2059 | },
|
2060 |
|
2061 | /**
|
2062 | * Get the angle from this point to another point, in radians
|
2063 | * @param {Point} b the other point
|
2064 | * @return {Number} angle
|
2065 | */
|
2066 | angleTo: function(b) {
|
2067 | return Math.atan2(this.y - b.y, this.x - b.x);
|
2068 | },
|
2069 |
|
2070 | /**
|
2071 | * Get the angle between this point and another point, in radians
|
2072 | * @param {Point} b the other point
|
2073 | * @return {Number} angle
|
2074 | */
|
2075 | angleWith: function(b) {
|
2076 | return this.angleWithSep(b.x, b.y);
|
2077 | },
|
2078 |
|
2079 | /*
|
2080 | * Find the angle of the two vectors, solving the formula for
|
2081 | * the cross product a x b = |a||b|sin(θ) for θ.
|
2082 | * @param {Number} x the x-coordinate
|
2083 | * @param {Number} y the y-coordinate
|
2084 | * @return {Number} the angle in radians
|
2085 | */
|
2086 | angleWithSep: function(x, y) {
|
2087 | return Math.atan2(
|
2088 | this.x * y - this.y * x,
|
2089 | this.x * x + this.y * y);
|
2090 | },
|
2091 |
|
2092 | _matMult: function(m) {
|
2093 | var x = m[0] * this.x + m[1] * this.y,
|
2094 | y = m[2] * this.x + m[3] * this.y;
|
2095 | this.x = x;
|
2096 | this.y = y;
|
2097 | return this;
|
2098 | },
|
2099 |
|
2100 | _add: function(p) {
|
2101 | this.x += p.x;
|
2102 | this.y += p.y;
|
2103 | return this;
|
2104 | },
|
2105 |
|
2106 | _sub: function(p) {
|
2107 | this.x -= p.x;
|
2108 | this.y -= p.y;
|
2109 | return this;
|
2110 | },
|
2111 |
|
2112 | _mult: function(k) {
|
2113 | this.x *= k;
|
2114 | this.y *= k;
|
2115 | return this;
|
2116 | },
|
2117 |
|
2118 | _div: function(k) {
|
2119 | this.x /= k;
|
2120 | this.y /= k;
|
2121 | return this;
|
2122 | },
|
2123 |
|
2124 | _multByPoint: function(p) {
|
2125 | this.x *= p.x;
|
2126 | this.y *= p.y;
|
2127 | return this;
|
2128 | },
|
2129 |
|
2130 | _divByPoint: function(p) {
|
2131 | this.x /= p.x;
|
2132 | this.y /= p.y;
|
2133 | return this;
|
2134 | },
|
2135 |
|
2136 | _unit: function() {
|
2137 | this._div(this.mag());
|
2138 | return this;
|
2139 | },
|
2140 |
|
2141 | _perp: function() {
|
2142 | var y = this.y;
|
2143 | this.y = this.x;
|
2144 | this.x = -y;
|
2145 | return this;
|
2146 | },
|
2147 |
|
2148 | _rotate: function(angle) {
|
2149 | var cos = Math.cos(angle),
|
2150 | sin = Math.sin(angle),
|
2151 | x = cos * this.x - sin * this.y,
|
2152 | y = sin * this.x + cos * this.y;
|
2153 | this.x = x;
|
2154 | this.y = y;
|
2155 | return this;
|
2156 | },
|
2157 |
|
2158 | _rotateAround: function(angle, p) {
|
2159 | var cos = Math.cos(angle),
|
2160 | sin = Math.sin(angle),
|
2161 | x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
|
2162 | y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
|
2163 | this.x = x;
|
2164 | this.y = y;
|
2165 | return this;
|
2166 | },
|
2167 |
|
2168 | _round: function() {
|
2169 | this.x = Math.round(this.x);
|
2170 | this.y = Math.round(this.y);
|
2171 | return this;
|
2172 | }
|
2173 | };
|
2174 |
|
2175 | /**
|
2176 | * Construct a point from an array if necessary, otherwise if the input
|
2177 | * is already a Point, or an unknown type, return it unchanged
|
2178 | * @param {Array<Number>|Point|*} a any kind of input value
|
2179 | * @return {Point} constructed point, or passed-through value.
|
2180 | * @example
|
2181 | * // this
|
2182 | * var point = Point.convert([0, 1]);
|
2183 | * // is equivalent to
|
2184 | * var point = new Point(0, 1);
|
2185 | */
|
2186 | Point$1.convert = function (a) {
|
2187 | if (a instanceof Point$1) {
|
2188 | return a;
|
2189 | }
|
2190 | if (Array.isArray(a)) {
|
2191 | return new Point$1(a[0], a[1]);
|
2192 | }
|
2193 | return a;
|
2194 | };
|
2195 |
|
2196 | const config = {
|
2197 | MAX_PARALLEL_IMAGE_REQUESTS: 16,
|
2198 | REGISTERED_PROTOCOLS: {},
|
2199 | };
|
2200 |
|
2201 | const CACHE_NAME = 'mapbox-tiles';
|
2202 | let cacheLimit = 500; // 50MB / (100KB/tile) ~= 500 tiles
|
2203 | let cacheCheckThreshold = 50;
|
2204 | const MIN_TIME_UNTIL_EXPIRY = 1000 * 60 * 7; // 7 minutes. Skip caching tiles with a short enough max age.
|
2205 | // We're using a global shared cache object. Normally, requesting ad-hoc Cache objects is fine, but
|
2206 | // Safari has a memory leak in which it fails to release memory when requesting keys() from a Cache
|
2207 | // object. See https://bugs.webkit.org/show_bug.cgi?id=203991 for more information.
|
2208 | let sharedCache;
|
2209 | function cacheOpen() {
|
2210 | if (typeof caches !== 'undefined' && !sharedCache) {
|
2211 | sharedCache = caches.open(CACHE_NAME);
|
2212 | }
|
2213 | }
|
2214 | // We're never closing the cache, but our unit tests rely on changing out the global window.caches
|
2215 | // object, so we have a function specifically for unit tests that allows resetting the shared cache.
|
2216 | function cacheClose() {
|
2217 | sharedCache = undefined;
|
2218 | }
|
2219 | let responseConstructorSupportsReadableStream;
|
2220 | function prepareBody(response, callback) {
|
2221 | if (responseConstructorSupportsReadableStream === undefined) {
|
2222 | try {
|
2223 | new Response(new ReadableStream()); // eslint-disable-line no-undef
|
2224 | responseConstructorSupportsReadableStream = true;
|
2225 | }
|
2226 | catch (e) {
|
2227 | // Edge
|
2228 | responseConstructorSupportsReadableStream = false;
|
2229 | }
|
2230 | }
|
2231 | if (responseConstructorSupportsReadableStream) {
|
2232 | callback(response.body);
|
2233 | }
|
2234 | else {
|
2235 | response.blob().then(callback);
|
2236 | }
|
2237 | }
|
2238 | function cachePut(request, response, requestTime) {
|
2239 | cacheOpen();
|
2240 | if (!sharedCache)
|
2241 | return;
|
2242 | const options = {
|
2243 | status: response.status,
|
2244 | statusText: response.statusText,
|
2245 | headers: new Headers()
|
2246 | };
|
2247 | response.headers.forEach((v, k) => options.headers.set(k, v));
|
2248 | const cacheControl = parseCacheControl(response.headers.get('Cache-Control') || '');
|
2249 | if (cacheControl['no-store']) {
|
2250 | return;
|
2251 | }
|
2252 | if (cacheControl['max-age']) {
|
2253 | options.headers.set('Expires', new Date(requestTime + cacheControl['max-age'] * 1000).toUTCString());
|
2254 | }
|
2255 | const timeUntilExpiry = new Date(options.headers.get('Expires')).getTime() - requestTime;
|
2256 | if (timeUntilExpiry < MIN_TIME_UNTIL_EXPIRY)
|
2257 | return;
|
2258 | prepareBody(response, body => {
|
2259 | const clonedResponse = new Response(body, options);
|
2260 | cacheOpen();
|
2261 | if (!sharedCache)
|
2262 | return;
|
2263 | sharedCache
|
2264 | .then(cache => cache.put(stripQueryParameters(request.url), clonedResponse))
|
2265 | .catch(e => warnOnce(e.message));
|
2266 | });
|
2267 | }
|
2268 | function stripQueryParameters(url) {
|
2269 | const start = url.indexOf('?');
|
2270 | return start < 0 ? url : url.slice(0, start);
|
2271 | }
|
2272 | function cacheGet(request, callback) {
|
2273 | cacheOpen();
|
2274 | if (!sharedCache)
|
2275 | return callback(null);
|
2276 | const strippedURL = stripQueryParameters(request.url);
|
2277 | sharedCache
|
2278 | .then(cache => {
|
2279 | // manually strip URL instead of `ignoreSearch: true` because of a known
|
2280 | // performance issue in Chrome https://github.com/mapbox/mapbox-gl-js/issues/8431
|
2281 | cache.match(strippedURL)
|
2282 | .then(response => {
|
2283 | const fresh = isFresh(response);
|
2284 | // Reinsert into cache so that order of keys in the cache is the order of access.
|
2285 | // This line makes the cache a LRU instead of a FIFO cache.
|
2286 | cache.delete(strippedURL);
|
2287 | if (fresh) {
|
2288 | cache.put(strippedURL, response.clone());
|
2289 | }
|
2290 | callback(null, response, fresh);
|
2291 | })
|
2292 | .catch(callback);
|
2293 | })
|
2294 | .catch(callback);
|
2295 | }
|
2296 | function isFresh(response) {
|
2297 | if (!response)
|
2298 | return false;
|
2299 | const expires = new Date(response.headers.get('Expires') || 0).getTime();
|
2300 | const cacheControl = parseCacheControl(response.headers.get('Cache-Control') || '');
|
2301 | return expires > Date.now() && !cacheControl['no-cache'];
|
2302 | }
|
2303 | // `Infinity` triggers a cache check after the first tile is loaded
|
2304 | // so that a check is run at least once on each page load.
|
2305 | let globalEntryCounter = Infinity;
|
2306 | // The cache check gets run on a worker. The reason for this is that
|
2307 | // profiling sometimes shows this as taking up significant time on the
|
2308 | // thread it gets called from. And sometimes it doesn't. It *may* be
|
2309 | // fine to run this on the main thread but out of caution this is being
|
2310 | // dispatched on a worker. This can be investigated further in the future.
|
2311 | function cacheEntryPossiblyAdded(dispatcher) {
|
2312 | globalEntryCounter++;
|
2313 | if (globalEntryCounter > cacheCheckThreshold) {
|
2314 | dispatcher.getActor().send('enforceCacheSizeLimit', cacheLimit);
|
2315 | globalEntryCounter = 0;
|
2316 | }
|
2317 | }
|
2318 | // runs on worker, see above comment
|
2319 | function enforceCacheSizeLimit(limit) {
|
2320 | cacheOpen();
|
2321 | if (!sharedCache)
|
2322 | return;
|
2323 | sharedCache
|
2324 | .then(cache => {
|
2325 | cache.keys().then(keys => {
|
2326 | for (let i = 0; i < keys.length - limit; i++) {
|
2327 | cache.delete(keys[i]);
|
2328 | }
|
2329 | });
|
2330 | });
|
2331 | }
|
2332 | function clearTileCache(callback) {
|
2333 | const promise = caches.delete(CACHE_NAME);
|
2334 | if (callback) {
|
2335 | promise.catch(callback).then(() => callback());
|
2336 | }
|
2337 | }
|
2338 | function setCacheLimits(limit, checkThreshold) {
|
2339 | cacheLimit = limit;
|
2340 | cacheCheckThreshold = checkThreshold;
|
2341 | }
|
2342 |
|
2343 | const exported = {
|
2344 | supported: false,
|
2345 | testSupport
|
2346 | };
|
2347 | let glForTesting;
|
2348 | let webpCheckComplete = false;
|
2349 | let webpImgTest;
|
2350 | let webpImgTestOnloadComplete = false;
|
2351 | if (typeof document !== 'undefined') {
|
2352 | webpImgTest = document.createElement('img');
|
2353 | webpImgTest.onload = function () {
|
2354 | if (glForTesting)
|
2355 | testWebpTextureUpload(glForTesting);
|
2356 | glForTesting = null;
|
2357 | webpImgTestOnloadComplete = true;
|
2358 | };
|
2359 | webpImgTest.onerror = function () {
|
2360 | webpCheckComplete = true;
|
2361 | glForTesting = null;
|
2362 | };
|
2363 | webpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=';
|
2364 | }
|
2365 | function testSupport(gl) {
|
2366 | if (webpCheckComplete || !webpImgTest)
|
2367 | return;
|
2368 | // HTMLImageElement.complete is set when an image is done loading it's source
|
2369 | // regardless of whether the load was successful or not.
|
2370 | // It's possible for an error to set HTMLImageElement.complete to true which would trigger
|
2371 | // testWebpTextureUpload and mistakenly set exported.supported to true in browsers which don't support webp
|
2372 | // To avoid this, we set a flag in the image's onload handler and only call testWebpTextureUpload
|
2373 | // after a successful image load event.
|
2374 | if (webpImgTestOnloadComplete) {
|
2375 | testWebpTextureUpload(gl);
|
2376 | }
|
2377 | else {
|
2378 | glForTesting = gl;
|
2379 | }
|
2380 | }
|
2381 | function testWebpTextureUpload(gl) {
|
2382 | // Edge 18 supports WebP but not uploading a WebP image to a gl texture
|
2383 | // Test support for this before allowing WebP images.
|
2384 | // https://github.com/mapbox/mapbox-gl-js/issues/7671
|
2385 | const texture = gl.createTexture();
|
2386 | gl.bindTexture(gl.TEXTURE_2D, texture);
|
2387 | try {
|
2388 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, webpImgTest);
|
2389 | // The error does not get triggered in Edge if the context is lost
|
2390 | if (gl.isContextLost())
|
2391 | return;
|
2392 | exported.supported = true;
|
2393 | }
|
2394 | catch (e) {
|
2395 | // Catch "Unspecified Error." in Edge 18.
|
2396 | }
|
2397 | gl.deleteTexture(texture);
|
2398 | webpCheckComplete = true;
|
2399 | }
|
2400 |
|
2401 | /**
|
2402 | * The type of a resource.
|
2403 | * @private
|
2404 | * @readonly
|
2405 | * @enum {string}
|
2406 | */
|
2407 | const ResourceType = {
|
2408 | Unknown: 'Unknown',
|
2409 | Style: 'Style',
|
2410 | Source: 'Source',
|
2411 | Tile: 'Tile',
|
2412 | Glyphs: 'Glyphs',
|
2413 | SpriteImage: 'SpriteImage',
|
2414 | SpriteJSON: 'SpriteJSON',
|
2415 | Image: 'Image'
|
2416 | };
|
2417 | if (typeof Object.freeze == 'function') {
|
2418 | Object.freeze(ResourceType);
|
2419 | }
|
2420 | /**
|
2421 | * An error thrown when a HTTP request results in an error response.
|
2422 | * @extends Error
|
2423 | * @param {number} status The response's HTTP status code.
|
2424 | * @param {string} statusText The response's HTTP status text.
|
2425 | * @param {string} url The request's URL.
|
2426 | * @param {Blob} body The response's body.
|
2427 | */
|
2428 | class AJAXError extends Error {
|
2429 | constructor(status, statusText, url, body) {
|
2430 | super(`AJAXError: ${statusText} (${status}): ${url}`);
|
2431 | this.status = status;
|
2432 | this.statusText = statusText;
|
2433 | this.url = url;
|
2434 | this.body = body;
|
2435 | }
|
2436 | }
|
2437 | // Ensure that we're sending the correct referrer from blob URL worker bundles.
|
2438 | // For files loaded from the local file system, `location.origin` will be set
|
2439 | // to the string(!) "null" (Firefox), or "file://" (Chrome, Safari, Edge, IE),
|
2440 | // and we will set an empty referrer. Otherwise, we're using the document's URL.
|
2441 | /* global self */
|
2442 | const getReferrer = isWorker() ?
|
2443 | () => self.worker && self.worker.referrer :
|
2444 | () => (window.location.protocol === 'blob:' ? window.parent : window).location.href;
|
2445 | // Determines whether a URL is a file:// URL. This is obviously the case if it begins
|
2446 | // with file://. Relative URLs are also file:// URLs iff the original document was loaded
|
2447 | // via a file:// URL.
|
2448 | const isFileURL = url => /^file:/.test(url) || (/^file:/.test(getReferrer()) && !/^\w+:/.test(url));
|
2449 | function makeFetchRequest(requestParameters, callback) {
|
2450 | const controller = new AbortController();
|
2451 | const request = new Request(requestParameters.url, {
|
2452 | method: requestParameters.method || 'GET',
|
2453 | body: requestParameters.body,
|
2454 | credentials: requestParameters.credentials,
|
2455 | headers: requestParameters.headers,
|
2456 | referrer: getReferrer(),
|
2457 | signal: controller.signal
|
2458 | });
|
2459 | let complete = false;
|
2460 | let aborted = false;
|
2461 | const cacheIgnoringSearch = false;
|
2462 | if (requestParameters.type === 'json') {
|
2463 | request.headers.set('Accept', 'application/json');
|
2464 | }
|
2465 | const validateOrFetch = (err, cachedResponse, responseIsFresh) => {
|
2466 | if (aborted)
|
2467 | return;
|
2468 | if (err) {
|
2469 | // Do fetch in case of cache error.
|
2470 | // HTTP pages in Edge trigger a security error that can be ignored.
|
2471 | if (err.message !== 'SecurityError') {
|
2472 | warnOnce(err);
|
2473 | }
|
2474 | }
|
2475 | if (cachedResponse && responseIsFresh) {
|
2476 | return finishRequest(cachedResponse);
|
2477 | }
|
2478 | if (cachedResponse) {
|
2479 | // We can't do revalidation with 'If-None-Match' because then the
|
2480 | // request doesn't have simple cors headers.
|
2481 | }
|
2482 | const requestTime = Date.now();
|
2483 | fetch(request).then(response => {
|
2484 | if (response.ok) {
|
2485 | const cacheableResponse = cacheIgnoringSearch ? response.clone() : null;
|
2486 | return finishRequest(response, cacheableResponse, requestTime);
|
2487 | }
|
2488 | else {
|
2489 | return response.blob().then(body => callback(new AJAXError(response.status, response.statusText, requestParameters.url, body)));
|
2490 | }
|
2491 | }).catch(error => {
|
2492 | if (error.code === 20) {
|
2493 | // silence expected AbortError
|
2494 | return;
|
2495 | }
|
2496 | callback(new Error(error.message));
|
2497 | });
|
2498 | };
|
2499 | const finishRequest = (response, cacheableResponse, requestTime) => {
|
2500 | (requestParameters.type === 'arrayBuffer' ? response.arrayBuffer() :
|
2501 | requestParameters.type === 'json' ? response.json() :
|
2502 | response.text()).then(result => {
|
2503 | if (aborted)
|
2504 | return;
|
2505 | if (cacheableResponse && requestTime) {
|
2506 | // The response needs to be inserted into the cache after it has completely loaded.
|
2507 | // Until it is fully loaded there is a chance it will be aborted. Aborting while
|
2508 | // reading the body can cause the cache insertion to error. We could catch this error
|
2509 | // in most browsers but in Firefox it seems to sometimes crash the tab. Adding
|
2510 | // it to the cache here avoids that error.
|
2511 | cachePut(request, cacheableResponse, requestTime);
|
2512 | }
|
2513 | complete = true;
|
2514 | callback(null, result, response.headers.get('Cache-Control'), response.headers.get('Expires'));
|
2515 | }).catch(err => {
|
2516 | if (!aborted)
|
2517 | callback(new Error(err.message));
|
2518 | });
|
2519 | };
|
2520 | if (cacheIgnoringSearch) {
|
2521 | cacheGet(request, validateOrFetch);
|
2522 | }
|
2523 | else {
|
2524 | validateOrFetch(null, null);
|
2525 | }
|
2526 | return { cancel: () => {
|
2527 | aborted = true;
|
2528 | if (!complete)
|
2529 | controller.abort();
|
2530 | } };
|
2531 | }
|
2532 | function makeXMLHttpRequest(requestParameters, callback) {
|
2533 | const xhr = new XMLHttpRequest();
|
2534 | xhr.open(requestParameters.method || 'GET', requestParameters.url, true);
|
2535 | if (requestParameters.type === 'arrayBuffer') {
|
2536 | xhr.responseType = 'arraybuffer';
|
2537 | }
|
2538 | for (const k in requestParameters.headers) {
|
2539 | xhr.setRequestHeader(k, requestParameters.headers[k]);
|
2540 | }
|
2541 | if (requestParameters.type === 'json') {
|
2542 | xhr.responseType = 'text';
|
2543 | xhr.setRequestHeader('Accept', 'application/json');
|
2544 | }
|
2545 | xhr.withCredentials = requestParameters.credentials === 'include';
|
2546 | xhr.onerror = () => {
|
2547 | callback(new Error(xhr.statusText));
|
2548 | };
|
2549 | xhr.onload = () => {
|
2550 | if (((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) && xhr.response !== null) {
|
2551 | let data = xhr.response;
|
2552 | if (requestParameters.type === 'json') {
|
2553 | // We're manually parsing JSON here to get better error messages.
|
2554 | try {
|
2555 | data = JSON.parse(xhr.response);
|
2556 | }
|
2557 | catch (err) {
|
2558 | return callback(err);
|
2559 | }
|
2560 | }
|
2561 | callback(null, data, xhr.getResponseHeader('Cache-Control'), xhr.getResponseHeader('Expires'));
|
2562 | }
|
2563 | else {
|
2564 | const body = new Blob([xhr.response], { type: xhr.getResponseHeader('Content-Type') });
|
2565 | callback(new AJAXError(xhr.status, xhr.statusText, requestParameters.url, body));
|
2566 | }
|
2567 | };
|
2568 | xhr.send(requestParameters.body);
|
2569 | return { cancel: () => xhr.abort() };
|
2570 | }
|
2571 | const makeRequest = function (requestParameters, callback) {
|
2572 | // We're trying to use the Fetch API if possible. However, in some situations we can't use it:
|
2573 | // - IE11 doesn't support it at all. In this case, we dispatch the request to the main thread so
|
2574 | // that we can get an accruate referrer header.
|
2575 | // - Safari exposes window.AbortController, but it doesn't work actually abort any requests in
|
2576 | // some versions (see https://bugs.webkit.org/show_bug.cgi?id=174980#c2)
|
2577 | // - Requests for resources with the file:// URI scheme don't work with the Fetch API either. In
|
2578 | // this case we unconditionally use XHR on the current thread since referrers don't matter.
|
2579 | if (/:\/\//.test(requestParameters.url) && !(/^https?:|^file:/.test(requestParameters.url))) {
|
2580 | if (isWorker() && self.worker && self.worker.actor) {
|
2581 | return self.worker.actor.send('getResource', requestParameters, callback);
|
2582 | }
|
2583 | if (!isWorker()) {
|
2584 | const protocol = requestParameters.url.substring(0, requestParameters.url.indexOf('://'));
|
2585 | const action = config.REGISTERED_PROTOCOLS[protocol] || makeFetchRequest;
|
2586 | return action(requestParameters, callback);
|
2587 | }
|
2588 | }
|
2589 | if (!isFileURL(requestParameters.url)) {
|
2590 | if (fetch && Request && AbortController && Object.prototype.hasOwnProperty.call(Request.prototype, 'signal')) {
|
2591 | return makeFetchRequest(requestParameters, callback);
|
2592 | }
|
2593 | if (isWorker() && self.worker && self.worker.actor) {
|
2594 | const queueOnMainThread = true;
|
2595 | return self.worker.actor.send('getResource', requestParameters, callback, undefined, queueOnMainThread);
|
2596 | }
|
2597 | }
|
2598 | return makeXMLHttpRequest(requestParameters, callback);
|
2599 | };
|
2600 | const getJSON = function (requestParameters, callback) {
|
2601 | return makeRequest(extend$1(requestParameters, { type: 'json' }), callback);
|
2602 | };
|
2603 | const getArrayBuffer = function (requestParameters, callback) {
|
2604 | return makeRequest(extend$1(requestParameters, { type: 'arrayBuffer' }), callback);
|
2605 | };
|
2606 | const postData = function (requestParameters, callback) {
|
2607 | return makeRequest(extend$1(requestParameters, { method: 'POST' }), callback);
|
2608 | };
|
2609 | function sameOrigin(url) {
|
2610 | const a = window.document.createElement('a');
|
2611 | a.href = url;
|
2612 | return a.protocol === window.document.location.protocol && a.host === window.document.location.host;
|
2613 | }
|
2614 | const transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=';
|
2615 | function arrayBufferToImage(data, callback) {
|
2616 | const img = new Image();
|
2617 | img.onload = () => {
|
2618 | callback(null, img);
|
2619 | URL.revokeObjectURL(img.src);
|
2620 | // prevent image dataURI memory leak in Safari;
|
2621 | // but don't free the image immediately because it might be uploaded in the next frame
|
2622 | // https://github.com/mapbox/mapbox-gl-js/issues/10226
|
2623 | img.onload = null;
|
2624 | window.requestAnimationFrame(() => { img.src = transparentPngUrl; });
|
2625 | };
|
2626 | img.onerror = () => callback(new Error('Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.'));
|
2627 | const blob = new Blob([new Uint8Array(data)], { type: 'image/png' });
|
2628 | img.src = data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl;
|
2629 | }
|
2630 | function arrayBufferToImageBitmap(data, callback) {
|
2631 | const blob = new Blob([new Uint8Array(data)], { type: 'image/png' });
|
2632 | createImageBitmap(blob).then((imgBitmap) => {
|
2633 | callback(null, imgBitmap);
|
2634 | }).catch((e) => {
|
2635 | callback(new Error(`Could not load image because of ${e.message}. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.`));
|
2636 | });
|
2637 | }
|
2638 | function arrayBufferToCanvasImageSource(data, callback) {
|
2639 | const imageBitmapSupported = typeof createImageBitmap === 'function';
|
2640 | if (imageBitmapSupported) {
|
2641 | arrayBufferToImageBitmap(data, callback);
|
2642 | }
|
2643 | else {
|
2644 | arrayBufferToImage(data, callback);
|
2645 | }
|
2646 | }
|
2647 | let imageQueue, numImageRequests;
|
2648 | const resetImageRequestQueue = () => {
|
2649 | imageQueue = [];
|
2650 | numImageRequests = 0;
|
2651 | };
|
2652 | resetImageRequestQueue();
|
2653 | const getImage = function (requestParameters, callback) {
|
2654 | if (exported.supported) {
|
2655 | if (!requestParameters.headers) {
|
2656 | requestParameters.headers = {};
|
2657 | }
|
2658 | requestParameters.headers.accept = 'image/webp,*/*';
|
2659 | }
|
2660 | // limit concurrent image loads to help with raster sources performance on big screens
|
2661 | if (numImageRequests >= config.MAX_PARALLEL_IMAGE_REQUESTS) {
|
2662 | const queued = {
|
2663 | requestParameters,
|
2664 | callback,
|
2665 | cancelled: false,
|
2666 | cancel() { this.cancelled = true; }
|
2667 | };
|
2668 | imageQueue.push(queued);
|
2669 | return queued;
|
2670 | }
|
2671 | numImageRequests++;
|
2672 | let advanced = false;
|
2673 | const advanceImageRequestQueue = () => {
|
2674 | if (advanced)
|
2675 | return;
|
2676 | advanced = true;
|
2677 | numImageRequests--;
|
2678 | assert$1(numImageRequests >= 0);
|
2679 | while (imageQueue.length && numImageRequests < config.MAX_PARALLEL_IMAGE_REQUESTS) { // eslint-disable-line
|
2680 | const request = imageQueue.shift();
|
2681 | const { requestParameters, callback, cancelled } = request;
|
2682 | if (!cancelled) {
|
2683 | request.cancel = getImage(requestParameters, callback).cancel;
|
2684 | }
|
2685 | }
|
2686 | };
|
2687 | // request the image with XHR to work around caching issues
|
2688 | // see https://github.com/mapbox/mapbox-gl-js/issues/1470
|
2689 | const request = getArrayBuffer(requestParameters, (err, data, cacheControl, expires) => {
|
2690 | advanceImageRequestQueue();
|
2691 | if (err) {
|
2692 | callback(err);
|
2693 | }
|
2694 | else if (data) {
|
2695 | const decoratedCallback = (imgErr, imgResult) => {
|
2696 | if (imgErr != null) {
|
2697 | callback(imgErr);
|
2698 | }
|
2699 | else if (imgResult != null) {
|
2700 | callback(null, imgResult, { cacheControl, expires });
|
2701 | }
|
2702 | };
|
2703 | arrayBufferToCanvasImageSource(data, decoratedCallback);
|
2704 | }
|
2705 | });
|
2706 | return {
|
2707 | cancel: () => {
|
2708 | request.cancel();
|
2709 | advanceImageRequestQueue();
|
2710 | }
|
2711 | };
|
2712 | };
|
2713 | const getVideo = function (urls, callback) {
|
2714 | const video = window.document.createElement('video');
|
2715 | video.muted = true;
|
2716 | video.onloadstart = function () {
|
2717 | callback(null, video);
|
2718 | };
|
2719 | for (let i = 0; i < urls.length; i++) {
|
2720 | const s = window.document.createElement('source');
|
2721 | if (!sameOrigin(urls[i])) {
|
2722 | video.crossOrigin = 'Anonymous';
|
2723 | }
|
2724 | s.src = urls[i];
|
2725 | video.appendChild(s);
|
2726 | }
|
2727 | return { cancel: () => { } };
|
2728 | };
|
2729 |
|
2730 | function _addEventListener(type, listener, listenerList) {
|
2731 | const listenerExists = listenerList[type] && listenerList[type].indexOf(listener) !== -1;
|
2732 | if (!listenerExists) {
|
2733 | listenerList[type] = listenerList[type] || [];
|
2734 | listenerList[type].push(listener);
|
2735 | }
|
2736 | }
|
2737 | function _removeEventListener(type, listener, listenerList) {
|
2738 | if (listenerList && listenerList[type]) {
|
2739 | const index = listenerList[type].indexOf(listener);
|
2740 | if (index !== -1) {
|
2741 | listenerList[type].splice(index, 1);
|
2742 | }
|
2743 | }
|
2744 | }
|
2745 | class Event {
|
2746 | constructor(type, data = {}) {
|
2747 | extend$1(this, data);
|
2748 | this.type = type;
|
2749 | }
|
2750 | }
|
2751 | class ErrorEvent extends Event {
|
2752 | constructor(error, data = {}) {
|
2753 | super('error', extend$1({ error }, data));
|
2754 | }
|
2755 | }
|
2756 | /**
|
2757 | * Methods mixed in to other classes for event capabilities.
|
2758 | *
|
2759 | * @mixin Evented
|
2760 | */
|
2761 | class Evented {
|
2762 | /**
|
2763 | * Adds a listener to a specified event type.
|
2764 | *
|
2765 | * @param {string} type The event type to add a listen for.
|
2766 | * @param {Function} listener The function to be called when the event is fired.
|
2767 | * The listener function is called with the data object passed to `fire`,
|
2768 | * extended with `target` and `type` properties.
|
2769 | * @returns {Object} `this`
|
2770 | */
|
2771 | on(type, listener) {
|
2772 | this._listeners = this._listeners || {};
|
2773 | _addEventListener(type, listener, this._listeners);
|
2774 | return this;
|
2775 | }
|
2776 | /**
|
2777 | * Removes a previously registered event listener.
|
2778 | *
|
2779 | * @param {string} type The event type to remove listeners for.
|
2780 | * @param {Function} listener The listener function to remove.
|
2781 | * @returns {Object} `this`
|
2782 | */
|
2783 | off(type, listener) {
|
2784 | _removeEventListener(type, listener, this._listeners);
|
2785 | _removeEventListener(type, listener, this._oneTimeListeners);
|
2786 | return this;
|
2787 | }
|
2788 | /**
|
2789 | * Adds a listener that will be called only once to a specified event type.
|
2790 | *
|
2791 | * The listener will be called first time the event fires after the listener is registered.
|
2792 | *
|
2793 | * @param {string} type The event type to listen for.
|
2794 | * @param {Function} listener The function to be called when the event is fired the first time.
|
2795 | * @returns {Object} `this`
|
2796 | */
|
2797 | once(type, listener) {
|
2798 | this._oneTimeListeners = this._oneTimeListeners || {};
|
2799 | _addEventListener(type, listener, this._oneTimeListeners);
|
2800 | return this;
|
2801 | }
|
2802 | fire(event, properties) {
|
2803 | // Compatibility with (type: string, properties: Object) signature from previous versions.
|
2804 | // See https://github.com/mapbox/mapbox-gl-js/issues/6522,
|
2805 | // https://github.com/mapbox/mapbox-gl-draw/issues/766
|
2806 | if (typeof event === 'string') {
|
2807 | event = new Event(event, properties || {});
|
2808 | }
|
2809 | const type = event.type;
|
2810 | if (this.listens(type)) {
|
2811 | event.target = this;
|
2812 | // make sure adding or removing listeners inside other listeners won't cause an infinite loop
|
2813 | const listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : [];
|
2814 | for (const listener of listeners) {
|
2815 | listener.call(this, event);
|
2816 | }
|
2817 | const oneTimeListeners = this._oneTimeListeners && this._oneTimeListeners[type] ? this._oneTimeListeners[type].slice() : [];
|
2818 | for (const listener of oneTimeListeners) {
|
2819 | _removeEventListener(type, listener, this._oneTimeListeners);
|
2820 | listener.call(this, event);
|
2821 | }
|
2822 | const parent = this._eventedParent;
|
2823 | if (parent) {
|
2824 | extend$1(event, typeof this._eventedParentData === 'function' ? this._eventedParentData() : this._eventedParentData);
|
2825 | parent.fire(event);
|
2826 | }
|
2827 | // To ensure that no error events are dropped, print them to the
|
2828 | // console if they have no listeners.
|
2829 | }
|
2830 | else if (event instanceof ErrorEvent) {
|
2831 | console.error(event.error);
|
2832 | }
|
2833 | return this;
|
2834 | }
|
2835 | /**
|
2836 | * Returns a true if this instance of Evented or any forwardeed instances of Evented have a listener for the specified type.
|
2837 | *
|
2838 | * @param {string} type The event type
|
2839 | * @returns {boolean} `true` if there is at least one registered listener for specified event type, `false` otherwise
|
2840 | * @private
|
2841 | */
|
2842 | listens(type) {
|
2843 | return ((this._listeners && this._listeners[type] && this._listeners[type].length > 0) ||
|
2844 | (this._oneTimeListeners && this._oneTimeListeners[type] && this._oneTimeListeners[type].length > 0) ||
|
2845 | (this._eventedParent && this._eventedParent.listens(type)));
|
2846 | }
|
2847 | /**
|
2848 | * Bubble all events fired by this instance of Evented to this parent instance of Evented.
|
2849 | *
|
2850 | * @private
|
2851 | * @returns {Object} `this`
|
2852 | * @private
|
2853 | */
|
2854 | setEventedParent(parent, data) {
|
2855 | this._eventedParent = parent;
|
2856 | this._eventedParentData = data;
|
2857 | return this;
|
2858 | }
|
2859 | }
|
2860 |
|
2861 | var $version = 8;
|
2862 | var $root = {
|
2863 | version: {
|
2864 | required: true,
|
2865 | type: "enum",
|
2866 | values: [
|
2867 | 8
|
2868 | ]
|
2869 | },
|
2870 | name: {
|
2871 | type: "string"
|
2872 | },
|
2873 | metadata: {
|
2874 | type: "*"
|
2875 | },
|
2876 | center: {
|
2877 | type: "array",
|
2878 | value: "number"
|
2879 | },
|
2880 | zoom: {
|
2881 | type: "number"
|
2882 | },
|
2883 | bearing: {
|
2884 | type: "number",
|
2885 | "default": 0,
|
2886 | period: 360,
|
2887 | units: "degrees"
|
2888 | },
|
2889 | pitch: {
|
2890 | type: "number",
|
2891 | "default": 0,
|
2892 | units: "degrees"
|
2893 | },
|
2894 | light: {
|
2895 | type: "light"
|
2896 | },
|
2897 | sources: {
|
2898 | required: true,
|
2899 | type: "sources"
|
2900 | },
|
2901 | sprite: {
|
2902 | type: "string"
|
2903 | },
|
2904 | glyphs: {
|
2905 | type: "string"
|
2906 | },
|
2907 | transition: {
|
2908 | type: "transition"
|
2909 | },
|
2910 | layers: {
|
2911 | required: true,
|
2912 | type: "array",
|
2913 | value: "layer"
|
2914 | }
|
2915 | };
|
2916 | var sources = {
|
2917 | "*": {
|
2918 | type: "source"
|
2919 | }
|
2920 | };
|
2921 | var source = [
|
2922 | "source_vector",
|
2923 | "source_raster",
|
2924 | "source_raster_dem",
|
2925 | "source_geojson",
|
2926 | "source_video",
|
2927 | "source_image"
|
2928 | ];
|
2929 | var source_vector = {
|
2930 | type: {
|
2931 | required: true,
|
2932 | type: "enum",
|
2933 | values: {
|
2934 | vector: {
|
2935 | }
|
2936 | }
|
2937 | },
|
2938 | url: {
|
2939 | type: "string"
|
2940 | },
|
2941 | tiles: {
|
2942 | type: "array",
|
2943 | value: "string"
|
2944 | },
|
2945 | bounds: {
|
2946 | type: "array",
|
2947 | value: "number",
|
2948 | length: 4,
|
2949 | "default": [
|
2950 | -180,
|
2951 | -85.051129,
|
2952 | 180,
|
2953 | 85.051129
|
2954 | ]
|
2955 | },
|
2956 | scheme: {
|
2957 | type: "enum",
|
2958 | values: {
|
2959 | xyz: {
|
2960 | },
|
2961 | tms: {
|
2962 | }
|
2963 | },
|
2964 | "default": "xyz"
|
2965 | },
|
2966 | minzoom: {
|
2967 | type: "number",
|
2968 | "default": 0
|
2969 | },
|
2970 | maxzoom: {
|
2971 | type: "number",
|
2972 | "default": 22
|
2973 | },
|
2974 | attribution: {
|
2975 | type: "string"
|
2976 | },
|
2977 | promoteId: {
|
2978 | type: "promoteId"
|
2979 | },
|
2980 | volatile: {
|
2981 | type: "boolean",
|
2982 | "default": false
|
2983 | },
|
2984 | "*": {
|
2985 | type: "*"
|
2986 | }
|
2987 | };
|
2988 | var source_raster = {
|
2989 | type: {
|
2990 | required: true,
|
2991 | type: "enum",
|
2992 | values: {
|
2993 | raster: {
|
2994 | }
|
2995 | }
|
2996 | },
|
2997 | url: {
|
2998 | type: "string"
|
2999 | },
|
3000 | tiles: {
|
3001 | type: "array",
|
3002 | value: "string"
|
3003 | },
|
3004 | bounds: {
|
3005 | type: "array",
|
3006 | value: "number",
|
3007 | length: 4,
|
3008 | "default": [
|
3009 | -180,
|
3010 | -85.051129,
|
3011 | 180,
|
3012 | 85.051129
|
3013 | ]
|
3014 | },
|
3015 | minzoom: {
|
3016 | type: "number",
|
3017 | "default": 0
|
3018 | },
|
3019 | maxzoom: {
|
3020 | type: "number",
|
3021 | "default": 22
|
3022 | },
|
3023 | tileSize: {
|
3024 | type: "number",
|
3025 | "default": 512,
|
3026 | units: "pixels"
|
3027 | },
|
3028 | scheme: {
|
3029 | type: "enum",
|
3030 | values: {
|
3031 | xyz: {
|
3032 | },
|
3033 | tms: {
|
3034 | }
|
3035 | },
|
3036 | "default": "xyz"
|
3037 | },
|
3038 | attribution: {
|
3039 | type: "string"
|
3040 | },
|
3041 | volatile: {
|
3042 | type: "boolean",
|
3043 | "default": false
|
3044 | },
|
3045 | "*": {
|
3046 | type: "*"
|
3047 | }
|
3048 | };
|
3049 | var source_raster_dem = {
|
3050 | type: {
|
3051 | required: true,
|
3052 | type: "enum",
|
3053 | values: {
|
3054 | "raster-dem": {
|
3055 | }
|
3056 | }
|
3057 | },
|
3058 | url: {
|
3059 | type: "string"
|
3060 | },
|
3061 | tiles: {
|
3062 | type: "array",
|
3063 | value: "string"
|
3064 | },
|
3065 | bounds: {
|
3066 | type: "array",
|
3067 | value: "number",
|
3068 | length: 4,
|
3069 | "default": [
|
3070 | -180,
|
3071 | -85.051129,
|
3072 | 180,
|
3073 | 85.051129
|
3074 | ]
|
3075 | },
|
3076 | minzoom: {
|
3077 | type: "number",
|
3078 | "default": 0
|
3079 | },
|
3080 | maxzoom: {
|
3081 | type: "number",
|
3082 | "default": 22
|
3083 | },
|
3084 | tileSize: {
|
3085 | type: "number",
|
3086 | "default": 512,
|
3087 | units: "pixels"
|
3088 | },
|
3089 | attribution: {
|
3090 | type: "string"
|
3091 | },
|
3092 | encoding: {
|
3093 | type: "enum",
|
3094 | values: {
|
3095 | terrarium: {
|
3096 | },
|
3097 | mapbox: {
|
3098 | }
|
3099 | },
|
3100 | "default": "mapbox"
|
3101 | },
|
3102 | volatile: {
|
3103 | type: "boolean",
|
3104 | "default": false
|
3105 | },
|
3106 | "*": {
|
3107 | type: "*"
|
3108 | }
|
3109 | };
|
3110 | var source_geojson = {
|
3111 | type: {
|
3112 | required: true,
|
3113 | type: "enum",
|
3114 | values: {
|
3115 | geojson: {
|
3116 | }
|
3117 | }
|
3118 | },
|
3119 | data: {
|
3120 | type: "*"
|
3121 | },
|
3122 | maxzoom: {
|
3123 | type: "number",
|
3124 | "default": 18
|
3125 | },
|
3126 | attribution: {
|
3127 | type: "string"
|
3128 | },
|
3129 | buffer: {
|
3130 | type: "number",
|
3131 | "default": 128,
|
3132 | maximum: 512,
|
3133 | minimum: 0
|
3134 | },
|
3135 | filter: {
|
3136 | type: "*"
|
3137 | },
|
3138 | tolerance: {
|
3139 | type: "number",
|
3140 | "default": 0.375
|
3141 | },
|
3142 | cluster: {
|
3143 | type: "boolean",
|
3144 | "default": false
|
3145 | },
|
3146 | clusterRadius: {
|
3147 | type: "number",
|
3148 | "default": 50,
|
3149 | minimum: 0
|
3150 | },
|
3151 | clusterMaxZoom: {
|
3152 | type: "number"
|
3153 | },
|
3154 | clusterMinPoints: {
|
3155 | type: "number"
|
3156 | },
|
3157 | clusterProperties: {
|
3158 | type: "*"
|
3159 | },
|
3160 | lineMetrics: {
|
3161 | type: "boolean",
|
3162 | "default": false
|
3163 | },
|
3164 | generateId: {
|
3165 | type: "boolean",
|
3166 | "default": false
|
3167 | },
|
3168 | promoteId: {
|
3169 | type: "promoteId"
|
3170 | }
|
3171 | };
|
3172 | var source_video = {
|
3173 | type: {
|
3174 | required: true,
|
3175 | type: "enum",
|
3176 | values: {
|
3177 | video: {
|
3178 | }
|
3179 | }
|
3180 | },
|
3181 | urls: {
|
3182 | required: true,
|
3183 | type: "array",
|
3184 | value: "string"
|
3185 | },
|
3186 | coordinates: {
|
3187 | required: true,
|
3188 | type: "array",
|
3189 | length: 4,
|
3190 | value: {
|
3191 | type: "array",
|
3192 | length: 2,
|
3193 | value: "number"
|
3194 | }
|
3195 | }
|
3196 | };
|
3197 | var source_image = {
|
3198 | type: {
|
3199 | required: true,
|
3200 | type: "enum",
|
3201 | values: {
|
3202 | image: {
|
3203 | }
|
3204 | }
|
3205 | },
|
3206 | url: {
|
3207 | required: true,
|
3208 | type: "string"
|
3209 | },
|
3210 | coordinates: {
|
3211 | required: true,
|
3212 | type: "array",
|
3213 | length: 4,
|
3214 | value: {
|
3215 | type: "array",
|
3216 | length: 2,
|
3217 | value: "number"
|
3218 | }
|
3219 | }
|
3220 | };
|
3221 | var layer = {
|
3222 | id: {
|
3223 | type: "string",
|
3224 | required: true
|
3225 | },
|
3226 | type: {
|
3227 | type: "enum",
|
3228 | values: {
|
3229 | fill: {
|
3230 | },
|
3231 | line: {
|
3232 | },
|
3233 | symbol: {
|
3234 | },
|
3235 | circle: {
|
3236 | },
|
3237 | heatmap: {
|
3238 | },
|
3239 | "fill-extrusion": {
|
3240 | },
|
3241 | raster: {
|
3242 | },
|
3243 | hillshade: {
|
3244 | },
|
3245 | background: {
|
3246 | }
|
3247 | },
|
3248 | required: true
|
3249 | },
|
3250 | metadata: {
|
3251 | type: "*"
|
3252 | },
|
3253 | source: {
|
3254 | type: "string"
|
3255 | },
|
3256 | "source-layer": {
|
3257 | type: "string"
|
3258 | },
|
3259 | minzoom: {
|
3260 | type: "number",
|
3261 | minimum: 0,
|
3262 | maximum: 24
|
3263 | },
|
3264 | maxzoom: {
|
3265 | type: "number",
|
3266 | minimum: 0,
|
3267 | maximum: 24
|
3268 | },
|
3269 | filter: {
|
3270 | type: "filter"
|
3271 | },
|
3272 | layout: {
|
3273 | type: "layout"
|
3274 | },
|
3275 | paint: {
|
3276 | type: "paint"
|
3277 | }
|
3278 | };
|
3279 | var layout$7 = [
|
3280 | "layout_fill",
|
3281 | "layout_line",
|
3282 | "layout_circle",
|
3283 | "layout_heatmap",
|
3284 | "layout_fill-extrusion",
|
3285 | "layout_symbol",
|
3286 | "layout_raster",
|
3287 | "layout_hillshade",
|
3288 | "layout_background"
|
3289 | ];
|
3290 | var layout_background = {
|
3291 | visibility: {
|
3292 | type: "enum",
|
3293 | values: {
|
3294 | visible: {
|
3295 | },
|
3296 | none: {
|
3297 | }
|
3298 | },
|
3299 | "default": "visible",
|
3300 | "property-type": "constant"
|
3301 | }
|
3302 | };
|
3303 | var layout_fill = {
|
3304 | "fill-sort-key": {
|
3305 | type: "number",
|
3306 | expression: {
|
3307 | interpolated: false,
|
3308 | parameters: [
|
3309 | "zoom",
|
3310 | "feature"
|
3311 | ]
|
3312 | },
|
3313 | "property-type": "data-driven"
|
3314 | },
|
3315 | visibility: {
|
3316 | type: "enum",
|
3317 | values: {
|
3318 | visible: {
|
3319 | },
|
3320 | none: {
|
3321 | }
|
3322 | },
|
3323 | "default": "visible",
|
3324 | "property-type": "constant"
|
3325 | }
|
3326 | };
|
3327 | var layout_circle = {
|
3328 | "circle-sort-key": {
|
3329 | type: "number",
|
3330 | expression: {
|
3331 | interpolated: false,
|
3332 | parameters: [
|
3333 | "zoom",
|
3334 | "feature"
|
3335 | ]
|
3336 | },
|
3337 | "property-type": "data-driven"
|
3338 | },
|
3339 | visibility: {
|
3340 | type: "enum",
|
3341 | values: {
|
3342 | visible: {
|
3343 | },
|
3344 | none: {
|
3345 | }
|
3346 | },
|
3347 | "default": "visible",
|
3348 | "property-type": "constant"
|
3349 | }
|
3350 | };
|
3351 | var layout_heatmap = {
|
3352 | visibility: {
|
3353 | type: "enum",
|
3354 | values: {
|
3355 | visible: {
|
3356 | },
|
3357 | none: {
|
3358 | }
|
3359 | },
|
3360 | "default": "visible",
|
3361 | "property-type": "constant"
|
3362 | }
|
3363 | };
|
3364 | var layout_line = {
|
3365 | "line-cap": {
|
3366 | type: "enum",
|
3367 | values: {
|
3368 | butt: {
|
3369 | },
|
3370 | round: {
|
3371 | },
|
3372 | square: {
|
3373 | }
|
3374 | },
|
3375 | "default": "butt",
|
3376 | expression: {
|
3377 | interpolated: false,
|
3378 | parameters: [
|
3379 | "zoom"
|
3380 | ]
|
3381 | },
|
3382 | "property-type": "data-constant"
|
3383 | },
|
3384 | "line-join": {
|
3385 | type: "enum",
|
3386 | values: {
|
3387 | bevel: {
|
3388 | },
|
3389 | round: {
|
3390 | },
|
3391 | miter: {
|
3392 | }
|
3393 | },
|
3394 | "default": "miter",
|
3395 | expression: {
|
3396 | interpolated: false,
|
3397 | parameters: [
|
3398 | "zoom",
|
3399 | "feature"
|
3400 | ]
|
3401 | },
|
3402 | "property-type": "data-driven"
|
3403 | },
|
3404 | "line-miter-limit": {
|
3405 | type: "number",
|
3406 | "default": 2,
|
3407 | requires: [
|
3408 | {
|
3409 | "line-join": "miter"
|
3410 | }
|
3411 | ],
|
3412 | expression: {
|
3413 | interpolated: true,
|
3414 | parameters: [
|
3415 | "zoom"
|
3416 | ]
|
3417 | },
|
3418 | "property-type": "data-constant"
|
3419 | },
|
3420 | "line-round-limit": {
|
3421 | type: "number",
|
3422 | "default": 1.05,
|
3423 | requires: [
|
3424 | {
|
3425 | "line-join": "round"
|
3426 | }
|
3427 | ],
|
3428 | expression: {
|
3429 | interpolated: true,
|
3430 | parameters: [
|
3431 | "zoom"
|
3432 | ]
|
3433 | },
|
3434 | "property-type": "data-constant"
|
3435 | },
|
3436 | "line-sort-key": {
|
3437 | type: "number",
|
3438 | expression: {
|
3439 | interpolated: false,
|
3440 | parameters: [
|
3441 | "zoom",
|
3442 | "feature"
|
3443 | ]
|
3444 | },
|
3445 | "property-type": "data-driven"
|
3446 | },
|
3447 | visibility: {
|
3448 | type: "enum",
|
3449 | values: {
|
3450 | visible: {
|
3451 | },
|
3452 | none: {
|
3453 | }
|
3454 | },
|
3455 | "default": "visible",
|
3456 | "property-type": "constant"
|
3457 | }
|
3458 | };
|
3459 | var layout_symbol = {
|
3460 | "symbol-placement": {
|
3461 | type: "enum",
|
3462 | values: {
|
3463 | point: {
|
3464 | },
|
3465 | line: {
|
3466 | },
|
3467 | "line-center": {
|
3468 | }
|
3469 | },
|
3470 | "default": "point",
|
3471 | expression: {
|
3472 | interpolated: false,
|
3473 | parameters: [
|
3474 | "zoom"
|
3475 | ]
|
3476 | },
|
3477 | "property-type": "data-constant"
|
3478 | },
|
3479 | "symbol-spacing": {
|
3480 | type: "number",
|
3481 | "default": 250,
|
3482 | minimum: 1,
|
3483 | units: "pixels",
|
3484 | requires: [
|
3485 | {
|
3486 | "symbol-placement": "line"
|
3487 | }
|
3488 | ],
|
3489 | expression: {
|
3490 | interpolated: true,
|
3491 | parameters: [
|
3492 | "zoom"
|
3493 | ]
|
3494 | },
|
3495 | "property-type": "data-constant"
|
3496 | },
|
3497 | "symbol-avoid-edges": {
|
3498 | type: "boolean",
|
3499 | "default": false,
|
3500 | expression: {
|
3501 | interpolated: false,
|
3502 | parameters: [
|
3503 | "zoom"
|
3504 | ]
|
3505 | },
|
3506 | "property-type": "data-constant"
|
3507 | },
|
3508 | "symbol-sort-key": {
|
3509 | type: "number",
|
3510 | expression: {
|
3511 | interpolated: false,
|
3512 | parameters: [
|
3513 | "zoom",
|
3514 | "feature"
|
3515 | ]
|
3516 | },
|
3517 | "property-type": "data-driven"
|
3518 | },
|
3519 | "symbol-z-order": {
|
3520 | type: "enum",
|
3521 | values: {
|
3522 | auto: {
|
3523 | },
|
3524 | "viewport-y": {
|
3525 | },
|
3526 | source: {
|
3527 | }
|
3528 | },
|
3529 | "default": "auto",
|
3530 | expression: {
|
3531 | interpolated: false,
|
3532 | parameters: [
|
3533 | "zoom"
|
3534 | ]
|
3535 | },
|
3536 | "property-type": "data-constant"
|
3537 | },
|
3538 | "icon-allow-overlap": {
|
3539 | type: "boolean",
|
3540 | "default": false,
|
3541 | requires: [
|
3542 | "icon-image",
|
3543 | {
|
3544 | "!": "icon-overlap"
|
3545 | }
|
3546 | ],
|
3547 | expression: {
|
3548 | interpolated: false,
|
3549 | parameters: [
|
3550 | "zoom"
|
3551 | ]
|
3552 | },
|
3553 | "property-type": "data-constant"
|
3554 | },
|
3555 | "icon-overlap": {
|
3556 | type: "enum",
|
3557 | values: {
|
3558 | never: {
|
3559 | },
|
3560 | always: {
|
3561 | },
|
3562 | cooperative: {
|
3563 | }
|
3564 | },
|
3565 | requires: [
|
3566 | "icon-image"
|
3567 | ],
|
3568 | expression: {
|
3569 | interpolated: false,
|
3570 | parameters: [
|
3571 | "zoom"
|
3572 | ]
|
3573 | },
|
3574 | "property-type": "data-constant"
|
3575 | },
|
3576 | "icon-ignore-placement": {
|
3577 | type: "boolean",
|
3578 | "default": false,
|
3579 | requires: [
|
3580 | "icon-image"
|
3581 | ],
|
3582 | expression: {
|
3583 | interpolated: false,
|
3584 | parameters: [
|
3585 | "zoom"
|
3586 | ]
|
3587 | },
|
3588 | "property-type": "data-constant"
|
3589 | },
|
3590 | "icon-optional": {
|
3591 | type: "boolean",
|
3592 | "default": false,
|
3593 | requires: [
|
3594 | "icon-image",
|
3595 | "text-field"
|
3596 | ],
|
3597 | expression: {
|
3598 | interpolated: false,
|
3599 | parameters: [
|
3600 | "zoom"
|
3601 | ]
|
3602 | },
|
3603 | "property-type": "data-constant"
|
3604 | },
|
3605 | "icon-rotation-alignment": {
|
3606 | type: "enum",
|
3607 | values: {
|
3608 | map: {
|
3609 | },
|
3610 | viewport: {
|
3611 | },
|
3612 | auto: {
|
3613 | }
|
3614 | },
|
3615 | "default": "auto",
|
3616 | requires: [
|
3617 | "icon-image"
|
3618 | ],
|
3619 | expression: {
|
3620 | interpolated: false,
|
3621 | parameters: [
|
3622 | "zoom"
|
3623 | ]
|
3624 | },
|
3625 | "property-type": "data-constant"
|
3626 | },
|
3627 | "icon-size": {
|
3628 | type: "number",
|
3629 | "default": 1,
|
3630 | minimum: 0,
|
3631 | units: "factor of the original icon size",
|
3632 | requires: [
|
3633 | "icon-image"
|
3634 | ],
|
3635 | expression: {
|
3636 | interpolated: true,
|
3637 | parameters: [
|
3638 | "zoom",
|
3639 | "feature"
|
3640 | ]
|
3641 | },
|
3642 | "property-type": "data-driven"
|
3643 | },
|
3644 | "icon-text-fit": {
|
3645 | type: "enum",
|
3646 | values: {
|
3647 | none: {
|
3648 | },
|
3649 | width: {
|
3650 | },
|
3651 | height: {
|
3652 | },
|
3653 | both: {
|
3654 | }
|
3655 | },
|
3656 | "default": "none",
|
3657 | requires: [
|
3658 | "icon-image",
|
3659 | "text-field"
|
3660 | ],
|
3661 | expression: {
|
3662 | interpolated: false,
|
3663 | parameters: [
|
3664 | "zoom"
|
3665 | ]
|
3666 | },
|
3667 | "property-type": "data-constant"
|
3668 | },
|
3669 | "icon-text-fit-padding": {
|
3670 | type: "array",
|
3671 | value: "number",
|
3672 | length: 4,
|
3673 | "default": [
|
3674 | 0,
|
3675 | 0,
|
3676 | 0,
|
3677 | 0
|
3678 | ],
|
3679 | units: "pixels",
|
3680 | requires: [
|
3681 | "icon-image",
|
3682 | "text-field",
|
3683 | {
|
3684 | "icon-text-fit": [
|
3685 | "both",
|
3686 | "width",
|
3687 | "height"
|
3688 | ]
|
3689 | }
|
3690 | ],
|
3691 | expression: {
|
3692 | interpolated: true,
|
3693 | parameters: [
|
3694 | "zoom"
|
3695 | ]
|
3696 | },
|
3697 | "property-type": "data-constant"
|
3698 | },
|
3699 | "icon-image": {
|
3700 | type: "resolvedImage",
|
3701 | tokens: true,
|
3702 | expression: {
|
3703 | interpolated: false,
|
3704 | parameters: [
|
3705 | "zoom",
|
3706 | "feature"
|
3707 | ]
|
3708 | },
|
3709 | "property-type": "data-driven"
|
3710 | },
|
3711 | "icon-rotate": {
|
3712 | type: "number",
|
3713 | "default": 0,
|
3714 | period: 360,
|
3715 | units: "degrees",
|
3716 | requires: [
|
3717 | "icon-image"
|
3718 | ],
|
3719 | expression: {
|
3720 | interpolated: true,
|
3721 | parameters: [
|
3722 | "zoom",
|
3723 | "feature"
|
3724 | ]
|
3725 | },
|
3726 | "property-type": "data-driven"
|
3727 | },
|
3728 | "icon-padding": {
|
3729 | type: "number",
|
3730 | "default": 2,
|
3731 | minimum: 0,
|
3732 | units: "pixels",
|
3733 | requires: [
|
3734 | "icon-image"
|
3735 | ],
|
3736 | expression: {
|
3737 | interpolated: true,
|
3738 | parameters: [
|
3739 | "zoom"
|
3740 | ]
|
3741 | },
|
3742 | "property-type": "data-constant"
|
3743 | },
|
3744 | "icon-keep-upright": {
|
3745 | type: "boolean",
|
3746 | "default": false,
|
3747 | requires: [
|
3748 | "icon-image",
|
3749 | {
|
3750 | "icon-rotation-alignment": "map"
|
3751 | },
|
3752 | {
|
3753 | "symbol-placement": [
|
3754 | "line",
|
3755 | "line-center"
|
3756 | ]
|
3757 | }
|
3758 | ],
|
3759 | expression: {
|
3760 | interpolated: false,
|
3761 | parameters: [
|
3762 | "zoom"
|
3763 | ]
|
3764 | },
|
3765 | "property-type": "data-constant"
|
3766 | },
|
3767 | "icon-offset": {
|
3768 | type: "array",
|
3769 | value: "number",
|
3770 | length: 2,
|
3771 | "default": [
|
3772 | 0,
|
3773 | 0
|
3774 | ],
|
3775 | requires: [
|
3776 | "icon-image"
|
3777 | ],
|
3778 | expression: {
|
3779 | interpolated: true,
|
3780 | parameters: [
|
3781 | "zoom",
|
3782 | "feature"
|
3783 | ]
|
3784 | },
|
3785 | "property-type": "data-driven"
|
3786 | },
|
3787 | "icon-anchor": {
|
3788 | type: "enum",
|
3789 | values: {
|
3790 | center: {
|
3791 | },
|
3792 | left: {
|
3793 | },
|
3794 | right: {
|
3795 | },
|
3796 | top: {
|
3797 | },
|
3798 | bottom: {
|
3799 | },
|
3800 | "top-left": {
|
3801 | },
|
3802 | "top-right": {
|
3803 | },
|
3804 | "bottom-left": {
|
3805 | },
|
3806 | "bottom-right": {
|
3807 | }
|
3808 | },
|
3809 | "default": "center",
|
3810 | requires: [
|
3811 | "icon-image"
|
3812 | ],
|
3813 | expression: {
|
3814 | interpolated: false,
|
3815 | parameters: [
|
3816 | "zoom",
|
3817 | "feature"
|
3818 | ]
|
3819 | },
|
3820 | "property-type": "data-driven"
|
3821 | },
|
3822 | "icon-pitch-alignment": {
|
3823 | type: "enum",
|
3824 | values: {
|
3825 | map: {
|
3826 | },
|
3827 | viewport: {
|
3828 | },
|
3829 | auto: {
|
3830 | }
|
3831 | },
|
3832 | "default": "auto",
|
3833 | requires: [
|
3834 | "icon-image"
|
3835 | ],
|
3836 | expression: {
|
3837 | interpolated: false,
|
3838 | parameters: [
|
3839 | "zoom"
|
3840 | ]
|
3841 | },
|
3842 | "property-type": "data-constant"
|
3843 | },
|
3844 | "text-pitch-alignment": {
|
3845 | type: "enum",
|
3846 | values: {
|
3847 | map: {
|
3848 | },
|
3849 | viewport: {
|
3850 | },
|
3851 | auto: {
|
3852 | }
|
3853 | },
|
3854 | "default": "auto",
|
3855 | requires: [
|
3856 | "text-field"
|
3857 | ],
|
3858 | expression: {
|
3859 | interpolated: false,
|
3860 | parameters: [
|
3861 | "zoom"
|
3862 | ]
|
3863 | },
|
3864 | "property-type": "data-constant"
|
3865 | },
|
3866 | "text-rotation-alignment": {
|
3867 | type: "enum",
|
3868 | values: {
|
3869 | map: {
|
3870 | },
|
3871 | viewport: {
|
3872 | },
|
3873 | "viewport-glyph": {
|
3874 | },
|
3875 | auto: {
|
3876 | }
|
3877 | },
|
3878 | "default": "auto",
|
3879 | requires: [
|
3880 | "text-field"
|
3881 | ],
|
3882 | expression: {
|
3883 | interpolated: false,
|
3884 | parameters: [
|
3885 | "zoom"
|
3886 | ]
|
3887 | },
|
3888 | "property-type": "data-constant"
|
3889 | },
|
3890 | "text-field": {
|
3891 | type: "formatted",
|
3892 | "default": "",
|
3893 | tokens: true,
|
3894 | expression: {
|
3895 | interpolated: false,
|
3896 | parameters: [
|
3897 | "zoom",
|
3898 | "feature"
|
3899 | ]
|
3900 | },
|
3901 | "property-type": "data-driven"
|
3902 | },
|
3903 | "text-font": {
|
3904 | type: "array",
|
3905 | value: "string",
|
3906 | "default": [
|
3907 | "Open Sans Regular",
|
3908 | "Arial Unicode MS Regular"
|
3909 | ],
|
3910 | requires: [
|
3911 | "text-field"
|
3912 | ],
|
3913 | expression: {
|
3914 | interpolated: false,
|
3915 | parameters: [
|
3916 | "zoom",
|
3917 | "feature"
|
3918 | ]
|
3919 | },
|
3920 | "property-type": "data-driven"
|
3921 | },
|
3922 | "text-size": {
|
3923 | type: "number",
|
3924 | "default": 16,
|
3925 | minimum: 0,
|
3926 | units: "pixels",
|
3927 | requires: [
|
3928 | "text-field"
|
3929 | ],
|
3930 | expression: {
|
3931 | interpolated: true,
|
3932 | parameters: [
|
3933 | "zoom",
|
3934 | "feature"
|
3935 | ]
|
3936 | },
|
3937 | "property-type": "data-driven"
|
3938 | },
|
3939 | "text-max-width": {
|
3940 | type: "number",
|
3941 | "default": 10,
|
3942 | minimum: 0,
|
3943 | units: "ems",
|
3944 | requires: [
|
3945 | "text-field"
|
3946 | ],
|
3947 | expression: {
|
3948 | interpolated: true,
|
3949 | parameters: [
|
3950 | "zoom",
|
3951 | "feature"
|
3952 | ]
|
3953 | },
|
3954 | "property-type": "data-driven"
|
3955 | },
|
3956 | "text-line-height": {
|
3957 | type: "number",
|
3958 | "default": 1.2,
|
3959 | units: "ems",
|
3960 | requires: [
|
3961 | "text-field"
|
3962 | ],
|
3963 | expression: {
|
3964 | interpolated: true,
|
3965 | parameters: [
|
3966 | "zoom"
|
3967 | ]
|
3968 | },
|
3969 | "property-type": "data-constant"
|
3970 | },
|
3971 | "text-letter-spacing": {
|
3972 | type: "number",
|
3973 | "default": 0,
|
3974 | units: "ems",
|
3975 | requires: [
|
3976 | "text-field"
|
3977 | ],
|
3978 | expression: {
|
3979 | interpolated: true,
|
3980 | parameters: [
|
3981 | "zoom",
|
3982 | "feature"
|
3983 | ]
|
3984 | },
|
3985 | "property-type": "data-driven"
|
3986 | },
|
3987 | "text-justify": {
|
3988 | type: "enum",
|
3989 | values: {
|
3990 | auto: {
|
3991 | },
|
3992 | left: {
|
3993 | },
|
3994 | center: {
|
3995 | },
|
3996 | right: {
|
3997 | }
|
3998 | },
|
3999 | "default": "center",
|
4000 | requires: [
|
4001 | "text-field"
|
4002 | ],
|
4003 | expression: {
|
4004 | interpolated: false,
|
4005 | parameters: [
|
4006 | "zoom",
|
4007 | "feature"
|
4008 | ]
|
4009 | },
|
4010 | "property-type": "data-driven"
|
4011 | },
|
4012 | "text-radial-offset": {
|
4013 | type: "number",
|
4014 | units: "ems",
|
4015 | "default": 0,
|
4016 | requires: [
|
4017 | "text-field"
|
4018 | ],
|
4019 | "property-type": "data-driven",
|
4020 | expression: {
|
4021 | interpolated: true,
|
4022 | parameters: [
|
4023 | "zoom",
|
4024 | "feature"
|
4025 | ]
|
4026 | }
|
4027 | },
|
4028 | "text-variable-anchor": {
|
4029 | type: "array",
|
4030 | value: "enum",
|
4031 | values: {
|
4032 | center: {
|
4033 | },
|
4034 | left: {
|
4035 | },
|
4036 | right: {
|
4037 | },
|
4038 | top: {
|
4039 | },
|
4040 | bottom: {
|
4041 | },
|
4042 | "top-left": {
|
4043 | },
|
4044 | "top-right": {
|
4045 | },
|
4046 | "bottom-left": {
|
4047 | },
|
4048 | "bottom-right": {
|
4049 | }
|
4050 | },
|
4051 | requires: [
|
4052 | "text-field",
|
4053 | {
|
4054 | "symbol-placement": [
|
4055 | "point"
|
4056 | ]
|
4057 | }
|
4058 | ],
|
4059 | expression: {
|
4060 | interpolated: false,
|
4061 | parameters: [
|
4062 | "zoom"
|
4063 | ]
|
4064 | },
|
4065 | "property-type": "data-constant"
|
4066 | },
|
4067 | "text-anchor": {
|
4068 | type: "enum",
|
4069 | values: {
|
4070 | center: {
|
4071 | },
|
4072 | left: {
|
4073 | },
|
4074 | right: {
|
4075 | },
|
4076 | top: {
|
4077 | },
|
4078 | bottom: {
|
4079 | },
|
4080 | "top-left": {
|
4081 | },
|
4082 | "top-right": {
|
4083 | },
|
4084 | "bottom-left": {
|
4085 | },
|
4086 | "bottom-right": {
|
4087 | }
|
4088 | },
|
4089 | "default": "center",
|
4090 | requires: [
|
4091 | "text-field",
|
4092 | {
|
4093 | "!": "text-variable-anchor"
|
4094 | }
|
4095 | ],
|
4096 | expression: {
|
4097 | interpolated: false,
|
4098 | parameters: [
|
4099 | "zoom",
|
4100 | "feature"
|
4101 | ]
|
4102 | },
|
4103 | "property-type": "data-driven"
|
4104 | },
|
4105 | "text-max-angle": {
|
4106 | type: "number",
|
4107 | "default": 45,
|
4108 | units: "degrees",
|
4109 | requires: [
|
4110 | "text-field",
|
4111 | {
|
4112 | "symbol-placement": [
|
4113 | "line",
|
4114 | "line-center"
|
4115 | ]
|
4116 | }
|
4117 | ],
|
4118 | expression: {
|
4119 | interpolated: true,
|
4120 | parameters: [
|
4121 | "zoom"
|
4122 | ]
|
4123 | },
|
4124 | "property-type": "data-constant"
|
4125 | },
|
4126 | "text-writing-mode": {
|
4127 | type: "array",
|
4128 | value: "enum",
|
4129 | values: {
|
4130 | horizontal: {
|
4131 | },
|
4132 | vertical: {
|
4133 | }
|
4134 | },
|
4135 | requires: [
|
4136 | "text-field",
|
4137 | {
|
4138 | "symbol-placement": [
|
4139 | "point"
|
4140 | ]
|
4141 | }
|
4142 | ],
|
4143 | expression: {
|
4144 | interpolated: false,
|
4145 | parameters: [
|
4146 | "zoom"
|
4147 | ]
|
4148 | },
|
4149 | "property-type": "data-constant"
|
4150 | },
|
4151 | "text-rotate": {
|
4152 | type: "number",
|
4153 | "default": 0,
|
4154 | period: 360,
|
4155 | units: "degrees",
|
4156 | requires: [
|
4157 | "text-field"
|
4158 | ],
|
4159 | expression: {
|
4160 | interpolated: true,
|
4161 | parameters: [
|
4162 | "zoom",
|
4163 | "feature"
|
4164 | ]
|
4165 | },
|
4166 | "property-type": "data-driven"
|
4167 | },
|
4168 | "text-padding": {
|
4169 | type: "number",
|
4170 | "default": 2,
|
4171 | minimum: 0,
|
4172 | units: "pixels",
|
4173 | requires: [
|
4174 | "text-field"
|
4175 | ],
|
4176 | expression: {
|
4177 | interpolated: true,
|
4178 | parameters: [
|
4179 | "zoom"
|
4180 | ]
|
4181 | },
|
4182 | "property-type": "data-constant"
|
4183 | },
|
4184 | "text-keep-upright": {
|
4185 | type: "boolean",
|
4186 | "default": true,
|
4187 | requires: [
|
4188 | "text-field",
|
4189 | {
|
4190 | "text-rotation-alignment": "map"
|
4191 | },
|
4192 | {
|
4193 | "symbol-placement": [
|
4194 | "line",
|
4195 | "line-center"
|
4196 | ]
|
4197 | }
|
4198 | ],
|
4199 | expression: {
|
4200 | interpolated: false,
|
4201 | parameters: [
|
4202 | "zoom"
|
4203 | ]
|
4204 | },
|
4205 | "property-type": "data-constant"
|
4206 | },
|
4207 | "text-transform": {
|
4208 | type: "enum",
|
4209 | values: {
|
4210 | none: {
|
4211 | },
|
4212 | uppercase: {
|
4213 | },
|
4214 | lowercase: {
|
4215 | }
|
4216 | },
|
4217 | "default": "none",
|
4218 | requires: [
|
4219 | "text-field"
|
4220 | ],
|
4221 | expression: {
|
4222 | interpolated: false,
|
4223 | parameters: [
|
4224 | "zoom",
|
4225 | "feature"
|
4226 | ]
|
4227 | },
|
4228 | "property-type": "data-driven"
|
4229 | },
|
4230 | "text-offset": {
|
4231 | type: "array",
|
4232 | value: "number",
|
4233 | units: "ems",
|
4234 | length: 2,
|
4235 | "default": [
|
4236 | 0,
|
4237 | 0
|
4238 | ],
|
4239 | requires: [
|
4240 | "text-field",
|
4241 | {
|
4242 | "!": "text-radial-offset"
|
4243 | }
|
4244 | ],
|
4245 | expression: {
|
4246 | interpolated: true,
|
4247 | parameters: [
|
4248 | "zoom",
|
4249 | "feature"
|
4250 | ]
|
4251 | },
|
4252 | "property-type": "data-driven"
|
4253 | },
|
4254 | "text-allow-overlap": {
|
4255 | type: "boolean",
|
4256 | "default": false,
|
4257 | requires: [
|
4258 | "text-field",
|
4259 | {
|
4260 | "!": "text-overlap"
|
4261 | }
|
4262 | ],
|
4263 | expression: {
|
4264 | interpolated: false,
|
4265 | parameters: [
|
4266 | "zoom"
|
4267 | ]
|
4268 | },
|
4269 | "property-type": "data-constant"
|
4270 | },
|
4271 | "text-overlap": {
|
4272 | type: "enum",
|
4273 | values: {
|
4274 | never: {
|
4275 | },
|
4276 | always: {
|
4277 | },
|
4278 | cooperative: {
|
4279 | }
|
4280 | },
|
4281 | requires: [
|
4282 | "text-field"
|
4283 | ],
|
4284 | expression: {
|
4285 | interpolated: false,
|
4286 | parameters: [
|
4287 | "zoom"
|
4288 | ]
|
4289 | },
|
4290 | "property-type": "data-constant"
|
4291 | },
|
4292 | "text-ignore-placement": {
|
4293 | type: "boolean",
|
4294 | "default": false,
|
4295 | requires: [
|
4296 | "text-field"
|
4297 | ],
|
4298 | expression: {
|
4299 | interpolated: false,
|
4300 | parameters: [
|
4301 | "zoom"
|
4302 | ]
|
4303 | },
|
4304 | "property-type": "data-constant"
|
4305 | },
|
4306 | "text-optional": {
|
4307 | type: "boolean",
|
4308 | "default": false,
|
4309 | requires: [
|
4310 | "text-field",
|
4311 | "icon-image"
|
4312 | ],
|
4313 | expression: {
|
4314 | interpolated: false,
|
4315 | parameters: [
|
4316 | "zoom"
|
4317 | ]
|
4318 | },
|
4319 | "property-type": "data-constant"
|
4320 | },
|
4321 | visibility: {
|
4322 | type: "enum",
|
4323 | values: {
|
4324 | visible: {
|
4325 | },
|
4326 | none: {
|
4327 | }
|
4328 | },
|
4329 | "default": "visible",
|
4330 | "property-type": "constant"
|
4331 | }
|
4332 | };
|
4333 | var layout_raster = {
|
4334 | visibility: {
|
4335 | type: "enum",
|
4336 | values: {
|
4337 | visible: {
|
4338 | },
|
4339 | none: {
|
4340 | }
|
4341 | },
|
4342 | "default": "visible",
|
4343 | "property-type": "constant"
|
4344 | }
|
4345 | };
|
4346 | var layout_hillshade = {
|
4347 | visibility: {
|
4348 | type: "enum",
|
4349 | values: {
|
4350 | visible: {
|
4351 | },
|
4352 | none: {
|
4353 | }
|
4354 | },
|
4355 | "default": "visible",
|
4356 | "property-type": "constant"
|
4357 | }
|
4358 | };
|
4359 | var filter = {
|
4360 | type: "array",
|
4361 | value: "*"
|
4362 | };
|
4363 | var filter_operator = {
|
4364 | type: "enum",
|
4365 | values: {
|
4366 | "==": {
|
4367 | },
|
4368 | "!=": {
|
4369 | },
|
4370 | ">": {
|
4371 | },
|
4372 | ">=": {
|
4373 | },
|
4374 | "<": {
|
4375 | },
|
4376 | "<=": {
|
4377 | },
|
4378 | "in": {
|
4379 | },
|
4380 | "!in": {
|
4381 | },
|
4382 | all: {
|
4383 | },
|
4384 | any: {
|
4385 | },
|
4386 | none: {
|
4387 | },
|
4388 | has: {
|
4389 | },
|
4390 | "!has": {
|
4391 | },
|
4392 | within: {
|
4393 | }
|
4394 | }
|
4395 | };
|
4396 | var geometry_type = {
|
4397 | type: "enum",
|
4398 | values: {
|
4399 | Point: {
|
4400 | },
|
4401 | LineString: {
|
4402 | },
|
4403 | Polygon: {
|
4404 | }
|
4405 | }
|
4406 | };
|
4407 | var function_stop = {
|
4408 | type: "array",
|
4409 | minimum: 0,
|
4410 | maximum: 24,
|
4411 | value: [
|
4412 | "number",
|
4413 | "color"
|
4414 | ],
|
4415 | length: 2
|
4416 | };
|
4417 | var expression = {
|
4418 | type: "array",
|
4419 | value: "*",
|
4420 | minimum: 1
|
4421 | };
|
4422 | var light = {
|
4423 | anchor: {
|
4424 | type: "enum",
|
4425 | "default": "viewport",
|
4426 | values: {
|
4427 | map: {
|
4428 | },
|
4429 | viewport: {
|
4430 | }
|
4431 | },
|
4432 | "property-type": "data-constant",
|
4433 | transition: false,
|
4434 | expression: {
|
4435 | interpolated: false,
|
4436 | parameters: [
|
4437 | "zoom"
|
4438 | ]
|
4439 | }
|
4440 | },
|
4441 | position: {
|
4442 | type: "array",
|
4443 | "default": [
|
4444 | 1.15,
|
4445 | 210,
|
4446 | 30
|
4447 | ],
|
4448 | length: 3,
|
4449 | value: "number",
|
4450 | "property-type": "data-constant",
|
4451 | transition: true,
|
4452 | expression: {
|
4453 | interpolated: true,
|
4454 | parameters: [
|
4455 | "zoom"
|
4456 | ]
|
4457 | }
|
4458 | },
|
4459 | color: {
|
4460 | type: "color",
|
4461 | "property-type": "data-constant",
|
4462 | "default": "#ffffff",
|
4463 | expression: {
|
4464 | interpolated: true,
|
4465 | parameters: [
|
4466 | "zoom"
|
4467 | ]
|
4468 | },
|
4469 | transition: true
|
4470 | },
|
4471 | intensity: {
|
4472 | type: "number",
|
4473 | "property-type": "data-constant",
|
4474 | "default": 0.5,
|
4475 | minimum: 0,
|
4476 | maximum: 1,
|
4477 | expression: {
|
4478 | interpolated: true,
|
4479 | parameters: [
|
4480 | "zoom"
|
4481 | ]
|
4482 | },
|
4483 | transition: true
|
4484 | }
|
4485 | };
|
4486 | var paint$9 = [
|
4487 | "paint_fill",
|
4488 | "paint_line",
|
4489 | "paint_circle",
|
4490 | "paint_heatmap",
|
4491 | "paint_fill-extrusion",
|
4492 | "paint_symbol",
|
4493 | "paint_raster",
|
4494 | "paint_hillshade",
|
4495 | "paint_background"
|
4496 | ];
|
4497 | var paint_fill = {
|
4498 | "fill-antialias": {
|
4499 | type: "boolean",
|
4500 | "default": true,
|
4501 | expression: {
|
4502 | interpolated: false,
|
4503 | parameters: [
|
4504 | "zoom"
|
4505 | ]
|
4506 | },
|
4507 | "property-type": "data-constant"
|
4508 | },
|
4509 | "fill-opacity": {
|
4510 | type: "number",
|
4511 | "default": 1,
|
4512 | minimum: 0,
|
4513 | maximum: 1,
|
4514 | transition: true,
|
4515 | expression: {
|
4516 | interpolated: true,
|
4517 | parameters: [
|
4518 | "zoom",
|
4519 | "feature",
|
4520 | "feature-state"
|
4521 | ]
|
4522 | },
|
4523 | "property-type": "data-driven"
|
4524 | },
|
4525 | "fill-color": {
|
4526 | type: "color",
|
4527 | "default": "#000000",
|
4528 | transition: true,
|
4529 | requires: [
|
4530 | {
|
4531 | "!": "fill-pattern"
|
4532 | }
|
4533 | ],
|
4534 | expression: {
|
4535 | interpolated: true,
|
4536 | parameters: [
|
4537 | "zoom",
|
4538 | "feature",
|
4539 | "feature-state"
|
4540 | ]
|
4541 | },
|
4542 | "property-type": "data-driven"
|
4543 | },
|
4544 | "fill-outline-color": {
|
4545 | type: "color",
|
4546 | transition: true,
|
4547 | requires: [
|
4548 | {
|
4549 | "!": "fill-pattern"
|
4550 | },
|
4551 | {
|
4552 | "fill-antialias": true
|
4553 | }
|
4554 | ],
|
4555 | expression: {
|
4556 | interpolated: true,
|
4557 | parameters: [
|
4558 | "zoom",
|
4559 | "feature",
|
4560 | "feature-state"
|
4561 | ]
|
4562 | },
|
4563 | "property-type": "data-driven"
|
4564 | },
|
4565 | "fill-translate": {
|
4566 | type: "array",
|
4567 | value: "number",
|
4568 | length: 2,
|
4569 | "default": [
|
4570 | 0,
|
4571 | 0
|
4572 | ],
|
4573 | transition: true,
|
4574 | units: "pixels",
|
4575 | expression: {
|
4576 | interpolated: true,
|
4577 | parameters: [
|
4578 | "zoom"
|
4579 | ]
|
4580 | },
|
4581 | "property-type": "data-constant"
|
4582 | },
|
4583 | "fill-translate-anchor": {
|
4584 | type: "enum",
|
4585 | values: {
|
4586 | map: {
|
4587 | },
|
4588 | viewport: {
|
4589 | }
|
4590 | },
|
4591 | "default": "map",
|
4592 | requires: [
|
4593 | "fill-translate"
|
4594 | ],
|
4595 | expression: {
|
4596 | interpolated: false,
|
4597 | parameters: [
|
4598 | "zoom"
|
4599 | ]
|
4600 | },
|
4601 | "property-type": "data-constant"
|
4602 | },
|
4603 | "fill-pattern": {
|
4604 | type: "resolvedImage",
|
4605 | transition: true,
|
4606 | expression: {
|
4607 | interpolated: false,
|
4608 | parameters: [
|
4609 | "zoom",
|
4610 | "feature"
|
4611 | ]
|
4612 | },
|
4613 | "property-type": "cross-faded-data-driven"
|
4614 | }
|
4615 | };
|
4616 | var paint_line = {
|
4617 | "line-opacity": {
|
4618 | type: "number",
|
4619 | "default": 1,
|
4620 | minimum: 0,
|
4621 | maximum: 1,
|
4622 | transition: true,
|
4623 | expression: {
|
4624 | interpolated: true,
|
4625 | parameters: [
|
4626 | "zoom",
|
4627 | "feature",
|
4628 | "feature-state"
|
4629 | ]
|
4630 | },
|
4631 | "property-type": "data-driven"
|
4632 | },
|
4633 | "line-color": {
|
4634 | type: "color",
|
4635 | "default": "#000000",
|
4636 | transition: true,
|
4637 | requires: [
|
4638 | {
|
4639 | "!": "line-pattern"
|
4640 | }
|
4641 | ],
|
4642 | expression: {
|
4643 | interpolated: true,
|
4644 | parameters: [
|
4645 | "zoom",
|
4646 | "feature",
|
4647 | "feature-state"
|
4648 | ]
|
4649 | },
|
4650 | "property-type": "data-driven"
|
4651 | },
|
4652 | "line-translate": {
|
4653 | type: "array",
|
4654 | value: "number",
|
4655 | length: 2,
|
4656 | "default": [
|
4657 | 0,
|
4658 | 0
|
4659 | ],
|
4660 | transition: true,
|
4661 | units: "pixels",
|
4662 | expression: {
|
4663 | interpolated: true,
|
4664 | parameters: [
|
4665 | "zoom"
|
4666 | ]
|
4667 | },
|
4668 | "property-type": "data-constant"
|
4669 | },
|
4670 | "line-translate-anchor": {
|
4671 | type: "enum",
|
4672 | values: {
|
4673 | map: {
|
4674 | },
|
4675 | viewport: {
|
4676 | }
|
4677 | },
|
4678 | "default": "map",
|
4679 | requires: [
|
4680 | "line-translate"
|
4681 | ],
|
4682 | expression: {
|
4683 | interpolated: false,
|
4684 | parameters: [
|
4685 | "zoom"
|
4686 | ]
|
4687 | },
|
4688 | "property-type": "data-constant"
|
4689 | },
|
4690 | "line-width": {
|
4691 | type: "number",
|
4692 | "default": 1,
|
4693 | minimum: 0,
|
4694 | transition: true,
|
4695 | units: "pixels",
|
4696 | expression: {
|
4697 | interpolated: true,
|
4698 | parameters: [
|
4699 | "zoom",
|
4700 | "feature",
|
4701 | "feature-state"
|
4702 | ]
|
4703 | },
|
4704 | "property-type": "data-driven"
|
4705 | },
|
4706 | "line-gap-width": {
|
4707 | type: "number",
|
4708 | "default": 0,
|
4709 | minimum: 0,
|
4710 | transition: true,
|
4711 | units: "pixels",
|
4712 | expression: {
|
4713 | interpolated: true,
|
4714 | parameters: [
|
4715 | "zoom",
|
4716 | "feature",
|
4717 | "feature-state"
|
4718 | ]
|
4719 | },
|
4720 | "property-type": "data-driven"
|
4721 | },
|
4722 | "line-offset": {
|
4723 | type: "number",
|
4724 | "default": 0,
|
4725 | transition: true,
|
4726 | units: "pixels",
|
4727 | expression: {
|
4728 | interpolated: true,
|
4729 | parameters: [
|
4730 | "zoom",
|
4731 | "feature",
|
4732 | "feature-state"
|
4733 | ]
|
4734 | },
|
4735 | "property-type": "data-driven"
|
4736 | },
|
4737 | "line-blur": {
|
4738 | type: "number",
|
4739 | "default": 0,
|
4740 | minimum: 0,
|
4741 | transition: true,
|
4742 | units: "pixels",
|
4743 | expression: {
|
4744 | interpolated: true,
|
4745 | parameters: [
|
4746 | "zoom",
|
4747 | "feature",
|
4748 | "feature-state"
|
4749 | ]
|
4750 | },
|
4751 | "property-type": "data-driven"
|
4752 | },
|
4753 | "line-dasharray": {
|
4754 | type: "array",
|
4755 | value: "number",
|
4756 | minimum: 0,
|
4757 | transition: true,
|
4758 | units: "line widths",
|
4759 | requires: [
|
4760 | {
|
4761 | "!": "line-pattern"
|
4762 | }
|
4763 | ],
|
4764 | expression: {
|
4765 | interpolated: false,
|
4766 | parameters: [
|
4767 | "zoom"
|
4768 | ]
|
4769 | },
|
4770 | "property-type": "cross-faded"
|
4771 | },
|
4772 | "line-pattern": {
|
4773 | type: "resolvedImage",
|
4774 | transition: true,
|
4775 | expression: {
|
4776 | interpolated: false,
|
4777 | parameters: [
|
4778 | "zoom",
|
4779 | "feature"
|
4780 | ]
|
4781 | },
|
4782 | "property-type": "cross-faded-data-driven"
|
4783 | },
|
4784 | "line-gradient": {
|
4785 | type: "color",
|
4786 | transition: false,
|
4787 | requires: [
|
4788 | {
|
4789 | "!": "line-dasharray"
|
4790 | },
|
4791 | {
|
4792 | "!": "line-pattern"
|
4793 | },
|
4794 | {
|
4795 | source: "geojson",
|
4796 | has: {
|
4797 | lineMetrics: true
|
4798 | }
|
4799 | }
|
4800 | ],
|
4801 | expression: {
|
4802 | interpolated: true,
|
4803 | parameters: [
|
4804 | "line-progress"
|
4805 | ]
|
4806 | },
|
4807 | "property-type": "color-ramp"
|
4808 | }
|
4809 | };
|
4810 | var paint_circle = {
|
4811 | "circle-radius": {
|
4812 | type: "number",
|
4813 | "default": 5,
|
4814 | minimum: 0,
|
4815 | transition: true,
|
4816 | units: "pixels",
|
4817 | expression: {
|
4818 | interpolated: true,
|
4819 | parameters: [
|
4820 | "zoom",
|
4821 | "feature",
|
4822 | "feature-state"
|
4823 | ]
|
4824 | },
|
4825 | "property-type": "data-driven"
|
4826 | },
|
4827 | "circle-color": {
|
4828 | type: "color",
|
4829 | "default": "#000000",
|
4830 | transition: true,
|
4831 | expression: {
|
4832 | interpolated: true,
|
4833 | parameters: [
|
4834 | "zoom",
|
4835 | "feature",
|
4836 | "feature-state"
|
4837 | ]
|
4838 | },
|
4839 | "property-type": "data-driven"
|
4840 | },
|
4841 | "circle-blur": {
|
4842 | type: "number",
|
4843 | "default": 0,
|
4844 | transition: true,
|
4845 | expression: {
|
4846 | interpolated: true,
|
4847 | parameters: [
|
4848 | "zoom",
|
4849 | "feature",
|
4850 | "feature-state"
|
4851 | ]
|
4852 | },
|
4853 | "property-type": "data-driven"
|
4854 | },
|
4855 | "circle-opacity": {
|
4856 | type: "number",
|
4857 | "default": 1,
|
4858 | minimum: 0,
|
4859 | maximum: 1,
|
4860 | transition: true,
|
4861 | expression: {
|
4862 | interpolated: true,
|
4863 | parameters: [
|
4864 | "zoom",
|
4865 | "feature",
|
4866 | "feature-state"
|
4867 | ]
|
4868 | },
|
4869 | "property-type": "data-driven"
|
4870 | },
|
4871 | "circle-translate": {
|
4872 | type: "array",
|
4873 | value: "number",
|
4874 | length: 2,
|
4875 | "default": [
|
4876 | 0,
|
4877 | 0
|
4878 | ],
|
4879 | transition: true,
|
4880 | units: "pixels",
|
4881 | expression: {
|
4882 | interpolated: true,
|
4883 | parameters: [
|
4884 | "zoom"
|
4885 | ]
|
4886 | },
|
4887 | "property-type": "data-constant"
|
4888 | },
|
4889 | "circle-translate-anchor": {
|
4890 | type: "enum",
|
4891 | values: {
|
4892 | map: {
|
4893 | },
|
4894 | viewport: {
|
4895 | }
|
4896 | },
|
4897 | "default": "map",
|
4898 | requires: [
|
4899 | "circle-translate"
|
4900 | ],
|
4901 | expression: {
|
4902 | interpolated: false,
|
4903 | parameters: [
|
4904 | "zoom"
|
4905 | ]
|
4906 | },
|
4907 | "property-type": "data-constant"
|
4908 | },
|
4909 | "circle-pitch-scale": {
|
4910 | type: "enum",
|
4911 | values: {
|
4912 | map: {
|
4913 | },
|
4914 | viewport: {
|
4915 | }
|
4916 | },
|
4917 | "default": "map",
|
4918 | expression: {
|
4919 | interpolated: false,
|
4920 | parameters: [
|
4921 | "zoom"
|
4922 | ]
|
4923 | },
|
4924 | "property-type": "data-constant"
|
4925 | },
|
4926 | "circle-pitch-alignment": {
|
4927 | type: "enum",
|
4928 | values: {
|
4929 | map: {
|
4930 | },
|
4931 | viewport: {
|
4932 | }
|
4933 | },
|
4934 | "default": "viewport",
|
4935 | expression: {
|
4936 | interpolated: false,
|
4937 | parameters: [
|
4938 | "zoom"
|
4939 | ]
|
4940 | },
|
4941 | "property-type": "data-constant"
|
4942 | },
|
4943 | "circle-stroke-width": {
|
4944 | type: "number",
|
4945 | "default": 0,
|
4946 | minimum: 0,
|
4947 | transition: true,
|
4948 | units: "pixels",
|
4949 | expression: {
|
4950 | interpolated: true,
|
4951 | parameters: [
|
4952 | "zoom",
|
4953 | "feature",
|
4954 | "feature-state"
|
4955 | ]
|
4956 | },
|
4957 | "property-type": "data-driven"
|
4958 | },
|
4959 | "circle-stroke-color": {
|
4960 | type: "color",
|
4961 | "default": "#000000",
|
4962 | transition: true,
|
4963 | expression: {
|
4964 | interpolated: true,
|
4965 | parameters: [
|
4966 | "zoom",
|
4967 | "feature",
|
4968 | "feature-state"
|
4969 | ]
|
4970 | },
|
4971 | "property-type": "data-driven"
|
4972 | },
|
4973 | "circle-stroke-opacity": {
|
4974 | type: "number",
|
4975 | "default": 1,
|
4976 | minimum: 0,
|
4977 | maximum: 1,
|
4978 | transition: true,
|
4979 | expression: {
|
4980 | interpolated: true,
|
4981 | parameters: [
|
4982 | "zoom",
|
4983 | "feature",
|
4984 | "feature-state"
|
4985 | ]
|
4986 | },
|
4987 | "property-type": "data-driven"
|
4988 | }
|
4989 | };
|
4990 | var paint_heatmap = {
|
4991 | "heatmap-radius": {
|
4992 | type: "number",
|
4993 | "default": 30,
|
4994 | minimum: 1,
|
4995 | transition: true,
|
4996 | units: "pixels",
|
4997 | expression: {
|
4998 | interpolated: true,
|
4999 | parameters: [
|
5000 | "zoom",
|
5001 | "feature",
|
5002 | "feature-state"
|
5003 | ]
|
5004 | },
|
5005 | "property-type": "data-driven"
|
5006 | },
|
5007 | "heatmap-weight": {
|
5008 | type: "number",
|
5009 | "default": 1,
|
5010 | minimum: 0,
|
5011 | transition: false,
|
5012 | expression: {
|
5013 | interpolated: true,
|
5014 | parameters: [
|
5015 | "zoom",
|
5016 | "feature",
|
5017 | "feature-state"
|
5018 | ]
|
5019 | },
|
5020 | "property-type": "data-driven"
|
5021 | },
|
5022 | "heatmap-intensity": {
|
5023 | type: "number",
|
5024 | "default": 1,
|
5025 | minimum: 0,
|
5026 | transition: true,
|
5027 | expression: {
|
5028 | interpolated: true,
|
5029 | parameters: [
|
5030 | "zoom"
|
5031 | ]
|
5032 | },
|
5033 | "property-type": "data-constant"
|
5034 | },
|
5035 | "heatmap-color": {
|
5036 | type: "color",
|
5037 | "default": [
|
5038 | "interpolate",
|
5039 | [
|
5040 | "linear"
|
5041 | ],
|
5042 | [
|
5043 | "heatmap-density"
|
5044 | ],
|
5045 | 0,
|
5046 | "rgba(0, 0, 255, 0)",
|
5047 | 0.1,
|
5048 | "royalblue",
|
5049 | 0.3,
|
5050 | "cyan",
|
5051 | 0.5,
|
5052 | "lime",
|
5053 | 0.7,
|
5054 | "yellow",
|
5055 | 1,
|
5056 | "red"
|
5057 | ],
|
5058 | transition: false,
|
5059 | expression: {
|
5060 | interpolated: true,
|
5061 | parameters: [
|
5062 | "heatmap-density"
|
5063 | ]
|
5064 | },
|
5065 | "property-type": "color-ramp"
|
5066 | },
|
5067 | "heatmap-opacity": {
|
5068 | type: "number",
|
5069 | "default": 1,
|
5070 | minimum: 0,
|
5071 | maximum: 1,
|
5072 | transition: true,
|
5073 | expression: {
|
5074 | interpolated: true,
|
5075 | parameters: [
|
5076 | "zoom"
|
5077 | ]
|
5078 | },
|
5079 | "property-type": "data-constant"
|
5080 | }
|
5081 | };
|
5082 | var paint_symbol = {
|
5083 | "icon-opacity": {
|
5084 | type: "number",
|
5085 | "default": 1,
|
5086 | minimum: 0,
|
5087 | maximum: 1,
|
5088 | transition: true,
|
5089 | requires: [
|
5090 | "icon-image"
|
5091 | ],
|
5092 | expression: {
|
5093 | interpolated: true,
|
5094 | parameters: [
|
5095 | "zoom",
|
5096 | "feature",
|
5097 | "feature-state"
|
5098 | ]
|
5099 | },
|
5100 | "property-type": "data-driven"
|
5101 | },
|
5102 | "icon-color": {
|
5103 | type: "color",
|
5104 | "default": "#000000",
|
5105 | transition: true,
|
5106 | requires: [
|
5107 | "icon-image"
|
5108 | ],
|
5109 | expression: {
|
5110 | interpolated: true,
|
5111 | parameters: [
|
5112 | "zoom",
|
5113 | "feature",
|
5114 | "feature-state"
|
5115 | ]
|
5116 | },
|
5117 | "property-type": "data-driven"
|
5118 | },
|
5119 | "icon-halo-color": {
|
5120 | type: "color",
|
5121 | "default": "rgba(0, 0, 0, 0)",
|
5122 | transition: true,
|
5123 | requires: [
|
5124 | "icon-image"
|
5125 | ],
|
5126 | expression: {
|
5127 | interpolated: true,
|
5128 | parameters: [
|
5129 | "zoom",
|
5130 | "feature",
|
5131 | "feature-state"
|
5132 | ]
|
5133 | },
|
5134 | "property-type": "data-driven"
|
5135 | },
|
5136 | "icon-halo-width": {
|
5137 | type: "number",
|
5138 | "default": 0,
|
5139 | minimum: 0,
|
5140 | transition: true,
|
5141 | units: "pixels",
|
5142 | requires: [
|
5143 | "icon-image"
|
5144 | ],
|
5145 | expression: {
|
5146 | interpolated: true,
|
5147 | parameters: [
|
5148 | "zoom",
|
5149 | "feature",
|
5150 | "feature-state"
|
5151 | ]
|
5152 | },
|
5153 | "property-type": "data-driven"
|
5154 | },
|
5155 | "icon-halo-blur": {
|
5156 | type: "number",
|
5157 | "default": 0,
|
5158 | minimum: 0,
|
5159 | transition: true,
|
5160 | units: "pixels",
|
5161 | requires: [
|
5162 | "icon-image"
|
5163 | ],
|
5164 | expression: {
|
5165 | interpolated: true,
|
5166 | parameters: [
|
5167 | "zoom",
|
5168 | "feature",
|
5169 | "feature-state"
|
5170 | ]
|
5171 | },
|
5172 | "property-type": "data-driven"
|
5173 | },
|
5174 | "icon-translate": {
|
5175 | type: "array",
|
5176 | value: "number",
|
5177 | length: 2,
|
5178 | "default": [
|
5179 | 0,
|
5180 | 0
|
5181 | ],
|
5182 | transition: true,
|
5183 | units: "pixels",
|
5184 | requires: [
|
5185 | "icon-image"
|
5186 | ],
|
5187 | expression: {
|
5188 | interpolated: true,
|
5189 | parameters: [
|
5190 | "zoom"
|
5191 | ]
|
5192 | },
|
5193 | "property-type": "data-constant"
|
5194 | },
|
5195 | "icon-translate-anchor": {
|
5196 | type: "enum",
|
5197 | values: {
|
5198 | map: {
|
5199 | },
|
5200 | viewport: {
|
5201 | }
|
5202 | },
|
5203 | "default": "map",
|
5204 | requires: [
|
5205 | "icon-image",
|
5206 | "icon-translate"
|
5207 | ],
|
5208 | expression: {
|
5209 | interpolated: false,
|
5210 | parameters: [
|
5211 | "zoom"
|
5212 | ]
|
5213 | },
|
5214 | "property-type": "data-constant"
|
5215 | },
|
5216 | "text-opacity": {
|
5217 | type: "number",
|
5218 | "default": 1,
|
5219 | minimum: 0,
|
5220 | maximum: 1,
|
5221 | transition: true,
|
5222 | requires: [
|
5223 | "text-field"
|
5224 | ],
|
5225 | expression: {
|
5226 | interpolated: true,
|
5227 | parameters: [
|
5228 | "zoom",
|
5229 | "feature",
|
5230 | "feature-state"
|
5231 | ]
|
5232 | },
|
5233 | "property-type": "data-driven"
|
5234 | },
|
5235 | "text-color": {
|
5236 | type: "color",
|
5237 | "default": "#000000",
|
5238 | transition: true,
|
5239 | overridable: true,
|
5240 | requires: [
|
5241 | "text-field"
|
5242 | ],
|
5243 | expression: {
|
5244 | interpolated: true,
|
5245 | parameters: [
|
5246 | "zoom",
|
5247 | "feature",
|
5248 | "feature-state"
|
5249 | ]
|
5250 | },
|
5251 | "property-type": "data-driven"
|
5252 | },
|
5253 | "text-halo-color": {
|
5254 | type: "color",
|
5255 | "default": "rgba(0, 0, 0, 0)",
|
5256 | transition: true,
|
5257 | requires: [
|
5258 | "text-field"
|
5259 | ],
|
5260 | expression: {
|
5261 | interpolated: true,
|
5262 | parameters: [
|
5263 | "zoom",
|
5264 | "feature",
|
5265 | "feature-state"
|
5266 | ]
|
5267 | },
|
5268 | "property-type": "data-driven"
|
5269 | },
|
5270 | "text-halo-width": {
|
5271 | type: "number",
|
5272 | "default": 0,
|
5273 | minimum: 0,
|
5274 | transition: true,
|
5275 | units: "pixels",
|
5276 | requires: [
|
5277 | "text-field"
|
5278 | ],
|
5279 | expression: {
|
5280 | interpolated: true,
|
5281 | parameters: [
|
5282 | "zoom",
|
5283 | "feature",
|
5284 | "feature-state"
|
5285 | ]
|
5286 | },
|
5287 | "property-type": "data-driven"
|
5288 | },
|
5289 | "text-halo-blur": {
|
5290 | type: "number",
|
5291 | "default": 0,
|
5292 | minimum: 0,
|
5293 | transition: true,
|
5294 | units: "pixels",
|
5295 | requires: [
|
5296 | "text-field"
|
5297 | ],
|
5298 | expression: {
|
5299 | interpolated: true,
|
5300 | parameters: [
|
5301 | "zoom",
|
5302 | "feature",
|
5303 | "feature-state"
|
5304 | ]
|
5305 | },
|
5306 | "property-type": "data-driven"
|
5307 | },
|
5308 | "text-translate": {
|
5309 | type: "array",
|
5310 | value: "number",
|
5311 | length: 2,
|
5312 | "default": [
|
5313 | 0,
|
5314 | 0
|
5315 | ],
|
5316 | transition: true,
|
5317 | units: "pixels",
|
5318 | requires: [
|
5319 | "text-field"
|
5320 | ],
|
5321 | expression: {
|
5322 | interpolated: true,
|
5323 | parameters: [
|
5324 | "zoom"
|
5325 | ]
|
5326 | },
|
5327 | "property-type": "data-constant"
|
5328 | },
|
5329 | "text-translate-anchor": {
|
5330 | type: "enum",
|
5331 | values: {
|
5332 | map: {
|
5333 | },
|
5334 | viewport: {
|
5335 | }
|
5336 | },
|
5337 | "default": "map",
|
5338 | requires: [
|
5339 | "text-field",
|
5340 | "text-translate"
|
5341 | ],
|
5342 | expression: {
|
5343 | interpolated: false,
|
5344 | parameters: [
|
5345 | "zoom"
|
5346 | ]
|
5347 | },
|
5348 | "property-type": "data-constant"
|
5349 | }
|
5350 | };
|
5351 | var paint_raster = {
|
5352 | "raster-opacity": {
|
5353 | type: "number",
|
5354 | "default": 1,
|
5355 | minimum: 0,
|
5356 | maximum: 1,
|
5357 | transition: true,
|
5358 | expression: {
|
5359 | interpolated: true,
|
5360 | parameters: [
|
5361 | "zoom"
|
5362 | ]
|
5363 | },
|
5364 | "property-type": "data-constant"
|
5365 | },
|
5366 | "raster-hue-rotate": {
|
5367 | type: "number",
|
5368 | "default": 0,
|
5369 | period: 360,
|
5370 | transition: true,
|
5371 | units: "degrees",
|
5372 | expression: {
|
5373 | interpolated: true,
|
5374 | parameters: [
|
5375 | "zoom"
|
5376 | ]
|
5377 | },
|
5378 | "property-type": "data-constant"
|
5379 | },
|
5380 | "raster-brightness-min": {
|
5381 | type: "number",
|
5382 | "default": 0,
|
5383 | minimum: 0,
|
5384 | maximum: 1,
|
5385 | transition: true,
|
5386 | expression: {
|
5387 | interpolated: true,
|
5388 | parameters: [
|
5389 | "zoom"
|
5390 | ]
|
5391 | },
|
5392 | "property-type": "data-constant"
|
5393 | },
|
5394 | "raster-brightness-max": {
|
5395 | type: "number",
|
5396 | "default": 1,
|
5397 | minimum: 0,
|
5398 | maximum: 1,
|
5399 | transition: true,
|
5400 | expression: {
|
5401 | interpolated: true,
|
5402 | parameters: [
|
5403 | "zoom"
|
5404 | ]
|
5405 | },
|
5406 | "property-type": "data-constant"
|
5407 | },
|
5408 | "raster-saturation": {
|
5409 | type: "number",
|
5410 | "default": 0,
|
5411 | minimum: -1,
|
5412 | maximum: 1,
|
5413 | transition: true,
|
5414 | expression: {
|
5415 | interpolated: true,
|
5416 | parameters: [
|
5417 | "zoom"
|
5418 | ]
|
5419 | },
|
5420 | "property-type": "data-constant"
|
5421 | },
|
5422 | "raster-contrast": {
|
5423 | type: "number",
|
5424 | "default": 0,
|
5425 | minimum: -1,
|
5426 | maximum: 1,
|
5427 | transition: true,
|
5428 | expression: {
|
5429 | interpolated: true,
|
5430 | parameters: [
|
5431 | "zoom"
|
5432 | ]
|
5433 | },
|
5434 | "property-type": "data-constant"
|
5435 | },
|
5436 | "raster-resampling": {
|
5437 | type: "enum",
|
5438 | values: {
|
5439 | linear: {
|
5440 | },
|
5441 | nearest: {
|
5442 | }
|
5443 | },
|
5444 | "default": "linear",
|
5445 | expression: {
|
5446 | interpolated: false,
|
5447 | parameters: [
|
5448 | "zoom"
|
5449 | ]
|
5450 | },
|
5451 | "property-type": "data-constant"
|
5452 | },
|
5453 | "raster-fade-duration": {
|
5454 | type: "number",
|
5455 | "default": 300,
|
5456 | minimum: 0,
|
5457 | transition: false,
|
5458 | units: "milliseconds",
|
5459 | expression: {
|
5460 | interpolated: true,
|
5461 | parameters: [
|
5462 | "zoom"
|
5463 | ]
|
5464 | },
|
5465 | "property-type": "data-constant"
|
5466 | }
|
5467 | };
|
5468 | var paint_hillshade = {
|
5469 | "hillshade-illumination-direction": {
|
5470 | type: "number",
|
5471 | "default": 335,
|
5472 | minimum: 0,
|
5473 | maximum: 359,
|
5474 | transition: false,
|
5475 | expression: {
|
5476 | interpolated: true,
|
5477 | parameters: [
|
5478 | "zoom"
|
5479 | ]
|
5480 | },
|
5481 | "property-type": "data-constant"
|
5482 | },
|
5483 | "hillshade-illumination-anchor": {
|
5484 | type: "enum",
|
5485 | values: {
|
5486 | map: {
|
5487 | },
|
5488 | viewport: {
|
5489 | }
|
5490 | },
|
5491 | "default": "viewport",
|
5492 | expression: {
|
5493 | interpolated: false,
|
5494 | parameters: [
|
5495 | "zoom"
|
5496 | ]
|
5497 | },
|
5498 | "property-type": "data-constant"
|
5499 | },
|
5500 | "hillshade-exaggeration": {
|
5501 | type: "number",
|
5502 | "default": 0.5,
|
5503 | minimum: 0,
|
5504 | maximum: 1,
|
5505 | transition: true,
|
5506 | expression: {
|
5507 | interpolated: true,
|
5508 | parameters: [
|
5509 | "zoom"
|
5510 | ]
|
5511 | },
|
5512 | "property-type": "data-constant"
|
5513 | },
|
5514 | "hillshade-shadow-color": {
|
5515 | type: "color",
|
5516 | "default": "#000000",
|
5517 | transition: true,
|
5518 | expression: {
|
5519 | interpolated: true,
|
5520 | parameters: [
|
5521 | "zoom"
|
5522 | ]
|
5523 | },
|
5524 | "property-type": "data-constant"
|
5525 | },
|
5526 | "hillshade-highlight-color": {
|
5527 | type: "color",
|
5528 | "default": "#FFFFFF",
|
5529 | transition: true,
|
5530 | expression: {
|
5531 | interpolated: true,
|
5532 | parameters: [
|
5533 | "zoom"
|
5534 | ]
|
5535 | },
|
5536 | "property-type": "data-constant"
|
5537 | },
|
5538 | "hillshade-accent-color": {
|
5539 | type: "color",
|
5540 | "default": "#000000",
|
5541 | transition: true,
|
5542 | expression: {
|
5543 | interpolated: true,
|
5544 | parameters: [
|
5545 | "zoom"
|
5546 | ]
|
5547 | },
|
5548 | "property-type": "data-constant"
|
5549 | }
|
5550 | };
|
5551 | var paint_background = {
|
5552 | "background-color": {
|
5553 | type: "color",
|
5554 | "default": "#000000",
|
5555 | transition: true,
|
5556 | requires: [
|
5557 | {
|
5558 | "!": "background-pattern"
|
5559 | }
|
5560 | ],
|
5561 | expression: {
|
5562 | interpolated: true,
|
5563 | parameters: [
|
5564 | "zoom"
|
5565 | ]
|
5566 | },
|
5567 | "property-type": "data-constant"
|
5568 | },
|
5569 | "background-pattern": {
|
5570 | type: "resolvedImage",
|
5571 | transition: true,
|
5572 | expression: {
|
5573 | interpolated: false,
|
5574 | parameters: [
|
5575 | "zoom"
|
5576 | ]
|
5577 | },
|
5578 | "property-type": "cross-faded"
|
5579 | },
|
5580 | "background-opacity": {
|
5581 | type: "number",
|
5582 | "default": 1,
|
5583 | minimum: 0,
|
5584 | maximum: 1,
|
5585 | transition: true,
|
5586 | expression: {
|
5587 | interpolated: true,
|
5588 | parameters: [
|
5589 | "zoom"
|
5590 | ]
|
5591 | },
|
5592 | "property-type": "data-constant"
|
5593 | }
|
5594 | };
|
5595 | var transition = {
|
5596 | duration: {
|
5597 | type: "number",
|
5598 | "default": 300,
|
5599 | minimum: 0,
|
5600 | units: "milliseconds"
|
5601 | },
|
5602 | delay: {
|
5603 | type: "number",
|
5604 | "default": 0,
|
5605 | minimum: 0,
|
5606 | units: "milliseconds"
|
5607 | }
|
5608 | };
|
5609 | var promoteId = {
|
5610 | "*": {
|
5611 | type: "string"
|
5612 | }
|
5613 | };
|
5614 | var spec = {
|
5615 | $version: $version,
|
5616 | $root: $root,
|
5617 | sources: sources,
|
5618 | source: source,
|
5619 | source_vector: source_vector,
|
5620 | source_raster: source_raster,
|
5621 | source_raster_dem: source_raster_dem,
|
5622 | source_geojson: source_geojson,
|
5623 | source_video: source_video,
|
5624 | source_image: source_image,
|
5625 | layer: layer,
|
5626 | layout: layout$7,
|
5627 | layout_background: layout_background,
|
5628 | layout_fill: layout_fill,
|
5629 | layout_circle: layout_circle,
|
5630 | layout_heatmap: layout_heatmap,
|
5631 | "layout_fill-extrusion": {
|
5632 | visibility: {
|
5633 | type: "enum",
|
5634 | values: {
|
5635 | visible: {
|
5636 | },
|
5637 | none: {
|
5638 | }
|
5639 | },
|
5640 | "default": "visible",
|
5641 | "property-type": "constant"
|
5642 | }
|
5643 | },
|
5644 | layout_line: layout_line,
|
5645 | layout_symbol: layout_symbol,
|
5646 | layout_raster: layout_raster,
|
5647 | layout_hillshade: layout_hillshade,
|
5648 | filter: filter,
|
5649 | filter_operator: filter_operator,
|
5650 | geometry_type: geometry_type,
|
5651 | "function": {
|
5652 | expression: {
|
5653 | type: "expression"
|
5654 | },
|
5655 | stops: {
|
5656 | type: "array",
|
5657 | value: "function_stop"
|
5658 | },
|
5659 | base: {
|
5660 | type: "number",
|
5661 | "default": 1,
|
5662 | minimum: 0
|
5663 | },
|
5664 | property: {
|
5665 | type: "string",
|
5666 | "default": "$zoom"
|
5667 | },
|
5668 | type: {
|
5669 | type: "enum",
|
5670 | values: {
|
5671 | identity: {
|
5672 | },
|
5673 | exponential: {
|
5674 | },
|
5675 | interval: {
|
5676 | },
|
5677 | categorical: {
|
5678 | }
|
5679 | },
|
5680 | "default": "exponential"
|
5681 | },
|
5682 | colorSpace: {
|
5683 | type: "enum",
|
5684 | values: {
|
5685 | rgb: {
|
5686 | },
|
5687 | lab: {
|
5688 | },
|
5689 | hcl: {
|
5690 | }
|
5691 | },
|
5692 | "default": "rgb"
|
5693 | },
|
5694 | "default": {
|
5695 | type: "*",
|
5696 | required: false
|
5697 | }
|
5698 | },
|
5699 | function_stop: function_stop,
|
5700 | expression: expression,
|
5701 | light: light,
|
5702 | paint: paint$9,
|
5703 | paint_fill: paint_fill,
|
5704 | "paint_fill-extrusion": {
|
5705 | "fill-extrusion-opacity": {
|
5706 | type: "number",
|
5707 | "default": 1,
|
5708 | minimum: 0,
|
5709 | maximum: 1,
|
5710 | transition: true,
|
5711 | expression: {
|
5712 | interpolated: true,
|
5713 | parameters: [
|
5714 | "zoom"
|
5715 | ]
|
5716 | },
|
5717 | "property-type": "data-constant"
|
5718 | },
|
5719 | "fill-extrusion-color": {
|
5720 | type: "color",
|
5721 | "default": "#000000",
|
5722 | transition: true,
|
5723 | requires: [
|
5724 | {
|
5725 | "!": "fill-extrusion-pattern"
|
5726 | }
|
5727 | ],
|
5728 | expression: {
|
5729 | interpolated: true,
|
5730 | parameters: [
|
5731 | "zoom",
|
5732 | "feature",
|
5733 | "feature-state"
|
5734 | ]
|
5735 | },
|
5736 | "property-type": "data-driven"
|
5737 | },
|
5738 | "fill-extrusion-translate": {
|
5739 | type: "array",
|
5740 | value: "number",
|
5741 | length: 2,
|
5742 | "default": [
|
5743 | 0,
|
5744 | 0
|
5745 | ],
|
5746 | transition: true,
|
5747 | units: "pixels",
|
5748 | expression: {
|
5749 | interpolated: true,
|
5750 | parameters: [
|
5751 | "zoom"
|
5752 | ]
|
5753 | },
|
5754 | "property-type": "data-constant"
|
5755 | },
|
5756 | "fill-extrusion-translate-anchor": {
|
5757 | type: "enum",
|
5758 | values: {
|
5759 | map: {
|
5760 | },
|
5761 | viewport: {
|
5762 | }
|
5763 | },
|
5764 | "default": "map",
|
5765 | requires: [
|
5766 | "fill-extrusion-translate"
|
5767 | ],
|
5768 | expression: {
|
5769 | interpolated: false,
|
5770 | parameters: [
|
5771 | "zoom"
|
5772 | ]
|
5773 | },
|
5774 | "property-type": "data-constant"
|
5775 | },
|
5776 | "fill-extrusion-pattern": {
|
5777 | type: "resolvedImage",
|
5778 | transition: true,
|
5779 | expression: {
|
5780 | interpolated: false,
|
5781 | parameters: [
|
5782 | "zoom",
|
5783 | "feature"
|
5784 | ]
|
5785 | },
|
5786 | "property-type": "cross-faded-data-driven"
|
5787 | },
|
5788 | "fill-extrusion-height": {
|
5789 | type: "number",
|
5790 | "default": 0,
|
5791 | minimum: 0,
|
5792 | units: "meters",
|
5793 | transition: true,
|
5794 | expression: {
|
5795 | interpolated: true,
|
5796 | parameters: [
|
5797 | "zoom",
|
5798 | "feature",
|
5799 | "feature-state"
|
5800 | ]
|
5801 | },
|
5802 | "property-type": "data-driven"
|
5803 | },
|
5804 | "fill-extrusion-base": {
|
5805 | type: "number",
|
5806 | "default": 0,
|
5807 | minimum: 0,
|
5808 | units: "meters",
|
5809 | transition: true,
|
5810 | requires: [
|
5811 | "fill-extrusion-height"
|
5812 | ],
|
5813 | expression: {
|
5814 | interpolated: true,
|
5815 | parameters: [
|
5816 | "zoom",
|
5817 | "feature",
|
5818 | "feature-state"
|
5819 | ]
|
5820 | },
|
5821 | "property-type": "data-driven"
|
5822 | },
|
5823 | "fill-extrusion-vertical-gradient": {
|
5824 | type: "boolean",
|
5825 | "default": true,
|
5826 | transition: false,
|
5827 | expression: {
|
5828 | interpolated: false,
|
5829 | parameters: [
|
5830 | "zoom"
|
5831 | ]
|
5832 | },
|
5833 | "property-type": "data-constant"
|
5834 | }
|
5835 | },
|
5836 | paint_line: paint_line,
|
5837 | paint_circle: paint_circle,
|
5838 | paint_heatmap: paint_heatmap,
|
5839 | paint_symbol: paint_symbol,
|
5840 | paint_raster: paint_raster,
|
5841 | paint_hillshade: paint_hillshade,
|
5842 | paint_background: paint_background,
|
5843 | transition: transition,
|
5844 | "property-type": {
|
5845 | "data-driven": {
|
5846 | type: "property-type"
|
5847 | },
|
5848 | "cross-faded": {
|
5849 | type: "property-type"
|
5850 | },
|
5851 | "cross-faded-data-driven": {
|
5852 | type: "property-type"
|
5853 | },
|
5854 | "color-ramp": {
|
5855 | type: "property-type"
|
5856 | },
|
5857 | "data-constant": {
|
5858 | type: "property-type"
|
5859 | },
|
5860 | constant: {
|
5861 | type: "property-type"
|
5862 | }
|
5863 | },
|
5864 | promoteId: promoteId
|
5865 | };
|
5866 |
|
5867 | // Note: Do not inherit from Error. It breaks when transpiling to ES5.
|
5868 | class ValidationError {
|
5869 | constructor(key, value, message, identifier) {
|
5870 | this.message = (key ? `${key}: ` : '') + message;
|
5871 | if (identifier)
|
5872 | this.identifier = identifier;
|
5873 | if (value !== null && value !== undefined && value.__line__) {
|
5874 | this.line = value.__line__;
|
5875 | }
|
5876 | }
|
5877 | }
|
5878 |
|
5879 | function validateConstants(options) {
|
5880 | const key = options.key;
|
5881 | const constants = options.value;
|
5882 | if (constants) {
|
5883 | return [new ValidationError(key, constants, 'constants have been deprecated as of v8')];
|
5884 | }
|
5885 | else {
|
5886 | return [];
|
5887 | }
|
5888 | }
|
5889 |
|
5890 | function extend (output, ...inputs) {
|
5891 | for (const input of inputs) {
|
5892 | for (const k in input) {
|
5893 | output[k] = input[k];
|
5894 | }
|
5895 | }
|
5896 | return output;
|
5897 | }
|
5898 |
|
5899 | // Turn jsonlint-lines-primitives objects into primitive objects
|
5900 | function unbundle(value) {
|
5901 | if (value instanceof Number || value instanceof String || value instanceof Boolean) {
|
5902 | return value.valueOf();
|
5903 | }
|
5904 | else {
|
5905 | return value;
|
5906 | }
|
5907 | }
|
5908 | function deepUnbundle(value) {
|
5909 | if (Array.isArray(value)) {
|
5910 | return value.map(deepUnbundle);
|
5911 | }
|
5912 | else if (value instanceof Object && !(value instanceof Number || value instanceof String || value instanceof Boolean)) {
|
5913 | const unbundledValue = {};
|
5914 | for (const key in value) {
|
5915 | unbundledValue[key] = deepUnbundle(value[key]);
|
5916 | }
|
5917 | return unbundledValue;
|
5918 | }
|
5919 | return unbundle(value);
|
5920 | }
|
5921 |
|
5922 | class ParsingError extends Error {
|
5923 | constructor(key, message) {
|
5924 | super(message);
|
5925 | this.message = message;
|
5926 | this.key = key;
|
5927 | }
|
5928 | }
|
5929 |
|
5930 | /**
|
5931 | * Tracks `let` bindings during expression parsing.
|
5932 | * @private
|
5933 | */
|
5934 | class Scope {
|
5935 | constructor(parent, bindings = []) {
|
5936 | this.parent = parent;
|
5937 | this.bindings = {};
|
5938 | for (const [name, expression] of bindings) {
|
5939 | this.bindings[name] = expression;
|
5940 | }
|
5941 | }
|
5942 | concat(bindings) {
|
5943 | return new Scope(this, bindings);
|
5944 | }
|
5945 | get(name) {
|
5946 | if (this.bindings[name]) {
|
5947 | return this.bindings[name];
|
5948 | }
|
5949 | if (this.parent) {
|
5950 | return this.parent.get(name);
|
5951 | }
|
5952 | throw new Error(`${name} not found in scope.`);
|
5953 | }
|
5954 | has(name) {
|
5955 | if (this.bindings[name])
|
5956 | return true;
|
5957 | return this.parent ? this.parent.has(name) : false;
|
5958 | }
|
5959 | }
|
5960 |
|
5961 | const NullType = { kind: 'null' };
|
5962 | const NumberType = { kind: 'number' };
|
5963 | const StringType = { kind: 'string' };
|
5964 | const BooleanType = { kind: 'boolean' };
|
5965 | const ColorType = { kind: 'color' };
|
5966 | const ObjectType = { kind: 'object' };
|
5967 | const ValueType = { kind: 'value' };
|
5968 | const ErrorType = { kind: 'error' };
|
5969 | const CollatorType = { kind: 'collator' };
|
5970 | const FormattedType = { kind: 'formatted' };
|
5971 | const ResolvedImageType = { kind: 'resolvedImage' };
|
5972 | function array$1(itemType, N) {
|
5973 | return {
|
5974 | kind: 'array',
|
5975 | itemType,
|
5976 | N
|
5977 | };
|
5978 | }
|
5979 | function toString$1(type) {
|
5980 | if (type.kind === 'array') {
|
5981 | const itemType = toString$1(type.itemType);
|
5982 | return typeof type.N === 'number' ?
|
5983 | `array<${itemType}, ${type.N}>` :
|
5984 | type.itemType.kind === 'value' ? 'array' : `array<${itemType}>`;
|
5985 | }
|
5986 | else {
|
5987 | return type.kind;
|
5988 | }
|
5989 | }
|
5990 | const valueMemberTypes = [
|
5991 | NullType,
|
5992 | NumberType,
|
5993 | StringType,
|
5994 | BooleanType,
|
5995 | ColorType,
|
5996 | FormattedType,
|
5997 | ObjectType,
|
5998 | array$1(ValueType),
|
5999 | ResolvedImageType
|
6000 | ];
|
6001 | /**
|
6002 | * Returns null if `t` is a subtype of `expected`; otherwise returns an
|
6003 | * error message.
|
6004 | * @private
|
6005 | */
|
6006 | function checkSubtype(expected, t) {
|
6007 | if (t.kind === 'error') {
|
6008 | // Error is a subtype of every type
|
6009 | return null;
|
6010 | }
|
6011 | else if (expected.kind === 'array') {
|
6012 | if (t.kind === 'array' &&
|
6013 | ((t.N === 0 && t.itemType.kind === 'value') || !checkSubtype(expected.itemType, t.itemType)) &&
|
6014 | (typeof expected.N !== 'number' || expected.N === t.N)) {
|
6015 | return null;
|
6016 | }
|
6017 | }
|
6018 | else if (expected.kind === t.kind) {
|
6019 | return null;
|
6020 | }
|
6021 | else if (expected.kind === 'value') {
|
6022 | for (const memberType of valueMemberTypes) {
|
6023 | if (!checkSubtype(memberType, t)) {
|
6024 | return null;
|
6025 | }
|
6026 | }
|
6027 | }
|
6028 | return `Expected ${toString$1(expected)} but found ${toString$1(t)} instead.`;
|
6029 | }
|
6030 | function isValidType(provided, allowedTypes) {
|
6031 | return allowedTypes.some(t => t.kind === provided.kind);
|
6032 | }
|
6033 | function isValidNativeType(provided, allowedTypes) {
|
6034 | return allowedTypes.some(t => {
|
6035 | if (t === 'null') {
|
6036 | return provided === null;
|
6037 | }
|
6038 | else if (t === 'array') {
|
6039 | return Array.isArray(provided);
|
6040 | }
|
6041 | else if (t === 'object') {
|
6042 | return provided && !Array.isArray(provided) && typeof provided === 'object';
|
6043 | }
|
6044 | else {
|
6045 | return t === typeof provided;
|
6046 | }
|
6047 | });
|
6048 | }
|
6049 |
|
6050 | var csscolorparser = {};
|
6051 |
|
6052 | var parseCSSColor_1;
|
6053 | // (c) Dean McNamee <dean@gmail.com>, 2012.
|
6054 | //
|
6055 | // https://github.com/deanm/css-color-parser-js
|
6056 | //
|
6057 | // Permission is hereby granted, free of charge, to any person obtaining a copy
|
6058 | // of this software and associated documentation files (the "Software"), to
|
6059 | // deal in the Software without restriction, including without limitation the
|
6060 | // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
6061 | // sell copies of the Software, and to permit persons to whom the Software is
|
6062 | // furnished to do so, subject to the following conditions:
|
6063 | //
|
6064 | // The above copyright notice and this permission notice shall be included in
|
6065 | // all copies or substantial portions of the Software.
|
6066 | //
|
6067 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
6068 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
6069 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
6070 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
6071 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
6072 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
6073 | // IN THE SOFTWARE.
|
6074 |
|
6075 | // http://www.w3.org/TR/css3-color/
|
6076 | var kCSSColorTable = {
|
6077 | "transparent": [0,0,0,0], "aliceblue": [240,248,255,1],
|
6078 | "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1],
|
6079 | "aquamarine": [127,255,212,1], "azure": [240,255,255,1],
|
6080 | "beige": [245,245,220,1], "bisque": [255,228,196,1],
|
6081 | "black": [0,0,0,1], "blanchedalmond": [255,235,205,1],
|
6082 | "blue": [0,0,255,1], "blueviolet": [138,43,226,1],
|
6083 | "brown": [165,42,42,1], "burlywood": [222,184,135,1],
|
6084 | "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1],
|
6085 | "chocolate": [210,105,30,1], "coral": [255,127,80,1],
|
6086 | "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1],
|
6087 | "crimson": [220,20,60,1], "cyan": [0,255,255,1],
|
6088 | "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1],
|
6089 | "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1],
|
6090 | "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1],
|
6091 | "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1],
|
6092 | "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1],
|
6093 | "darkorchid": [153,50,204,1], "darkred": [139,0,0,1],
|
6094 | "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1],
|
6095 | "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1],
|
6096 | "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1],
|
6097 | "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1],
|
6098 | "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1],
|
6099 | "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1],
|
6100 | "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1],
|
6101 | "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1],
|
6102 | "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1],
|
6103 | "gold": [255,215,0,1], "goldenrod": [218,165,32,1],
|
6104 | "gray": [128,128,128,1], "green": [0,128,0,1],
|
6105 | "greenyellow": [173,255,47,1], "grey": [128,128,128,1],
|
6106 | "honeydew": [240,255,240,1], "hotpink": [255,105,180,1],
|
6107 | "indianred": [205,92,92,1], "indigo": [75,0,130,1],
|
6108 | "ivory": [255,255,240,1], "khaki": [240,230,140,1],
|
6109 | "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1],
|
6110 | "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1],
|
6111 | "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1],
|
6112 | "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1],
|
6113 | "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1],
|
6114 | "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1],
|
6115 | "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1],
|
6116 | "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1],
|
6117 | "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1],
|
6118 | "lightyellow": [255,255,224,1], "lime": [0,255,0,1],
|
6119 | "limegreen": [50,205,50,1], "linen": [250,240,230,1],
|
6120 | "magenta": [255,0,255,1], "maroon": [128,0,0,1],
|
6121 | "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1],
|
6122 | "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1],
|
6123 | "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1],
|
6124 | "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1],
|
6125 | "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1],
|
6126 | "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1],
|
6127 | "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1],
|
6128 | "navy": [0,0,128,1], "oldlace": [253,245,230,1],
|
6129 | "olive": [128,128,0,1], "olivedrab": [107,142,35,1],
|
6130 | "orange": [255,165,0,1], "orangered": [255,69,0,1],
|
6131 | "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1],
|
6132 | "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1],
|
6133 | "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1],
|
6134 | "peachpuff": [255,218,185,1], "peru": [205,133,63,1],
|
6135 | "pink": [255,192,203,1], "plum": [221,160,221,1],
|
6136 | "powderblue": [176,224,230,1], "purple": [128,0,128,1],
|
6137 | "rebeccapurple": [102,51,153,1],
|
6138 | "red": [255,0,0,1], "rosybrown": [188,143,143,1],
|
6139 | "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1],
|
6140 | "salmon": [250,128,114,1], "sandybrown": [244,164,96,1],
|
6141 | "seagreen": [46,139,87,1], "seashell": [255,245,238,1],
|
6142 | "sienna": [160,82,45,1], "silver": [192,192,192,1],
|
6143 | "skyblue": [135,206,235,1], "slateblue": [106,90,205,1],
|
6144 | "slategray": [112,128,144,1], "slategrey": [112,128,144,1],
|
6145 | "snow": [255,250,250,1], "springgreen": [0,255,127,1],
|
6146 | "steelblue": [70,130,180,1], "tan": [210,180,140,1],
|
6147 | "teal": [0,128,128,1], "thistle": [216,191,216,1],
|
6148 | "tomato": [255,99,71,1], "turquoise": [64,224,208,1],
|
6149 | "violet": [238,130,238,1], "wheat": [245,222,179,1],
|
6150 | "white": [255,255,255,1], "whitesmoke": [245,245,245,1],
|
6151 | "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]};
|
6152 |
|
6153 | function clamp_css_byte(i) { // Clamp to integer 0 .. 255.
|
6154 | i = Math.round(i); // Seems to be what Chrome does (vs truncation).
|
6155 | return i < 0 ? 0 : i > 255 ? 255 : i;
|
6156 | }
|
6157 |
|
6158 | function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.
|
6159 | return f < 0 ? 0 : f > 1 ? 1 : f;
|
6160 | }
|
6161 |
|
6162 | function parse_css_int(str) { // int or percentage.
|
6163 | if (str[str.length - 1] === '%')
|
6164 | return clamp_css_byte(parseFloat(str) / 100 * 255);
|
6165 | return clamp_css_byte(parseInt(str));
|
6166 | }
|
6167 |
|
6168 | function parse_css_float(str) { // float or percentage.
|
6169 | if (str[str.length - 1] === '%')
|
6170 | return clamp_css_float(parseFloat(str) / 100);
|
6171 | return clamp_css_float(parseFloat(str));
|
6172 | }
|
6173 |
|
6174 | function css_hue_to_rgb(m1, m2, h) {
|
6175 | if (h < 0) h += 1;
|
6176 | else if (h > 1) h -= 1;
|
6177 |
|
6178 | if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
|
6179 | if (h * 2 < 1) return m2;
|
6180 | if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;
|
6181 | return m1;
|
6182 | }
|
6183 |
|
6184 | function parseCSSColor(css_str) {
|
6185 | // Remove all whitespace, not compliant, but should just be more accepting.
|
6186 | var str = css_str.replace(/ /g, '').toLowerCase();
|
6187 |
|
6188 | // Color keywords (and transparent) lookup.
|
6189 | if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.
|
6190 |
|
6191 | // #abc and #abc123 syntax.
|
6192 | if (str[0] === '#') {
|
6193 | if (str.length === 4) {
|
6194 | var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.
|
6195 | if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.
|
6196 | return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),
|
6197 | (iv & 0xf0) | ((iv & 0xf0) >> 4),
|
6198 | (iv & 0xf) | ((iv & 0xf) << 4),
|
6199 | 1];
|
6200 | } else if (str.length === 7) {
|
6201 | var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.
|
6202 | if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.
|
6203 | return [(iv & 0xff0000) >> 16,
|
6204 | (iv & 0xff00) >> 8,
|
6205 | iv & 0xff,
|
6206 | 1];
|
6207 | }
|
6208 |
|
6209 | return null;
|
6210 | }
|
6211 |
|
6212 | var op = str.indexOf('('), ep = str.indexOf(')');
|
6213 | if (op !== -1 && ep + 1 === str.length) {
|
6214 | var fname = str.substr(0, op);
|
6215 | var params = str.substr(op+1, ep-(op+1)).split(',');
|
6216 | var alpha = 1; // To allow case fallthrough.
|
6217 | switch (fname) {
|
6218 | case 'rgba':
|
6219 | if (params.length !== 4) return null;
|
6220 | alpha = parse_css_float(params.pop());
|
6221 | // Fall through.
|
6222 | case 'rgb':
|
6223 | if (params.length !== 3) return null;
|
6224 | return [parse_css_int(params[0]),
|
6225 | parse_css_int(params[1]),
|
6226 | parse_css_int(params[2]),
|
6227 | alpha];
|
6228 | case 'hsla':
|
6229 | if (params.length !== 4) return null;
|
6230 | alpha = parse_css_float(params.pop());
|
6231 | // Fall through.
|
6232 | case 'hsl':
|
6233 | if (params.length !== 3) return null;
|
6234 | var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1
|
6235 | // NOTE(deanm): According to the CSS spec s/l should only be
|
6236 | // percentages, but we don't bother and let float or percentage.
|
6237 | var s = parse_css_float(params[1]);
|
6238 | var l = parse_css_float(params[2]);
|
6239 | var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
|
6240 | var m1 = l * 2 - m2;
|
6241 | return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),
|
6242 | clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),
|
6243 | clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),
|
6244 | alpha];
|
6245 | default:
|
6246 | return null;
|
6247 | }
|
6248 | }
|
6249 |
|
6250 | return null;
|
6251 | }
|
6252 |
|
6253 | try { parseCSSColor_1 = csscolorparser.parseCSSColor = parseCSSColor; } catch(e) { }
|
6254 |
|
6255 | /**
|
6256 | * An RGBA color value. Create instances from color strings using the static
|
6257 | * method `Color.parse`. The constructor accepts RGB channel values in the range
|
6258 | * `[0, 1]`, premultiplied by A.
|
6259 | *
|
6260 | * @param {number} r The red channel.
|
6261 | * @param {number} g The green channel.
|
6262 | * @param {number} b The blue channel.
|
6263 | * @param {number} a The alpha channel.
|
6264 | * @private
|
6265 | */
|
6266 | class Color {
|
6267 | constructor(r, g, b, a = 1) {
|
6268 | this.r = r;
|
6269 | this.g = g;
|
6270 | this.b = b;
|
6271 | this.a = a;
|
6272 | }
|
6273 | /**
|
6274 | * Parses valid CSS color strings and returns a `Color` instance.
|
6275 | * @returns A `Color` instance, or `undefined` if the input is not a valid color string.
|
6276 | */
|
6277 | static parse(input) {
|
6278 | if (!input) {
|
6279 | return undefined;
|
6280 | }
|
6281 | if (input instanceof Color) {
|
6282 | return input;
|
6283 | }
|
6284 | if (typeof input !== 'string') {
|
6285 | return undefined;
|
6286 | }
|
6287 | const rgba = parseCSSColor_1(input);
|
6288 | if (!rgba) {
|
6289 | return undefined;
|
6290 | }
|
6291 | return new Color(rgba[0] / 255 * rgba[3], rgba[1] / 255 * rgba[3], rgba[2] / 255 * rgba[3], rgba[3]);
|
6292 | }
|
6293 | /**
|
6294 | * Returns an RGBA string representing the color value.
|
6295 | *
|
6296 | * @returns An RGBA string.
|
6297 | * @example
|
6298 | * var purple = new Color.parse('purple');
|
6299 | * purple.toString; // = "rgba(128,0,128,1)"
|
6300 | * var translucentGreen = new Color.parse('rgba(26, 207, 26, .73)');
|
6301 | * translucentGreen.toString(); // = "rgba(26,207,26,0.73)"
|
6302 | */
|
6303 | toString() {
|
6304 | const [r, g, b, a] = this.toArray();
|
6305 | return `rgba(${Math.round(r)},${Math.round(g)},${Math.round(b)},${a})`;
|
6306 | }
|
6307 | toArray() {
|
6308 | const { r, g, b, a } = this;
|
6309 | return a === 0 ? [0, 0, 0, 0] : [
|
6310 | r * 255 / a,
|
6311 | g * 255 / a,
|
6312 | b * 255 / a,
|
6313 | a
|
6314 | ];
|
6315 | }
|
6316 | }
|
6317 | Color.black = new Color(0, 0, 0, 1);
|
6318 | Color.white = new Color(1, 1, 1, 1);
|
6319 | Color.transparent = new Color(0, 0, 0, 0);
|
6320 | Color.red = new Color(1, 0, 0, 1);
|
6321 |
|
6322 | // Flow type declarations for Intl cribbed from
|
6323 | // https://github.com/facebook/flow/issues/1270
|
6324 | class Collator {
|
6325 | constructor(caseSensitive, diacriticSensitive, locale) {
|
6326 | if (caseSensitive)
|
6327 | this.sensitivity = diacriticSensitive ? 'variant' : 'case';
|
6328 | else
|
6329 | this.sensitivity = diacriticSensitive ? 'accent' : 'base';
|
6330 | this.locale = locale;
|
6331 | this.collator = new Intl.Collator(this.locale ? this.locale : [], { sensitivity: this.sensitivity, usage: 'search' });
|
6332 | }
|
6333 | compare(lhs, rhs) {
|
6334 | return this.collator.compare(lhs, rhs);
|
6335 | }
|
6336 | resolvedLocale() {
|
6337 | // We create a Collator without "usage: search" because we don't want
|
6338 | // the search options encoded in our result (e.g. "en-u-co-search")
|
6339 | return new Intl.Collator(this.locale ? this.locale : [])
|
6340 | .resolvedOptions().locale;
|
6341 | }
|
6342 | }
|
6343 |
|
6344 | class FormattedSection {
|
6345 | constructor(text, image, scale, fontStack, textColor) {
|
6346 | this.text = text;
|
6347 | this.image = image;
|
6348 | this.scale = scale;
|
6349 | this.fontStack = fontStack;
|
6350 | this.textColor = textColor;
|
6351 | }
|
6352 | }
|
6353 | class Formatted {
|
6354 | constructor(sections) {
|
6355 | this.sections = sections;
|
6356 | }
|
6357 | static fromString(unformatted) {
|
6358 | return new Formatted([new FormattedSection(unformatted, null, null, null, null)]);
|
6359 | }
|
6360 | isEmpty() {
|
6361 | if (this.sections.length === 0)
|
6362 | return true;
|
6363 | return !this.sections.some(section => section.text.length !== 0 ||
|
6364 | (section.image && section.image.name.length !== 0));
|
6365 | }
|
6366 | static factory(text) {
|
6367 | if (text instanceof Formatted) {
|
6368 | return text;
|
6369 | }
|
6370 | else {
|
6371 | return Formatted.fromString(text);
|
6372 | }
|
6373 | }
|
6374 | toString() {
|
6375 | if (this.sections.length === 0)
|
6376 | return '';
|
6377 | return this.sections.map(section => section.text).join('');
|
6378 | }
|
6379 | serialize() {
|
6380 | const serialized = ['format'];
|
6381 | for (const section of this.sections) {
|
6382 | if (section.image) {
|
6383 | serialized.push(['image', section.image.name]);
|
6384 | continue;
|
6385 | }
|
6386 | serialized.push(section.text);
|
6387 | const options = {};
|
6388 | if (section.fontStack) {
|
6389 | options['text-font'] = ['literal', section.fontStack.split(',')];
|
6390 | }
|
6391 | if (section.scale) {
|
6392 | options['font-scale'] = section.scale;
|
6393 | }
|
6394 | if (section.textColor) {
|
6395 | options['text-color'] = ['rgba'].concat(section.textColor.toArray());
|
6396 | }
|
6397 | serialized.push(options);
|
6398 | }
|
6399 | return serialized;
|
6400 | }
|
6401 | }
|
6402 |
|
6403 | class ResolvedImage {
|
6404 | constructor(options) {
|
6405 | this.name = options.name;
|
6406 | this.available = options.available;
|
6407 | }
|
6408 | toString() {
|
6409 | return this.name;
|
6410 | }
|
6411 | static fromString(name) {
|
6412 | if (!name)
|
6413 | return null; // treat empty values as no image
|
6414 | return new ResolvedImage({ name, available: false });
|
6415 | }
|
6416 | serialize() {
|
6417 | return ['image', this.name];
|
6418 | }
|
6419 | }
|
6420 |
|
6421 | function validateRGBA(r, g, b, a) {
|
6422 | if (!(typeof r === 'number' && r >= 0 && r <= 255 &&
|
6423 | typeof g === 'number' && g >= 0 && g <= 255 &&
|
6424 | typeof b === 'number' && b >= 0 && b <= 255)) {
|
6425 | const value = typeof a === 'number' ? [r, g, b, a] : [r, g, b];
|
6426 | return `Invalid rgba value [${value.join(', ')}]: 'r', 'g', and 'b' must be between 0 and 255.`;
|
6427 | }
|
6428 | if (!(typeof a === 'undefined' || (typeof a === 'number' && a >= 0 && a <= 1))) {
|
6429 | return `Invalid rgba value [${[r, g, b, a].join(', ')}]: 'a' must be between 0 and 1.`;
|
6430 | }
|
6431 | return null;
|
6432 | }
|
6433 | function isValue(mixed) {
|
6434 | if (mixed === null) {
|
6435 | return true;
|
6436 | }
|
6437 | else if (typeof mixed === 'string') {
|
6438 | return true;
|
6439 | }
|
6440 | else if (typeof mixed === 'boolean') {
|
6441 | return true;
|
6442 | }
|
6443 | else if (typeof mixed === 'number') {
|
6444 | return true;
|
6445 | }
|
6446 | else if (mixed instanceof Color) {
|
6447 | return true;
|
6448 | }
|
6449 | else if (mixed instanceof Collator) {
|
6450 | return true;
|
6451 | }
|
6452 | else if (mixed instanceof Formatted) {
|
6453 | return true;
|
6454 | }
|
6455 | else if (mixed instanceof ResolvedImage) {
|
6456 | return true;
|
6457 | }
|
6458 | else if (Array.isArray(mixed)) {
|
6459 | for (const item of mixed) {
|
6460 | if (!isValue(item)) {
|
6461 | return false;
|
6462 | }
|
6463 | }
|
6464 | return true;
|
6465 | }
|
6466 | else if (typeof mixed === 'object') {
|
6467 | for (const key in mixed) {
|
6468 | if (!isValue(mixed[key])) {
|
6469 | return false;
|
6470 | }
|
6471 | }
|
6472 | return true;
|
6473 | }
|
6474 | else {
|
6475 | return false;
|
6476 | }
|
6477 | }
|
6478 | function typeOf(value) {
|
6479 | if (value === null) {
|
6480 | return NullType;
|
6481 | }
|
6482 | else if (typeof value === 'string') {
|
6483 | return StringType;
|
6484 | }
|
6485 | else if (typeof value === 'boolean') {
|
6486 | return BooleanType;
|
6487 | }
|
6488 | else if (typeof value === 'number') {
|
6489 | return NumberType;
|
6490 | }
|
6491 | else if (value instanceof Color) {
|
6492 | return ColorType;
|
6493 | }
|
6494 | else if (value instanceof Collator) {
|
6495 | return CollatorType;
|
6496 | }
|
6497 | else if (value instanceof Formatted) {
|
6498 | return FormattedType;
|
6499 | }
|
6500 | else if (value instanceof ResolvedImage) {
|
6501 | return ResolvedImageType;
|
6502 | }
|
6503 | else if (Array.isArray(value)) {
|
6504 | const length = value.length;
|
6505 | let itemType;
|
6506 | for (const item of value) {
|
6507 | const t = typeOf(item);
|
6508 | if (!itemType) {
|
6509 | itemType = t;
|
6510 | }
|
6511 | else if (itemType === t) {
|
6512 | continue;
|
6513 | }
|
6514 | else {
|
6515 | itemType = ValueType;
|
6516 | break;
|
6517 | }
|
6518 | }
|
6519 | return array$1(itemType || ValueType, length);
|
6520 | }
|
6521 | else {
|
6522 | assert$1(typeof value === 'object');
|
6523 | return ObjectType;
|
6524 | }
|
6525 | }
|
6526 | function toString(value) {
|
6527 | const type = typeof value;
|
6528 | if (value === null) {
|
6529 | return '';
|
6530 | }
|
6531 | else if (type === 'string' || type === 'number' || type === 'boolean') {
|
6532 | return String(value);
|
6533 | }
|
6534 | else if (value instanceof Color || value instanceof Formatted || value instanceof ResolvedImage) {
|
6535 | return value.toString();
|
6536 | }
|
6537 | else {
|
6538 | return JSON.stringify(value);
|
6539 | }
|
6540 | }
|
6541 |
|
6542 | class Literal {
|
6543 | constructor(type, value) {
|
6544 | this.type = type;
|
6545 | this.value = value;
|
6546 | }
|
6547 | static parse(args, context) {
|
6548 | if (args.length !== 2)
|
6549 | return context.error(`'literal' expression requires exactly one argument, but found ${args.length - 1} instead.`);
|
6550 | if (!isValue(args[1]))
|
6551 | return context.error('invalid value');
|
6552 | const value = args[1];
|
6553 | let type = typeOf(value);
|
6554 | // special case: infer the item type if possible for zero-length arrays
|
6555 | const expected = context.expectedType;
|
6556 | if (type.kind === 'array' &&
|
6557 | type.N === 0 &&
|
6558 | expected &&
|
6559 | expected.kind === 'array' &&
|
6560 | (typeof expected.N !== 'number' || expected.N === 0)) {
|
6561 | type = expected;
|
6562 | }
|
6563 | return new Literal(type, value);
|
6564 | }
|
6565 | evaluate() {
|
6566 | return this.value;
|
6567 | }
|
6568 | eachChild() { }
|
6569 | outputDefined() {
|
6570 | return true;
|
6571 | }
|
6572 | serialize() {
|
6573 | if (this.type.kind === 'array' || this.type.kind === 'object') {
|
6574 | return ['literal', this.value];
|
6575 | }
|
6576 | else if (this.value instanceof Color) {
|
6577 | // Constant-folding can generate Literal expressions that you
|
6578 | // couldn't actually generate with a "literal" expression,
|
6579 | // so we have to implement an equivalent serialization here
|
6580 | return ['rgba'].concat(this.value.toArray());
|
6581 | }
|
6582 | else if (this.value instanceof Formatted) {
|
6583 | // Same as Color
|
6584 | return this.value.serialize();
|
6585 | }
|
6586 | else {
|
6587 | assert$1(this.value === null ||
|
6588 | typeof this.value === 'string' ||
|
6589 | typeof this.value === 'number' ||
|
6590 | typeof this.value === 'boolean');
|
6591 | return this.value;
|
6592 | }
|
6593 | }
|
6594 | }
|
6595 |
|
6596 | class RuntimeError {
|
6597 | constructor(message) {
|
6598 | this.name = 'ExpressionEvaluationError';
|
6599 | this.message = message;
|
6600 | }
|
6601 | toJSON() {
|
6602 | return this.message;
|
6603 | }
|
6604 | }
|
6605 |
|
6606 | const types$1 = {
|
6607 | string: StringType,
|
6608 | number: NumberType,
|
6609 | boolean: BooleanType,
|
6610 | object: ObjectType
|
6611 | };
|
6612 | class Assertion {
|
6613 | constructor(type, args) {
|
6614 | this.type = type;
|
6615 | this.args = args;
|
6616 | }
|
6617 | static parse(args, context) {
|
6618 | if (args.length < 2)
|
6619 | return context.error('Expected at least one argument.');
|
6620 | let i = 1;
|
6621 | let type;
|
6622 | const name = args[0];
|
6623 | if (name === 'array') {
|
6624 | let itemType;
|
6625 | if (args.length > 2) {
|
6626 | const type = args[1];
|
6627 | if (typeof type !== 'string' || !(type in types$1) || type === 'object')
|
6628 | return context.error('The item type argument of "array" must be one of string, number, boolean', 1);
|
6629 | itemType = types$1[type];
|
6630 | i++;
|
6631 | }
|
6632 | else {
|
6633 | itemType = ValueType;
|
6634 | }
|
6635 | let N;
|
6636 | if (args.length > 3) {
|
6637 | if (args[2] !== null &&
|
6638 | (typeof args[2] !== 'number' ||
|
6639 | args[2] < 0 ||
|
6640 | args[2] !== Math.floor(args[2]))) {
|
6641 | return context.error('The length argument to "array" must be a positive integer literal', 2);
|
6642 | }
|
6643 | N = args[2];
|
6644 | i++;
|
6645 | }
|
6646 | type = array$1(itemType, N);
|
6647 | }
|
6648 | else {
|
6649 | assert$1(types$1[name], name);
|
6650 | type = types$1[name];
|
6651 | }
|
6652 | const parsed = [];
|
6653 | for (; i < args.length; i++) {
|
6654 | const input = context.parse(args[i], i, ValueType);
|
6655 | if (!input)
|
6656 | return null;
|
6657 | parsed.push(input);
|
6658 | }
|
6659 | return new Assertion(type, parsed);
|
6660 | }
|
6661 | evaluate(ctx) {
|
6662 | for (let i = 0; i < this.args.length; i++) {
|
6663 | const value = this.args[i].evaluate(ctx);
|
6664 | const error = checkSubtype(this.type, typeOf(value));
|
6665 | if (!error) {
|
6666 | return value;
|
6667 | }
|
6668 | else if (i === this.args.length - 1) {
|
6669 | throw new RuntimeError(`Expected value to be of type ${toString$1(this.type)}, but found ${toString$1(typeOf(value))} instead.`);
|
6670 | }
|
6671 | }
|
6672 | assert$1(false);
|
6673 | return null;
|
6674 | }
|
6675 | eachChild(fn) {
|
6676 | this.args.forEach(fn);
|
6677 | }
|
6678 | outputDefined() {
|
6679 | return this.args.every(arg => arg.outputDefined());
|
6680 | }
|
6681 | serialize() {
|
6682 | const type = this.type;
|
6683 | const serialized = [type.kind];
|
6684 | if (type.kind === 'array') {
|
6685 | const itemType = type.itemType;
|
6686 | if (itemType.kind === 'string' ||
|
6687 | itemType.kind === 'number' ||
|
6688 | itemType.kind === 'boolean') {
|
6689 | serialized.push(itemType.kind);
|
6690 | const N = type.N;
|
6691 | if (typeof N === 'number' || this.args.length > 1) {
|
6692 | serialized.push(N);
|
6693 | }
|
6694 | }
|
6695 | }
|
6696 | return serialized.concat(this.args.map(arg => arg.serialize()));
|
6697 | }
|
6698 | }
|
6699 |
|
6700 | class FormatExpression {
|
6701 | constructor(sections) {
|
6702 | this.type = FormattedType;
|
6703 | this.sections = sections;
|
6704 | }
|
6705 | static parse(args, context) {
|
6706 | if (args.length < 2) {
|
6707 | return context.error('Expected at least one argument.');
|
6708 | }
|
6709 | const firstArg = args[1];
|
6710 | if (!Array.isArray(firstArg) && typeof firstArg === 'object') {
|
6711 | return context.error('First argument must be an image or text section.');
|
6712 | }
|
6713 | const sections = [];
|
6714 | let nextTokenMayBeObject = false;
|
6715 | for (let i = 1; i <= args.length - 1; ++i) {
|
6716 | const arg = args[i];
|
6717 | if (nextTokenMayBeObject && typeof arg === 'object' && !Array.isArray(arg)) {
|
6718 | nextTokenMayBeObject = false;
|
6719 | let scale = null;
|
6720 | if (arg['font-scale']) {
|
6721 | scale = context.parse(arg['font-scale'], 1, NumberType);
|
6722 | if (!scale)
|
6723 | return null;
|
6724 | }
|
6725 | let font = null;
|
6726 | if (arg['text-font']) {
|
6727 | font = context.parse(arg['text-font'], 1, array$1(StringType));
|
6728 | if (!font)
|
6729 | return null;
|
6730 | }
|
6731 | let textColor = null;
|
6732 | if (arg['text-color']) {
|
6733 | textColor = context.parse(arg['text-color'], 1, ColorType);
|
6734 | if (!textColor)
|
6735 | return null;
|
6736 | }
|
6737 | const lastExpression = sections[sections.length - 1];
|
6738 | lastExpression.scale = scale;
|
6739 | lastExpression.font = font;
|
6740 | lastExpression.textColor = textColor;
|
6741 | }
|
6742 | else {
|
6743 | const content = context.parse(args[i], 1, ValueType);
|
6744 | if (!content)
|
6745 | return null;
|
6746 | const kind = content.type.kind;
|
6747 | if (kind !== 'string' && kind !== 'value' && kind !== 'null' && kind !== 'resolvedImage')
|
6748 | return context.error('Formatted text type must be \'string\', \'value\', \'image\' or \'null\'.');
|
6749 | nextTokenMayBeObject = true;
|
6750 | sections.push({ content, scale: null, font: null, textColor: null });
|
6751 | }
|
6752 | }
|
6753 | return new FormatExpression(sections);
|
6754 | }
|
6755 | evaluate(ctx) {
|
6756 | const evaluateSection = section => {
|
6757 | const evaluatedContent = section.content.evaluate(ctx);
|
6758 | if (typeOf(evaluatedContent) === ResolvedImageType) {
|
6759 | return new FormattedSection('', evaluatedContent, null, null, null);
|
6760 | }
|
6761 | return new FormattedSection(toString(evaluatedContent), null, section.scale ? section.scale.evaluate(ctx) : null, section.font ? section.font.evaluate(ctx).join(',') : null, section.textColor ? section.textColor.evaluate(ctx) : null);
|
6762 | };
|
6763 | return new Formatted(this.sections.map(evaluateSection));
|
6764 | }
|
6765 | eachChild(fn) {
|
6766 | for (const section of this.sections) {
|
6767 | fn(section.content);
|
6768 | if (section.scale) {
|
6769 | fn(section.scale);
|
6770 | }
|
6771 | if (section.font) {
|
6772 | fn(section.font);
|
6773 | }
|
6774 | if (section.textColor) {
|
6775 | fn(section.textColor);
|
6776 | }
|
6777 | }
|
6778 | }
|
6779 | outputDefined() {
|
6780 | // Technically the combinatoric set of all children
|
6781 | // Usually, this.text will be undefined anyway
|
6782 | return false;
|
6783 | }
|
6784 | serialize() {
|
6785 | const serialized = ['format'];
|
6786 | for (const section of this.sections) {
|
6787 | serialized.push(section.content.serialize());
|
6788 | const options = {};
|
6789 | if (section.scale) {
|
6790 | options['font-scale'] = section.scale.serialize();
|
6791 | }
|
6792 | if (section.font) {
|
6793 | options['text-font'] = section.font.serialize();
|
6794 | }
|
6795 | if (section.textColor) {
|
6796 | options['text-color'] = section.textColor.serialize();
|
6797 | }
|
6798 | serialized.push(options);
|
6799 | }
|
6800 | return serialized;
|
6801 | }
|
6802 | }
|
6803 |
|
6804 | class ImageExpression {
|
6805 | constructor(input) {
|
6806 | this.type = ResolvedImageType;
|
6807 | this.input = input;
|
6808 | }
|
6809 | static parse(args, context) {
|
6810 | if (args.length !== 2) {
|
6811 | return context.error('Expected two arguments.');
|
6812 | }
|
6813 | const name = context.parse(args[1], 1, StringType);
|
6814 | if (!name)
|
6815 | return context.error('No image name provided.');
|
6816 | return new ImageExpression(name);
|
6817 | }
|
6818 | evaluate(ctx) {
|
6819 | const evaluatedImageName = this.input.evaluate(ctx);
|
6820 | const value = ResolvedImage.fromString(evaluatedImageName);
|
6821 | if (value && ctx.availableImages)
|
6822 | value.available = ctx.availableImages.indexOf(evaluatedImageName) > -1;
|
6823 | return value;
|
6824 | }
|
6825 | eachChild(fn) {
|
6826 | fn(this.input);
|
6827 | }
|
6828 | outputDefined() {
|
6829 | // The output of image is determined by the list of available images in the evaluation context
|
6830 | return false;
|
6831 | }
|
6832 | serialize() {
|
6833 | return ['image', this.input.serialize()];
|
6834 | }
|
6835 | }
|
6836 |
|
6837 | const types = {
|
6838 | 'to-boolean': BooleanType,
|
6839 | 'to-color': ColorType,
|
6840 | 'to-number': NumberType,
|
6841 | 'to-string': StringType
|
6842 | };
|
6843 | /**
|
6844 | * Special form for error-coalescing coercion expressions "to-number",
|
6845 | * "to-color". Since these coercions can fail at runtime, they accept multiple
|
6846 | * arguments, only evaluating one at a time until one succeeds.
|
6847 | *
|
6848 | * @private
|
6849 | */
|
6850 | class Coercion {
|
6851 | constructor(type, args) {
|
6852 | this.type = type;
|
6853 | this.args = args;
|
6854 | }
|
6855 | static parse(args, context) {
|
6856 | if (args.length < 2)
|
6857 | return context.error('Expected at least one argument.');
|
6858 | const name = args[0];
|
6859 | assert$1(types[name], name);
|
6860 | if ((name === 'to-boolean' || name === 'to-string') && args.length !== 2)
|
6861 | return context.error('Expected one argument.');
|
6862 | const type = types[name];
|
6863 | const parsed = [];
|
6864 | for (let i = 1; i < args.length; i++) {
|
6865 | const input = context.parse(args[i], i, ValueType);
|
6866 | if (!input)
|
6867 | return null;
|
6868 | parsed.push(input);
|
6869 | }
|
6870 | return new Coercion(type, parsed);
|
6871 | }
|
6872 | evaluate(ctx) {
|
6873 | if (this.type.kind === 'boolean') {
|
6874 | return Boolean(this.args[0].evaluate(ctx));
|
6875 | }
|
6876 | else if (this.type.kind === 'color') {
|
6877 | let input;
|
6878 | let error;
|
6879 | for (const arg of this.args) {
|
6880 | input = arg.evaluate(ctx);
|
6881 | error = null;
|
6882 | if (input instanceof Color) {
|
6883 | return input;
|
6884 | }
|
6885 | else if (typeof input === 'string') {
|
6886 | const c = ctx.parseColor(input);
|
6887 | if (c)
|
6888 | return c;
|
6889 | }
|
6890 | else if (Array.isArray(input)) {
|
6891 | if (input.length < 3 || input.length > 4) {
|
6892 | error = `Invalid rbga value ${JSON.stringify(input)}: expected an array containing either three or four numeric values.`;
|
6893 | }
|
6894 | else {
|
6895 | error = validateRGBA(input[0], input[1], input[2], input[3]);
|
6896 | }
|
6897 | if (!error) {
|
6898 | return new Color(input[0] / 255, input[1] / 255, input[2] / 255, input[3]);
|
6899 | }
|
6900 | }
|
6901 | }
|
6902 | throw new RuntimeError(error || `Could not parse color from value '${typeof input === 'string' ? input : String(JSON.stringify(input))}'`);
|
6903 | }
|
6904 | else if (this.type.kind === 'number') {
|
6905 | let value = null;
|
6906 | for (const arg of this.args) {
|
6907 | value = arg.evaluate(ctx);
|
6908 | if (value === null)
|
6909 | return 0;
|
6910 | const num = Number(value);
|
6911 | if (isNaN(num))
|
6912 | continue;
|
6913 | return num;
|
6914 | }
|
6915 | throw new RuntimeError(`Could not convert ${JSON.stringify(value)} to number.`);
|
6916 | }
|
6917 | else if (this.type.kind === 'formatted') {
|
6918 | // There is no explicit 'to-formatted' but this coercion can be implicitly
|
6919 | // created by properties that expect the 'formatted' type.
|
6920 | return Formatted.fromString(toString(this.args[0].evaluate(ctx)));
|
6921 | }
|
6922 | else if (this.type.kind === 'resolvedImage') {
|
6923 | return ResolvedImage.fromString(toString(this.args[0].evaluate(ctx)));
|
6924 | }
|
6925 | else {
|
6926 | return toString(this.args[0].evaluate(ctx));
|
6927 | }
|
6928 | }
|
6929 | eachChild(fn) {
|
6930 | this.args.forEach(fn);
|
6931 | }
|
6932 | outputDefined() {
|
6933 | return this.args.every(arg => arg.outputDefined());
|
6934 | }
|
6935 | serialize() {
|
6936 | if (this.type.kind === 'formatted') {
|
6937 | return new FormatExpression([{ content: this.args[0], scale: null, font: null, textColor: null }]).serialize();
|
6938 | }
|
6939 | if (this.type.kind === 'resolvedImage') {
|
6940 | return new ImageExpression(this.args[0]).serialize();
|
6941 | }
|
6942 | const serialized = [`to-${this.type.kind}`];
|
6943 | this.eachChild(child => { serialized.push(child.serialize()); });
|
6944 | return serialized;
|
6945 | }
|
6946 | }
|
6947 |
|
6948 | const geometryTypes = ['Unknown', 'Point', 'LineString', 'Polygon'];
|
6949 | class EvaluationContext {
|
6950 | constructor() {
|
6951 | this.globals = null;
|
6952 | this.feature = null;
|
6953 | this.featureState = null;
|
6954 | this.formattedSection = null;
|
6955 | this._parseColorCache = {};
|
6956 | this.availableImages = null;
|
6957 | this.canonical = null;
|
6958 | }
|
6959 | id() {
|
6960 | return this.feature && 'id' in this.feature ? this.feature.id : null;
|
6961 | }
|
6962 | geometryType() {
|
6963 | return this.feature ? typeof this.feature.type === 'number' ? geometryTypes[this.feature.type] : this.feature.type : null;
|
6964 | }
|
6965 | geometry() {
|
6966 | return this.feature && 'geometry' in this.feature ? this.feature.geometry : null;
|
6967 | }
|
6968 | canonicalID() {
|
6969 | return this.canonical;
|
6970 | }
|
6971 | properties() {
|
6972 | return this.feature && this.feature.properties || {};
|
6973 | }
|
6974 | parseColor(input) {
|
6975 | let cached = this._parseColorCache[input];
|
6976 | if (!cached) {
|
6977 | cached = this._parseColorCache[input] = Color.parse(input);
|
6978 | }
|
6979 | return cached;
|
6980 | }
|
6981 | }
|
6982 |
|
6983 | class CompoundExpression {
|
6984 | constructor(name, type, evaluate, args) {
|
6985 | this.name = name;
|
6986 | this.type = type;
|
6987 | this._evaluate = evaluate;
|
6988 | this.args = args;
|
6989 | }
|
6990 | evaluate(ctx) {
|
6991 | return this._evaluate(ctx, this.args);
|
6992 | }
|
6993 | eachChild(fn) {
|
6994 | this.args.forEach(fn);
|
6995 | }
|
6996 | outputDefined() {
|
6997 | return false;
|
6998 | }
|
6999 | serialize() {
|
7000 | return [this.name].concat(this.args.map(arg => arg.serialize()));
|
7001 | }
|
7002 | static parse(args, context) {
|
7003 | const op = args[0];
|
7004 | const definition = CompoundExpression.definitions[op];
|
7005 | if (!definition) {
|
7006 | return context.error(`Unknown expression "${op}". If you wanted a literal array, use ["literal", [...]].`, 0);
|
7007 | }
|
7008 | // Now check argument types against each signature
|
7009 | const type = Array.isArray(definition) ?
|
7010 | definition[0] : definition.type;
|
7011 | const availableOverloads = Array.isArray(definition) ?
|
7012 | [[definition[1], definition[2]]] :
|
7013 | definition.overloads;
|
7014 | const overloads = availableOverloads.filter(([signature]) => (!Array.isArray(signature) || // varags
|
7015 | signature.length === args.length - 1 // correct param count
|
7016 | ));
|
7017 | let signatureContext = null;
|
7018 | for (const [params, evaluate] of overloads) {
|
7019 | // Use a fresh context for each attempted signature so that, if
|
7020 | // we eventually succeed, we haven't polluted `context.errors`.
|
7021 | signatureContext = new ParsingContext$1(context.registry, context.path, null, context.scope);
|
7022 | // First parse all the args, potentially coercing to the
|
7023 | // types expected by this overload.
|
7024 | const parsedArgs = [];
|
7025 | let argParseFailed = false;
|
7026 | for (let i = 1; i < args.length; i++) {
|
7027 | const arg = args[i];
|
7028 | const expectedType = Array.isArray(params) ?
|
7029 | params[i - 1] :
|
7030 | params.type;
|
7031 | const parsed = signatureContext.parse(arg, 1 + parsedArgs.length, expectedType);
|
7032 | if (!parsed) {
|
7033 | argParseFailed = true;
|
7034 | break;
|
7035 | }
|
7036 | parsedArgs.push(parsed);
|
7037 | }
|
7038 | if (argParseFailed) {
|
7039 | // Couldn't coerce args of this overload to expected type, move
|
7040 | // on to next one.
|
7041 | continue;
|
7042 | }
|
7043 | if (Array.isArray(params)) {
|
7044 | if (params.length !== parsedArgs.length) {
|
7045 | signatureContext.error(`Expected ${params.length} arguments, but found ${parsedArgs.length} instead.`);
|
7046 | continue;
|
7047 | }
|
7048 | }
|
7049 | for (let i = 0; i < parsedArgs.length; i++) {
|
7050 | const expected = Array.isArray(params) ? params[i] : params.type;
|
7051 | const arg = parsedArgs[i];
|
7052 | signatureContext.concat(i + 1).checkSubtype(expected, arg.type);
|
7053 | }
|
7054 | if (signatureContext.errors.length === 0) {
|
7055 | return new CompoundExpression(op, type, evaluate, parsedArgs);
|
7056 | }
|
7057 | }
|
7058 | assert$1(!signatureContext || signatureContext.errors.length > 0);
|
7059 | if (overloads.length === 1) {
|
7060 | context.errors.push(...signatureContext.errors);
|
7061 | }
|
7062 | else {
|
7063 | const expected = overloads.length ? overloads : availableOverloads;
|
7064 | const signatures = expected
|
7065 | .map(([params]) => stringifySignature(params))
|
7066 | .join(' | ');
|
7067 | const actualTypes = [];
|
7068 | // For error message, re-parse arguments without trying to
|
7069 | // apply any coercions
|
7070 | for (let i = 1; i < args.length; i++) {
|
7071 | const parsed = context.parse(args[i], 1 + actualTypes.length);
|
7072 | if (!parsed)
|
7073 | return null;
|
7074 | actualTypes.push(toString$1(parsed.type));
|
7075 | }
|
7076 | context.error(`Expected arguments of type ${signatures}, but found (${actualTypes.join(', ')}) instead.`);
|
7077 | }
|
7078 | return null;
|
7079 | }
|
7080 | static register(registry, definitions) {
|
7081 | assert$1(!CompoundExpression.definitions);
|
7082 | CompoundExpression.definitions = definitions;
|
7083 | for (const name in definitions) {
|
7084 | registry[name] = CompoundExpression;
|
7085 | }
|
7086 | }
|
7087 | }
|
7088 | function stringifySignature(signature) {
|
7089 | if (Array.isArray(signature)) {
|
7090 | return `(${signature.map(toString$1).join(', ')})`;
|
7091 | }
|
7092 | else {
|
7093 | return `(${toString$1(signature.type)}...)`;
|
7094 | }
|
7095 | }
|
7096 |
|
7097 | class CollatorExpression {
|
7098 | constructor(caseSensitive, diacriticSensitive, locale) {
|
7099 | this.type = CollatorType;
|
7100 | this.locale = locale;
|
7101 | this.caseSensitive = caseSensitive;
|
7102 | this.diacriticSensitive = diacriticSensitive;
|
7103 | }
|
7104 | static parse(args, context) {
|
7105 | if (args.length !== 2)
|
7106 | return context.error('Expected one argument.');
|
7107 | const options = args[1];
|
7108 | if (typeof options !== 'object' || Array.isArray(options))
|
7109 | return context.error('Collator options argument must be an object.');
|
7110 | const caseSensitive = context.parse(options['case-sensitive'] === undefined ? false : options['case-sensitive'], 1, BooleanType);
|
7111 | if (!caseSensitive)
|
7112 | return null;
|
7113 | const diacriticSensitive = context.parse(options['diacritic-sensitive'] === undefined ? false : options['diacritic-sensitive'], 1, BooleanType);
|
7114 | if (!diacriticSensitive)
|
7115 | return null;
|
7116 | let locale = null;
|
7117 | if (options['locale']) {
|
7118 | locale = context.parse(options['locale'], 1, StringType);
|
7119 | if (!locale)
|
7120 | return null;
|
7121 | }
|
7122 | return new CollatorExpression(caseSensitive, diacriticSensitive, locale);
|
7123 | }
|
7124 | evaluate(ctx) {
|
7125 | return new Collator(this.caseSensitive.evaluate(ctx), this.diacriticSensitive.evaluate(ctx), this.locale ? this.locale.evaluate(ctx) : null);
|
7126 | }
|
7127 | eachChild(fn) {
|
7128 | fn(this.caseSensitive);
|
7129 | fn(this.diacriticSensitive);
|
7130 | if (this.locale) {
|
7131 | fn(this.locale);
|
7132 | }
|
7133 | }
|
7134 | outputDefined() {
|
7135 | // Technically the set of possible outputs is the combinatoric set of Collators produced
|
7136 | // by all possible outputs of locale/caseSensitive/diacriticSensitive
|
7137 | // But for the primary use of Collators in comparison operators, we ignore the Collator's
|
7138 | // possible outputs anyway, so we can get away with leaving this false for now.
|
7139 | return false;
|
7140 | }
|
7141 | serialize() {
|
7142 | const options = {};
|
7143 | options['case-sensitive'] = this.caseSensitive.serialize();
|
7144 | options['diacritic-sensitive'] = this.diacriticSensitive.serialize();
|
7145 | if (this.locale) {
|
7146 | options['locale'] = this.locale.serialize();
|
7147 | }
|
7148 | return ['collator', options];
|
7149 | }
|
7150 | }
|
7151 |
|
7152 | const EXTENT$1 = 8192;
|
7153 | function updateBBox(bbox, coord) {
|
7154 | bbox[0] = Math.min(bbox[0], coord[0]);
|
7155 | bbox[1] = Math.min(bbox[1], coord[1]);
|
7156 | bbox[2] = Math.max(bbox[2], coord[0]);
|
7157 | bbox[3] = Math.max(bbox[3], coord[1]);
|
7158 | }
|
7159 | function mercatorXfromLng$1(lng) {
|
7160 | return (180 + lng) / 360;
|
7161 | }
|
7162 | function mercatorYfromLat$1(lat) {
|
7163 | return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360;
|
7164 | }
|
7165 | function boxWithinBox(bbox1, bbox2) {
|
7166 | if (bbox1[0] <= bbox2[0])
|
7167 | return false;
|
7168 | if (bbox1[2] >= bbox2[2])
|
7169 | return false;
|
7170 | if (bbox1[1] <= bbox2[1])
|
7171 | return false;
|
7172 | if (bbox1[3] >= bbox2[3])
|
7173 | return false;
|
7174 | return true;
|
7175 | }
|
7176 | function getTileCoordinates(p, canonical) {
|
7177 | const x = mercatorXfromLng$1(p[0]);
|
7178 | const y = mercatorYfromLat$1(p[1]);
|
7179 | const tilesAtZoom = Math.pow(2, canonical.z);
|
7180 | return [Math.round(x * tilesAtZoom * EXTENT$1), Math.round(y * tilesAtZoom * EXTENT$1)];
|
7181 | }
|
7182 | function onBoundary(p, p1, p2) {
|
7183 | const x1 = p[0] - p1[0];
|
7184 | const y1 = p[1] - p1[1];
|
7185 | const x2 = p[0] - p2[0];
|
7186 | const y2 = p[1] - p2[1];
|
7187 | return (x1 * y2 - x2 * y1 === 0) && (x1 * x2 <= 0) && (y1 * y2 <= 0);
|
7188 | }
|
7189 | function rayIntersect(p, p1, p2) {
|
7190 | return ((p1[1] > p[1]) !== (p2[1] > p[1])) && (p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]);
|
7191 | }
|
7192 | // ray casting algorithm for detecting if point is in polygon
|
7193 | function pointWithinPolygon(point, rings) {
|
7194 | let inside = false;
|
7195 | for (let i = 0, len = rings.length; i < len; i++) {
|
7196 | const ring = rings[i];
|
7197 | for (let j = 0, len2 = ring.length; j < len2 - 1; j++) {
|
7198 | if (onBoundary(point, ring[j], ring[j + 1]))
|
7199 | return false;
|
7200 | if (rayIntersect(point, ring[j], ring[j + 1]))
|
7201 | inside = !inside;
|
7202 | }
|
7203 | }
|
7204 | return inside;
|
7205 | }
|
7206 | function pointWithinPolygons(point, polygons) {
|
7207 | for (let i = 0; i < polygons.length; i++) {
|
7208 | if (pointWithinPolygon(point, polygons[i]))
|
7209 | return true;
|
7210 | }
|
7211 | return false;
|
7212 | }
|
7213 | function perp(v1, v2) {
|
7214 | return (v1[0] * v2[1] - v1[1] * v2[0]);
|
7215 | }
|
7216 | // check if p1 and p2 are in different sides of line segment q1->q2
|
7217 | function twoSided(p1, p2, q1, q2) {
|
7218 | // q1->p1 (x1, y1), q1->p2 (x2, y2), q1->q2 (x3, y3)
|
7219 | const x1 = p1[0] - q1[0];
|
7220 | const y1 = p1[1] - q1[1];
|
7221 | const x2 = p2[0] - q1[0];
|
7222 | const y2 = p2[1] - q1[1];
|
7223 | const x3 = q2[0] - q1[0];
|
7224 | const y3 = q2[1] - q1[1];
|
7225 | const det1 = (x1 * y3 - x3 * y1);
|
7226 | const det2 = (x2 * y3 - x3 * y2);
|
7227 | if ((det1 > 0 && det2 < 0) || (det1 < 0 && det2 > 0))
|
7228 | return true;
|
7229 | return false;
|
7230 | }
|
7231 | // a, b are end points for line segment1, c and d are end points for line segment2
|
7232 | function lineIntersectLine(a, b, c, d) {
|
7233 | // check if two segments are parallel or not
|
7234 | // precondition is end point a, b is inside polygon, if line a->b is
|
7235 | // parallel to polygon edge c->d, then a->b won't intersect with c->d
|
7236 | const vectorP = [b[0] - a[0], b[1] - a[1]];
|
7237 | const vectorQ = [d[0] - c[0], d[1] - c[1]];
|
7238 | if (perp(vectorQ, vectorP) === 0)
|
7239 | return false;
|
7240 | // If lines are intersecting with each other, the relative location should be:
|
7241 | // a and b lie in different sides of segment c->d
|
7242 | // c and d lie in different sides of segment a->b
|
7243 | if (twoSided(a, b, c, d) && twoSided(c, d, a, b))
|
7244 | return true;
|
7245 | return false;
|
7246 | }
|
7247 | function lineIntersectPolygon(p1, p2, polygon) {
|
7248 | for (const ring of polygon) {
|
7249 | // loop through every edge of the ring
|
7250 | for (let j = 0; j < ring.length - 1; ++j) {
|
7251 | if (lineIntersectLine(p1, p2, ring[j], ring[j + 1])) {
|
7252 | return true;
|
7253 | }
|
7254 | }
|
7255 | }
|
7256 | return false;
|
7257 | }
|
7258 | function lineStringWithinPolygon(line, polygon) {
|
7259 | // First, check if geometry points of line segments are all inside polygon
|
7260 | for (let i = 0; i < line.length; ++i) {
|
7261 | if (!pointWithinPolygon(line[i], polygon)) {
|
7262 | return false;
|
7263 | }
|
7264 | }
|
7265 | // Second, check if there is line segment intersecting polygon edge
|
7266 | for (let i = 0; i < line.length - 1; ++i) {
|
7267 | if (lineIntersectPolygon(line[i], line[i + 1], polygon)) {
|
7268 | return false;
|
7269 | }
|
7270 | }
|
7271 | return true;
|
7272 | }
|
7273 | function lineStringWithinPolygons(line, polygons) {
|
7274 | for (let i = 0; i < polygons.length; i++) {
|
7275 | if (lineStringWithinPolygon(line, polygons[i]))
|
7276 | return true;
|
7277 | }
|
7278 | return false;
|
7279 | }
|
7280 | function getTilePolygon(coordinates, bbox, canonical) {
|
7281 | const polygon = [];
|
7282 | for (let i = 0; i < coordinates.length; i++) {
|
7283 | const ring = [];
|
7284 | for (let j = 0; j < coordinates[i].length; j++) {
|
7285 | const coord = getTileCoordinates(coordinates[i][j], canonical);
|
7286 | updateBBox(bbox, coord);
|
7287 | ring.push(coord);
|
7288 | }
|
7289 | polygon.push(ring);
|
7290 | }
|
7291 | return polygon;
|
7292 | }
|
7293 | function getTilePolygons(coordinates, bbox, canonical) {
|
7294 | const polygons = [];
|
7295 | for (let i = 0; i < coordinates.length; i++) {
|
7296 | const polygon = getTilePolygon(coordinates[i], bbox, canonical);
|
7297 | polygons.push(polygon);
|
7298 | }
|
7299 | return polygons;
|
7300 | }
|
7301 | function updatePoint(p, bbox, polyBBox, worldSize) {
|
7302 | if (p[0] < polyBBox[0] || p[0] > polyBBox[2]) {
|
7303 | const halfWorldSize = worldSize * 0.5;
|
7304 | let shift = (p[0] - polyBBox[0] > halfWorldSize) ? -worldSize : (polyBBox[0] - p[0] > halfWorldSize) ? worldSize : 0;
|
7305 | if (shift === 0) {
|
7306 | shift = (p[0] - polyBBox[2] > halfWorldSize) ? -worldSize : (polyBBox[2] - p[0] > halfWorldSize) ? worldSize : 0;
|
7307 | }
|
7308 | p[0] += shift;
|
7309 | }
|
7310 | updateBBox(bbox, p);
|
7311 | }
|
7312 | function resetBBox(bbox) {
|
7313 | bbox[0] = bbox[1] = Infinity;
|
7314 | bbox[2] = bbox[3] = -Infinity;
|
7315 | }
|
7316 | function getTilePoints(geometry, pointBBox, polyBBox, canonical) {
|
7317 | const worldSize = Math.pow(2, canonical.z) * EXTENT$1;
|
7318 | const shifts = [canonical.x * EXTENT$1, canonical.y * EXTENT$1];
|
7319 | const tilePoints = [];
|
7320 | for (const points of geometry) {
|
7321 | for (const point of points) {
|
7322 | const p = [point.x + shifts[0], point.y + shifts[1]];
|
7323 | updatePoint(p, pointBBox, polyBBox, worldSize);
|
7324 | tilePoints.push(p);
|
7325 | }
|
7326 | }
|
7327 | return tilePoints;
|
7328 | }
|
7329 | function getTileLines(geometry, lineBBox, polyBBox, canonical) {
|
7330 | const worldSize = Math.pow(2, canonical.z) * EXTENT$1;
|
7331 | const shifts = [canonical.x * EXTENT$1, canonical.y * EXTENT$1];
|
7332 | const tileLines = [];
|
7333 | for (const line of geometry) {
|
7334 | const tileLine = [];
|
7335 | for (const point of line) {
|
7336 | const p = [point.x + shifts[0], point.y + shifts[1]];
|
7337 | updateBBox(lineBBox, p);
|
7338 | tileLine.push(p);
|
7339 | }
|
7340 | tileLines.push(tileLine);
|
7341 | }
|
7342 | if (lineBBox[2] - lineBBox[0] <= worldSize / 2) {
|
7343 | resetBBox(lineBBox);
|
7344 | for (const line of tileLines) {
|
7345 | for (const p of line) {
|
7346 | updatePoint(p, lineBBox, polyBBox, worldSize);
|
7347 | }
|
7348 | }
|
7349 | }
|
7350 | return tileLines;
|
7351 | }
|
7352 | function pointsWithinPolygons(ctx, polygonGeometry) {
|
7353 | const pointBBox = [Infinity, Infinity, -Infinity, -Infinity];
|
7354 | const polyBBox = [Infinity, Infinity, -Infinity, -Infinity];
|
7355 | const canonical = ctx.canonicalID();
|
7356 | if (polygonGeometry.type === 'Polygon') {
|
7357 | const tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical);
|
7358 | const tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical);
|
7359 | if (!boxWithinBox(pointBBox, polyBBox))
|
7360 | return false;
|
7361 | for (const point of tilePoints) {
|
7362 | if (!pointWithinPolygon(point, tilePolygon))
|
7363 | return false;
|
7364 | }
|
7365 | }
|
7366 | if (polygonGeometry.type === 'MultiPolygon') {
|
7367 | const tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical);
|
7368 | const tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical);
|
7369 | if (!boxWithinBox(pointBBox, polyBBox))
|
7370 | return false;
|
7371 | for (const point of tilePoints) {
|
7372 | if (!pointWithinPolygons(point, tilePolygons))
|
7373 | return false;
|
7374 | }
|
7375 | }
|
7376 | return true;
|
7377 | }
|
7378 | function linesWithinPolygons(ctx, polygonGeometry) {
|
7379 | const lineBBox = [Infinity, Infinity, -Infinity, -Infinity];
|
7380 | const polyBBox = [Infinity, Infinity, -Infinity, -Infinity];
|
7381 | const canonical = ctx.canonicalID();
|
7382 | if (polygonGeometry.type === 'Polygon') {
|
7383 | const tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical);
|
7384 | const tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical);
|
7385 | if (!boxWithinBox(lineBBox, polyBBox))
|
7386 | return false;
|
7387 | for (const line of tileLines) {
|
7388 | if (!lineStringWithinPolygon(line, tilePolygon))
|
7389 | return false;
|
7390 | }
|
7391 | }
|
7392 | if (polygonGeometry.type === 'MultiPolygon') {
|
7393 | const tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical);
|
7394 | const tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical);
|
7395 | if (!boxWithinBox(lineBBox, polyBBox))
|
7396 | return false;
|
7397 | for (const line of tileLines) {
|
7398 | if (!lineStringWithinPolygons(line, tilePolygons))
|
7399 | return false;
|
7400 | }
|
7401 | }
|
7402 | return true;
|
7403 | }
|
7404 | class Within {
|
7405 | constructor(geojson, geometries) {
|
7406 | this.type = BooleanType;
|
7407 | this.geojson = geojson;
|
7408 | this.geometries = geometries;
|
7409 | }
|
7410 | static parse(args, context) {
|
7411 | if (args.length !== 2)
|
7412 | return context.error(`'within' expression requires exactly one argument, but found ${args.length - 1} instead.`);
|
7413 | if (isValue(args[1])) {
|
7414 | const geojson = args[1];
|
7415 | if (geojson.type === 'FeatureCollection') {
|
7416 | for (let i = 0; i < geojson.features.length; ++i) {
|
7417 | const type = geojson.features[i].geometry.type;
|
7418 | if (type === 'Polygon' || type === 'MultiPolygon') {
|
7419 | return new Within(geojson, geojson.features[i].geometry);
|
7420 | }
|
7421 | }
|
7422 | }
|
7423 | else if (geojson.type === 'Feature') {
|
7424 | const type = geojson.geometry.type;
|
7425 | if (type === 'Polygon' || type === 'MultiPolygon') {
|
7426 | return new Within(geojson, geojson.geometry);
|
7427 | }
|
7428 | }
|
7429 | else if (geojson.type === 'Polygon' || geojson.type === 'MultiPolygon') {
|
7430 | return new Within(geojson, geojson);
|
7431 | }
|
7432 | }
|
7433 | return context.error('\'within\' expression requires valid geojson object that contains polygon geometry type.');
|
7434 | }
|
7435 | evaluate(ctx) {
|
7436 | if (ctx.geometry() != null && ctx.canonicalID() != null) {
|
7437 | if (ctx.geometryType() === 'Point') {
|
7438 | return pointsWithinPolygons(ctx, this.geometries);
|
7439 | }
|
7440 | else if (ctx.geometryType() === 'LineString') {
|
7441 | return linesWithinPolygons(ctx, this.geometries);
|
7442 | }
|
7443 | }
|
7444 | return false;
|
7445 | }
|
7446 | eachChild() { }
|
7447 | outputDefined() {
|
7448 | return true;
|
7449 | }
|
7450 | serialize() {
|
7451 | return ['within', this.geojson];
|
7452 | }
|
7453 | }
|
7454 |
|
7455 | function isFeatureConstant(e) {
|
7456 | if (e instanceof CompoundExpression) {
|
7457 | if (e.name === 'get' && e.args.length === 1) {
|
7458 | return false;
|
7459 | }
|
7460 | else if (e.name === 'feature-state') {
|
7461 | return false;
|
7462 | }
|
7463 | else if (e.name === 'has' && e.args.length === 1) {
|
7464 | return false;
|
7465 | }
|
7466 | else if (e.name === 'properties' ||
|
7467 | e.name === 'geometry-type' ||
|
7468 | e.name === 'id') {
|
7469 | return false;
|
7470 | }
|
7471 | else if (/^filter-/.test(e.name)) {
|
7472 | return false;
|
7473 | }
|
7474 | }
|
7475 | if (e instanceof Within) {
|
7476 | return false;
|
7477 | }
|
7478 | let result = true;
|
7479 | e.eachChild(arg => {
|
7480 | if (result && !isFeatureConstant(arg)) {
|
7481 | result = false;
|
7482 | }
|
7483 | });
|
7484 | return result;
|
7485 | }
|
7486 | function isStateConstant(e) {
|
7487 | if (e instanceof CompoundExpression) {
|
7488 | if (e.name === 'feature-state') {
|
7489 | return false;
|
7490 | }
|
7491 | }
|
7492 | let result = true;
|
7493 | e.eachChild(arg => {
|
7494 | if (result && !isStateConstant(arg)) {
|
7495 | result = false;
|
7496 | }
|
7497 | });
|
7498 | return result;
|
7499 | }
|
7500 | function isGlobalPropertyConstant(e, properties) {
|
7501 | if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) {
|
7502 | return false;
|
7503 | }
|
7504 | let result = true;
|
7505 | e.eachChild((arg) => {
|
7506 | if (result && !isGlobalPropertyConstant(arg, properties)) {
|
7507 | result = false;
|
7508 | }
|
7509 | });
|
7510 | return result;
|
7511 | }
|
7512 |
|
7513 | class Var {
|
7514 | constructor(name, boundExpression) {
|
7515 | this.type = boundExpression.type;
|
7516 | this.name = name;
|
7517 | this.boundExpression = boundExpression;
|
7518 | }
|
7519 | static parse(args, context) {
|
7520 | if (args.length !== 2 || typeof args[1] !== 'string')
|
7521 | return context.error('\'var\' expression requires exactly one string literal argument.');
|
7522 | const name = args[1];
|
7523 | if (!context.scope.has(name)) {
|
7524 | return context.error(`Unknown variable "${name}". Make sure "${name}" has been bound in an enclosing "let" expression before using it.`, 1);
|
7525 | }
|
7526 | return new Var(name, context.scope.get(name));
|
7527 | }
|
7528 | evaluate(ctx) {
|
7529 | return this.boundExpression.evaluate(ctx);
|
7530 | }
|
7531 | eachChild() { }
|
7532 | outputDefined() {
|
7533 | return false;
|
7534 | }
|
7535 | serialize() {
|
7536 | return ['var', this.name];
|
7537 | }
|
7538 | }
|
7539 |
|
7540 | /**
|
7541 | * State associated parsing at a given point in an expression tree.
|
7542 | * @private
|
7543 | */
|
7544 | class ParsingContext {
|
7545 | constructor(registry, path = [], expectedType, scope = new Scope(), errors = []) {
|
7546 | this.registry = registry;
|
7547 | this.path = path;
|
7548 | this.key = path.map(part => `[${part}]`).join('');
|
7549 | this.scope = scope;
|
7550 | this.errors = errors;
|
7551 | this.expectedType = expectedType;
|
7552 | }
|
7553 | /**
|
7554 | * @param expr the JSON expression to parse
|
7555 | * @param index the optional argument index if this expression is an argument of a parent expression that's being parsed
|
7556 | * @param options
|
7557 | * @param options.omitTypeAnnotations set true to omit inferred type annotations. Caller beware: with this option set, the parsed expression's type will NOT satisfy `expectedType` if it would normally be wrapped in an inferred annotation.
|
7558 | * @private
|
7559 | */
|
7560 | parse(expr, index, expectedType, bindings, options = {}) {
|
7561 | if (index) {
|
7562 | return this.concat(index, expectedType, bindings)._parse(expr, options);
|
7563 | }
|
7564 | return this._parse(expr, options);
|
7565 | }
|
7566 | _parse(expr, options) {
|
7567 | if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') {
|
7568 | expr = ['literal', expr];
|
7569 | }
|
7570 | function annotate(parsed, type, typeAnnotation) {
|
7571 | if (typeAnnotation === 'assert') {
|
7572 | return new Assertion(type, [parsed]);
|
7573 | }
|
7574 | else if (typeAnnotation === 'coerce') {
|
7575 | return new Coercion(type, [parsed]);
|
7576 | }
|
7577 | else {
|
7578 | return parsed;
|
7579 | }
|
7580 | }
|
7581 | if (Array.isArray(expr)) {
|
7582 | if (expr.length === 0) {
|
7583 | return this.error('Expected an array with at least one element. If you wanted a literal array, use ["literal", []].');
|
7584 | }
|
7585 | const op = expr[0];
|
7586 | if (typeof op !== 'string') {
|
7587 | this.error(`Expression name must be a string, but found ${typeof op} instead. If you wanted a literal array, use ["literal", [...]].`, 0);
|
7588 | return null;
|
7589 | }
|
7590 | const Expr = this.registry[op];
|
7591 | if (Expr) {
|
7592 | let parsed = Expr.parse(expr, this);
|
7593 | if (!parsed)
|
7594 | return null;
|
7595 | if (this.expectedType) {
|
7596 | const expected = this.expectedType;
|
7597 | const actual = parsed.type;
|
7598 | // When we expect a number, string, boolean, or array but have a value, wrap it in an assertion.
|
7599 | // When we expect a color or formatted string, but have a string or value, wrap it in a coercion.
|
7600 | // Otherwise, we do static type-checking.
|
7601 | //
|
7602 | // These behaviors are overridable for:
|
7603 | // * The "coalesce" operator, which needs to omit type annotations.
|
7604 | // * String-valued properties (e.g. `text-field`), where coercion is more convenient than assertion.
|
7605 | //
|
7606 | if ((expected.kind === 'string' || expected.kind === 'number' || expected.kind === 'boolean' || expected.kind === 'object' || expected.kind === 'array') && actual.kind === 'value') {
|
7607 | parsed = annotate(parsed, expected, options.typeAnnotation || 'assert');
|
7608 | }
|
7609 | else if ((expected.kind === 'color' || expected.kind === 'formatted' || expected.kind === 'resolvedImage') && (actual.kind === 'value' || actual.kind === 'string')) {
|
7610 | parsed = annotate(parsed, expected, options.typeAnnotation || 'coerce');
|
7611 | }
|
7612 | else if (this.checkSubtype(expected, actual)) {
|
7613 | return null;
|
7614 | }
|
7615 | }
|
7616 | // If an expression's arguments are all literals, we can evaluate
|
7617 | // it immediately and replace it with a literal value in the
|
7618 | // parsed/compiled result. Expressions that expect an image should
|
7619 | // not be resolved here so we can later get the available images.
|
7620 | if (!(parsed instanceof Literal) && (parsed.type.kind !== 'resolvedImage') && isConstant(parsed)) {
|
7621 | const ec = new EvaluationContext();
|
7622 | try {
|
7623 | parsed = new Literal(parsed.type, parsed.evaluate(ec));
|
7624 | }
|
7625 | catch (e) {
|
7626 | this.error(e.message);
|
7627 | return null;
|
7628 | }
|
7629 | }
|
7630 | return parsed;
|
7631 | }
|
7632 | return this.error(`Unknown expression "${op}". If you wanted a literal array, use ["literal", [...]].`, 0);
|
7633 | }
|
7634 | else if (typeof expr === 'undefined') {
|
7635 | return this.error('\'undefined\' value invalid. Use null instead.');
|
7636 | }
|
7637 | else if (typeof expr === 'object') {
|
7638 | return this.error('Bare objects invalid. Use ["literal", {...}] instead.');
|
7639 | }
|
7640 | else {
|
7641 | return this.error(`Expected an array, but found ${typeof expr} instead.`);
|
7642 | }
|
7643 | }
|
7644 | /**
|
7645 | * Returns a copy of this context suitable for parsing the subexpression at
|
7646 | * index `index`, optionally appending to 'let' binding map.
|
7647 | *
|
7648 | * Note that `errors` property, intended for collecting errors while
|
7649 | * parsing, is copied by reference rather than cloned.
|
7650 | * @private
|
7651 | */
|
7652 | concat(index, expectedType, bindings) {
|
7653 | const path = typeof index === 'number' ? this.path.concat(index) : this.path;
|
7654 | const scope = bindings ? this.scope.concat(bindings) : this.scope;
|
7655 | return new ParsingContext(this.registry, path, expectedType || null, scope, this.errors);
|
7656 | }
|
7657 | /**
|
7658 | * Push a parsing (or type checking) error into the `this.errors`
|
7659 | * @param error The message
|
7660 | * @param keys Optionally specify the source of the error at a child
|
7661 | * of the current expression at `this.key`.
|
7662 | * @private
|
7663 | */
|
7664 | error(error, ...keys) {
|
7665 | const key = `${this.key}${keys.map(k => `[${k}]`).join('')}`;
|
7666 | this.errors.push(new ParsingError(key, error));
|
7667 | }
|
7668 | /**
|
7669 | * Returns null if `t` is a subtype of `expected`; otherwise returns an
|
7670 | * error message and also pushes it to `this.errors`.
|
7671 | */
|
7672 | checkSubtype(expected, t) {
|
7673 | const error = checkSubtype(expected, t);
|
7674 | if (error)
|
7675 | this.error(error);
|
7676 | return error;
|
7677 | }
|
7678 | }
|
7679 | var ParsingContext$1 = ParsingContext;
|
7680 | function isConstant(expression) {
|
7681 | if (expression instanceof Var) {
|
7682 | return isConstant(expression.boundExpression);
|
7683 | }
|
7684 | else if (expression instanceof CompoundExpression && expression.name === 'error') {
|
7685 | return false;
|
7686 | }
|
7687 | else if (expression instanceof CollatorExpression) {
|
7688 | // Although the results of a Collator expression with fixed arguments
|
7689 | // generally shouldn't change between executions, we can't serialize them
|
7690 | // as constant expressions because results change based on environment.
|
7691 | return false;
|
7692 | }
|
7693 | else if (expression instanceof Within) {
|
7694 | return false;
|
7695 | }
|
7696 | const isTypeAnnotation = expression instanceof Coercion ||
|
7697 | expression instanceof Assertion;
|
7698 | let childrenConstant = true;
|
7699 | expression.eachChild(child => {
|
7700 | // We can _almost_ assume that if `expressions` children are constant,
|
7701 | // they would already have been evaluated to Literal values when they
|
7702 | // were parsed. Type annotations are the exception, because they might
|
7703 | // have been inferred and added after a child was parsed.
|
7704 | // So we recurse into isConstant() for the children of type annotations,
|
7705 | // but otherwise simply check whether they are Literals.
|
7706 | if (isTypeAnnotation) {
|
7707 | childrenConstant = childrenConstant && isConstant(child);
|
7708 | }
|
7709 | else {
|
7710 | childrenConstant = childrenConstant && child instanceof Literal;
|
7711 | }
|
7712 | });
|
7713 | if (!childrenConstant) {
|
7714 | return false;
|
7715 | }
|
7716 | return isFeatureConstant(expression) &&
|
7717 | isGlobalPropertyConstant(expression, ['zoom', 'heatmap-density', 'line-progress', 'accumulated', 'is-supported-script']);
|
7718 | }
|
7719 |
|
7720 | /**
|
7721 | * Returns the index of the last stop <= input, or 0 if it doesn't exist.
|
7722 | * @private
|
7723 | */
|
7724 | function findStopLessThanOrEqualTo(stops, input) {
|
7725 | const lastIndex = stops.length - 1;
|
7726 | let lowerIndex = 0;
|
7727 | let upperIndex = lastIndex;
|
7728 | let currentIndex = 0;
|
7729 | let currentValue, nextValue;
|
7730 | while (lowerIndex <= upperIndex) {
|
7731 | currentIndex = Math.floor((lowerIndex + upperIndex) / 2);
|
7732 | currentValue = stops[currentIndex];
|
7733 | nextValue = stops[currentIndex + 1];
|
7734 | if (currentValue <= input) {
|
7735 | if (currentIndex === lastIndex || input < nextValue) { // Search complete
|
7736 | return currentIndex;
|
7737 | }
|
7738 | lowerIndex = currentIndex + 1;
|
7739 | }
|
7740 | else if (currentValue > input) {
|
7741 | upperIndex = currentIndex - 1;
|
7742 | }
|
7743 | else {
|
7744 | throw new RuntimeError('Input is not a number.');
|
7745 | }
|
7746 | }
|
7747 | return 0;
|
7748 | }
|
7749 |
|
7750 | class Step {
|
7751 | constructor(type, input, stops) {
|
7752 | this.type = type;
|
7753 | this.input = input;
|
7754 | this.labels = [];
|
7755 | this.outputs = [];
|
7756 | for (const [label, expression] of stops) {
|
7757 | this.labels.push(label);
|
7758 | this.outputs.push(expression);
|
7759 | }
|
7760 | }
|
7761 | static parse(args, context) {
|
7762 | if (args.length - 1 < 4) {
|
7763 | return context.error(`Expected at least 4 arguments, but found only ${args.length - 1}.`);
|
7764 | }
|
7765 | if ((args.length - 1) % 2 !== 0) {
|
7766 | return context.error('Expected an even number of arguments.');
|
7767 | }
|
7768 | const input = context.parse(args[1], 1, NumberType);
|
7769 | if (!input)
|
7770 | return null;
|
7771 | const stops = [];
|
7772 | let outputType = null;
|
7773 | if (context.expectedType && context.expectedType.kind !== 'value') {
|
7774 | outputType = context.expectedType;
|
7775 | }
|
7776 | for (let i = 1; i < args.length; i += 2) {
|
7777 | const label = i === 1 ? -Infinity : args[i];
|
7778 | const value = args[i + 1];
|
7779 | const labelKey = i;
|
7780 | const valueKey = i + 1;
|
7781 | if (typeof label !== 'number') {
|
7782 | return context.error('Input/output pairs for "step" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey);
|
7783 | }
|
7784 | if (stops.length && stops[stops.length - 1][0] >= label) {
|
7785 | return context.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.', labelKey);
|
7786 | }
|
7787 | const parsed = context.parse(value, valueKey, outputType);
|
7788 | if (!parsed)
|
7789 | return null;
|
7790 | outputType = outputType || parsed.type;
|
7791 | stops.push([label, parsed]);
|
7792 | }
|
7793 | return new Step(outputType, input, stops);
|
7794 | }
|
7795 | evaluate(ctx) {
|
7796 | const labels = this.labels;
|
7797 | const outputs = this.outputs;
|
7798 | if (labels.length === 1) {
|
7799 | return outputs[0].evaluate(ctx);
|
7800 | }
|
7801 | const value = this.input.evaluate(ctx);
|
7802 | if (value <= labels[0]) {
|
7803 | return outputs[0].evaluate(ctx);
|
7804 | }
|
7805 | const stopCount = labels.length;
|
7806 | if (value >= labels[stopCount - 1]) {
|
7807 | return outputs[stopCount - 1].evaluate(ctx);
|
7808 | }
|
7809 | const index = findStopLessThanOrEqualTo(labels, value);
|
7810 | return outputs[index].evaluate(ctx);
|
7811 | }
|
7812 | eachChild(fn) {
|
7813 | fn(this.input);
|
7814 | for (const expression of this.outputs) {
|
7815 | fn(expression);
|
7816 | }
|
7817 | }
|
7818 | outputDefined() {
|
7819 | return this.outputs.every(out => out.outputDefined());
|
7820 | }
|
7821 | serialize() {
|
7822 | const serialized = ['step', this.input.serialize()];
|
7823 | for (let i = 0; i < this.labels.length; i++) {
|
7824 | if (i > 0) {
|
7825 | serialized.push(this.labels[i]);
|
7826 | }
|
7827 | serialized.push(this.outputs[i].serialize());
|
7828 | }
|
7829 | return serialized;
|
7830 | }
|
7831 | }
|
7832 |
|
7833 | function number(a, b, t) {
|
7834 | return (a * (1 - t)) + (b * t);
|
7835 | }
|
7836 | function color(from, to, t) {
|
7837 | return new Color(number(from.r, to.r, t), number(from.g, to.g, t), number(from.b, to.b, t), number(from.a, to.a, t));
|
7838 | }
|
7839 | function array(from, to, t) {
|
7840 | return from.map((d, i) => {
|
7841 | return number(d, to[i], t);
|
7842 | });
|
7843 | }
|
7844 |
|
7845 | var interpolate = /*#__PURE__*/Object.freeze({
|
7846 | __proto__: null,
|
7847 | number: number,
|
7848 | color: color,
|
7849 | array: array
|
7850 | });
|
7851 |
|
7852 | // Constants
|
7853 | const Xn = 0.950470, // D65 standard referent
|
7854 | Yn = 1, Zn = 1.088830, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1, deg2rad = Math.PI / 180, rad2deg = 180 / Math.PI;
|
7855 | // Utilities
|
7856 | function xyz2lab(t) {
|
7857 | return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
|
7858 | }
|
7859 | function lab2xyz(t) {
|
7860 | return t > t1 ? t * t * t : t2 * (t - t0);
|
7861 | }
|
7862 | function xyz2rgb(x) {
|
7863 | return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
|
7864 | }
|
7865 | function rgb2xyz(x) {
|
7866 | x /= 255;
|
7867 | return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
|
7868 | }
|
7869 | // LAB
|
7870 | function rgbToLab(rgbColor) {
|
7871 | const b = rgb2xyz(rgbColor.r), a = rgb2xyz(rgbColor.g), l = rgb2xyz(rgbColor.b), x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn), y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn), z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);
|
7872 | return {
|
7873 | l: 116 * y - 16,
|
7874 | a: 500 * (x - y),
|
7875 | b: 200 * (y - z),
|
7876 | alpha: rgbColor.a
|
7877 | };
|
7878 | }
|
7879 | function labToRgb(labColor) {
|
7880 | let y = (labColor.l + 16) / 116, x = isNaN(labColor.a) ? y : y + labColor.a / 500, z = isNaN(labColor.b) ? y : y - labColor.b / 200;
|
7881 | y = Yn * lab2xyz(y);
|
7882 | x = Xn * lab2xyz(x);
|
7883 | z = Zn * lab2xyz(z);
|
7884 | return new Color(xyz2rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB
|
7885 | xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z), xyz2rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z), labColor.alpha);
|
7886 | }
|
7887 | function interpolateLab(from, to, t) {
|
7888 | return {
|
7889 | l: number(from.l, to.l, t),
|
7890 | a: number(from.a, to.a, t),
|
7891 | b: number(from.b, to.b, t),
|
7892 | alpha: number(from.alpha, to.alpha, t)
|
7893 | };
|
7894 | }
|
7895 | // HCL
|
7896 | function rgbToHcl(rgbColor) {
|
7897 | const { l, a, b } = rgbToLab(rgbColor);
|
7898 | const h = Math.atan2(b, a) * rad2deg;
|
7899 | return {
|
7900 | h: h < 0 ? h + 360 : h,
|
7901 | c: Math.sqrt(a * a + b * b),
|
7902 | l,
|
7903 | alpha: rgbColor.a
|
7904 | };
|
7905 | }
|
7906 | function hclToRgb(hclColor) {
|
7907 | const h = hclColor.h * deg2rad, c = hclColor.c, l = hclColor.l;
|
7908 | return labToRgb({
|
7909 | l,
|
7910 | a: Math.cos(h) * c,
|
7911 | b: Math.sin(h) * c,
|
7912 | alpha: hclColor.alpha
|
7913 | });
|
7914 | }
|
7915 | function interpolateHue(a, b, t) {
|
7916 | const d = b - a;
|
7917 | return a + t * (d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d);
|
7918 | }
|
7919 | function interpolateHcl(from, to, t) {
|
7920 | return {
|
7921 | h: interpolateHue(from.h, to.h, t),
|
7922 | c: number(from.c, to.c, t),
|
7923 | l: number(from.l, to.l, t),
|
7924 | alpha: number(from.alpha, to.alpha, t)
|
7925 | };
|
7926 | }
|
7927 | const lab = {
|
7928 | forward: rgbToLab,
|
7929 | reverse: labToRgb,
|
7930 | interpolate: interpolateLab
|
7931 | };
|
7932 | const hcl = {
|
7933 | forward: rgbToHcl,
|
7934 | reverse: hclToRgb,
|
7935 | interpolate: interpolateHcl
|
7936 | };
|
7937 |
|
7938 | var colorSpaces = /*#__PURE__*/Object.freeze({
|
7939 | __proto__: null,
|
7940 | lab: lab,
|
7941 | hcl: hcl
|
7942 | });
|
7943 |
|
7944 | class Interpolate {
|
7945 | constructor(type, operator, interpolation, input, stops) {
|
7946 | this.type = type;
|
7947 | this.operator = operator;
|
7948 | this.interpolation = interpolation;
|
7949 | this.input = input;
|
7950 | this.labels = [];
|
7951 | this.outputs = [];
|
7952 | for (const [label, expression] of stops) {
|
7953 | this.labels.push(label);
|
7954 | this.outputs.push(expression);
|
7955 | }
|
7956 | }
|
7957 | static interpolationFactor(interpolation, input, lower, upper) {
|
7958 | let t = 0;
|
7959 | if (interpolation.name === 'exponential') {
|
7960 | t = exponentialInterpolation(input, interpolation.base, lower, upper);
|
7961 | }
|
7962 | else if (interpolation.name === 'linear') {
|
7963 | t = exponentialInterpolation(input, 1, lower, upper);
|
7964 | }
|
7965 | else if (interpolation.name === 'cubic-bezier') {
|
7966 | const c = interpolation.controlPoints;
|
7967 | const ub = new unitbezier(c[0], c[1], c[2], c[3]);
|
7968 | t = ub.solve(exponentialInterpolation(input, 1, lower, upper));
|
7969 | }
|
7970 | return t;
|
7971 | }
|
7972 | static parse(args, context) {
|
7973 | let [operator, interpolation, input, ...rest] = args;
|
7974 | if (!Array.isArray(interpolation) || interpolation.length === 0) {
|
7975 | return context.error('Expected an interpolation type expression.', 1);
|
7976 | }
|
7977 | if (interpolation[0] === 'linear') {
|
7978 | interpolation = { name: 'linear' };
|
7979 | }
|
7980 | else if (interpolation[0] === 'exponential') {
|
7981 | const base = interpolation[1];
|
7982 | if (typeof base !== 'number')
|
7983 | return context.error('Exponential interpolation requires a numeric base.', 1, 1);
|
7984 | interpolation = {
|
7985 | name: 'exponential',
|
7986 | base
|
7987 | };
|
7988 | }
|
7989 | else if (interpolation[0] === 'cubic-bezier') {
|
7990 | const controlPoints = interpolation.slice(1);
|
7991 | if (controlPoints.length !== 4 ||
|
7992 | controlPoints.some(t => typeof t !== 'number' || t < 0 || t > 1)) {
|
7993 | return context.error('Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.', 1);
|
7994 | }
|
7995 | interpolation = {
|
7996 | name: 'cubic-bezier',
|
7997 | controlPoints: controlPoints
|
7998 | };
|
7999 | }
|
8000 | else {
|
8001 | return context.error(`Unknown interpolation type ${String(interpolation[0])}`, 1, 0);
|
8002 | }
|
8003 | if (args.length - 1 < 4) {
|
8004 | return context.error(`Expected at least 4 arguments, but found only ${args.length - 1}.`);
|
8005 | }
|
8006 | if ((args.length - 1) % 2 !== 0) {
|
8007 | return context.error('Expected an even number of arguments.');
|
8008 | }
|
8009 | input = context.parse(input, 2, NumberType);
|
8010 | if (!input)
|
8011 | return null;
|
8012 | const stops = [];
|
8013 | let outputType = null;
|
8014 | if (operator === 'interpolate-hcl' || operator === 'interpolate-lab') {
|
8015 | outputType = ColorType;
|
8016 | }
|
8017 | else if (context.expectedType && context.expectedType.kind !== 'value') {
|
8018 | outputType = context.expectedType;
|
8019 | }
|
8020 | for (let i = 0; i < rest.length; i += 2) {
|
8021 | const label = rest[i];
|
8022 | const value = rest[i + 1];
|
8023 | const labelKey = i + 3;
|
8024 | const valueKey = i + 4;
|
8025 | if (typeof label !== 'number') {
|
8026 | return context.error('Input/output pairs for "interpolate" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey);
|
8027 | }
|
8028 | if (stops.length && stops[stops.length - 1][0] >= label) {
|
8029 | return context.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.', labelKey);
|
8030 | }
|
8031 | const parsed = context.parse(value, valueKey, outputType);
|
8032 | if (!parsed)
|
8033 | return null;
|
8034 | outputType = outputType || parsed.type;
|
8035 | stops.push([label, parsed]);
|
8036 | }
|
8037 | if (outputType.kind !== 'number' &&
|
8038 | outputType.kind !== 'color' &&
|
8039 | !(outputType.kind === 'array' &&
|
8040 | outputType.itemType.kind === 'number' &&
|
8041 | typeof outputType.N === 'number')) {
|
8042 | return context.error(`Type ${toString$1(outputType)} is not interpolatable.`);
|
8043 | }
|
8044 | return new Interpolate(outputType, operator, interpolation, input, stops);
|
8045 | }
|
8046 | evaluate(ctx) {
|
8047 | const labels = this.labels;
|
8048 | const outputs = this.outputs;
|
8049 | if (labels.length === 1) {
|
8050 | return outputs[0].evaluate(ctx);
|
8051 | }
|
8052 | const value = this.input.evaluate(ctx);
|
8053 | if (value <= labels[0]) {
|
8054 | return outputs[0].evaluate(ctx);
|
8055 | }
|
8056 | const stopCount = labels.length;
|
8057 | if (value >= labels[stopCount - 1]) {
|
8058 | return outputs[stopCount - 1].evaluate(ctx);
|
8059 | }
|
8060 | const index = findStopLessThanOrEqualTo(labels, value);
|
8061 | const lower = labels[index];
|
8062 | const upper = labels[index + 1];
|
8063 | const t = Interpolate.interpolationFactor(this.interpolation, value, lower, upper);
|
8064 | const outputLower = outputs[index].evaluate(ctx);
|
8065 | const outputUpper = outputs[index + 1].evaluate(ctx);
|
8066 | if (this.operator === 'interpolate') {
|
8067 | return interpolate[this.type.kind.toLowerCase()](outputLower, outputUpper, t); // eslint-disable-line import/namespace
|
8068 | }
|
8069 | else if (this.operator === 'interpolate-hcl') {
|
8070 | return hcl.reverse(hcl.interpolate(hcl.forward(outputLower), hcl.forward(outputUpper), t));
|
8071 | }
|
8072 | else {
|
8073 | return lab.reverse(lab.interpolate(lab.forward(outputLower), lab.forward(outputUpper), t));
|
8074 | }
|
8075 | }
|
8076 | eachChild(fn) {
|
8077 | fn(this.input);
|
8078 | for (const expression of this.outputs) {
|
8079 | fn(expression);
|
8080 | }
|
8081 | }
|
8082 | outputDefined() {
|
8083 | return this.outputs.every(out => out.outputDefined());
|
8084 | }
|
8085 | serialize() {
|
8086 | let interpolation;
|
8087 | if (this.interpolation.name === 'linear') {
|
8088 | interpolation = ['linear'];
|
8089 | }
|
8090 | else if (this.interpolation.name === 'exponential') {
|
8091 | if (this.interpolation.base === 1) {
|
8092 | interpolation = ['linear'];
|
8093 | }
|
8094 | else {
|
8095 | interpolation = ['exponential', this.interpolation.base];
|
8096 | }
|
8097 | }
|
8098 | else {
|
8099 | interpolation = ['cubic-bezier'].concat(this.interpolation.controlPoints);
|
8100 | }
|
8101 | const serialized = [this.operator, interpolation, this.input.serialize()];
|
8102 | for (let i = 0; i < this.labels.length; i++) {
|
8103 | serialized.push(this.labels[i], this.outputs[i].serialize());
|
8104 | }
|
8105 | return serialized;
|
8106 | }
|
8107 | }
|
8108 | /**
|
8109 | * Returns a ratio that can be used to interpolate between exponential function
|
8110 | * stops.
|
8111 | * How it works: Two consecutive stop values define a (scaled and shifted) exponential function `f(x) = a * base^x + b`, where `base` is the user-specified base,
|
8112 | * and `a` and `b` are constants affording sufficient degrees of freedom to fit
|
8113 | * the function to the given stops.
|
8114 | *
|
8115 | * Here's a bit of algebra that lets us compute `f(x)` directly from the stop
|
8116 | * values without explicitly solving for `a` and `b`:
|
8117 | *
|
8118 | * First stop value: `f(x0) = y0 = a * base^x0 + b`
|
8119 | * Second stop value: `f(x1) = y1 = a * base^x1 + b`
|
8120 | * => `y1 - y0 = a(base^x1 - base^x0)`
|
8121 | * => `a = (y1 - y0)/(base^x1 - base^x0)`
|
8122 | *
|
8123 | * Desired value: `f(x) = y = a * base^x + b`
|
8124 | * => `f(x) = y0 + a * (base^x - base^x0)`
|
8125 | *
|
8126 | * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a
|
8127 | * little algebra:
|
8128 | * ```
|
8129 | * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0)
|
8130 | * = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0)
|
8131 | * ```
|
8132 | *
|
8133 | * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have
|
8134 | * `f(x) = y0 + (y1 - y0) * ratio`. In other words, `ratio` may be treated as
|
8135 | * an interpolation factor between the two stops' output values.
|
8136 | *
|
8137 | * (Note: a slightly different form for `ratio`,
|
8138 | * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer
|
8139 | * expensive `Math.pow()` operations.)
|
8140 | *
|
8141 | * @private
|
8142 | */
|
8143 | function exponentialInterpolation(input, base, lowerValue, upperValue) {
|
8144 | const difference = upperValue - lowerValue;
|
8145 | const progress = input - lowerValue;
|
8146 | if (difference === 0) {
|
8147 | return 0;
|
8148 | }
|
8149 | else if (base === 1) {
|
8150 | return progress / difference;
|
8151 | }
|
8152 | else {
|
8153 | return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);
|
8154 | }
|
8155 | }
|
8156 |
|
8157 | class Coalesce {
|
8158 | constructor(type, args) {
|
8159 | this.type = type;
|
8160 | this.args = args;
|
8161 | }
|
8162 | static parse(args, context) {
|
8163 | if (args.length < 2) {
|
8164 | return context.error('Expectected at least one argument.');
|
8165 | }
|
8166 | let outputType = null;
|
8167 | const expectedType = context.expectedType;
|
8168 | if (expectedType && expectedType.kind !== 'value') {
|
8169 | outputType = expectedType;
|
8170 | }
|
8171 | const parsedArgs = [];
|
8172 | for (const arg of args.slice(1)) {
|
8173 | const parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, { typeAnnotation: 'omit' });
|
8174 | if (!parsed)
|
8175 | return null;
|
8176 | outputType = outputType || parsed.type;
|
8177 | parsedArgs.push(parsed);
|
8178 | }
|
8179 | assert$1(outputType);
|
8180 | // Above, we parse arguments without inferred type annotation so that
|
8181 | // they don't produce a runtime error for `null` input, which would
|
8182 | // preempt the desired null-coalescing behavior.
|
8183 | // Thus, if any of our arguments would have needed an annotation, we
|
8184 | // need to wrap the enclosing coalesce expression with it instead.
|
8185 | const needsAnnotation = expectedType &&
|
8186 | parsedArgs.some(arg => checkSubtype(expectedType, arg.type));
|
8187 | return needsAnnotation ?
|
8188 | new Coalesce(ValueType, parsedArgs) :
|
8189 | new Coalesce(outputType, parsedArgs);
|
8190 | }
|
8191 | evaluate(ctx) {
|
8192 | let result = null;
|
8193 | let argCount = 0;
|
8194 | let requestedImageName;
|
8195 | for (const arg of this.args) {
|
8196 | argCount++;
|
8197 | result = arg.evaluate(ctx);
|
8198 | // we need to keep track of the first requested image in a coalesce statement
|
8199 | // if coalesce can't find a valid image, we return the first image name so styleimagemissing can fire
|
8200 | if (result && result instanceof ResolvedImage && !result.available) {
|
8201 | if (!requestedImageName) {
|
8202 | requestedImageName = result.name;
|
8203 | }
|
8204 | result = null;
|
8205 | if (argCount === this.args.length) {
|
8206 | result = requestedImageName;
|
8207 | }
|
8208 | }
|
8209 | if (result !== null)
|
8210 | break;
|
8211 | }
|
8212 | return result;
|
8213 | }
|
8214 | eachChild(fn) {
|
8215 | this.args.forEach(fn);
|
8216 | }
|
8217 | outputDefined() {
|
8218 | return this.args.every(arg => arg.outputDefined());
|
8219 | }
|
8220 | serialize() {
|
8221 | const serialized = ['coalesce'];
|
8222 | this.eachChild(child => { serialized.push(child.serialize()); });
|
8223 | return serialized;
|
8224 | }
|
8225 | }
|
8226 |
|
8227 | class Let {
|
8228 | constructor(bindings, result) {
|
8229 | this.type = result.type;
|
8230 | this.bindings = [].concat(bindings);
|
8231 | this.result = result;
|
8232 | }
|
8233 | evaluate(ctx) {
|
8234 | return this.result.evaluate(ctx);
|
8235 | }
|
8236 | eachChild(fn) {
|
8237 | for (const binding of this.bindings) {
|
8238 | fn(binding[1]);
|
8239 | }
|
8240 | fn(this.result);
|
8241 | }
|
8242 | static parse(args, context) {
|
8243 | if (args.length < 4)
|
8244 | return context.error(`Expected at least 3 arguments, but found ${args.length - 1} instead.`);
|
8245 | const bindings = [];
|
8246 | for (let i = 1; i < args.length - 1; i += 2) {
|
8247 | const name = args[i];
|
8248 | if (typeof name !== 'string') {
|
8249 | return context.error(`Expected string, but found ${typeof name} instead.`, i);
|
8250 | }
|
8251 | if (/[^a-zA-Z0-9_]/.test(name)) {
|
8252 | return context.error('Variable names must contain only alphanumeric characters or \'_\'.', i);
|
8253 | }
|
8254 | const value = context.parse(args[i + 1], i + 1);
|
8255 | if (!value)
|
8256 | return null;
|
8257 | bindings.push([name, value]);
|
8258 | }
|
8259 | const result = context.parse(args[args.length - 1], args.length - 1, context.expectedType, bindings);
|
8260 | if (!result)
|
8261 | return null;
|
8262 | return new Let(bindings, result);
|
8263 | }
|
8264 | outputDefined() {
|
8265 | return this.result.outputDefined();
|
8266 | }
|
8267 | serialize() {
|
8268 | const serialized = ['let'];
|
8269 | for (const [name, expr] of this.bindings) {
|
8270 | serialized.push(name, expr.serialize());
|
8271 | }
|
8272 | serialized.push(this.result.serialize());
|
8273 | return serialized;
|
8274 | }
|
8275 | }
|
8276 |
|
8277 | class At {
|
8278 | constructor(type, index, input) {
|
8279 | this.type = type;
|
8280 | this.index = index;
|
8281 | this.input = input;
|
8282 | }
|
8283 | static parse(args, context) {
|
8284 | if (args.length !== 3)
|
8285 | return context.error(`Expected 2 arguments, but found ${args.length - 1} instead.`);
|
8286 | const index = context.parse(args[1], 1, NumberType);
|
8287 | const input = context.parse(args[2], 2, array$1(context.expectedType || ValueType));
|
8288 | if (!index || !input)
|
8289 | return null;
|
8290 | const t = input.type;
|
8291 | return new At(t.itemType, index, input);
|
8292 | }
|
8293 | evaluate(ctx) {
|
8294 | const index = this.index.evaluate(ctx);
|
8295 | const array = this.input.evaluate(ctx);
|
8296 | if (index < 0) {
|
8297 | throw new RuntimeError(`Array index out of bounds: ${index} < 0.`);
|
8298 | }
|
8299 | if (index >= array.length) {
|
8300 | throw new RuntimeError(`Array index out of bounds: ${index} > ${array.length - 1}.`);
|
8301 | }
|
8302 | if (index !== Math.floor(index)) {
|
8303 | throw new RuntimeError(`Array index must be an integer, but found ${index} instead.`);
|
8304 | }
|
8305 | return array[index];
|
8306 | }
|
8307 | eachChild(fn) {
|
8308 | fn(this.index);
|
8309 | fn(this.input);
|
8310 | }
|
8311 | outputDefined() {
|
8312 | return false;
|
8313 | }
|
8314 | serialize() {
|
8315 | return ['at', this.index.serialize(), this.input.serialize()];
|
8316 | }
|
8317 | }
|
8318 |
|
8319 | class In {
|
8320 | constructor(needle, haystack) {
|
8321 | this.type = BooleanType;
|
8322 | this.needle = needle;
|
8323 | this.haystack = haystack;
|
8324 | }
|
8325 | static parse(args, context) {
|
8326 | if (args.length !== 3) {
|
8327 | return context.error(`Expected 2 arguments, but found ${args.length - 1} instead.`);
|
8328 | }
|
8329 | const needle = context.parse(args[1], 1, ValueType);
|
8330 | const haystack = context.parse(args[2], 2, ValueType);
|
8331 | if (!needle || !haystack)
|
8332 | return null;
|
8333 | if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) {
|
8334 | return context.error(`Expected first argument to be of type boolean, string, number or null, but found ${toString$1(needle.type)} instead`);
|
8335 | }
|
8336 | return new In(needle, haystack);
|
8337 | }
|
8338 | evaluate(ctx) {
|
8339 | const needle = this.needle.evaluate(ctx);
|
8340 | const haystack = this.haystack.evaluate(ctx);
|
8341 | if (!haystack)
|
8342 | return false;
|
8343 | if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) {
|
8344 | throw new RuntimeError(`Expected first argument to be of type boolean, string, number or null, but found ${toString$1(typeOf(needle))} instead.`);
|
8345 | }
|
8346 | if (!isValidNativeType(haystack, ['string', 'array'])) {
|
8347 | throw new RuntimeError(`Expected second argument to be of type array or string, but found ${toString$1(typeOf(haystack))} instead.`);
|
8348 | }
|
8349 | return haystack.indexOf(needle) >= 0;
|
8350 | }
|
8351 | eachChild(fn) {
|
8352 | fn(this.needle);
|
8353 | fn(this.haystack);
|
8354 | }
|
8355 | outputDefined() {
|
8356 | return true;
|
8357 | }
|
8358 | serialize() {
|
8359 | return ['in', this.needle.serialize(), this.haystack.serialize()];
|
8360 | }
|
8361 | }
|
8362 |
|
8363 | class IndexOf {
|
8364 | constructor(needle, haystack, fromIndex) {
|
8365 | this.type = NumberType;
|
8366 | this.needle = needle;
|
8367 | this.haystack = haystack;
|
8368 | this.fromIndex = fromIndex;
|
8369 | }
|
8370 | static parse(args, context) {
|
8371 | if (args.length <= 2 || args.length >= 5) {
|
8372 | return context.error(`Expected 3 or 4 arguments, but found ${args.length - 1} instead.`);
|
8373 | }
|
8374 | const needle = context.parse(args[1], 1, ValueType);
|
8375 | const haystack = context.parse(args[2], 2, ValueType);
|
8376 | if (!needle || !haystack)
|
8377 | return null;
|
8378 | if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) {
|
8379 | return context.error(`Expected first argument to be of type boolean, string, number or null, but found ${toString$1(needle.type)} instead`);
|
8380 | }
|
8381 | if (args.length === 4) {
|
8382 | const fromIndex = context.parse(args[3], 3, NumberType);
|
8383 | if (!fromIndex)
|
8384 | return null;
|
8385 | return new IndexOf(needle, haystack, fromIndex);
|
8386 | }
|
8387 | else {
|
8388 | return new IndexOf(needle, haystack);
|
8389 | }
|
8390 | }
|
8391 | evaluate(ctx) {
|
8392 | const needle = this.needle.evaluate(ctx);
|
8393 | const haystack = this.haystack.evaluate(ctx);
|
8394 | if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) {
|
8395 | throw new RuntimeError(`Expected first argument to be of type boolean, string, number or null, but found ${toString$1(typeOf(needle))} instead.`);
|
8396 | }
|
8397 | if (!isValidNativeType(haystack, ['string', 'array'])) {
|
8398 | throw new RuntimeError(`Expected second argument to be of type array or string, but found ${toString$1(typeOf(haystack))} instead.`);
|
8399 | }
|
8400 | if (this.fromIndex) {
|
8401 | const fromIndex = this.fromIndex.evaluate(ctx);
|
8402 | return haystack.indexOf(needle, fromIndex);
|
8403 | }
|
8404 | return haystack.indexOf(needle);
|
8405 | }
|
8406 | eachChild(fn) {
|
8407 | fn(this.needle);
|
8408 | fn(this.haystack);
|
8409 | if (this.fromIndex) {
|
8410 | fn(this.fromIndex);
|
8411 | }
|
8412 | }
|
8413 | outputDefined() {
|
8414 | return false;
|
8415 | }
|
8416 | serialize() {
|
8417 | if (this.fromIndex != null && this.fromIndex !== undefined) {
|
8418 | const fromIndex = this.fromIndex.serialize();
|
8419 | return ['index-of', this.needle.serialize(), this.haystack.serialize(), fromIndex];
|
8420 | }
|
8421 | return ['index-of', this.needle.serialize(), this.haystack.serialize()];
|
8422 | }
|
8423 | }
|
8424 |
|
8425 | class Match {
|
8426 | constructor(inputType, outputType, input, cases, outputs, otherwise) {
|
8427 | this.inputType = inputType;
|
8428 | this.type = outputType;
|
8429 | this.input = input;
|
8430 | this.cases = cases;
|
8431 | this.outputs = outputs;
|
8432 | this.otherwise = otherwise;
|
8433 | }
|
8434 | static parse(args, context) {
|
8435 | if (args.length < 5)
|
8436 | return context.error(`Expected at least 4 arguments, but found only ${args.length - 1}.`);
|
8437 | if (args.length % 2 !== 1)
|
8438 | return context.error('Expected an even number of arguments.');
|
8439 | let inputType;
|
8440 | let outputType;
|
8441 | if (context.expectedType && context.expectedType.kind !== 'value') {
|
8442 | outputType = context.expectedType;
|
8443 | }
|
8444 | const cases = {};
|
8445 | const outputs = [];
|
8446 | for (let i = 2; i < args.length - 1; i += 2) {
|
8447 | let labels = args[i];
|
8448 | const value = args[i + 1];
|
8449 | if (!Array.isArray(labels)) {
|
8450 | labels = [labels];
|
8451 | }
|
8452 | const labelContext = context.concat(i);
|
8453 | if (labels.length === 0) {
|
8454 | return labelContext.error('Expected at least one branch label.');
|
8455 | }
|
8456 | for (const label of labels) {
|
8457 | if (typeof label !== 'number' && typeof label !== 'string') {
|
8458 | return labelContext.error('Branch labels must be numbers or strings.');
|
8459 | }
|
8460 | else if (typeof label === 'number' && Math.abs(label) > Number.MAX_SAFE_INTEGER) {
|
8461 | return labelContext.error(`Branch labels must be integers no larger than ${Number.MAX_SAFE_INTEGER}.`);
|
8462 | }
|
8463 | else if (typeof label === 'number' && Math.floor(label) !== label) {
|
8464 | return labelContext.error('Numeric branch labels must be integer values.');
|
8465 | }
|
8466 | else if (!inputType) {
|
8467 | inputType = typeOf(label);
|
8468 | }
|
8469 | else if (labelContext.checkSubtype(inputType, typeOf(label))) {
|
8470 | return null;
|
8471 | }
|
8472 | if (typeof cases[String(label)] !== 'undefined') {
|
8473 | return labelContext.error('Branch labels must be unique.');
|
8474 | }
|
8475 | cases[String(label)] = outputs.length;
|
8476 | }
|
8477 | const result = context.parse(value, i, outputType);
|
8478 | if (!result)
|
8479 | return null;
|
8480 | outputType = outputType || result.type;
|
8481 | outputs.push(result);
|
8482 | }
|
8483 | const input = context.parse(args[1], 1, ValueType);
|
8484 | if (!input)
|
8485 | return null;
|
8486 | const otherwise = context.parse(args[args.length - 1], args.length - 1, outputType);
|
8487 | if (!otherwise)
|
8488 | return null;
|
8489 | assert$1(inputType && outputType);
|
8490 | if (input.type.kind !== 'value' && context.concat(1).checkSubtype(inputType, input.type)) {
|
8491 | return null;
|
8492 | }
|
8493 | return new Match(inputType, outputType, input, cases, outputs, otherwise);
|
8494 | }
|
8495 | evaluate(ctx) {
|
8496 | const input = this.input.evaluate(ctx);
|
8497 | const output = (typeOf(input) === this.inputType && this.outputs[this.cases[input]]) || this.otherwise;
|
8498 | return output.evaluate(ctx);
|
8499 | }
|
8500 | eachChild(fn) {
|
8501 | fn(this.input);
|
8502 | this.outputs.forEach(fn);
|
8503 | fn(this.otherwise);
|
8504 | }
|
8505 | outputDefined() {
|
8506 | return this.outputs.every(out => out.outputDefined()) && this.otherwise.outputDefined();
|
8507 | }
|
8508 | serialize() {
|
8509 | const serialized = ['match', this.input.serialize()];
|
8510 | // Sort so serialization has an arbitrary defined order, even though
|
8511 | // branch order doesn't affect evaluation
|
8512 | const sortedLabels = Object.keys(this.cases).sort();
|
8513 | // Group branches by unique match expression to support condensed
|
8514 | // serializations of the form [case1, case2, ...] -> matchExpression
|
8515 | const groupedByOutput = [];
|
8516 | const outputLookup = {}; // lookup index into groupedByOutput for a given output expression
|
8517 | for (const label of sortedLabels) {
|
8518 | const outputIndex = outputLookup[this.cases[label]];
|
8519 | if (outputIndex === undefined) {
|
8520 | // First time seeing this output, add it to the end of the grouped list
|
8521 | outputLookup[this.cases[label]] = groupedByOutput.length;
|
8522 | groupedByOutput.push([this.cases[label], [label]]);
|
8523 | }
|
8524 | else {
|
8525 | // We've seen this expression before, add the label to that output's group
|
8526 | groupedByOutput[outputIndex][1].push(label);
|
8527 | }
|
8528 | }
|
8529 | const coerceLabel = (label) => this.inputType.kind === 'number' ? Number(label) : label;
|
8530 | for (const [outputIndex, labels] of groupedByOutput) {
|
8531 | if (labels.length === 1) {
|
8532 | // Only a single label matches this output expression
|
8533 | serialized.push(coerceLabel(labels[0]));
|
8534 | }
|
8535 | else {
|
8536 | // Array of literal labels pointing to this output expression
|
8537 | serialized.push(labels.map(coerceLabel));
|
8538 | }
|
8539 | serialized.push(this.outputs[outputIndex].serialize());
|
8540 | }
|
8541 | serialized.push(this.otherwise.serialize());
|
8542 | return serialized;
|
8543 | }
|
8544 | }
|
8545 |
|
8546 | class Case {
|
8547 | constructor(type, branches, otherwise) {
|
8548 | this.type = type;
|
8549 | this.branches = branches;
|
8550 | this.otherwise = otherwise;
|
8551 | }
|
8552 | static parse(args, context) {
|
8553 | if (args.length < 4)
|
8554 | return context.error(`Expected at least 3 arguments, but found only ${args.length - 1}.`);
|
8555 | if (args.length % 2 !== 0)
|
8556 | return context.error('Expected an odd number of arguments.');
|
8557 | let outputType;
|
8558 | if (context.expectedType && context.expectedType.kind !== 'value') {
|
8559 | outputType = context.expectedType;
|
8560 | }
|
8561 | const branches = [];
|
8562 | for (let i = 1; i < args.length - 1; i += 2) {
|
8563 | const test = context.parse(args[i], i, BooleanType);
|
8564 | if (!test)
|
8565 | return null;
|
8566 | const result = context.parse(args[i + 1], i + 1, outputType);
|
8567 | if (!result)
|
8568 | return null;
|
8569 | branches.push([test, result]);
|
8570 | outputType = outputType || result.type;
|
8571 | }
|
8572 | const otherwise = context.parse(args[args.length - 1], args.length - 1, outputType);
|
8573 | if (!otherwise)
|
8574 | return null;
|
8575 | assert$1(outputType);
|
8576 | return new Case(outputType, branches, otherwise);
|
8577 | }
|
8578 | evaluate(ctx) {
|
8579 | for (const [test, expression] of this.branches) {
|
8580 | if (test.evaluate(ctx)) {
|
8581 | return expression.evaluate(ctx);
|
8582 | }
|
8583 | }
|
8584 | return this.otherwise.evaluate(ctx);
|
8585 | }
|
8586 | eachChild(fn) {
|
8587 | for (const [test, expression] of this.branches) {
|
8588 | fn(test);
|
8589 | fn(expression);
|
8590 | }
|
8591 | fn(this.otherwise);
|
8592 | }
|
8593 | outputDefined() {
|
8594 | return this.branches.every(([_, out]) => out.outputDefined()) && this.otherwise.outputDefined();
|
8595 | }
|
8596 | serialize() {
|
8597 | const serialized = ['case'];
|
8598 | this.eachChild(child => { serialized.push(child.serialize()); });
|
8599 | return serialized;
|
8600 | }
|
8601 | }
|
8602 |
|
8603 | class Slice {
|
8604 | constructor(type, input, beginIndex, endIndex) {
|
8605 | this.type = type;
|
8606 | this.input = input;
|
8607 | this.beginIndex = beginIndex;
|
8608 | this.endIndex = endIndex;
|
8609 | }
|
8610 | static parse(args, context) {
|
8611 | if (args.length <= 2 || args.length >= 5) {
|
8612 | return context.error(`Expected 3 or 4 arguments, but found ${args.length - 1} instead.`);
|
8613 | }
|
8614 | const input = context.parse(args[1], 1, ValueType);
|
8615 | const beginIndex = context.parse(args[2], 2, NumberType);
|
8616 | if (!input || !beginIndex)
|
8617 | return null;
|
8618 | if (!isValidType(input.type, [array$1(ValueType), StringType, ValueType])) {
|
8619 | return context.error(`Expected first argument to be of type array or string, but found ${toString$1(input.type)} instead`);
|
8620 | }
|
8621 | if (args.length === 4) {
|
8622 | const endIndex = context.parse(args[3], 3, NumberType);
|
8623 | if (!endIndex)
|
8624 | return null;
|
8625 | return new Slice(input.type, input, beginIndex, endIndex);
|
8626 | }
|
8627 | else {
|
8628 | return new Slice(input.type, input, beginIndex);
|
8629 | }
|
8630 | }
|
8631 | evaluate(ctx) {
|
8632 | const input = this.input.evaluate(ctx);
|
8633 | const beginIndex = this.beginIndex.evaluate(ctx);
|
8634 | if (!isValidNativeType(input, ['string', 'array'])) {
|
8635 | throw new RuntimeError(`Expected first argument to be of type array or string, but found ${toString$1(typeOf(input))} instead.`);
|
8636 | }
|
8637 | if (this.endIndex) {
|
8638 | const endIndex = this.endIndex.evaluate(ctx);
|
8639 | return input.slice(beginIndex, endIndex);
|
8640 | }
|
8641 | return input.slice(beginIndex);
|
8642 | }
|
8643 | eachChild(fn) {
|
8644 | fn(this.input);
|
8645 | fn(this.beginIndex);
|
8646 | if (this.endIndex) {
|
8647 | fn(this.endIndex);
|
8648 | }
|
8649 | }
|
8650 | outputDefined() {
|
8651 | return false;
|
8652 | }
|
8653 | serialize() {
|
8654 | if (this.endIndex != null && this.endIndex !== undefined) {
|
8655 | const endIndex = this.endIndex.serialize();
|
8656 | return ['slice', this.input.serialize(), this.beginIndex.serialize(), endIndex];
|
8657 | }
|
8658 | return ['slice', this.input.serialize(), this.beginIndex.serialize()];
|
8659 | }
|
8660 | }
|
8661 |
|
8662 | function isComparableType(op, type) {
|
8663 | if (op === '==' || op === '!=') {
|
8664 | // equality operator
|
8665 | return type.kind === 'boolean' ||
|
8666 | type.kind === 'string' ||
|
8667 | type.kind === 'number' ||
|
8668 | type.kind === 'null' ||
|
8669 | type.kind === 'value';
|
8670 | }
|
8671 | else {
|
8672 | // ordering operator
|
8673 | return type.kind === 'string' ||
|
8674 | type.kind === 'number' ||
|
8675 | type.kind === 'value';
|
8676 | }
|
8677 | }
|
8678 | function eq(ctx, a, b) { return a === b; }
|
8679 | function neq(ctx, a, b) { return a !== b; }
|
8680 | function lt(ctx, a, b) { return a < b; }
|
8681 | function gt(ctx, a, b) { return a > b; }
|
8682 | function lteq(ctx, a, b) { return a <= b; }
|
8683 | function gteq(ctx, a, b) { return a >= b; }
|
8684 | function eqCollate(ctx, a, b, c) { return c.compare(a, b) === 0; }
|
8685 | function neqCollate(ctx, a, b, c) { return !eqCollate(ctx, a, b, c); }
|
8686 | function ltCollate(ctx, a, b, c) { return c.compare(a, b) < 0; }
|
8687 | function gtCollate(ctx, a, b, c) { return c.compare(a, b) > 0; }
|
8688 | function lteqCollate(ctx, a, b, c) { return c.compare(a, b) <= 0; }
|
8689 | function gteqCollate(ctx, a, b, c) { return c.compare(a, b) >= 0; }
|
8690 | /**
|
8691 | * Special form for comparison operators, implementing the signatures:
|
8692 | * - (T, T, ?Collator) => boolean
|
8693 | * - (T, value, ?Collator) => boolean
|
8694 | * - (value, T, ?Collator) => boolean
|
8695 | *
|
8696 | * For inequalities, T must be either value, string, or number. For ==/!=, it
|
8697 | * can also be boolean or null.
|
8698 | *
|
8699 | * Equality semantics are equivalent to Javascript's strict equality (===/!==)
|
8700 | * -- i.e., when the arguments' types don't match, == evaluates to false, != to
|
8701 | * true.
|
8702 | *
|
8703 | * When types don't match in an ordering comparison, a runtime error is thrown.
|
8704 | *
|
8705 | * @private
|
8706 | */
|
8707 | function makeComparison(op, compareBasic, compareWithCollator) {
|
8708 | const isOrderComparison = op !== '==' && op !== '!=';
|
8709 | return class Comparison {
|
8710 | constructor(lhs, rhs, collator) {
|
8711 | this.type = BooleanType;
|
8712 | this.lhs = lhs;
|
8713 | this.rhs = rhs;
|
8714 | this.collator = collator;
|
8715 | this.hasUntypedArgument = lhs.type.kind === 'value' || rhs.type.kind === 'value';
|
8716 | }
|
8717 | static parse(args, context) {
|
8718 | if (args.length !== 3 && args.length !== 4)
|
8719 | return context.error('Expected two or three arguments.');
|
8720 | const op = args[0];
|
8721 | let lhs = context.parse(args[1], 1, ValueType);
|
8722 | if (!lhs)
|
8723 | return null;
|
8724 | if (!isComparableType(op, lhs.type)) {
|
8725 | return context.concat(1).error(`"${op}" comparisons are not supported for type '${toString$1(lhs.type)}'.`);
|
8726 | }
|
8727 | let rhs = context.parse(args[2], 2, ValueType);
|
8728 | if (!rhs)
|
8729 | return null;
|
8730 | if (!isComparableType(op, rhs.type)) {
|
8731 | return context.concat(2).error(`"${op}" comparisons are not supported for type '${toString$1(rhs.type)}'.`);
|
8732 | }
|
8733 | if (lhs.type.kind !== rhs.type.kind &&
|
8734 | lhs.type.kind !== 'value' &&
|
8735 | rhs.type.kind !== 'value') {
|
8736 | return context.error(`Cannot compare types '${toString$1(lhs.type)}' and '${toString$1(rhs.type)}'.`);
|
8737 | }
|
8738 | if (isOrderComparison) {
|
8739 | // typing rules specific to less/greater than operators
|
8740 | if (lhs.type.kind === 'value' && rhs.type.kind !== 'value') {
|
8741 | // (value, T)
|
8742 | lhs = new Assertion(rhs.type, [lhs]);
|
8743 | }
|
8744 | else if (lhs.type.kind !== 'value' && rhs.type.kind === 'value') {
|
8745 | // (T, value)
|
8746 | rhs = new Assertion(lhs.type, [rhs]);
|
8747 | }
|
8748 | }
|
8749 | let collator = null;
|
8750 | if (args.length === 4) {
|
8751 | if (lhs.type.kind !== 'string' &&
|
8752 | rhs.type.kind !== 'string' &&
|
8753 | lhs.type.kind !== 'value' &&
|
8754 | rhs.type.kind !== 'value') {
|
8755 | return context.error('Cannot use collator to compare non-string types.');
|
8756 | }
|
8757 | collator = context.parse(args[3], 3, CollatorType);
|
8758 | if (!collator)
|
8759 | return null;
|
8760 | }
|
8761 | return new Comparison(lhs, rhs, collator);
|
8762 | }
|
8763 | evaluate(ctx) {
|
8764 | const lhs = this.lhs.evaluate(ctx);
|
8765 | const rhs = this.rhs.evaluate(ctx);
|
8766 | if (isOrderComparison && this.hasUntypedArgument) {
|
8767 | const lt = typeOf(lhs);
|
8768 | const rt = typeOf(rhs);
|
8769 | // check that type is string or number, and equal
|
8770 | if (lt.kind !== rt.kind || !(lt.kind === 'string' || lt.kind === 'number')) {
|
8771 | throw new RuntimeError(`Expected arguments for "${op}" to be (string, string) or (number, number), but found (${lt.kind}, ${rt.kind}) instead.`);
|
8772 | }
|
8773 | }
|
8774 | if (this.collator && !isOrderComparison && this.hasUntypedArgument) {
|
8775 | const lt = typeOf(lhs);
|
8776 | const rt = typeOf(rhs);
|
8777 | if (lt.kind !== 'string' || rt.kind !== 'string') {
|
8778 | return compareBasic(ctx, lhs, rhs);
|
8779 | }
|
8780 | }
|
8781 | return this.collator ?
|
8782 | compareWithCollator(ctx, lhs, rhs, this.collator.evaluate(ctx)) :
|
8783 | compareBasic(ctx, lhs, rhs);
|
8784 | }
|
8785 | eachChild(fn) {
|
8786 | fn(this.lhs);
|
8787 | fn(this.rhs);
|
8788 | if (this.collator) {
|
8789 | fn(this.collator);
|
8790 | }
|
8791 | }
|
8792 | outputDefined() {
|
8793 | return true;
|
8794 | }
|
8795 | serialize() {
|
8796 | const serialized = [op];
|
8797 | this.eachChild(child => { serialized.push(child.serialize()); });
|
8798 | return serialized;
|
8799 | }
|
8800 | };
|
8801 | }
|
8802 | const Equals = makeComparison('==', eq, eqCollate);
|
8803 | const NotEquals = makeComparison('!=', neq, neqCollate);
|
8804 | const LessThan = makeComparison('<', lt, ltCollate);
|
8805 | const GreaterThan = makeComparison('>', gt, gtCollate);
|
8806 | const LessThanOrEqual = makeComparison('<=', lteq, lteqCollate);
|
8807 | const GreaterThanOrEqual = makeComparison('>=', gteq, gteqCollate);
|
8808 |
|
8809 | class NumberFormat {
|
8810 | constructor(number, locale, currency, minFractionDigits, maxFractionDigits) {
|
8811 | this.type = StringType;
|
8812 | this.number = number;
|
8813 | this.locale = locale;
|
8814 | this.currency = currency;
|
8815 | this.minFractionDigits = minFractionDigits;
|
8816 | this.maxFractionDigits = maxFractionDigits;
|
8817 | }
|
8818 | static parse(args, context) {
|
8819 | if (args.length !== 3)
|
8820 | return context.error('Expected two arguments.');
|
8821 | const number = context.parse(args[1], 1, NumberType);
|
8822 | if (!number)
|
8823 | return null;
|
8824 | const options = args[2];
|
8825 | if (typeof options !== 'object' || Array.isArray(options))
|
8826 | return context.error('NumberFormat options argument must be an object.');
|
8827 | let locale = null;
|
8828 | if (options['locale']) {
|
8829 | locale = context.parse(options['locale'], 1, StringType);
|
8830 | if (!locale)
|
8831 | return null;
|
8832 | }
|
8833 | let currency = null;
|
8834 | if (options['currency']) {
|
8835 | currency = context.parse(options['currency'], 1, StringType);
|
8836 | if (!currency)
|
8837 | return null;
|
8838 | }
|
8839 | let minFractionDigits = null;
|
8840 | if (options['min-fraction-digits']) {
|
8841 | minFractionDigits = context.parse(options['min-fraction-digits'], 1, NumberType);
|
8842 | if (!minFractionDigits)
|
8843 | return null;
|
8844 | }
|
8845 | let maxFractionDigits = null;
|
8846 | if (options['max-fraction-digits']) {
|
8847 | maxFractionDigits = context.parse(options['max-fraction-digits'], 1, NumberType);
|
8848 | if (!maxFractionDigits)
|
8849 | return null;
|
8850 | }
|
8851 | return new NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits);
|
8852 | }
|
8853 | evaluate(ctx) {
|
8854 | return new Intl.NumberFormat(this.locale ? this.locale.evaluate(ctx) : [], {
|
8855 | style: this.currency ? 'currency' : 'decimal',
|
8856 | currency: this.currency ? this.currency.evaluate(ctx) : undefined,
|
8857 | minimumFractionDigits: this.minFractionDigits ? this.minFractionDigits.evaluate(ctx) : undefined,
|
8858 | maximumFractionDigits: this.maxFractionDigits ? this.maxFractionDigits.evaluate(ctx) : undefined,
|
8859 | }).format(this.number.evaluate(ctx));
|
8860 | }
|
8861 | eachChild(fn) {
|
8862 | fn(this.number);
|
8863 | if (this.locale) {
|
8864 | fn(this.locale);
|
8865 | }
|
8866 | if (this.currency) {
|
8867 | fn(this.currency);
|
8868 | }
|
8869 | if (this.minFractionDigits) {
|
8870 | fn(this.minFractionDigits);
|
8871 | }
|
8872 | if (this.maxFractionDigits) {
|
8873 | fn(this.maxFractionDigits);
|
8874 | }
|
8875 | }
|
8876 | outputDefined() {
|
8877 | return false;
|
8878 | }
|
8879 | serialize() {
|
8880 | const options = {};
|
8881 | if (this.locale) {
|
8882 | options['locale'] = this.locale.serialize();
|
8883 | }
|
8884 | if (this.currency) {
|
8885 | options['currency'] = this.currency.serialize();
|
8886 | }
|
8887 | if (this.minFractionDigits) {
|
8888 | options['min-fraction-digits'] = this.minFractionDigits.serialize();
|
8889 | }
|
8890 | if (this.maxFractionDigits) {
|
8891 | options['max-fraction-digits'] = this.maxFractionDigits.serialize();
|
8892 | }
|
8893 | return ['number-format', this.number.serialize(), options];
|
8894 | }
|
8895 | }
|
8896 |
|
8897 | class Length {
|
8898 | constructor(input) {
|
8899 | this.type = NumberType;
|
8900 | this.input = input;
|
8901 | }
|
8902 | static parse(args, context) {
|
8903 | if (args.length !== 2)
|
8904 | return context.error(`Expected 1 argument, but found ${args.length - 1} instead.`);
|
8905 | const input = context.parse(args[1], 1);
|
8906 | if (!input)
|
8907 | return null;
|
8908 | if (input.type.kind !== 'array' && input.type.kind !== 'string' && input.type.kind !== 'value')
|
8909 | return context.error(`Expected argument of type string or array, but found ${toString$1(input.type)} instead.`);
|
8910 | return new Length(input);
|
8911 | }
|
8912 | evaluate(ctx) {
|
8913 | const input = this.input.evaluate(ctx);
|
8914 | if (typeof input === 'string') {
|
8915 | return input.length;
|
8916 | }
|
8917 | else if (Array.isArray(input)) {
|
8918 | return input.length;
|
8919 | }
|
8920 | else {
|
8921 | throw new RuntimeError(`Expected value to be of type string or array, but found ${toString$1(typeOf(input))} instead.`);
|
8922 | }
|
8923 | }
|
8924 | eachChild(fn) {
|
8925 | fn(this.input);
|
8926 | }
|
8927 | outputDefined() {
|
8928 | return false;
|
8929 | }
|
8930 | serialize() {
|
8931 | const serialized = ['length'];
|
8932 | this.eachChild(child => { serialized.push(child.serialize()); });
|
8933 | return serialized;
|
8934 | }
|
8935 | }
|
8936 |
|
8937 | const expressions = {
|
8938 | // special forms
|
8939 | '==': Equals,
|
8940 | '!=': NotEquals,
|
8941 | '>': GreaterThan,
|
8942 | '<': LessThan,
|
8943 | '>=': GreaterThanOrEqual,
|
8944 | '<=': LessThanOrEqual,
|
8945 | 'array': Assertion,
|
8946 | 'at': At,
|
8947 | 'boolean': Assertion,
|
8948 | 'case': Case,
|
8949 | 'coalesce': Coalesce,
|
8950 | 'collator': CollatorExpression,
|
8951 | 'format': FormatExpression,
|
8952 | 'image': ImageExpression,
|
8953 | 'in': In,
|
8954 | 'index-of': IndexOf,
|
8955 | 'interpolate': Interpolate,
|
8956 | 'interpolate-hcl': Interpolate,
|
8957 | 'interpolate-lab': Interpolate,
|
8958 | 'length': Length,
|
8959 | 'let': Let,
|
8960 | 'literal': Literal,
|
8961 | 'match': Match,
|
8962 | 'number': Assertion,
|
8963 | 'number-format': NumberFormat,
|
8964 | 'object': Assertion,
|
8965 | 'slice': Slice,
|
8966 | 'step': Step,
|
8967 | 'string': Assertion,
|
8968 | 'to-boolean': Coercion,
|
8969 | 'to-color': Coercion,
|
8970 | 'to-number': Coercion,
|
8971 | 'to-string': Coercion,
|
8972 | 'var': Var,
|
8973 | 'within': Within
|
8974 | };
|
8975 | function rgba(ctx, [r, g, b, a]) {
|
8976 | r = r.evaluate(ctx);
|
8977 | g = g.evaluate(ctx);
|
8978 | b = b.evaluate(ctx);
|
8979 | const alpha = a ? a.evaluate(ctx) : 1;
|
8980 | const error = validateRGBA(r, g, b, alpha);
|
8981 | if (error)
|
8982 | throw new RuntimeError(error);
|
8983 | return new Color(r / 255 * alpha, g / 255 * alpha, b / 255 * alpha, alpha);
|
8984 | }
|
8985 | function has(key, obj) {
|
8986 | return key in obj;
|
8987 | }
|
8988 | function get(key, obj) {
|
8989 | const v = obj[key];
|
8990 | return typeof v === 'undefined' ? null : v;
|
8991 | }
|
8992 | function binarySearch(v, a, i, j) {
|
8993 | while (i <= j) {
|
8994 | const m = (i + j) >> 1;
|
8995 | if (a[m] === v)
|
8996 | return true;
|
8997 | if (a[m] > v)
|
8998 | j = m - 1;
|
8999 | else
|
9000 | i = m + 1;
|
9001 | }
|
9002 | return false;
|
9003 | }
|
9004 | function varargs(type) {
|
9005 | return { type };
|
9006 | }
|
9007 | CompoundExpression.register(expressions, {
|
9008 | 'error': [
|
9009 | ErrorType,
|
9010 | [StringType],
|
9011 | (ctx, [v]) => { throw new RuntimeError(v.evaluate(ctx)); }
|
9012 | ],
|
9013 | 'typeof': [
|
9014 | StringType,
|
9015 | [ValueType],
|
9016 | (ctx, [v]) => toString$1(typeOf(v.evaluate(ctx)))
|
9017 | ],
|
9018 | 'to-rgba': [
|
9019 | array$1(NumberType, 4),
|
9020 | [ColorType],
|
9021 | (ctx, [v]) => {
|
9022 | return v.evaluate(ctx).toArray();
|
9023 | }
|
9024 | ],
|
9025 | 'rgb': [
|
9026 | ColorType,
|
9027 | [NumberType, NumberType, NumberType],
|
9028 | rgba
|
9029 | ],
|
9030 | 'rgba': [
|
9031 | ColorType,
|
9032 | [NumberType, NumberType, NumberType, NumberType],
|
9033 | rgba
|
9034 | ],
|
9035 | 'has': {
|
9036 | type: BooleanType,
|
9037 | overloads: [
|
9038 | [
|
9039 | [StringType],
|
9040 | (ctx, [key]) => has(key.evaluate(ctx), ctx.properties())
|
9041 | ], [
|
9042 | [StringType, ObjectType],
|
9043 | (ctx, [key, obj]) => has(key.evaluate(ctx), obj.evaluate(ctx))
|
9044 | ]
|
9045 | ]
|
9046 | },
|
9047 | 'get': {
|
9048 | type: ValueType,
|
9049 | overloads: [
|
9050 | [
|
9051 | [StringType],
|
9052 | (ctx, [key]) => get(key.evaluate(ctx), ctx.properties())
|
9053 | ], [
|
9054 | [StringType, ObjectType],
|
9055 | (ctx, [key, obj]) => get(key.evaluate(ctx), obj.evaluate(ctx))
|
9056 | ]
|
9057 | ]
|
9058 | },
|
9059 | 'feature-state': [
|
9060 | ValueType,
|
9061 | [StringType],
|
9062 | (ctx, [key]) => get(key.evaluate(ctx), ctx.featureState || {})
|
9063 | ],
|
9064 | 'properties': [
|
9065 | ObjectType,
|
9066 | [],
|
9067 | (ctx) => ctx.properties()
|
9068 | ],
|
9069 | 'geometry-type': [
|
9070 | StringType,
|
9071 | [],
|
9072 | (ctx) => ctx.geometryType()
|
9073 | ],
|
9074 | 'id': [
|
9075 | ValueType,
|
9076 | [],
|
9077 | (ctx) => ctx.id()
|
9078 | ],
|
9079 | 'zoom': [
|
9080 | NumberType,
|
9081 | [],
|
9082 | (ctx) => ctx.globals.zoom
|
9083 | ],
|
9084 | 'heatmap-density': [
|
9085 | NumberType,
|
9086 | [],
|
9087 | (ctx) => ctx.globals.heatmapDensity || 0
|
9088 | ],
|
9089 | 'line-progress': [
|
9090 | NumberType,
|
9091 | [],
|
9092 | (ctx) => ctx.globals.lineProgress || 0
|
9093 | ],
|
9094 | 'accumulated': [
|
9095 | ValueType,
|
9096 | [],
|
9097 | (ctx) => ctx.globals.accumulated === undefined ? null : ctx.globals.accumulated
|
9098 | ],
|
9099 | '+': [
|
9100 | NumberType,
|
9101 | varargs(NumberType),
|
9102 | (ctx, args) => {
|
9103 | let result = 0;
|
9104 | for (const arg of args) {
|
9105 | result += arg.evaluate(ctx);
|
9106 | }
|
9107 | return result;
|
9108 | }
|
9109 | ],
|
9110 | '*': [
|
9111 | NumberType,
|
9112 | varargs(NumberType),
|
9113 | (ctx, args) => {
|
9114 | let result = 1;
|
9115 | for (const arg of args) {
|
9116 | result *= arg.evaluate(ctx);
|
9117 | }
|
9118 | return result;
|
9119 | }
|
9120 | ],
|
9121 | '-': {
|
9122 | type: NumberType,
|
9123 | overloads: [
|
9124 | [
|
9125 | [NumberType, NumberType],
|
9126 | (ctx, [a, b]) => a.evaluate(ctx) - b.evaluate(ctx)
|
9127 | ], [
|
9128 | [NumberType],
|
9129 | (ctx, [a]) => -a.evaluate(ctx)
|
9130 | ]
|
9131 | ]
|
9132 | },
|
9133 | '/': [
|
9134 | NumberType,
|
9135 | [NumberType, NumberType],
|
9136 | (ctx, [a, b]) => a.evaluate(ctx) / b.evaluate(ctx)
|
9137 | ],
|
9138 | '%': [
|
9139 | NumberType,
|
9140 | [NumberType, NumberType],
|
9141 | (ctx, [a, b]) => a.evaluate(ctx) % b.evaluate(ctx)
|
9142 | ],
|
9143 | 'ln2': [
|
9144 | NumberType,
|
9145 | [],
|
9146 | () => Math.LN2
|
9147 | ],
|
9148 | 'pi': [
|
9149 | NumberType,
|
9150 | [],
|
9151 | () => Math.PI
|
9152 | ],
|
9153 | 'e': [
|
9154 | NumberType,
|
9155 | [],
|
9156 | () => Math.E
|
9157 | ],
|
9158 | '^': [
|
9159 | NumberType,
|
9160 | [NumberType, NumberType],
|
9161 | (ctx, [b, e]) => Math.pow(b.evaluate(ctx), e.evaluate(ctx))
|
9162 | ],
|
9163 | 'sqrt': [
|
9164 | NumberType,
|
9165 | [NumberType],
|
9166 | (ctx, [x]) => Math.sqrt(x.evaluate(ctx))
|
9167 | ],
|
9168 | 'log10': [
|
9169 | NumberType,
|
9170 | [NumberType],
|
9171 | (ctx, [n]) => Math.log(n.evaluate(ctx)) / Math.LN10
|
9172 | ],
|
9173 | 'ln': [
|
9174 | NumberType,
|
9175 | [NumberType],
|
9176 | (ctx, [n]) => Math.log(n.evaluate(ctx))
|
9177 | ],
|
9178 | 'log2': [
|
9179 | NumberType,
|
9180 | [NumberType],
|
9181 | (ctx, [n]) => Math.log(n.evaluate(ctx)) / Math.LN2
|
9182 | ],
|
9183 | 'sin': [
|
9184 | NumberType,
|
9185 | [NumberType],
|
9186 | (ctx, [n]) => Math.sin(n.evaluate(ctx))
|
9187 | ],
|
9188 | 'cos': [
|
9189 | NumberType,
|
9190 | [NumberType],
|
9191 | (ctx, [n]) => Math.cos(n.evaluate(ctx))
|
9192 | ],
|
9193 | 'tan': [
|
9194 | NumberType,
|
9195 | [NumberType],
|
9196 | (ctx, [n]) => Math.tan(n.evaluate(ctx))
|
9197 | ],
|
9198 | 'asin': [
|
9199 | NumberType,
|
9200 | [NumberType],
|
9201 | (ctx, [n]) => Math.asin(n.evaluate(ctx))
|
9202 | ],
|
9203 | 'acos': [
|
9204 | NumberType,
|
9205 | [NumberType],
|
9206 | (ctx, [n]) => Math.acos(n.evaluate(ctx))
|
9207 | ],
|
9208 | 'atan': [
|
9209 | NumberType,
|
9210 | [NumberType],
|
9211 | (ctx, [n]) => Math.atan(n.evaluate(ctx))
|
9212 | ],
|
9213 | 'min': [
|
9214 | NumberType,
|
9215 | varargs(NumberType),
|
9216 | (ctx, args) => Math.min(...args.map(arg => arg.evaluate(ctx)))
|
9217 | ],
|
9218 | 'max': [
|
9219 | NumberType,
|
9220 | varargs(NumberType),
|
9221 | (ctx, args) => Math.max(...args.map(arg => arg.evaluate(ctx)))
|
9222 | ],
|
9223 | 'abs': [
|
9224 | NumberType,
|
9225 | [NumberType],
|
9226 | (ctx, [n]) => Math.abs(n.evaluate(ctx))
|
9227 | ],
|
9228 | 'round': [
|
9229 | NumberType,
|
9230 | [NumberType],
|
9231 | (ctx, [n]) => {
|
9232 | const v = n.evaluate(ctx);
|
9233 | // Javascript's Math.round() rounds towards +Infinity for halfway
|
9234 | // values, even when they're negative. It's more common to round
|
9235 | // away from 0 (e.g., this is what python and C++ do)
|
9236 | return v < 0 ? -Math.round(-v) : Math.round(v);
|
9237 | }
|
9238 | ],
|
9239 | 'floor': [
|
9240 | NumberType,
|
9241 | [NumberType],
|
9242 | (ctx, [n]) => Math.floor(n.evaluate(ctx))
|
9243 | ],
|
9244 | 'ceil': [
|
9245 | NumberType,
|
9246 | [NumberType],
|
9247 | (ctx, [n]) => Math.ceil(n.evaluate(ctx))
|
9248 | ],
|
9249 | 'filter-==': [
|
9250 | BooleanType,
|
9251 | [StringType, ValueType],
|
9252 | (ctx, [k, v]) => ctx.properties()[k.value] === v.value
|
9253 | ],
|
9254 | 'filter-id-==': [
|
9255 | BooleanType,
|
9256 | [ValueType],
|
9257 | (ctx, [v]) => ctx.id() === v.value
|
9258 | ],
|
9259 | 'filter-type-==': [
|
9260 | BooleanType,
|
9261 | [StringType],
|
9262 | (ctx, [v]) => ctx.geometryType() === v.value
|
9263 | ],
|
9264 | 'filter-<': [
|
9265 | BooleanType,
|
9266 | [StringType, ValueType],
|
9267 | (ctx, [k, v]) => {
|
9268 | const a = ctx.properties()[k.value];
|
9269 | const b = v.value;
|
9270 | return typeof a === typeof b && a < b;
|
9271 | }
|
9272 | ],
|
9273 | 'filter-id-<': [
|
9274 | BooleanType,
|
9275 | [ValueType],
|
9276 | (ctx, [v]) => {
|
9277 | const a = ctx.id();
|
9278 | const b = v.value;
|
9279 | return typeof a === typeof b && a < b;
|
9280 | }
|
9281 | ],
|
9282 | 'filter->': [
|
9283 | BooleanType,
|
9284 | [StringType, ValueType],
|
9285 | (ctx, [k, v]) => {
|
9286 | const a = ctx.properties()[k.value];
|
9287 | const b = v.value;
|
9288 | return typeof a === typeof b && a > b;
|
9289 | }
|
9290 | ],
|
9291 | 'filter-id->': [
|
9292 | BooleanType,
|
9293 | [ValueType],
|
9294 | (ctx, [v]) => {
|
9295 | const a = ctx.id();
|
9296 | const b = v.value;
|
9297 | return typeof a === typeof b && a > b;
|
9298 | }
|
9299 | ],
|
9300 | 'filter-<=': [
|
9301 | BooleanType,
|
9302 | [StringType, ValueType],
|
9303 | (ctx, [k, v]) => {
|
9304 | const a = ctx.properties()[k.value];
|
9305 | const b = v.value;
|
9306 | return typeof a === typeof b && a <= b;
|
9307 | }
|
9308 | ],
|
9309 | 'filter-id-<=': [
|
9310 | BooleanType,
|
9311 | [ValueType],
|
9312 | (ctx, [v]) => {
|
9313 | const a = ctx.id();
|
9314 | const b = v.value;
|
9315 | return typeof a === typeof b && a <= b;
|
9316 | }
|
9317 | ],
|
9318 | 'filter->=': [
|
9319 | BooleanType,
|
9320 | [StringType, ValueType],
|
9321 | (ctx, [k, v]) => {
|
9322 | const a = ctx.properties()[k.value];
|
9323 | const b = v.value;
|
9324 | return typeof a === typeof b && a >= b;
|
9325 | }
|
9326 | ],
|
9327 | 'filter-id->=': [
|
9328 | BooleanType,
|
9329 | [ValueType],
|
9330 | (ctx, [v]) => {
|
9331 | const a = ctx.id();
|
9332 | const b = v.value;
|
9333 | return typeof a === typeof b && a >= b;
|
9334 | }
|
9335 | ],
|
9336 | 'filter-has': [
|
9337 | BooleanType,
|
9338 | [ValueType],
|
9339 | (ctx, [k]) => k.value in ctx.properties()
|
9340 | ],
|
9341 | 'filter-has-id': [
|
9342 | BooleanType,
|
9343 | [],
|
9344 | (ctx) => (ctx.id() !== null && ctx.id() !== undefined)
|
9345 | ],
|
9346 | 'filter-type-in': [
|
9347 | BooleanType,
|
9348 | [array$1(StringType)],
|
9349 | (ctx, [v]) => v.value.indexOf(ctx.geometryType()) >= 0
|
9350 | ],
|
9351 | 'filter-id-in': [
|
9352 | BooleanType,
|
9353 | [array$1(ValueType)],
|
9354 | (ctx, [v]) => v.value.indexOf(ctx.id()) >= 0
|
9355 | ],
|
9356 | 'filter-in-small': [
|
9357 | BooleanType,
|
9358 | [StringType, array$1(ValueType)],
|
9359 | // assumes v is an array literal
|
9360 | (ctx, [k, v]) => v.value.indexOf(ctx.properties()[k.value]) >= 0
|
9361 | ],
|
9362 | 'filter-in-large': [
|
9363 | BooleanType,
|
9364 | [StringType, array$1(ValueType)],
|
9365 | // assumes v is a array literal with values sorted in ascending order and of a single type
|
9366 | (ctx, [k, v]) => binarySearch(ctx.properties()[k.value], v.value, 0, v.value.length - 1)
|
9367 | ],
|
9368 | 'all': {
|
9369 | type: BooleanType,
|
9370 | overloads: [
|
9371 | [
|
9372 | [BooleanType, BooleanType],
|
9373 | (ctx, [a, b]) => a.evaluate(ctx) && b.evaluate(ctx)
|
9374 | ],
|
9375 | [
|
9376 | varargs(BooleanType),
|
9377 | (ctx, args) => {
|
9378 | for (const arg of args) {
|
9379 | if (!arg.evaluate(ctx))
|
9380 | return false;
|
9381 | }
|
9382 | return true;
|
9383 | }
|
9384 | ]
|
9385 | ]
|
9386 | },
|
9387 | 'any': {
|
9388 | type: BooleanType,
|
9389 | overloads: [
|
9390 | [
|
9391 | [BooleanType, BooleanType],
|
9392 | (ctx, [a, b]) => a.evaluate(ctx) || b.evaluate(ctx)
|
9393 | ],
|
9394 | [
|
9395 | varargs(BooleanType),
|
9396 | (ctx, args) => {
|
9397 | for (const arg of args) {
|
9398 | if (arg.evaluate(ctx))
|
9399 | return true;
|
9400 | }
|
9401 | return false;
|
9402 | }
|
9403 | ]
|
9404 | ]
|
9405 | },
|
9406 | '!': [
|
9407 | BooleanType,
|
9408 | [BooleanType],
|
9409 | (ctx, [b]) => !b.evaluate(ctx)
|
9410 | ],
|
9411 | 'is-supported-script': [
|
9412 | BooleanType,
|
9413 | [StringType],
|
9414 | // At parse time this will always return true, so we need to exclude this expression with isGlobalPropertyConstant
|
9415 | (ctx, [s]) => {
|
9416 | const isSupportedScript = ctx.globals && ctx.globals.isSupportedScript;
|
9417 | if (isSupportedScript) {
|
9418 | return isSupportedScript(s.evaluate(ctx));
|
9419 | }
|
9420 | return true;
|
9421 | }
|
9422 | ],
|
9423 | 'upcase': [
|
9424 | StringType,
|
9425 | [StringType],
|
9426 | (ctx, [s]) => s.evaluate(ctx).toUpperCase()
|
9427 | ],
|
9428 | 'downcase': [
|
9429 | StringType,
|
9430 | [StringType],
|
9431 | (ctx, [s]) => s.evaluate(ctx).toLowerCase()
|
9432 | ],
|
9433 | 'concat': [
|
9434 | StringType,
|
9435 | varargs(ValueType),
|
9436 | (ctx, args) => args.map(arg => toString(arg.evaluate(ctx))).join('')
|
9437 | ],
|
9438 | 'resolved-locale': [
|
9439 | StringType,
|
9440 | [CollatorType],
|
9441 | (ctx, [collator]) => collator.evaluate(ctx).resolvedLocale()
|
9442 | ]
|
9443 | });
|
9444 |
|
9445 | function success(value) {
|
9446 | return { result: 'success', value };
|
9447 | }
|
9448 | function error(value) {
|
9449 | return { result: 'error', value };
|
9450 | }
|
9451 |
|
9452 | function supportsPropertyExpression(spec) {
|
9453 | return spec['property-type'] === 'data-driven' || spec['property-type'] === 'cross-faded-data-driven';
|
9454 | }
|
9455 | function supportsZoomExpression(spec) {
|
9456 | return !!spec.expression && spec.expression.parameters.indexOf('zoom') > -1;
|
9457 | }
|
9458 | function supportsInterpolation(spec) {
|
9459 | return !!spec.expression && spec.expression.interpolated;
|
9460 | }
|
9461 |
|
9462 | function getType(val) {
|
9463 | if (val instanceof Number) {
|
9464 | return 'number';
|
9465 | }
|
9466 | else if (val instanceof String) {
|
9467 | return 'string';
|
9468 | }
|
9469 | else if (val instanceof Boolean) {
|
9470 | return 'boolean';
|
9471 | }
|
9472 | else if (Array.isArray(val)) {
|
9473 | return 'array';
|
9474 | }
|
9475 | else if (val === null) {
|
9476 | return 'null';
|
9477 | }
|
9478 | else {
|
9479 | return typeof val;
|
9480 | }
|
9481 | }
|
9482 |
|
9483 | function isFunction(value) {
|
9484 | return typeof value === 'object' && value !== null && !Array.isArray(value);
|
9485 | }
|
9486 | function identityFunction(x) {
|
9487 | return x;
|
9488 | }
|
9489 | function createFunction(parameters, propertySpec) {
|
9490 | const isColor = propertySpec.type === 'color';
|
9491 | const zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object';
|
9492 | const featureDependent = zoomAndFeatureDependent || parameters.property !== undefined;
|
9493 | const zoomDependent = zoomAndFeatureDependent || !featureDependent;
|
9494 | const type = parameters.type || (supportsInterpolation(propertySpec) ? 'exponential' : 'interval');
|
9495 | if (isColor) {
|
9496 | parameters = extend({}, parameters);
|
9497 | if (parameters.stops) {
|
9498 | parameters.stops = parameters.stops.map((stop) => {
|
9499 | return [stop[0], Color.parse(stop[1])];
|
9500 | });
|
9501 | }
|
9502 | if (parameters.default) {
|
9503 | parameters.default = Color.parse(parameters.default);
|
9504 | }
|
9505 | else {
|
9506 | parameters.default = Color.parse(propertySpec.default);
|
9507 | }
|
9508 | }
|
9509 | if (parameters.colorSpace && parameters.colorSpace !== 'rgb' && !colorSpaces[parameters.colorSpace]) { // eslint-disable-line import/namespace
|
9510 | throw new Error(`Unknown color space: ${parameters.colorSpace}`);
|
9511 | }
|
9512 | let innerFun;
|
9513 | let hashedStops;
|
9514 | let categoricalKeyType;
|
9515 | if (type === 'exponential') {
|
9516 | innerFun = evaluateExponentialFunction;
|
9517 | }
|
9518 | else if (type === 'interval') {
|
9519 | innerFun = evaluateIntervalFunction;
|
9520 | }
|
9521 | else if (type === 'categorical') {
|
9522 | innerFun = evaluateCategoricalFunction;
|
9523 | // For categorical functions, generate an Object as a hashmap of the stops for fast searching
|
9524 | hashedStops = Object.create(null);
|
9525 | for (const stop of parameters.stops) {
|
9526 | hashedStops[stop[0]] = stop[1];
|
9527 | }
|
9528 | // Infer key type based on first stop key-- used to encforce strict type checking later
|
9529 | categoricalKeyType = typeof parameters.stops[0][0];
|
9530 | }
|
9531 | else if (type === 'identity') {
|
9532 | innerFun = evaluateIdentityFunction;
|
9533 | }
|
9534 | else {
|
9535 | throw new Error(`Unknown function type "${type}"`);
|
9536 | }
|
9537 | if (zoomAndFeatureDependent) {
|
9538 | const featureFunctions = {};
|
9539 | const zoomStops = [];
|
9540 | for (let s = 0; s < parameters.stops.length; s++) {
|
9541 | const stop = parameters.stops[s];
|
9542 | const zoom = stop[0].zoom;
|
9543 | if (featureFunctions[zoom] === undefined) {
|
9544 | featureFunctions[zoom] = {
|
9545 | zoom,
|
9546 | type: parameters.type,
|
9547 | property: parameters.property,
|
9548 | default: parameters.default,
|
9549 | stops: []
|
9550 | };
|
9551 | zoomStops.push(zoom);
|
9552 | }
|
9553 | featureFunctions[zoom].stops.push([stop[0].value, stop[1]]);
|
9554 | }
|
9555 | const featureFunctionStops = [];
|
9556 | for (const z of zoomStops) {
|
9557 | featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]);
|
9558 | }
|
9559 | const interpolationType = { name: 'linear' };
|
9560 | return {
|
9561 | kind: 'composite',
|
9562 | interpolationType,
|
9563 | interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType),
|
9564 | zoomStops: featureFunctionStops.map(s => s[0]),
|
9565 | evaluate({ zoom }, properties) {
|
9566 | return evaluateExponentialFunction({
|
9567 | stops: featureFunctionStops,
|
9568 | base: parameters.base
|
9569 | }, propertySpec, zoom).evaluate(zoom, properties);
|
9570 | }
|
9571 | };
|
9572 | }
|
9573 | else if (zoomDependent) {
|
9574 | const interpolationType = type === 'exponential' ?
|
9575 | { name: 'exponential', base: parameters.base !== undefined ? parameters.base : 1 } : null;
|
9576 | return {
|
9577 | kind: 'camera',
|
9578 | interpolationType,
|
9579 | interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType),
|
9580 | zoomStops: parameters.stops.map(s => s[0]),
|
9581 | evaluate: ({ zoom }) => innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType)
|
9582 | };
|
9583 | }
|
9584 | else {
|
9585 | return {
|
9586 | kind: 'source',
|
9587 | evaluate(_, feature) {
|
9588 | const value = feature && feature.properties ? feature.properties[parameters.property] : undefined;
|
9589 | if (value === undefined) {
|
9590 | return coalesce(parameters.default, propertySpec.default);
|
9591 | }
|
9592 | return innerFun(parameters, propertySpec, value, hashedStops, categoricalKeyType);
|
9593 | }
|
9594 | };
|
9595 | }
|
9596 | }
|
9597 | function coalesce(a, b, c) {
|
9598 | if (a !== undefined)
|
9599 | return a;
|
9600 | if (b !== undefined)
|
9601 | return b;
|
9602 | if (c !== undefined)
|
9603 | return c;
|
9604 | }
|
9605 | function evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) {
|
9606 | const evaluated = typeof input === keyType ? hashedStops[input] : undefined; // Enforce strict typing on input
|
9607 | return coalesce(evaluated, parameters.default, propertySpec.default);
|
9608 | }
|
9609 | function evaluateIntervalFunction(parameters, propertySpec, input) {
|
9610 | // Edge cases
|
9611 | if (getType(input) !== 'number')
|
9612 | return coalesce(parameters.default, propertySpec.default);
|
9613 | const n = parameters.stops.length;
|
9614 | if (n === 1)
|
9615 | return parameters.stops[0][1];
|
9616 | if (input <= parameters.stops[0][0])
|
9617 | return parameters.stops[0][1];
|
9618 | if (input >= parameters.stops[n - 1][0])
|
9619 | return parameters.stops[n - 1][1];
|
9620 | const index = findStopLessThanOrEqualTo(parameters.stops.map((stop) => stop[0]), input);
|
9621 | return parameters.stops[index][1];
|
9622 | }
|
9623 | function evaluateExponentialFunction(parameters, propertySpec, input) {
|
9624 | const base = parameters.base !== undefined ? parameters.base : 1;
|
9625 | // Edge cases
|
9626 | if (getType(input) !== 'number')
|
9627 | return coalesce(parameters.default, propertySpec.default);
|
9628 | const n = parameters.stops.length;
|
9629 | if (n === 1)
|
9630 | return parameters.stops[0][1];
|
9631 | if (input <= parameters.stops[0][0])
|
9632 | return parameters.stops[0][1];
|
9633 | if (input >= parameters.stops[n - 1][0])
|
9634 | return parameters.stops[n - 1][1];
|
9635 | const index = findStopLessThanOrEqualTo(parameters.stops.map((stop) => stop[0]), input);
|
9636 | const t = interpolationFactor(input, base, parameters.stops[index][0], parameters.stops[index + 1][0]);
|
9637 | const outputLower = parameters.stops[index][1];
|
9638 | const outputUpper = parameters.stops[index + 1][1];
|
9639 | let interp = interpolate[propertySpec.type] || identityFunction; // eslint-disable-line import/namespace
|
9640 | if (parameters.colorSpace && parameters.colorSpace !== 'rgb') {
|
9641 | const colorspace = colorSpaces[parameters.colorSpace]; // eslint-disable-line import/namespace
|
9642 | interp = (a, b) => colorspace.reverse(colorspace.interpolate(colorspace.forward(a), colorspace.forward(b), t));
|
9643 | }
|
9644 | if (typeof outputLower.evaluate === 'function') {
|
9645 | return {
|
9646 | evaluate(...args) {
|
9647 | const evaluatedLower = outputLower.evaluate.apply(undefined, args);
|
9648 | const evaluatedUpper = outputUpper.evaluate.apply(undefined, args);
|
9649 | // Special case for fill-outline-color, which has no spec default.
|
9650 | if (evaluatedLower === undefined || evaluatedUpper === undefined) {
|
9651 | return undefined;
|
9652 | }
|
9653 | return interp(evaluatedLower, evaluatedUpper, t);
|
9654 | }
|
9655 | };
|
9656 | }
|
9657 | return interp(outputLower, outputUpper, t);
|
9658 | }
|
9659 | function evaluateIdentityFunction(parameters, propertySpec, input) {
|
9660 | if (propertySpec.type === 'color') {
|
9661 | input = Color.parse(input);
|
9662 | }
|
9663 | else if (propertySpec.type === 'formatted') {
|
9664 | input = Formatted.fromString(input.toString());
|
9665 | }
|
9666 | else if (propertySpec.type === 'resolvedImage') {
|
9667 | input = ResolvedImage.fromString(input.toString());
|
9668 | }
|
9669 | else if (getType(input) !== propertySpec.type && (propertySpec.type !== 'enum' || !propertySpec.values[input])) {
|
9670 | input = undefined;
|
9671 | }
|
9672 | return coalesce(input, parameters.default, propertySpec.default);
|
9673 | }
|
9674 | /**
|
9675 | * Returns a ratio that can be used to interpolate between exponential function
|
9676 | * stops.
|
9677 | *
|
9678 | * How it works:
|
9679 | * Two consecutive stop values define a (scaled and shifted) exponential
|
9680 | * function `f(x) = a * base^x + b`, where `base` is the user-specified base,
|
9681 | * and `a` and `b` are constants affording sufficient degrees of freedom to fit
|
9682 | * the function to the given stops.
|
9683 | *
|
9684 | * Here's a bit of algebra that lets us compute `f(x)` directly from the stop
|
9685 | * values without explicitly solving for `a` and `b`:
|
9686 | *
|
9687 | * First stop value: `f(x0) = y0 = a * base^x0 + b`
|
9688 | * Second stop value: `f(x1) = y1 = a * base^x1 + b`
|
9689 | * => `y1 - y0 = a(base^x1 - base^x0)`
|
9690 | * => `a = (y1 - y0)/(base^x1 - base^x0)`
|
9691 | *
|
9692 | * Desired value: `f(x) = y = a * base^x + b`
|
9693 | * => `f(x) = y0 + a * (base^x - base^x0)`
|
9694 | *
|
9695 | * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a
|
9696 | * little algebra:
|
9697 | * ```
|
9698 | * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0)
|
9699 | * = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0)
|
9700 | * ```
|
9701 | *
|
9702 | * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have
|
9703 | * `f(x) = y0 + (y1 - y0) * ratio`. In other words, `ratio` may be treated as
|
9704 | * an interpolation factor between the two stops' output values.
|
9705 | *
|
9706 | * (Note: a slightly different form for `ratio`,
|
9707 | * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer
|
9708 | * expensive `Math.pow()` operations.)
|
9709 | *
|
9710 | * @private
|
9711 | */
|
9712 | function interpolationFactor(input, base, lowerValue, upperValue) {
|
9713 | const difference = upperValue - lowerValue;
|
9714 | const progress = input - lowerValue;
|
9715 | if (difference === 0) {
|
9716 | return 0;
|
9717 | }
|
9718 | else if (base === 1) {
|
9719 | return progress / difference;
|
9720 | }
|
9721 | else {
|
9722 | return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);
|
9723 | }
|
9724 | }
|
9725 |
|
9726 | class StyleExpression {
|
9727 | constructor(expression, propertySpec) {
|
9728 | this.expression = expression;
|
9729 | this._warningHistory = {};
|
9730 | this._evaluator = new EvaluationContext();
|
9731 | this._defaultValue = propertySpec ? getDefaultValue(propertySpec) : null;
|
9732 | this._enumValues = propertySpec && propertySpec.type === 'enum' ? propertySpec.values : null;
|
9733 | }
|
9734 | evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) {
|
9735 | this._evaluator.globals = globals;
|
9736 | this._evaluator.feature = feature;
|
9737 | this._evaluator.featureState = featureState;
|
9738 | this._evaluator.canonical = canonical;
|
9739 | this._evaluator.availableImages = availableImages || null;
|
9740 | this._evaluator.formattedSection = formattedSection;
|
9741 | return this.expression.evaluate(this._evaluator);
|
9742 | }
|
9743 | evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) {
|
9744 | this._evaluator.globals = globals;
|
9745 | this._evaluator.feature = feature || null;
|
9746 | this._evaluator.featureState = featureState || null;
|
9747 | this._evaluator.canonical = canonical;
|
9748 | this._evaluator.availableImages = availableImages || null;
|
9749 | this._evaluator.formattedSection = formattedSection || null;
|
9750 | try {
|
9751 | const val = this.expression.evaluate(this._evaluator);
|
9752 | // eslint-disable-next-line no-self-compare
|
9753 | if (val === null || val === undefined || (typeof val === 'number' && val !== val)) {
|
9754 | return this._defaultValue;
|
9755 | }
|
9756 | if (this._enumValues && !(val in this._enumValues)) {
|
9757 | throw new RuntimeError(`Expected value to be one of ${Object.keys(this._enumValues).map(v => JSON.stringify(v)).join(', ')}, but found ${JSON.stringify(val)} instead.`);
|
9758 | }
|
9759 | return val;
|
9760 | }
|
9761 | catch (e) {
|
9762 | if (!this._warningHistory[e.message]) {
|
9763 | this._warningHistory[e.message] = true;
|
9764 | if (typeof console !== 'undefined') {
|
9765 | console.warn(e.message);
|
9766 | }
|
9767 | }
|
9768 | return this._defaultValue;
|
9769 | }
|
9770 | }
|
9771 | }
|
9772 | function isExpression(expression) {
|
9773 | return Array.isArray(expression) && expression.length > 0 &&
|
9774 | typeof expression[0] === 'string' && expression[0] in expressions;
|
9775 | }
|
9776 | /**
|
9777 | * Parse and typecheck the given style spec JSON expression. If
|
9778 | * options.defaultValue is provided, then the resulting StyleExpression's
|
9779 | * `evaluate()` method will handle errors by logging a warning (once per
|
9780 | * message) and returning the default value. Otherwise, it will throw
|
9781 | * evaluation errors.
|
9782 | *
|
9783 | * @private
|
9784 | */
|
9785 | function createExpression(expression, propertySpec) {
|
9786 | const parser = new ParsingContext$1(expressions, [], propertySpec ? getExpectedType(propertySpec) : undefined);
|
9787 | // For string-valued properties, coerce to string at the top level rather than asserting.
|
9788 | const parsed = parser.parse(expression, undefined, undefined, undefined, propertySpec && propertySpec.type === 'string' ? { typeAnnotation: 'coerce' } : undefined);
|
9789 | if (!parsed) {
|
9790 | assert$1(parser.errors.length > 0);
|
9791 | return error(parser.errors);
|
9792 | }
|
9793 | return success(new StyleExpression(parsed, propertySpec));
|
9794 | }
|
9795 | class ZoomConstantExpression {
|
9796 | constructor(kind, expression) {
|
9797 | this.kind = kind;
|
9798 | this._styleExpression = expression;
|
9799 | this.isStateDependent = kind !== 'constant' && !isStateConstant(expression.expression);
|
9800 | }
|
9801 | evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) {
|
9802 | return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection);
|
9803 | }
|
9804 | evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) {
|
9805 | return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection);
|
9806 | }
|
9807 | }
|
9808 | class ZoomDependentExpression {
|
9809 | constructor(kind, expression, zoomStops, interpolationType) {
|
9810 | this.kind = kind;
|
9811 | this.zoomStops = zoomStops;
|
9812 | this._styleExpression = expression;
|
9813 | this.isStateDependent = kind !== 'camera' && !isStateConstant(expression.expression);
|
9814 | this.interpolationType = interpolationType;
|
9815 | }
|
9816 | evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) {
|
9817 | return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection);
|
9818 | }
|
9819 | evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) {
|
9820 | return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection);
|
9821 | }
|
9822 | interpolationFactor(input, lower, upper) {
|
9823 | if (this.interpolationType) {
|
9824 | return Interpolate.interpolationFactor(this.interpolationType, input, lower, upper);
|
9825 | }
|
9826 | else {
|
9827 | return 0;
|
9828 | }
|
9829 | }
|
9830 | }
|
9831 | function createPropertyExpression(expressionInput, propertySpec) {
|
9832 | const expression = createExpression(expressionInput, propertySpec);
|
9833 | if (expression.result === 'error') {
|
9834 | return expression;
|
9835 | }
|
9836 | const parsed = expression.value.expression;
|
9837 | const isFeatureConstant$1 = isFeatureConstant(parsed);
|
9838 | if (!isFeatureConstant$1 && !supportsPropertyExpression(propertySpec)) {
|
9839 | return error([new ParsingError('', 'data expressions not supported')]);
|
9840 | }
|
9841 | const isZoomConstant = isGlobalPropertyConstant(parsed, ['zoom']);
|
9842 | if (!isZoomConstant && !supportsZoomExpression(propertySpec)) {
|
9843 | return error([new ParsingError('', 'zoom expressions not supported')]);
|
9844 | }
|
9845 | const zoomCurve = findZoomCurve(parsed);
|
9846 | if (!zoomCurve && !isZoomConstant) {
|
9847 | return error([new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')]);
|
9848 | }
|
9849 | else if (zoomCurve instanceof ParsingError) {
|
9850 | return error([zoomCurve]);
|
9851 | }
|
9852 | else if (zoomCurve instanceof Interpolate && !supportsInterpolation(propertySpec)) {
|
9853 | return error([new ParsingError('', '"interpolate" expressions cannot be used with this property')]);
|
9854 | }
|
9855 | if (!zoomCurve) {
|
9856 | return success(isFeatureConstant$1 ?
|
9857 | new ZoomConstantExpression('constant', expression.value) :
|
9858 | new ZoomConstantExpression('source', expression.value));
|
9859 | }
|
9860 | const interpolationType = zoomCurve instanceof Interpolate ? zoomCurve.interpolation : undefined;
|
9861 | return success(isFeatureConstant$1 ?
|
9862 | new ZoomDependentExpression('camera', expression.value, zoomCurve.labels, interpolationType) :
|
9863 | new ZoomDependentExpression('composite', expression.value, zoomCurve.labels, interpolationType));
|
9864 | }
|
9865 | // serialization wrapper for old-style stop functions normalized to the
|
9866 | // expression interface
|
9867 | class StylePropertyFunction {
|
9868 | constructor(parameters, specification) {
|
9869 | this._parameters = parameters;
|
9870 | this._specification = specification;
|
9871 | extend(this, createFunction(this._parameters, this._specification));
|
9872 | }
|
9873 | static deserialize(serialized) {
|
9874 | return new StylePropertyFunction(serialized._parameters, serialized._specification);
|
9875 | }
|
9876 | static serialize(input) {
|
9877 | return {
|
9878 | _parameters: input._parameters,
|
9879 | _specification: input._specification
|
9880 | };
|
9881 | }
|
9882 | }
|
9883 | function normalizePropertyExpression(value, specification) {
|
9884 | if (isFunction(value)) {
|
9885 | return new StylePropertyFunction(value, specification);
|
9886 | }
|
9887 | else if (isExpression(value)) {
|
9888 | const expression = createPropertyExpression(value, specification);
|
9889 | if (expression.result === 'error') {
|
9890 | // this should have been caught in validation
|
9891 | throw new Error(expression.value.map(err => `${err.key}: ${err.message}`).join(', '));
|
9892 | }
|
9893 | return expression.value;
|
9894 | }
|
9895 | else {
|
9896 | let constant = value;
|
9897 | if (typeof value === 'string' && specification.type === 'color') {
|
9898 | constant = Color.parse(value);
|
9899 | }
|
9900 | return {
|
9901 | kind: 'constant',
|
9902 | evaluate: () => constant
|
9903 | };
|
9904 | }
|
9905 | }
|
9906 | // Zoom-dependent expressions may only use ["zoom"] as the input to a top-level "step" or "interpolate"
|
9907 | // expression (collectively referred to as a "curve"). The curve may be wrapped in one or more "let" or
|
9908 | // "coalesce" expressions.
|
9909 | function findZoomCurve(expression) {
|
9910 | let result = null;
|
9911 | if (expression instanceof Let) {
|
9912 | result = findZoomCurve(expression.result);
|
9913 | }
|
9914 | else if (expression instanceof Coalesce) {
|
9915 | for (const arg of expression.args) {
|
9916 | result = findZoomCurve(arg);
|
9917 | if (result) {
|
9918 | break;
|
9919 | }
|
9920 | }
|
9921 | }
|
9922 | else if ((expression instanceof Step || expression instanceof Interpolate) &&
|
9923 | expression.input instanceof CompoundExpression &&
|
9924 | expression.input.name === 'zoom') {
|
9925 | result = expression;
|
9926 | }
|
9927 | if (result instanceof ParsingError) {
|
9928 | return result;
|
9929 | }
|
9930 | expression.eachChild((child) => {
|
9931 | const childResult = findZoomCurve(child);
|
9932 | if (childResult instanceof ParsingError) {
|
9933 | result = childResult;
|
9934 | }
|
9935 | else if (!result && childResult) {
|
9936 | result = new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.');
|
9937 | }
|
9938 | else if (result && childResult && result !== childResult) {
|
9939 | result = new ParsingError('', 'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.');
|
9940 | }
|
9941 | });
|
9942 | return result;
|
9943 | }
|
9944 | function getExpectedType(spec) {
|
9945 | const types = {
|
9946 | color: ColorType,
|
9947 | string: StringType,
|
9948 | number: NumberType,
|
9949 | enum: StringType,
|
9950 | boolean: BooleanType,
|
9951 | formatted: FormattedType,
|
9952 | resolvedImage: ResolvedImageType
|
9953 | };
|
9954 | if (spec.type === 'array') {
|
9955 | return array$1(types[spec.value] || ValueType, spec.length);
|
9956 | }
|
9957 | return types[spec.type];
|
9958 | }
|
9959 | function getDefaultValue(spec) {
|
9960 | if (spec.type === 'color' && isFunction(spec.default)) {
|
9961 | // Special case for heatmap-color: it uses the 'default:' to define a
|
9962 | // default color ramp, but createExpression expects a simple value to fall
|
9963 | // back to in case of runtime errors
|
9964 | return new Color(0, 0, 0, 0);
|
9965 | }
|
9966 | else if (spec.type === 'color') {
|
9967 | return Color.parse(spec.default) || null;
|
9968 | }
|
9969 | else if (spec.default === undefined) {
|
9970 | return null;
|
9971 | }
|
9972 | else {
|
9973 | return spec.default;
|
9974 | }
|
9975 | }
|
9976 |
|
9977 | function validateObject(options) {
|
9978 | const key = options.key;
|
9979 | const object = options.value;
|
9980 | const elementSpecs = options.valueSpec || {};
|
9981 | const elementValidators = options.objectElementValidators || {};
|
9982 | const style = options.style;
|
9983 | const styleSpec = options.styleSpec;
|
9984 | let errors = [];
|
9985 | const type = getType(object);
|
9986 | if (type !== 'object') {
|
9987 | return [new ValidationError(key, object, `object expected, ${type} found`)];
|
9988 | }
|
9989 | for (const objectKey in object) {
|
9990 | const elementSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint'
|
9991 | const elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*'];
|
9992 | let validateElement;
|
9993 | if (elementValidators[elementSpecKey]) {
|
9994 | validateElement = elementValidators[elementSpecKey];
|
9995 | }
|
9996 | else if (elementSpecs[elementSpecKey]) {
|
9997 | validateElement = validate;
|
9998 | }
|
9999 | else if (elementValidators['*']) {
|
10000 | validateElement = elementValidators['*'];
|
10001 | }
|
10002 | else if (elementSpecs['*']) {
|
10003 | validateElement = validate;
|
10004 | }
|
10005 | else {
|
10006 | errors.push(new ValidationError(key, object[objectKey], `unknown property "${objectKey}"`));
|
10007 | continue;
|
10008 | }
|
10009 | errors = errors.concat(validateElement({
|
10010 | key: (key ? `${key}.` : key) + objectKey,
|
10011 | value: object[objectKey],
|
10012 | valueSpec: elementSpec,
|
10013 | style,
|
10014 | styleSpec,
|
10015 | object,
|
10016 | objectKey
|
10017 | }, object));
|
10018 | }
|
10019 | for (const elementSpecKey in elementSpecs) {
|
10020 | // Don't check `required` when there's a custom validator for that property.
|
10021 | if (elementValidators[elementSpecKey]) {
|
10022 | continue;
|
10023 | }
|
10024 | if (elementSpecs[elementSpecKey].required && elementSpecs[elementSpecKey]['default'] === undefined && object[elementSpecKey] === undefined) {
|
10025 | errors.push(new ValidationError(key, object, `missing required property "${elementSpecKey}"`));
|
10026 | }
|
10027 | }
|
10028 | return errors;
|
10029 | }
|
10030 |
|
10031 | function validateArray(options) {
|
10032 | const array = options.value;
|
10033 | const arraySpec = options.valueSpec;
|
10034 | const style = options.style;
|
10035 | const styleSpec = options.styleSpec;
|
10036 | const key = options.key;
|
10037 | const validateArrayElement = options.arrayElementValidator || validate;
|
10038 | if (getType(array) !== 'array') {
|
10039 | return [new ValidationError(key, array, `array expected, ${getType(array)} found`)];
|
10040 | }
|
10041 | if (arraySpec.length && array.length !== arraySpec.length) {
|
10042 | return [new ValidationError(key, array, `array length ${arraySpec.length} expected, length ${array.length} found`)];
|
10043 | }
|
10044 | if (arraySpec['min-length'] && array.length < arraySpec['min-length']) {
|
10045 | return [new ValidationError(key, array, `array length at least ${arraySpec['min-length']} expected, length ${array.length} found`)];
|
10046 | }
|
10047 | let arrayElementSpec = {
|
10048 | 'type': arraySpec.value,
|
10049 | 'values': arraySpec.values
|
10050 | };
|
10051 | if (styleSpec.$version < 7) {
|
10052 | arrayElementSpec['function'] = arraySpec.function;
|
10053 | }
|
10054 | if (getType(arraySpec.value) === 'object') {
|
10055 | arrayElementSpec = arraySpec.value;
|
10056 | }
|
10057 | let errors = [];
|
10058 | for (let i = 0; i < array.length; i++) {
|
10059 | errors = errors.concat(validateArrayElement({
|
10060 | array,
|
10061 | arrayIndex: i,
|
10062 | value: array[i],
|
10063 | valueSpec: arrayElementSpec,
|
10064 | style,
|
10065 | styleSpec,
|
10066 | key: `${key}[${i}]`
|
10067 | }));
|
10068 | }
|
10069 | return errors;
|
10070 | }
|
10071 |
|
10072 | function validateNumber(options) {
|
10073 | const key = options.key;
|
10074 | const value = options.value;
|
10075 | const valueSpec = options.valueSpec;
|
10076 | let type = getType(value);
|
10077 | // eslint-disable-next-line no-self-compare
|
10078 | if (type === 'number' && value !== value) {
|
10079 | type = 'NaN';
|
10080 | }
|
10081 | if (type !== 'number') {
|
10082 | return [new ValidationError(key, value, `number expected, ${type} found`)];
|
10083 | }
|
10084 | if ('minimum' in valueSpec && value < valueSpec.minimum) {
|
10085 | return [new ValidationError(key, value, `${value} is less than the minimum value ${valueSpec.minimum}`)];
|
10086 | }
|
10087 | if ('maximum' in valueSpec && value > valueSpec.maximum) {
|
10088 | return [new ValidationError(key, value, `${value} is greater than the maximum value ${valueSpec.maximum}`)];
|
10089 | }
|
10090 | return [];
|
10091 | }
|
10092 |
|
10093 | function validateFunction(options) {
|
10094 | const functionValueSpec = options.valueSpec;
|
10095 | const functionType = unbundle(options.value.type);
|
10096 | let stopKeyType;
|
10097 | let stopDomainValues = {};
|
10098 | let previousStopDomainValue;
|
10099 | let previousStopDomainZoom;
|
10100 | const isZoomFunction = functionType !== 'categorical' && options.value.property === undefined;
|
10101 | const isPropertyFunction = !isZoomFunction;
|
10102 | const isZoomAndPropertyFunction = getType(options.value.stops) === 'array' &&
|
10103 | getType(options.value.stops[0]) === 'array' &&
|
10104 | getType(options.value.stops[0][0]) === 'object';
|
10105 | const errors = validateObject({
|
10106 | key: options.key,
|
10107 | value: options.value,
|
10108 | valueSpec: options.styleSpec.function,
|
10109 | style: options.style,
|
10110 | styleSpec: options.styleSpec,
|
10111 | objectElementValidators: {
|
10112 | stops: validateFunctionStops,
|
10113 | default: validateFunctionDefault
|
10114 | }
|
10115 | });
|
10116 | if (functionType === 'identity' && isZoomFunction) {
|
10117 | errors.push(new ValidationError(options.key, options.value, 'missing required property "property"'));
|
10118 | }
|
10119 | if (functionType !== 'identity' && !options.value.stops) {
|
10120 | errors.push(new ValidationError(options.key, options.value, 'missing required property "stops"'));
|
10121 | }
|
10122 | if (functionType === 'exponential' && options.valueSpec.expression && !supportsInterpolation(options.valueSpec)) {
|
10123 | errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported'));
|
10124 | }
|
10125 | if (options.styleSpec.$version >= 8) {
|
10126 | if (isPropertyFunction && !supportsPropertyExpression(options.valueSpec)) {
|
10127 | errors.push(new ValidationError(options.key, options.value, 'property functions not supported'));
|
10128 | }
|
10129 | else if (isZoomFunction && !supportsZoomExpression(options.valueSpec)) {
|
10130 | errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported'));
|
10131 | }
|
10132 | }
|
10133 | if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) {
|
10134 | errors.push(new ValidationError(options.key, options.value, '"property" property is required'));
|
10135 | }
|
10136 | return errors;
|
10137 | function validateFunctionStops(options) {
|
10138 | if (functionType === 'identity') {
|
10139 | return [new ValidationError(options.key, options.value, 'identity function may not have a "stops" property')];
|
10140 | }
|
10141 | let errors = [];
|
10142 | const value = options.value;
|
10143 | errors = errors.concat(validateArray({
|
10144 | key: options.key,
|
10145 | value,
|
10146 | valueSpec: options.valueSpec,
|
10147 | style: options.style,
|
10148 | styleSpec: options.styleSpec,
|
10149 | arrayElementValidator: validateFunctionStop
|
10150 | }));
|
10151 | if (getType(value) === 'array' && value.length === 0) {
|
10152 | errors.push(new ValidationError(options.key, value, 'array must have at least one stop'));
|
10153 | }
|
10154 | return errors;
|
10155 | }
|
10156 | function validateFunctionStop(options) {
|
10157 | let errors = [];
|
10158 | const value = options.value;
|
10159 | const key = options.key;
|
10160 | if (getType(value) !== 'array') {
|
10161 | return [new ValidationError(key, value, `array expected, ${getType(value)} found`)];
|
10162 | }
|
10163 | if (value.length !== 2) {
|
10164 | return [new ValidationError(key, value, `array length 2 expected, length ${value.length} found`)];
|
10165 | }
|
10166 | if (isZoomAndPropertyFunction) {
|
10167 | if (getType(value[0]) !== 'object') {
|
10168 | return [new ValidationError(key, value, `object expected, ${getType(value[0])} found`)];
|
10169 | }
|
10170 | if (value[0].zoom === undefined) {
|
10171 | return [new ValidationError(key, value, 'object stop key must have zoom')];
|
10172 | }
|
10173 | if (value[0].value === undefined) {
|
10174 | return [new ValidationError(key, value, 'object stop key must have value')];
|
10175 | }
|
10176 | if (previousStopDomainZoom && previousStopDomainZoom > unbundle(value[0].zoom)) {
|
10177 | return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')];
|
10178 | }
|
10179 | if (unbundle(value[0].zoom) !== previousStopDomainZoom) {
|
10180 | previousStopDomainZoom = unbundle(value[0].zoom);
|
10181 | previousStopDomainValue = undefined;
|
10182 | stopDomainValues = {};
|
10183 | }
|
10184 | errors = errors.concat(validateObject({
|
10185 | key: `${key}[0]`,
|
10186 | value: value[0],
|
10187 | valueSpec: { zoom: {} },
|
10188 | style: options.style,
|
10189 | styleSpec: options.styleSpec,
|
10190 | objectElementValidators: { zoom: validateNumber, value: validateStopDomainValue }
|
10191 | }));
|
10192 | }
|
10193 | else {
|
10194 | errors = errors.concat(validateStopDomainValue({
|
10195 | key: `${key}[0]`,
|
10196 | value: value[0],
|
10197 | valueSpec: {},
|
10198 | style: options.style,
|
10199 | styleSpec: options.styleSpec
|
10200 | }, value));
|
10201 | }
|
10202 | if (isExpression(deepUnbundle(value[1]))) {
|
10203 | return errors.concat([new ValidationError(`${key}[1]`, value[1], 'expressions are not allowed in function stops.')]);
|
10204 | }
|
10205 | return errors.concat(validate({
|
10206 | key: `${key}[1]`,
|
10207 | value: value[1],
|
10208 | valueSpec: functionValueSpec,
|
10209 | style: options.style,
|
10210 | styleSpec: options.styleSpec
|
10211 | }));
|
10212 | }
|
10213 | function validateStopDomainValue(options, stop) {
|
10214 | const type = getType(options.value);
|
10215 | const value = unbundle(options.value);
|
10216 | const reportValue = options.value !== null ? options.value : stop;
|
10217 | if (!stopKeyType) {
|
10218 | stopKeyType = type;
|
10219 | }
|
10220 | else if (type !== stopKeyType) {
|
10221 | return [new ValidationError(options.key, reportValue, `${type} stop domain type must match previous stop domain type ${stopKeyType}`)];
|
10222 | }
|
10223 | if (type !== 'number' && type !== 'string' && type !== 'boolean') {
|
10224 | return [new ValidationError(options.key, reportValue, 'stop domain value must be a number, string, or boolean')];
|
10225 | }
|
10226 | if (type !== 'number' && functionType !== 'categorical') {
|
10227 | let message = `number expected, ${type} found`;
|
10228 | if (supportsPropertyExpression(functionValueSpec) && functionType === undefined) {
|
10229 | message += '\nIf you intended to use a categorical function, specify `"type": "categorical"`.';
|
10230 | }
|
10231 | return [new ValidationError(options.key, reportValue, message)];
|
10232 | }
|
10233 | if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) {
|
10234 | return [new ValidationError(options.key, reportValue, `integer expected, found ${value}`)];
|
10235 | }
|
10236 | if (functionType !== 'categorical' && type === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) {
|
10237 | return [new ValidationError(options.key, reportValue, 'stop domain values must appear in ascending order')];
|
10238 | }
|
10239 | else {
|
10240 | previousStopDomainValue = value;
|
10241 | }
|
10242 | if (functionType === 'categorical' && value in stopDomainValues) {
|
10243 | return [new ValidationError(options.key, reportValue, 'stop domain values must be unique')];
|
10244 | }
|
10245 | else {
|
10246 | stopDomainValues[value] = true;
|
10247 | }
|
10248 | return [];
|
10249 | }
|
10250 | function validateFunctionDefault(options) {
|
10251 | return validate({
|
10252 | key: options.key,
|
10253 | value: options.value,
|
10254 | valueSpec: functionValueSpec,
|
10255 | style: options.style,
|
10256 | styleSpec: options.styleSpec
|
10257 | });
|
10258 | }
|
10259 | }
|
10260 |
|
10261 | function validateExpression(options) {
|
10262 | const expression = (options.expressionContext === 'property' ? createPropertyExpression : createExpression)(deepUnbundle(options.value), options.valueSpec);
|
10263 | if (expression.result === 'error') {
|
10264 | return expression.value.map((error) => {
|
10265 | return new ValidationError(`${options.key}${error.key}`, options.value, error.message);
|
10266 | });
|
10267 | }
|
10268 | const expressionObj = expression.value.expression || expression.value._styleExpression.expression;
|
10269 | if (options.expressionContext === 'property' && (options.propertyKey === 'text-font') &&
|
10270 | !expressionObj.outputDefined()) {
|
10271 | return [new ValidationError(options.key, options.value, `Invalid data expression for "${options.propertyKey}". Output values must be contained as literals within the expression.`)];
|
10272 | }
|
10273 | if (options.expressionContext === 'property' && options.propertyType === 'layout' &&
|
10274 | (!isStateConstant(expressionObj))) {
|
10275 | return [new ValidationError(options.key, options.value, '"feature-state" data expressions are not supported with layout properties.')];
|
10276 | }
|
10277 | if (options.expressionContext === 'filter' && !isStateConstant(expressionObj)) {
|
10278 | return [new ValidationError(options.key, options.value, '"feature-state" data expressions are not supported with filters.')];
|
10279 | }
|
10280 | if (options.expressionContext && options.expressionContext.indexOf('cluster') === 0) {
|
10281 | if (!isGlobalPropertyConstant(expressionObj, ['zoom', 'feature-state'])) {
|
10282 | return [new ValidationError(options.key, options.value, '"zoom" and "feature-state" expressions are not supported with cluster properties.')];
|
10283 | }
|
10284 | if (options.expressionContext === 'cluster-initial' && !isFeatureConstant(expressionObj)) {
|
10285 | return [new ValidationError(options.key, options.value, 'Feature data expressions are not supported with initial expression part of cluster properties.')];
|
10286 | }
|
10287 | }
|
10288 | return [];
|
10289 | }
|
10290 |
|
10291 | function validateBoolean(options) {
|
10292 | const value = options.value;
|
10293 | const key = options.key;
|
10294 | const type = getType(value);
|
10295 | if (type !== 'boolean') {
|
10296 | return [new ValidationError(key, value, `boolean expected, ${type} found`)];
|
10297 | }
|
10298 | return [];
|
10299 | }
|
10300 |
|
10301 | function validateColor(options) {
|
10302 | const key = options.key;
|
10303 | const value = options.value;
|
10304 | const type = getType(value);
|
10305 | if (type !== 'string') {
|
10306 | return [new ValidationError(key, value, `color expected, ${type} found`)];
|
10307 | }
|
10308 | if (parseCSSColor_1(value) === null) {
|
10309 | return [new ValidationError(key, value, `color expected, "${value}" found`)];
|
10310 | }
|
10311 | return [];
|
10312 | }
|
10313 |
|
10314 | function validateEnum(options) {
|
10315 | const key = options.key;
|
10316 | const value = options.value;
|
10317 | const valueSpec = options.valueSpec;
|
10318 | const errors = [];
|
10319 | if (Array.isArray(valueSpec.values)) { // <=v7
|
10320 | if (valueSpec.values.indexOf(unbundle(value)) === -1) {
|
10321 | errors.push(new ValidationError(key, value, `expected one of [${valueSpec.values.join(', ')}], ${JSON.stringify(value)} found`));
|
10322 | }
|
10323 | }
|
10324 | else { // >=v8
|
10325 | if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) {
|
10326 | errors.push(new ValidationError(key, value, `expected one of [${Object.keys(valueSpec.values).join(', ')}], ${JSON.stringify(value)} found`));
|
10327 | }
|
10328 | }
|
10329 | return errors;
|
10330 | }
|
10331 |
|
10332 | function isExpressionFilter(filter) {
|
10333 | if (filter === true || filter === false) {
|
10334 | return true;
|
10335 | }
|
10336 | if (!Array.isArray(filter) || filter.length === 0) {
|
10337 | return false;
|
10338 | }
|
10339 | switch (filter[0]) {
|
10340 | case 'has':
|
10341 | return filter.length >= 2 && filter[1] !== '$id' && filter[1] !== '$type';
|
10342 | case 'in':
|
10343 | return filter.length >= 3 && (typeof filter[1] !== 'string' || Array.isArray(filter[2]));
|
10344 | case '!in':
|
10345 | case '!has':
|
10346 | case 'none':
|
10347 | return false;
|
10348 | case '==':
|
10349 | case '!=':
|
10350 | case '>':
|
10351 | case '>=':
|
10352 | case '<':
|
10353 | case '<=':
|
10354 | return filter.length !== 3 || (Array.isArray(filter[1]) || Array.isArray(filter[2]));
|
10355 | case 'any':
|
10356 | case 'all':
|
10357 | for (const f of filter.slice(1)) {
|
10358 | if (!isExpressionFilter(f) && typeof f !== 'boolean') {
|
10359 | return false;
|
10360 | }
|
10361 | }
|
10362 | return true;
|
10363 | default:
|
10364 | return true;
|
10365 | }
|
10366 | }
|
10367 | const filterSpec = {
|
10368 | 'type': 'boolean',
|
10369 | 'default': false,
|
10370 | 'transition': false,
|
10371 | 'property-type': 'data-driven',
|
10372 | 'expression': {
|
10373 | 'interpolated': false,
|
10374 | 'parameters': ['zoom', 'feature']
|
10375 | }
|
10376 | };
|
10377 | /**
|
10378 | * Given a filter expressed as nested arrays, return a new function
|
10379 | * that evaluates whether a given feature (with a .properties or .tags property)
|
10380 | * passes its test.
|
10381 | *
|
10382 | * @private
|
10383 | * @param {Array} filter maplibre gl filter
|
10384 | * @returns {Function} filter-evaluating function
|
10385 | */
|
10386 | function createFilter(filter) {
|
10387 | if (filter === null || filter === undefined) {
|
10388 | return { filter: () => true, needGeometry: false };
|
10389 | }
|
10390 | if (!isExpressionFilter(filter)) {
|
10391 | filter = convertFilter(filter);
|
10392 | }
|
10393 | const compiled = createExpression(filter, filterSpec);
|
10394 | if (compiled.result === 'error') {
|
10395 | throw new Error(compiled.value.map(err => `${err.key}: ${err.message}`).join(', '));
|
10396 | }
|
10397 | else {
|
10398 | const needGeometry = geometryNeeded(filter);
|
10399 | return { filter: (globalProperties, feature, canonical) => compiled.value.evaluate(globalProperties, feature, {}, canonical),
|
10400 | needGeometry };
|
10401 | }
|
10402 | }
|
10403 | // Comparison function to sort numbers and strings
|
10404 | function compare(a, b) {
|
10405 | return a < b ? -1 : a > b ? 1 : 0;
|
10406 | }
|
10407 | function geometryNeeded(filter) {
|
10408 | if (!Array.isArray(filter))
|
10409 | return false;
|
10410 | if (filter[0] === 'within')
|
10411 | return true;
|
10412 | for (let index = 1; index < filter.length; index++) {
|
10413 | if (geometryNeeded(filter[index]))
|
10414 | return true;
|
10415 | }
|
10416 | return false;
|
10417 | }
|
10418 | function convertFilter(filter) {
|
10419 | if (!filter)
|
10420 | return true;
|
10421 | const op = filter[0];
|
10422 | if (filter.length <= 1)
|
10423 | return (op !== 'any');
|
10424 | const converted = op === '==' ? convertComparisonOp(filter[1], filter[2], '==') :
|
10425 | op === '!=' ? convertNegation(convertComparisonOp(filter[1], filter[2], '==')) :
|
10426 | op === '<' ||
|
10427 | op === '>' ||
|
10428 | op === '<=' ||
|
10429 | op === '>=' ? convertComparisonOp(filter[1], filter[2], op) :
|
10430 | op === 'any' ? convertDisjunctionOp(filter.slice(1)) :
|
10431 | op === 'all' ? ['all'].concat(filter.slice(1).map(convertFilter)) :
|
10432 | op === 'none' ? ['all'].concat(filter.slice(1).map(convertFilter).map(convertNegation)) :
|
10433 | op === 'in' ? convertInOp(filter[1], filter.slice(2)) :
|
10434 | op === '!in' ? convertNegation(convertInOp(filter[1], filter.slice(2))) :
|
10435 | op === 'has' ? convertHasOp(filter[1]) :
|
10436 | op === '!has' ? convertNegation(convertHasOp(filter[1])) :
|
10437 | op === 'within' ? filter :
|
10438 | true;
|
10439 | return converted;
|
10440 | }
|
10441 | function convertComparisonOp(property, value, op) {
|
10442 | switch (property) {
|
10443 | case '$type':
|
10444 | return [`filter-type-${op}`, value];
|
10445 | case '$id':
|
10446 | return [`filter-id-${op}`, value];
|
10447 | default:
|
10448 | return [`filter-${op}`, property, value];
|
10449 | }
|
10450 | }
|
10451 | function convertDisjunctionOp(filters) {
|
10452 | return ['any'].concat(filters.map(convertFilter));
|
10453 | }
|
10454 | function convertInOp(property, values) {
|
10455 | if (values.length === 0) {
|
10456 | return false;
|
10457 | }
|
10458 | switch (property) {
|
10459 | case '$type':
|
10460 | return ['filter-type-in', ['literal', values]];
|
10461 | case '$id':
|
10462 | return ['filter-id-in', ['literal', values]];
|
10463 | default:
|
10464 | if (values.length > 200 && !values.some(v => typeof v !== typeof values[0])) {
|
10465 | return ['filter-in-large', property, ['literal', values.sort(compare)]];
|
10466 | }
|
10467 | else {
|
10468 | return ['filter-in-small', property, ['literal', values]];
|
10469 | }
|
10470 | }
|
10471 | }
|
10472 | function convertHasOp(property) {
|
10473 | switch (property) {
|
10474 | case '$type':
|
10475 | return true;
|
10476 | case '$id':
|
10477 | return ['filter-has-id'];
|
10478 | default:
|
10479 | return ['filter-has', property];
|
10480 | }
|
10481 | }
|
10482 | function convertNegation(filter) {
|
10483 | return ['!', filter];
|
10484 | }
|
10485 |
|
10486 | function validateFilter$1(options) {
|
10487 | if (isExpressionFilter(deepUnbundle(options.value))) {
|
10488 | return validateExpression(extend({}, options, {
|
10489 | expressionContext: 'filter',
|
10490 | valueSpec: { value: 'boolean' }
|
10491 | }));
|
10492 | }
|
10493 | else {
|
10494 | return validateNonExpressionFilter(options);
|
10495 | }
|
10496 | }
|
10497 | function validateNonExpressionFilter(options) {
|
10498 | const value = options.value;
|
10499 | const key = options.key;
|
10500 | if (getType(value) !== 'array') {
|
10501 | return [new ValidationError(key, value, `array expected, ${getType(value)} found`)];
|
10502 | }
|
10503 | const styleSpec = options.styleSpec;
|
10504 | let type;
|
10505 | let errors = [];
|
10506 | if (value.length < 1) {
|
10507 | return [new ValidationError(key, value, 'filter array must have at least 1 element')];
|
10508 | }
|
10509 | errors = errors.concat(validateEnum({
|
10510 | key: `${key}[0]`,
|
10511 | value: value[0],
|
10512 | valueSpec: styleSpec.filter_operator,
|
10513 | style: options.style,
|
10514 | styleSpec: options.styleSpec
|
10515 | }));
|
10516 | switch (unbundle(value[0])) {
|
10517 | case '<':
|
10518 | case '<=':
|
10519 | case '>':
|
10520 | case '>=':
|
10521 | if (value.length >= 2 && unbundle(value[1]) === '$type') {
|
10522 | errors.push(new ValidationError(key, value, `"$type" cannot be use with operator "${value[0]}"`));
|
10523 | }
|
10524 | /* falls through */
|
10525 | case '==':
|
10526 | case '!=':
|
10527 | if (value.length !== 3) {
|
10528 | errors.push(new ValidationError(key, value, `filter array for operator "${value[0]}" must have 3 elements`));
|
10529 | }
|
10530 | /* falls through */
|
10531 | case 'in':
|
10532 | case '!in':
|
10533 | if (value.length >= 2) {
|
10534 | type = getType(value[1]);
|
10535 | if (type !== 'string') {
|
10536 | errors.push(new ValidationError(`${key}[1]`, value[1], `string expected, ${type} found`));
|
10537 | }
|
10538 | }
|
10539 | for (let i = 2; i < value.length; i++) {
|
10540 | type = getType(value[i]);
|
10541 | if (unbundle(value[1]) === '$type') {
|
10542 | errors = errors.concat(validateEnum({
|
10543 | key: `${key}[${i}]`,
|
10544 | value: value[i],
|
10545 | valueSpec: styleSpec.geometry_type,
|
10546 | style: options.style,
|
10547 | styleSpec: options.styleSpec
|
10548 | }));
|
10549 | }
|
10550 | else if (type !== 'string' && type !== 'number' && type !== 'boolean') {
|
10551 | errors.push(new ValidationError(`${key}[${i}]`, value[i], `string, number, or boolean expected, ${type} found`));
|
10552 | }
|
10553 | }
|
10554 | break;
|
10555 | case 'any':
|
10556 | case 'all':
|
10557 | case 'none':
|
10558 | for (let i = 1; i < value.length; i++) {
|
10559 | errors = errors.concat(validateNonExpressionFilter({
|
10560 | key: `${key}[${i}]`,
|
10561 | value: value[i],
|
10562 | style: options.style,
|
10563 | styleSpec: options.styleSpec
|
10564 | }));
|
10565 | }
|
10566 | break;
|
10567 | case 'has':
|
10568 | case '!has':
|
10569 | type = getType(value[1]);
|
10570 | if (value.length !== 2) {
|
10571 | errors.push(new ValidationError(key, value, `filter array for "${value[0]}" operator must have 2 elements`));
|
10572 | }
|
10573 | else if (type !== 'string') {
|
10574 | errors.push(new ValidationError(`${key}[1]`, value[1], `string expected, ${type} found`));
|
10575 | }
|
10576 | break;
|
10577 | case 'within':
|
10578 | type = getType(value[1]);
|
10579 | if (value.length !== 2) {
|
10580 | errors.push(new ValidationError(key, value, `filter array for "${value[0]}" operator must have 2 elements`));
|
10581 | }
|
10582 | else if (type !== 'object') {
|
10583 | errors.push(new ValidationError(`${key}[1]`, value[1], `object expected, ${type} found`));
|
10584 | }
|
10585 | break;
|
10586 | }
|
10587 | return errors;
|
10588 | }
|
10589 |
|
10590 | function validateProperty(options, propertyType) {
|
10591 | const key = options.key;
|
10592 | const style = options.style;
|
10593 | const styleSpec = options.styleSpec;
|
10594 | const value = options.value;
|
10595 | const propertyKey = options.objectKey;
|
10596 | const layerSpec = styleSpec[`${propertyType}_${options.layerType}`];
|
10597 | if (!layerSpec)
|
10598 | return [];
|
10599 | const transitionMatch = propertyKey.match(/^(.*)-transition$/);
|
10600 | if (propertyType === 'paint' && transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) {
|
10601 | return validate({
|
10602 | key,
|
10603 | value,
|
10604 | valueSpec: styleSpec.transition,
|
10605 | style,
|
10606 | styleSpec
|
10607 | });
|
10608 | }
|
10609 | const valueSpec = options.valueSpec || layerSpec[propertyKey];
|
10610 | if (!valueSpec) {
|
10611 | return [new ValidationError(key, value, `unknown property "${propertyKey}"`)];
|
10612 | }
|
10613 | let tokenMatch;
|
10614 | if (getType(value) === 'string' && supportsPropertyExpression(valueSpec) && !valueSpec.tokens && (tokenMatch = /^{([^}]+)}$/.exec(value))) {
|
10615 | return [new ValidationError(key, value, `"${propertyKey}" does not support interpolation syntax\n` +
|
10616 | `Use an identity property function instead: \`{ "type": "identity", "property": ${JSON.stringify(tokenMatch[1])} }\`.`)];
|
10617 | }
|
10618 | const errors = [];
|
10619 | if (options.layerType === 'symbol') {
|
10620 | if (propertyKey === 'text-field' && style && !style.glyphs) {
|
10621 | errors.push(new ValidationError(key, value, 'use of "text-field" requires a style "glyphs" property'));
|
10622 | }
|
10623 | if (propertyKey === 'text-font' && isFunction(deepUnbundle(value)) && unbundle(value.type) === 'identity') {
|
10624 | errors.push(new ValidationError(key, value, '"text-font" does not support identity functions'));
|
10625 | }
|
10626 | }
|
10627 | return errors.concat(validate({
|
10628 | key: options.key,
|
10629 | value,
|
10630 | valueSpec,
|
10631 | style,
|
10632 | styleSpec,
|
10633 | expressionContext: 'property',
|
10634 | propertyType,
|
10635 | propertyKey
|
10636 | }));
|
10637 | }
|
10638 |
|
10639 | function validatePaintProperty$1(options) {
|
10640 | return validateProperty(options, 'paint');
|
10641 | }
|
10642 |
|
10643 | function validateLayoutProperty$1(options) {
|
10644 | return validateProperty(options, 'layout');
|
10645 | }
|
10646 |
|
10647 | function validateLayer(options) {
|
10648 | let errors = [];
|
10649 | const layer = options.value;
|
10650 | const key = options.key;
|
10651 | const style = options.style;
|
10652 | const styleSpec = options.styleSpec;
|
10653 | if (!layer.type && !layer.ref) {
|
10654 | errors.push(new ValidationError(key, layer, 'either "type" or "ref" is required'));
|
10655 | }
|
10656 | let type = unbundle(layer.type);
|
10657 | const ref = unbundle(layer.ref);
|
10658 | if (layer.id) {
|
10659 | const layerId = unbundle(layer.id);
|
10660 | for (let i = 0; i < options.arrayIndex; i++) {
|
10661 | const otherLayer = style.layers[i];
|
10662 | if (unbundle(otherLayer.id) === layerId) {
|
10663 | errors.push(new ValidationError(key, layer.id, `duplicate layer id "${layer.id}", previously used at line ${otherLayer.id.__line__}`));
|
10664 | }
|
10665 | }
|
10666 | }
|
10667 | if ('ref' in layer) {
|
10668 | ['type', 'source', 'source-layer', 'filter', 'layout'].forEach((p) => {
|
10669 | if (p in layer) {
|
10670 | errors.push(new ValidationError(key, layer[p], `"${p}" is prohibited for ref layers`));
|
10671 | }
|
10672 | });
|
10673 | let parent;
|
10674 | style.layers.forEach((layer) => {
|
10675 | if (unbundle(layer.id) === ref)
|
10676 | parent = layer;
|
10677 | });
|
10678 | if (!parent) {
|
10679 | errors.push(new ValidationError(key, layer.ref, `ref layer "${ref}" not found`));
|
10680 | }
|
10681 | else if (parent.ref) {
|
10682 | errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer'));
|
10683 | }
|
10684 | else {
|
10685 | type = unbundle(parent.type);
|
10686 | }
|
10687 | }
|
10688 | else if (type !== 'background') {
|
10689 | if (!layer.source) {
|
10690 | errors.push(new ValidationError(key, layer, 'missing required property "source"'));
|
10691 | }
|
10692 | else {
|
10693 | const source = style.sources && style.sources[layer.source];
|
10694 | const sourceType = source && unbundle(source.type);
|
10695 | if (!source) {
|
10696 | errors.push(new ValidationError(key, layer.source, `source "${layer.source}" not found`));
|
10697 | }
|
10698 | else if (sourceType === 'vector' && type === 'raster') {
|
10699 | errors.push(new ValidationError(key, layer.source, `layer "${layer.id}" requires a raster source`));
|
10700 | }
|
10701 | else if (sourceType === 'raster' && type !== 'raster') {
|
10702 | errors.push(new ValidationError(key, layer.source, `layer "${layer.id}" requires a vector source`));
|
10703 | }
|
10704 | else if (sourceType === 'vector' && !layer['source-layer']) {
|
10705 | errors.push(new ValidationError(key, layer, `layer "${layer.id}" must specify a "source-layer"`));
|
10706 | }
|
10707 | else if (sourceType === 'raster-dem' && type !== 'hillshade') {
|
10708 | errors.push(new ValidationError(key, layer.source, 'raster-dem source can only be used with layer type \'hillshade\'.'));
|
10709 | }
|
10710 | else if (type === 'line' && layer.paint && layer.paint['line-gradient'] &&
|
10711 | (sourceType !== 'geojson' || !source.lineMetrics)) {
|
10712 | errors.push(new ValidationError(key, layer, `layer "${layer.id}" specifies a line-gradient, which requires a GeoJSON source with \`lineMetrics\` enabled.`));
|
10713 | }
|
10714 | }
|
10715 | }
|
10716 | errors = errors.concat(validateObject({
|
10717 | key,
|
10718 | value: layer,
|
10719 | valueSpec: styleSpec.layer,
|
10720 | style: options.style,
|
10721 | styleSpec: options.styleSpec,
|
10722 | objectElementValidators: {
|
10723 | '*'() {
|
10724 | return [];
|
10725 | },
|
10726 | // We don't want to enforce the spec's `"requires": true` for backward compatibility with refs;
|
10727 | // the actual requirement is validated above. See https://github.com/mapbox/mapbox-gl-js/issues/5772.
|
10728 | type() {
|
10729 | return validate({
|
10730 | key: `${key}.type`,
|
10731 | value: layer.type,
|
10732 | valueSpec: styleSpec.layer.type,
|
10733 | style: options.style,
|
10734 | styleSpec: options.styleSpec,
|
10735 | object: layer,
|
10736 | objectKey: 'type'
|
10737 | });
|
10738 | },
|
10739 | filter: validateFilter$1,
|
10740 | layout(options) {
|
10741 | return validateObject({
|
10742 | layer,
|
10743 | key: options.key,
|
10744 | value: options.value,
|
10745 | style: options.style,
|
10746 | styleSpec: options.styleSpec,
|
10747 | objectElementValidators: {
|
10748 | '*'(options) {
|
10749 | return validateLayoutProperty$1(extend({ layerType: type }, options));
|
10750 | }
|
10751 | }
|
10752 | });
|
10753 | },
|
10754 | paint(options) {
|
10755 | return validateObject({
|
10756 | layer,
|
10757 | key: options.key,
|
10758 | value: options.value,
|
10759 | style: options.style,
|
10760 | styleSpec: options.styleSpec,
|
10761 | objectElementValidators: {
|
10762 | '*'(options) {
|
10763 | return validatePaintProperty$1(extend({ layerType: type }, options));
|
10764 | }
|
10765 | }
|
10766 | });
|
10767 | }
|
10768 | }
|
10769 | }));
|
10770 | return errors;
|
10771 | }
|
10772 |
|
10773 | function validateString(options) {
|
10774 | const value = options.value;
|
10775 | const key = options.key;
|
10776 | const type = getType(value);
|
10777 | if (type !== 'string') {
|
10778 | return [new ValidationError(key, value, `string expected, ${type} found`)];
|
10779 | }
|
10780 | return [];
|
10781 | }
|
10782 |
|
10783 | const objectElementValidators = {
|
10784 | promoteId: validatePromoteId
|
10785 | };
|
10786 | function validateSource$1(options) {
|
10787 | const value = options.value;
|
10788 | const key = options.key;
|
10789 | const styleSpec = options.styleSpec;
|
10790 | const style = options.style;
|
10791 | if (!value.type) {
|
10792 | return [new ValidationError(key, value, '"type" is required')];
|
10793 | }
|
10794 | const type = unbundle(value.type);
|
10795 | let errors;
|
10796 | switch (type) {
|
10797 | case 'vector':
|
10798 | case 'raster':
|
10799 | case 'raster-dem':
|
10800 | errors = validateObject({
|
10801 | key,
|
10802 | value,
|
10803 | valueSpec: styleSpec[`source_${type.replace('-', '_')}`],
|
10804 | style: options.style,
|
10805 | styleSpec,
|
10806 | objectElementValidators
|
10807 | });
|
10808 | return errors;
|
10809 | case 'geojson':
|
10810 | errors = validateObject({
|
10811 | key,
|
10812 | value,
|
10813 | valueSpec: styleSpec.source_geojson,
|
10814 | style,
|
10815 | styleSpec,
|
10816 | objectElementValidators
|
10817 | });
|
10818 | if (value.cluster) {
|
10819 | for (const prop in value.clusterProperties) {
|
10820 | const [operator, mapExpr] = value.clusterProperties[prop];
|
10821 | const reduceExpr = typeof operator === 'string' ? [operator, ['accumulated'], ['get', prop]] : operator;
|
10822 | errors.push(...validateExpression({
|
10823 | key: `${key}.${prop}.map`,
|
10824 | value: mapExpr,
|
10825 | expressionContext: 'cluster-map'
|
10826 | }));
|
10827 | errors.push(...validateExpression({
|
10828 | key: `${key}.${prop}.reduce`,
|
10829 | value: reduceExpr,
|
10830 | expressionContext: 'cluster-reduce'
|
10831 | }));
|
10832 | }
|
10833 | }
|
10834 | return errors;
|
10835 | case 'video':
|
10836 | return validateObject({
|
10837 | key,
|
10838 | value,
|
10839 | valueSpec: styleSpec.source_video,
|
10840 | style,
|
10841 | styleSpec
|
10842 | });
|
10843 | case 'image':
|
10844 | return validateObject({
|
10845 | key,
|
10846 | value,
|
10847 | valueSpec: styleSpec.source_image,
|
10848 | style,
|
10849 | styleSpec
|
10850 | });
|
10851 | case 'canvas':
|
10852 | return [new ValidationError(key, null, 'Please use runtime APIs to add canvas sources, rather than including them in stylesheets.', 'source.canvas')];
|
10853 | default:
|
10854 | return validateEnum({
|
10855 | key: `${key}.type`,
|
10856 | value: value.type,
|
10857 | valueSpec: { values: ['vector', 'raster', 'raster-dem', 'geojson', 'video', 'image'] },
|
10858 | style,
|
10859 | styleSpec
|
10860 | });
|
10861 | }
|
10862 | }
|
10863 | function validatePromoteId({ key, value }) {
|
10864 | if (getType(value) === 'string') {
|
10865 | return validateString({ key, value });
|
10866 | }
|
10867 | else {
|
10868 | const errors = [];
|
10869 | for (const prop in value) {
|
10870 | errors.push(...validateString({ key: `${key}.${prop}`, value: value[prop] }));
|
10871 | }
|
10872 | return errors;
|
10873 | }
|
10874 | }
|
10875 |
|
10876 | function validateLight$1(options) {
|
10877 | const light = options.value;
|
10878 | const styleSpec = options.styleSpec;
|
10879 | const lightSpec = styleSpec.light;
|
10880 | const style = options.style;
|
10881 | let errors = [];
|
10882 | const rootType = getType(light);
|
10883 | if (light === undefined) {
|
10884 | return errors;
|
10885 | }
|
10886 | else if (rootType !== 'object') {
|
10887 | errors = errors.concat([new ValidationError('light', light, `object expected, ${rootType} found`)]);
|
10888 | return errors;
|
10889 | }
|
10890 | for (const key in light) {
|
10891 | const transitionMatch = key.match(/^(.*)-transition$/);
|
10892 | if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) {
|
10893 | errors = errors.concat(validate({
|
10894 | key,
|
10895 | value: light[key],
|
10896 | valueSpec: styleSpec.transition,
|
10897 | style,
|
10898 | styleSpec
|
10899 | }));
|
10900 | }
|
10901 | else if (lightSpec[key]) {
|
10902 | errors = errors.concat(validate({
|
10903 | key,
|
10904 | value: light[key],
|
10905 | valueSpec: lightSpec[key],
|
10906 | style,
|
10907 | styleSpec
|
10908 | }));
|
10909 | }
|
10910 | else {
|
10911 | errors = errors.concat([new ValidationError(key, light[key], `unknown property "${key}"`)]);
|
10912 | }
|
10913 | }
|
10914 | return errors;
|
10915 | }
|
10916 |
|
10917 | function validateFormatted(options) {
|
10918 | if (validateString(options).length === 0) {
|
10919 | return [];
|
10920 | }
|
10921 | return validateExpression(options);
|
10922 | }
|
10923 |
|
10924 | function validateImage(options) {
|
10925 | if (validateString(options).length === 0) {
|
10926 | return [];
|
10927 | }
|
10928 | return validateExpression(options);
|
10929 | }
|
10930 |
|
10931 | const VALIDATORS = {
|
10932 | '*'() {
|
10933 | return [];
|
10934 | },
|
10935 | 'array': validateArray,
|
10936 | 'boolean': validateBoolean,
|
10937 | 'number': validateNumber,
|
10938 | 'color': validateColor,
|
10939 | 'constants': validateConstants,
|
10940 | 'enum': validateEnum,
|
10941 | 'filter': validateFilter$1,
|
10942 | 'function': validateFunction,
|
10943 | 'layer': validateLayer,
|
10944 | 'object': validateObject,
|
10945 | 'source': validateSource$1,
|
10946 | 'light': validateLight$1,
|
10947 | 'string': validateString,
|
10948 | 'formatted': validateFormatted,
|
10949 | 'resolvedImage': validateImage
|
10950 | };
|
10951 | // Main recursive validation function. Tracks:
|
10952 | //
|
10953 | // - key: string representing location of validation in style tree. Used only
|
10954 | // for more informative error reporting.
|
10955 | // - value: current value from style being evaluated. May be anything from a
|
10956 | // high level object that needs to be descended into deeper or a simple
|
10957 | // scalar value.
|
10958 | // - valueSpec: current spec being evaluated. Tracks value.
|
10959 | // - styleSpec: current full spec being evaluated.
|
10960 | function validate(options) {
|
10961 | const value = options.value;
|
10962 | const valueSpec = options.valueSpec;
|
10963 | const styleSpec = options.styleSpec;
|
10964 | if (valueSpec.expression && isFunction(unbundle(value))) {
|
10965 | return validateFunction(options);
|
10966 | }
|
10967 | else if (valueSpec.expression && isExpression(deepUnbundle(value))) {
|
10968 | return validateExpression(options);
|
10969 | }
|
10970 | else if (valueSpec.type && VALIDATORS[valueSpec.type]) {
|
10971 | return VALIDATORS[valueSpec.type](options);
|
10972 | }
|
10973 | else {
|
10974 | const valid = validateObject(extend({}, options, {
|
10975 | valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec
|
10976 | }));
|
10977 | return valid;
|
10978 | }
|
10979 | }
|
10980 |
|
10981 | function validateGlyphsURL (options) {
|
10982 | const value = options.value;
|
10983 | const key = options.key;
|
10984 | const errors = validateString(options);
|
10985 | if (errors.length)
|
10986 | return errors;
|
10987 | if (value.indexOf('{fontstack}') === -1) {
|
10988 | errors.push(new ValidationError(key, value, '"glyphs" url must include a "{fontstack}" token'));
|
10989 | }
|
10990 | if (value.indexOf('{range}') === -1) {
|
10991 | errors.push(new ValidationError(key, value, '"glyphs" url must include a "{range}" token'));
|
10992 | }
|
10993 | return errors;
|
10994 | }
|
10995 |
|
10996 | /**
|
10997 | * Validate a MapLibre GL style against the style specification. This entrypoint,
|
10998 | * `maplibre-gl-style-spec/lib/validate_style.min`, is designed to produce as
|
10999 | * small a browserify bundle as possible by omitting unnecessary functionality
|
11000 | * and legacy style specifications.
|
11001 | *
|
11002 | * @private
|
11003 | * @param {Object} style The style to be validated.
|
11004 | * @param {Object} [styleSpec] The style specification to validate against.
|
11005 | * If omitted, the latest style spec is used.
|
11006 | * @returns {Array<ValidationError>}
|
11007 | * @example
|
11008 | * var validate = require('maplibre-gl-style-spec/lib/validate_style.min');
|
11009 | * var errors = validate(style);
|
11010 | */
|
11011 | function validateStyleMin(style, styleSpec = spec) {
|
11012 | let errors = [];
|
11013 | errors = errors.concat(validate({
|
11014 | key: '',
|
11015 | value: style,
|
11016 | valueSpec: styleSpec.$root,
|
11017 | styleSpec,
|
11018 | style,
|
11019 | objectElementValidators: {
|
11020 | glyphs: validateGlyphsURL,
|
11021 | '*'() {
|
11022 | return [];
|
11023 | }
|
11024 | }
|
11025 | }));
|
11026 | if (style.constants) {
|
11027 | errors = errors.concat(validateConstants({
|
11028 | key: 'constants',
|
11029 | value: style.constants,
|
11030 | style,
|
11031 | styleSpec
|
11032 | }));
|
11033 | }
|
11034 | return sortErrors(errors);
|
11035 | }
|
11036 | validateStyleMin.source = wrapCleanErrors(validateSource$1);
|
11037 | validateStyleMin.light = wrapCleanErrors(validateLight$1);
|
11038 | validateStyleMin.layer = wrapCleanErrors(validateLayer);
|
11039 | validateStyleMin.filter = wrapCleanErrors(validateFilter$1);
|
11040 | validateStyleMin.paintProperty = wrapCleanErrors(validatePaintProperty$1);
|
11041 | validateStyleMin.layoutProperty = wrapCleanErrors(validateLayoutProperty$1);
|
11042 | function sortErrors(errors) {
|
11043 | return [].concat(errors).sort((a, b) => {
|
11044 | return a.line - b.line;
|
11045 | });
|
11046 | }
|
11047 | function wrapCleanErrors(inner) {
|
11048 | return function (...args) {
|
11049 | return sortErrors(inner.apply(this, args));
|
11050 | };
|
11051 | }
|
11052 |
|
11053 | const validateStyle = validateStyleMin;
|
11054 | const validateSource = validateStyle.source;
|
11055 | const validateLight = validateStyle.light;
|
11056 | const validateFilter = validateStyle.filter;
|
11057 | const validatePaintProperty = validateStyle.paintProperty;
|
11058 | const validateLayoutProperty = validateStyle.layoutProperty;
|
11059 | function emitValidationErrors(emitter, errors) {
|
11060 | let hasErrors = false;
|
11061 | if (errors && errors.length) {
|
11062 | for (const error of errors) {
|
11063 | emitter.fire(new ErrorEvent(new Error(error.message)));
|
11064 | hasErrors = true;
|
11065 | }
|
11066 | }
|
11067 | return hasErrors;
|
11068 | }
|
11069 |
|
11070 | /*
|
11071 | This file was copied from https://github.com/mapbox/grid-index and was
|
11072 | migrated from JavaScript to TypeScript.
|
11073 |
|
11074 | Copyright (c) 2016, Mapbox
|
11075 |
|
11076 | Permission to use, copy, modify, and/or distribute this software for any purpose
|
11077 | with or without fee is hereby granted, provided that the above copyright notice
|
11078 | and this permission notice appear in all copies.
|
11079 |
|
11080 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
11081 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
11082 | FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
11083 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
11084 | OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
11085 | TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
11086 | THIS SOFTWARE.
|
11087 | */
|
11088 | const NUM_PARAMS = 3;
|
11089 | class TransferableGridIndex {
|
11090 | constructor(extent, n, padding) {
|
11091 | const cells = this.cells = [];
|
11092 | if (extent instanceof ArrayBuffer) {
|
11093 | this.arrayBuffer = extent;
|
11094 | const array = new Int32Array(this.arrayBuffer);
|
11095 | extent = array[0];
|
11096 | n = array[1];
|
11097 | padding = array[2];
|
11098 | this.d = n + 2 * padding;
|
11099 | for (let k = 0; k < this.d * this.d; k++) {
|
11100 | const start = array[NUM_PARAMS + k];
|
11101 | const end = array[NUM_PARAMS + k + 1];
|
11102 | cells.push(start === end ? null : array.subarray(start, end));
|
11103 | }
|
11104 | const keysOffset = array[NUM_PARAMS + cells.length];
|
11105 | const bboxesOffset = array[NUM_PARAMS + cells.length + 1];
|
11106 | this.keys = array.subarray(keysOffset, bboxesOffset);
|
11107 | this.bboxes = array.subarray(bboxesOffset);
|
11108 | this.insert = this._insertReadonly;
|
11109 | }
|
11110 | else {
|
11111 | this.d = n + 2 * padding;
|
11112 | for (let i = 0; i < this.d * this.d; i++) {
|
11113 | cells.push([]);
|
11114 | }
|
11115 | this.keys = [];
|
11116 | this.bboxes = [];
|
11117 | }
|
11118 | this.n = n;
|
11119 | this.extent = extent;
|
11120 | this.padding = padding;
|
11121 | this.scale = n / extent;
|
11122 | this.uid = 0;
|
11123 | const p = (padding / n) * extent;
|
11124 | this.min = -p;
|
11125 | this.max = extent + p;
|
11126 | }
|
11127 | insert(key, x1, y1, x2, y2) {
|
11128 | this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++, undefined, undefined);
|
11129 | this.keys.push(key);
|
11130 | this.bboxes.push(x1);
|
11131 | this.bboxes.push(y1);
|
11132 | this.bboxes.push(x2);
|
11133 | this.bboxes.push(y2);
|
11134 | }
|
11135 | _insertReadonly() {
|
11136 | throw new Error('Cannot insert into a GridIndex created from an ArrayBuffer.');
|
11137 | }
|
11138 | _insertCell(x1, y1, x2, y2, cellIndex, uid) {
|
11139 | this.cells[cellIndex].push(uid);
|
11140 | }
|
11141 | query(x1, y1, x2, y2, intersectionTest) {
|
11142 | const min = this.min;
|
11143 | const max = this.max;
|
11144 | if (x1 <= min && y1 <= min && max <= x2 && max <= y2 && !intersectionTest) {
|
11145 | // We use `Array#slice` because `this.keys` may be a `Int32Array` and
|
11146 | // some browsers (Safari and IE) do not support `TypedArray#slice`
|
11147 | // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice#Browser_compatibility
|
11148 | return Array.prototype.slice.call(this.keys);
|
11149 | }
|
11150 | else {
|
11151 | const result = [];
|
11152 | const seenUids = {};
|
11153 | this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids, intersectionTest);
|
11154 | return result;
|
11155 | }
|
11156 | }
|
11157 | _queryCell(x1, y1, x2, y2, cellIndex, result, seenUids, intersectionTest) {
|
11158 | const cell = this.cells[cellIndex];
|
11159 | if (cell !== null) {
|
11160 | const keys = this.keys;
|
11161 | const bboxes = this.bboxes;
|
11162 | for (let u = 0; u < cell.length; u++) {
|
11163 | const uid = cell[u];
|
11164 | if (seenUids[uid] === undefined) {
|
11165 | const offset = uid * 4;
|
11166 | if (intersectionTest ?
|
11167 | intersectionTest(bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) :
|
11168 | ((x1 <= bboxes[offset + 2]) &&
|
11169 | (y1 <= bboxes[offset + 3]) &&
|
11170 | (x2 >= bboxes[offset + 0]) &&
|
11171 | (y2 >= bboxes[offset + 1]))) {
|
11172 | seenUids[uid] = true;
|
11173 | result.push(keys[uid]);
|
11174 | }
|
11175 | else {
|
11176 | seenUids[uid] = false;
|
11177 | }
|
11178 | }
|
11179 | }
|
11180 | }
|
11181 | }
|
11182 | _forEachCell(x1, y1, x2, y2, fn, arg1, arg2, intersectionTest) {
|
11183 | const cx1 = this._convertToCellCoord(x1);
|
11184 | const cy1 = this._convertToCellCoord(y1);
|
11185 | const cx2 = this._convertToCellCoord(x2);
|
11186 | const cy2 = this._convertToCellCoord(y2);
|
11187 | for (let x = cx1; x <= cx2; x++) {
|
11188 | for (let y = cy1; y <= cy2; y++) {
|
11189 | const cellIndex = this.d * y + x;
|
11190 | if (intersectionTest && !intersectionTest(this._convertFromCellCoord(x), this._convertFromCellCoord(y), this._convertFromCellCoord(x + 1), this._convertFromCellCoord(y + 1)))
|
11191 | continue;
|
11192 | if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, intersectionTest))
|
11193 | return;
|
11194 | }
|
11195 | }
|
11196 | }
|
11197 | _convertFromCellCoord(x) {
|
11198 | return (x - this.padding) / this.scale;
|
11199 | }
|
11200 | _convertToCellCoord(x) {
|
11201 | return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding));
|
11202 | }
|
11203 | toArrayBuffer() {
|
11204 | if (this.arrayBuffer)
|
11205 | return this.arrayBuffer;
|
11206 | const cells = this.cells;
|
11207 | const metadataLength = NUM_PARAMS + this.cells.length + 1 + 1;
|
11208 | let totalCellLength = 0;
|
11209 | for (let i = 0; i < this.cells.length; i++) {
|
11210 | totalCellLength += this.cells[i].length;
|
11211 | }
|
11212 | const array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length);
|
11213 | array[0] = this.extent;
|
11214 | array[1] = this.n;
|
11215 | array[2] = this.padding;
|
11216 | let offset = metadataLength;
|
11217 | for (let k = 0; k < cells.length; k++) {
|
11218 | const cell = cells[k];
|
11219 | array[NUM_PARAMS + k] = offset;
|
11220 | array.set(cell, offset);
|
11221 | offset += cell.length;
|
11222 | }
|
11223 | array[NUM_PARAMS + cells.length] = offset;
|
11224 | array.set(this.keys, offset);
|
11225 | offset += this.keys.length;
|
11226 | array[NUM_PARAMS + cells.length + 1] = offset;
|
11227 | array.set(this.bboxes, offset);
|
11228 | offset += this.bboxes.length;
|
11229 | return array.buffer;
|
11230 | }
|
11231 | static serialize(grid, transferables) {
|
11232 | const buffer = grid.toArrayBuffer();
|
11233 | if (transferables) {
|
11234 | transferables.push(buffer);
|
11235 | }
|
11236 | return { buffer };
|
11237 | }
|
11238 | static deserialize(serialized) {
|
11239 | return new TransferableGridIndex(serialized.buffer);
|
11240 | }
|
11241 | }
|
11242 |
|
11243 | const registry = {};
|
11244 | /**
|
11245 | * Register the given class as serializable.
|
11246 | *
|
11247 | * @param options
|
11248 | * @param options.omit List of properties to omit from serialization (e.g., cached/computed properties)
|
11249 | * @param options.shallow List of properties that should be serialized by a simple shallow copy, rather than by a recursive call to serialize().
|
11250 | *
|
11251 | * @private
|
11252 | */
|
11253 | function register(name, klass, options = {}) {
|
11254 | assert$1(!registry[name], `${name} is already registered.`);
|
11255 | Object.defineProperty(klass, '_classRegistryKey', {
|
11256 | value: name,
|
11257 | writeable: false
|
11258 | });
|
11259 | registry[name] = {
|
11260 | klass,
|
11261 | omit: options.omit || [],
|
11262 | shallow: options.shallow || []
|
11263 | };
|
11264 | }
|
11265 | register('Object', Object);
|
11266 | register('TransferableGridIndex', TransferableGridIndex);
|
11267 | register('Color', Color);
|
11268 | register('Error', Error);
|
11269 | register('AJAXError', AJAXError);
|
11270 | register('ResolvedImage', ResolvedImage);
|
11271 | register('StylePropertyFunction', StylePropertyFunction);
|
11272 | register('StyleExpression', StyleExpression, { omit: ['_evaluator'] });
|
11273 | register('ZoomDependentExpression', ZoomDependentExpression);
|
11274 | register('ZoomConstantExpression', ZoomConstantExpression);
|
11275 | register('CompoundExpression', CompoundExpression, { omit: ['_evaluate'] });
|
11276 | for (const name in expressions) {
|
11277 | if (expressions[name]._classRegistryKey)
|
11278 | continue;
|
11279 | register(`Expression_${name}`, expressions[name]);
|
11280 | }
|
11281 | function isArrayBuffer(value) {
|
11282 | return value && typeof ArrayBuffer !== 'undefined' &&
|
11283 | (value instanceof ArrayBuffer || (value.constructor && value.constructor.name === 'ArrayBuffer'));
|
11284 | }
|
11285 | /**
|
11286 | * Serialize the given object for transfer to or from a web worker.
|
11287 | *
|
11288 | * For non-builtin types, recursively serialize each property (possibly
|
11289 | * omitting certain properties - see register()), and package the result along
|
11290 | * with the constructor's `name` so that the appropriate constructor can be
|
11291 | * looked up in `deserialize()`.
|
11292 | *
|
11293 | * If a `transferables` array is provided, add any transferable objects (i.e.,
|
11294 | * any ArrayBuffers or ArrayBuffer views) to the list. (If a copy is needed,
|
11295 | * this should happen in the client code, before using serialize().)
|
11296 | *
|
11297 | * @private
|
11298 | */
|
11299 | function serialize(input, transferables) {
|
11300 | if (input === null ||
|
11301 | input === undefined ||
|
11302 | typeof input === 'boolean' ||
|
11303 | typeof input === 'number' ||
|
11304 | typeof input === 'string' ||
|
11305 | input instanceof Boolean ||
|
11306 | input instanceof Number ||
|
11307 | input instanceof String ||
|
11308 | input instanceof Date ||
|
11309 | input instanceof RegExp ||
|
11310 | input instanceof Blob) {
|
11311 | return input;
|
11312 | }
|
11313 | if (isArrayBuffer(input)) {
|
11314 | if (transferables) {
|
11315 | transferables.push(input);
|
11316 | }
|
11317 | return input;
|
11318 | }
|
11319 | if (isImageBitmap(input)) {
|
11320 | if (transferables) {
|
11321 | transferables.push(input);
|
11322 | }
|
11323 | return input;
|
11324 | }
|
11325 | if (ArrayBuffer.isView(input)) {
|
11326 | const view = input;
|
11327 | if (transferables) {
|
11328 | transferables.push(view.buffer);
|
11329 | }
|
11330 | return view;
|
11331 | }
|
11332 | if (input instanceof ImageData) {
|
11333 | if (transferables) {
|
11334 | transferables.push(input.data.buffer);
|
11335 | }
|
11336 | return input;
|
11337 | }
|
11338 | if (Array.isArray(input)) {
|
11339 | const serialized = [];
|
11340 | for (const item of input) {
|
11341 | serialized.push(serialize(item, transferables));
|
11342 | }
|
11343 | return serialized;
|
11344 | }
|
11345 | if (typeof input === 'object') {
|
11346 | const klass = input.constructor;
|
11347 | const name = klass._classRegistryKey;
|
11348 | if (!name) {
|
11349 | throw new Error('can\'t serialize object of unregistered class');
|
11350 | }
|
11351 | assert$1(registry[name]);
|
11352 | const properties = klass.serialize ?
|
11353 | // (Temporary workaround) allow a class to provide static
|
11354 | // `serialize()` and `deserialize()` methods to bypass the generic
|
11355 | // approach.
|
11356 | // This temporary workaround lets us use the generic serialization
|
11357 | // approach for objects whose members include instances of dynamic
|
11358 | // StructArray types. Once we refactor StructArray to be static,
|
11359 | // we can remove this complexity.
|
11360 | klass.serialize(input, transferables) : {};
|
11361 | if (!klass.serialize) {
|
11362 | for (const key in input) {
|
11363 | // any cast due to https://github.com/facebook/flow/issues/5393
|
11364 | if (!input.hasOwnProperty(key))
|
11365 | continue; // eslint-disable-line no-prototype-builtins
|
11366 | if (registry[name].omit.indexOf(key) >= 0)
|
11367 | continue;
|
11368 | const property = input[key];
|
11369 | properties[key] = registry[name].shallow.indexOf(key) >= 0 ?
|
11370 | property :
|
11371 | serialize(property, transferables);
|
11372 | }
|
11373 | if (input instanceof Error) {
|
11374 | properties.message = input.message;
|
11375 | }
|
11376 | }
|
11377 | else {
|
11378 | // make sure statically serialized object survives transfer of $name property
|
11379 | assert$1(!transferables || properties !== transferables[transferables.length - 1]);
|
11380 | }
|
11381 | if (properties.$name) {
|
11382 | throw new Error('$name property is reserved for worker serialization logic.');
|
11383 | }
|
11384 | if (name !== 'Object') {
|
11385 | properties.$name = name;
|
11386 | }
|
11387 | return properties;
|
11388 | }
|
11389 | throw new Error(`can't serialize object of type ${typeof input}`);
|
11390 | }
|
11391 | function deserialize(input) {
|
11392 | if (input === null ||
|
11393 | input === undefined ||
|
11394 | typeof input === 'boolean' ||
|
11395 | typeof input === 'number' ||
|
11396 | typeof input === 'string' ||
|
11397 | input instanceof Boolean ||
|
11398 | input instanceof Number ||
|
11399 | input instanceof String ||
|
11400 | input instanceof Date ||
|
11401 | input instanceof RegExp ||
|
11402 | input instanceof Blob ||
|
11403 | isArrayBuffer(input) ||
|
11404 | isImageBitmap(input) ||
|
11405 | ArrayBuffer.isView(input) ||
|
11406 | input instanceof ImageData) {
|
11407 | return input;
|
11408 | }
|
11409 | if (Array.isArray(input)) {
|
11410 | return input.map(deserialize);
|
11411 | }
|
11412 | if (typeof input === 'object') {
|
11413 | const name = input.$name || 'Object';
|
11414 | if (!registry[name]) {
|
11415 | throw new Error(`can't deserialize unregistered class ${name}`);
|
11416 | }
|
11417 | const { klass } = registry[name];
|
11418 | if (!klass) {
|
11419 | throw new Error(`can't deserialize unregistered class ${name}`);
|
11420 | }
|
11421 | if (klass.deserialize) {
|
11422 | return klass.deserialize(input);
|
11423 | }
|
11424 | const result = Object.create(klass.prototype);
|
11425 | for (const key of Object.keys(input)) {
|
11426 | if (key === '$name')
|
11427 | continue;
|
11428 | const value = input[key];
|
11429 | result[key] = registry[name].shallow.indexOf(key) >= 0 ? value : deserialize(value);
|
11430 | }
|
11431 | return result;
|
11432 | }
|
11433 | throw new Error(`can't deserialize object of type ${typeof input}`);
|
11434 | }
|
11435 |
|
11436 | class ZoomHistory {
|
11437 | constructor() {
|
11438 | this.first = true;
|
11439 | }
|
11440 | update(z, now) {
|
11441 | const floorZ = Math.floor(z);
|
11442 | if (this.first) {
|
11443 | this.first = false;
|
11444 | this.lastIntegerZoom = floorZ;
|
11445 | this.lastIntegerZoomTime = 0;
|
11446 | this.lastZoom = z;
|
11447 | this.lastFloorZoom = floorZ;
|
11448 | return true;
|
11449 | }
|
11450 | if (this.lastFloorZoom > floorZ) {
|
11451 | this.lastIntegerZoom = floorZ + 1;
|
11452 | this.lastIntegerZoomTime = now;
|
11453 | }
|
11454 | else if (this.lastFloorZoom < floorZ) {
|
11455 | this.lastIntegerZoom = floorZ;
|
11456 | this.lastIntegerZoomTime = now;
|
11457 | }
|
11458 | if (z !== this.lastZoom) {
|
11459 | this.lastZoom = z;
|
11460 | this.lastFloorZoom = floorZ;
|
11461 | return true;
|
11462 | }
|
11463 | return false;
|
11464 | }
|
11465 | }
|
11466 |
|
11467 | // The following table comes from <http://www.unicode.org/Public/12.0.0/ucd/Blocks.txt>.
|
11468 | // Keep it synchronized with <http://www.unicode.org/Public/UCD/latest/ucd/Blocks.txt>.
|
11469 | const unicodeBlockLookup = {
|
11470 | // 'Basic Latin': (char) => char >= 0x0000 && char <= 0x007F,
|
11471 | 'Latin-1 Supplement': (char) => char >= 0x0080 && char <= 0x00FF,
|
11472 | // 'Latin Extended-A': (char) => char >= 0x0100 && char <= 0x017F,
|
11473 | // 'Latin Extended-B': (char) => char >= 0x0180 && char <= 0x024F,
|
11474 | // 'IPA Extensions': (char) => char >= 0x0250 && char <= 0x02AF,
|
11475 | // 'Spacing Modifier Letters': (char) => char >= 0x02B0 && char <= 0x02FF,
|
11476 | // 'Combining Diacritical Marks': (char) => char >= 0x0300 && char <= 0x036F,
|
11477 | // 'Greek and Coptic': (char) => char >= 0x0370 && char <= 0x03FF,
|
11478 | // 'Cyrillic': (char) => char >= 0x0400 && char <= 0x04FF,
|
11479 | // 'Cyrillic Supplement': (char) => char >= 0x0500 && char <= 0x052F,
|
11480 | // 'Armenian': (char) => char >= 0x0530 && char <= 0x058F,
|
11481 | //'Hebrew': (char) => char >= 0x0590 && char <= 0x05FF,
|
11482 | 'Arabic': (char) => char >= 0x0600 && char <= 0x06FF,
|
11483 | //'Syriac': (char) => char >= 0x0700 && char <= 0x074F,
|
11484 | 'Arabic Supplement': (char) => char >= 0x0750 && char <= 0x077F,
|
11485 | // 'Thaana': (char) => char >= 0x0780 && char <= 0x07BF,
|
11486 | // 'NKo': (char) => char >= 0x07C0 && char <= 0x07FF,
|
11487 | // 'Samaritan': (char) => char >= 0x0800 && char <= 0x083F,
|
11488 | // 'Mandaic': (char) => char >= 0x0840 && char <= 0x085F,
|
11489 | // 'Syriac Supplement': (char) => char >= 0x0860 && char <= 0x086F,
|
11490 | 'Arabic Extended-A': (char) => char >= 0x08A0 && char <= 0x08FF,
|
11491 | // 'Devanagari': (char) => char >= 0x0900 && char <= 0x097F,
|
11492 | // 'Bengali': (char) => char >= 0x0980 && char <= 0x09FF,
|
11493 | // 'Gurmukhi': (char) => char >= 0x0A00 && char <= 0x0A7F,
|
11494 | // 'Gujarati': (char) => char >= 0x0A80 && char <= 0x0AFF,
|
11495 | // 'Oriya': (char) => char >= 0x0B00 && char <= 0x0B7F,
|
11496 | // 'Tamil': (char) => char >= 0x0B80 && char <= 0x0BFF,
|
11497 | // 'Telugu': (char) => char >= 0x0C00 && char <= 0x0C7F,
|
11498 | // 'Kannada': (char) => char >= 0x0C80 && char <= 0x0CFF,
|
11499 | // 'Malayalam': (char) => char >= 0x0D00 && char <= 0x0D7F,
|
11500 | // 'Sinhala': (char) => char >= 0x0D80 && char <= 0x0DFF,
|
11501 | // 'Thai': (char) => char >= 0x0E00 && char <= 0x0E7F,
|
11502 | // 'Lao': (char) => char >= 0x0E80 && char <= 0x0EFF,
|
11503 | // 'Tibetan': (char) => char >= 0x0F00 && char <= 0x0FFF,
|
11504 | // 'Myanmar': (char) => char >= 0x1000 && char <= 0x109F,
|
11505 | // 'Georgian': (char) => char >= 0x10A0 && char <= 0x10FF,
|
11506 | 'Hangul Jamo': (char) => char >= 0x1100 && char <= 0x11FF,
|
11507 | // 'Ethiopic': (char) => char >= 0x1200 && char <= 0x137F,
|
11508 | // 'Ethiopic Supplement': (char) => char >= 0x1380 && char <= 0x139F,
|
11509 | // 'Cherokee': (char) => char >= 0x13A0 && char <= 0x13FF,
|
11510 | 'Unified Canadian Aboriginal Syllabics': (char) => char >= 0x1400 && char <= 0x167F,
|
11511 | // 'Ogham': (char) => char >= 0x1680 && char <= 0x169F,
|
11512 | // 'Runic': (char) => char >= 0x16A0 && char <= 0x16FF,
|
11513 | // 'Tagalog': (char) => char >= 0x1700 && char <= 0x171F,
|
11514 | // 'Hanunoo': (char) => char >= 0x1720 && char <= 0x173F,
|
11515 | // 'Buhid': (char) => char >= 0x1740 && char <= 0x175F,
|
11516 | // 'Tagbanwa': (char) => char >= 0x1760 && char <= 0x177F,
|
11517 | 'Khmer': (char) => char >= 0x1780 && char <= 0x17FF,
|
11518 | // 'Mongolian': (char) => char >= 0x1800 && char <= 0x18AF,
|
11519 | 'Unified Canadian Aboriginal Syllabics Extended': (char) => char >= 0x18B0 && char <= 0x18FF,
|
11520 | // 'Limbu': (char) => char >= 0x1900 && char <= 0x194F,
|
11521 | // 'Tai Le': (char) => char >= 0x1950 && char <= 0x197F,
|
11522 | // 'New Tai Lue': (char) => char >= 0x1980 && char <= 0x19DF,
|
11523 | // 'Khmer Symbols': (char) => char >= 0x19E0 && char <= 0x19FF,
|
11524 | // 'Buginese': (char) => char >= 0x1A00 && char <= 0x1A1F,
|
11525 | // 'Tai Tham': (char) => char >= 0x1A20 && char <= 0x1AAF,
|
11526 | // 'Combining Diacritical Marks Extended': (char) => char >= 0x1AB0 && char <= 0x1AFF,
|
11527 | // 'Balinese': (char) => char >= 0x1B00 && char <= 0x1B7F,
|
11528 | // 'Sundanese': (char) => char >= 0x1B80 && char <= 0x1BBF,
|
11529 | // 'Batak': (char) => char >= 0x1BC0 && char <= 0x1BFF,
|
11530 | // 'Lepcha': (char) => char >= 0x1C00 && char <= 0x1C4F,
|
11531 | // 'Ol Chiki': (char) => char >= 0x1C50 && char <= 0x1C7F,
|
11532 | // 'Cyrillic Extended-C': (char) => char >= 0x1C80 && char <= 0x1C8F,
|
11533 | // 'Georgian Extended': (char) => char >= 0x1C90 && char <= 0x1CBF,
|
11534 | // 'Sundanese Supplement': (char) => char >= 0x1CC0 && char <= 0x1CCF,
|
11535 | // 'Vedic Extensions': (char) => char >= 0x1CD0 && char <= 0x1CFF,
|
11536 | // 'Phonetic Extensions': (char) => char >= 0x1D00 && char <= 0x1D7F,
|
11537 | // 'Phonetic Extensions Supplement': (char) => char >= 0x1D80 && char <= 0x1DBF,
|
11538 | // 'Combining Diacritical Marks Supplement': (char) => char >= 0x1DC0 && char <= 0x1DFF,
|
11539 | // 'Latin Extended Additional': (char) => char >= 0x1E00 && char <= 0x1EFF,
|
11540 | // 'Greek Extended': (char) => char >= 0x1F00 && char <= 0x1FFF,
|
11541 | 'General Punctuation': (char) => char >= 0x2000 && char <= 0x206F,
|
11542 | // 'Superscripts and Subscripts': (char) => char >= 0x2070 && char <= 0x209F,
|
11543 | // 'Currency Symbols': (char) => char >= 0x20A0 && char <= 0x20CF,
|
11544 | // 'Combining Diacritical Marks for Symbols': (char) => char >= 0x20D0 && char <= 0x20FF,
|
11545 | 'Letterlike Symbols': (char) => char >= 0x2100 && char <= 0x214F,
|
11546 | 'Number Forms': (char) => char >= 0x2150 && char <= 0x218F,
|
11547 | // 'Arrows': (char) => char >= 0x2190 && char <= 0x21FF,
|
11548 | // 'Mathematical Operators': (char) => char >= 0x2200 && char <= 0x22FF,
|
11549 | 'Miscellaneous Technical': (char) => char >= 0x2300 && char <= 0x23FF,
|
11550 | 'Control Pictures': (char) => char >= 0x2400 && char <= 0x243F,
|
11551 | 'Optical Character Recognition': (char) => char >= 0x2440 && char <= 0x245F,
|
11552 | 'Enclosed Alphanumerics': (char) => char >= 0x2460 && char <= 0x24FF,
|
11553 | // 'Box Drawing': (char) => char >= 0x2500 && char <= 0x257F,
|
11554 | // 'Block Elements': (char) => char >= 0x2580 && char <= 0x259F,
|
11555 | 'Geometric Shapes': (char) => char >= 0x25A0 && char <= 0x25FF,
|
11556 | 'Miscellaneous Symbols': (char) => char >= 0x2600 && char <= 0x26FF,
|
11557 | // 'Dingbats': (char) => char >= 0x2700 && char <= 0x27BF,
|
11558 | // 'Miscellaneous Mathematical Symbols-A': (char) => char >= 0x27C0 && char <= 0x27EF,
|
11559 | // 'Supplemental Arrows-A': (char) => char >= 0x27F0 && char <= 0x27FF,
|
11560 | // 'Braille Patterns': (char) => char >= 0x2800 && char <= 0x28FF,
|
11561 | // 'Supplemental Arrows-B': (char) => char >= 0x2900 && char <= 0x297F,
|
11562 | // 'Miscellaneous Mathematical Symbols-B': (char) => char >= 0x2980 && char <= 0x29FF,
|
11563 | // 'Supplemental Mathematical Operators': (char) => char >= 0x2A00 && char <= 0x2AFF,
|
11564 | 'Miscellaneous Symbols and Arrows': (char) => char >= 0x2B00 && char <= 0x2BFF,
|
11565 | // 'Glagolitic': (char) => char >= 0x2C00 && char <= 0x2C5F,
|
11566 | // 'Latin Extended-C': (char) => char >= 0x2C60 && char <= 0x2C7F,
|
11567 | // 'Coptic': (char) => char >= 0x2C80 && char <= 0x2CFF,
|
11568 | // 'Georgian Supplement': (char) => char >= 0x2D00 && char <= 0x2D2F,
|
11569 | // 'Tifinagh': (char) => char >= 0x2D30 && char <= 0x2D7F,
|
11570 | // 'Ethiopic Extended': (char) => char >= 0x2D80 && char <= 0x2DDF,
|
11571 | // 'Cyrillic Extended-A': (char) => char >= 0x2DE0 && char <= 0x2DFF,
|
11572 | // 'Supplemental Punctuation': (char) => char >= 0x2E00 && char <= 0x2E7F,
|
11573 | 'CJK Radicals Supplement': (char) => char >= 0x2E80 && char <= 0x2EFF,
|
11574 | 'Kangxi Radicals': (char) => char >= 0x2F00 && char <= 0x2FDF,
|
11575 | 'Ideographic Description Characters': (char) => char >= 0x2FF0 && char <= 0x2FFF,
|
11576 | 'CJK Symbols and Punctuation': (char) => char >= 0x3000 && char <= 0x303F,
|
11577 | 'Hiragana': (char) => char >= 0x3040 && char <= 0x309F,
|
11578 | 'Katakana': (char) => char >= 0x30A0 && char <= 0x30FF,
|
11579 | 'Bopomofo': (char) => char >= 0x3100 && char <= 0x312F,
|
11580 | 'Hangul Compatibility Jamo': (char) => char >= 0x3130 && char <= 0x318F,
|
11581 | 'Kanbun': (char) => char >= 0x3190 && char <= 0x319F,
|
11582 | 'Bopomofo Extended': (char) => char >= 0x31A0 && char <= 0x31BF,
|
11583 | 'CJK Strokes': (char) => char >= 0x31C0 && char <= 0x31EF,
|
11584 | 'Katakana Phonetic Extensions': (char) => char >= 0x31F0 && char <= 0x31FF,
|
11585 | 'Enclosed CJK Letters and Months': (char) => char >= 0x3200 && char <= 0x32FF,
|
11586 | 'CJK Compatibility': (char) => char >= 0x3300 && char <= 0x33FF,
|
11587 | 'CJK Unified Ideographs Extension A': (char) => char >= 0x3400 && char <= 0x4DBF,
|
11588 | 'Yijing Hexagram Symbols': (char) => char >= 0x4DC0 && char <= 0x4DFF,
|
11589 | 'CJK Unified Ideographs': (char) => char >= 0x4E00 && char <= 0x9FFF,
|
11590 | 'Yi Syllables': (char) => char >= 0xA000 && char <= 0xA48F,
|
11591 | 'Yi Radicals': (char) => char >= 0xA490 && char <= 0xA4CF,
|
11592 | // 'Lisu': (char) => char >= 0xA4D0 && char <= 0xA4FF,
|
11593 | // 'Vai': (char) => char >= 0xA500 && char <= 0xA63F,
|
11594 | // 'Cyrillic Extended-B': (char) => char >= 0xA640 && char <= 0xA69F,
|
11595 | // 'Bamum': (char) => char >= 0xA6A0 && char <= 0xA6FF,
|
11596 | // 'Modifier Tone Letters': (char) => char >= 0xA700 && char <= 0xA71F,
|
11597 | // 'Latin Extended-D': (char) => char >= 0xA720 && char <= 0xA7FF,
|
11598 | // 'Syloti Nagri': (char) => char >= 0xA800 && char <= 0xA82F,
|
11599 | // 'Common Indic Number Forms': (char) => char >= 0xA830 && char <= 0xA83F,
|
11600 | // 'Phags-pa': (char) => char >= 0xA840 && char <= 0xA87F,
|
11601 | // 'Saurashtra': (char) => char >= 0xA880 && char <= 0xA8DF,
|
11602 | // 'Devanagari Extended': (char) => char >= 0xA8E0 && char <= 0xA8FF,
|
11603 | // 'Kayah Li': (char) => char >= 0xA900 && char <= 0xA92F,
|
11604 | // 'Rejang': (char) => char >= 0xA930 && char <= 0xA95F,
|
11605 | 'Hangul Jamo Extended-A': (char) => char >= 0xA960 && char <= 0xA97F,
|
11606 | // 'Javanese': (char) => char >= 0xA980 && char <= 0xA9DF,
|
11607 | // 'Myanmar Extended-B': (char) => char >= 0xA9E0 && char <= 0xA9FF,
|
11608 | // 'Cham': (char) => char >= 0xAA00 && char <= 0xAA5F,
|
11609 | // 'Myanmar Extended-A': (char) => char >= 0xAA60 && char <= 0xAA7F,
|
11610 | // 'Tai Viet': (char) => char >= 0xAA80 && char <= 0xAADF,
|
11611 | // 'Meetei Mayek Extensions': (char) => char >= 0xAAE0 && char <= 0xAAFF,
|
11612 | // 'Ethiopic Extended-A': (char) => char >= 0xAB00 && char <= 0xAB2F,
|
11613 | // 'Latin Extended-E': (char) => char >= 0xAB30 && char <= 0xAB6F,
|
11614 | // 'Cherokee Supplement': (char) => char >= 0xAB70 && char <= 0xABBF,
|
11615 | // 'Meetei Mayek': (char) => char >= 0xABC0 && char <= 0xABFF,
|
11616 | 'Hangul Syllables': (char) => char >= 0xAC00 && char <= 0xD7AF,
|
11617 | 'Hangul Jamo Extended-B': (char) => char >= 0xD7B0 && char <= 0xD7FF,
|
11618 | // 'High Surrogates': (char) => char >= 0xD800 && char <= 0xDB7F,
|
11619 | // 'High Private Use Surrogates': (char) => char >= 0xDB80 && char <= 0xDBFF,
|
11620 | // 'Low Surrogates': (char) => char >= 0xDC00 && char <= 0xDFFF,
|
11621 | 'Private Use Area': (char) => char >= 0xE000 && char <= 0xF8FF,
|
11622 | 'CJK Compatibility Ideographs': (char) => char >= 0xF900 && char <= 0xFAFF,
|
11623 | // 'Alphabetic Presentation Forms': (char) => char >= 0xFB00 && char <= 0xFB4F,
|
11624 | 'Arabic Presentation Forms-A': (char) => char >= 0xFB50 && char <= 0xFDFF,
|
11625 | // 'Variation Selectors': (char) => char >= 0xFE00 && char <= 0xFE0F,
|
11626 | 'Vertical Forms': (char) => char >= 0xFE10 && char <= 0xFE1F,
|
11627 | // 'Combining Half Marks': (char) => char >= 0xFE20 && char <= 0xFE2F,
|
11628 | 'CJK Compatibility Forms': (char) => char >= 0xFE30 && char <= 0xFE4F,
|
11629 | 'Small Form Variants': (char) => char >= 0xFE50 && char <= 0xFE6F,
|
11630 | 'Arabic Presentation Forms-B': (char) => char >= 0xFE70 && char <= 0xFEFF,
|
11631 | 'Halfwidth and Fullwidth Forms': (char) => char >= 0xFF00 && char <= 0xFFEF
|
11632 | // 'Specials': (char) => char >= 0xFFF0 && char <= 0xFFFF,
|
11633 | // 'Linear B Syllabary': (char) => char >= 0x10000 && char <= 0x1007F,
|
11634 | // 'Linear B Ideograms': (char) => char >= 0x10080 && char <= 0x100FF,
|
11635 | // 'Aegean Numbers': (char) => char >= 0x10100 && char <= 0x1013F,
|
11636 | // 'Ancient Greek Numbers': (char) => char >= 0x10140 && char <= 0x1018F,
|
11637 | // 'Ancient Symbols': (char) => char >= 0x10190 && char <= 0x101CF,
|
11638 | // 'Phaistos Disc': (char) => char >= 0x101D0 && char <= 0x101FF,
|
11639 | // 'Lycian': (char) => char >= 0x10280 && char <= 0x1029F,
|
11640 | // 'Carian': (char) => char >= 0x102A0 && char <= 0x102DF,
|
11641 | // 'Coptic Epact Numbers': (char) => char >= 0x102E0 && char <= 0x102FF,
|
11642 | // 'Old Italic': (char) => char >= 0x10300 && char <= 0x1032F,
|
11643 | // 'Gothic': (char) => char >= 0x10330 && char <= 0x1034F,
|
11644 | // 'Old Permic': (char) => char >= 0x10350 && char <= 0x1037F,
|
11645 | // 'Ugaritic': (char) => char >= 0x10380 && char <= 0x1039F,
|
11646 | // 'Old Persian': (char) => char >= 0x103A0 && char <= 0x103DF,
|
11647 | // 'Deseret': (char) => char >= 0x10400 && char <= 0x1044F,
|
11648 | // 'Shavian': (char) => char >= 0x10450 && char <= 0x1047F,
|
11649 | // 'Osmanya': (char) => char >= 0x10480 && char <= 0x104AF,
|
11650 | // 'Osage': (char) => char >= 0x104B0 && char <= 0x104FF,
|
11651 | // 'Elbasan': (char) => char >= 0x10500 && char <= 0x1052F,
|
11652 | // 'Caucasian Albanian': (char) => char >= 0x10530 && char <= 0x1056F,
|
11653 | // 'Linear A': (char) => char >= 0x10600 && char <= 0x1077F,
|
11654 | // 'Cypriot Syllabary': (char) => char >= 0x10800 && char <= 0x1083F,
|
11655 | // 'Imperial Aramaic': (char) => char >= 0x10840 && char <= 0x1085F,
|
11656 | // 'Palmyrene': (char) => char >= 0x10860 && char <= 0x1087F,
|
11657 | // 'Nabataean': (char) => char >= 0x10880 && char <= 0x108AF,
|
11658 | // 'Hatran': (char) => char >= 0x108E0 && char <= 0x108FF,
|
11659 | // 'Phoenician': (char) => char >= 0x10900 && char <= 0x1091F,
|
11660 | // 'Lydian': (char) => char >= 0x10920 && char <= 0x1093F,
|
11661 | // 'Meroitic Hieroglyphs': (char) => char >= 0x10980 && char <= 0x1099F,
|
11662 | // 'Meroitic Cursive': (char) => char >= 0x109A0 && char <= 0x109FF,
|
11663 | // 'Kharoshthi': (char) => char >= 0x10A00 && char <= 0x10A5F,
|
11664 | // 'Old South Arabian': (char) => char >= 0x10A60 && char <= 0x10A7F,
|
11665 | // 'Old North Arabian': (char) => char >= 0x10A80 && char <= 0x10A9F,
|
11666 | // 'Manichaean': (char) => char >= 0x10AC0 && char <= 0x10AFF,
|
11667 | // 'Avestan': (char) => char >= 0x10B00 && char <= 0x10B3F,
|
11668 | // 'Inscriptional Parthian': (char) => char >= 0x10B40 && char <= 0x10B5F,
|
11669 | // 'Inscriptional Pahlavi': (char) => char >= 0x10B60 && char <= 0x10B7F,
|
11670 | // 'Psalter Pahlavi': (char) => char >= 0x10B80 && char <= 0x10BAF,
|
11671 | // 'Old Turkic': (char) => char >= 0x10C00 && char <= 0x10C4F,
|
11672 | // 'Old Hungarian': (char) => char >= 0x10C80 && char <= 0x10CFF,
|
11673 | // 'Hanifi Rohingya': (char) => char >= 0x10D00 && char <= 0x10D3F,
|
11674 | // 'Rumi Numeral Symbols': (char) => char >= 0x10E60 && char <= 0x10E7F,
|
11675 | // 'Old Sogdian': (char) => char >= 0x10F00 && char <= 0x10F2F,
|
11676 | // 'Sogdian': (char) => char >= 0x10F30 && char <= 0x10F6F,
|
11677 | // 'Elymaic': (char) => char >= 0x10FE0 && char <= 0x10FFF,
|
11678 | // 'Brahmi': (char) => char >= 0x11000 && char <= 0x1107F,
|
11679 | // 'Kaithi': (char) => char >= 0x11080 && char <= 0x110CF,
|
11680 | // 'Sora Sompeng': (char) => char >= 0x110D0 && char <= 0x110FF,
|
11681 | // 'Chakma': (char) => char >= 0x11100 && char <= 0x1114F,
|
11682 | // 'Mahajani': (char) => char >= 0x11150 && char <= 0x1117F,
|
11683 | // 'Sharada': (char) => char >= 0x11180 && char <= 0x111DF,
|
11684 | // 'Sinhala Archaic Numbers': (char) => char >= 0x111E0 && char <= 0x111FF,
|
11685 | // 'Khojki': (char) => char >= 0x11200 && char <= 0x1124F,
|
11686 | // 'Multani': (char) => char >= 0x11280 && char <= 0x112AF,
|
11687 | // 'Khudawadi': (char) => char >= 0x112B0 && char <= 0x112FF,
|
11688 | // 'Grantha': (char) => char >= 0x11300 && char <= 0x1137F,
|
11689 | // 'Newa': (char) => char >= 0x11400 && char <= 0x1147F,
|
11690 | // 'Tirhuta': (char) => char >= 0x11480 && char <= 0x114DF,
|
11691 | // 'Siddham': (char) => char >= 0x11580 && char <= 0x115FF,
|
11692 | // 'Modi': (char) => char >= 0x11600 && char <= 0x1165F,
|
11693 | // 'Mongolian Supplement': (char) => char >= 0x11660 && char <= 0x1167F,
|
11694 | // 'Takri': (char) => char >= 0x11680 && char <= 0x116CF,
|
11695 | // 'Ahom': (char) => char >= 0x11700 && char <= 0x1173F,
|
11696 | // 'Dogra': (char) => char >= 0x11800 && char <= 0x1184F,
|
11697 | // 'Warang Citi': (char) => char >= 0x118A0 && char <= 0x118FF,
|
11698 | // 'Nandinagari': (char) => char >= 0x119A0 && char <= 0x119FF,
|
11699 | // 'Zanabazar Square': (char) => char >= 0x11A00 && char <= 0x11A4F,
|
11700 | // 'Soyombo': (char) => char >= 0x11A50 && char <= 0x11AAF,
|
11701 | // 'Pau Cin Hau': (char) => char >= 0x11AC0 && char <= 0x11AFF,
|
11702 | // 'Bhaiksuki': (char) => char >= 0x11C00 && char <= 0x11C6F,
|
11703 | // 'Marchen': (char) => char >= 0x11C70 && char <= 0x11CBF,
|
11704 | // 'Masaram Gondi': (char) => char >= 0x11D00 && char <= 0x11D5F,
|
11705 | // 'Gunjala Gondi': (char) => char >= 0x11D60 && char <= 0x11DAF,
|
11706 | // 'Makasar': (char) => char >= 0x11EE0 && char <= 0x11EFF,
|
11707 | // 'Tamil Supplement': (char) => char >= 0x11FC0 && char <= 0x11FFF,
|
11708 | // 'Cuneiform': (char) => char >= 0x12000 && char <= 0x123FF,
|
11709 | // 'Cuneiform Numbers and Punctuation': (char) => char >= 0x12400 && char <= 0x1247F,
|
11710 | // 'Early Dynastic Cuneiform': (char) => char >= 0x12480 && char <= 0x1254F,
|
11711 | // 'Egyptian Hieroglyphs': (char) => char >= 0x13000 && char <= 0x1342F,
|
11712 | // 'Egyptian Hieroglyph Format Controls': (char) => char >= 0x13430 && char <= 0x1343F,
|
11713 | // 'Anatolian Hieroglyphs': (char) => char >= 0x14400 && char <= 0x1467F,
|
11714 | // 'Bamum Supplement': (char) => char >= 0x16800 && char <= 0x16A3F,
|
11715 | // 'Mro': (char) => char >= 0x16A40 && char <= 0x16A6F,
|
11716 | // 'Bassa Vah': (char) => char >= 0x16AD0 && char <= 0x16AFF,
|
11717 | // 'Pahawh Hmong': (char) => char >= 0x16B00 && char <= 0x16B8F,
|
11718 | // 'Medefaidrin': (char) => char >= 0x16E40 && char <= 0x16E9F,
|
11719 | // 'Miao': (char) => char >= 0x16F00 && char <= 0x16F9F,
|
11720 | // 'Ideographic Symbols and Punctuation': (char) => char >= 0x16FE0 && char <= 0x16FFF,
|
11721 | // 'Tangut': (char) => char >= 0x17000 && char <= 0x187FF,
|
11722 | // 'Tangut Components': (char) => char >= 0x18800 && char <= 0x18AFF,
|
11723 | // 'Kana Supplement': (char) => char >= 0x1B000 && char <= 0x1B0FF,
|
11724 | // 'Kana Extended-A': (char) => char >= 0x1B100 && char <= 0x1B12F,
|
11725 | // 'Small Kana Extension': (char) => char >= 0x1B130 && char <= 0x1B16F,
|
11726 | // 'Nushu': (char) => char >= 0x1B170 && char <= 0x1B2FF,
|
11727 | // 'Duployan': (char) => char >= 0x1BC00 && char <= 0x1BC9F,
|
11728 | // 'Shorthand Format Controls': (char) => char >= 0x1BCA0 && char <= 0x1BCAF,
|
11729 | // 'Byzantine Musical Symbols': (char) => char >= 0x1D000 && char <= 0x1D0FF,
|
11730 | // 'Musical Symbols': (char) => char >= 0x1D100 && char <= 0x1D1FF,
|
11731 | // 'Ancient Greek Musical Notation': (char) => char >= 0x1D200 && char <= 0x1D24F,
|
11732 | // 'Mayan Numerals': (char) => char >= 0x1D2E0 && char <= 0x1D2FF,
|
11733 | // 'Tai Xuan Jing Symbols': (char) => char >= 0x1D300 && char <= 0x1D35F,
|
11734 | // 'Counting Rod Numerals': (char) => char >= 0x1D360 && char <= 0x1D37F,
|
11735 | // 'Mathematical Alphanumeric Symbols': (char) => char >= 0x1D400 && char <= 0x1D7FF,
|
11736 | // 'Sutton SignWriting': (char) => char >= 0x1D800 && char <= 0x1DAAF,
|
11737 | // 'Glagolitic Supplement': (char) => char >= 0x1E000 && char <= 0x1E02F,
|
11738 | // 'Nyiakeng Puachue Hmong': (char) => char >= 0x1E100 && char <= 0x1E14F,
|
11739 | // 'Wancho': (char) => char >= 0x1E2C0 && char <= 0x1E2FF,
|
11740 | // 'Mende Kikakui': (char) => char >= 0x1E800 && char <= 0x1E8DF,
|
11741 | // 'Adlam': (char) => char >= 0x1E900 && char <= 0x1E95F,
|
11742 | // 'Indic Siyaq Numbers': (char) => char >= 0x1EC70 && char <= 0x1ECBF,
|
11743 | // 'Ottoman Siyaq Numbers': (char) => char >= 0x1ED00 && char <= 0x1ED4F,
|
11744 | // 'Arabic Mathematical Alphabetic Symbols': (char) => char >= 0x1EE00 && char <= 0x1EEFF,
|
11745 | // 'Mahjong Tiles': (char) => char >= 0x1F000 && char <= 0x1F02F,
|
11746 | // 'Domino Tiles': (char) => char >= 0x1F030 && char <= 0x1F09F,
|
11747 | // 'Playing Cards': (char) => char >= 0x1F0A0 && char <= 0x1F0FF,
|
11748 | // 'Enclosed Alphanumeric Supplement': (char) => char >= 0x1F100 && char <= 0x1F1FF,
|
11749 | // 'Enclosed Ideographic Supplement': (char) => char >= 0x1F200 && char <= 0x1F2FF,
|
11750 | // 'Miscellaneous Symbols and Pictographs': (char) => char >= 0x1F300 && char <= 0x1F5FF,
|
11751 | // 'Emoticons': (char) => char >= 0x1F600 && char <= 0x1F64F,
|
11752 | // 'Ornamental Dingbats': (char) => char >= 0x1F650 && char <= 0x1F67F,
|
11753 | // 'Transport and Map Symbols': (char) => char >= 0x1F680 && char <= 0x1F6FF,
|
11754 | // 'Alchemical Symbols': (char) => char >= 0x1F700 && char <= 0x1F77F,
|
11755 | // 'Geometric Shapes Extended': (char) => char >= 0x1F780 && char <= 0x1F7FF,
|
11756 | // 'Supplemental Arrows-C': (char) => char >= 0x1F800 && char <= 0x1F8FF,
|
11757 | // 'Supplemental Symbols and Pictographs': (char) => char >= 0x1F900 && char <= 0x1F9FF,
|
11758 | // 'Chess Symbols': (char) => char >= 0x1FA00 && char <= 0x1FA6F,
|
11759 | // 'Symbols and Pictographs Extended-A': (char) => char >= 0x1FA70 && char <= 0x1FAFF,
|
11760 | // 'CJK Unified Ideographs Extension B': (char) => char >= 0x20000 && char <= 0x2A6DF,
|
11761 | // 'CJK Unified Ideographs Extension C': (char) => char >= 0x2A700 && char <= 0x2B73F,
|
11762 | // 'CJK Unified Ideographs Extension D': (char) => char >= 0x2B740 && char <= 0x2B81F,
|
11763 | // 'CJK Unified Ideographs Extension E': (char) => char >= 0x2B820 && char <= 0x2CEAF,
|
11764 | // 'CJK Unified Ideographs Extension F': (char) => char >= 0x2CEB0 && char <= 0x2EBEF,
|
11765 | // 'CJK Compatibility Ideographs Supplement': (char) => char >= 0x2F800 && char <= 0x2FA1F,
|
11766 | // 'Tags': (char) => char >= 0xE0000 && char <= 0xE007F,
|
11767 | // 'Variation Selectors Supplement': (char) => char >= 0xE0100 && char <= 0xE01EF,
|
11768 | // 'Supplementary Private Use Area-A': (char) => char >= 0xF0000 && char <= 0xFFFFF,
|
11769 | // 'Supplementary Private Use Area-B': (char) => char >= 0x100000 && char <= 0x10FFFF,
|
11770 | };
|
11771 |
|
11772 | /* eslint-disable new-cap */
|
11773 | function allowsIdeographicBreaking(chars) {
|
11774 | for (const char of chars) {
|
11775 | if (!charAllowsIdeographicBreaking(char.charCodeAt(0)))
|
11776 | return false;
|
11777 | }
|
11778 | return true;
|
11779 | }
|
11780 | function allowsVerticalWritingMode(chars) {
|
11781 | for (const char of chars) {
|
11782 | if (charHasUprightVerticalOrientation(char.charCodeAt(0)))
|
11783 | return true;
|
11784 | }
|
11785 | return false;
|
11786 | }
|
11787 | function allowsLetterSpacing(chars) {
|
11788 | for (const char of chars) {
|
11789 | if (!charAllowsLetterSpacing(char.charCodeAt(0)))
|
11790 | return false;
|
11791 | }
|
11792 | return true;
|
11793 | }
|
11794 | function charAllowsLetterSpacing(char) {
|
11795 | if (unicodeBlockLookup['Arabic'](char))
|
11796 | return false;
|
11797 | if (unicodeBlockLookup['Arabic Supplement'](char))
|
11798 | return false;
|
11799 | if (unicodeBlockLookup['Arabic Extended-A'](char))
|
11800 | return false;
|
11801 | if (unicodeBlockLookup['Arabic Presentation Forms-A'](char))
|
11802 | return false;
|
11803 | if (unicodeBlockLookup['Arabic Presentation Forms-B'](char))
|
11804 | return false;
|
11805 | return true;
|
11806 | }
|
11807 | function charAllowsIdeographicBreaking(char) {
|
11808 | // Return early for characters outside all ideographic ranges.
|
11809 | if (char < 0x2E80)
|
11810 | return false;
|
11811 | if (unicodeBlockLookup['Bopomofo Extended'](char))
|
11812 | return true;
|
11813 | if (unicodeBlockLookup['Bopomofo'](char))
|
11814 | return true;
|
11815 | if (unicodeBlockLookup['CJK Compatibility Forms'](char))
|
11816 | return true;
|
11817 | if (unicodeBlockLookup['CJK Compatibility Ideographs'](char))
|
11818 | return true;
|
11819 | if (unicodeBlockLookup['CJK Compatibility'](char))
|
11820 | return true;
|
11821 | if (unicodeBlockLookup['CJK Radicals Supplement'](char))
|
11822 | return true;
|
11823 | if (unicodeBlockLookup['CJK Strokes'](char))
|
11824 | return true;
|
11825 | if (unicodeBlockLookup['CJK Symbols and Punctuation'](char))
|
11826 | return true;
|
11827 | if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char))
|
11828 | return true;
|
11829 | if (unicodeBlockLookup['CJK Unified Ideographs'](char))
|
11830 | return true;
|
11831 | if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char))
|
11832 | return true;
|
11833 | if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char))
|
11834 | return true;
|
11835 | if (unicodeBlockLookup['Hiragana'](char))
|
11836 | return true;
|
11837 | if (unicodeBlockLookup['Ideographic Description Characters'](char))
|
11838 | return true;
|
11839 | if (unicodeBlockLookup['Kangxi Radicals'](char))
|
11840 | return true;
|
11841 | if (unicodeBlockLookup['Katakana Phonetic Extensions'](char))
|
11842 | return true;
|
11843 | if (unicodeBlockLookup['Katakana'](char))
|
11844 | return true;
|
11845 | if (unicodeBlockLookup['Vertical Forms'](char))
|
11846 | return true;
|
11847 | if (unicodeBlockLookup['Yi Radicals'](char))
|
11848 | return true;
|
11849 | if (unicodeBlockLookup['Yi Syllables'](char))
|
11850 | return true;
|
11851 | return false;
|
11852 | }
|
11853 | // The following logic comes from
|
11854 | // <http://www.unicode.org/Public/12.0.0/ucd/VerticalOrientation.txt>.
|
11855 | // Keep it synchronized with
|
11856 | // <http://www.unicode.org/Public/UCD/latest/ucd/VerticalOrientation.txt>.
|
11857 | // The data file denotes with “U” or “Tu” any codepoint that may be drawn
|
11858 | // upright in vertical text but does not distinguish between upright and
|
11859 | // “neutral” characters.
|
11860 | // Blocks in the Unicode supplementary planes are excluded from this module due
|
11861 | // to <https://github.com/mapbox/mapbox-gl/issues/29>.
|
11862 | /**
|
11863 | * Returns true if the given Unicode codepoint identifies a character with
|
11864 | * upright orientation.
|
11865 | *
|
11866 | * A character has upright orientation if it is drawn upright (unrotated)
|
11867 | * whether the line is oriented horizontally or vertically, even if both
|
11868 | * adjacent characters can be rotated. For example, a Chinese character is
|
11869 | * always drawn upright. An uprightly oriented character causes an adjacent
|
11870 | * “neutral” character to be drawn upright as well.
|
11871 | * @private
|
11872 | */
|
11873 | function charHasUprightVerticalOrientation(char) {
|
11874 | if (char === 0x02EA /* modifier letter yin departing tone mark */ ||
|
11875 | char === 0x02EB /* modifier letter yang departing tone mark */) {
|
11876 | return true;
|
11877 | }
|
11878 | // Return early for characters outside all ranges whose characters remain
|
11879 | // upright in vertical writing mode.
|
11880 | if (char < 0x1100)
|
11881 | return false;
|
11882 | if (unicodeBlockLookup['Bopomofo Extended'](char))
|
11883 | return true;
|
11884 | if (unicodeBlockLookup['Bopomofo'](char))
|
11885 | return true;
|
11886 | if (unicodeBlockLookup['CJK Compatibility Forms'](char)) {
|
11887 | if (!((char >= 0xFE49 /* dashed overline */ && char <= 0xFE4F) /* wavy low line */)) {
|
11888 | return true;
|
11889 | }
|
11890 | }
|
11891 | if (unicodeBlockLookup['CJK Compatibility Ideographs'](char))
|
11892 | return true;
|
11893 | if (unicodeBlockLookup['CJK Compatibility'](char))
|
11894 | return true;
|
11895 | if (unicodeBlockLookup['CJK Radicals Supplement'](char))
|
11896 | return true;
|
11897 | if (unicodeBlockLookup['CJK Strokes'](char))
|
11898 | return true;
|
11899 | if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) {
|
11900 | if (!((char >= 0x3008 /* left angle bracket */ && char <= 0x3011) /* right black lenticular bracket */) &&
|
11901 | !((char >= 0x3014 /* left tortoise shell bracket */ && char <= 0x301F) /* low double prime quotation mark */) &&
|
11902 | char !== 0x3030 /* wavy dash */) {
|
11903 | return true;
|
11904 | }
|
11905 | }
|
11906 | if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char))
|
11907 | return true;
|
11908 | if (unicodeBlockLookup['CJK Unified Ideographs'](char))
|
11909 | return true;
|
11910 | if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char))
|
11911 | return true;
|
11912 | if (unicodeBlockLookup['Hangul Compatibility Jamo'](char))
|
11913 | return true;
|
11914 | if (unicodeBlockLookup['Hangul Jamo Extended-A'](char))
|
11915 | return true;
|
11916 | if (unicodeBlockLookup['Hangul Jamo Extended-B'](char))
|
11917 | return true;
|
11918 | if (unicodeBlockLookup['Hangul Jamo'](char))
|
11919 | return true;
|
11920 | if (unicodeBlockLookup['Hangul Syllables'](char))
|
11921 | return true;
|
11922 | if (unicodeBlockLookup['Hiragana'](char))
|
11923 | return true;
|
11924 | if (unicodeBlockLookup['Ideographic Description Characters'](char))
|
11925 | return true;
|
11926 | if (unicodeBlockLookup['Kanbun'](char))
|
11927 | return true;
|
11928 | if (unicodeBlockLookup['Kangxi Radicals'](char))
|
11929 | return true;
|
11930 | if (unicodeBlockLookup['Katakana Phonetic Extensions'](char))
|
11931 | return true;
|
11932 | if (unicodeBlockLookup['Katakana'](char)) {
|
11933 | if (char !== 0x30FC /* katakana-hiragana prolonged sound mark */) {
|
11934 | return true;
|
11935 | }
|
11936 | }
|
11937 | if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) {
|
11938 | if (char !== 0xFF08 /* fullwidth left parenthesis */ &&
|
11939 | char !== 0xFF09 /* fullwidth right parenthesis */ &&
|
11940 | char !== 0xFF0D /* fullwidth hyphen-minus */ &&
|
11941 | !((char >= 0xFF1A /* fullwidth colon */ && char <= 0xFF1E) /* fullwidth greater-than sign */) &&
|
11942 | char !== 0xFF3B /* fullwidth left square bracket */ &&
|
11943 | char !== 0xFF3D /* fullwidth right square bracket */ &&
|
11944 | char !== 0xFF3F /* fullwidth low line */ &&
|
11945 | !(char >= 0xFF5B /* fullwidth left curly bracket */ && char <= 0xFFDF) &&
|
11946 | char !== 0xFFE3 /* fullwidth macron */ &&
|
11947 | !(char >= 0xFFE8 /* halfwidth forms light vertical */ && char <= 0xFFEF)) {
|
11948 | return true;
|
11949 | }
|
11950 | }
|
11951 | if (unicodeBlockLookup['Small Form Variants'](char)) {
|
11952 | if (!((char >= 0xFE58 /* small em dash */ && char <= 0xFE5E) /* small right tortoise shell bracket */) &&
|
11953 | !((char >= 0xFE63 /* small hyphen-minus */ && char <= 0xFE66) /* small equals sign */)) {
|
11954 | return true;
|
11955 | }
|
11956 | }
|
11957 | if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics'](char))
|
11958 | return true;
|
11959 | if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics Extended'](char))
|
11960 | return true;
|
11961 | if (unicodeBlockLookup['Vertical Forms'](char))
|
11962 | return true;
|
11963 | if (unicodeBlockLookup['Yijing Hexagram Symbols'](char))
|
11964 | return true;
|
11965 | if (unicodeBlockLookup['Yi Syllables'](char))
|
11966 | return true;
|
11967 | if (unicodeBlockLookup['Yi Radicals'](char))
|
11968 | return true;
|
11969 | return false;
|
11970 | }
|
11971 | /**
|
11972 | * Returns true if the given Unicode codepoint identifies a character with
|
11973 | * neutral orientation.
|
11974 | *
|
11975 | * A character has neutral orientation if it may be drawn rotated or unrotated
|
11976 | * when the line is oriented vertically, depending on the orientation of the
|
11977 | * adjacent characters. For example, along a verticlly oriented line, the vulgar
|
11978 | * fraction ½ is drawn upright among Chinese characters but rotated among Latin
|
11979 | * letters. A neutrally oriented character does not influence whether an
|
11980 | * adjacent character is drawn upright or rotated.
|
11981 | * @private
|
11982 | */
|
11983 | function charHasNeutralVerticalOrientation(char) {
|
11984 | if (unicodeBlockLookup['Latin-1 Supplement'](char)) {
|
11985 | if (char === 0x00A7 /* section sign */ ||
|
11986 | char === 0x00A9 /* copyright sign */ ||
|
11987 | char === 0x00AE /* registered sign */ ||
|
11988 | char === 0x00B1 /* plus-minus sign */ ||
|
11989 | char === 0x00BC /* vulgar fraction one quarter */ ||
|
11990 | char === 0x00BD /* vulgar fraction one half */ ||
|
11991 | char === 0x00BE /* vulgar fraction three quarters */ ||
|
11992 | char === 0x00D7 /* multiplication sign */ ||
|
11993 | char === 0x00F7 /* division sign */) {
|
11994 | return true;
|
11995 | }
|
11996 | }
|
11997 | if (unicodeBlockLookup['General Punctuation'](char)) {
|
11998 | if (char === 0x2016 /* double vertical line */ ||
|
11999 | char === 0x2020 /* dagger */ ||
|
12000 | char === 0x2021 /* double dagger */ ||
|
12001 | char === 0x2030 /* per mille sign */ ||
|
12002 | char === 0x2031 /* per ten thousand sign */ ||
|
12003 | char === 0x203B /* reference mark */ ||
|
12004 | char === 0x203C /* double exclamation mark */ ||
|
12005 | char === 0x2042 /* asterism */ ||
|
12006 | char === 0x2047 /* double question mark */ ||
|
12007 | char === 0x2048 /* question exclamation mark */ ||
|
12008 | char === 0x2049 /* exclamation question mark */ ||
|
12009 | char === 0x2051 /* two asterisks aligned vertically */) {
|
12010 | return true;
|
12011 | }
|
12012 | }
|
12013 | if (unicodeBlockLookup['Letterlike Symbols'](char))
|
12014 | return true;
|
12015 | if (unicodeBlockLookup['Number Forms'](char))
|
12016 | return true;
|
12017 | if (unicodeBlockLookup['Miscellaneous Technical'](char)) {
|
12018 | if ((char >= 0x2300 /* diameter sign */ && char <= 0x2307 /* wavy line */) ||
|
12019 | (char >= 0x230C /* bottom right crop */ && char <= 0x231F /* bottom right corner */) ||
|
12020 | (char >= 0x2324 /* up arrowhead between two horizontal bars */ && char <= 0x2328 /* keyboard */) ||
|
12021 | char === 0x232B /* erase to the left */ ||
|
12022 | (char >= 0x237D /* shouldered open box */ && char <= 0x239A /* clear screen symbol */) ||
|
12023 | (char >= 0x23BE /* dentistry symbol light vertical and top right */ && char <= 0x23CD /* square foot */) ||
|
12024 | char === 0x23CF /* eject symbol */ ||
|
12025 | (char >= 0x23D1 /* metrical breve */ && char <= 0x23DB /* fuse */) ||
|
12026 | (char >= 0x23E2 /* white trapezium */ && char <= 0x23FF)) {
|
12027 | return true;
|
12028 | }
|
12029 | }
|
12030 | if (unicodeBlockLookup['Control Pictures'](char) && char !== 0x2423 /* open box */)
|
12031 | return true;
|
12032 | if (unicodeBlockLookup['Optical Character Recognition'](char))
|
12033 | return true;
|
12034 | if (unicodeBlockLookup['Enclosed Alphanumerics'](char))
|
12035 | return true;
|
12036 | if (unicodeBlockLookup['Geometric Shapes'](char))
|
12037 | return true;
|
12038 | if (unicodeBlockLookup['Miscellaneous Symbols'](char)) {
|
12039 | if (!((char >= 0x261A /* black left pointing index */ && char <= 0x261F) /* white down pointing index */)) {
|
12040 | return true;
|
12041 | }
|
12042 | }
|
12043 | if (unicodeBlockLookup['Miscellaneous Symbols and Arrows'](char)) {
|
12044 | if ((char >= 0x2B12 /* square with top half black */ && char <= 0x2B2F /* white vertical ellipse */) ||
|
12045 | (char >= 0x2B50 /* white medium star */ && char <= 0x2B59 /* heavy circled saltire */) ||
|
12046 | (char >= 0x2BB8 /* upwards white arrow from bar with horizontal bar */ && char <= 0x2BEB)) {
|
12047 | return true;
|
12048 | }
|
12049 | }
|
12050 | if (unicodeBlockLookup['CJK Symbols and Punctuation'](char))
|
12051 | return true;
|
12052 | if (unicodeBlockLookup['Katakana'](char))
|
12053 | return true;
|
12054 | if (unicodeBlockLookup['Private Use Area'](char))
|
12055 | return true;
|
12056 | if (unicodeBlockLookup['CJK Compatibility Forms'](char))
|
12057 | return true;
|
12058 | if (unicodeBlockLookup['Small Form Variants'](char))
|
12059 | return true;
|
12060 | if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char))
|
12061 | return true;
|
12062 | if (char === 0x221E /* infinity */ ||
|
12063 | char === 0x2234 /* therefore */ ||
|
12064 | char === 0x2235 /* because */ ||
|
12065 | (char >= 0x2700 /* black safety scissors */ && char <= 0x2767 /* rotated floral heart bullet */) ||
|
12066 | (char >= 0x2776 /* dingbat negative circled digit one */ && char <= 0x2793 /* dingbat negative circled sans-serif number ten */) ||
|
12067 | char === 0xFFFC /* object replacement character */ ||
|
12068 | char === 0xFFFD /* replacement character */) {
|
12069 | return true;
|
12070 | }
|
12071 | return false;
|
12072 | }
|
12073 | /**
|
12074 | * Returns true if the given Unicode codepoint identifies a character with
|
12075 | * rotated orientation.
|
12076 | *
|
12077 | * A character has rotated orientation if it is drawn rotated when the line is
|
12078 | * oriented vertically, even if both adjacent characters are upright. For
|
12079 | * example, a Latin letter is drawn rotated along a vertical line. A rotated
|
12080 | * character causes an adjacent “neutral” character to be drawn rotated as well.
|
12081 | * @private
|
12082 | */
|
12083 | function charHasRotatedVerticalOrientation(char) {
|
12084 | return !(charHasUprightVerticalOrientation(char) ||
|
12085 | charHasNeutralVerticalOrientation(char));
|
12086 | }
|
12087 | function charInComplexShapingScript(char) {
|
12088 | return unicodeBlockLookup['Arabic'](char) ||
|
12089 | unicodeBlockLookup['Arabic Supplement'](char) ||
|
12090 | unicodeBlockLookup['Arabic Extended-A'](char) ||
|
12091 | unicodeBlockLookup['Arabic Presentation Forms-A'](char) ||
|
12092 | unicodeBlockLookup['Arabic Presentation Forms-B'](char);
|
12093 | }
|
12094 | function charInRTLScript(char) {
|
12095 | // Main blocks for Hebrew, Arabic, Thaana and other RTL scripts
|
12096 | return (char >= 0x0590 && char <= 0x08FF) ||
|
12097 | unicodeBlockLookup['Arabic Presentation Forms-A'](char) ||
|
12098 | unicodeBlockLookup['Arabic Presentation Forms-B'](char);
|
12099 | }
|
12100 | function charInSupportedScript(char, canRenderRTL) {
|
12101 | // This is a rough heuristic: whether we "can render" a script
|
12102 | // actually depends on the properties of the font being used
|
12103 | // and whether differences from the ideal rendering are considered
|
12104 | // semantically significant.
|
12105 | // Even in Latin script, we "can't render" combinations such as the fi
|
12106 | // ligature, but we don't consider that semantically significant.
|
12107 | if (!canRenderRTL && charInRTLScript(char)) {
|
12108 | return false;
|
12109 | }
|
12110 | if ((char >= 0x0900 && char <= 0x0DFF) ||
|
12111 | // Main blocks for Indic scripts and Sinhala
|
12112 | (char >= 0x0F00 && char <= 0x109F) ||
|
12113 | // Main blocks for Tibetan and Myanmar
|
12114 | unicodeBlockLookup['Khmer'](char)) {
|
12115 | // These blocks cover common scripts that require
|
12116 | // complex text shaping, based on unicode script metadata:
|
12117 | // http://www.unicode.org/repos/cldr/trunk/common/properties/scriptMetadata.txt
|
12118 | // where "Web Rank <= 32" "Shaping Required = YES"
|
12119 | return false;
|
12120 | }
|
12121 | return true;
|
12122 | }
|
12123 | function stringContainsRTLText(chars) {
|
12124 | for (const char of chars) {
|
12125 | if (charInRTLScript(char.charCodeAt(0))) {
|
12126 | return true;
|
12127 | }
|
12128 | }
|
12129 | return false;
|
12130 | }
|
12131 | function isStringInSupportedScript(chars, canRenderRTL) {
|
12132 | for (const char of chars) {
|
12133 | if (!charInSupportedScript(char.charCodeAt(0), canRenderRTL)) {
|
12134 | return false;
|
12135 | }
|
12136 | }
|
12137 | return true;
|
12138 | }
|
12139 |
|
12140 | const status = {
|
12141 | unavailable: 'unavailable',
|
12142 | deferred: 'deferred',
|
12143 | loading: 'loading',
|
12144 | loaded: 'loaded',
|
12145 | error: 'error'
|
12146 | };
|
12147 | let _completionCallback = null;
|
12148 | //Variables defining the current state of the plugin
|
12149 | let pluginStatus = status.unavailable;
|
12150 | let pluginURL = null;
|
12151 | const triggerPluginCompletionEvent = function (error) {
|
12152 | // NetworkError's are not correctly reflected by the plugin status which prevents reloading plugin
|
12153 | if (error && typeof error === 'string' && error.indexOf('NetworkError') > -1) {
|
12154 | pluginStatus = status.error;
|
12155 | }
|
12156 | if (_completionCallback) {
|
12157 | _completionCallback(error);
|
12158 | }
|
12159 | };
|
12160 | function sendPluginStateToWorker() {
|
12161 | evented.fire(new Event('pluginStateChange', { pluginStatus, pluginURL }));
|
12162 | }
|
12163 | const evented = new Evented();
|
12164 | const getRTLTextPluginStatus = function () {
|
12165 | return pluginStatus;
|
12166 | };
|
12167 | const registerForPluginStateChange = function (callback) {
|
12168 | // Do an initial sync of the state
|
12169 | callback({ pluginStatus, pluginURL });
|
12170 | // Listen for all future state changes
|
12171 | evented.on('pluginStateChange', callback);
|
12172 | return callback;
|
12173 | };
|
12174 | const clearRTLTextPlugin = function () {
|
12175 | pluginStatus = status.unavailable;
|
12176 | pluginURL = null;
|
12177 | };
|
12178 | const setRTLTextPlugin = function (url, callback, deferred = false) {
|
12179 | if (pluginStatus === status.deferred || pluginStatus === status.loading || pluginStatus === status.loaded) {
|
12180 | throw new Error('setRTLTextPlugin cannot be called multiple times.');
|
12181 | }
|
12182 | pluginURL = exported$1.resolveURL(url);
|
12183 | pluginStatus = status.deferred;
|
12184 | _completionCallback = callback;
|
12185 | sendPluginStateToWorker();
|
12186 | //Start downloading the plugin immediately if not intending to lazy-load
|
12187 | if (!deferred) {
|
12188 | downloadRTLTextPlugin();
|
12189 | }
|
12190 | };
|
12191 | const downloadRTLTextPlugin = function () {
|
12192 | if (pluginStatus !== status.deferred || !pluginURL) {
|
12193 | throw new Error('rtl-text-plugin cannot be downloaded unless a pluginURL is specified');
|
12194 | }
|
12195 | pluginStatus = status.loading;
|
12196 | sendPluginStateToWorker();
|
12197 | if (pluginURL) {
|
12198 | getArrayBuffer({ url: pluginURL }, (error) => {
|
12199 | if (error) {
|
12200 | triggerPluginCompletionEvent(error);
|
12201 | }
|
12202 | else {
|
12203 | pluginStatus = status.loaded;
|
12204 | sendPluginStateToWorker();
|
12205 | }
|
12206 | });
|
12207 | }
|
12208 | };
|
12209 | const plugin = {
|
12210 | applyArabicShaping: null,
|
12211 | processBidirectionalText: null,
|
12212 | processStyledBidirectionalText: null,
|
12213 | isLoaded() {
|
12214 | return pluginStatus === status.loaded || // Main Thread: loaded if the completion callback returned successfully
|
12215 | plugin.applyArabicShaping != null; // Web-worker: loaded if the plugin functions have been compiled
|
12216 | },
|
12217 | isLoading() {
|
12218 | return pluginStatus === status.loading;
|
12219 | },
|
12220 | setState(state) {
|
12221 | assert$1(isWorker(), 'Cannot set the state of the rtl-text-plugin when not in the web-worker context');
|
12222 | pluginStatus = state.pluginStatus;
|
12223 | pluginURL = state.pluginURL;
|
12224 | },
|
12225 | isParsed() {
|
12226 | assert$1(isWorker(), 'rtl-text-plugin is only parsed on the worker-threads');
|
12227 | return plugin.applyArabicShaping != null &&
|
12228 | plugin.processBidirectionalText != null &&
|
12229 | plugin.processStyledBidirectionalText != null;
|
12230 | },
|
12231 | getPluginURL() {
|
12232 | assert$1(isWorker(), 'rtl-text-plugin url can only be queried from the worker threads');
|
12233 | return pluginURL;
|
12234 | }
|
12235 | };
|
12236 | const lazyLoadRTLTextPlugin = function () {
|
12237 | if (!plugin.isLoading() &&
|
12238 | !plugin.isLoaded() &&
|
12239 | getRTLTextPluginStatus() === 'deferred') {
|
12240 | downloadRTLTextPlugin();
|
12241 | }
|
12242 | };
|
12243 |
|
12244 | class EvaluationParameters {
|
12245 | // "options" may also be another EvaluationParameters to copy, see CrossFadedProperty.possiblyEvaluate
|
12246 | constructor(zoom, options) {
|
12247 | this.zoom = zoom;
|
12248 | if (options) {
|
12249 | this.now = options.now;
|
12250 | this.fadeDuration = options.fadeDuration;
|
12251 | this.zoomHistory = options.zoomHistory;
|
12252 | this.transition = options.transition;
|
12253 | }
|
12254 | else {
|
12255 | this.now = 0;
|
12256 | this.fadeDuration = 0;
|
12257 | this.zoomHistory = new ZoomHistory();
|
12258 | this.transition = {};
|
12259 | }
|
12260 | }
|
12261 | isSupportedScript(str) {
|
12262 | return isStringInSupportedScript(str, plugin.isLoaded());
|
12263 | }
|
12264 | crossFadingFactor() {
|
12265 | if (this.fadeDuration === 0) {
|
12266 | return 1;
|
12267 | }
|
12268 | else {
|
12269 | return Math.min((this.now - this.zoomHistory.lastIntegerZoomTime) / this.fadeDuration, 1);
|
12270 | }
|
12271 | }
|
12272 | getCrossfadeParameters() {
|
12273 | const z = this.zoom;
|
12274 | const fraction = z - Math.floor(z);
|
12275 | const t = this.crossFadingFactor();
|
12276 | return z > this.zoomHistory.lastIntegerZoom ?
|
12277 | { fromScale: 2, toScale: 1, t: fraction + (1 - fraction) * t } :
|
12278 | { fromScale: 0.5, toScale: 1, t: 1 - (1 - t) * fraction };
|
12279 | }
|
12280 | }
|
12281 |
|
12282 | /**
|
12283 | * `PropertyValue` represents the value part of a property key-value unit. It's used to represent both
|
12284 | * paint and layout property values, and regardless of whether or not their property supports data-driven
|
12285 | * expressions.
|
12286 | *
|
12287 | * `PropertyValue` stores the raw input value as seen in a style or a runtime styling API call, i.e. one of the
|
12288 | * following:
|
12289 | *
|
12290 | * * A constant value of the type appropriate for the property
|
12291 | * * A function which produces a value of that type (but functions are quasi-deprecated in favor of expressions)
|
12292 | * * An expression which produces a value of that type
|
12293 | * * "undefined"/"not present", in which case the property is assumed to take on its default value.
|
12294 | *
|
12295 | * In addition to storing the original input value, `PropertyValue` also stores a normalized representation,
|
12296 | * effectively treating functions as if they are expressions, and constant or default values as if they are
|
12297 | * (constant) expressions.
|
12298 | *
|
12299 | * @private
|
12300 | */
|
12301 | class PropertyValue {
|
12302 | constructor(property, value) {
|
12303 | this.property = property;
|
12304 | this.value = value;
|
12305 | this.expression = normalizePropertyExpression(value === undefined ? property.specification.default : value, property.specification);
|
12306 | }
|
12307 | isDataDriven() {
|
12308 | return this.expression.kind === 'source' || this.expression.kind === 'composite';
|
12309 | }
|
12310 | possiblyEvaluate(parameters, canonical, availableImages) {
|
12311 | return this.property.possiblyEvaluate(this, parameters, canonical, availableImages);
|
12312 | }
|
12313 | }
|
12314 | /**
|
12315 | * Paint properties are _transitionable_: they can change in a fluid manner, interpolating or cross-fading between
|
12316 | * old and new value. The duration of the transition, and the delay before it begins, is configurable.
|
12317 | *
|
12318 | * `TransitionablePropertyValue` is a compositional class that stores both the property value and that transition
|
12319 | * configuration.
|
12320 | *
|
12321 | * A `TransitionablePropertyValue` can calculate the next step in the evaluation chain for paint property values:
|
12322 | * `TransitioningPropertyValue`.
|
12323 | *
|
12324 | * @private
|
12325 | */
|
12326 | class TransitionablePropertyValue {
|
12327 | constructor(property) {
|
12328 | this.property = property;
|
12329 | this.value = new PropertyValue(property, undefined);
|
12330 | }
|
12331 | transitioned(parameters, prior) {
|
12332 | return new TransitioningPropertyValue(this.property, this.value, prior, // eslint-disable-line no-use-before-define
|
12333 | extend$1({}, parameters.transition, this.transition), parameters.now);
|
12334 | }
|
12335 | untransitioned() {
|
12336 | return new TransitioningPropertyValue(this.property, this.value, null, {}, 0); // eslint-disable-line no-use-before-define
|
12337 | }
|
12338 | }
|
12339 | /**
|
12340 | * `Transitionable` stores a map of all (property name, `TransitionablePropertyValue`) pairs for paint properties of a
|
12341 | * given layer type. It can calculate the `TransitioningPropertyValue`s for all of them at once, producing a
|
12342 | * `Transitioning` instance for the same set of properties.
|
12343 | *
|
12344 | * @private
|
12345 | */
|
12346 | class Transitionable {
|
12347 | constructor(properties) {
|
12348 | this._properties = properties;
|
12349 | this._values = Object.create(properties.defaultTransitionablePropertyValues);
|
12350 | }
|
12351 | getValue(name) {
|
12352 | return clone$9(this._values[name].value.value);
|
12353 | }
|
12354 | setValue(name, value) {
|
12355 | if (!Object.prototype.hasOwnProperty.call(this._values, name)) {
|
12356 | this._values[name] = new TransitionablePropertyValue(this._values[name].property);
|
12357 | }
|
12358 | // Note that we do not _remove_ an own property in the case where a value is being reset
|
12359 | // to the default: the transition might still be non-default.
|
12360 | this._values[name].value = new PropertyValue(this._values[name].property, value === null ? undefined : clone$9(value));
|
12361 | }
|
12362 | getTransition(name) {
|
12363 | return clone$9(this._values[name].transition);
|
12364 | }
|
12365 | setTransition(name, value) {
|
12366 | if (!Object.prototype.hasOwnProperty.call(this._values, name)) {
|
12367 | this._values[name] = new TransitionablePropertyValue(this._values[name].property);
|
12368 | }
|
12369 | this._values[name].transition = clone$9(value) || undefined;
|
12370 | }
|
12371 | serialize() {
|
12372 | const result = {};
|
12373 | for (const property of Object.keys(this._values)) {
|
12374 | const value = this.getValue(property);
|
12375 | if (value !== undefined) {
|
12376 | result[property] = value;
|
12377 | }
|
12378 | const transition = this.getTransition(property);
|
12379 | if (transition !== undefined) {
|
12380 | result[`${property}-transition`] = transition;
|
12381 | }
|
12382 | }
|
12383 | return result;
|
12384 | }
|
12385 | transitioned(parameters, prior) {
|
12386 | const result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define
|
12387 | for (const property of Object.keys(this._values)) {
|
12388 | result._values[property] = this._values[property].transitioned(parameters, prior._values[property]);
|
12389 | }
|
12390 | return result;
|
12391 | }
|
12392 | untransitioned() {
|
12393 | const result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define
|
12394 | for (const property of Object.keys(this._values)) {
|
12395 | result._values[property] = this._values[property].untransitioned();
|
12396 | }
|
12397 | return result;
|
12398 | }
|
12399 | }
|
12400 | // ------- Transitioning -------
|
12401 | /**
|
12402 | * `TransitioningPropertyValue` implements the first of two intermediate steps in the evaluation chain of a paint
|
12403 | * property value. In this step, transitions between old and new values are handled: as long as the transition is in
|
12404 | * progress, `TransitioningPropertyValue` maintains a reference to the prior value, and interpolates between it and
|
12405 | * the new value based on the current time and the configured transition duration and delay. The product is the next
|
12406 | * step in the evaluation chain: the "possibly evaluated" result type `R`. See below for more on this concept.
|
12407 | *
|
12408 | * @private
|
12409 | */
|
12410 | class TransitioningPropertyValue {
|
12411 | constructor(property, value, prior, transition, now) {
|
12412 | this.property = property;
|
12413 | this.value = value;
|
12414 | this.begin = now + transition.delay || 0;
|
12415 | this.end = this.begin + transition.duration || 0;
|
12416 | if (property.specification.transition && (transition.delay || transition.duration)) {
|
12417 | this.prior = prior;
|
12418 | }
|
12419 | }
|
12420 | possiblyEvaluate(parameters, canonical, availableImages) {
|
12421 | const now = parameters.now || 0;
|
12422 | const finalValue = this.value.possiblyEvaluate(parameters, canonical, availableImages);
|
12423 | const prior = this.prior;
|
12424 | if (!prior) {
|
12425 | // No prior value.
|
12426 | return finalValue;
|
12427 | }
|
12428 | else if (now > this.end) {
|
12429 | // Transition from prior value is now complete.
|
12430 | this.prior = null;
|
12431 | return finalValue;
|
12432 | }
|
12433 | else if (this.value.isDataDriven()) {
|
12434 | // Transitions to data-driven properties are not supported.
|
12435 | // We snap immediately to the data-driven value so that, when we perform layout,
|
12436 | // we see the data-driven function and can use it to populate vertex buffers.
|
12437 | this.prior = null;
|
12438 | return finalValue;
|
12439 | }
|
12440 | else if (now < this.begin) {
|
12441 | // Transition hasn't started yet.
|
12442 | return prior.possiblyEvaluate(parameters, canonical, availableImages);
|
12443 | }
|
12444 | else {
|
12445 | // Interpolate between recursively-calculated prior value and final.
|
12446 | const t = (now - this.begin) / (this.end - this.begin);
|
12447 | return this.property.interpolate(prior.possiblyEvaluate(parameters, canonical, availableImages), finalValue, easeCubicInOut(t));
|
12448 | }
|
12449 | }
|
12450 | }
|
12451 | /**
|
12452 | * `Transitioning` stores a map of all (property name, `TransitioningPropertyValue`) pairs for paint properties of a
|
12453 | * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a
|
12454 | * `PossiblyEvaluated` instance for the same set of properties.
|
12455 | *
|
12456 | * @private
|
12457 | */
|
12458 | class Transitioning {
|
12459 | constructor(properties) {
|
12460 | this._properties = properties;
|
12461 | this._values = Object.create(properties.defaultTransitioningPropertyValues);
|
12462 | }
|
12463 | possiblyEvaluate(parameters, canonical, availableImages) {
|
12464 | const result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define
|
12465 | for (const property of Object.keys(this._values)) {
|
12466 | result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages);
|
12467 | }
|
12468 | return result;
|
12469 | }
|
12470 | hasTransition() {
|
12471 | for (const property of Object.keys(this._values)) {
|
12472 | if (this._values[property].prior) {
|
12473 | return true;
|
12474 | }
|
12475 | }
|
12476 | return false;
|
12477 | }
|
12478 | }
|
12479 | // ------- Layout -------
|
12480 | /**
|
12481 | * Because layout properties are not transitionable, they have a simpler representation and evaluation chain than
|
12482 | * paint properties: `PropertyValue`s are possibly evaluated, producing possibly evaluated values, which are then
|
12483 | * fully evaluated.
|
12484 | *
|
12485 | * `Layout` stores a map of all (property name, `PropertyValue`) pairs for layout properties of a
|
12486 | * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a
|
12487 | * `PossiblyEvaluated` instance for the same set of properties.
|
12488 | *
|
12489 | * @private
|
12490 | */
|
12491 | class Layout {
|
12492 | constructor(properties) {
|
12493 | this._properties = properties;
|
12494 | this._values = Object.create(properties.defaultPropertyValues);
|
12495 | }
|
12496 | getValue(name) {
|
12497 | return clone$9(this._values[name].value);
|
12498 | }
|
12499 | setValue(name, value) {
|
12500 | this._values[name] = new PropertyValue(this._values[name].property, value === null ? undefined : clone$9(value));
|
12501 | }
|
12502 | serialize() {
|
12503 | const result = {};
|
12504 | for (const property of Object.keys(this._values)) {
|
12505 | const value = this.getValue(property);
|
12506 | if (value !== undefined) {
|
12507 | result[property] = value;
|
12508 | }
|
12509 | }
|
12510 | return result;
|
12511 | }
|
12512 | possiblyEvaluate(parameters, canonical, availableImages) {
|
12513 | const result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define
|
12514 | for (const property of Object.keys(this._values)) {
|
12515 | result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages);
|
12516 | }
|
12517 | return result;
|
12518 | }
|
12519 | }
|
12520 | /**
|
12521 | * `PossiblyEvaluatedPropertyValue` is used for data-driven paint and layout property values. It holds a
|
12522 | * `PossiblyEvaluatedValue` and the `GlobalProperties` that were used to generate it. You're not allowed to supply
|
12523 | * a different set of `GlobalProperties` when performing the final evaluation because they would be ignored in the
|
12524 | * case where the input value was a constant or camera function.
|
12525 | *
|
12526 | * @private
|
12527 | */
|
12528 | class PossiblyEvaluatedPropertyValue {
|
12529 | constructor(property, value, parameters) {
|
12530 | this.property = property;
|
12531 | this.value = value;
|
12532 | this.parameters = parameters;
|
12533 | }
|
12534 | isConstant() {
|
12535 | return this.value.kind === 'constant';
|
12536 | }
|
12537 | constantOr(value) {
|
12538 | if (this.value.kind === 'constant') {
|
12539 | return this.value.value;
|
12540 | }
|
12541 | else {
|
12542 | return value;
|
12543 | }
|
12544 | }
|
12545 | evaluate(feature, featureState, canonical, availableImages) {
|
12546 | return this.property.evaluate(this.value, this.parameters, feature, featureState, canonical, availableImages);
|
12547 | }
|
12548 | }
|
12549 | /**
|
12550 | * `PossiblyEvaluated` stores a map of all (property name, `R`) pairs for paint or layout properties of a
|
12551 | * given layer type.
|
12552 | * @private
|
12553 | */
|
12554 | class PossiblyEvaluated {
|
12555 | constructor(properties) {
|
12556 | this._properties = properties;
|
12557 | this._values = Object.create(properties.defaultPossiblyEvaluatedValues);
|
12558 | }
|
12559 | get(name) {
|
12560 | return this._values[name];
|
12561 | }
|
12562 | }
|
12563 | /**
|
12564 | * An implementation of `Property` for properties that do not permit data-driven (source or composite) expressions.
|
12565 | * This restriction allows us to declare statically that the result of possibly evaluating this kind of property
|
12566 | * is in fact always the scalar type `T`, and can be used without further evaluating the value on a per-feature basis.
|
12567 | *
|
12568 | * @private
|
12569 | */
|
12570 | class DataConstantProperty {
|
12571 | constructor(specification) {
|
12572 | this.specification = specification;
|
12573 | }
|
12574 | possiblyEvaluate(value, parameters) {
|
12575 | assert$1(!value.isDataDriven());
|
12576 | return value.expression.evaluate(parameters);
|
12577 | }
|
12578 | interpolate(a, b, t) {
|
12579 | const interp = interpolate[this.specification.type];
|
12580 | if (interp) {
|
12581 | return interp(a, b, t);
|
12582 | }
|
12583 | else {
|
12584 | return a;
|
12585 | }
|
12586 | }
|
12587 | }
|
12588 | /**
|
12589 | * An implementation of `Property` for properties that permit data-driven (source or composite) expressions.
|
12590 | * The result of possibly evaluating this kind of property is `PossiblyEvaluatedPropertyValue<T>`; obtaining
|
12591 | * a scalar value `T` requires further evaluation on a per-feature basis.
|
12592 | *
|
12593 | * @private
|
12594 | */
|
12595 | class DataDrivenProperty {
|
12596 | constructor(specification, overrides) {
|
12597 | this.specification = specification;
|
12598 | this.overrides = overrides;
|
12599 | }
|
12600 | possiblyEvaluate(value, parameters, canonical, availableImages) {
|
12601 | if (value.expression.kind === 'constant' || value.expression.kind === 'camera') {
|
12602 | return new PossiblyEvaluatedPropertyValue(this, { kind: 'constant', value: value.expression.evaluate(parameters, null, {}, canonical, availableImages) }, parameters);
|
12603 | }
|
12604 | else {
|
12605 | return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters);
|
12606 | }
|
12607 | }
|
12608 | interpolate(a, b, t) {
|
12609 | // If either possibly-evaluated value is non-constant, give up: we aren't able to interpolate data-driven values.
|
12610 | if (a.value.kind !== 'constant' || b.value.kind !== 'constant') {
|
12611 | return a;
|
12612 | }
|
12613 | // Special case hack solely for fill-outline-color. The undefined value is subsequently handled in
|
12614 | // FillStyleLayer#recalculate, which sets fill-outline-color to the fill-color value if the former
|
12615 | // is a PossiblyEvaluatedPropertyValue containing a constant undefined value. In addition to the
|
12616 | // return value here, the other source of a PossiblyEvaluatedPropertyValue containing a constant
|
12617 | // undefined value is the "default value" for fill-outline-color held in
|
12618 | // `Properties#defaultPossiblyEvaluatedValues`, which serves as the prototype of
|
12619 | // `PossiblyEvaluated#_values`.
|
12620 | if (a.value.value === undefined || b.value.value === undefined) {
|
12621 | return new PossiblyEvaluatedPropertyValue(this, { kind: 'constant', value: undefined }, a.parameters);
|
12622 | }
|
12623 | const interp = interpolate[this.specification.type];
|
12624 | if (interp) {
|
12625 | return new PossiblyEvaluatedPropertyValue(this, { kind: 'constant', value: interp(a.value.value, b.value.value, t) }, a.parameters);
|
12626 | }
|
12627 | else {
|
12628 | return a;
|
12629 | }
|
12630 | }
|
12631 | evaluate(value, parameters, feature, featureState, canonical, availableImages) {
|
12632 | if (value.kind === 'constant') {
|
12633 | return value.value;
|
12634 | }
|
12635 | else {
|
12636 | return value.evaluate(parameters, feature, featureState, canonical, availableImages);
|
12637 | }
|
12638 | }
|
12639 | }
|
12640 | /**
|
12641 | * An implementation of `Property` for data driven `line-pattern` which are transitioned by cross-fading
|
12642 | * rather than interpolation.
|
12643 | *
|
12644 | * @private
|
12645 | */
|
12646 | class CrossFadedDataDrivenProperty extends DataDrivenProperty {
|
12647 | possiblyEvaluate(value, parameters, canonical, availableImages) {
|
12648 | if (value.value === undefined) {
|
12649 | return new PossiblyEvaluatedPropertyValue(this, { kind: 'constant', value: undefined }, parameters);
|
12650 | }
|
12651 | else if (value.expression.kind === 'constant') {
|
12652 | const evaluatedValue = value.expression.evaluate(parameters, null, {}, canonical, availableImages);
|
12653 | const isImageExpression = value.property.specification.type === 'resolvedImage';
|
12654 | const constantValue = isImageExpression && typeof evaluatedValue !== 'string' ? evaluatedValue.name : evaluatedValue;
|
12655 | const constant = this._calculate(constantValue, constantValue, constantValue, parameters);
|
12656 | return new PossiblyEvaluatedPropertyValue(this, { kind: 'constant', value: constant }, parameters);
|
12657 | }
|
12658 | else if (value.expression.kind === 'camera') {
|
12659 | const cameraVal = this._calculate(value.expression.evaluate({ zoom: parameters.zoom - 1.0 }), value.expression.evaluate({ zoom: parameters.zoom }), value.expression.evaluate({ zoom: parameters.zoom + 1.0 }), parameters);
|
12660 | return new PossiblyEvaluatedPropertyValue(this, { kind: 'constant', value: cameraVal }, parameters);
|
12661 | }
|
12662 | else {
|
12663 | // source or composite expression
|
12664 | return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters);
|
12665 | }
|
12666 | }
|
12667 | evaluate(value, globals, feature, featureState, canonical, availableImages) {
|
12668 | if (value.kind === 'source') {
|
12669 | const constant = value.evaluate(globals, feature, featureState, canonical, availableImages);
|
12670 | return this._calculate(constant, constant, constant, globals);
|
12671 | }
|
12672 | else if (value.kind === 'composite') {
|
12673 | return this._calculate(value.evaluate({ zoom: Math.floor(globals.zoom) - 1.0 }, feature, featureState), value.evaluate({ zoom: Math.floor(globals.zoom) }, feature, featureState), value.evaluate({ zoom: Math.floor(globals.zoom) + 1.0 }, feature, featureState), globals);
|
12674 | }
|
12675 | else {
|
12676 | return value.value;
|
12677 | }
|
12678 | }
|
12679 | _calculate(min, mid, max, parameters) {
|
12680 | const z = parameters.zoom;
|
12681 | return z > parameters.zoomHistory.lastIntegerZoom ? { from: min, to: mid } : { from: max, to: mid };
|
12682 | }
|
12683 | interpolate(a) {
|
12684 | return a;
|
12685 | }
|
12686 | }
|
12687 | /**
|
12688 | * An implementation of `Property` for `*-pattern` and `line-dasharray`, which are transitioned by cross-fading
|
12689 | * rather than interpolation.
|
12690 | *
|
12691 | * @private
|
12692 | */
|
12693 | class CrossFadedProperty {
|
12694 | constructor(specification) {
|
12695 | this.specification = specification;
|
12696 | }
|
12697 | possiblyEvaluate(value, parameters, canonical, availableImages) {
|
12698 | if (value.value === undefined) {
|
12699 | return undefined;
|
12700 | }
|
12701 | else if (value.expression.kind === 'constant') {
|
12702 | const constant = value.expression.evaluate(parameters, null, {}, canonical, availableImages);
|
12703 | return this._calculate(constant, constant, constant, parameters);
|
12704 | }
|
12705 | else {
|
12706 | assert$1(!value.isDataDriven());
|
12707 | return this._calculate(value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom - 1.0), parameters)), value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom), parameters)), value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom + 1.0), parameters)), parameters);
|
12708 | }
|
12709 | }
|
12710 | _calculate(min, mid, max, parameters) {
|
12711 | const z = parameters.zoom;
|
12712 | return z > parameters.zoomHistory.lastIntegerZoom ? { from: min, to: mid } : { from: max, to: mid };
|
12713 | }
|
12714 | interpolate(a) {
|
12715 | return a;
|
12716 | }
|
12717 | }
|
12718 | /**
|
12719 | * An implementation of `Property` for `heatmap-color` and `line-gradient`. Interpolation is a no-op, and
|
12720 | * evaluation returns a boolean value in order to indicate its presence, but the real
|
12721 | * evaluation happens in StyleLayer classes.
|
12722 | *
|
12723 | * @private
|
12724 | */
|
12725 | class ColorRampProperty {
|
12726 | constructor(specification) {
|
12727 | this.specification = specification;
|
12728 | }
|
12729 | possiblyEvaluate(value, parameters, canonical, availableImages) {
|
12730 | return !!value.expression.evaluate(parameters, null, {}, canonical, availableImages);
|
12731 | }
|
12732 | interpolate() { return false; }
|
12733 | }
|
12734 | /**
|
12735 | * `Properties` holds objects containing default values for the layout or paint property set of a given
|
12736 | * layer type. These objects are immutable, and they are used as the prototypes for the `_values` members of
|
12737 | * `Transitionable`, `Transitioning`, `Layout`, and `PossiblyEvaluated`. This allows these classes to avoid
|
12738 | * doing work in the common case where a property has no explicit value set and should be considered to take
|
12739 | * on the default value: using `for (const property of Object.keys(this._values))`, they can iterate over
|
12740 | * only the _own_ properties of `_values`, skipping repeated calculation of transitions and possible/final
|
12741 | * evaluations for defaults, the result of which will always be the same.
|
12742 | *
|
12743 | * @private
|
12744 | */
|
12745 | class Properties {
|
12746 | constructor(properties) {
|
12747 | this.properties = properties;
|
12748 | this.defaultPropertyValues = {};
|
12749 | this.defaultTransitionablePropertyValues = {};
|
12750 | this.defaultTransitioningPropertyValues = {};
|
12751 | this.defaultPossiblyEvaluatedValues = {};
|
12752 | this.overridableProperties = [];
|
12753 | for (const property in properties) {
|
12754 | const prop = properties[property];
|
12755 | if (prop.specification.overridable) {
|
12756 | this.overridableProperties.push(property);
|
12757 | }
|
12758 | const defaultPropertyValue = this.defaultPropertyValues[property] =
|
12759 | new PropertyValue(prop, undefined);
|
12760 | const defaultTransitionablePropertyValue = this.defaultTransitionablePropertyValues[property] =
|
12761 | new TransitionablePropertyValue(prop);
|
12762 | this.defaultTransitioningPropertyValues[property] =
|
12763 | defaultTransitionablePropertyValue.untransitioned();
|
12764 | this.defaultPossiblyEvaluatedValues[property] =
|
12765 | defaultPropertyValue.possiblyEvaluate({});
|
12766 | }
|
12767 | }
|
12768 | }
|
12769 | register('DataDrivenProperty', DataDrivenProperty);
|
12770 | register('DataConstantProperty', DataConstantProperty);
|
12771 | register('CrossFadedDataDrivenProperty', CrossFadedDataDrivenProperty);
|
12772 | register('CrossFadedProperty', CrossFadedProperty);
|
12773 | register('ColorRampProperty', ColorRampProperty);
|
12774 |
|
12775 | const TRANSITION_SUFFIX = '-transition';
|
12776 | class StyleLayer extends Evented {
|
12777 | constructor(layer, properties) {
|
12778 | super();
|
12779 | this.id = layer.id;
|
12780 | this.type = layer.type;
|
12781 | this._featureFilter = { filter: () => true, needGeometry: false };
|
12782 | if (layer.type === 'custom')
|
12783 | return;
|
12784 | layer = layer;
|
12785 | this.metadata = layer.metadata;
|
12786 | this.minzoom = layer.minzoom;
|
12787 | this.maxzoom = layer.maxzoom;
|
12788 | if (layer.type !== 'background') {
|
12789 | this.source = layer.source;
|
12790 | this.sourceLayer = layer['source-layer'];
|
12791 | this.filter = layer.filter;
|
12792 | }
|
12793 | if (properties.layout) {
|
12794 | this._unevaluatedLayout = new Layout(properties.layout);
|
12795 | }
|
12796 | if (properties.paint) {
|
12797 | this._transitionablePaint = new Transitionable(properties.paint);
|
12798 | for (const property in layer.paint) {
|
12799 | this.setPaintProperty(property, layer.paint[property], { validate: false });
|
12800 | }
|
12801 | for (const property in layer.layout) {
|
12802 | this.setLayoutProperty(property, layer.layout[property], { validate: false });
|
12803 | }
|
12804 | this._transitioningPaint = this._transitionablePaint.untransitioned();
|
12805 | //$FlowFixMe
|
12806 | this.paint = new PossiblyEvaluated(properties.paint);
|
12807 | }
|
12808 | }
|
12809 | getCrossfadeParameters() {
|
12810 | return this._crossfadeParameters;
|
12811 | }
|
12812 | getLayoutProperty(name) {
|
12813 | if (name === 'visibility') {
|
12814 | return this.visibility;
|
12815 | }
|
12816 | return this._unevaluatedLayout.getValue(name);
|
12817 | }
|
12818 | setLayoutProperty(name, value, options = {}) {
|
12819 | if (value !== null && value !== undefined) {
|
12820 | const key = `layers.${this.id}.layout.${name}`;
|
12821 | if (this._validate(validateLayoutProperty, key, name, value, options)) {
|
12822 | return;
|
12823 | }
|
12824 | }
|
12825 | if (name === 'visibility') {
|
12826 | this.visibility = value;
|
12827 | return;
|
12828 | }
|
12829 | this._unevaluatedLayout.setValue(name, value);
|
12830 | }
|
12831 | getPaintProperty(name) {
|
12832 | if (name.endsWith(TRANSITION_SUFFIX)) {
|
12833 | return this._transitionablePaint.getTransition(name.slice(0, -TRANSITION_SUFFIX.length));
|
12834 | }
|
12835 | else {
|
12836 | return this._transitionablePaint.getValue(name);
|
12837 | }
|
12838 | }
|
12839 | setPaintProperty(name, value, options = {}) {
|
12840 | if (value !== null && value !== undefined) {
|
12841 | const key = `layers.${this.id}.paint.${name}`;
|
12842 | if (this._validate(validatePaintProperty, key, name, value, options)) {
|
12843 | return false;
|
12844 | }
|
12845 | }
|
12846 | if (name.endsWith(TRANSITION_SUFFIX)) {
|
12847 | this._transitionablePaint.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), value || undefined);
|
12848 | return false;
|
12849 | }
|
12850 | else {
|
12851 | const transitionable = this._transitionablePaint._values[name];
|
12852 | const isCrossFadedProperty = transitionable.property.specification['property-type'] === 'cross-faded-data-driven';
|
12853 | const wasDataDriven = transitionable.value.isDataDriven();
|
12854 | const oldValue = transitionable.value;
|
12855 | this._transitionablePaint.setValue(name, value);
|
12856 | this._handleSpecialPaintPropertyUpdate(name);
|
12857 | const newValue = this._transitionablePaint._values[name].value;
|
12858 | const isDataDriven = newValue.isDataDriven();
|
12859 | // if a cross-faded value is changed, we need to make sure the new icons get added to each tile's iconAtlas
|
12860 | // so a call to _updateLayer is necessary, and we return true from this function so it gets called in
|
12861 | // Style#setPaintProperty
|
12862 | return isDataDriven || wasDataDriven || isCrossFadedProperty || this._handleOverridablePaintPropertyUpdate(name, oldValue, newValue);
|
12863 | }
|
12864 | }
|
12865 | _handleSpecialPaintPropertyUpdate(_) {
|
12866 | // No-op; can be overridden by derived classes.
|
12867 | }
|
12868 | // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
12869 | _handleOverridablePaintPropertyUpdate(name, oldValue, newValue) {
|
12870 | // No-op; can be overridden by derived classes.
|
12871 | return false;
|
12872 | }
|
12873 | isHidden(zoom) {
|
12874 | if (this.minzoom && zoom < this.minzoom)
|
12875 | return true;
|
12876 | if (this.maxzoom && zoom >= this.maxzoom)
|
12877 | return true;
|
12878 | return this.visibility === 'none';
|
12879 | }
|
12880 | updateTransitions(parameters) {
|
12881 | this._transitioningPaint = this._transitionablePaint.transitioned(parameters, this._transitioningPaint);
|
12882 | }
|
12883 | hasTransition() {
|
12884 | return this._transitioningPaint.hasTransition();
|
12885 | }
|
12886 | recalculate(parameters, availableImages) {
|
12887 | if (parameters.getCrossfadeParameters) {
|
12888 | this._crossfadeParameters = parameters.getCrossfadeParameters();
|
12889 | }
|
12890 | if (this._unevaluatedLayout) {
|
12891 | this.layout = this._unevaluatedLayout.possiblyEvaluate(parameters, undefined, availableImages);
|
12892 | }
|
12893 | this.paint = this._transitioningPaint.possiblyEvaluate(parameters, undefined, availableImages);
|
12894 | }
|
12895 | serialize() {
|
12896 | const output = {
|
12897 | 'id': this.id,
|
12898 | 'type': this.type,
|
12899 | 'source': this.source,
|
12900 | 'source-layer': this.sourceLayer,
|
12901 | 'metadata': this.metadata,
|
12902 | 'minzoom': this.minzoom,
|
12903 | 'maxzoom': this.maxzoom,
|
12904 | 'filter': this.filter,
|
12905 | 'layout': this._unevaluatedLayout && this._unevaluatedLayout.serialize(),
|
12906 | 'paint': this._transitionablePaint && this._transitionablePaint.serialize()
|
12907 | };
|
12908 | if (this.visibility) {
|
12909 | output.layout = output.layout || {};
|
12910 | output.layout.visibility = this.visibility;
|
12911 | }
|
12912 | return filterObject(output, (value, key) => {
|
12913 | return value !== undefined &&
|
12914 | !(key === 'layout' && !Object.keys(value).length) &&
|
12915 | !(key === 'paint' && !Object.keys(value).length);
|
12916 | });
|
12917 | }
|
12918 | _validate(validate, key, name, value, options = {}) {
|
12919 | if (options && options.validate === false) {
|
12920 | return false;
|
12921 | }
|
12922 | return emitValidationErrors(this, validate.call(validateStyle, {
|
12923 | key,
|
12924 | layerType: this.type,
|
12925 | objectKey: name,
|
12926 | value,
|
12927 | styleSpec: spec,
|
12928 | // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407
|
12929 | style: { glyphs: true, sprite: true }
|
12930 | }));
|
12931 | }
|
12932 | is3D() {
|
12933 | return false;
|
12934 | }
|
12935 | isTileClipped() {
|
12936 | return false;
|
12937 | }
|
12938 | hasOffscreenPass() {
|
12939 | return false;
|
12940 | }
|
12941 | resize() {
|
12942 | // noop
|
12943 | }
|
12944 | isStateDependent() {
|
12945 | for (const property in this.paint._values) {
|
12946 | const value = this.paint.get(property);
|
12947 | if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) {
|
12948 | continue;
|
12949 | }
|
12950 | if ((value.value.kind === 'source' || value.value.kind === 'composite') &&
|
12951 | value.value.isStateDependent) {
|
12952 | return true;
|
12953 | }
|
12954 | }
|
12955 | return false;
|
12956 | }
|
12957 | }
|
12958 |
|
12959 | // Note: all "sizes" are measured in bytes
|
12960 | const viewTypes = {
|
12961 | 'Int8': Int8Array,
|
12962 | 'Uint8': Uint8Array,
|
12963 | 'Int16': Int16Array,
|
12964 | 'Uint16': Uint16Array,
|
12965 | 'Int32': Int32Array,
|
12966 | 'Uint32': Uint32Array,
|
12967 | 'Float32': Float32Array
|
12968 | };
|
12969 | /**
|
12970 | * @private
|
12971 | */
|
12972 | class Struct {
|
12973 | /**
|
12974 | * @param {StructArray} structArray The StructArray the struct is stored in
|
12975 | * @param {number} index The index of the struct in the StructArray.
|
12976 | * @private
|
12977 | */
|
12978 | constructor(structArray, index) {
|
12979 | this._structArray = structArray;
|
12980 | this._pos1 = index * this.size;
|
12981 | this._pos2 = this._pos1 / 2;
|
12982 | this._pos4 = this._pos1 / 4;
|
12983 | this._pos8 = this._pos1 / 8;
|
12984 | }
|
12985 | }
|
12986 | const DEFAULT_CAPACITY = 128;
|
12987 | const RESIZE_MULTIPLIER = 5;
|
12988 | /**
|
12989 | * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray`
|
12990 | * making it behave like an array of typed structs.
|
12991 | *
|
12992 | * Conceptually, a StructArray is comprised of elements, i.e., instances of its
|
12993 | * associated struct type. Each particular struct type, together with an
|
12994 | * alignment size, determines the memory layout of a StructArray whose elements
|
12995 | * are of that type. Thus, for each such layout that we need, we have
|
12996 | * a corrseponding StructArrayLayout class, inheriting from StructArray and
|
12997 | * implementing `emplaceBack()` and `_refreshViews()`.
|
12998 | *
|
12999 | * In some cases, where we need to access particular elements of a StructArray,
|
13000 | * we implement a more specific subclass that inherits from one of the
|
13001 | * StructArrayLayouts and adds a `get(i): T` accessor that returns a structured
|
13002 | * object whose properties are proxies into the underlying memory space for the
|
13003 | * i-th element. This affords the convience of working with (seemingly) plain
|
13004 | * Javascript objects without the overhead of serializing/deserializing them
|
13005 | * into ArrayBuffers for efficient web worker transfer.
|
13006 | *
|
13007 | * @private
|
13008 | */
|
13009 | class StructArray {
|
13010 | constructor() {
|
13011 | this.isTransferred = false;
|
13012 | this.capacity = -1;
|
13013 | this.resize(0);
|
13014 | }
|
13015 | /**
|
13016 | * Serialize a StructArray instance. Serializes both the raw data and the
|
13017 | * metadata needed to reconstruct the StructArray base class during
|
13018 | * deserialization.
|
13019 | * @private
|
13020 | */
|
13021 | static serialize(array, transferables) {
|
13022 | assert$1(!array.isTransferred);
|
13023 | array._trim();
|
13024 | if (transferables) {
|
13025 | array.isTransferred = true;
|
13026 | transferables.push(array.arrayBuffer);
|
13027 | }
|
13028 | return {
|
13029 | length: array.length,
|
13030 | arrayBuffer: array.arrayBuffer,
|
13031 | };
|
13032 | }
|
13033 | static deserialize(input) {
|
13034 | const structArray = Object.create(this.prototype);
|
13035 | structArray.arrayBuffer = input.arrayBuffer;
|
13036 | structArray.length = input.length;
|
13037 | structArray.capacity = input.arrayBuffer.byteLength / structArray.bytesPerElement;
|
13038 | structArray._refreshViews();
|
13039 | return structArray;
|
13040 | }
|
13041 | /**
|
13042 | * Resize the array to discard unused capacity.
|
13043 | */
|
13044 | _trim() {
|
13045 | if (this.length !== this.capacity) {
|
13046 | this.capacity = this.length;
|
13047 | this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement);
|
13048 | this._refreshViews();
|
13049 | }
|
13050 | }
|
13051 | /**
|
13052 | * Resets the the length of the array to 0 without de-allocating capcacity.
|
13053 | */
|
13054 | clear() {
|
13055 | this.length = 0;
|
13056 | }
|
13057 | /**
|
13058 | * Resize the array.
|
13059 | * If `n` is greater than the current length then additional elements with undefined values are added.
|
13060 | * If `n` is less than the current length then the array will be reduced to the first `n` elements.
|
13061 | * @param {number} n The new size of the array.
|
13062 | */
|
13063 | resize(n) {
|
13064 | assert$1(!this.isTransferred);
|
13065 | this.reserve(n);
|
13066 | this.length = n;
|
13067 | }
|
13068 | /**
|
13069 | * Indicate a planned increase in size, so that any necessary allocation may
|
13070 | * be done once, ahead of time.
|
13071 | * @param {number} n The expected size of the array.
|
13072 | */
|
13073 | reserve(n) {
|
13074 | if (n > this.capacity) {
|
13075 | this.capacity = Math.max(n, Math.floor(this.capacity * RESIZE_MULTIPLIER), DEFAULT_CAPACITY);
|
13076 | this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement);
|
13077 | const oldUint8Array = this.uint8;
|
13078 | this._refreshViews();
|
13079 | if (oldUint8Array)
|
13080 | this.uint8.set(oldUint8Array);
|
13081 | }
|
13082 | }
|
13083 | /**
|
13084 | * Create TypedArray views for the current ArrayBuffer.
|
13085 | */
|
13086 | _refreshViews() {
|
13087 | throw new Error('_refreshViews() must be implemented by each concrete StructArray layout');
|
13088 | }
|
13089 | }
|
13090 | /**
|
13091 | * Given a list of member fields, create a full StructArrayLayout, in
|
13092 | * particular calculating the correct byte offset for each field. This data
|
13093 | * is used at build time to generate StructArrayLayout_*#emplaceBack() and
|
13094 | * other accessors, and at runtime for binding vertex buffer attributes.
|
13095 | *
|
13096 | * @private
|
13097 | */
|
13098 | function createLayout(members, alignment = 1) {
|
13099 | let offset = 0;
|
13100 | let maxSize = 0;
|
13101 | const layoutMembers = members.map((member) => {
|
13102 | assert$1(member.name.length);
|
13103 | const typeSize = sizeOf(member.type);
|
13104 | const memberOffset = offset = align$1(offset, Math.max(alignment, typeSize));
|
13105 | const components = member.components || 1;
|
13106 | maxSize = Math.max(maxSize, typeSize);
|
13107 | offset += typeSize * components;
|
13108 | return {
|
13109 | name: member.name,
|
13110 | type: member.type,
|
13111 | components,
|
13112 | offset: memberOffset,
|
13113 | };
|
13114 | });
|
13115 | const size = align$1(offset, Math.max(maxSize, alignment));
|
13116 | return {
|
13117 | members: layoutMembers,
|
13118 | size,
|
13119 | alignment
|
13120 | };
|
13121 | }
|
13122 | function sizeOf(type) {
|
13123 | return viewTypes[type].BYTES_PER_ELEMENT;
|
13124 | }
|
13125 | function align$1(offset, size) {
|
13126 | return Math.ceil(offset / size) * size;
|
13127 | }
|
13128 |
|
13129 | // This file is generated. Edit build/generate-struct-arrays.ts, then run `npm run codegen`.
|
13130 | /**
|
13131 | * Implementation of the StructArray layout:
|
13132 | * [0]: Int16[2]
|
13133 | *
|
13134 | * @private
|
13135 | */
|
13136 | class StructArrayLayout2i4 extends StructArray {
|
13137 | _refreshViews() {
|
13138 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13139 | this.int16 = new Int16Array(this.arrayBuffer);
|
13140 | }
|
13141 | emplaceBack(v0, v1) {
|
13142 | const i = this.length;
|
13143 | this.resize(i + 1);
|
13144 | return this.emplace(i, v0, v1);
|
13145 | }
|
13146 | emplace(i, v0, v1) {
|
13147 | const o2 = i * 2;
|
13148 | this.int16[o2 + 0] = v0;
|
13149 | this.int16[o2 + 1] = v1;
|
13150 | return i;
|
13151 | }
|
13152 | }
|
13153 | StructArrayLayout2i4.prototype.bytesPerElement = 4;
|
13154 | register('StructArrayLayout2i4', StructArrayLayout2i4);
|
13155 | /**
|
13156 | * Implementation of the StructArray layout:
|
13157 | * [0]: Int16[4]
|
13158 | *
|
13159 | * @private
|
13160 | */
|
13161 | class StructArrayLayout4i8 extends StructArray {
|
13162 | _refreshViews() {
|
13163 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13164 | this.int16 = new Int16Array(this.arrayBuffer);
|
13165 | }
|
13166 | emplaceBack(v0, v1, v2, v3) {
|
13167 | const i = this.length;
|
13168 | this.resize(i + 1);
|
13169 | return this.emplace(i, v0, v1, v2, v3);
|
13170 | }
|
13171 | emplace(i, v0, v1, v2, v3) {
|
13172 | const o2 = i * 4;
|
13173 | this.int16[o2 + 0] = v0;
|
13174 | this.int16[o2 + 1] = v1;
|
13175 | this.int16[o2 + 2] = v2;
|
13176 | this.int16[o2 + 3] = v3;
|
13177 | return i;
|
13178 | }
|
13179 | }
|
13180 | StructArrayLayout4i8.prototype.bytesPerElement = 8;
|
13181 | register('StructArrayLayout4i8', StructArrayLayout4i8);
|
13182 | /**
|
13183 | * Implementation of the StructArray layout:
|
13184 | * [0]: Int16[2]
|
13185 | * [4]: Int16[4]
|
13186 | *
|
13187 | * @private
|
13188 | */
|
13189 | class StructArrayLayout2i4i12 extends StructArray {
|
13190 | _refreshViews() {
|
13191 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13192 | this.int16 = new Int16Array(this.arrayBuffer);
|
13193 | }
|
13194 | emplaceBack(v0, v1, v2, v3, v4, v5) {
|
13195 | const i = this.length;
|
13196 | this.resize(i + 1);
|
13197 | return this.emplace(i, v0, v1, v2, v3, v4, v5);
|
13198 | }
|
13199 | emplace(i, v0, v1, v2, v3, v4, v5) {
|
13200 | const o2 = i * 6;
|
13201 | this.int16[o2 + 0] = v0;
|
13202 | this.int16[o2 + 1] = v1;
|
13203 | this.int16[o2 + 2] = v2;
|
13204 | this.int16[o2 + 3] = v3;
|
13205 | this.int16[o2 + 4] = v4;
|
13206 | this.int16[o2 + 5] = v5;
|
13207 | return i;
|
13208 | }
|
13209 | }
|
13210 | StructArrayLayout2i4i12.prototype.bytesPerElement = 12;
|
13211 | register('StructArrayLayout2i4i12', StructArrayLayout2i4i12);
|
13212 | /**
|
13213 | * Implementation of the StructArray layout:
|
13214 | * [0]: Int16[2]
|
13215 | * [4]: Uint8[4]
|
13216 | *
|
13217 | * @private
|
13218 | */
|
13219 | class StructArrayLayout2i4ub8 extends StructArray {
|
13220 | _refreshViews() {
|
13221 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13222 | this.int16 = new Int16Array(this.arrayBuffer);
|
13223 | }
|
13224 | emplaceBack(v0, v1, v2, v3, v4, v5) {
|
13225 | const i = this.length;
|
13226 | this.resize(i + 1);
|
13227 | return this.emplace(i, v0, v1, v2, v3, v4, v5);
|
13228 | }
|
13229 | emplace(i, v0, v1, v2, v3, v4, v5) {
|
13230 | const o2 = i * 4;
|
13231 | const o1 = i * 8;
|
13232 | this.int16[o2 + 0] = v0;
|
13233 | this.int16[o2 + 1] = v1;
|
13234 | this.uint8[o1 + 4] = v2;
|
13235 | this.uint8[o1 + 5] = v3;
|
13236 | this.uint8[o1 + 6] = v4;
|
13237 | this.uint8[o1 + 7] = v5;
|
13238 | return i;
|
13239 | }
|
13240 | }
|
13241 | StructArrayLayout2i4ub8.prototype.bytesPerElement = 8;
|
13242 | register('StructArrayLayout2i4ub8', StructArrayLayout2i4ub8);
|
13243 | /**
|
13244 | * Implementation of the StructArray layout:
|
13245 | * [0]: Float32[2]
|
13246 | *
|
13247 | * @private
|
13248 | */
|
13249 | class StructArrayLayout2f8 extends StructArray {
|
13250 | _refreshViews() {
|
13251 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13252 | this.float32 = new Float32Array(this.arrayBuffer);
|
13253 | }
|
13254 | emplaceBack(v0, v1) {
|
13255 | const i = this.length;
|
13256 | this.resize(i + 1);
|
13257 | return this.emplace(i, v0, v1);
|
13258 | }
|
13259 | emplace(i, v0, v1) {
|
13260 | const o4 = i * 2;
|
13261 | this.float32[o4 + 0] = v0;
|
13262 | this.float32[o4 + 1] = v1;
|
13263 | return i;
|
13264 | }
|
13265 | }
|
13266 | StructArrayLayout2f8.prototype.bytesPerElement = 8;
|
13267 | register('StructArrayLayout2f8', StructArrayLayout2f8);
|
13268 | /**
|
13269 | * Implementation of the StructArray layout:
|
13270 | * [0]: Uint16[10]
|
13271 | *
|
13272 | * @private
|
13273 | */
|
13274 | class StructArrayLayout10ui20 extends StructArray {
|
13275 | _refreshViews() {
|
13276 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13277 | this.uint16 = new Uint16Array(this.arrayBuffer);
|
13278 | }
|
13279 | emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
|
13280 | const i = this.length;
|
13281 | this.resize(i + 1);
|
13282 | return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9);
|
13283 | }
|
13284 | emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
|
13285 | const o2 = i * 10;
|
13286 | this.uint16[o2 + 0] = v0;
|
13287 | this.uint16[o2 + 1] = v1;
|
13288 | this.uint16[o2 + 2] = v2;
|
13289 | this.uint16[o2 + 3] = v3;
|
13290 | this.uint16[o2 + 4] = v4;
|
13291 | this.uint16[o2 + 5] = v5;
|
13292 | this.uint16[o2 + 6] = v6;
|
13293 | this.uint16[o2 + 7] = v7;
|
13294 | this.uint16[o2 + 8] = v8;
|
13295 | this.uint16[o2 + 9] = v9;
|
13296 | return i;
|
13297 | }
|
13298 | }
|
13299 | StructArrayLayout10ui20.prototype.bytesPerElement = 20;
|
13300 | register('StructArrayLayout10ui20', StructArrayLayout10ui20);
|
13301 | /**
|
13302 | * Implementation of the StructArray layout:
|
13303 | * [0]: Int16[4]
|
13304 | * [8]: Uint16[4]
|
13305 | * [16]: Int16[4]
|
13306 | *
|
13307 | * @private
|
13308 | */
|
13309 | class StructArrayLayout4i4ui4i24 extends StructArray {
|
13310 | _refreshViews() {
|
13311 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13312 | this.int16 = new Int16Array(this.arrayBuffer);
|
13313 | this.uint16 = new Uint16Array(this.arrayBuffer);
|
13314 | }
|
13315 | emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) {
|
13316 | const i = this.length;
|
13317 | this.resize(i + 1);
|
13318 | return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
|
13319 | }
|
13320 | emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) {
|
13321 | const o2 = i * 12;
|
13322 | this.int16[o2 + 0] = v0;
|
13323 | this.int16[o2 + 1] = v1;
|
13324 | this.int16[o2 + 2] = v2;
|
13325 | this.int16[o2 + 3] = v3;
|
13326 | this.uint16[o2 + 4] = v4;
|
13327 | this.uint16[o2 + 5] = v5;
|
13328 | this.uint16[o2 + 6] = v6;
|
13329 | this.uint16[o2 + 7] = v7;
|
13330 | this.int16[o2 + 8] = v8;
|
13331 | this.int16[o2 + 9] = v9;
|
13332 | this.int16[o2 + 10] = v10;
|
13333 | this.int16[o2 + 11] = v11;
|
13334 | return i;
|
13335 | }
|
13336 | }
|
13337 | StructArrayLayout4i4ui4i24.prototype.bytesPerElement = 24;
|
13338 | register('StructArrayLayout4i4ui4i24', StructArrayLayout4i4ui4i24);
|
13339 | /**
|
13340 | * Implementation of the StructArray layout:
|
13341 | * [0]: Float32[3]
|
13342 | *
|
13343 | * @private
|
13344 | */
|
13345 | class StructArrayLayout3f12 extends StructArray {
|
13346 | _refreshViews() {
|
13347 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13348 | this.float32 = new Float32Array(this.arrayBuffer);
|
13349 | }
|
13350 | emplaceBack(v0, v1, v2) {
|
13351 | const i = this.length;
|
13352 | this.resize(i + 1);
|
13353 | return this.emplace(i, v0, v1, v2);
|
13354 | }
|
13355 | emplace(i, v0, v1, v2) {
|
13356 | const o4 = i * 3;
|
13357 | this.float32[o4 + 0] = v0;
|
13358 | this.float32[o4 + 1] = v1;
|
13359 | this.float32[o4 + 2] = v2;
|
13360 | return i;
|
13361 | }
|
13362 | }
|
13363 | StructArrayLayout3f12.prototype.bytesPerElement = 12;
|
13364 | register('StructArrayLayout3f12', StructArrayLayout3f12);
|
13365 | /**
|
13366 | * Implementation of the StructArray layout:
|
13367 | * [0]: Uint32[1]
|
13368 | *
|
13369 | * @private
|
13370 | */
|
13371 | class StructArrayLayout1ul4 extends StructArray {
|
13372 | _refreshViews() {
|
13373 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13374 | this.uint32 = new Uint32Array(this.arrayBuffer);
|
13375 | }
|
13376 | emplaceBack(v0) {
|
13377 | const i = this.length;
|
13378 | this.resize(i + 1);
|
13379 | return this.emplace(i, v0);
|
13380 | }
|
13381 | emplace(i, v0) {
|
13382 | const o4 = i * 1;
|
13383 | this.uint32[o4 + 0] = v0;
|
13384 | return i;
|
13385 | }
|
13386 | }
|
13387 | StructArrayLayout1ul4.prototype.bytesPerElement = 4;
|
13388 | register('StructArrayLayout1ul4', StructArrayLayout1ul4);
|
13389 | /**
|
13390 | * Implementation of the StructArray layout:
|
13391 | * [0]: Int16[6]
|
13392 | * [12]: Uint32[1]
|
13393 | * [16]: Uint16[2]
|
13394 | *
|
13395 | * @private
|
13396 | */
|
13397 | class StructArrayLayout6i1ul2ui20 extends StructArray {
|
13398 | _refreshViews() {
|
13399 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13400 | this.int16 = new Int16Array(this.arrayBuffer);
|
13401 | this.uint32 = new Uint32Array(this.arrayBuffer);
|
13402 | this.uint16 = new Uint16Array(this.arrayBuffer);
|
13403 | }
|
13404 | emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8) {
|
13405 | const i = this.length;
|
13406 | this.resize(i + 1);
|
13407 | return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8);
|
13408 | }
|
13409 | emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8) {
|
13410 | const o2 = i * 10;
|
13411 | const o4 = i * 5;
|
13412 | this.int16[o2 + 0] = v0;
|
13413 | this.int16[o2 + 1] = v1;
|
13414 | this.int16[o2 + 2] = v2;
|
13415 | this.int16[o2 + 3] = v3;
|
13416 | this.int16[o2 + 4] = v4;
|
13417 | this.int16[o2 + 5] = v5;
|
13418 | this.uint32[o4 + 3] = v6;
|
13419 | this.uint16[o2 + 8] = v7;
|
13420 | this.uint16[o2 + 9] = v8;
|
13421 | return i;
|
13422 | }
|
13423 | }
|
13424 | StructArrayLayout6i1ul2ui20.prototype.bytesPerElement = 20;
|
13425 | register('StructArrayLayout6i1ul2ui20', StructArrayLayout6i1ul2ui20);
|
13426 | /**
|
13427 | * Implementation of the StructArray layout:
|
13428 | * [0]: Int16[2]
|
13429 | * [4]: Int16[2]
|
13430 | * [8]: Int16[2]
|
13431 | *
|
13432 | * @private
|
13433 | */
|
13434 | class StructArrayLayout2i2i2i12 extends StructArray {
|
13435 | _refreshViews() {
|
13436 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13437 | this.int16 = new Int16Array(this.arrayBuffer);
|
13438 | }
|
13439 | emplaceBack(v0, v1, v2, v3, v4, v5) {
|
13440 | const i = this.length;
|
13441 | this.resize(i + 1);
|
13442 | return this.emplace(i, v0, v1, v2, v3, v4, v5);
|
13443 | }
|
13444 | emplace(i, v0, v1, v2, v3, v4, v5) {
|
13445 | const o2 = i * 6;
|
13446 | this.int16[o2 + 0] = v0;
|
13447 | this.int16[o2 + 1] = v1;
|
13448 | this.int16[o2 + 2] = v2;
|
13449 | this.int16[o2 + 3] = v3;
|
13450 | this.int16[o2 + 4] = v4;
|
13451 | this.int16[o2 + 5] = v5;
|
13452 | return i;
|
13453 | }
|
13454 | }
|
13455 | StructArrayLayout2i2i2i12.prototype.bytesPerElement = 12;
|
13456 | register('StructArrayLayout2i2i2i12', StructArrayLayout2i2i2i12);
|
13457 | /**
|
13458 | * Implementation of the StructArray layout:
|
13459 | * [0]: Float32[2]
|
13460 | * [8]: Float32[1]
|
13461 | * [12]: Int16[2]
|
13462 | *
|
13463 | * @private
|
13464 | */
|
13465 | class StructArrayLayout2f1f2i16 extends StructArray {
|
13466 | _refreshViews() {
|
13467 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13468 | this.float32 = new Float32Array(this.arrayBuffer);
|
13469 | this.int16 = new Int16Array(this.arrayBuffer);
|
13470 | }
|
13471 | emplaceBack(v0, v1, v2, v3, v4) {
|
13472 | const i = this.length;
|
13473 | this.resize(i + 1);
|
13474 | return this.emplace(i, v0, v1, v2, v3, v4);
|
13475 | }
|
13476 | emplace(i, v0, v1, v2, v3, v4) {
|
13477 | const o4 = i * 4;
|
13478 | const o2 = i * 8;
|
13479 | this.float32[o4 + 0] = v0;
|
13480 | this.float32[o4 + 1] = v1;
|
13481 | this.float32[o4 + 2] = v2;
|
13482 | this.int16[o2 + 6] = v3;
|
13483 | this.int16[o2 + 7] = v4;
|
13484 | return i;
|
13485 | }
|
13486 | }
|
13487 | StructArrayLayout2f1f2i16.prototype.bytesPerElement = 16;
|
13488 | register('StructArrayLayout2f1f2i16', StructArrayLayout2f1f2i16);
|
13489 | /**
|
13490 | * Implementation of the StructArray layout:
|
13491 | * [0]: Uint8[2]
|
13492 | * [4]: Float32[2]
|
13493 | *
|
13494 | * @private
|
13495 | */
|
13496 | class StructArrayLayout2ub2f12 extends StructArray {
|
13497 | _refreshViews() {
|
13498 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13499 | this.float32 = new Float32Array(this.arrayBuffer);
|
13500 | }
|
13501 | emplaceBack(v0, v1, v2, v3) {
|
13502 | const i = this.length;
|
13503 | this.resize(i + 1);
|
13504 | return this.emplace(i, v0, v1, v2, v3);
|
13505 | }
|
13506 | emplace(i, v0, v1, v2, v3) {
|
13507 | const o1 = i * 12;
|
13508 | const o4 = i * 3;
|
13509 | this.uint8[o1 + 0] = v0;
|
13510 | this.uint8[o1 + 1] = v1;
|
13511 | this.float32[o4 + 1] = v2;
|
13512 | this.float32[o4 + 2] = v3;
|
13513 | return i;
|
13514 | }
|
13515 | }
|
13516 | StructArrayLayout2ub2f12.prototype.bytesPerElement = 12;
|
13517 | register('StructArrayLayout2ub2f12', StructArrayLayout2ub2f12);
|
13518 | /**
|
13519 | * Implementation of the StructArray layout:
|
13520 | * [0]: Uint16[3]
|
13521 | *
|
13522 | * @private
|
13523 | */
|
13524 | class StructArrayLayout3ui6 extends StructArray {
|
13525 | _refreshViews() {
|
13526 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13527 | this.uint16 = new Uint16Array(this.arrayBuffer);
|
13528 | }
|
13529 | emplaceBack(v0, v1, v2) {
|
13530 | const i = this.length;
|
13531 | this.resize(i + 1);
|
13532 | return this.emplace(i, v0, v1, v2);
|
13533 | }
|
13534 | emplace(i, v0, v1, v2) {
|
13535 | const o2 = i * 3;
|
13536 | this.uint16[o2 + 0] = v0;
|
13537 | this.uint16[o2 + 1] = v1;
|
13538 | this.uint16[o2 + 2] = v2;
|
13539 | return i;
|
13540 | }
|
13541 | }
|
13542 | StructArrayLayout3ui6.prototype.bytesPerElement = 6;
|
13543 | register('StructArrayLayout3ui6', StructArrayLayout3ui6);
|
13544 | /**
|
13545 | * Implementation of the StructArray layout:
|
13546 | * [0]: Int16[2]
|
13547 | * [4]: Uint16[2]
|
13548 | * [8]: Uint32[3]
|
13549 | * [20]: Uint16[3]
|
13550 | * [28]: Float32[2]
|
13551 | * [36]: Uint8[3]
|
13552 | * [40]: Uint32[1]
|
13553 | * [44]: Int16[1]
|
13554 | *
|
13555 | * @private
|
13556 | */
|
13557 | class StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48 extends StructArray {
|
13558 | _refreshViews() {
|
13559 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13560 | this.int16 = new Int16Array(this.arrayBuffer);
|
13561 | this.uint16 = new Uint16Array(this.arrayBuffer);
|
13562 | this.uint32 = new Uint32Array(this.arrayBuffer);
|
13563 | this.float32 = new Float32Array(this.arrayBuffer);
|
13564 | }
|
13565 | emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) {
|
13566 | const i = this.length;
|
13567 | this.resize(i + 1);
|
13568 | return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16);
|
13569 | }
|
13570 | emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) {
|
13571 | const o2 = i * 24;
|
13572 | const o4 = i * 12;
|
13573 | const o1 = i * 48;
|
13574 | this.int16[o2 + 0] = v0;
|
13575 | this.int16[o2 + 1] = v1;
|
13576 | this.uint16[o2 + 2] = v2;
|
13577 | this.uint16[o2 + 3] = v3;
|
13578 | this.uint32[o4 + 2] = v4;
|
13579 | this.uint32[o4 + 3] = v5;
|
13580 | this.uint32[o4 + 4] = v6;
|
13581 | this.uint16[o2 + 10] = v7;
|
13582 | this.uint16[o2 + 11] = v8;
|
13583 | this.uint16[o2 + 12] = v9;
|
13584 | this.float32[o4 + 7] = v10;
|
13585 | this.float32[o4 + 8] = v11;
|
13586 | this.uint8[o1 + 36] = v12;
|
13587 | this.uint8[o1 + 37] = v13;
|
13588 | this.uint8[o1 + 38] = v14;
|
13589 | this.uint32[o4 + 10] = v15;
|
13590 | this.int16[o2 + 22] = v16;
|
13591 | return i;
|
13592 | }
|
13593 | }
|
13594 | StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48.prototype.bytesPerElement = 48;
|
13595 | register('StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48', StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48);
|
13596 | /**
|
13597 | * Implementation of the StructArray layout:
|
13598 | * [0]: Int16[8]
|
13599 | * [16]: Uint16[15]
|
13600 | * [48]: Uint32[1]
|
13601 | * [52]: Float32[4]
|
13602 | *
|
13603 | * @private
|
13604 | */
|
13605 | class StructArrayLayout8i15ui1ul4f68 extends StructArray {
|
13606 | _refreshViews() {
|
13607 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13608 | this.int16 = new Int16Array(this.arrayBuffer);
|
13609 | this.uint16 = new Uint16Array(this.arrayBuffer);
|
13610 | this.uint32 = new Uint32Array(this.arrayBuffer);
|
13611 | this.float32 = new Float32Array(this.arrayBuffer);
|
13612 | }
|
13613 | emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) {
|
13614 | const i = this.length;
|
13615 | this.resize(i + 1);
|
13616 | return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
|
13617 | }
|
13618 | emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) {
|
13619 | const o2 = i * 34;
|
13620 | const o4 = i * 17;
|
13621 | this.int16[o2 + 0] = v0;
|
13622 | this.int16[o2 + 1] = v1;
|
13623 | this.int16[o2 + 2] = v2;
|
13624 | this.int16[o2 + 3] = v3;
|
13625 | this.int16[o2 + 4] = v4;
|
13626 | this.int16[o2 + 5] = v5;
|
13627 | this.int16[o2 + 6] = v6;
|
13628 | this.int16[o2 + 7] = v7;
|
13629 | this.uint16[o2 + 8] = v8;
|
13630 | this.uint16[o2 + 9] = v9;
|
13631 | this.uint16[o2 + 10] = v10;
|
13632 | this.uint16[o2 + 11] = v11;
|
13633 | this.uint16[o2 + 12] = v12;
|
13634 | this.uint16[o2 + 13] = v13;
|
13635 | this.uint16[o2 + 14] = v14;
|
13636 | this.uint16[o2 + 15] = v15;
|
13637 | this.uint16[o2 + 16] = v16;
|
13638 | this.uint16[o2 + 17] = v17;
|
13639 | this.uint16[o2 + 18] = v18;
|
13640 | this.uint16[o2 + 19] = v19;
|
13641 | this.uint16[o2 + 20] = v20;
|
13642 | this.uint16[o2 + 21] = v21;
|
13643 | this.uint16[o2 + 22] = v22;
|
13644 | this.uint32[o4 + 12] = v23;
|
13645 | this.float32[o4 + 13] = v24;
|
13646 | this.float32[o4 + 14] = v25;
|
13647 | this.float32[o4 + 15] = v26;
|
13648 | this.float32[o4 + 16] = v27;
|
13649 | return i;
|
13650 | }
|
13651 | }
|
13652 | StructArrayLayout8i15ui1ul4f68.prototype.bytesPerElement = 68;
|
13653 | register('StructArrayLayout8i15ui1ul4f68', StructArrayLayout8i15ui1ul4f68);
|
13654 | /**
|
13655 | * Implementation of the StructArray layout:
|
13656 | * [0]: Float32[1]
|
13657 | *
|
13658 | * @private
|
13659 | */
|
13660 | class StructArrayLayout1f4 extends StructArray {
|
13661 | _refreshViews() {
|
13662 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13663 | this.float32 = new Float32Array(this.arrayBuffer);
|
13664 | }
|
13665 | emplaceBack(v0) {
|
13666 | const i = this.length;
|
13667 | this.resize(i + 1);
|
13668 | return this.emplace(i, v0);
|
13669 | }
|
13670 | emplace(i, v0) {
|
13671 | const o4 = i * 1;
|
13672 | this.float32[o4 + 0] = v0;
|
13673 | return i;
|
13674 | }
|
13675 | }
|
13676 | StructArrayLayout1f4.prototype.bytesPerElement = 4;
|
13677 | register('StructArrayLayout1f4', StructArrayLayout1f4);
|
13678 | /**
|
13679 | * Implementation of the StructArray layout:
|
13680 | * [0]: Int16[3]
|
13681 | *
|
13682 | * @private
|
13683 | */
|
13684 | class StructArrayLayout3i6 extends StructArray {
|
13685 | _refreshViews() {
|
13686 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13687 | this.int16 = new Int16Array(this.arrayBuffer);
|
13688 | }
|
13689 | emplaceBack(v0, v1, v2) {
|
13690 | const i = this.length;
|
13691 | this.resize(i + 1);
|
13692 | return this.emplace(i, v0, v1, v2);
|
13693 | }
|
13694 | emplace(i, v0, v1, v2) {
|
13695 | const o2 = i * 3;
|
13696 | this.int16[o2 + 0] = v0;
|
13697 | this.int16[o2 + 1] = v1;
|
13698 | this.int16[o2 + 2] = v2;
|
13699 | return i;
|
13700 | }
|
13701 | }
|
13702 | StructArrayLayout3i6.prototype.bytesPerElement = 6;
|
13703 | register('StructArrayLayout3i6', StructArrayLayout3i6);
|
13704 | /**
|
13705 | * Implementation of the StructArray layout:
|
13706 | * [0]: Uint32[1]
|
13707 | * [4]: Uint16[2]
|
13708 | *
|
13709 | * @private
|
13710 | */
|
13711 | class StructArrayLayout1ul2ui8 extends StructArray {
|
13712 | _refreshViews() {
|
13713 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13714 | this.uint32 = new Uint32Array(this.arrayBuffer);
|
13715 | this.uint16 = new Uint16Array(this.arrayBuffer);
|
13716 | }
|
13717 | emplaceBack(v0, v1, v2) {
|
13718 | const i = this.length;
|
13719 | this.resize(i + 1);
|
13720 | return this.emplace(i, v0, v1, v2);
|
13721 | }
|
13722 | emplace(i, v0, v1, v2) {
|
13723 | const o4 = i * 2;
|
13724 | const o2 = i * 4;
|
13725 | this.uint32[o4 + 0] = v0;
|
13726 | this.uint16[o2 + 2] = v1;
|
13727 | this.uint16[o2 + 3] = v2;
|
13728 | return i;
|
13729 | }
|
13730 | }
|
13731 | StructArrayLayout1ul2ui8.prototype.bytesPerElement = 8;
|
13732 | register('StructArrayLayout1ul2ui8', StructArrayLayout1ul2ui8);
|
13733 | /**
|
13734 | * Implementation of the StructArray layout:
|
13735 | * [0]: Uint16[2]
|
13736 | *
|
13737 | * @private
|
13738 | */
|
13739 | class StructArrayLayout2ui4 extends StructArray {
|
13740 | _refreshViews() {
|
13741 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13742 | this.uint16 = new Uint16Array(this.arrayBuffer);
|
13743 | }
|
13744 | emplaceBack(v0, v1) {
|
13745 | const i = this.length;
|
13746 | this.resize(i + 1);
|
13747 | return this.emplace(i, v0, v1);
|
13748 | }
|
13749 | emplace(i, v0, v1) {
|
13750 | const o2 = i * 2;
|
13751 | this.uint16[o2 + 0] = v0;
|
13752 | this.uint16[o2 + 1] = v1;
|
13753 | return i;
|
13754 | }
|
13755 | }
|
13756 | StructArrayLayout2ui4.prototype.bytesPerElement = 4;
|
13757 | register('StructArrayLayout2ui4', StructArrayLayout2ui4);
|
13758 | /**
|
13759 | * Implementation of the StructArray layout:
|
13760 | * [0]: Uint16[1]
|
13761 | *
|
13762 | * @private
|
13763 | */
|
13764 | class StructArrayLayout1ui2 extends StructArray {
|
13765 | _refreshViews() {
|
13766 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13767 | this.uint16 = new Uint16Array(this.arrayBuffer);
|
13768 | }
|
13769 | emplaceBack(v0) {
|
13770 | const i = this.length;
|
13771 | this.resize(i + 1);
|
13772 | return this.emplace(i, v0);
|
13773 | }
|
13774 | emplace(i, v0) {
|
13775 | const o2 = i * 1;
|
13776 | this.uint16[o2 + 0] = v0;
|
13777 | return i;
|
13778 | }
|
13779 | }
|
13780 | StructArrayLayout1ui2.prototype.bytesPerElement = 2;
|
13781 | register('StructArrayLayout1ui2', StructArrayLayout1ui2);
|
13782 | /**
|
13783 | * Implementation of the StructArray layout:
|
13784 | * [0]: Float32[4]
|
13785 | *
|
13786 | * @private
|
13787 | */
|
13788 | class StructArrayLayout4f16 extends StructArray {
|
13789 | _refreshViews() {
|
13790 | this.uint8 = new Uint8Array(this.arrayBuffer);
|
13791 | this.float32 = new Float32Array(this.arrayBuffer);
|
13792 | }
|
13793 | emplaceBack(v0, v1, v2, v3) {
|
13794 | const i = this.length;
|
13795 | this.resize(i + 1);
|
13796 | return this.emplace(i, v0, v1, v2, v3);
|
13797 | }
|
13798 | emplace(i, v0, v1, v2, v3) {
|
13799 | const o4 = i * 4;
|
13800 | this.float32[o4 + 0] = v0;
|
13801 | this.float32[o4 + 1] = v1;
|
13802 | this.float32[o4 + 2] = v2;
|
13803 | this.float32[o4 + 3] = v3;
|
13804 | return i;
|
13805 | }
|
13806 | }
|
13807 | StructArrayLayout4f16.prototype.bytesPerElement = 16;
|
13808 | register('StructArrayLayout4f16', StructArrayLayout4f16);
|
13809 | class CollisionBoxStruct extends Struct {
|
13810 | get anchorPointX() { return this._structArray.int16[this._pos2 + 0]; }
|
13811 | get anchorPointY() { return this._structArray.int16[this._pos2 + 1]; }
|
13812 | get x1() { return this._structArray.int16[this._pos2 + 2]; }
|
13813 | get y1() { return this._structArray.int16[this._pos2 + 3]; }
|
13814 | get x2() { return this._structArray.int16[this._pos2 + 4]; }
|
13815 | get y2() { return this._structArray.int16[this._pos2 + 5]; }
|
13816 | get featureIndex() { return this._structArray.uint32[this._pos4 + 3]; }
|
13817 | get sourceLayerIndex() { return this._structArray.uint16[this._pos2 + 8]; }
|
13818 | get bucketIndex() { return this._structArray.uint16[this._pos2 + 9]; }
|
13819 | get anchorPoint() { return new pointGeometry(this.anchorPointX, this.anchorPointY); }
|
13820 | }
|
13821 | CollisionBoxStruct.prototype.size = 20;
|
13822 | /**
|
13823 | * @private
|
13824 | */
|
13825 | class CollisionBoxArray extends StructArrayLayout6i1ul2ui20 {
|
13826 | /**
|
13827 | * Return the CollisionBoxStruct at the given location in the array.
|
13828 | * @param {number} index The index of the element.
|
13829 | * @private
|
13830 | */
|
13831 | get(index) {
|
13832 | assert$1(!this.isTransferred);
|
13833 | return new CollisionBoxStruct(this, index);
|
13834 | }
|
13835 | }
|
13836 | register('CollisionBoxArray', CollisionBoxArray);
|
13837 | class PlacedSymbolStruct extends Struct {
|
13838 | get anchorX() { return this._structArray.int16[this._pos2 + 0]; }
|
13839 | get anchorY() { return this._structArray.int16[this._pos2 + 1]; }
|
13840 | get glyphStartIndex() { return this._structArray.uint16[this._pos2 + 2]; }
|
13841 | get numGlyphs() { return this._structArray.uint16[this._pos2 + 3]; }
|
13842 | get vertexStartIndex() { return this._structArray.uint32[this._pos4 + 2]; }
|
13843 | get lineStartIndex() { return this._structArray.uint32[this._pos4 + 3]; }
|
13844 | get lineLength() { return this._structArray.uint32[this._pos4 + 4]; }
|
13845 | get segment() { return this._structArray.uint16[this._pos2 + 10]; }
|
13846 | get lowerSize() { return this._structArray.uint16[this._pos2 + 11]; }
|
13847 | get upperSize() { return this._structArray.uint16[this._pos2 + 12]; }
|
13848 | get lineOffsetX() { return this._structArray.float32[this._pos4 + 7]; }
|
13849 | get lineOffsetY() { return this._structArray.float32[this._pos4 + 8]; }
|
13850 | get writingMode() { return this._structArray.uint8[this._pos1 + 36]; }
|
13851 | get placedOrientation() { return this._structArray.uint8[this._pos1 + 37]; }
|
13852 | set placedOrientation(x) { this._structArray.uint8[this._pos1 + 37] = x; }
|
13853 | get hidden() { return this._structArray.uint8[this._pos1 + 38]; }
|
13854 | set hidden(x) { this._structArray.uint8[this._pos1 + 38] = x; }
|
13855 | get crossTileID() { return this._structArray.uint32[this._pos4 + 10]; }
|
13856 | set crossTileID(x) { this._structArray.uint32[this._pos4 + 10] = x; }
|
13857 | get associatedIconIndex() { return this._structArray.int16[this._pos2 + 22]; }
|
13858 | }
|
13859 | PlacedSymbolStruct.prototype.size = 48;
|
13860 | /**
|
13861 | * @private
|
13862 | */
|
13863 | class PlacedSymbolArray extends StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48 {
|
13864 | /**
|
13865 | * Return the PlacedSymbolStruct at the given location in the array.
|
13866 | * @param {number} index The index of the element.
|
13867 | * @private
|
13868 | */
|
13869 | get(index) {
|
13870 | assert$1(!this.isTransferred);
|
13871 | return new PlacedSymbolStruct(this, index);
|
13872 | }
|
13873 | }
|
13874 | register('PlacedSymbolArray', PlacedSymbolArray);
|
13875 | class SymbolInstanceStruct extends Struct {
|
13876 | get anchorX() { return this._structArray.int16[this._pos2 + 0]; }
|
13877 | get anchorY() { return this._structArray.int16[this._pos2 + 1]; }
|
13878 | get rightJustifiedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 2]; }
|
13879 | get centerJustifiedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 3]; }
|
13880 | get leftJustifiedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 4]; }
|
13881 | get verticalPlacedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 5]; }
|
13882 | get placedIconSymbolIndex() { return this._structArray.int16[this._pos2 + 6]; }
|
13883 | get verticalPlacedIconSymbolIndex() { return this._structArray.int16[this._pos2 + 7]; }
|
13884 | get key() { return this._structArray.uint16[this._pos2 + 8]; }
|
13885 | get textBoxStartIndex() { return this._structArray.uint16[this._pos2 + 9]; }
|
13886 | get textBoxEndIndex() { return this._structArray.uint16[this._pos2 + 10]; }
|
13887 | get verticalTextBoxStartIndex() { return this._structArray.uint16[this._pos2 + 11]; }
|
13888 | get verticalTextBoxEndIndex() { return this._structArray.uint16[this._pos2 + 12]; }
|
13889 | get iconBoxStartIndex() { return this._structArray.uint16[this._pos2 + 13]; }
|
13890 | get iconBoxEndIndex() { return this._structArray.uint16[this._pos2 + 14]; }
|
13891 | get verticalIconBoxStartIndex() { return this._structArray.uint16[this._pos2 + 15]; }
|
13892 | get verticalIconBoxEndIndex() { return this._structArray.uint16[this._pos2 + 16]; }
|
13893 | get featureIndex() { return this._structArray.uint16[this._pos2 + 17]; }
|
13894 | get numHorizontalGlyphVertices() { return this._structArray.uint16[this._pos2 + 18]; }
|
13895 | get numVerticalGlyphVertices() { return this._structArray.uint16[this._pos2 + 19]; }
|
13896 | get numIconVertices() { return this._structArray.uint16[this._pos2 + 20]; }
|
13897 | get numVerticalIconVertices() { return this._structArray.uint16[this._pos2 + 21]; }
|
13898 | get useRuntimeCollisionCircles() { return this._structArray.uint16[this._pos2 + 22]; }
|
13899 | get crossTileID() { return this._structArray.uint32[this._pos4 + 12]; }
|
13900 | set crossTileID(x) { this._structArray.uint32[this._pos4 + 12] = x; }
|
13901 | get textBoxScale() { return this._structArray.float32[this._pos4 + 13]; }
|
13902 | get textOffset0() { return this._structArray.float32[this._pos4 + 14]; }
|
13903 | get textOffset1() { return this._structArray.float32[this._pos4 + 15]; }
|
13904 | get collisionCircleDiameter() { return this._structArray.float32[this._pos4 + 16]; }
|
13905 | }
|
13906 | SymbolInstanceStruct.prototype.size = 68;
|
13907 | /**
|
13908 | * @private
|
13909 | */
|
13910 | class SymbolInstanceArray extends StructArrayLayout8i15ui1ul4f68 {
|
13911 | /**
|
13912 | * Return the SymbolInstanceStruct at the given location in the array.
|
13913 | * @param {number} index The index of the element.
|
13914 | * @private
|
13915 | */
|
13916 | get(index) {
|
13917 | assert$1(!this.isTransferred);
|
13918 | return new SymbolInstanceStruct(this, index);
|
13919 | }
|
13920 | }
|
13921 | register('SymbolInstanceArray', SymbolInstanceArray);
|
13922 | /**
|
13923 | * @private
|
13924 | */
|
13925 | class GlyphOffsetArray extends StructArrayLayout1f4 {
|
13926 | getoffsetX(index) { return this.float32[index * 1 + 0]; }
|
13927 | }
|
13928 | register('GlyphOffsetArray', GlyphOffsetArray);
|
13929 | /**
|
13930 | * @private
|
13931 | */
|
13932 | class SymbolLineVertexArray extends StructArrayLayout3i6 {
|
13933 | getx(index) { return this.int16[index * 3 + 0]; }
|
13934 | gety(index) { return this.int16[index * 3 + 1]; }
|
13935 | gettileUnitDistanceFromAnchor(index) { return this.int16[index * 3 + 2]; }
|
13936 | }
|
13937 | register('SymbolLineVertexArray', SymbolLineVertexArray);
|
13938 | class FeatureIndexStruct extends Struct {
|
13939 | get featureIndex() { return this._structArray.uint32[this._pos4 + 0]; }
|
13940 | get sourceLayerIndex() { return this._structArray.uint16[this._pos2 + 2]; }
|
13941 | get bucketIndex() { return this._structArray.uint16[this._pos2 + 3]; }
|
13942 | }
|
13943 | FeatureIndexStruct.prototype.size = 8;
|
13944 | /**
|
13945 | * @private
|
13946 | */
|
13947 | class FeatureIndexArray extends StructArrayLayout1ul2ui8 {
|
13948 | /**
|
13949 | * Return the FeatureIndexStruct at the given location in the array.
|
13950 | * @param {number} index The index of the element.
|
13951 | * @private
|
13952 | */
|
13953 | get(index) {
|
13954 | assert$1(!this.isTransferred);
|
13955 | return new FeatureIndexStruct(this, index);
|
13956 | }
|
13957 | }
|
13958 | register('FeatureIndexArray', FeatureIndexArray);
|
13959 | class PosArray extends StructArrayLayout2i4 {
|
13960 | }
|
13961 | class RasterBoundsArray extends StructArrayLayout4i8 {
|
13962 | }
|
13963 | class CircleLayoutArray extends StructArrayLayout2i4 {
|
13964 | }
|
13965 | class FillLayoutArray extends StructArrayLayout2i4 {
|
13966 | }
|
13967 | class FillExtrusionLayoutArray extends StructArrayLayout2i4i12 {
|
13968 | }
|
13969 | class HeatmapLayoutArray extends StructArrayLayout2i4 {
|
13970 | }
|
13971 | class LineLayoutArray extends StructArrayLayout2i4ub8 {
|
13972 | }
|
13973 | class LineExtLayoutArray extends StructArrayLayout2f8 {
|
13974 | }
|
13975 | class PatternLayoutArray extends StructArrayLayout10ui20 {
|
13976 | }
|
13977 | class SymbolLayoutArray extends StructArrayLayout4i4ui4i24 {
|
13978 | }
|
13979 | class SymbolDynamicLayoutArray extends StructArrayLayout3f12 {
|
13980 | }
|
13981 | class SymbolOpacityArray extends StructArrayLayout1ul4 {
|
13982 | }
|
13983 | class CollisionBoxLayoutArray extends StructArrayLayout2i2i2i12 {
|
13984 | }
|
13985 | class CollisionCircleLayoutArray extends StructArrayLayout2f1f2i16 {
|
13986 | }
|
13987 | class CollisionVertexArray extends StructArrayLayout2ub2f12 {
|
13988 | }
|
13989 | class QuadTriangleArray extends StructArrayLayout3ui6 {
|
13990 | }
|
13991 | class TriangleIndexArray extends StructArrayLayout3ui6 {
|
13992 | }
|
13993 | class LineIndexArray extends StructArrayLayout2ui4 {
|
13994 | }
|
13995 | class LineStripIndexArray extends StructArrayLayout1ui2 {
|
13996 | }
|
13997 |
|
13998 | const layout$6 = createLayout([
|
13999 | { name: 'a_pos', components: 2, type: 'Int16' }
|
14000 | ], 4);
|
14001 | const { members: members$4, size: size$4, alignment: alignment$4 } = layout$6;
|
14002 |
|
14003 | class SegmentVector {
|
14004 | constructor(segments = []) {
|
14005 | this.segments = segments;
|
14006 | }
|
14007 | prepareSegment(numVertices, layoutVertexArray, indexArray, sortKey) {
|
14008 | let segment = this.segments[this.segments.length - 1];
|
14009 | if (numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH)
|
14010 | warnOnce(`Max vertices per segment is ${SegmentVector.MAX_VERTEX_ARRAY_LENGTH}: bucket requested ${numVertices}`);
|
14011 | if (!segment || segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH || segment.sortKey !== sortKey) {
|
14012 | segment = {
|
14013 | vertexOffset: layoutVertexArray.length,
|
14014 | primitiveOffset: indexArray.length,
|
14015 | vertexLength: 0,
|
14016 | primitiveLength: 0
|
14017 | };
|
14018 | if (sortKey !== undefined)
|
14019 | segment.sortKey = sortKey;
|
14020 | this.segments.push(segment);
|
14021 | }
|
14022 | return segment;
|
14023 | }
|
14024 | get() {
|
14025 | return this.segments;
|
14026 | }
|
14027 | destroy() {
|
14028 | for (const segment of this.segments) {
|
14029 | for (const k in segment.vaos) {
|
14030 | segment.vaos[k].destroy();
|
14031 | }
|
14032 | }
|
14033 | }
|
14034 | static simpleSegment(vertexOffset, primitiveOffset, vertexLength, primitiveLength) {
|
14035 | return new SegmentVector([{
|
14036 | vertexOffset,
|
14037 | primitiveOffset,
|
14038 | vertexLength,
|
14039 | primitiveLength,
|
14040 | vaos: {},
|
14041 | sortKey: 0
|
14042 | }]);
|
14043 | }
|
14044 | }
|
14045 | /*
|
14046 | * The maximum size of a vertex array. This limit is imposed by WebGL's 16 bit
|
14047 | * addressing of vertex buffers.
|
14048 | * @private
|
14049 | * @readonly
|
14050 | */
|
14051 | SegmentVector.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1;
|
14052 | register('SegmentVector', SegmentVector);
|
14053 |
|
14054 | /**
|
14055 | * Packs two numbers, interpreted as 8-bit unsigned integers, into a single
|
14056 | * float. Unpack them in the shader using the `unpack_float()` function,
|
14057 | * defined in _prelude.vertex.glsl
|
14058 | *
|
14059 | * @private
|
14060 | */
|
14061 | function packUint8ToFloat(a, b) {
|
14062 | // coerce a and b to 8-bit ints
|
14063 | a = clamp(Math.floor(a), 0, 255);
|
14064 | b = clamp(Math.floor(b), 0, 255);
|
14065 | return 256 * a + b;
|
14066 | }
|
14067 |
|
14068 | const patternAttributes = createLayout([
|
14069 | // [tl.x, tl.y, br.x, br.y]
|
14070 | { name: 'a_pattern_from', components: 4, type: 'Uint16' },
|
14071 | { name: 'a_pattern_to', components: 4, type: 'Uint16' },
|
14072 | { name: 'a_pixel_ratio_from', components: 1, type: 'Uint16' },
|
14073 | { name: 'a_pixel_ratio_to', components: 1, type: 'Uint16' },
|
14074 | ]);
|
14075 |
|
14076 | var murmurhashJs = {exports: {}};
|
14077 |
|
14078 | var murmurhash3_gc$1 = {exports: {}};
|
14079 |
|
14080 | /**
|
14081 | * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011)
|
14082 | *
|
14083 | * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
|
14084 | * @see http://github.com/garycourt/murmurhash-js
|
14085 | * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a>
|
14086 | * @see http://sites.google.com/site/murmurhash/
|
14087 | *
|
14088 | * @param {string} key ASCII only
|
14089 | * @param {number} seed Positive integer only
|
14090 | * @return {number} 32-bit positive integer hash
|
14091 | */
|
14092 |
|
14093 | (function (module) {
|
14094 | function murmurhash3_32_gc(key, seed) {
|
14095 | var remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i;
|
14096 |
|
14097 | remainder = key.length & 3; // key.length % 4
|
14098 | bytes = key.length - remainder;
|
14099 | h1 = seed;
|
14100 | c1 = 0xcc9e2d51;
|
14101 | c2 = 0x1b873593;
|
14102 | i = 0;
|
14103 |
|
14104 | while (i < bytes) {
|
14105 | k1 =
|
14106 | ((key.charCodeAt(i) & 0xff)) |
|
14107 | ((key.charCodeAt(++i) & 0xff) << 8) |
|
14108 | ((key.charCodeAt(++i) & 0xff) << 16) |
|
14109 | ((key.charCodeAt(++i) & 0xff) << 24);
|
14110 | ++i;
|
14111 |
|
14112 | k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;
|
14113 | k1 = (k1 << 15) | (k1 >>> 17);
|
14114 | k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;
|
14115 |
|
14116 | h1 ^= k1;
|
14117 | h1 = (h1 << 13) | (h1 >>> 19);
|
14118 | h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;
|
14119 | h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));
|
14120 | }
|
14121 |
|
14122 | k1 = 0;
|
14123 |
|
14124 | switch (remainder) {
|
14125 | case 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;
|
14126 | case 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;
|
14127 | case 1: k1 ^= (key.charCodeAt(i) & 0xff);
|
14128 |
|
14129 | k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;
|
14130 | k1 = (k1 << 15) | (k1 >>> 17);
|
14131 | k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;
|
14132 | h1 ^= k1;
|
14133 | }
|
14134 |
|
14135 | h1 ^= key.length;
|
14136 |
|
14137 | h1 ^= h1 >>> 16;
|
14138 | h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;
|
14139 | h1 ^= h1 >>> 13;
|
14140 | h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;
|
14141 | h1 ^= h1 >>> 16;
|
14142 |
|
14143 | return h1 >>> 0;
|
14144 | }
|
14145 |
|
14146 | if('object' !== "undefined") {
|
14147 | module.exports = murmurhash3_32_gc;
|
14148 | }
|
14149 | }(murmurhash3_gc$1));
|
14150 |
|
14151 | var murmurhash3_gc = murmurhash3_gc$1.exports;
|
14152 |
|
14153 | var murmurhash2_gc$1 = {exports: {}};
|
14154 |
|
14155 | /**
|
14156 | * JS Implementation of MurmurHash2
|
14157 | *
|
14158 | * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
|
14159 | * @see http://github.com/garycourt/murmurhash-js
|
14160 | * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a>
|
14161 | * @see http://sites.google.com/site/murmurhash/
|
14162 | *
|
14163 | * @param {string} str ASCII only
|
14164 | * @param {number} seed Positive integer only
|
14165 | * @return {number} 32-bit positive integer hash
|
14166 | */
|
14167 |
|
14168 | (function (module) {
|
14169 | function murmurhash2_32_gc(str, seed) {
|
14170 | var
|
14171 | l = str.length,
|
14172 | h = seed ^ l,
|
14173 | i = 0,
|
14174 | k;
|
14175 |
|
14176 | while (l >= 4) {
|
14177 | k =
|
14178 | ((str.charCodeAt(i) & 0xff)) |
|
14179 | ((str.charCodeAt(++i) & 0xff) << 8) |
|
14180 | ((str.charCodeAt(++i) & 0xff) << 16) |
|
14181 | ((str.charCodeAt(++i) & 0xff) << 24);
|
14182 |
|
14183 | k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));
|
14184 | k ^= k >>> 24;
|
14185 | k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));
|
14186 |
|
14187 | h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k;
|
14188 |
|
14189 | l -= 4;
|
14190 | ++i;
|
14191 | }
|
14192 |
|
14193 | switch (l) {
|
14194 | case 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16;
|
14195 | case 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8;
|
14196 | case 1: h ^= (str.charCodeAt(i) & 0xff);
|
14197 | h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));
|
14198 | }
|
14199 |
|
14200 | h ^= h >>> 13;
|
14201 | h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));
|
14202 | h ^= h >>> 15;
|
14203 |
|
14204 | return h >>> 0;
|
14205 | }
|
14206 |
|
14207 | if('object' !== undefined) {
|
14208 | module.exports = murmurhash2_32_gc;
|
14209 | }
|
14210 | }(murmurhash2_gc$1));
|
14211 |
|
14212 | var murmurhash2_gc = murmurhash2_gc$1.exports;
|
14213 |
|
14214 | var murmur3 = murmurhash3_gc$1.exports;
|
14215 | var murmur2 = murmurhash2_gc$1.exports;
|
14216 |
|
14217 | murmurhashJs.exports = murmur3;
|
14218 | var murmur3_1 = murmurhashJs.exports.murmur3 = murmur3;
|
14219 | var murmur2_1 = murmurhashJs.exports.murmur2 = murmur2;
|
14220 |
|
14221 | var murmur3$1 = murmurhashJs.exports;
|
14222 |
|
14223 | // A transferable data structure that maps feature ids to their indices and buffer offsets
|
14224 | class FeaturePositionMap {
|
14225 | constructor() {
|
14226 | this.ids = [];
|
14227 | this.positions = [];
|
14228 | this.indexed = false;
|
14229 | }
|
14230 | add(id, index, start, end) {
|
14231 | this.ids.push(getNumericId(id));
|
14232 | this.positions.push(index, start, end);
|
14233 | }
|
14234 | getPositions(id) {
|
14235 | assert$1(this.indexed);
|
14236 | const intId = getNumericId(id);
|
14237 | // binary search for the first occurrence of id in this.ids;
|
14238 | // relies on ids/positions being sorted by id, which happens in serialization
|
14239 | let i = 0;
|
14240 | let j = this.ids.length - 1;
|
14241 | while (i < j) {
|
14242 | const m = (i + j) >> 1;
|
14243 | if (this.ids[m] >= intId) {
|
14244 | j = m;
|
14245 | }
|
14246 | else {
|
14247 | i = m + 1;
|
14248 | }
|
14249 | }
|
14250 | const positions = [];
|
14251 | while (this.ids[i] === intId) {
|
14252 | const index = this.positions[3 * i];
|
14253 | const start = this.positions[3 * i + 1];
|
14254 | const end = this.positions[3 * i + 2];
|
14255 | positions.push({ index, start, end });
|
14256 | i++;
|
14257 | }
|
14258 | return positions;
|
14259 | }
|
14260 | static serialize(map, transferables) {
|
14261 | const ids = new Float64Array(map.ids);
|
14262 | const positions = new Uint32Array(map.positions);
|
14263 | sort(ids, positions, 0, ids.length - 1);
|
14264 | if (transferables) {
|
14265 | transferables.push(ids.buffer, positions.buffer);
|
14266 | }
|
14267 | return { ids, positions };
|
14268 | }
|
14269 | static deserialize(obj) {
|
14270 | const map = new FeaturePositionMap();
|
14271 | // after transferring, we only use these arrays statically (no pushes),
|
14272 | // so TypedArray vs Array distinction that flow points out doesn't matter
|
14273 | map.ids = obj.ids;
|
14274 | map.positions = obj.positions;
|
14275 | map.indexed = true;
|
14276 | return map;
|
14277 | }
|
14278 | }
|
14279 | function getNumericId(value) {
|
14280 | const numValue = +value;
|
14281 | if (!isNaN(numValue) && numValue <= Number.MAX_SAFE_INTEGER) {
|
14282 | return numValue;
|
14283 | }
|
14284 | return murmur3$1(String(value));
|
14285 | }
|
14286 | // custom quicksort that sorts ids, indices and offsets together (by ids)
|
14287 | // uses Hoare partitioning & manual tail call optimization to avoid worst case scenarios
|
14288 | function sort(ids, positions, left, right) {
|
14289 | while (left < right) {
|
14290 | const pivot = ids[(left + right) >> 1];
|
14291 | let i = left - 1;
|
14292 | let j = right + 1;
|
14293 | while (true) {
|
14294 | do
|
14295 | i++;
|
14296 | while (ids[i] < pivot);
|
14297 | do
|
14298 | j--;
|
14299 | while (ids[j] > pivot);
|
14300 | if (i >= j)
|
14301 | break;
|
14302 | swap$1(ids, i, j);
|
14303 | swap$1(positions, 3 * i, 3 * j);
|
14304 | swap$1(positions, 3 * i + 1, 3 * j + 1);
|
14305 | swap$1(positions, 3 * i + 2, 3 * j + 2);
|
14306 | }
|
14307 | if (j - left < right - j) {
|
14308 | sort(ids, positions, left, j);
|
14309 | left = j + 1;
|
14310 | }
|
14311 | else {
|
14312 | sort(ids, positions, j + 1, right);
|
14313 | right = j;
|
14314 | }
|
14315 | }
|
14316 | }
|
14317 | function swap$1(arr, i, j) {
|
14318 | const tmp = arr[i];
|
14319 | arr[i] = arr[j];
|
14320 | arr[j] = tmp;
|
14321 | }
|
14322 | register('FeaturePositionMap', FeaturePositionMap);
|
14323 |
|
14324 | class Uniform {
|
14325 | constructor(context, location) {
|
14326 | this.gl = context.gl;
|
14327 | this.location = location;
|
14328 | }
|
14329 | }
|
14330 | class Uniform1i extends Uniform {
|
14331 | constructor(context, location) {
|
14332 | super(context, location);
|
14333 | this.current = 0;
|
14334 | }
|
14335 | set(v) {
|
14336 | if (this.current !== v) {
|
14337 | this.current = v;
|
14338 | this.gl.uniform1i(this.location, v);
|
14339 | }
|
14340 | }
|
14341 | }
|
14342 | class Uniform1f extends Uniform {
|
14343 | constructor(context, location) {
|
14344 | super(context, location);
|
14345 | this.current = 0;
|
14346 | }
|
14347 | set(v) {
|
14348 | if (this.current !== v) {
|
14349 | this.current = v;
|
14350 | this.gl.uniform1f(this.location, v);
|
14351 | }
|
14352 | }
|
14353 | }
|
14354 | class Uniform2f extends Uniform {
|
14355 | constructor(context, location) {
|
14356 | super(context, location);
|
14357 | this.current = [0, 0];
|
14358 | }
|
14359 | set(v) {
|
14360 | if (v[0] !== this.current[0] || v[1] !== this.current[1]) {
|
14361 | this.current = v;
|
14362 | this.gl.uniform2f(this.location, v[0], v[1]);
|
14363 | }
|
14364 | }
|
14365 | }
|
14366 | class Uniform3f extends Uniform {
|
14367 | constructor(context, location) {
|
14368 | super(context, location);
|
14369 | this.current = [0, 0, 0];
|
14370 | }
|
14371 | set(v) {
|
14372 | if (v[0] !== this.current[0] || v[1] !== this.current[1] || v[2] !== this.current[2]) {
|
14373 | this.current = v;
|
14374 | this.gl.uniform3f(this.location, v[0], v[1], v[2]);
|
14375 | }
|
14376 | }
|
14377 | }
|
14378 | class Uniform4f extends Uniform {
|
14379 | constructor(context, location) {
|
14380 | super(context, location);
|
14381 | this.current = [0, 0, 0, 0];
|
14382 | }
|
14383 | set(v) {
|
14384 | if (v[0] !== this.current[0] || v[1] !== this.current[1] ||
|
14385 | v[2] !== this.current[2] || v[3] !== this.current[3]) {
|
14386 | this.current = v;
|
14387 | this.gl.uniform4f(this.location, v[0], v[1], v[2], v[3]);
|
14388 | }
|
14389 | }
|
14390 | }
|
14391 | class UniformColor extends Uniform {
|
14392 | constructor(context, location) {
|
14393 | super(context, location);
|
14394 | this.current = Color.transparent;
|
14395 | }
|
14396 | set(v) {
|
14397 | if (v.r !== this.current.r || v.g !== this.current.g ||
|
14398 | v.b !== this.current.b || v.a !== this.current.a) {
|
14399 | this.current = v;
|
14400 | this.gl.uniform4f(this.location, v.r, v.g, v.b, v.a);
|
14401 | }
|
14402 | }
|
14403 | }
|
14404 | const emptyMat4 = new Float32Array(16);
|
14405 | class UniformMatrix4f extends Uniform {
|
14406 | constructor(context, location) {
|
14407 | super(context, location);
|
14408 | this.current = emptyMat4;
|
14409 | }
|
14410 | set(v) {
|
14411 | // The vast majority of matrix comparisons that will trip this set
|
14412 | // happen at i=12 or i=0, so we check those first to avoid lots of
|
14413 | // unnecessary iteration:
|
14414 | if (v[12] !== this.current[12] || v[0] !== this.current[0]) {
|
14415 | this.current = v;
|
14416 | this.gl.uniformMatrix4fv(this.location, false, v);
|
14417 | return;
|
14418 | }
|
14419 | for (let i = 1; i < 16; i++) {
|
14420 | if (v[i] !== this.current[i]) {
|
14421 | this.current = v;
|
14422 | this.gl.uniformMatrix4fv(this.location, false, v);
|
14423 | break;
|
14424 | }
|
14425 | }
|
14426 | }
|
14427 | }
|
14428 |
|
14429 | function packColor(color) {
|
14430 | return [
|
14431 | packUint8ToFloat(255 * color.r, 255 * color.g),
|
14432 | packUint8ToFloat(255 * color.b, 255 * color.a)
|
14433 | ];
|
14434 | }
|
14435 | class ConstantBinder {
|
14436 | constructor(value, names, type) {
|
14437 | this.value = value;
|
14438 | this.uniformNames = names.map(name => `u_${name}`);
|
14439 | this.type = type;
|
14440 | }
|
14441 | setUniform(uniform, globals, currentValue) {
|
14442 | uniform.set(currentValue.constantOr(this.value));
|
14443 | }
|
14444 | getBinding(context, location, _) {
|
14445 | return (this.type === 'color') ?
|
14446 | new UniformColor(context, location) :
|
14447 | new Uniform1f(context, location);
|
14448 | }
|
14449 | }
|
14450 | class CrossFadedConstantBinder {
|
14451 | constructor(value, names) {
|
14452 | this.uniformNames = names.map(name => `u_${name}`);
|
14453 | this.patternFrom = null;
|
14454 | this.patternTo = null;
|
14455 | this.pixelRatioFrom = 1.0;
|
14456 | this.pixelRatioTo = 1.0;
|
14457 | }
|
14458 | setConstantPatternPositions(posTo, posFrom) {
|
14459 | this.pixelRatioFrom = posFrom.pixelRatio;
|
14460 | this.pixelRatioTo = posTo.pixelRatio;
|
14461 | this.patternFrom = posFrom.tlbr;
|
14462 | this.patternTo = posTo.tlbr;
|
14463 | }
|
14464 | setUniform(uniform, globals, currentValue, uniformName) {
|
14465 | const pos = uniformName === 'u_pattern_to' ? this.patternTo :
|
14466 | uniformName === 'u_pattern_from' ? this.patternFrom :
|
14467 | uniformName === 'u_pixel_ratio_to' ? this.pixelRatioTo :
|
14468 | uniformName === 'u_pixel_ratio_from' ? this.pixelRatioFrom : null;
|
14469 | if (pos)
|
14470 | uniform.set(pos);
|
14471 | }
|
14472 | getBinding(context, location, name) {
|
14473 | return name.substr(0, 9) === 'u_pattern' ?
|
14474 | new Uniform4f(context, location) :
|
14475 | new Uniform1f(context, location);
|
14476 | }
|
14477 | }
|
14478 | class SourceExpressionBinder {
|
14479 | constructor(expression, names, type, PaintVertexArray) {
|
14480 | this.expression = expression;
|
14481 | this.type = type;
|
14482 | this.maxValue = 0;
|
14483 | this.paintVertexAttributes = names.map((name) => ({
|
14484 | name: `a_${name}`,
|
14485 | type: 'Float32',
|
14486 | components: type === 'color' ? 2 : 1,
|
14487 | offset: 0
|
14488 | }));
|
14489 | this.paintVertexArray = new PaintVertexArray();
|
14490 | }
|
14491 | populatePaintArray(newLength, feature, imagePositions, canonical, formattedSection) {
|
14492 | const start = this.paintVertexArray.length;
|
14493 | const value = this.expression.evaluate(new EvaluationParameters(0), feature, {}, canonical, [], formattedSection);
|
14494 | this.paintVertexArray.resize(newLength);
|
14495 | this._setPaintValue(start, newLength, value);
|
14496 | }
|
14497 | updatePaintArray(start, end, feature, featureState) {
|
14498 | const value = this.expression.evaluate({ zoom: 0 }, feature, featureState);
|
14499 | this._setPaintValue(start, end, value);
|
14500 | }
|
14501 | _setPaintValue(start, end, value) {
|
14502 | if (this.type === 'color') {
|
14503 | const color = packColor(value);
|
14504 | for (let i = start; i < end; i++) {
|
14505 | this.paintVertexArray.emplace(i, color[0], color[1]);
|
14506 | }
|
14507 | }
|
14508 | else {
|
14509 | for (let i = start; i < end; i++) {
|
14510 | this.paintVertexArray.emplace(i, value);
|
14511 | }
|
14512 | this.maxValue = Math.max(this.maxValue, Math.abs(value));
|
14513 | }
|
14514 | }
|
14515 | upload(context) {
|
14516 | if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) {
|
14517 | if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) {
|
14518 | this.paintVertexBuffer.updateData(this.paintVertexArray);
|
14519 | }
|
14520 | else {
|
14521 | this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent);
|
14522 | }
|
14523 | }
|
14524 | }
|
14525 | destroy() {
|
14526 | if (this.paintVertexBuffer) {
|
14527 | this.paintVertexBuffer.destroy();
|
14528 | }
|
14529 | }
|
14530 | }
|
14531 | class CompositeExpressionBinder {
|
14532 | constructor(expression, names, type, useIntegerZoom, zoom, PaintVertexArray) {
|
14533 | this.expression = expression;
|
14534 | this.uniformNames = names.map(name => `u_${name}_t`);
|
14535 | this.type = type;
|
14536 | this.useIntegerZoom = useIntegerZoom;
|
14537 | this.zoom = zoom;
|
14538 | this.maxValue = 0;
|
14539 | this.paintVertexAttributes = names.map((name) => ({
|
14540 | name: `a_${name}`,
|
14541 | type: 'Float32',
|
14542 | components: type === 'color' ? 4 : 2,
|
14543 | offset: 0
|
14544 | }));
|
14545 | this.paintVertexArray = new PaintVertexArray();
|
14546 | }
|
14547 | populatePaintArray(newLength, feature, imagePositions, canonical, formattedSection) {
|
14548 | const min = this.expression.evaluate(new EvaluationParameters(this.zoom), feature, {}, canonical, [], formattedSection);
|
14549 | const max = this.expression.evaluate(new EvaluationParameters(this.zoom + 1), feature, {}, canonical, [], formattedSection);
|
14550 | const start = this.paintVertexArray.length;
|
14551 | this.paintVertexArray.resize(newLength);
|
14552 | this._setPaintValue(start, newLength, min, max);
|
14553 | }
|
14554 | updatePaintArray(start, end, feature, featureState) {
|
14555 | const min = this.expression.evaluate({ zoom: this.zoom }, feature, featureState);
|
14556 | const max = this.expression.evaluate({ zoom: this.zoom + 1 }, feature, featureState);
|
14557 | this._setPaintValue(start, end, min, max);
|
14558 | }
|
14559 | _setPaintValue(start, end, min, max) {
|
14560 | if (this.type === 'color') {
|
14561 | const minColor = packColor(min);
|
14562 | const maxColor = packColor(max);
|
14563 | for (let i = start; i < end; i++) {
|
14564 | this.paintVertexArray.emplace(i, minColor[0], minColor[1], maxColor[0], maxColor[1]);
|
14565 | }
|
14566 | }
|
14567 | else {
|
14568 | for (let i = start; i < end; i++) {
|
14569 | this.paintVertexArray.emplace(i, min, max);
|
14570 | }
|
14571 | this.maxValue = Math.max(this.maxValue, Math.abs(min), Math.abs(max));
|
14572 | }
|
14573 | }
|
14574 | upload(context) {
|
14575 | if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) {
|
14576 | if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) {
|
14577 | this.paintVertexBuffer.updateData(this.paintVertexArray);
|
14578 | }
|
14579 | else {
|
14580 | this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent);
|
14581 | }
|
14582 | }
|
14583 | }
|
14584 | destroy() {
|
14585 | if (this.paintVertexBuffer) {
|
14586 | this.paintVertexBuffer.destroy();
|
14587 | }
|
14588 | }
|
14589 | setUniform(uniform, globals) {
|
14590 | const currentZoom = this.useIntegerZoom ? Math.floor(globals.zoom) : globals.zoom;
|
14591 | const factor = clamp(this.expression.interpolationFactor(currentZoom, this.zoom, this.zoom + 1), 0, 1);
|
14592 | uniform.set(factor);
|
14593 | }
|
14594 | getBinding(context, location, _) {
|
14595 | return new Uniform1f(context, location);
|
14596 | }
|
14597 | }
|
14598 | class CrossFadedCompositeBinder {
|
14599 | constructor(expression, type, useIntegerZoom, zoom, PaintVertexArray, layerId) {
|
14600 | this.expression = expression;
|
14601 | this.type = type;
|
14602 | this.useIntegerZoom = useIntegerZoom;
|
14603 | this.zoom = zoom;
|
14604 | this.layerId = layerId;
|
14605 | this.zoomInPaintVertexArray = new PaintVertexArray();
|
14606 | this.zoomOutPaintVertexArray = new PaintVertexArray();
|
14607 | }
|
14608 | populatePaintArray(length, feature, imagePositions) {
|
14609 | const start = this.zoomInPaintVertexArray.length;
|
14610 | this.zoomInPaintVertexArray.resize(length);
|
14611 | this.zoomOutPaintVertexArray.resize(length);
|
14612 | this._setPaintValues(start, length, feature.patterns && feature.patterns[this.layerId], imagePositions);
|
14613 | }
|
14614 | updatePaintArray(start, end, feature, featureState, imagePositions) {
|
14615 | this._setPaintValues(start, end, feature.patterns && feature.patterns[this.layerId], imagePositions);
|
14616 | }
|
14617 | _setPaintValues(start, end, patterns, positions) {
|
14618 | if (!positions || !patterns)
|
14619 | return;
|
14620 | const { min, mid, max } = patterns;
|
14621 | const imageMin = positions[min];
|
14622 | const imageMid = positions[mid];
|
14623 | const imageMax = positions[max];
|
14624 | if (!imageMin || !imageMid || !imageMax)
|
14625 | return;
|
14626 | // We populate two paint arrays because, for cross-faded properties, we don't know which direction
|
14627 | // we're cross-fading to at layout time. In order to keep vertex attributes to a minimum and not pass
|
14628 | // unnecessary vertex data to the shaders, we determine which to upload at draw time.
|
14629 | for (let i = start; i < end; i++) {
|
14630 | this.zoomInPaintVertexArray.emplace(i, imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMin.tl[0], imageMin.tl[1], imageMin.br[0], imageMin.br[1], imageMid.pixelRatio, imageMin.pixelRatio);
|
14631 | this.zoomOutPaintVertexArray.emplace(i, imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMax.tl[0], imageMax.tl[1], imageMax.br[0], imageMax.br[1], imageMid.pixelRatio, imageMax.pixelRatio);
|
14632 | }
|
14633 | }
|
14634 | upload(context) {
|
14635 | if (this.zoomInPaintVertexArray && this.zoomInPaintVertexArray.arrayBuffer && this.zoomOutPaintVertexArray && this.zoomOutPaintVertexArray.arrayBuffer) {
|
14636 | this.zoomInPaintVertexBuffer = context.createVertexBuffer(this.zoomInPaintVertexArray, patternAttributes.members, this.expression.isStateDependent);
|
14637 | this.zoomOutPaintVertexBuffer = context.createVertexBuffer(this.zoomOutPaintVertexArray, patternAttributes.members, this.expression.isStateDependent);
|
14638 | }
|
14639 | }
|
14640 | destroy() {
|
14641 | if (this.zoomOutPaintVertexBuffer)
|
14642 | this.zoomOutPaintVertexBuffer.destroy();
|
14643 | if (this.zoomInPaintVertexBuffer)
|
14644 | this.zoomInPaintVertexBuffer.destroy();
|
14645 | }
|
14646 | }
|
14647 | /**
|
14648 | * ProgramConfiguration contains the logic for binding style layer properties and tile
|
14649 | * layer feature data into GL program uniforms and vertex attributes.
|
14650 | *
|
14651 | * Non-data-driven property values are bound to shader uniforms. Data-driven property
|
14652 | * values are bound to vertex attributes. In order to support a uniform GLSL syntax over
|
14653 | * both, [Mapbox GL Shaders](https://github.com/mapbox/mapbox-gl-shaders) defines a `#pragma`
|
14654 | * abstraction, which ProgramConfiguration is responsible for implementing. At runtime,
|
14655 | * it examines the attributes of a particular layer, combines this with fixed knowledge
|
14656 | * about how layers of the particular type are implemented, and determines which uniforms
|
14657 | * and vertex attributes will be required. It can then substitute the appropriate text
|
14658 | * into the shader source code, create and link a program, and bind the uniforms and
|
14659 | * vertex attributes in preparation for drawing.
|
14660 | *
|
14661 | * When a vector tile is parsed, this same configuration information is used to
|
14662 | * populate the attribute buffers needed for data-driven styling using the zoom
|
14663 | * level and feature property data.
|
14664 | *
|
14665 | * @private
|
14666 | */
|
14667 | class ProgramConfiguration {
|
14668 | constructor(layer, zoom, filterProperties) {
|
14669 | this.binders = {};
|
14670 | this._buffers = [];
|
14671 | const keys = [];
|
14672 | for (const property in layer.paint._values) {
|
14673 | if (!filterProperties(property))
|
14674 | continue;
|
14675 | const value = layer.paint.get(property);
|
14676 | if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) {
|
14677 | continue;
|
14678 | }
|
14679 | const names = paintAttributeNames(property, layer.type);
|
14680 | const expression = value.value;
|
14681 | const type = value.property.specification.type;
|
14682 | const useIntegerZoom = value.property.useIntegerZoom;
|
14683 | const propType = value.property.specification['property-type'];
|
14684 | const isCrossFaded = propType === 'cross-faded' || propType === 'cross-faded-data-driven';
|
14685 | if (expression.kind === 'constant') {
|
14686 | this.binders[property] = isCrossFaded ?
|
14687 | new CrossFadedConstantBinder(expression.value, names) :
|
14688 | new ConstantBinder(expression.value, names, type);
|
14689 | keys.push(`/u_${property}`);
|
14690 | }
|
14691 | else if (expression.kind === 'source' || isCrossFaded) {
|
14692 | const StructArrayLayout = layoutType(property, type, 'source');
|
14693 | this.binders[property] = isCrossFaded ?
|
14694 | new CrossFadedCompositeBinder(expression, type, useIntegerZoom, zoom, StructArrayLayout, layer.id) :
|
14695 | new SourceExpressionBinder(expression, names, type, StructArrayLayout);
|
14696 | keys.push(`/a_${property}`);
|
14697 | }
|
14698 | else {
|
14699 | const StructArrayLayout = layoutType(property, type, 'composite');
|
14700 | this.binders[property] = new CompositeExpressionBinder(expression, names, type, useIntegerZoom, zoom, StructArrayLayout);
|
14701 | keys.push(`/z_${property}`);
|
14702 | }
|
14703 | }
|
14704 | this.cacheKey = keys.sort().join('');
|
14705 | }
|
14706 | getMaxValue(property) {
|
14707 | const binder = this.binders[property];
|
14708 | return binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder ? binder.maxValue : 0;
|
14709 | }
|
14710 | populatePaintArrays(newLength, feature, imagePositions, canonical, formattedSection) {
|
14711 | for (const property in this.binders) {
|
14712 | const binder = this.binders[property];
|
14713 | if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder)
|
14714 | binder.populatePaintArray(newLength, feature, imagePositions, canonical, formattedSection);
|
14715 | }
|
14716 | }
|
14717 | setConstantPatternPositions(posTo, posFrom) {
|
14718 | for (const property in this.binders) {
|
14719 | const binder = this.binders[property];
|
14720 | if (binder instanceof CrossFadedConstantBinder)
|
14721 | binder.setConstantPatternPositions(posTo, posFrom);
|
14722 | }
|
14723 | }
|
14724 | updatePaintArrays(featureStates, featureMap, vtLayer, layer, imagePositions) {
|
14725 | let dirty = false;
|
14726 | for (const id in featureStates) {
|
14727 | const positions = featureMap.getPositions(id);
|
14728 | for (const pos of positions) {
|
14729 | const feature = vtLayer.feature(pos.index);
|
14730 | for (const property in this.binders) {
|
14731 | const binder = this.binders[property];
|
14732 | if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder ||
|
14733 | binder instanceof CrossFadedCompositeBinder) && binder.expression.isStateDependent === true) {
|
14734 | //AHM: Remove after https://github.com/mapbox/mapbox-gl-js/issues/6255
|
14735 | const value = layer.paint.get(property);
|
14736 | binder.expression = value.value;
|
14737 | binder.updatePaintArray(pos.start, pos.end, feature, featureStates[id], imagePositions);
|
14738 | dirty = true;
|
14739 | }
|
14740 | }
|
14741 | }
|
14742 | }
|
14743 | return dirty;
|
14744 | }
|
14745 | defines() {
|
14746 | const result = [];
|
14747 | for (const property in this.binders) {
|
14748 | const binder = this.binders[property];
|
14749 | if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder) {
|
14750 | result.push(...binder.uniformNames.map(name => `#define HAS_UNIFORM_${name}`));
|
14751 | }
|
14752 | }
|
14753 | return result;
|
14754 | }
|
14755 | getBinderAttributes() {
|
14756 | const result = [];
|
14757 | for (const property in this.binders) {
|
14758 | const binder = this.binders[property];
|
14759 | if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) {
|
14760 | for (let i = 0; i < binder.paintVertexAttributes.length; i++) {
|
14761 | result.push(binder.paintVertexAttributes[i].name);
|
14762 | }
|
14763 | }
|
14764 | else if (binder instanceof CrossFadedCompositeBinder) {
|
14765 | for (let i = 0; i < patternAttributes.members.length; i++) {
|
14766 | result.push(patternAttributes.members[i].name);
|
14767 | }
|
14768 | }
|
14769 | }
|
14770 | return result;
|
14771 | }
|
14772 | getBinderUniforms() {
|
14773 | const uniforms = [];
|
14774 | for (const property in this.binders) {
|
14775 | const binder = this.binders[property];
|
14776 | if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder || binder instanceof CompositeExpressionBinder) {
|
14777 | for (const uniformName of binder.uniformNames) {
|
14778 | uniforms.push(uniformName);
|
14779 | }
|
14780 | }
|
14781 | }
|
14782 | return uniforms;
|
14783 | }
|
14784 | getPaintVertexBuffers() {
|
14785 | return this._buffers;
|
14786 | }
|
14787 | getUniforms(context, locations) {
|
14788 | const uniforms = [];
|
14789 | for (const property in this.binders) {
|
14790 | const binder = this.binders[property];
|
14791 | if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder || binder instanceof CompositeExpressionBinder) {
|
14792 | for (const name of binder.uniformNames) {
|
14793 | if (locations[name]) {
|
14794 | const binding = binder.getBinding(context, locations[name], name);
|
14795 | uniforms.push({ name, property, binding });
|
14796 | }
|
14797 | }
|
14798 | }
|
14799 | }
|
14800 | return uniforms;
|
14801 | }
|
14802 | setUniforms(context, binderUniforms, properties, globals) {
|
14803 | // Uniform state bindings are owned by the Program, but we set them
|
14804 | // from within the ProgramConfiguraton's binder members.
|
14805 | for (const { name, property, binding } of binderUniforms) {
|
14806 | this.binders[property].setUniform(binding, globals, properties.get(property), name);
|
14807 | }
|
14808 | }
|
14809 | updatePaintBuffers(crossfade) {
|
14810 | this._buffers = [];
|
14811 | for (const property in this.binders) {
|
14812 | const binder = this.binders[property];
|
14813 | if (crossfade && binder instanceof CrossFadedCompositeBinder) {
|
14814 | const patternVertexBuffer = crossfade.fromScale === 2 ? binder.zoomInPaintVertexBuffer : binder.zoomOutPaintVertexBuffer;
|
14815 | if (patternVertexBuffer)
|
14816 | this._buffers.push(patternVertexBuffer);
|
14817 | }
|
14818 | else if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) && binder.paintVertexBuffer) {
|
14819 | this._buffers.push(binder.paintVertexBuffer);
|
14820 | }
|
14821 | }
|
14822 | }
|
14823 | upload(context) {
|
14824 | for (const property in this.binders) {
|
14825 | const binder = this.binders[property];
|
14826 | if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder)
|
14827 | binder.upload(context);
|
14828 | }
|
14829 | this.updatePaintBuffers();
|
14830 | }
|
14831 | destroy() {
|
14832 | for (const property in this.binders) {
|
14833 | const binder = this.binders[property];
|
14834 | if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder)
|
14835 | binder.destroy();
|
14836 | }
|
14837 | }
|
14838 | }
|
14839 | class ProgramConfigurationSet {
|
14840 | constructor(layers, zoom, filterProperties = () => true) {
|
14841 | this.programConfigurations = {};
|
14842 | for (const layer of layers) {
|
14843 | this.programConfigurations[layer.id] = new ProgramConfiguration(layer, zoom, filterProperties);
|
14844 | }
|
14845 | this.needsUpload = false;
|
14846 | this._featureMap = new FeaturePositionMap();
|
14847 | this._bufferOffset = 0;
|
14848 | }
|
14849 | populatePaintArrays(length, feature, index, imagePositions, canonical, formattedSection) {
|
14850 | for (const key in this.programConfigurations) {
|
14851 | this.programConfigurations[key].populatePaintArrays(length, feature, imagePositions, canonical, formattedSection);
|
14852 | }
|
14853 | if (feature.id !== undefined) {
|
14854 | this._featureMap.add(feature.id, index, this._bufferOffset, length);
|
14855 | }
|
14856 | this._bufferOffset = length;
|
14857 | this.needsUpload = true;
|
14858 | }
|
14859 | updatePaintArrays(featureStates, vtLayer, layers, imagePositions) {
|
14860 | for (const layer of layers) {
|
14861 | this.needsUpload = this.programConfigurations[layer.id].updatePaintArrays(featureStates, this._featureMap, vtLayer, layer, imagePositions) || this.needsUpload;
|
14862 | }
|
14863 | }
|
14864 | get(layerId) {
|
14865 | return this.programConfigurations[layerId];
|
14866 | }
|
14867 | upload(context) {
|
14868 | if (!this.needsUpload)
|
14869 | return;
|
14870 | for (const layerId in this.programConfigurations) {
|
14871 | this.programConfigurations[layerId].upload(context);
|
14872 | }
|
14873 | this.needsUpload = false;
|
14874 | }
|
14875 | destroy() {
|
14876 | for (const layerId in this.programConfigurations) {
|
14877 | this.programConfigurations[layerId].destroy();
|
14878 | }
|
14879 | }
|
14880 | }
|
14881 | function paintAttributeNames(property, type) {
|
14882 | const attributeNameExceptions = {
|
14883 | 'text-opacity': ['opacity'],
|
14884 | 'icon-opacity': ['opacity'],
|
14885 | 'text-color': ['fill_color'],
|
14886 | 'icon-color': ['fill_color'],
|
14887 | 'text-halo-color': ['halo_color'],
|
14888 | 'icon-halo-color': ['halo_color'],
|
14889 | 'text-halo-blur': ['halo_blur'],
|
14890 | 'icon-halo-blur': ['halo_blur'],
|
14891 | 'text-halo-width': ['halo_width'],
|
14892 | 'icon-halo-width': ['halo_width'],
|
14893 | 'line-gap-width': ['gapwidth'],
|
14894 | 'line-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'],
|
14895 | 'fill-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'],
|
14896 | 'fill-extrusion-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'],
|
14897 | };
|
14898 | return attributeNameExceptions[property] || [property.replace(`${type}-`, '').replace(/-/g, '_')];
|
14899 | }
|
14900 | function getLayoutException(property) {
|
14901 | const propertyExceptions = {
|
14902 | 'line-pattern': {
|
14903 | 'source': PatternLayoutArray,
|
14904 | 'composite': PatternLayoutArray
|
14905 | },
|
14906 | 'fill-pattern': {
|
14907 | 'source': PatternLayoutArray,
|
14908 | 'composite': PatternLayoutArray
|
14909 | },
|
14910 | 'fill-extrusion-pattern': {
|
14911 | 'source': PatternLayoutArray,
|
14912 | 'composite': PatternLayoutArray
|
14913 | }
|
14914 | };
|
14915 | return propertyExceptions[property];
|
14916 | }
|
14917 | function layoutType(property, type, binderType) {
|
14918 | const defaultLayouts = {
|
14919 | 'color': {
|
14920 | 'source': StructArrayLayout2f8,
|
14921 | 'composite': StructArrayLayout4f16
|
14922 | },
|
14923 | 'number': {
|
14924 | 'source': StructArrayLayout1f4,
|
14925 | 'composite': StructArrayLayout2f8
|
14926 | }
|
14927 | };
|
14928 | const layoutException = getLayoutException(property);
|
14929 | return layoutException && layoutException[binderType] || defaultLayouts[type][binderType];
|
14930 | }
|
14931 | register('ConstantBinder', ConstantBinder);
|
14932 | register('CrossFadedConstantBinder', CrossFadedConstantBinder);
|
14933 | register('SourceExpressionBinder', SourceExpressionBinder);
|
14934 | register('CrossFadedCompositeBinder', CrossFadedCompositeBinder);
|
14935 | register('CompositeExpressionBinder', CompositeExpressionBinder);
|
14936 | register('ProgramConfiguration', ProgramConfiguration, { omit: ['_buffers'] });
|
14937 | register('ProgramConfigurationSet', ProgramConfigurationSet);
|
14938 |
|
14939 | /**
|
14940 | * The maximum value of a coordinate in the internal tile coordinate system. Coordinates of
|
14941 | * all source features normalized to this extent upon load.
|
14942 | *
|
14943 | * The value is a consequence of the following:
|
14944 | *
|
14945 | * * Vertex buffer store positions as signed 16 bit integers.
|
14946 | * * One bit is lost for signedness to support tile buffers.
|
14947 | * * One bit is lost because the line vertex buffer used to pack 1 bit of other data into the int.
|
14948 | * * One bit is lost to support features extending past the extent on the right edge of the tile.
|
14949 | * * This leaves us with 2^13 = 8192
|
14950 | *
|
14951 | * @private
|
14952 | * @readonly
|
14953 | */
|
14954 | var EXTENT = 8192;
|
14955 |
|
14956 | // These bounds define the minimum and maximum supported coordinate values.
|
14957 | // While visible coordinates are within [0, EXTENT], tiles may theoretically
|
14958 | // contain cordinates within [-Infinity, Infinity]. Our range is limited by the
|
14959 | // number of bits used to represent the coordinate.
|
14960 | const BITS = 15;
|
14961 | const MAX = Math.pow(2, BITS - 1) - 1;
|
14962 | const MIN = -MAX - 1;
|
14963 | /**
|
14964 | * Loads a geometry from a VectorTileFeature and scales it to the common extent
|
14965 | * used internally.
|
14966 | * @param {VectorTileFeature} feature
|
14967 | * @private
|
14968 | */
|
14969 | function loadGeometry(feature) {
|
14970 | const scale = EXTENT / feature.extent;
|
14971 | const geometry = feature.loadGeometry();
|
14972 | for (let r = 0; r < geometry.length; r++) {
|
14973 | const ring = geometry[r];
|
14974 | for (let p = 0; p < ring.length; p++) {
|
14975 | const point = ring[p];
|
14976 | // round here because mapbox-gl-native uses integers to represent
|
14977 | // points and we need to do the same to avoid renering differences.
|
14978 | const x = Math.round(point.x * scale);
|
14979 | const y = Math.round(point.y * scale);
|
14980 | point.x = clamp(x, MIN, MAX);
|
14981 | point.y = clamp(y, MIN, MAX);
|
14982 | if (x < point.x || x > point.x + 1 || y < point.y || y > point.y + 1) {
|
14983 | // warn when exceeding allowed extent except for the 1-px-off case
|
14984 | // https://github.com/mapbox/mapbox-gl-js/issues/8992
|
14985 | warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size');
|
14986 | }
|
14987 | }
|
14988 | }
|
14989 | return geometry;
|
14990 | }
|
14991 |
|
14992 | /**
|
14993 | * Construct a new feature based on a VectorTileFeature for expression evaluation, the geometry of which
|
14994 | * will be loaded based on necessity.
|
14995 | * @param {VectorTileFeature} feature
|
14996 | * @param {boolean} needGeometry
|
14997 | * @private
|
14998 | */
|
14999 | function toEvaluationFeature(feature, needGeometry) {
|
15000 | return { type: feature.type,
|
15001 | id: feature.id,
|
15002 | properties: feature.properties,
|
15003 | geometry: needGeometry ? loadGeometry(feature) : [] };
|
15004 | }
|
15005 |
|
15006 | function addCircleVertex(layoutVertexArray, x, y, extrudeX, extrudeY) {
|
15007 | layoutVertexArray.emplaceBack((x * 2) + ((extrudeX + 1) / 2), (y * 2) + ((extrudeY + 1) / 2));
|
15008 | }
|
15009 | /**
|
15010 | * Circles are represented by two triangles.
|
15011 | *
|
15012 | * Each corner has a pos that is the center of the circle and an extrusion
|
15013 | * vector that is where it points.
|
15014 | * @private
|
15015 | */
|
15016 | class CircleBucket {
|
15017 | constructor(options) {
|
15018 | this.zoom = options.zoom;
|
15019 | this.overscaling = options.overscaling;
|
15020 | this.layers = options.layers;
|
15021 | this.layerIds = this.layers.map(layer => layer.id);
|
15022 | this.index = options.index;
|
15023 | this.hasPattern = false;
|
15024 | this.layoutVertexArray = new CircleLayoutArray();
|
15025 | this.indexArray = new TriangleIndexArray();
|
15026 | this.segments = new SegmentVector();
|
15027 | this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom);
|
15028 | this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);
|
15029 | }
|
15030 | populate(features, options, canonical) {
|
15031 | const styleLayer = this.layers[0];
|
15032 | const bucketFeatures = [];
|
15033 | let circleSortKey = null;
|
15034 | let sortFeaturesByKey = false;
|
15035 | // Heatmap layers are handled in this bucket and have no evaluated properties, so we check our access
|
15036 | if (styleLayer.type === 'circle') {
|
15037 | circleSortKey = styleLayer.layout.get('circle-sort-key');
|
15038 | sortFeaturesByKey = !circleSortKey.isConstant();
|
15039 | }
|
15040 | for (const { feature, id, index, sourceLayerIndex } of features) {
|
15041 | const needGeometry = this.layers[0]._featureFilter.needGeometry;
|
15042 | const evaluationFeature = toEvaluationFeature(feature, needGeometry);
|
15043 | if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical))
|
15044 | continue;
|
15045 | const sortKey = sortFeaturesByKey ?
|
15046 | circleSortKey.evaluate(evaluationFeature, {}, canonical) :
|
15047 | undefined;
|
15048 | const bucketFeature = {
|
15049 | id,
|
15050 | properties: feature.properties,
|
15051 | type: feature.type,
|
15052 | sourceLayerIndex,
|
15053 | index,
|
15054 | geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature),
|
15055 | patterns: {},
|
15056 | sortKey
|
15057 | };
|
15058 | bucketFeatures.push(bucketFeature);
|
15059 | }
|
15060 | if (sortFeaturesByKey) {
|
15061 | bucketFeatures.sort((a, b) => a.sortKey - b.sortKey);
|
15062 | }
|
15063 | for (const bucketFeature of bucketFeatures) {
|
15064 | const { geometry, index, sourceLayerIndex } = bucketFeature;
|
15065 | const feature = features[index].feature;
|
15066 | this.addFeature(bucketFeature, geometry, index, canonical);
|
15067 | options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index);
|
15068 | }
|
15069 | }
|
15070 | update(states, vtLayer, imagePositions) {
|
15071 | if (!this.stateDependentLayers.length)
|
15072 | return;
|
15073 | this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions);
|
15074 | }
|
15075 | isEmpty() {
|
15076 | return this.layoutVertexArray.length === 0;
|
15077 | }
|
15078 | uploadPending() {
|
15079 | return !this.uploaded || this.programConfigurations.needsUpload;
|
15080 | }
|
15081 | upload(context) {
|
15082 | if (!this.uploaded) {
|
15083 | this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$4);
|
15084 | this.indexBuffer = context.createIndexBuffer(this.indexArray);
|
15085 | }
|
15086 | this.programConfigurations.upload(context);
|
15087 | this.uploaded = true;
|
15088 | }
|
15089 | destroy() {
|
15090 | if (!this.layoutVertexBuffer)
|
15091 | return;
|
15092 | this.layoutVertexBuffer.destroy();
|
15093 | this.indexBuffer.destroy();
|
15094 | this.programConfigurations.destroy();
|
15095 | this.segments.destroy();
|
15096 | }
|
15097 | addFeature(feature, geometry, index, canonical) {
|
15098 | for (const ring of geometry) {
|
15099 | for (const point of ring) {
|
15100 | const x = point.x;
|
15101 | const y = point.y;
|
15102 | // Do not include points that are outside the tile boundaries.
|
15103 | if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT)
|
15104 | continue;
|
15105 | // this geometry will be of the Point type, and we'll derive
|
15106 | // two triangles from it.
|
15107 | //
|
15108 | // ┌─────────┐
|
15109 | // │ 3 2 │
|
15110 | // │ │
|
15111 | // │ 0 1 │
|
15112 | // └─────────┘
|
15113 | const segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray, feature.sortKey);
|
15114 | const index = segment.vertexLength;
|
15115 | addCircleVertex(this.layoutVertexArray, x, y, -1, -1);
|
15116 | addCircleVertex(this.layoutVertexArray, x, y, 1, -1);
|
15117 | addCircleVertex(this.layoutVertexArray, x, y, 1, 1);
|
15118 | addCircleVertex(this.layoutVertexArray, x, y, -1, 1);
|
15119 | this.indexArray.emplaceBack(index, index + 1, index + 2);
|
15120 | this.indexArray.emplaceBack(index, index + 3, index + 2);
|
15121 | segment.vertexLength += 4;
|
15122 | segment.primitiveLength += 2;
|
15123 | }
|
15124 | }
|
15125 | this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, {}, canonical);
|
15126 | }
|
15127 | }
|
15128 | register('CircleBucket', CircleBucket, { omit: ['layers'] });
|
15129 |
|
15130 | function polygonIntersectsPolygon(polygonA, polygonB) {
|
15131 | for (let i = 0; i < polygonA.length; i++) {
|
15132 | if (polygonContainsPoint(polygonB, polygonA[i]))
|
15133 | return true;
|
15134 | }
|
15135 | for (let i = 0; i < polygonB.length; i++) {
|
15136 | if (polygonContainsPoint(polygonA, polygonB[i]))
|
15137 | return true;
|
15138 | }
|
15139 | if (lineIntersectsLine(polygonA, polygonB))
|
15140 | return true;
|
15141 | return false;
|
15142 | }
|
15143 | function polygonIntersectsBufferedPoint(polygon, point, radius) {
|
15144 | if (polygonContainsPoint(polygon, point))
|
15145 | return true;
|
15146 | if (pointIntersectsBufferedLine(point, polygon, radius))
|
15147 | return true;
|
15148 | return false;
|
15149 | }
|
15150 | function polygonIntersectsMultiPolygon(polygon, multiPolygon) {
|
15151 | if (polygon.length === 1) {
|
15152 | return multiPolygonContainsPoint(multiPolygon, polygon[0]);
|
15153 | }
|
15154 | for (let m = 0; m < multiPolygon.length; m++) {
|
15155 | const ring = multiPolygon[m];
|
15156 | for (let n = 0; n < ring.length; n++) {
|
15157 | if (polygonContainsPoint(polygon, ring[n]))
|
15158 | return true;
|
15159 | }
|
15160 | }
|
15161 | for (let i = 0; i < polygon.length; i++) {
|
15162 | if (multiPolygonContainsPoint(multiPolygon, polygon[i]))
|
15163 | return true;
|
15164 | }
|
15165 | for (let k = 0; k < multiPolygon.length; k++) {
|
15166 | if (lineIntersectsLine(polygon, multiPolygon[k]))
|
15167 | return true;
|
15168 | }
|
15169 | return false;
|
15170 | }
|
15171 | function polygonIntersectsBufferedMultiLine(polygon, multiLine, radius) {
|
15172 | for (let i = 0; i < multiLine.length; i++) {
|
15173 | const line = multiLine[i];
|
15174 | if (polygon.length >= 3) {
|
15175 | for (let k = 0; k < line.length; k++) {
|
15176 | if (polygonContainsPoint(polygon, line[k]))
|
15177 | return true;
|
15178 | }
|
15179 | }
|
15180 | if (lineIntersectsBufferedLine(polygon, line, radius))
|
15181 | return true;
|
15182 | }
|
15183 | return false;
|
15184 | }
|
15185 | function lineIntersectsBufferedLine(lineA, lineB, radius) {
|
15186 | if (lineA.length > 1) {
|
15187 | if (lineIntersectsLine(lineA, lineB))
|
15188 | return true;
|
15189 | // Check whether any point in either line is within radius of the other line
|
15190 | for (let j = 0; j < lineB.length; j++) {
|
15191 | if (pointIntersectsBufferedLine(lineB[j], lineA, radius))
|
15192 | return true;
|
15193 | }
|
15194 | }
|
15195 | for (let k = 0; k < lineA.length; k++) {
|
15196 | if (pointIntersectsBufferedLine(lineA[k], lineB, radius))
|
15197 | return true;
|
15198 | }
|
15199 | return false;
|
15200 | }
|
15201 | function lineIntersectsLine(lineA, lineB) {
|
15202 | if (lineA.length === 0 || lineB.length === 0)
|
15203 | return false;
|
15204 | for (let i = 0; i < lineA.length - 1; i++) {
|
15205 | const a0 = lineA[i];
|
15206 | const a1 = lineA[i + 1];
|
15207 | for (let j = 0; j < lineB.length - 1; j++) {
|
15208 | const b0 = lineB[j];
|
15209 | const b1 = lineB[j + 1];
|
15210 | if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1))
|
15211 | return true;
|
15212 | }
|
15213 | }
|
15214 | return false;
|
15215 | }
|
15216 | function lineSegmentIntersectsLineSegment(a0, a1, b0, b1) {
|
15217 | return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) &&
|
15218 | isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1);
|
15219 | }
|
15220 | function pointIntersectsBufferedLine(p, line, radius) {
|
15221 | const radiusSquared = radius * radius;
|
15222 | if (line.length === 1)
|
15223 | return p.distSqr(line[0]) < radiusSquared;
|
15224 | for (let i = 1; i < line.length; i++) {
|
15225 | // Find line segments that have a distance <= radius^2 to p
|
15226 | // In that case, we treat the line as "containing point p".
|
15227 | const v = line[i - 1], w = line[i];
|
15228 | if (distToSegmentSquared(p, v, w) < radiusSquared)
|
15229 | return true;
|
15230 | }
|
15231 | return false;
|
15232 | }
|
15233 | // Code from http://stackoverflow.com/a/1501725/331379.
|
15234 | function distToSegmentSquared(p, v, w) {
|
15235 | const l2 = v.distSqr(w);
|
15236 | if (l2 === 0)
|
15237 | return p.distSqr(v);
|
15238 | const t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;
|
15239 | if (t < 0)
|
15240 | return p.distSqr(v);
|
15241 | if (t > 1)
|
15242 | return p.distSqr(w);
|
15243 | return p.distSqr(w.sub(v)._mult(t)._add(v));
|
15244 | }
|
15245 | // point in polygon ray casting algorithm
|
15246 | function multiPolygonContainsPoint(rings, p) {
|
15247 | let c = false, ring, p1, p2;
|
15248 | for (let k = 0; k < rings.length; k++) {
|
15249 | ring = rings[k];
|
15250 | for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
|
15251 | p1 = ring[i];
|
15252 | p2 = ring[j];
|
15253 | if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {
|
15254 | c = !c;
|
15255 | }
|
15256 | }
|
15257 | }
|
15258 | return c;
|
15259 | }
|
15260 | function polygonContainsPoint(ring, p) {
|
15261 | let c = false;
|
15262 | for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
|
15263 | const p1 = ring[i];
|
15264 | const p2 = ring[j];
|
15265 | if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {
|
15266 | c = !c;
|
15267 | }
|
15268 | }
|
15269 | return c;
|
15270 | }
|
15271 | function polygonIntersectsBox(ring, boxX1, boxY1, boxX2, boxY2) {
|
15272 | for (const p of ring) {
|
15273 | if (boxX1 <= p.x &&
|
15274 | boxY1 <= p.y &&
|
15275 | boxX2 >= p.x &&
|
15276 | boxY2 >= p.y)
|
15277 | return true;
|
15278 | }
|
15279 | const corners = [
|
15280 | new pointGeometry(boxX1, boxY1),
|
15281 | new pointGeometry(boxX1, boxY2),
|
15282 | new pointGeometry(boxX2, boxY2),
|
15283 | new pointGeometry(boxX2, boxY1)
|
15284 | ];
|
15285 | if (ring.length > 2) {
|
15286 | for (const corner of corners) {
|
15287 | if (polygonContainsPoint(ring, corner))
|
15288 | return true;
|
15289 | }
|
15290 | }
|
15291 | for (let i = 0; i < ring.length - 1; i++) {
|
15292 | const p1 = ring[i];
|
15293 | const p2 = ring[i + 1];
|
15294 | if (edgeIntersectsBox(p1, p2, corners))
|
15295 | return true;
|
15296 | }
|
15297 | return false;
|
15298 | }
|
15299 | function edgeIntersectsBox(e1, e2, corners) {
|
15300 | const tl = corners[0];
|
15301 | const br = corners[2];
|
15302 | // the edge and box do not intersect in either the x or y dimensions
|
15303 | if (((e1.x < tl.x) && (e2.x < tl.x)) ||
|
15304 | ((e1.x > br.x) && (e2.x > br.x)) ||
|
15305 | ((e1.y < tl.y) && (e2.y < tl.y)) ||
|
15306 | ((e1.y > br.y) && (e2.y > br.y)))
|
15307 | return false;
|
15308 | // check if all corners of the box are on the same side of the edge
|
15309 | const dir = isCounterClockwise(e1, e2, corners[0]);
|
15310 | return dir !== isCounterClockwise(e1, e2, corners[1]) ||
|
15311 | dir !== isCounterClockwise(e1, e2, corners[2]) ||
|
15312 | dir !== isCounterClockwise(e1, e2, corners[3]);
|
15313 | }
|
15314 |
|
15315 | function getMaximumPaintValue(property, layer, bucket) {
|
15316 | const value = layer.paint.get(property).value;
|
15317 | if (value.kind === 'constant') {
|
15318 | return value.value;
|
15319 | }
|
15320 | else {
|
15321 | return bucket.programConfigurations.get(layer.id).getMaxValue(property);
|
15322 | }
|
15323 | }
|
15324 | function translateDistance(translate) {
|
15325 | return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]);
|
15326 | }
|
15327 | function translate$4(queryGeometry, translate, translateAnchor, bearing, pixelsToTileUnits) {
|
15328 | if (!translate[0] && !translate[1]) {
|
15329 | return queryGeometry;
|
15330 | }
|
15331 | const pt = pointGeometry.convert(translate)._mult(pixelsToTileUnits);
|
15332 | if (translateAnchor === 'viewport') {
|
15333 | pt._rotate(-bearing);
|
15334 | }
|
15335 | const translated = [];
|
15336 | for (let i = 0; i < queryGeometry.length; i++) {
|
15337 | const point = queryGeometry[i];
|
15338 | translated.push(point.sub(pt));
|
15339 | }
|
15340 | return translated;
|
15341 | }
|
15342 | function offsetLine(rings, offset) {
|
15343 | const newRings = [];
|
15344 | for (let ringIndex = 0; ringIndex < rings.length; ringIndex++) {
|
15345 | const ring = rings[ringIndex];
|
15346 | const newRing = [];
|
15347 | for (let index = 0; index < ring.length; index++) {
|
15348 | const a = ring[index - 1];
|
15349 | const b = ring[index];
|
15350 | const c = ring[index + 1];
|
15351 | const aToB = index === 0 ? new pointGeometry(0, 0) : b.sub(a)._unit()._perp();
|
15352 | const bToC = index === ring.length - 1 ? new pointGeometry(0, 0) : c.sub(b)._unit()._perp();
|
15353 | const extrude = aToB._add(bToC)._unit();
|
15354 | const cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y;
|
15355 | if (cosHalfAngle !== 0) {
|
15356 | extrude._mult(1 / cosHalfAngle);
|
15357 | }
|
15358 | newRing.push(extrude._mult(offset)._add(b));
|
15359 | }
|
15360 | newRings.push(newRing);
|
15361 | }
|
15362 | return newRings;
|
15363 | }
|
15364 |
|
15365 | // This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
|
15366 | const layout$5 = new Properties({
|
15367 | "circle-sort-key": new DataDrivenProperty(spec["layout_circle"]["circle-sort-key"]),
|
15368 | });
|
15369 | const paint$8 = new Properties({
|
15370 | "circle-radius": new DataDrivenProperty(spec["paint_circle"]["circle-radius"]),
|
15371 | "circle-color": new DataDrivenProperty(spec["paint_circle"]["circle-color"]),
|
15372 | "circle-blur": new DataDrivenProperty(spec["paint_circle"]["circle-blur"]),
|
15373 | "circle-opacity": new DataDrivenProperty(spec["paint_circle"]["circle-opacity"]),
|
15374 | "circle-translate": new DataConstantProperty(spec["paint_circle"]["circle-translate"]),
|
15375 | "circle-translate-anchor": new DataConstantProperty(spec["paint_circle"]["circle-translate-anchor"]),
|
15376 | "circle-pitch-scale": new DataConstantProperty(spec["paint_circle"]["circle-pitch-scale"]),
|
15377 | "circle-pitch-alignment": new DataConstantProperty(spec["paint_circle"]["circle-pitch-alignment"]),
|
15378 | "circle-stroke-width": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-width"]),
|
15379 | "circle-stroke-color": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-color"]),
|
15380 | "circle-stroke-opacity": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-opacity"]),
|
15381 | });
|
15382 | var properties$8 = { paint: paint$8, layout: layout$5 };
|
15383 |
|
15384 | /**
|
15385 | * Common utilities
|
15386 | * @module glMatrix
|
15387 | */
|
15388 | // Configuration Constants
|
15389 | var EPSILON = 0.000001;
|
15390 | var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;
|
15391 | var RANDOM = Math.random;
|
15392 | /**
|
15393 | * Sets the type of array used when creating new vectors and matrices
|
15394 | *
|
15395 | * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array
|
15396 | */
|
15397 |
|
15398 | function setMatrixArrayType(type) {
|
15399 | ARRAY_TYPE = type;
|
15400 | }
|
15401 | var degree = Math.PI / 180;
|
15402 | /**
|
15403 | * Convert Degree To Radian
|
15404 | *
|
15405 | * @param {Number} a Angle in Degrees
|
15406 | */
|
15407 |
|
15408 | function toRadian(a) {
|
15409 | return a * degree;
|
15410 | }
|
15411 | /**
|
15412 | * Tests whether or not the arguments have approximately the same value, within an absolute
|
15413 | * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less
|
15414 | * than or equal to 1.0, and a relative tolerance is used for larger values)
|
15415 | *
|
15416 | * @param {Number} a The first number to test.
|
15417 | * @param {Number} b The second number to test.
|
15418 | * @returns {Boolean} True if the numbers are approximately equal, false otherwise.
|
15419 | */
|
15420 |
|
15421 | function equals$a(a, b) {
|
15422 | return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));
|
15423 | }
|
15424 | if (!Math.hypot) Math.hypot = function () {
|
15425 | var y = 0,
|
15426 | i = arguments.length;
|
15427 |
|
15428 | while (i--) {
|
15429 | y += arguments[i] * arguments[i];
|
15430 | }
|
15431 |
|
15432 | return Math.sqrt(y);
|
15433 | };
|
15434 |
|
15435 | var common = /*#__PURE__*/Object.freeze({
|
15436 | __proto__: null,
|
15437 | EPSILON: EPSILON,
|
15438 | get ARRAY_TYPE () { return ARRAY_TYPE; },
|
15439 | RANDOM: RANDOM,
|
15440 | setMatrixArrayType: setMatrixArrayType,
|
15441 | toRadian: toRadian,
|
15442 | equals: equals$a
|
15443 | });
|
15444 |
|
15445 | /**
|
15446 | * 2x2 Matrix
|
15447 | * @module mat2
|
15448 | */
|
15449 |
|
15450 | /**
|
15451 | * Creates a new identity mat2
|
15452 | *
|
15453 | * @returns {mat2} a new 2x2 matrix
|
15454 | */
|
15455 |
|
15456 | function create$8() {
|
15457 | var out = new ARRAY_TYPE(4);
|
15458 |
|
15459 | if (ARRAY_TYPE != Float32Array) {
|
15460 | out[1] = 0;
|
15461 | out[2] = 0;
|
15462 | }
|
15463 |
|
15464 | out[0] = 1;
|
15465 | out[3] = 1;
|
15466 | return out;
|
15467 | }
|
15468 | /**
|
15469 | * Creates a new mat2 initialized with values from an existing matrix
|
15470 | *
|
15471 | * @param {ReadonlyMat2} a matrix to clone
|
15472 | * @returns {mat2} a new 2x2 matrix
|
15473 | */
|
15474 |
|
15475 | function clone$8(a) {
|
15476 | var out = new ARRAY_TYPE(4);
|
15477 | out[0] = a[0];
|
15478 | out[1] = a[1];
|
15479 | out[2] = a[2];
|
15480 | out[3] = a[3];
|
15481 | return out;
|
15482 | }
|
15483 | /**
|
15484 | * Copy the values from one mat2 to another
|
15485 | *
|
15486 | * @param {mat2} out the receiving matrix
|
15487 | * @param {ReadonlyMat2} a the source matrix
|
15488 | * @returns {mat2} out
|
15489 | */
|
15490 |
|
15491 | function copy$8(out, a) {
|
15492 | out[0] = a[0];
|
15493 | out[1] = a[1];
|
15494 | out[2] = a[2];
|
15495 | out[3] = a[3];
|
15496 | return out;
|
15497 | }
|
15498 | /**
|
15499 | * Set a mat2 to the identity matrix
|
15500 | *
|
15501 | * @param {mat2} out the receiving matrix
|
15502 | * @returns {mat2} out
|
15503 | */
|
15504 |
|
15505 | function identity$5(out) {
|
15506 | out[0] = 1;
|
15507 | out[1] = 0;
|
15508 | out[2] = 0;
|
15509 | out[3] = 1;
|
15510 | return out;
|
15511 | }
|
15512 | /**
|
15513 | * Create a new mat2 with the given values
|
15514 | *
|
15515 | * @param {Number} m00 Component in column 0, row 0 position (index 0)
|
15516 | * @param {Number} m01 Component in column 0, row 1 position (index 1)
|
15517 | * @param {Number} m10 Component in column 1, row 0 position (index 2)
|
15518 | * @param {Number} m11 Component in column 1, row 1 position (index 3)
|
15519 | * @returns {mat2} out A new 2x2 matrix
|
15520 | */
|
15521 |
|
15522 | function fromValues$8(m00, m01, m10, m11) {
|
15523 | var out = new ARRAY_TYPE(4);
|
15524 | out[0] = m00;
|
15525 | out[1] = m01;
|
15526 | out[2] = m10;
|
15527 | out[3] = m11;
|
15528 | return out;
|
15529 | }
|
15530 | /**
|
15531 | * Set the components of a mat2 to the given values
|
15532 | *
|
15533 | * @param {mat2} out the receiving matrix
|
15534 | * @param {Number} m00 Component in column 0, row 0 position (index 0)
|
15535 | * @param {Number} m01 Component in column 0, row 1 position (index 1)
|
15536 | * @param {Number} m10 Component in column 1, row 0 position (index 2)
|
15537 | * @param {Number} m11 Component in column 1, row 1 position (index 3)
|
15538 | * @returns {mat2} out
|
15539 | */
|
15540 |
|
15541 | function set$8(out, m00, m01, m10, m11) {
|
15542 | out[0] = m00;
|
15543 | out[1] = m01;
|
15544 | out[2] = m10;
|
15545 | out[3] = m11;
|
15546 | return out;
|
15547 | }
|
15548 | /**
|
15549 | * Transpose the values of a mat2
|
15550 | *
|
15551 | * @param {mat2} out the receiving matrix
|
15552 | * @param {ReadonlyMat2} a the source matrix
|
15553 | * @returns {mat2} out
|
15554 | */
|
15555 |
|
15556 | function transpose$2(out, a) {
|
15557 | // If we are transposing ourselves we can skip a few steps but have to cache
|
15558 | // some values
|
15559 | if (out === a) {
|
15560 | var a1 = a[1];
|
15561 | out[1] = a[2];
|
15562 | out[2] = a1;
|
15563 | } else {
|
15564 | out[0] = a[0];
|
15565 | out[1] = a[2];
|
15566 | out[2] = a[1];
|
15567 | out[3] = a[3];
|
15568 | }
|
15569 |
|
15570 | return out;
|
15571 | }
|
15572 | /**
|
15573 | * Inverts a mat2
|
15574 | *
|
15575 | * @param {mat2} out the receiving matrix
|
15576 | * @param {ReadonlyMat2} a the source matrix
|
15577 | * @returns {mat2} out
|
15578 | */
|
15579 |
|
15580 | function invert$5(out, a) {
|
15581 | var a0 = a[0],
|
15582 | a1 = a[1],
|
15583 | a2 = a[2],
|
15584 | a3 = a[3]; // Calculate the determinant
|
15585 |
|
15586 | var det = a0 * a3 - a2 * a1;
|
15587 |
|
15588 | if (!det) {
|
15589 | return null;
|
15590 | }
|
15591 |
|
15592 | det = 1.0 / det;
|
15593 | out[0] = a3 * det;
|
15594 | out[1] = -a1 * det;
|
15595 | out[2] = -a2 * det;
|
15596 | out[3] = a0 * det;
|
15597 | return out;
|
15598 | }
|
15599 | /**
|
15600 | * Calculates the adjugate of a mat2
|
15601 | *
|
15602 | * @param {mat2} out the receiving matrix
|
15603 | * @param {ReadonlyMat2} a the source matrix
|
15604 | * @returns {mat2} out
|
15605 | */
|
15606 |
|
15607 | function adjoint$2(out, a) {
|
15608 | // Caching this value is nessecary if out == a
|
15609 | var a0 = a[0];
|
15610 | out[0] = a[3];
|
15611 | out[1] = -a[1];
|
15612 | out[2] = -a[2];
|
15613 | out[3] = a0;
|
15614 | return out;
|
15615 | }
|
15616 | /**
|
15617 | * Calculates the determinant of a mat2
|
15618 | *
|
15619 | * @param {ReadonlyMat2} a the source matrix
|
15620 | * @returns {Number} determinant of a
|
15621 | */
|
15622 |
|
15623 | function determinant$3(a) {
|
15624 | return a[0] * a[3] - a[2] * a[1];
|
15625 | }
|
15626 | /**
|
15627 | * Multiplies two mat2's
|
15628 | *
|
15629 | * @param {mat2} out the receiving matrix
|
15630 | * @param {ReadonlyMat2} a the first operand
|
15631 | * @param {ReadonlyMat2} b the second operand
|
15632 | * @returns {mat2} out
|
15633 | */
|
15634 |
|
15635 | function multiply$8(out, a, b) {
|
15636 | var a0 = a[0],
|
15637 | a1 = a[1],
|
15638 | a2 = a[2],
|
15639 | a3 = a[3];
|
15640 | var b0 = b[0],
|
15641 | b1 = b[1],
|
15642 | b2 = b[2],
|
15643 | b3 = b[3];
|
15644 | out[0] = a0 * b0 + a2 * b1;
|
15645 | out[1] = a1 * b0 + a3 * b1;
|
15646 | out[2] = a0 * b2 + a2 * b3;
|
15647 | out[3] = a1 * b2 + a3 * b3;
|
15648 | return out;
|
15649 | }
|
15650 | /**
|
15651 | * Rotates a mat2 by the given angle
|
15652 | *
|
15653 | * @param {mat2} out the receiving matrix
|
15654 | * @param {ReadonlyMat2} a the matrix to rotate
|
15655 | * @param {Number} rad the angle to rotate the matrix by
|
15656 | * @returns {mat2} out
|
15657 | */
|
15658 |
|
15659 | function rotate$4(out, a, rad) {
|
15660 | var a0 = a[0],
|
15661 | a1 = a[1],
|
15662 | a2 = a[2],
|
15663 | a3 = a[3];
|
15664 | var s = Math.sin(rad);
|
15665 | var c = Math.cos(rad);
|
15666 | out[0] = a0 * c + a2 * s;
|
15667 | out[1] = a1 * c + a3 * s;
|
15668 | out[2] = a0 * -s + a2 * c;
|
15669 | out[3] = a1 * -s + a3 * c;
|
15670 | return out;
|
15671 | }
|
15672 | /**
|
15673 | * Scales the mat2 by the dimensions in the given vec2
|
15674 | *
|
15675 | * @param {mat2} out the receiving matrix
|
15676 | * @param {ReadonlyMat2} a the matrix to rotate
|
15677 | * @param {ReadonlyVec2} v the vec2 to scale the matrix by
|
15678 | * @returns {mat2} out
|
15679 | **/
|
15680 |
|
15681 | function scale$8(out, a, v) {
|
15682 | var a0 = a[0],
|
15683 | a1 = a[1],
|
15684 | a2 = a[2],
|
15685 | a3 = a[3];
|
15686 | var v0 = v[0],
|
15687 | v1 = v[1];
|
15688 | out[0] = a0 * v0;
|
15689 | out[1] = a1 * v0;
|
15690 | out[2] = a2 * v1;
|
15691 | out[3] = a3 * v1;
|
15692 | return out;
|
15693 | }
|
15694 | /**
|
15695 | * Creates a matrix from a given angle
|
15696 | * This is equivalent to (but much faster than):
|
15697 | *
|
15698 | * mat2.identity(dest);
|
15699 | * mat2.rotate(dest, dest, rad);
|
15700 | *
|
15701 | * @param {mat2} out mat2 receiving operation result
|
15702 | * @param {Number} rad the angle to rotate the matrix by
|
15703 | * @returns {mat2} out
|
15704 | */
|
15705 |
|
15706 | function fromRotation$4(out, rad) {
|
15707 | var s = Math.sin(rad);
|
15708 | var c = Math.cos(rad);
|
15709 | out[0] = c;
|
15710 | out[1] = s;
|
15711 | out[2] = -s;
|
15712 | out[3] = c;
|
15713 | return out;
|
15714 | }
|
15715 | /**
|
15716 | * Creates a matrix from a vector scaling
|
15717 | * This is equivalent to (but much faster than):
|
15718 | *
|
15719 | * mat2.identity(dest);
|
15720 | * mat2.scale(dest, dest, vec);
|
15721 | *
|
15722 | * @param {mat2} out mat2 receiving operation result
|
15723 | * @param {ReadonlyVec2} v Scaling vector
|
15724 | * @returns {mat2} out
|
15725 | */
|
15726 |
|
15727 | function fromScaling$3(out, v) {
|
15728 | out[0] = v[0];
|
15729 | out[1] = 0;
|
15730 | out[2] = 0;
|
15731 | out[3] = v[1];
|
15732 | return out;
|
15733 | }
|
15734 | /**
|
15735 | * Returns a string representation of a mat2
|
15736 | *
|
15737 | * @param {ReadonlyMat2} a matrix to represent as a string
|
15738 | * @returns {String} string representation of the matrix
|
15739 | */
|
15740 |
|
15741 | function str$8(a) {
|
15742 | return "mat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")";
|
15743 | }
|
15744 | /**
|
15745 | * Returns Frobenius norm of a mat2
|
15746 | *
|
15747 | * @param {ReadonlyMat2} a the matrix to calculate Frobenius norm of
|
15748 | * @returns {Number} Frobenius norm
|
15749 | */
|
15750 |
|
15751 | function frob$3(a) {
|
15752 | return Math.hypot(a[0], a[1], a[2], a[3]);
|
15753 | }
|
15754 | /**
|
15755 | * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix
|
15756 | * @param {ReadonlyMat2} L the lower triangular matrix
|
15757 | * @param {ReadonlyMat2} D the diagonal matrix
|
15758 | * @param {ReadonlyMat2} U the upper triangular matrix
|
15759 | * @param {ReadonlyMat2} a the input matrix to factorize
|
15760 | */
|
15761 |
|
15762 | function LDU(L, D, U, a) {
|
15763 | L[2] = a[2] / a[0];
|
15764 | U[0] = a[0];
|
15765 | U[1] = a[1];
|
15766 | U[3] = a[3] - L[2] * U[1];
|
15767 | return [L, D, U];
|
15768 | }
|
15769 | /**
|
15770 | * Adds two mat2's
|
15771 | *
|
15772 | * @param {mat2} out the receiving matrix
|
15773 | * @param {ReadonlyMat2} a the first operand
|
15774 | * @param {ReadonlyMat2} b the second operand
|
15775 | * @returns {mat2} out
|
15776 | */
|
15777 |
|
15778 | function add$8(out, a, b) {
|
15779 | out[0] = a[0] + b[0];
|
15780 | out[1] = a[1] + b[1];
|
15781 | out[2] = a[2] + b[2];
|
15782 | out[3] = a[3] + b[3];
|
15783 | return out;
|
15784 | }
|
15785 | /**
|
15786 | * Subtracts matrix b from matrix a
|
15787 | *
|
15788 | * @param {mat2} out the receiving matrix
|
15789 | * @param {ReadonlyMat2} a the first operand
|
15790 | * @param {ReadonlyMat2} b the second operand
|
15791 | * @returns {mat2} out
|
15792 | */
|
15793 |
|
15794 | function subtract$6(out, a, b) {
|
15795 | out[0] = a[0] - b[0];
|
15796 | out[1] = a[1] - b[1];
|
15797 | out[2] = a[2] - b[2];
|
15798 | out[3] = a[3] - b[3];
|
15799 | return out;
|
15800 | }
|
15801 | /**
|
15802 | * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)
|
15803 | *
|
15804 | * @param {ReadonlyMat2} a The first matrix.
|
15805 | * @param {ReadonlyMat2} b The second matrix.
|
15806 | * @returns {Boolean} True if the matrices are equal, false otherwise.
|
15807 | */
|
15808 |
|
15809 | function exactEquals$8(a, b) {
|
15810 | return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];
|
15811 | }
|
15812 | /**
|
15813 | * Returns whether or not the matrices have approximately the same elements in the same position.
|
15814 | *
|
15815 | * @param {ReadonlyMat2} a The first matrix.
|
15816 | * @param {ReadonlyMat2} b The second matrix.
|
15817 | * @returns {Boolean} True if the matrices are equal, false otherwise.
|
15818 | */
|
15819 |
|
15820 | function equals$9(a, b) {
|
15821 | var a0 = a[0],
|
15822 | a1 = a[1],
|
15823 | a2 = a[2],
|
15824 | a3 = a[3];
|
15825 | var b0 = b[0],
|
15826 | b1 = b[1],
|
15827 | b2 = b[2],
|
15828 | b3 = b[3];
|
15829 | return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));
|
15830 | }
|
15831 | /**
|
15832 | * Multiply each element of the matrix by a scalar.
|
15833 | *
|
15834 | * @param {mat2} out the receiving matrix
|
15835 | * @param {ReadonlyMat2} a the matrix to scale
|
15836 | * @param {Number} b amount to scale the matrix's elements by
|
15837 | * @returns {mat2} out
|
15838 | */
|
15839 |
|
15840 | function multiplyScalar$3(out, a, b) {
|
15841 | out[0] = a[0] * b;
|
15842 | out[1] = a[1] * b;
|
15843 | out[2] = a[2] * b;
|
15844 | out[3] = a[3] * b;
|
15845 | return out;
|
15846 | }
|
15847 | /**
|
15848 | * Adds two mat2's after multiplying each element of the second operand by a scalar value.
|
15849 | *
|
15850 | * @param {mat2} out the receiving vector
|
15851 | * @param {ReadonlyMat2} a the first operand
|
15852 | * @param {ReadonlyMat2} b the second operand
|
15853 | * @param {Number} scale the amount to scale b's elements by before adding
|
15854 | * @returns {mat2} out
|
15855 | */
|
15856 |
|
15857 | function multiplyScalarAndAdd$3(out, a, b, scale) {
|
15858 | out[0] = a[0] + b[0] * scale;
|
15859 | out[1] = a[1] + b[1] * scale;
|
15860 | out[2] = a[2] + b[2] * scale;
|
15861 | out[3] = a[3] + b[3] * scale;
|
15862 | return out;
|
15863 | }
|
15864 | /**
|
15865 | * Alias for {@link mat2.multiply}
|
15866 | * @function
|
15867 | */
|
15868 |
|
15869 | var mul$8 = multiply$8;
|
15870 | /**
|
15871 | * Alias for {@link mat2.subtract}
|
15872 | * @function
|
15873 | */
|
15874 |
|
15875 | var sub$6 = subtract$6;
|
15876 |
|
15877 | var mat2 = /*#__PURE__*/Object.freeze({
|
15878 | __proto__: null,
|
15879 | create: create$8,
|
15880 | clone: clone$8,
|
15881 | copy: copy$8,
|
15882 | identity: identity$5,
|
15883 | fromValues: fromValues$8,
|
15884 | set: set$8,
|
15885 | transpose: transpose$2,
|
15886 | invert: invert$5,
|
15887 | adjoint: adjoint$2,
|
15888 | determinant: determinant$3,
|
15889 | multiply: multiply$8,
|
15890 | rotate: rotate$4,
|
15891 | scale: scale$8,
|
15892 | fromRotation: fromRotation$4,
|
15893 | fromScaling: fromScaling$3,
|
15894 | str: str$8,
|
15895 | frob: frob$3,
|
15896 | LDU: LDU,
|
15897 | add: add$8,
|
15898 | subtract: subtract$6,
|
15899 | exactEquals: exactEquals$8,
|
15900 | equals: equals$9,
|
15901 | multiplyScalar: multiplyScalar$3,
|
15902 | multiplyScalarAndAdd: multiplyScalarAndAdd$3,
|
15903 | mul: mul$8,
|
15904 | sub: sub$6
|
15905 | });
|
15906 |
|
15907 | /**
|
15908 | * 2x3 Matrix
|
15909 | * @module mat2d
|
15910 | * @description
|
15911 | * A mat2d contains six elements defined as:
|
15912 | * <pre>
|
15913 | * [a, b,
|
15914 | * c, d,
|
15915 | * tx, ty]
|
15916 | * </pre>
|
15917 | * This is a short form for the 3x3 matrix:
|
15918 | * <pre>
|
15919 | * [a, b, 0,
|
15920 | * c, d, 0,
|
15921 | * tx, ty, 1]
|
15922 | * </pre>
|
15923 | * The last column is ignored so the array is shorter and operations are faster.
|
15924 | */
|
15925 |
|
15926 | /**
|
15927 | * Creates a new identity mat2d
|
15928 | *
|
15929 | * @returns {mat2d} a new 2x3 matrix
|
15930 | */
|
15931 |
|
15932 | function create$7() {
|
15933 | var out = new ARRAY_TYPE(6);
|
15934 |
|
15935 | if (ARRAY_TYPE != Float32Array) {
|
15936 | out[1] = 0;
|
15937 | out[2] = 0;
|
15938 | out[4] = 0;
|
15939 | out[5] = 0;
|
15940 | }
|
15941 |
|
15942 | out[0] = 1;
|
15943 | out[3] = 1;
|
15944 | return out;
|
15945 | }
|
15946 | /**
|
15947 | * Creates a new mat2d initialized with values from an existing matrix
|
15948 | *
|
15949 | * @param {ReadonlyMat2d} a matrix to clone
|
15950 | * @returns {mat2d} a new 2x3 matrix
|
15951 | */
|
15952 |
|
15953 | function clone$7(a) {
|
15954 | var out = new ARRAY_TYPE(6);
|
15955 | out[0] = a[0];
|
15956 | out[1] = a[1];
|
15957 | out[2] = a[2];
|
15958 | out[3] = a[3];
|
15959 | out[4] = a[4];
|
15960 | out[5] = a[5];
|
15961 | return out;
|
15962 | }
|
15963 | /**
|
15964 | * Copy the values from one mat2d to another
|
15965 | *
|
15966 | * @param {mat2d} out the receiving matrix
|
15967 | * @param {ReadonlyMat2d} a the source matrix
|
15968 | * @returns {mat2d} out
|
15969 | */
|
15970 |
|
15971 | function copy$7(out, a) {
|
15972 | out[0] = a[0];
|
15973 | out[1] = a[1];
|
15974 | out[2] = a[2];
|
15975 | out[3] = a[3];
|
15976 | out[4] = a[4];
|
15977 | out[5] = a[5];
|
15978 | return out;
|
15979 | }
|
15980 | /**
|
15981 | * Set a mat2d to the identity matrix
|
15982 | *
|
15983 | * @param {mat2d} out the receiving matrix
|
15984 | * @returns {mat2d} out
|
15985 | */
|
15986 |
|
15987 | function identity$4(out) {
|
15988 | out[0] = 1;
|
15989 | out[1] = 0;
|
15990 | out[2] = 0;
|
15991 | out[3] = 1;
|
15992 | out[4] = 0;
|
15993 | out[5] = 0;
|
15994 | return out;
|
15995 | }
|
15996 | /**
|
15997 | * Create a new mat2d with the given values
|
15998 | *
|
15999 | * @param {Number} a Component A (index 0)
|
16000 | * @param {Number} b Component B (index 1)
|
16001 | * @param {Number} c Component C (index 2)
|
16002 | * @param {Number} d Component D (index 3)
|
16003 | * @param {Number} tx Component TX (index 4)
|
16004 | * @param {Number} ty Component TY (index 5)
|
16005 | * @returns {mat2d} A new mat2d
|
16006 | */
|
16007 |
|
16008 | function fromValues$7(a, b, c, d, tx, ty) {
|
16009 | var out = new ARRAY_TYPE(6);
|
16010 | out[0] = a;
|
16011 | out[1] = b;
|
16012 | out[2] = c;
|
16013 | out[3] = d;
|
16014 | out[4] = tx;
|
16015 | out[5] = ty;
|
16016 | return out;
|
16017 | }
|
16018 | /**
|
16019 | * Set the components of a mat2d to the given values
|
16020 | *
|
16021 | * @param {mat2d} out the receiving matrix
|
16022 | * @param {Number} a Component A (index 0)
|
16023 | * @param {Number} b Component B (index 1)
|
16024 | * @param {Number} c Component C (index 2)
|
16025 | * @param {Number} d Component D (index 3)
|
16026 | * @param {Number} tx Component TX (index 4)
|
16027 | * @param {Number} ty Component TY (index 5)
|
16028 | * @returns {mat2d} out
|
16029 | */
|
16030 |
|
16031 | function set$7(out, a, b, c, d, tx, ty) {
|
16032 | out[0] = a;
|
16033 | out[1] = b;
|
16034 | out[2] = c;
|
16035 | out[3] = d;
|
16036 | out[4] = tx;
|
16037 | out[5] = ty;
|
16038 | return out;
|
16039 | }
|
16040 | /**
|
16041 | * Inverts a mat2d
|
16042 | *
|
16043 | * @param {mat2d} out the receiving matrix
|
16044 | * @param {ReadonlyMat2d} a the source matrix
|
16045 | * @returns {mat2d} out
|
16046 | */
|
16047 |
|
16048 | function invert$4(out, a) {
|
16049 | var aa = a[0],
|
16050 | ab = a[1],
|
16051 | ac = a[2],
|
16052 | ad = a[3];
|
16053 | var atx = a[4],
|
16054 | aty = a[5];
|
16055 | var det = aa * ad - ab * ac;
|
16056 |
|
16057 | if (!det) {
|
16058 | return null;
|
16059 | }
|
16060 |
|
16061 | det = 1.0 / det;
|
16062 | out[0] = ad * det;
|
16063 | out[1] = -ab * det;
|
16064 | out[2] = -ac * det;
|
16065 | out[3] = aa * det;
|
16066 | out[4] = (ac * aty - ad * atx) * det;
|
16067 | out[5] = (ab * atx - aa * aty) * det;
|
16068 | return out;
|
16069 | }
|
16070 | /**
|
16071 | * Calculates the determinant of a mat2d
|
16072 | *
|
16073 | * @param {ReadonlyMat2d} a the source matrix
|
16074 | * @returns {Number} determinant of a
|
16075 | */
|
16076 |
|
16077 | function determinant$2(a) {
|
16078 | return a[0] * a[3] - a[1] * a[2];
|
16079 | }
|
16080 | /**
|
16081 | * Multiplies two mat2d's
|
16082 | *
|
16083 | * @param {mat2d} out the receiving matrix
|
16084 | * @param {ReadonlyMat2d} a the first operand
|
16085 | * @param {ReadonlyMat2d} b the second operand
|
16086 | * @returns {mat2d} out
|
16087 | */
|
16088 |
|
16089 | function multiply$7(out, a, b) {
|
16090 | var a0 = a[0],
|
16091 | a1 = a[1],
|
16092 | a2 = a[2],
|
16093 | a3 = a[3],
|
16094 | a4 = a[4],
|
16095 | a5 = a[5];
|
16096 | var b0 = b[0],
|
16097 | b1 = b[1],
|
16098 | b2 = b[2],
|
16099 | b3 = b[3],
|
16100 | b4 = b[4],
|
16101 | b5 = b[5];
|
16102 | out[0] = a0 * b0 + a2 * b1;
|
16103 | out[1] = a1 * b0 + a3 * b1;
|
16104 | out[2] = a0 * b2 + a2 * b3;
|
16105 | out[3] = a1 * b2 + a3 * b3;
|
16106 | out[4] = a0 * b4 + a2 * b5 + a4;
|
16107 | out[5] = a1 * b4 + a3 * b5 + a5;
|
16108 | return out;
|
16109 | }
|
16110 | /**
|
16111 | * Rotates a mat2d by the given angle
|
16112 | *
|
16113 | * @param {mat2d} out the receiving matrix
|
16114 | * @param {ReadonlyMat2d} a the matrix to rotate
|
16115 | * @param {Number} rad the angle to rotate the matrix by
|
16116 | * @returns {mat2d} out
|
16117 | */
|
16118 |
|
16119 | function rotate$3(out, a, rad) {
|
16120 | var a0 = a[0],
|
16121 | a1 = a[1],
|
16122 | a2 = a[2],
|
16123 | a3 = a[3],
|
16124 | a4 = a[4],
|
16125 | a5 = a[5];
|
16126 | var s = Math.sin(rad);
|
16127 | var c = Math.cos(rad);
|
16128 | out[0] = a0 * c + a2 * s;
|
16129 | out[1] = a1 * c + a3 * s;
|
16130 | out[2] = a0 * -s + a2 * c;
|
16131 | out[3] = a1 * -s + a3 * c;
|
16132 | out[4] = a4;
|
16133 | out[5] = a5;
|
16134 | return out;
|
16135 | }
|
16136 | /**
|
16137 | * Scales the mat2d by the dimensions in the given vec2
|
16138 | *
|
16139 | * @param {mat2d} out the receiving matrix
|
16140 | * @param {ReadonlyMat2d} a the matrix to translate
|
16141 | * @param {ReadonlyVec2} v the vec2 to scale the matrix by
|
16142 | * @returns {mat2d} out
|
16143 | **/
|
16144 |
|
16145 | function scale$7(out, a, v) {
|
16146 | var a0 = a[0],
|
16147 | a1 = a[1],
|
16148 | a2 = a[2],
|
16149 | a3 = a[3],
|
16150 | a4 = a[4],
|
16151 | a5 = a[5];
|
16152 | var v0 = v[0],
|
16153 | v1 = v[1];
|
16154 | out[0] = a0 * v0;
|
16155 | out[1] = a1 * v0;
|
16156 | out[2] = a2 * v1;
|
16157 | out[3] = a3 * v1;
|
16158 | out[4] = a4;
|
16159 | out[5] = a5;
|
16160 | return out;
|
16161 | }
|
16162 | /**
|
16163 | * Translates the mat2d by the dimensions in the given vec2
|
16164 | *
|
16165 | * @param {mat2d} out the receiving matrix
|
16166 | * @param {ReadonlyMat2d} a the matrix to translate
|
16167 | * @param {ReadonlyVec2} v the vec2 to translate the matrix by
|
16168 | * @returns {mat2d} out
|
16169 | **/
|
16170 |
|
16171 | function translate$3(out, a, v) {
|
16172 | var a0 = a[0],
|
16173 | a1 = a[1],
|
16174 | a2 = a[2],
|
16175 | a3 = a[3],
|
16176 | a4 = a[4],
|
16177 | a5 = a[5];
|
16178 | var v0 = v[0],
|
16179 | v1 = v[1];
|
16180 | out[0] = a0;
|
16181 | out[1] = a1;
|
16182 | out[2] = a2;
|
16183 | out[3] = a3;
|
16184 | out[4] = a0 * v0 + a2 * v1 + a4;
|
16185 | out[5] = a1 * v0 + a3 * v1 + a5;
|
16186 | return out;
|
16187 | }
|
16188 | /**
|
16189 | * Creates a matrix from a given angle
|
16190 | * This is equivalent to (but much faster than):
|
16191 | *
|
16192 | * mat2d.identity(dest);
|
16193 | * mat2d.rotate(dest, dest, rad);
|
16194 | *
|
16195 | * @param {mat2d} out mat2d receiving operation result
|
16196 | * @param {Number} rad the angle to rotate the matrix by
|
16197 | * @returns {mat2d} out
|
16198 | */
|
16199 |
|
16200 | function fromRotation$3(out, rad) {
|
16201 | var s = Math.sin(rad),
|
16202 | c = Math.cos(rad);
|
16203 | out[0] = c;
|
16204 | out[1] = s;
|
16205 | out[2] = -s;
|
16206 | out[3] = c;
|
16207 | out[4] = 0;
|
16208 | out[5] = 0;
|
16209 | return out;
|
16210 | }
|
16211 | /**
|
16212 | * Creates a matrix from a vector scaling
|
16213 | * This is equivalent to (but much faster than):
|
16214 | *
|
16215 | * mat2d.identity(dest);
|
16216 | * mat2d.scale(dest, dest, vec);
|
16217 | *
|
16218 | * @param {mat2d} out mat2d receiving operation result
|
16219 | * @param {ReadonlyVec2} v Scaling vector
|
16220 | * @returns {mat2d} out
|
16221 | */
|
16222 |
|
16223 | function fromScaling$2(out, v) {
|
16224 | out[0] = v[0];
|
16225 | out[1] = 0;
|
16226 | out[2] = 0;
|
16227 | out[3] = v[1];
|
16228 | out[4] = 0;
|
16229 | out[5] = 0;
|
16230 | return out;
|
16231 | }
|
16232 | /**
|
16233 | * Creates a matrix from a vector translation
|
16234 | * This is equivalent to (but much faster than):
|
16235 | *
|
16236 | * mat2d.identity(dest);
|
16237 | * mat2d.translate(dest, dest, vec);
|
16238 | *
|
16239 | * @param {mat2d} out mat2d receiving operation result
|
16240 | * @param {ReadonlyVec2} v Translation vector
|
16241 | * @returns {mat2d} out
|
16242 | */
|
16243 |
|
16244 | function fromTranslation$3(out, v) {
|
16245 | out[0] = 1;
|
16246 | out[1] = 0;
|
16247 | out[2] = 0;
|
16248 | out[3] = 1;
|
16249 | out[4] = v[0];
|
16250 | out[5] = v[1];
|
16251 | return out;
|
16252 | }
|
16253 | /**
|
16254 | * Returns a string representation of a mat2d
|
16255 | *
|
16256 | * @param {ReadonlyMat2d} a matrix to represent as a string
|
16257 | * @returns {String} string representation of the matrix
|
16258 | */
|
16259 |
|
16260 | function str$7(a) {
|
16261 | return "mat2d(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ")";
|
16262 | }
|
16263 | /**
|
16264 | * Returns Frobenius norm of a mat2d
|
16265 | *
|
16266 | * @param {ReadonlyMat2d} a the matrix to calculate Frobenius norm of
|
16267 | * @returns {Number} Frobenius norm
|
16268 | */
|
16269 |
|
16270 | function frob$2(a) {
|
16271 | return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], 1);
|
16272 | }
|
16273 | /**
|
16274 | * Adds two mat2d's
|
16275 | *
|
16276 | * @param {mat2d} out the receiving matrix
|
16277 | * @param {ReadonlyMat2d} a the first operand
|
16278 | * @param {ReadonlyMat2d} b the second operand
|
16279 | * @returns {mat2d} out
|
16280 | */
|
16281 |
|
16282 | function add$7(out, a, b) {
|
16283 | out[0] = a[0] + b[0];
|
16284 | out[1] = a[1] + b[1];
|
16285 | out[2] = a[2] + b[2];
|
16286 | out[3] = a[3] + b[3];
|
16287 | out[4] = a[4] + b[4];
|
16288 | out[5] = a[5] + b[5];
|
16289 | return out;
|
16290 | }
|
16291 | /**
|
16292 | * Subtracts matrix b from matrix a
|
16293 | *
|
16294 | * @param {mat2d} out the receiving matrix
|
16295 | * @param {ReadonlyMat2d} a the first operand
|
16296 | * @param {ReadonlyMat2d} b the second operand
|
16297 | * @returns {mat2d} out
|
16298 | */
|
16299 |
|
16300 | function subtract$5(out, a, b) {
|
16301 | out[0] = a[0] - b[0];
|
16302 | out[1] = a[1] - b[1];
|
16303 | out[2] = a[2] - b[2];
|
16304 | out[3] = a[3] - b[3];
|
16305 | out[4] = a[4] - b[4];
|
16306 | out[5] = a[5] - b[5];
|
16307 | return out;
|
16308 | }
|
16309 | /**
|
16310 | * Multiply each element of the matrix by a scalar.
|
16311 | *
|
16312 | * @param {mat2d} out the receiving matrix
|
16313 | * @param {ReadonlyMat2d} a the matrix to scale
|
16314 | * @param {Number} b amount to scale the matrix's elements by
|
16315 | * @returns {mat2d} out
|
16316 | */
|
16317 |
|
16318 | function multiplyScalar$2(out, a, b) {
|
16319 | out[0] = a[0] * b;
|
16320 | out[1] = a[1] * b;
|
16321 | out[2] = a[2] * b;
|
16322 | out[3] = a[3] * b;
|
16323 | out[4] = a[4] * b;
|
16324 | out[5] = a[5] * b;
|
16325 | return out;
|
16326 | }
|
16327 | /**
|
16328 | * Adds two mat2d's after multiplying each element of the second operand by a scalar value.
|
16329 | *
|
16330 | * @param {mat2d} out the receiving vector
|
16331 | * @param {ReadonlyMat2d} a the first operand
|
16332 | * @param {ReadonlyMat2d} b the second operand
|
16333 | * @param {Number} scale the amount to scale b's elements by before adding
|
16334 | * @returns {mat2d} out
|
16335 | */
|
16336 |
|
16337 | function multiplyScalarAndAdd$2(out, a, b, scale) {
|
16338 | out[0] = a[0] + b[0] * scale;
|
16339 | out[1] = a[1] + b[1] * scale;
|
16340 | out[2] = a[2] + b[2] * scale;
|
16341 | out[3] = a[3] + b[3] * scale;
|
16342 | out[4] = a[4] + b[4] * scale;
|
16343 | out[5] = a[5] + b[5] * scale;
|
16344 | return out;
|
16345 | }
|
16346 | /**
|
16347 | * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)
|
16348 | *
|
16349 | * @param {ReadonlyMat2d} a The first matrix.
|
16350 | * @param {ReadonlyMat2d} b The second matrix.
|
16351 | * @returns {Boolean} True if the matrices are equal, false otherwise.
|
16352 | */
|
16353 |
|
16354 | function exactEquals$7(a, b) {
|
16355 | return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5];
|
16356 | }
|
16357 | /**
|
16358 | * Returns whether or not the matrices have approximately the same elements in the same position.
|
16359 | *
|
16360 | * @param {ReadonlyMat2d} a The first matrix.
|
16361 | * @param {ReadonlyMat2d} b The second matrix.
|
16362 | * @returns {Boolean} True if the matrices are equal, false otherwise.
|
16363 | */
|
16364 |
|
16365 | function equals$8(a, b) {
|
16366 | var a0 = a[0],
|
16367 | a1 = a[1],
|
16368 | a2 = a[2],
|
16369 | a3 = a[3],
|
16370 | a4 = a[4],
|
16371 | a5 = a[5];
|
16372 | var b0 = b[0],
|
16373 | b1 = b[1],
|
16374 | b2 = b[2],
|
16375 | b3 = b[3],
|
16376 | b4 = b[4],
|
16377 | b5 = b[5];
|
16378 | return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5));
|
16379 | }
|
16380 | /**
|
16381 | * Alias for {@link mat2d.multiply}
|
16382 | * @function
|
16383 | */
|
16384 |
|
16385 | var mul$7 = multiply$7;
|
16386 | /**
|
16387 | * Alias for {@link mat2d.subtract}
|
16388 | * @function
|
16389 | */
|
16390 |
|
16391 | var sub$5 = subtract$5;
|
16392 |
|
16393 | var mat2d = /*#__PURE__*/Object.freeze({
|
16394 | __proto__: null,
|
16395 | create: create$7,
|
16396 | clone: clone$7,
|
16397 | copy: copy$7,
|
16398 | identity: identity$4,
|
16399 | fromValues: fromValues$7,
|
16400 | set: set$7,
|
16401 | invert: invert$4,
|
16402 | determinant: determinant$2,
|
16403 | multiply: multiply$7,
|
16404 | rotate: rotate$3,
|
16405 | scale: scale$7,
|
16406 | translate: translate$3,
|
16407 | fromRotation: fromRotation$3,
|
16408 | fromScaling: fromScaling$2,
|
16409 | fromTranslation: fromTranslation$3,
|
16410 | str: str$7,
|
16411 | frob: frob$2,
|
16412 | add: add$7,
|
16413 | subtract: subtract$5,
|
16414 | multiplyScalar: multiplyScalar$2,
|
16415 | multiplyScalarAndAdd: multiplyScalarAndAdd$2,
|
16416 | exactEquals: exactEquals$7,
|
16417 | equals: equals$8,
|
16418 | mul: mul$7,
|
16419 | sub: sub$5
|
16420 | });
|
16421 |
|
16422 | /**
|
16423 | * 3x3 Matrix
|
16424 | * @module mat3
|
16425 | */
|
16426 |
|
16427 | /**
|
16428 | * Creates a new identity mat3
|
16429 | *
|
16430 | * @returns {mat3} a new 3x3 matrix
|
16431 | */
|
16432 |
|
16433 | function create$6() {
|
16434 | var out = new ARRAY_TYPE(9);
|
16435 |
|
16436 | if (ARRAY_TYPE != Float32Array) {
|
16437 | out[1] = 0;
|
16438 | out[2] = 0;
|
16439 | out[3] = 0;
|
16440 | out[5] = 0;
|
16441 | out[6] = 0;
|
16442 | out[7] = 0;
|
16443 | }
|
16444 |
|
16445 | out[0] = 1;
|
16446 | out[4] = 1;
|
16447 | out[8] = 1;
|
16448 | return out;
|
16449 | }
|
16450 | /**
|
16451 | * Copies the upper-left 3x3 values into the given mat3.
|
16452 | *
|
16453 | * @param {mat3} out the receiving 3x3 matrix
|
16454 | * @param {ReadonlyMat4} a the source 4x4 matrix
|
16455 | * @returns {mat3} out
|
16456 | */
|
16457 |
|
16458 | function fromMat4$1(out, a) {
|
16459 | out[0] = a[0];
|
16460 | out[1] = a[1];
|
16461 | out[2] = a[2];
|
16462 | out[3] = a[4];
|
16463 | out[4] = a[5];
|
16464 | out[5] = a[6];
|
16465 | out[6] = a[8];
|
16466 | out[7] = a[9];
|
16467 | out[8] = a[10];
|
16468 | return out;
|
16469 | }
|
16470 | /**
|
16471 | * Creates a new mat3 initialized with values from an existing matrix
|
16472 | *
|
16473 | * @param {ReadonlyMat3} a matrix to clone
|
16474 | * @returns {mat3} a new 3x3 matrix
|
16475 | */
|
16476 |
|
16477 | function clone$6(a) {
|
16478 | var out = new ARRAY_TYPE(9);
|
16479 | out[0] = a[0];
|
16480 | out[1] = a[1];
|
16481 | out[2] = a[2];
|
16482 | out[3] = a[3];
|
16483 | out[4] = a[4];
|
16484 | out[5] = a[5];
|
16485 | out[6] = a[6];
|
16486 | out[7] = a[7];
|
16487 | out[8] = a[8];
|
16488 | return out;
|
16489 | }
|
16490 | /**
|
16491 | * Copy the values from one mat3 to another
|
16492 | *
|
16493 | * @param {mat3} out the receiving matrix
|
16494 | * @param {ReadonlyMat3} a the source matrix
|
16495 | * @returns {mat3} out
|
16496 | */
|
16497 |
|
16498 | function copy$6(out, a) {
|
16499 | out[0] = a[0];
|
16500 | out[1] = a[1];
|
16501 | out[2] = a[2];
|
16502 | out[3] = a[3];
|
16503 | out[4] = a[4];
|
16504 | out[5] = a[5];
|
16505 | out[6] = a[6];
|
16506 | out[7] = a[7];
|
16507 | out[8] = a[8];
|
16508 | return out;
|
16509 | }
|
16510 | /**
|
16511 | * Create a new mat3 with the given values
|
16512 | *
|
16513 | * @param {Number} m00 Component in column 0, row 0 position (index 0)
|
16514 | * @param {Number} m01 Component in column 0, row 1 position (index 1)
|
16515 | * @param {Number} m02 Component in column 0, row 2 position (index 2)
|
16516 | * @param {Number} m10 Component in column 1, row 0 position (index 3)
|
16517 | * @param {Number} m11 Component in column 1, row 1 position (index 4)
|
16518 | * @param {Number} m12 Component in column 1, row 2 position (index 5)
|
16519 | * @param {Number} m20 Component in column 2, row 0 position (index 6)
|
16520 | * @param {Number} m21 Component in column 2, row 1 position (index 7)
|
16521 | * @param {Number} m22 Component in column 2, row 2 position (index 8)
|
16522 | * @returns {mat3} A new mat3
|
16523 | */
|
16524 |
|
16525 | function fromValues$6(m00, m01, m02, m10, m11, m12, m20, m21, m22) {
|
16526 | var out = new ARRAY_TYPE(9);
|
16527 | out[0] = m00;
|
16528 | out[1] = m01;
|
16529 | out[2] = m02;
|
16530 | out[3] = m10;
|
16531 | out[4] = m11;
|
16532 | out[5] = m12;
|
16533 | out[6] = m20;
|
16534 | out[7] = m21;
|
16535 | out[8] = m22;
|
16536 | return out;
|
16537 | }
|
16538 | /**
|
16539 | * Set the components of a mat3 to the given values
|
16540 | *
|
16541 | * @param {mat3} out the receiving matrix
|
16542 | * @param {Number} m00 Component in column 0, row 0 position (index 0)
|
16543 | * @param {Number} m01 Component in column 0, row 1 position (index 1)
|
16544 | * @param {Number} m02 Component in column 0, row 2 position (index 2)
|
16545 | * @param {Number} m10 Component in column 1, row 0 position (index 3)
|
16546 | * @param {Number} m11 Component in column 1, row 1 position (index 4)
|
16547 | * @param {Number} m12 Component in column 1, row 2 position (index 5)
|
16548 | * @param {Number} m20 Component in column 2, row 0 position (index 6)
|
16549 | * @param {Number} m21 Component in column 2, row 1 position (index 7)
|
16550 | * @param {Number} m22 Component in column 2, row 2 position (index 8)
|
16551 | * @returns {mat3} out
|
16552 | */
|
16553 |
|
16554 | function set$6(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {
|
16555 | out[0] = m00;
|
16556 | out[1] = m01;
|
16557 | out[2] = m02;
|
16558 | out[3] = m10;
|
16559 | out[4] = m11;
|
16560 | out[5] = m12;
|
16561 | out[6] = m20;
|
16562 | out[7] = m21;
|
16563 | out[8] = m22;
|
16564 | return out;
|
16565 | }
|
16566 | /**
|
16567 | * Set a mat3 to the identity matrix
|
16568 | *
|
16569 | * @param {mat3} out the receiving matrix
|
16570 | * @returns {mat3} out
|
16571 | */
|
16572 |
|
16573 | function identity$3(out) {
|
16574 | out[0] = 1;
|
16575 | out[1] = 0;
|
16576 | out[2] = 0;
|
16577 | out[3] = 0;
|
16578 | out[4] = 1;
|
16579 | out[5] = 0;
|
16580 | out[6] = 0;
|
16581 | out[7] = 0;
|
16582 | out[8] = 1;
|
16583 | return out;
|
16584 | }
|
16585 | /**
|
16586 | * Transpose the values of a mat3
|
16587 | *
|
16588 | * @param {mat3} out the receiving matrix
|
16589 | * @param {ReadonlyMat3} a the source matrix
|
16590 | * @returns {mat3} out
|
16591 | */
|
16592 |
|
16593 | function transpose$1(out, a) {
|
16594 | // If we are transposing ourselves we can skip a few steps but have to cache some values
|
16595 | if (out === a) {
|
16596 | var a01 = a[1],
|
16597 | a02 = a[2],
|
16598 | a12 = a[5];
|
16599 | out[1] = a[3];
|
16600 | out[2] = a[6];
|
16601 | out[3] = a01;
|
16602 | out[5] = a[7];
|
16603 | out[6] = a02;
|
16604 | out[7] = a12;
|
16605 | } else {
|
16606 | out[0] = a[0];
|
16607 | out[1] = a[3];
|
16608 | out[2] = a[6];
|
16609 | out[3] = a[1];
|
16610 | out[4] = a[4];
|
16611 | out[5] = a[7];
|
16612 | out[6] = a[2];
|
16613 | out[7] = a[5];
|
16614 | out[8] = a[8];
|
16615 | }
|
16616 |
|
16617 | return out;
|
16618 | }
|
16619 | /**
|
16620 | * Inverts a mat3
|
16621 | *
|
16622 | * @param {mat3} out the receiving matrix
|
16623 | * @param {ReadonlyMat3} a the source matrix
|
16624 | * @returns {mat3} out
|
16625 | */
|
16626 |
|
16627 | function invert$3(out, a) {
|
16628 | var a00 = a[0],
|
16629 | a01 = a[1],
|
16630 | a02 = a[2];
|
16631 | var a10 = a[3],
|
16632 | a11 = a[4],
|
16633 | a12 = a[5];
|
16634 | var a20 = a[6],
|
16635 | a21 = a[7],
|
16636 | a22 = a[8];
|
16637 | var b01 = a22 * a11 - a12 * a21;
|
16638 | var b11 = -a22 * a10 + a12 * a20;
|
16639 | var b21 = a21 * a10 - a11 * a20; // Calculate the determinant
|
16640 |
|
16641 | var det = a00 * b01 + a01 * b11 + a02 * b21;
|
16642 |
|
16643 | if (!det) {
|
16644 | return null;
|
16645 | }
|
16646 |
|
16647 | det = 1.0 / det;
|
16648 | out[0] = b01 * det;
|
16649 | out[1] = (-a22 * a01 + a02 * a21) * det;
|
16650 | out[2] = (a12 * a01 - a02 * a11) * det;
|
16651 | out[3] = b11 * det;
|
16652 | out[4] = (a22 * a00 - a02 * a20) * det;
|
16653 | out[5] = (-a12 * a00 + a02 * a10) * det;
|
16654 | out[6] = b21 * det;
|
16655 | out[7] = (-a21 * a00 + a01 * a20) * det;
|
16656 | out[8] = (a11 * a00 - a01 * a10) * det;
|
16657 | return out;
|
16658 | }
|
16659 | /**
|
16660 | * Calculates the adjugate of a mat3
|
16661 | *
|
16662 | * @param {mat3} out the receiving matrix
|
16663 | * @param {ReadonlyMat3} a the source matrix
|
16664 | * @returns {mat3} out
|
16665 | */
|
16666 |
|
16667 | function adjoint$1(out, a) {
|
16668 | var a00 = a[0],
|
16669 | a01 = a[1],
|
16670 | a02 = a[2];
|
16671 | var a10 = a[3],
|
16672 | a11 = a[4],
|
16673 | a12 = a[5];
|
16674 | var a20 = a[6],
|
16675 | a21 = a[7],
|
16676 | a22 = a[8];
|
16677 | out[0] = a11 * a22 - a12 * a21;
|
16678 | out[1] = a02 * a21 - a01 * a22;
|
16679 | out[2] = a01 * a12 - a02 * a11;
|
16680 | out[3] = a12 * a20 - a10 * a22;
|
16681 | out[4] = a00 * a22 - a02 * a20;
|
16682 | out[5] = a02 * a10 - a00 * a12;
|
16683 | out[6] = a10 * a21 - a11 * a20;
|
16684 | out[7] = a01 * a20 - a00 * a21;
|
16685 | out[8] = a00 * a11 - a01 * a10;
|
16686 | return out;
|
16687 | }
|
16688 | /**
|
16689 | * Calculates the determinant of a mat3
|
16690 | *
|
16691 | * @param {ReadonlyMat3} a the source matrix
|
16692 | * @returns {Number} determinant of a
|
16693 | */
|
16694 |
|
16695 | function determinant$1(a) {
|
16696 | var a00 = a[0],
|
16697 | a01 = a[1],
|
16698 | a02 = a[2];
|
16699 | var a10 = a[3],
|
16700 | a11 = a[4],
|
16701 | a12 = a[5];
|
16702 | var a20 = a[6],
|
16703 | a21 = a[7],
|
16704 | a22 = a[8];
|
16705 | return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);
|
16706 | }
|
16707 | /**
|
16708 | * Multiplies two mat3's
|
16709 | *
|
16710 | * @param {mat3} out the receiving matrix
|
16711 | * @param {ReadonlyMat3} a the first operand
|
16712 | * @param {ReadonlyMat3} b the second operand
|
16713 | * @returns {mat3} out
|
16714 | */
|
16715 |
|
16716 | function multiply$6(out, a, b) {
|
16717 | var a00 = a[0],
|
16718 | a01 = a[1],
|
16719 | a02 = a[2];
|
16720 | var a10 = a[3],
|
16721 | a11 = a[4],
|
16722 | a12 = a[5];
|
16723 | var a20 = a[6],
|
16724 | a21 = a[7],
|
16725 | a22 = a[8];
|
16726 | var b00 = b[0],
|
16727 | b01 = b[1],
|
16728 | b02 = b[2];
|
16729 | var b10 = b[3],
|
16730 | b11 = b[4],
|
16731 | b12 = b[5];
|
16732 | var b20 = b[6],
|
16733 | b21 = b[7],
|
16734 | b22 = b[8];
|
16735 | out[0] = b00 * a00 + b01 * a10 + b02 * a20;
|
16736 | out[1] = b00 * a01 + b01 * a11 + b02 * a21;
|
16737 | out[2] = b00 * a02 + b01 * a12 + b02 * a22;
|
16738 | out[3] = b10 * a00 + b11 * a10 + b12 * a20;
|
16739 | out[4] = b10 * a01 + b11 * a11 + b12 * a21;
|
16740 | out[5] = b10 * a02 + b11 * a12 + b12 * a22;
|
16741 | out[6] = b20 * a00 + b21 * a10 + b22 * a20;
|
16742 | out[7] = b20 * a01 + b21 * a11 + b22 * a21;
|
16743 | out[8] = b20 * a02 + b21 * a12 + b22 * a22;
|
16744 | return out;
|
16745 | }
|
16746 | /**
|
16747 | * Translate a mat3 by the given vector
|
16748 | *
|
16749 | * @param {mat3} out the receiving matrix
|
16750 | * @param {ReadonlyMat3} a the matrix to translate
|
16751 | * @param {ReadonlyVec2} v vector to translate by
|
16752 | * @returns {mat3} out
|
16753 | */
|
16754 |
|
16755 | function translate$2(out, a, v) {
|
16756 | var a00 = a[0],
|
16757 | a01 = a[1],
|
16758 | a02 = a[2],
|
16759 | a10 = a[3],
|
16760 | a11 = a[4],
|
16761 | a12 = a[5],
|
16762 | a20 = a[6],
|
16763 | a21 = a[7],
|
16764 | a22 = a[8],
|
16765 | x = v[0],
|
16766 | y = v[1];
|
16767 | out[0] = a00;
|
16768 | out[1] = a01;
|
16769 | out[2] = a02;
|
16770 | out[3] = a10;
|
16771 | out[4] = a11;
|
16772 | out[5] = a12;
|
16773 | out[6] = x * a00 + y * a10 + a20;
|
16774 | out[7] = x * a01 + y * a11 + a21;
|
16775 | out[8] = x * a02 + y * a12 + a22;
|
16776 | return out;
|
16777 | }
|
16778 | /**
|
16779 | * Rotates a mat3 by the given angle
|
16780 | *
|
16781 | * @param {mat3} out the receiving matrix
|
16782 | * @param {ReadonlyMat3} a the matrix to rotate
|
16783 | * @param {Number} rad the angle to rotate the matrix by
|
16784 | * @returns {mat3} out
|
16785 | */
|
16786 |
|
16787 | function rotate$2(out, a, rad) {
|
16788 | var a00 = a[0],
|
16789 | a01 = a[1],
|
16790 | a02 = a[2],
|
16791 | a10 = a[3],
|
16792 | a11 = a[4],
|
16793 | a12 = a[5],
|
16794 | a20 = a[6],
|
16795 | a21 = a[7],
|
16796 | a22 = a[8],
|
16797 | s = Math.sin(rad),
|
16798 | c = Math.cos(rad);
|
16799 | out[0] = c * a00 + s * a10;
|
16800 | out[1] = c * a01 + s * a11;
|
16801 | out[2] = c * a02 + s * a12;
|
16802 | out[3] = c * a10 - s * a00;
|
16803 | out[4] = c * a11 - s * a01;
|
16804 | out[5] = c * a12 - s * a02;
|
16805 | out[6] = a20;
|
16806 | out[7] = a21;
|
16807 | out[8] = a22;
|
16808 | return out;
|
16809 | }
|
16810 | /**
|
16811 | * Scales the mat3 by the dimensions in the given vec2
|
16812 | *
|
16813 | * @param {mat3} out the receiving matrix
|
16814 | * @param {ReadonlyMat3} a the matrix to rotate
|
16815 | * @param {ReadonlyVec2} v the vec2 to scale the matrix by
|
16816 | * @returns {mat3} out
|
16817 | **/
|
16818 |
|
16819 | function scale$6(out, a, v) {
|
16820 | var x = v[0],
|
16821 | y = v[1];
|
16822 | out[0] = x * a[0];
|
16823 | out[1] = x * a[1];
|
16824 | out[2] = x * a[2];
|
16825 | out[3] = y * a[3];
|
16826 | out[4] = y * a[4];
|
16827 | out[5] = y * a[5];
|
16828 | out[6] = a[6];
|
16829 | out[7] = a[7];
|
16830 | out[8] = a[8];
|
16831 | return out;
|
16832 | }
|
16833 | /**
|
16834 | * Creates a matrix from a vector translation
|
16835 | * This is equivalent to (but much faster than):
|
16836 | *
|
16837 | * mat3.identity(dest);
|
16838 | * mat3.translate(dest, dest, vec);
|
16839 | *
|
16840 | * @param {mat3} out mat3 receiving operation result
|
16841 | * @param {ReadonlyVec2} v Translation vector
|
16842 | * @returns {mat3} out
|
16843 | */
|
16844 |
|
16845 | function fromTranslation$2(out, v) {
|
16846 | out[0] = 1;
|
16847 | out[1] = 0;
|
16848 | out[2] = 0;
|
16849 | out[3] = 0;
|
16850 | out[4] = 1;
|
16851 | out[5] = 0;
|
16852 | out[6] = v[0];
|
16853 | out[7] = v[1];
|
16854 | out[8] = 1;
|
16855 | return out;
|
16856 | }
|
16857 | /**
|
16858 | * Creates a matrix from a given angle
|
16859 | * This is equivalent to (but much faster than):
|
16860 | *
|
16861 | * mat3.identity(dest);
|
16862 | * mat3.rotate(dest, dest, rad);
|
16863 | *
|
16864 | * @param {mat3} out mat3 receiving operation result
|
16865 | * @param {Number} rad the angle to rotate the matrix by
|
16866 | * @returns {mat3} out
|
16867 | */
|
16868 |
|
16869 | function fromRotation$2(out, rad) {
|
16870 | var s = Math.sin(rad),
|
16871 | c = Math.cos(rad);
|
16872 | out[0] = c;
|
16873 | out[1] = s;
|
16874 | out[2] = 0;
|
16875 | out[3] = -s;
|
16876 | out[4] = c;
|
16877 | out[5] = 0;
|
16878 | out[6] = 0;
|
16879 | out[7] = 0;
|
16880 | out[8] = 1;
|
16881 | return out;
|
16882 | }
|
16883 | /**
|
16884 | * Creates a matrix from a vector scaling
|
16885 | * This is equivalent to (but much faster than):
|
16886 | *
|
16887 | * mat3.identity(dest);
|
16888 | * mat3.scale(dest, dest, vec);
|
16889 | *
|
16890 | * @param {mat3} out mat3 receiving operation result
|
16891 | * @param {ReadonlyVec2} v Scaling vector
|
16892 | * @returns {mat3} out
|
16893 | */
|
16894 |
|
16895 | function fromScaling$1(out, v) {
|
16896 | out[0] = v[0];
|
16897 | out[1] = 0;
|
16898 | out[2] = 0;
|
16899 | out[3] = 0;
|
16900 | out[4] = v[1];
|
16901 | out[5] = 0;
|
16902 | out[6] = 0;
|
16903 | out[7] = 0;
|
16904 | out[8] = 1;
|
16905 | return out;
|
16906 | }
|
16907 | /**
|
16908 | * Copies the values from a mat2d into a mat3
|
16909 | *
|
16910 | * @param {mat3} out the receiving matrix
|
16911 | * @param {ReadonlyMat2d} a the matrix to copy
|
16912 | * @returns {mat3} out
|
16913 | **/
|
16914 |
|
16915 | function fromMat2d(out, a) {
|
16916 | out[0] = a[0];
|
16917 | out[1] = a[1];
|
16918 | out[2] = 0;
|
16919 | out[3] = a[2];
|
16920 | out[4] = a[3];
|
16921 | out[5] = 0;
|
16922 | out[6] = a[4];
|
16923 | out[7] = a[5];
|
16924 | out[8] = 1;
|
16925 | return out;
|
16926 | }
|
16927 | /**
|
16928 | * Calculates a 3x3 matrix from the given quaternion
|
16929 | *
|
16930 | * @param {mat3} out mat3 receiving operation result
|
16931 | * @param {ReadonlyQuat} q Quaternion to create matrix from
|
16932 | *
|
16933 | * @returns {mat3} out
|
16934 | */
|
16935 |
|
16936 | function fromQuat$1(out, q) {
|
16937 | var x = q[0],
|
16938 | y = q[1],
|
16939 | z = q[2],
|
16940 | w = q[3];
|
16941 | var x2 = x + x;
|
16942 | var y2 = y + y;
|
16943 | var z2 = z + z;
|
16944 | var xx = x * x2;
|
16945 | var yx = y * x2;
|
16946 | var yy = y * y2;
|
16947 | var zx = z * x2;
|
16948 | var zy = z * y2;
|
16949 | var zz = z * z2;
|
16950 | var wx = w * x2;
|
16951 | var wy = w * y2;
|
16952 | var wz = w * z2;
|
16953 | out[0] = 1 - yy - zz;
|
16954 | out[3] = yx - wz;
|
16955 | out[6] = zx + wy;
|
16956 | out[1] = yx + wz;
|
16957 | out[4] = 1 - xx - zz;
|
16958 | out[7] = zy - wx;
|
16959 | out[2] = zx - wy;
|
16960 | out[5] = zy + wx;
|
16961 | out[8] = 1 - xx - yy;
|
16962 | return out;
|
16963 | }
|
16964 | /**
|
16965 | * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix
|
16966 | *
|
16967 | * @param {mat3} out mat3 receiving operation result
|
16968 | * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from
|
16969 | *
|
16970 | * @returns {mat3} out
|
16971 | */
|
16972 |
|
16973 | function normalFromMat4(out, a) {
|
16974 | var a00 = a[0],
|
16975 | a01 = a[1],
|
16976 | a02 = a[2],
|
16977 | a03 = a[3];
|
16978 | var a10 = a[4],
|
16979 | a11 = a[5],
|
16980 | a12 = a[6],
|
16981 | a13 = a[7];
|
16982 | var a20 = a[8],
|
16983 | a21 = a[9],
|
16984 | a22 = a[10],
|
16985 | a23 = a[11];
|
16986 | var a30 = a[12],
|
16987 | a31 = a[13],
|
16988 | a32 = a[14],
|
16989 | a33 = a[15];
|
16990 | var b00 = a00 * a11 - a01 * a10;
|
16991 | var b01 = a00 * a12 - a02 * a10;
|
16992 | var b02 = a00 * a13 - a03 * a10;
|
16993 | var b03 = a01 * a12 - a02 * a11;
|
16994 | var b04 = a01 * a13 - a03 * a11;
|
16995 | var b05 = a02 * a13 - a03 * a12;
|
16996 | var b06 = a20 * a31 - a21 * a30;
|
16997 | var b07 = a20 * a32 - a22 * a30;
|
16998 | var b08 = a20 * a33 - a23 * a30;
|
16999 | var b09 = a21 * a32 - a22 * a31;
|
17000 | var b10 = a21 * a33 - a23 * a31;
|
17001 | var b11 = a22 * a33 - a23 * a32; // Calculate the determinant
|
17002 |
|
17003 | var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
|
17004 |
|
17005 | if (!det) {
|
17006 | return null;
|
17007 | }
|
17008 |
|
17009 | det = 1.0 / det;
|
17010 | out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
|
17011 | out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
|
17012 | out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
|
17013 | out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
|
17014 | out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
|
17015 | out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
|
17016 | out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
|
17017 | out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
|
17018 | out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
|
17019 | return out;
|
17020 | }
|
17021 | /**
|
17022 | * Generates a 2D projection matrix with the given bounds
|
17023 | *
|
17024 | * @param {mat3} out mat3 frustum matrix will be written into
|
17025 | * @param {number} width Width of your gl context
|
17026 | * @param {number} height Height of gl context
|
17027 | * @returns {mat3} out
|
17028 | */
|
17029 |
|
17030 | function projection(out, width, height) {
|
17031 | out[0] = 2 / width;
|
17032 | out[1] = 0;
|
17033 | out[2] = 0;
|
17034 | out[3] = 0;
|
17035 | out[4] = -2 / height;
|
17036 | out[5] = 0;
|
17037 | out[6] = -1;
|
17038 | out[7] = 1;
|
17039 | out[8] = 1;
|
17040 | return out;
|
17041 | }
|
17042 | /**
|
17043 | * Returns a string representation of a mat3
|
17044 | *
|
17045 | * @param {ReadonlyMat3} a matrix to represent as a string
|
17046 | * @returns {String} string representation of the matrix
|
17047 | */
|
17048 |
|
17049 | function str$6(a) {
|
17050 | return "mat3(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ")";
|
17051 | }
|
17052 | /**
|
17053 | * Returns Frobenius norm of a mat3
|
17054 | *
|
17055 | * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of
|
17056 | * @returns {Number} Frobenius norm
|
17057 | */
|
17058 |
|
17059 | function frob$1(a) {
|
17060 | return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);
|
17061 | }
|
17062 | /**
|
17063 | * Adds two mat3's
|
17064 | *
|
17065 | * @param {mat3} out the receiving matrix
|
17066 | * @param {ReadonlyMat3} a the first operand
|
17067 | * @param {ReadonlyMat3} b the second operand
|
17068 | * @returns {mat3} out
|
17069 | */
|
17070 |
|
17071 | function add$6(out, a, b) {
|
17072 | out[0] = a[0] + b[0];
|
17073 | out[1] = a[1] + b[1];
|
17074 | out[2] = a[2] + b[2];
|
17075 | out[3] = a[3] + b[3];
|
17076 | out[4] = a[4] + b[4];
|
17077 | out[5] = a[5] + b[5];
|
17078 | out[6] = a[6] + b[6];
|
17079 | out[7] = a[7] + b[7];
|
17080 | out[8] = a[8] + b[8];
|
17081 | return out;
|
17082 | }
|
17083 | /**
|
17084 | * Subtracts matrix b from matrix a
|
17085 | *
|
17086 | * @param {mat3} out the receiving matrix
|
17087 | * @param {ReadonlyMat3} a the first operand
|
17088 | * @param {ReadonlyMat3} b the second operand
|
17089 | * @returns {mat3} out
|
17090 | */
|
17091 |
|
17092 | function subtract$4(out, a, b) {
|
17093 | out[0] = a[0] - b[0];
|
17094 | out[1] = a[1] - b[1];
|
17095 | out[2] = a[2] - b[2];
|
17096 | out[3] = a[3] - b[3];
|
17097 | out[4] = a[4] - b[4];
|
17098 | out[5] = a[5] - b[5];
|
17099 | out[6] = a[6] - b[6];
|
17100 | out[7] = a[7] - b[7];
|
17101 | out[8] = a[8] - b[8];
|
17102 | return out;
|
17103 | }
|
17104 | /**
|
17105 | * Multiply each element of the matrix by a scalar.
|
17106 | *
|
17107 | * @param {mat3} out the receiving matrix
|
17108 | * @param {ReadonlyMat3} a the matrix to scale
|
17109 | * @param {Number} b amount to scale the matrix's elements by
|
17110 | * @returns {mat3} out
|
17111 | */
|
17112 |
|
17113 | function multiplyScalar$1(out, a, b) {
|
17114 | out[0] = a[0] * b;
|
17115 | out[1] = a[1] * b;
|
17116 | out[2] = a[2] * b;
|
17117 | out[3] = a[3] * b;
|
17118 | out[4] = a[4] * b;
|
17119 | out[5] = a[5] * b;
|
17120 | out[6] = a[6] * b;
|
17121 | out[7] = a[7] * b;
|
17122 | out[8] = a[8] * b;
|
17123 | return out;
|
17124 | }
|
17125 | /**
|
17126 | * Adds two mat3's after multiplying each element of the second operand by a scalar value.
|
17127 | *
|
17128 | * @param {mat3} out the receiving vector
|
17129 | * @param {ReadonlyMat3} a the first operand
|
17130 | * @param {ReadonlyMat3} b the second operand
|
17131 | * @param {Number} scale the amount to scale b's elements by before adding
|
17132 | * @returns {mat3} out
|
17133 | */
|
17134 |
|
17135 | function multiplyScalarAndAdd$1(out, a, b, scale) {
|
17136 | out[0] = a[0] + b[0] * scale;
|
17137 | out[1] = a[1] + b[1] * scale;
|
17138 | out[2] = a[2] + b[2] * scale;
|
17139 | out[3] = a[3] + b[3] * scale;
|
17140 | out[4] = a[4] + b[4] * scale;
|
17141 | out[5] = a[5] + b[5] * scale;
|
17142 | out[6] = a[6] + b[6] * scale;
|
17143 | out[7] = a[7] + b[7] * scale;
|
17144 | out[8] = a[8] + b[8] * scale;
|
17145 | return out;
|
17146 | }
|
17147 | /**
|
17148 | * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)
|
17149 | *
|
17150 | * @param {ReadonlyMat3} a The first matrix.
|
17151 | * @param {ReadonlyMat3} b The second matrix.
|
17152 | * @returns {Boolean} True if the matrices are equal, false otherwise.
|
17153 | */
|
17154 |
|
17155 | function exactEquals$6(a, b) {
|
17156 | return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];
|
17157 | }
|
17158 | /**
|
17159 | * Returns whether or not the matrices have approximately the same elements in the same position.
|
17160 | *
|
17161 | * @param {ReadonlyMat3} a The first matrix.
|
17162 | * @param {ReadonlyMat3} b The second matrix.
|
17163 | * @returns {Boolean} True if the matrices are equal, false otherwise.
|
17164 | */
|
17165 |
|
17166 | function equals$7(a, b) {
|
17167 | var a0 = a[0],
|
17168 | a1 = a[1],
|
17169 | a2 = a[2],
|
17170 | a3 = a[3],
|
17171 | a4 = a[4],
|
17172 | a5 = a[5],
|
17173 | a6 = a[6],
|
17174 | a7 = a[7],
|
17175 | a8 = a[8];
|
17176 | var b0 = b[0],
|
17177 | b1 = b[1],
|
17178 | b2 = b[2],
|
17179 | b3 = b[3],
|
17180 | b4 = b[4],
|
17181 | b5 = b[5],
|
17182 | b6 = b[6],
|
17183 | b7 = b[7],
|
17184 | b8 = b[8];
|
17185 | return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));
|
17186 | }
|
17187 | /**
|
17188 | * Alias for {@link mat3.multiply}
|
17189 | * @function
|
17190 | */
|
17191 |
|
17192 | var mul$6 = multiply$6;
|
17193 | /**
|
17194 | * Alias for {@link mat3.subtract}
|
17195 | * @function
|
17196 | */
|
17197 |
|
17198 | var sub$4 = subtract$4;
|
17199 |
|
17200 | var mat3 = /*#__PURE__*/Object.freeze({
|
17201 | __proto__: null,
|
17202 | create: create$6,
|
17203 | fromMat4: fromMat4$1,
|
17204 | clone: clone$6,
|
17205 | copy: copy$6,
|
17206 | fromValues: fromValues$6,
|
17207 | set: set$6,
|
17208 | identity: identity$3,
|
17209 | transpose: transpose$1,
|
17210 | invert: invert$3,
|
17211 | adjoint: adjoint$1,
|
17212 | determinant: determinant$1,
|
17213 | multiply: multiply$6,
|
17214 | translate: translate$2,
|
17215 | rotate: rotate$2,
|
17216 | scale: scale$6,
|
17217 | fromTranslation: fromTranslation$2,
|
17218 | fromRotation: fromRotation$2,
|
17219 | fromScaling: fromScaling$1,
|
17220 | fromMat2d: fromMat2d,
|
17221 | fromQuat: fromQuat$1,
|
17222 | normalFromMat4: normalFromMat4,
|
17223 | projection: projection,
|
17224 | str: str$6,
|
17225 | frob: frob$1,
|
17226 | add: add$6,
|
17227 | subtract: subtract$4,
|
17228 | multiplyScalar: multiplyScalar$1,
|
17229 | multiplyScalarAndAdd: multiplyScalarAndAdd$1,
|
17230 | exactEquals: exactEquals$6,
|
17231 | equals: equals$7,
|
17232 | mul: mul$6,
|
17233 | sub: sub$4
|
17234 | });
|
17235 |
|
17236 | /**
|
17237 | * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.
|
17238 | * @module mat4
|
17239 | */
|
17240 |
|
17241 | /**
|
17242 | * Creates a new identity mat4
|
17243 | *
|
17244 | * @returns {mat4} a new 4x4 matrix
|
17245 | */
|
17246 |
|
17247 | function create$5() {
|
17248 | var out = new ARRAY_TYPE(16);
|
17249 |
|
17250 | if (ARRAY_TYPE != Float32Array) {
|
17251 | out[1] = 0;
|
17252 | out[2] = 0;
|
17253 | out[3] = 0;
|
17254 | out[4] = 0;
|
17255 | out[6] = 0;
|
17256 | out[7] = 0;
|
17257 | out[8] = 0;
|
17258 | out[9] = 0;
|
17259 | out[11] = 0;
|
17260 | out[12] = 0;
|
17261 | out[13] = 0;
|
17262 | out[14] = 0;
|
17263 | }
|
17264 |
|
17265 | out[0] = 1;
|
17266 | out[5] = 1;
|
17267 | out[10] = 1;
|
17268 | out[15] = 1;
|
17269 | return out;
|
17270 | }
|
17271 | /**
|
17272 | * Creates a new mat4 initialized with values from an existing matrix
|
17273 | *
|
17274 | * @param {ReadonlyMat4} a matrix to clone
|
17275 | * @returns {mat4} a new 4x4 matrix
|
17276 | */
|
17277 |
|
17278 | function clone$5(a) {
|
17279 | var out = new ARRAY_TYPE(16);
|
17280 | out[0] = a[0];
|
17281 | out[1] = a[1];
|
17282 | out[2] = a[2];
|
17283 | out[3] = a[3];
|
17284 | out[4] = a[4];
|
17285 | out[5] = a[5];
|
17286 | out[6] = a[6];
|
17287 | out[7] = a[7];
|
17288 | out[8] = a[8];
|
17289 | out[9] = a[9];
|
17290 | out[10] = a[10];
|
17291 | out[11] = a[11];
|
17292 | out[12] = a[12];
|
17293 | out[13] = a[13];
|
17294 | out[14] = a[14];
|
17295 | out[15] = a[15];
|
17296 | return out;
|
17297 | }
|
17298 | /**
|
17299 | * Copy the values from one mat4 to another
|
17300 | *
|
17301 | * @param {mat4} out the receiving matrix
|
17302 | * @param {ReadonlyMat4} a the source matrix
|
17303 | * @returns {mat4} out
|
17304 | */
|
17305 |
|
17306 | function copy$5(out, a) {
|
17307 | out[0] = a[0];
|
17308 | out[1] = a[1];
|
17309 | out[2] = a[2];
|
17310 | out[3] = a[3];
|
17311 | out[4] = a[4];
|
17312 | out[5] = a[5];
|
17313 | out[6] = a[6];
|
17314 | out[7] = a[7];
|
17315 | out[8] = a[8];
|
17316 | out[9] = a[9];
|
17317 | out[10] = a[10];
|
17318 | out[11] = a[11];
|
17319 | out[12] = a[12];
|
17320 | out[13] = a[13];
|
17321 | out[14] = a[14];
|
17322 | out[15] = a[15];
|
17323 | return out;
|
17324 | }
|
17325 | /**
|
17326 | * Create a new mat4 with the given values
|
17327 | *
|
17328 | * @param {Number} m00 Component in column 0, row 0 position (index 0)
|
17329 | * @param {Number} m01 Component in column 0, row 1 position (index 1)
|
17330 | * @param {Number} m02 Component in column 0, row 2 position (index 2)
|
17331 | * @param {Number} m03 Component in column 0, row 3 position (index 3)
|
17332 | * @param {Number} m10 Component in column 1, row 0 position (index 4)
|
17333 | * @param {Number} m11 Component in column 1, row 1 position (index 5)
|
17334 | * @param {Number} m12 Component in column 1, row 2 position (index 6)
|
17335 | * @param {Number} m13 Component in column 1, row 3 position (index 7)
|
17336 | * @param {Number} m20 Component in column 2, row 0 position (index 8)
|
17337 | * @param {Number} m21 Component in column 2, row 1 position (index 9)
|
17338 | * @param {Number} m22 Component in column 2, row 2 position (index 10)
|
17339 | * @param {Number} m23 Component in column 2, row 3 position (index 11)
|
17340 | * @param {Number} m30 Component in column 3, row 0 position (index 12)
|
17341 | * @param {Number} m31 Component in column 3, row 1 position (index 13)
|
17342 | * @param {Number} m32 Component in column 3, row 2 position (index 14)
|
17343 | * @param {Number} m33 Component in column 3, row 3 position (index 15)
|
17344 | * @returns {mat4} A new mat4
|
17345 | */
|
17346 |
|
17347 | function fromValues$5(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {
|
17348 | var out = new ARRAY_TYPE(16);
|
17349 | out[0] = m00;
|
17350 | out[1] = m01;
|
17351 | out[2] = m02;
|
17352 | out[3] = m03;
|
17353 | out[4] = m10;
|
17354 | out[5] = m11;
|
17355 | out[6] = m12;
|
17356 | out[7] = m13;
|
17357 | out[8] = m20;
|
17358 | out[9] = m21;
|
17359 | out[10] = m22;
|
17360 | out[11] = m23;
|
17361 | out[12] = m30;
|
17362 | out[13] = m31;
|
17363 | out[14] = m32;
|
17364 | out[15] = m33;
|
17365 | return out;
|
17366 | }
|
17367 | /**
|
17368 | * Set the components of a mat4 to the given values
|
17369 | *
|
17370 | * @param {mat4} out the receiving matrix
|
17371 | * @param {Number} m00 Component in column 0, row 0 position (index 0)
|
17372 | * @param {Number} m01 Component in column 0, row 1 position (index 1)
|
17373 | * @param {Number} m02 Component in column 0, row 2 position (index 2)
|
17374 | * @param {Number} m03 Component in column 0, row 3 position (index 3)
|
17375 | * @param {Number} m10 Component in column 1, row 0 position (index 4)
|
17376 | * @param {Number} m11 Component in column 1, row 1 position (index 5)
|
17377 | * @param {Number} m12 Component in column 1, row 2 position (index 6)
|
17378 | * @param {Number} m13 Component in column 1, row 3 position (index 7)
|
17379 | * @param {Number} m20 Component in column 2, row 0 position (index 8)
|
17380 | * @param {Number} m21 Component in column 2, row 1 position (index 9)
|
17381 | * @param {Number} m22 Component in column 2, row 2 position (index 10)
|
17382 | * @param {Number} m23 Component in column 2, row 3 position (index 11)
|
17383 | * @param {Number} m30 Component in column 3, row 0 position (index 12)
|
17384 | * @param {Number} m31 Component in column 3, row 1 position (index 13)
|
17385 | * @param {Number} m32 Component in column 3, row 2 position (index 14)
|
17386 | * @param {Number} m33 Component in column 3, row 3 position (index 15)
|
17387 | * @returns {mat4} out
|
17388 | */
|
17389 |
|
17390 | function set$5(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {
|
17391 | out[0] = m00;
|
17392 | out[1] = m01;
|
17393 | out[2] = m02;
|
17394 | out[3] = m03;
|
17395 | out[4] = m10;
|
17396 | out[5] = m11;
|
17397 | out[6] = m12;
|
17398 | out[7] = m13;
|
17399 | out[8] = m20;
|
17400 | out[9] = m21;
|
17401 | out[10] = m22;
|
17402 | out[11] = m23;
|
17403 | out[12] = m30;
|
17404 | out[13] = m31;
|
17405 | out[14] = m32;
|
17406 | out[15] = m33;
|
17407 | return out;
|
17408 | }
|
17409 | /**
|
17410 | * Set a mat4 to the identity matrix
|
17411 | *
|
17412 | * @param {mat4} out the receiving matrix
|
17413 | * @returns {mat4} out
|
17414 | */
|
17415 |
|
17416 | function identity$2(out) {
|
17417 | out[0] = 1;
|
17418 | out[1] = 0;
|
17419 | out[2] = 0;
|
17420 | out[3] = 0;
|
17421 | out[4] = 0;
|
17422 | out[5] = 1;
|
17423 | out[6] = 0;
|
17424 | out[7] = 0;
|
17425 | out[8] = 0;
|
17426 | out[9] = 0;
|
17427 | out[10] = 1;
|
17428 | out[11] = 0;
|
17429 | out[12] = 0;
|
17430 | out[13] = 0;
|
17431 | out[14] = 0;
|
17432 | out[15] = 1;
|
17433 | return out;
|
17434 | }
|
17435 | /**
|
17436 | * Transpose the values of a mat4
|
17437 | *
|
17438 | * @param {mat4} out the receiving matrix
|
17439 | * @param {ReadonlyMat4} a the source matrix
|
17440 | * @returns {mat4} out
|
17441 | */
|
17442 |
|
17443 | function transpose(out, a) {
|
17444 | // If we are transposing ourselves we can skip a few steps but have to cache some values
|
17445 | if (out === a) {
|
17446 | var a01 = a[1],
|
17447 | a02 = a[2],
|
17448 | a03 = a[3];
|
17449 | var a12 = a[6],
|
17450 | a13 = a[7];
|
17451 | var a23 = a[11];
|
17452 | out[1] = a[4];
|
17453 | out[2] = a[8];
|
17454 | out[3] = a[12];
|
17455 | out[4] = a01;
|
17456 | out[6] = a[9];
|
17457 | out[7] = a[13];
|
17458 | out[8] = a02;
|
17459 | out[9] = a12;
|
17460 | out[11] = a[14];
|
17461 | out[12] = a03;
|
17462 | out[13] = a13;
|
17463 | out[14] = a23;
|
17464 | } else {
|
17465 | out[0] = a[0];
|
17466 | out[1] = a[4];
|
17467 | out[2] = a[8];
|
17468 | out[3] = a[12];
|
17469 | out[4] = a[1];
|
17470 | out[5] = a[5];
|
17471 | out[6] = a[9];
|
17472 | out[7] = a[13];
|
17473 | out[8] = a[2];
|
17474 | out[9] = a[6];
|
17475 | out[10] = a[10];
|
17476 | out[11] = a[14];
|
17477 | out[12] = a[3];
|
17478 | out[13] = a[7];
|
17479 | out[14] = a[11];
|
17480 | out[15] = a[15];
|
17481 | }
|
17482 |
|
17483 | return out;
|
17484 | }
|
17485 | /**
|
17486 | * Inverts a mat4
|
17487 | *
|
17488 | * @param {mat4} out the receiving matrix
|
17489 | * @param {ReadonlyMat4} a the source matrix
|
17490 | * @returns {mat4} out
|
17491 | */
|
17492 |
|
17493 | function invert$2(out, a) {
|
17494 | var a00 = a[0],
|
17495 | a01 = a[1],
|
17496 | a02 = a[2],
|
17497 | a03 = a[3];
|
17498 | var a10 = a[4],
|
17499 | a11 = a[5],
|
17500 | a12 = a[6],
|
17501 | a13 = a[7];
|
17502 | var a20 = a[8],
|
17503 | a21 = a[9],
|
17504 | a22 = a[10],
|
17505 | a23 = a[11];
|
17506 | var a30 = a[12],
|
17507 | a31 = a[13],
|
17508 | a32 = a[14],
|
17509 | a33 = a[15];
|
17510 | var b00 = a00 * a11 - a01 * a10;
|
17511 | var b01 = a00 * a12 - a02 * a10;
|
17512 | var b02 = a00 * a13 - a03 * a10;
|
17513 | var b03 = a01 * a12 - a02 * a11;
|
17514 | var b04 = a01 * a13 - a03 * a11;
|
17515 | var b05 = a02 * a13 - a03 * a12;
|
17516 | var b06 = a20 * a31 - a21 * a30;
|
17517 | var b07 = a20 * a32 - a22 * a30;
|
17518 | var b08 = a20 * a33 - a23 * a30;
|
17519 | var b09 = a21 * a32 - a22 * a31;
|
17520 | var b10 = a21 * a33 - a23 * a31;
|
17521 | var b11 = a22 * a33 - a23 * a32; // Calculate the determinant
|
17522 |
|
17523 | var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
|
17524 |
|
17525 | if (!det) {
|
17526 | return null;
|
17527 | }
|
17528 |
|
17529 | det = 1.0 / det;
|
17530 | out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
|
17531 | out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
|
17532 | out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
|
17533 | out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;
|
17534 | out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
|
17535 | out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
|
17536 | out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
|
17537 | out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;
|
17538 | out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
|
17539 | out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
|
17540 | out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
|
17541 | out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;
|
17542 | out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;
|
17543 | out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;
|
17544 | out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;
|
17545 | out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;
|
17546 | return out;
|
17547 | }
|
17548 | /**
|
17549 | * Calculates the adjugate of a mat4
|
17550 | *
|
17551 | * @param {mat4} out the receiving matrix
|
17552 | * @param {ReadonlyMat4} a the source matrix
|
17553 | * @returns {mat4} out
|
17554 | */
|
17555 |
|
17556 | function adjoint(out, a) {
|
17557 | var a00 = a[0],
|
17558 | a01 = a[1],
|
17559 | a02 = a[2],
|
17560 | a03 = a[3];
|
17561 | var a10 = a[4],
|
17562 | a11 = a[5],
|
17563 | a12 = a[6],
|
17564 | a13 = a[7];
|
17565 | var a20 = a[8],
|
17566 | a21 = a[9],
|
17567 | a22 = a[10],
|
17568 | a23 = a[11];
|
17569 | var a30 = a[12],
|
17570 | a31 = a[13],
|
17571 | a32 = a[14],
|
17572 | a33 = a[15];
|
17573 | out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);
|
17574 | out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));
|
17575 | out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);
|
17576 | out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));
|
17577 | out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));
|
17578 | out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);
|
17579 | out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));
|
17580 | out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);
|
17581 | out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);
|
17582 | out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));
|
17583 | out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);
|
17584 | out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));
|
17585 | out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));
|
17586 | out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);
|
17587 | out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));
|
17588 | out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);
|
17589 | return out;
|
17590 | }
|
17591 | /**
|
17592 | * Calculates the determinant of a mat4
|
17593 | *
|
17594 | * @param {ReadonlyMat4} a the source matrix
|
17595 | * @returns {Number} determinant of a
|
17596 | */
|
17597 |
|
17598 | function determinant(a) {
|
17599 | var a00 = a[0],
|
17600 | a01 = a[1],
|
17601 | a02 = a[2],
|
17602 | a03 = a[3];
|
17603 | var a10 = a[4],
|
17604 | a11 = a[5],
|
17605 | a12 = a[6],
|
17606 | a13 = a[7];
|
17607 | var a20 = a[8],
|
17608 | a21 = a[9],
|
17609 | a22 = a[10],
|
17610 | a23 = a[11];
|
17611 | var a30 = a[12],
|
17612 | a31 = a[13],
|
17613 | a32 = a[14],
|
17614 | a33 = a[15];
|
17615 | var b00 = a00 * a11 - a01 * a10;
|
17616 | var b01 = a00 * a12 - a02 * a10;
|
17617 | var b02 = a00 * a13 - a03 * a10;
|
17618 | var b03 = a01 * a12 - a02 * a11;
|
17619 | var b04 = a01 * a13 - a03 * a11;
|
17620 | var b05 = a02 * a13 - a03 * a12;
|
17621 | var b06 = a20 * a31 - a21 * a30;
|
17622 | var b07 = a20 * a32 - a22 * a30;
|
17623 | var b08 = a20 * a33 - a23 * a30;
|
17624 | var b09 = a21 * a32 - a22 * a31;
|
17625 | var b10 = a21 * a33 - a23 * a31;
|
17626 | var b11 = a22 * a33 - a23 * a32; // Calculate the determinant
|
17627 |
|
17628 | return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
|
17629 | }
|
17630 | /**
|
17631 | * Multiplies two mat4s
|
17632 | *
|
17633 | * @param {mat4} out the receiving matrix
|
17634 | * @param {ReadonlyMat4} a the first operand
|
17635 | * @param {ReadonlyMat4} b the second operand
|
17636 | * @returns {mat4} out
|
17637 | */
|
17638 |
|
17639 | function multiply$5(out, a, b) {
|
17640 | var a00 = a[0],
|
17641 | a01 = a[1],
|
17642 | a02 = a[2],
|
17643 | a03 = a[3];
|
17644 | var a10 = a[4],
|
17645 | a11 = a[5],
|
17646 | a12 = a[6],
|
17647 | a13 = a[7];
|
17648 | var a20 = a[8],
|
17649 | a21 = a[9],
|
17650 | a22 = a[10],
|
17651 | a23 = a[11];
|
17652 | var a30 = a[12],
|
17653 | a31 = a[13],
|
17654 | a32 = a[14],
|
17655 | a33 = a[15]; // Cache only the current line of the second matrix
|
17656 |
|
17657 | var b0 = b[0],
|
17658 | b1 = b[1],
|
17659 | b2 = b[2],
|
17660 | b3 = b[3];
|
17661 | out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
|
17662 | out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
|
17663 | out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
|
17664 | out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
|
17665 | b0 = b[4];
|
17666 | b1 = b[5];
|
17667 | b2 = b[6];
|
17668 | b3 = b[7];
|
17669 | out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
|
17670 | out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
|
17671 | out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
|
17672 | out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
|
17673 | b0 = b[8];
|
17674 | b1 = b[9];
|
17675 | b2 = b[10];
|
17676 | b3 = b[11];
|
17677 | out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
|
17678 | out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
|
17679 | out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
|
17680 | out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
|
17681 | b0 = b[12];
|
17682 | b1 = b[13];
|
17683 | b2 = b[14];
|
17684 | b3 = b[15];
|
17685 | out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
|
17686 | out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
|
17687 | out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
|
17688 | out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
|
17689 | return out;
|
17690 | }
|
17691 | /**
|
17692 | * Translate a mat4 by the given vector
|
17693 | *
|
17694 | * @param {mat4} out the receiving matrix
|
17695 | * @param {ReadonlyMat4} a the matrix to translate
|
17696 | * @param {ReadonlyVec3} v vector to translate by
|
17697 | * @returns {mat4} out
|
17698 | */
|
17699 |
|
17700 | function translate$1(out, a, v) {
|
17701 | var x = v[0],
|
17702 | y = v[1],
|
17703 | z = v[2];
|
17704 | var a00, a01, a02, a03;
|
17705 | var a10, a11, a12, a13;
|
17706 | var a20, a21, a22, a23;
|
17707 |
|
17708 | if (a === out) {
|
17709 | out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];
|
17710 | out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];
|
17711 | out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];
|
17712 | out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];
|
17713 | } else {
|
17714 | a00 = a[0];
|
17715 | a01 = a[1];
|
17716 | a02 = a[2];
|
17717 | a03 = a[3];
|
17718 | a10 = a[4];
|
17719 | a11 = a[5];
|
17720 | a12 = a[6];
|
17721 | a13 = a[7];
|
17722 | a20 = a[8];
|
17723 | a21 = a[9];
|
17724 | a22 = a[10];
|
17725 | a23 = a[11];
|
17726 | out[0] = a00;
|
17727 | out[1] = a01;
|
17728 | out[2] = a02;
|
17729 | out[3] = a03;
|
17730 | out[4] = a10;
|
17731 | out[5] = a11;
|
17732 | out[6] = a12;
|
17733 | out[7] = a13;
|
17734 | out[8] = a20;
|
17735 | out[9] = a21;
|
17736 | out[10] = a22;
|
17737 | out[11] = a23;
|
17738 | out[12] = a00 * x + a10 * y + a20 * z + a[12];
|
17739 | out[13] = a01 * x + a11 * y + a21 * z + a[13];
|
17740 | out[14] = a02 * x + a12 * y + a22 * z + a[14];
|
17741 | out[15] = a03 * x + a13 * y + a23 * z + a[15];
|
17742 | }
|
17743 |
|
17744 | return out;
|
17745 | }
|
17746 | /**
|
17747 | * Scales the mat4 by the dimensions in the given vec3 not using vectorization
|
17748 | *
|
17749 | * @param {mat4} out the receiving matrix
|
17750 | * @param {ReadonlyMat4} a the matrix to scale
|
17751 | * @param {ReadonlyVec3} v the vec3 to scale the matrix by
|
17752 | * @returns {mat4} out
|
17753 | **/
|
17754 |
|
17755 | function scale$5(out, a, v) {
|
17756 | var x = v[0],
|
17757 | y = v[1],
|
17758 | z = v[2];
|
17759 | out[0] = a[0] * x;
|
17760 | out[1] = a[1] * x;
|
17761 | out[2] = a[2] * x;
|
17762 | out[3] = a[3] * x;
|
17763 | out[4] = a[4] * y;
|
17764 | out[5] = a[5] * y;
|
17765 | out[6] = a[6] * y;
|
17766 | out[7] = a[7] * y;
|
17767 | out[8] = a[8] * z;
|
17768 | out[9] = a[9] * z;
|
17769 | out[10] = a[10] * z;
|
17770 | out[11] = a[11] * z;
|
17771 | out[12] = a[12];
|
17772 | out[13] = a[13];
|
17773 | out[14] = a[14];
|
17774 | out[15] = a[15];
|
17775 | return out;
|
17776 | }
|
17777 | /**
|
17778 | * Rotates a mat4 by the given angle around the given axis
|
17779 | *
|
17780 | * @param {mat4} out the receiving matrix
|
17781 | * @param {ReadonlyMat4} a the matrix to rotate
|
17782 | * @param {Number} rad the angle to rotate the matrix by
|
17783 | * @param {ReadonlyVec3} axis the axis to rotate around
|
17784 | * @returns {mat4} out
|
17785 | */
|
17786 |
|
17787 | function rotate$1(out, a, rad, axis) {
|
17788 | var x = axis[0],
|
17789 | y = axis[1],
|
17790 | z = axis[2];
|
17791 | var len = Math.hypot(x, y, z);
|
17792 | var s, c, t;
|
17793 | var a00, a01, a02, a03;
|
17794 | var a10, a11, a12, a13;
|
17795 | var a20, a21, a22, a23;
|
17796 | var b00, b01, b02;
|
17797 | var b10, b11, b12;
|
17798 | var b20, b21, b22;
|
17799 |
|
17800 | if (len < EPSILON) {
|
17801 | return null;
|
17802 | }
|
17803 |
|
17804 | len = 1 / len;
|
17805 | x *= len;
|
17806 | y *= len;
|
17807 | z *= len;
|
17808 | s = Math.sin(rad);
|
17809 | c = Math.cos(rad);
|
17810 | t = 1 - c;
|
17811 | a00 = a[0];
|
17812 | a01 = a[1];
|
17813 | a02 = a[2];
|
17814 | a03 = a[3];
|
17815 | a10 = a[4];
|
17816 | a11 = a[5];
|
17817 | a12 = a[6];
|
17818 | a13 = a[7];
|
17819 | a20 = a[8];
|
17820 | a21 = a[9];
|
17821 | a22 = a[10];
|
17822 | a23 = a[11]; // Construct the elements of the rotation matrix
|
17823 |
|
17824 | b00 = x * x * t + c;
|
17825 | b01 = y * x * t + z * s;
|
17826 | b02 = z * x * t - y * s;
|
17827 | b10 = x * y * t - z * s;
|
17828 | b11 = y * y * t + c;
|
17829 | b12 = z * y * t + x * s;
|
17830 | b20 = x * z * t + y * s;
|
17831 | b21 = y * z * t - x * s;
|
17832 | b22 = z * z * t + c; // Perform rotation-specific matrix multiplication
|
17833 |
|
17834 | out[0] = a00 * b00 + a10 * b01 + a20 * b02;
|
17835 | out[1] = a01 * b00 + a11 * b01 + a21 * b02;
|
17836 | out[2] = a02 * b00 + a12 * b01 + a22 * b02;
|
17837 | out[3] = a03 * b00 + a13 * b01 + a23 * b02;
|
17838 | out[4] = a00 * b10 + a10 * b11 + a20 * b12;
|
17839 | out[5] = a01 * b10 + a11 * b11 + a21 * b12;
|
17840 | out[6] = a02 * b10 + a12 * b11 + a22 * b12;
|
17841 | out[7] = a03 * b10 + a13 * b11 + a23 * b12;
|
17842 | out[8] = a00 * b20 + a10 * b21 + a20 * b22;
|
17843 | out[9] = a01 * b20 + a11 * b21 + a21 * b22;
|
17844 | out[10] = a02 * b20 + a12 * b21 + a22 * b22;
|
17845 | out[11] = a03 * b20 + a13 * b21 + a23 * b22;
|
17846 |
|
17847 | if (a !== out) {
|
17848 | // If the source and destination differ, copy the unchanged last row
|
17849 | out[12] = a[12];
|
17850 | out[13] = a[13];
|
17851 | out[14] = a[14];
|
17852 | out[15] = a[15];
|
17853 | }
|
17854 |
|
17855 | return out;
|
17856 | }
|
17857 | /**
|
17858 | * Rotates a matrix by the given angle around the X axis
|
17859 | *
|
17860 | * @param {mat4} out the receiving matrix
|
17861 | * @param {ReadonlyMat4} a the matrix to rotate
|
17862 | * @param {Number} rad the angle to rotate the matrix by
|
17863 | * @returns {mat4} out
|
17864 | */
|
17865 |
|
17866 | function rotateX$3(out, a, rad) {
|
17867 | var s = Math.sin(rad);
|
17868 | var c = Math.cos(rad);
|
17869 | var a10 = a[4];
|
17870 | var a11 = a[5];
|
17871 | var a12 = a[6];
|
17872 | var a13 = a[7];
|
17873 | var a20 = a[8];
|
17874 | var a21 = a[9];
|
17875 | var a22 = a[10];
|
17876 | var a23 = a[11];
|
17877 |
|
17878 | if (a !== out) {
|
17879 | // If the source and destination differ, copy the unchanged rows
|
17880 | out[0] = a[0];
|
17881 | out[1] = a[1];
|
17882 | out[2] = a[2];
|
17883 | out[3] = a[3];
|
17884 | out[12] = a[12];
|
17885 | out[13] = a[13];
|
17886 | out[14] = a[14];
|
17887 | out[15] = a[15];
|
17888 | } // Perform axis-specific matrix multiplication
|
17889 |
|
17890 |
|
17891 | out[4] = a10 * c + a20 * s;
|
17892 | out[5] = a11 * c + a21 * s;
|
17893 | out[6] = a12 * c + a22 * s;
|
17894 | out[7] = a13 * c + a23 * s;
|
17895 | out[8] = a20 * c - a10 * s;
|
17896 | out[9] = a21 * c - a11 * s;
|
17897 | out[10] = a22 * c - a12 * s;
|
17898 | out[11] = a23 * c - a13 * s;
|
17899 | return out;
|
17900 | }
|
17901 | /**
|
17902 | * Rotates a matrix by the given angle around the Y axis
|
17903 | *
|
17904 | * @param {mat4} out the receiving matrix
|
17905 | * @param {ReadonlyMat4} a the matrix to rotate
|
17906 | * @param {Number} rad the angle to rotate the matrix by
|
17907 | * @returns {mat4} out
|
17908 | */
|
17909 |
|
17910 | function rotateY$3(out, a, rad) {
|
17911 | var s = Math.sin(rad);
|
17912 | var c = Math.cos(rad);
|
17913 | var a00 = a[0];
|
17914 | var a01 = a[1];
|
17915 | var a02 = a[2];
|
17916 | var a03 = a[3];
|
17917 | var a20 = a[8];
|
17918 | var a21 = a[9];
|
17919 | var a22 = a[10];
|
17920 | var a23 = a[11];
|
17921 |
|
17922 | if (a !== out) {
|
17923 | // If the source and destination differ, copy the unchanged rows
|
17924 | out[4] = a[4];
|
17925 | out[5] = a[5];
|
17926 | out[6] = a[6];
|
17927 | out[7] = a[7];
|
17928 | out[12] = a[12];
|
17929 | out[13] = a[13];
|
17930 | out[14] = a[14];
|
17931 | out[15] = a[15];
|
17932 | } // Perform axis-specific matrix multiplication
|
17933 |
|
17934 |
|
17935 | out[0] = a00 * c - a20 * s;
|
17936 | out[1] = a01 * c - a21 * s;
|
17937 | out[2] = a02 * c - a22 * s;
|
17938 | out[3] = a03 * c - a23 * s;
|
17939 | out[8] = a00 * s + a20 * c;
|
17940 | out[9] = a01 * s + a21 * c;
|
17941 | out[10] = a02 * s + a22 * c;
|
17942 | out[11] = a03 * s + a23 * c;
|
17943 | return out;
|
17944 | }
|
17945 | /**
|
17946 | * Rotates a matrix by the given angle around the Z axis
|
17947 | *
|
17948 | * @param {mat4} out the receiving matrix
|
17949 | * @param {ReadonlyMat4} a the matrix to rotate
|
17950 | * @param {Number} rad the angle to rotate the matrix by
|
17951 | * @returns {mat4} out
|
17952 | */
|
17953 |
|
17954 | function rotateZ$3(out, a, rad) {
|
17955 | var s = Math.sin(rad);
|
17956 | var c = Math.cos(rad);
|
17957 | var a00 = a[0];
|
17958 | var a01 = a[1];
|
17959 | var a02 = a[2];
|
17960 | var a03 = a[3];
|
17961 | var a10 = a[4];
|
17962 | var a11 = a[5];
|
17963 | var a12 = a[6];
|
17964 | var a13 = a[7];
|
17965 |
|
17966 | if (a !== out) {
|
17967 | // If the source and destination differ, copy the unchanged last row
|
17968 | out[8] = a[8];
|
17969 | out[9] = a[9];
|
17970 | out[10] = a[10];
|
17971 | out[11] = a[11];
|
17972 | out[12] = a[12];
|
17973 | out[13] = a[13];
|
17974 | out[14] = a[14];
|
17975 | out[15] = a[15];
|
17976 | } // Perform axis-specific matrix multiplication
|
17977 |
|
17978 |
|
17979 | out[0] = a00 * c + a10 * s;
|
17980 | out[1] = a01 * c + a11 * s;
|
17981 | out[2] = a02 * c + a12 * s;
|
17982 | out[3] = a03 * c + a13 * s;
|
17983 | out[4] = a10 * c - a00 * s;
|
17984 | out[5] = a11 * c - a01 * s;
|
17985 | out[6] = a12 * c - a02 * s;
|
17986 | out[7] = a13 * c - a03 * s;
|
17987 | return out;
|
17988 | }
|
17989 | /**
|
17990 | * Creates a matrix from a vector translation
|
17991 | * This is equivalent to (but much faster than):
|
17992 | *
|
17993 | * mat4.identity(dest);
|
17994 | * mat4.translate(dest, dest, vec);
|
17995 | *
|
17996 | * @param {mat4} out mat4 receiving operation result
|
17997 | * @param {ReadonlyVec3} v Translation vector
|
17998 | * @returns {mat4} out
|
17999 | */
|
18000 |
|
18001 | function fromTranslation$1(out, v) {
|
18002 | out[0] = 1;
|
18003 | out[1] = 0;
|
18004 | out[2] = 0;
|
18005 | out[3] = 0;
|
18006 | out[4] = 0;
|
18007 | out[5] = 1;
|
18008 | out[6] = 0;
|
18009 | out[7] = 0;
|
18010 | out[8] = 0;
|
18011 | out[9] = 0;
|
18012 | out[10] = 1;
|
18013 | out[11] = 0;
|
18014 | out[12] = v[0];
|
18015 | out[13] = v[1];
|
18016 | out[14] = v[2];
|
18017 | out[15] = 1;
|
18018 | return out;
|
18019 | }
|
18020 | /**
|
18021 | * Creates a matrix from a vector scaling
|
18022 | * This is equivalent to (but much faster than):
|
18023 | *
|
18024 | * mat4.identity(dest);
|
18025 | * mat4.scale(dest, dest, vec);
|
18026 | *
|
18027 | * @param {mat4} out mat4 receiving operation result
|
18028 | * @param {ReadonlyVec3} v Scaling vector
|
18029 | * @returns {mat4} out
|
18030 | */
|
18031 |
|
18032 | function fromScaling(out, v) {
|
18033 | out[0] = v[0];
|
18034 | out[1] = 0;
|
18035 | out[2] = 0;
|
18036 | out[3] = 0;
|
18037 | out[4] = 0;
|
18038 | out[5] = v[1];
|
18039 | out[6] = 0;
|
18040 | out[7] = 0;
|
18041 | out[8] = 0;
|
18042 | out[9] = 0;
|
18043 | out[10] = v[2];
|
18044 | out[11] = 0;
|
18045 | out[12] = 0;
|
18046 | out[13] = 0;
|
18047 | out[14] = 0;
|
18048 | out[15] = 1;
|
18049 | return out;
|
18050 | }
|
18051 | /**
|
18052 | * Creates a matrix from a given angle around a given axis
|
18053 | * This is equivalent to (but much faster than):
|
18054 | *
|
18055 | * mat4.identity(dest);
|
18056 | * mat4.rotate(dest, dest, rad, axis);
|
18057 | *
|
18058 | * @param {mat4} out mat4 receiving operation result
|
18059 | * @param {Number} rad the angle to rotate the matrix by
|
18060 | * @param {ReadonlyVec3} axis the axis to rotate around
|
18061 | * @returns {mat4} out
|
18062 | */
|
18063 |
|
18064 | function fromRotation$1(out, rad, axis) {
|
18065 | var x = axis[0],
|
18066 | y = axis[1],
|
18067 | z = axis[2];
|
18068 | var len = Math.hypot(x, y, z);
|
18069 | var s, c, t;
|
18070 |
|
18071 | if (len < EPSILON) {
|
18072 | return null;
|
18073 | }
|
18074 |
|
18075 | len = 1 / len;
|
18076 | x *= len;
|
18077 | y *= len;
|
18078 | z *= len;
|
18079 | s = Math.sin(rad);
|
18080 | c = Math.cos(rad);
|
18081 | t = 1 - c; // Perform rotation-specific matrix multiplication
|
18082 |
|
18083 | out[0] = x * x * t + c;
|
18084 | out[1] = y * x * t + z * s;
|
18085 | out[2] = z * x * t - y * s;
|
18086 | out[3] = 0;
|
18087 | out[4] = x * y * t - z * s;
|
18088 | out[5] = y * y * t + c;
|
18089 | out[6] = z * y * t + x * s;
|
18090 | out[7] = 0;
|
18091 | out[8] = x * z * t + y * s;
|
18092 | out[9] = y * z * t - x * s;
|
18093 | out[10] = z * z * t + c;
|
18094 | out[11] = 0;
|
18095 | out[12] = 0;
|
18096 | out[13] = 0;
|
18097 | out[14] = 0;
|
18098 | out[15] = 1;
|
18099 | return out;
|
18100 | }
|
18101 | /**
|
18102 | * Creates a matrix from the given angle around the X axis
|
18103 | * This is equivalent to (but much faster than):
|
18104 | *
|
18105 | * mat4.identity(dest);
|
18106 | * mat4.rotateX(dest, dest, rad);
|
18107 | *
|
18108 | * @param {mat4} out mat4 receiving operation result
|
18109 | * @param {Number} rad the angle to rotate the matrix by
|
18110 | * @returns {mat4} out
|
18111 | */
|
18112 |
|
18113 | function fromXRotation(out, rad) {
|
18114 | var s = Math.sin(rad);
|
18115 | var c = Math.cos(rad); // Perform axis-specific matrix multiplication
|
18116 |
|
18117 | out[0] = 1;
|
18118 | out[1] = 0;
|
18119 | out[2] = 0;
|
18120 | out[3] = 0;
|
18121 | out[4] = 0;
|
18122 | out[5] = c;
|
18123 | out[6] = s;
|
18124 | out[7] = 0;
|
18125 | out[8] = 0;
|
18126 | out[9] = -s;
|
18127 | out[10] = c;
|
18128 | out[11] = 0;
|
18129 | out[12] = 0;
|
18130 | out[13] = 0;
|
18131 | out[14] = 0;
|
18132 | out[15] = 1;
|
18133 | return out;
|
18134 | }
|
18135 | /**
|
18136 | * Creates a matrix from the given angle around the Y axis
|
18137 | * This is equivalent to (but much faster than):
|
18138 | *
|
18139 | * mat4.identity(dest);
|
18140 | * mat4.rotateY(dest, dest, rad);
|
18141 | *
|
18142 | * @param {mat4} out mat4 receiving operation result
|
18143 | * @param {Number} rad the angle to rotate the matrix by
|
18144 | * @returns {mat4} out
|
18145 | */
|
18146 |
|
18147 | function fromYRotation(out, rad) {
|
18148 | var s = Math.sin(rad);
|
18149 | var c = Math.cos(rad); // Perform axis-specific matrix multiplication
|
18150 |
|
18151 | out[0] = c;
|
18152 | out[1] = 0;
|
18153 | out[2] = -s;
|
18154 | out[3] = 0;
|
18155 | out[4] = 0;
|
18156 | out[5] = 1;
|
18157 | out[6] = 0;
|
18158 | out[7] = 0;
|
18159 | out[8] = s;
|
18160 | out[9] = 0;
|
18161 | out[10] = c;
|
18162 | out[11] = 0;
|
18163 | out[12] = 0;
|
18164 | out[13] = 0;
|
18165 | out[14] = 0;
|
18166 | out[15] = 1;
|
18167 | return out;
|
18168 | }
|
18169 | /**
|
18170 | * Creates a matrix from the given angle around the Z axis
|
18171 | * This is equivalent to (but much faster than):
|
18172 | *
|
18173 | * mat4.identity(dest);
|
18174 | * mat4.rotateZ(dest, dest, rad);
|
18175 | *
|
18176 | * @param {mat4} out mat4 receiving operation result
|
18177 | * @param {Number} rad the angle to rotate the matrix by
|
18178 | * @returns {mat4} out
|
18179 | */
|
18180 |
|
18181 | function fromZRotation(out, rad) {
|
18182 | var s = Math.sin(rad);
|
18183 | var c = Math.cos(rad); // Perform axis-specific matrix multiplication
|
18184 |
|
18185 | out[0] = c;
|
18186 | out[1] = s;
|
18187 | out[2] = 0;
|
18188 | out[3] = 0;
|
18189 | out[4] = -s;
|
18190 | out[5] = c;
|
18191 | out[6] = 0;
|
18192 | out[7] = 0;
|
18193 | out[8] = 0;
|
18194 | out[9] = 0;
|
18195 | out[10] = 1;
|
18196 | out[11] = 0;
|
18197 | out[12] = 0;
|
18198 | out[13] = 0;
|
18199 | out[14] = 0;
|
18200 | out[15] = 1;
|
18201 | return out;
|
18202 | }
|
18203 | /**
|
18204 | * Creates a matrix from a quaternion rotation and vector translation
|
18205 | * This is equivalent to (but much faster than):
|
18206 | *
|
18207 | * mat4.identity(dest);
|
18208 | * mat4.translate(dest, vec);
|
18209 | * let quatMat = mat4.create();
|
18210 | * quat4.toMat4(quat, quatMat);
|
18211 | * mat4.multiply(dest, quatMat);
|
18212 | *
|
18213 | * @param {mat4} out mat4 receiving operation result
|
18214 | * @param {quat4} q Rotation quaternion
|
18215 | * @param {ReadonlyVec3} v Translation vector
|
18216 | * @returns {mat4} out
|
18217 | */
|
18218 |
|
18219 | function fromRotationTranslation$1(out, q, v) {
|
18220 | // Quaternion math
|
18221 | var x = q[0],
|
18222 | y = q[1],
|
18223 | z = q[2],
|
18224 | w = q[3];
|
18225 | var x2 = x + x;
|
18226 | var y2 = y + y;
|
18227 | var z2 = z + z;
|
18228 | var xx = x * x2;
|
18229 | var xy = x * y2;
|
18230 | var xz = x * z2;
|
18231 | var yy = y * y2;
|
18232 | var yz = y * z2;
|
18233 | var zz = z * z2;
|
18234 | var wx = w * x2;
|
18235 | var wy = w * y2;
|
18236 | var wz = w * z2;
|
18237 | out[0] = 1 - (yy + zz);
|
18238 | out[1] = xy + wz;
|
18239 | out[2] = xz - wy;
|
18240 | out[3] = 0;
|
18241 | out[4] = xy - wz;
|
18242 | out[5] = 1 - (xx + zz);
|
18243 | out[6] = yz + wx;
|
18244 | out[7] = 0;
|
18245 | out[8] = xz + wy;
|
18246 | out[9] = yz - wx;
|
18247 | out[10] = 1 - (xx + yy);
|
18248 | out[11] = 0;
|
18249 | out[12] = v[0];
|
18250 | out[13] = v[1];
|
18251 | out[14] = v[2];
|
18252 | out[15] = 1;
|
18253 | return out;
|
18254 | }
|
18255 | /**
|
18256 | * Creates a new mat4 from a dual quat.
|
18257 | *
|
18258 | * @param {mat4} out Matrix
|
18259 | * @param {ReadonlyQuat2} a Dual Quaternion
|
18260 | * @returns {mat4} mat4 receiving operation result
|
18261 | */
|
18262 |
|
18263 | function fromQuat2(out, a) {
|
18264 | var translation = new ARRAY_TYPE(3);
|
18265 | var bx = -a[0],
|
18266 | by = -a[1],
|
18267 | bz = -a[2],
|
18268 | bw = a[3],
|
18269 | ax = a[4],
|
18270 | ay = a[5],
|
18271 | az = a[6],
|
18272 | aw = a[7];
|
18273 | var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense
|
18274 |
|
18275 | if (magnitude > 0) {
|
18276 | translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;
|
18277 | translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;
|
18278 | translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;
|
18279 | } else {
|
18280 | translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;
|
18281 | translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;
|
18282 | translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;
|
18283 | }
|
18284 |
|
18285 | fromRotationTranslation$1(out, a, translation);
|
18286 | return out;
|
18287 | }
|
18288 | /**
|
18289 | * Returns the translation vector component of a transformation
|
18290 | * matrix. If a matrix is built with fromRotationTranslation,
|
18291 | * the returned vector will be the same as the translation vector
|
18292 | * originally supplied.
|
18293 | * @param {vec3} out Vector to receive translation component
|
18294 | * @param {ReadonlyMat4} mat Matrix to be decomposed (input)
|
18295 | * @return {vec3} out
|
18296 | */
|
18297 |
|
18298 | function getTranslation$1(out, mat) {
|
18299 | out[0] = mat[12];
|
18300 | out[1] = mat[13];
|
18301 | out[2] = mat[14];
|
18302 | return out;
|
18303 | }
|
18304 | /**
|
18305 | * Returns the scaling factor component of a transformation
|
18306 | * matrix. If a matrix is built with fromRotationTranslationScale
|
18307 | * with a normalized Quaternion paramter, the returned vector will be
|
18308 | * the same as the scaling vector
|
18309 | * originally supplied.
|
18310 | * @param {vec3} out Vector to receive scaling factor component
|
18311 | * @param {ReadonlyMat4} mat Matrix to be decomposed (input)
|
18312 | * @return {vec3} out
|
18313 | */
|
18314 |
|
18315 | function getScaling(out, mat) {
|
18316 | var m11 = mat[0];
|
18317 | var m12 = mat[1];
|
18318 | var m13 = mat[2];
|
18319 | var m21 = mat[4];
|
18320 | var m22 = mat[5];
|
18321 | var m23 = mat[6];
|
18322 | var m31 = mat[8];
|
18323 | var m32 = mat[9];
|
18324 | var m33 = mat[10];
|
18325 | out[0] = Math.hypot(m11, m12, m13);
|
18326 | out[1] = Math.hypot(m21, m22, m23);
|
18327 | out[2] = Math.hypot(m31, m32, m33);
|
18328 | return out;
|
18329 | }
|
18330 | /**
|
18331 | * Returns a quaternion representing the rotational component
|
18332 | * of a transformation matrix. If a matrix is built with
|
18333 | * fromRotationTranslation, the returned quaternion will be the
|
18334 | * same as the quaternion originally supplied.
|
18335 | * @param {quat} out Quaternion to receive the rotation component
|
18336 | * @param {ReadonlyMat4} mat Matrix to be decomposed (input)
|
18337 | * @return {quat} out
|
18338 | */
|
18339 |
|
18340 | function getRotation(out, mat) {
|
18341 | var scaling = new ARRAY_TYPE(3);
|
18342 | getScaling(scaling, mat);
|
18343 | var is1 = 1 / scaling[0];
|
18344 | var is2 = 1 / scaling[1];
|
18345 | var is3 = 1 / scaling[2];
|
18346 | var sm11 = mat[0] * is1;
|
18347 | var sm12 = mat[1] * is2;
|
18348 | var sm13 = mat[2] * is3;
|
18349 | var sm21 = mat[4] * is1;
|
18350 | var sm22 = mat[5] * is2;
|
18351 | var sm23 = mat[6] * is3;
|
18352 | var sm31 = mat[8] * is1;
|
18353 | var sm32 = mat[9] * is2;
|
18354 | var sm33 = mat[10] * is3;
|
18355 | var trace = sm11 + sm22 + sm33;
|
18356 | var S = 0;
|
18357 |
|
18358 | if (trace > 0) {
|
18359 | S = Math.sqrt(trace + 1.0) * 2;
|
18360 | out[3] = 0.25 * S;
|
18361 | out[0] = (sm23 - sm32) / S;
|
18362 | out[1] = (sm31 - sm13) / S;
|
18363 | out[2] = (sm12 - sm21) / S;
|
18364 | } else if (sm11 > sm22 && sm11 > sm33) {
|
18365 | S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;
|
18366 | out[3] = (sm23 - sm32) / S;
|
18367 | out[0] = 0.25 * S;
|
18368 | out[1] = (sm12 + sm21) / S;
|
18369 | out[2] = (sm31 + sm13) / S;
|
18370 | } else if (sm22 > sm33) {
|
18371 | S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;
|
18372 | out[3] = (sm31 - sm13) / S;
|
18373 | out[0] = (sm12 + sm21) / S;
|
18374 | out[1] = 0.25 * S;
|
18375 | out[2] = (sm23 + sm32) / S;
|
18376 | } else {
|
18377 | S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;
|
18378 | out[3] = (sm12 - sm21) / S;
|
18379 | out[0] = (sm31 + sm13) / S;
|
18380 | out[1] = (sm23 + sm32) / S;
|
18381 | out[2] = 0.25 * S;
|
18382 | }
|
18383 |
|
18384 | return out;
|
18385 | }
|
18386 | /**
|
18387 | * Creates a matrix from a quaternion rotation, vector translation and vector scale
|
18388 | * This is equivalent to (but much faster than):
|
18389 | *
|
18390 | * mat4.identity(dest);
|
18391 | * mat4.translate(dest, vec);
|
18392 | * let quatMat = mat4.create();
|
18393 | * quat4.toMat4(quat, quatMat);
|
18394 | * mat4.multiply(dest, quatMat);
|
18395 | * mat4.scale(dest, scale)
|
18396 | *
|
18397 | * @param {mat4} out mat4 receiving operation result
|
18398 | * @param {quat4} q Rotation quaternion
|
18399 | * @param {ReadonlyVec3} v Translation vector
|
18400 | * @param {ReadonlyVec3} s Scaling vector
|
18401 | * @returns {mat4} out
|
18402 | */
|
18403 |
|
18404 | function fromRotationTranslationScale(out, q, v, s) {
|
18405 | // Quaternion math
|
18406 | var x = q[0],
|
18407 | y = q[1],
|
18408 | z = q[2],
|
18409 | w = q[3];
|
18410 | var x2 = x + x;
|
18411 | var y2 = y + y;
|
18412 | var z2 = z + z;
|
18413 | var xx = x * x2;
|
18414 | var xy = x * y2;
|
18415 | var xz = x * z2;
|
18416 | var yy = y * y2;
|
18417 | var yz = y * z2;
|
18418 | var zz = z * z2;
|
18419 | var wx = w * x2;
|
18420 | var wy = w * y2;
|
18421 | var wz = w * z2;
|
18422 | var sx = s[0];
|
18423 | var sy = s[1];
|
18424 | var sz = s[2];
|
18425 | out[0] = (1 - (yy + zz)) * sx;
|
18426 | out[1] = (xy + wz) * sx;
|
18427 | out[2] = (xz - wy) * sx;
|
18428 | out[3] = 0;
|
18429 | out[4] = (xy - wz) * sy;
|
18430 | out[5] = (1 - (xx + zz)) * sy;
|
18431 | out[6] = (yz + wx) * sy;
|
18432 | out[7] = 0;
|
18433 | out[8] = (xz + wy) * sz;
|
18434 | out[9] = (yz - wx) * sz;
|
18435 | out[10] = (1 - (xx + yy)) * sz;
|
18436 | out[11] = 0;
|
18437 | out[12] = v[0];
|
18438 | out[13] = v[1];
|
18439 | out[14] = v[2];
|
18440 | out[15] = 1;
|
18441 | return out;
|
18442 | }
|
18443 | /**
|
18444 | * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin
|
18445 | * This is equivalent to (but much faster than):
|
18446 | *
|
18447 | * mat4.identity(dest);
|
18448 | * mat4.translate(dest, vec);
|
18449 | * mat4.translate(dest, origin);
|
18450 | * let quatMat = mat4.create();
|
18451 | * quat4.toMat4(quat, quatMat);
|
18452 | * mat4.multiply(dest, quatMat);
|
18453 | * mat4.scale(dest, scale)
|
18454 | * mat4.translate(dest, negativeOrigin);
|
18455 | *
|
18456 | * @param {mat4} out mat4 receiving operation result
|
18457 | * @param {quat4} q Rotation quaternion
|
18458 | * @param {ReadonlyVec3} v Translation vector
|
18459 | * @param {ReadonlyVec3} s Scaling vector
|
18460 | * @param {ReadonlyVec3} o The origin vector around which to scale and rotate
|
18461 | * @returns {mat4} out
|
18462 | */
|
18463 |
|
18464 | function fromRotationTranslationScaleOrigin(out, q, v, s, o) {
|
18465 | // Quaternion math
|
18466 | var x = q[0],
|
18467 | y = q[1],
|
18468 | z = q[2],
|
18469 | w = q[3];
|
18470 | var x2 = x + x;
|
18471 | var y2 = y + y;
|
18472 | var z2 = z + z;
|
18473 | var xx = x * x2;
|
18474 | var xy = x * y2;
|
18475 | var xz = x * z2;
|
18476 | var yy = y * y2;
|
18477 | var yz = y * z2;
|
18478 | var zz = z * z2;
|
18479 | var wx = w * x2;
|
18480 | var wy = w * y2;
|
18481 | var wz = w * z2;
|
18482 | var sx = s[0];
|
18483 | var sy = s[1];
|
18484 | var sz = s[2];
|
18485 | var ox = o[0];
|
18486 | var oy = o[1];
|
18487 | var oz = o[2];
|
18488 | var out0 = (1 - (yy + zz)) * sx;
|
18489 | var out1 = (xy + wz) * sx;
|
18490 | var out2 = (xz - wy) * sx;
|
18491 | var out4 = (xy - wz) * sy;
|
18492 | var out5 = (1 - (xx + zz)) * sy;
|
18493 | var out6 = (yz + wx) * sy;
|
18494 | var out8 = (xz + wy) * sz;
|
18495 | var out9 = (yz - wx) * sz;
|
18496 | var out10 = (1 - (xx + yy)) * sz;
|
18497 | out[0] = out0;
|
18498 | out[1] = out1;
|
18499 | out[2] = out2;
|
18500 | out[3] = 0;
|
18501 | out[4] = out4;
|
18502 | out[5] = out5;
|
18503 | out[6] = out6;
|
18504 | out[7] = 0;
|
18505 | out[8] = out8;
|
18506 | out[9] = out9;
|
18507 | out[10] = out10;
|
18508 | out[11] = 0;
|
18509 | out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);
|
18510 | out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);
|
18511 | out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);
|
18512 | out[15] = 1;
|
18513 | return out;
|
18514 | }
|
18515 | /**
|
18516 | * Calculates a 4x4 matrix from the given quaternion
|
18517 | *
|
18518 | * @param {mat4} out mat4 receiving operation result
|
18519 | * @param {ReadonlyQuat} q Quaternion to create matrix from
|
18520 | *
|
18521 | * @returns {mat4} out
|
18522 | */
|
18523 |
|
18524 | function fromQuat(out, q) {
|
18525 | var x = q[0],
|
18526 | y = q[1],
|
18527 | z = q[2],
|
18528 | w = q[3];
|
18529 | var x2 = x + x;
|
18530 | var y2 = y + y;
|
18531 | var z2 = z + z;
|
18532 | var xx = x * x2;
|
18533 | var yx = y * x2;
|
18534 | var yy = y * y2;
|
18535 | var zx = z * x2;
|
18536 | var zy = z * y2;
|
18537 | var zz = z * z2;
|
18538 | var wx = w * x2;
|
18539 | var wy = w * y2;
|
18540 | var wz = w * z2;
|
18541 | out[0] = 1 - yy - zz;
|
18542 | out[1] = yx + wz;
|
18543 | out[2] = zx - wy;
|
18544 | out[3] = 0;
|
18545 | out[4] = yx - wz;
|
18546 | out[5] = 1 - xx - zz;
|
18547 | out[6] = zy + wx;
|
18548 | out[7] = 0;
|
18549 | out[8] = zx + wy;
|
18550 | out[9] = zy - wx;
|
18551 | out[10] = 1 - xx - yy;
|
18552 | out[11] = 0;
|
18553 | out[12] = 0;
|
18554 | out[13] = 0;
|
18555 | out[14] = 0;
|
18556 | out[15] = 1;
|
18557 | return out;
|
18558 | }
|
18559 | /**
|
18560 | * Generates a frustum matrix with the given bounds
|
18561 | *
|
18562 | * @param {mat4} out mat4 frustum matrix will be written into
|
18563 | * @param {Number} left Left bound of the frustum
|
18564 | * @param {Number} right Right bound of the frustum
|
18565 | * @param {Number} bottom Bottom bound of the frustum
|
18566 | * @param {Number} top Top bound of the frustum
|
18567 | * @param {Number} near Near bound of the frustum
|
18568 | * @param {Number} far Far bound of the frustum
|
18569 | * @returns {mat4} out
|
18570 | */
|
18571 |
|
18572 | function frustum(out, left, right, bottom, top, near, far) {
|
18573 | var rl = 1 / (right - left);
|
18574 | var tb = 1 / (top - bottom);
|
18575 | var nf = 1 / (near - far);
|
18576 | out[0] = near * 2 * rl;
|
18577 | out[1] = 0;
|
18578 | out[2] = 0;
|
18579 | out[3] = 0;
|
18580 | out[4] = 0;
|
18581 | out[5] = near * 2 * tb;
|
18582 | out[6] = 0;
|
18583 | out[7] = 0;
|
18584 | out[8] = (right + left) * rl;
|
18585 | out[9] = (top + bottom) * tb;
|
18586 | out[10] = (far + near) * nf;
|
18587 | out[11] = -1;
|
18588 | out[12] = 0;
|
18589 | out[13] = 0;
|
18590 | out[14] = far * near * 2 * nf;
|
18591 | out[15] = 0;
|
18592 | return out;
|
18593 | }
|
18594 | /**
|
18595 | * Generates a perspective projection matrix with the given bounds.
|
18596 | * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],
|
18597 | * which matches WebGL/OpenGL's clip volume.
|
18598 | * Passing null/undefined/no value for far will generate infinite projection matrix.
|
18599 | *
|
18600 | * @param {mat4} out mat4 frustum matrix will be written into
|
18601 | * @param {number} fovy Vertical field of view in radians
|
18602 | * @param {number} aspect Aspect ratio. typically viewport width/height
|
18603 | * @param {number} near Near bound of the frustum
|
18604 | * @param {number} far Far bound of the frustum, can be null or Infinity
|
18605 | * @returns {mat4} out
|
18606 | */
|
18607 |
|
18608 | function perspectiveNO(out, fovy, aspect, near, far) {
|
18609 | var f = 1.0 / Math.tan(fovy / 2),
|
18610 | nf;
|
18611 | out[0] = f / aspect;
|
18612 | out[1] = 0;
|
18613 | out[2] = 0;
|
18614 | out[3] = 0;
|
18615 | out[4] = 0;
|
18616 | out[5] = f;
|
18617 | out[6] = 0;
|
18618 | out[7] = 0;
|
18619 | out[8] = 0;
|
18620 | out[9] = 0;
|
18621 | out[11] = -1;
|
18622 | out[12] = 0;
|
18623 | out[13] = 0;
|
18624 | out[15] = 0;
|
18625 |
|
18626 | if (far != null && far !== Infinity) {
|
18627 | nf = 1 / (near - far);
|
18628 | out[10] = (far + near) * nf;
|
18629 | out[14] = 2 * far * near * nf;
|
18630 | } else {
|
18631 | out[10] = -1;
|
18632 | out[14] = -2 * near;
|
18633 | }
|
18634 |
|
18635 | return out;
|
18636 | }
|
18637 | /**
|
18638 | * Alias for {@link mat4.perspectiveNO}
|
18639 | * @function
|
18640 | */
|
18641 |
|
18642 | var perspective = perspectiveNO;
|
18643 | /**
|
18644 | * Generates a perspective projection matrix suitable for WebGPU with the given bounds.
|
18645 | * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],
|
18646 | * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.
|
18647 | * Passing null/undefined/no value for far will generate infinite projection matrix.
|
18648 | *
|
18649 | * @param {mat4} out mat4 frustum matrix will be written into
|
18650 | * @param {number} fovy Vertical field of view in radians
|
18651 | * @param {number} aspect Aspect ratio. typically viewport width/height
|
18652 | * @param {number} near Near bound of the frustum
|
18653 | * @param {number} far Far bound of the frustum, can be null or Infinity
|
18654 | * @returns {mat4} out
|
18655 | */
|
18656 |
|
18657 | function perspectiveZO(out, fovy, aspect, near, far) {
|
18658 | var f = 1.0 / Math.tan(fovy / 2),
|
18659 | nf;
|
18660 | out[0] = f / aspect;
|
18661 | out[1] = 0;
|
18662 | out[2] = 0;
|
18663 | out[3] = 0;
|
18664 | out[4] = 0;
|
18665 | out[5] = f;
|
18666 | out[6] = 0;
|
18667 | out[7] = 0;
|
18668 | out[8] = 0;
|
18669 | out[9] = 0;
|
18670 | out[11] = -1;
|
18671 | out[12] = 0;
|
18672 | out[13] = 0;
|
18673 | out[15] = 0;
|
18674 |
|
18675 | if (far != null && far !== Infinity) {
|
18676 | nf = 1 / (near - far);
|
18677 | out[10] = far * nf;
|
18678 | out[14] = far * near * nf;
|
18679 | } else {
|
18680 | out[10] = -1;
|
18681 | out[14] = -near;
|
18682 | }
|
18683 |
|
18684 | return out;
|
18685 | }
|
18686 | /**
|
18687 | * Generates a perspective projection matrix with the given field of view.
|
18688 | * This is primarily useful for generating projection matrices to be used
|
18689 | * with the still experiemental WebVR API.
|
18690 | *
|
18691 | * @param {mat4} out mat4 frustum matrix will be written into
|
18692 | * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees
|
18693 | * @param {number} near Near bound of the frustum
|
18694 | * @param {number} far Far bound of the frustum
|
18695 | * @returns {mat4} out
|
18696 | */
|
18697 |
|
18698 | function perspectiveFromFieldOfView(out, fov, near, far) {
|
18699 | var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);
|
18700 | var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);
|
18701 | var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);
|
18702 | var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);
|
18703 | var xScale = 2.0 / (leftTan + rightTan);
|
18704 | var yScale = 2.0 / (upTan + downTan);
|
18705 | out[0] = xScale;
|
18706 | out[1] = 0.0;
|
18707 | out[2] = 0.0;
|
18708 | out[3] = 0.0;
|
18709 | out[4] = 0.0;
|
18710 | out[5] = yScale;
|
18711 | out[6] = 0.0;
|
18712 | out[7] = 0.0;
|
18713 | out[8] = -((leftTan - rightTan) * xScale * 0.5);
|
18714 | out[9] = (upTan - downTan) * yScale * 0.5;
|
18715 | out[10] = far / (near - far);
|
18716 | out[11] = -1.0;
|
18717 | out[12] = 0.0;
|
18718 | out[13] = 0.0;
|
18719 | out[14] = far * near / (near - far);
|
18720 | out[15] = 0.0;
|
18721 | return out;
|
18722 | }
|
18723 | /**
|
18724 | * Generates a orthogonal projection matrix with the given bounds.
|
18725 | * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],
|
18726 | * which matches WebGL/OpenGL's clip volume.
|
18727 | *
|
18728 | * @param {mat4} out mat4 frustum matrix will be written into
|
18729 | * @param {number} left Left bound of the frustum
|
18730 | * @param {number} right Right bound of the frustum
|
18731 | * @param {number} bottom Bottom bound of the frustum
|
18732 | * @param {number} top Top bound of the frustum
|
18733 | * @param {number} near Near bound of the frustum
|
18734 | * @param {number} far Far bound of the frustum
|
18735 | * @returns {mat4} out
|
18736 | */
|
18737 |
|
18738 | function orthoNO(out, left, right, bottom, top, near, far) {
|
18739 | var lr = 1 / (left - right);
|
18740 | var bt = 1 / (bottom - top);
|
18741 | var nf = 1 / (near - far);
|
18742 | out[0] = -2 * lr;
|
18743 | out[1] = 0;
|
18744 | out[2] = 0;
|
18745 | out[3] = 0;
|
18746 | out[4] = 0;
|
18747 | out[5] = -2 * bt;
|
18748 | out[6] = 0;
|
18749 | out[7] = 0;
|
18750 | out[8] = 0;
|
18751 | out[9] = 0;
|
18752 | out[10] = 2 * nf;
|
18753 | out[11] = 0;
|
18754 | out[12] = (left + right) * lr;
|
18755 | out[13] = (top + bottom) * bt;
|
18756 | out[14] = (far + near) * nf;
|
18757 | out[15] = 1;
|
18758 | return out;
|
18759 | }
|
18760 | /**
|
18761 | * Alias for {@link mat4.orthoNO}
|
18762 | * @function
|
18763 | */
|
18764 |
|
18765 | var ortho = orthoNO;
|
18766 | /**
|
18767 | * Generates a orthogonal projection matrix with the given bounds.
|
18768 | * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],
|
18769 | * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.
|
18770 | *
|
18771 | * @param {mat4} out mat4 frustum matrix will be written into
|
18772 | * @param {number} left Left bound of the frustum
|
18773 | * @param {number} right Right bound of the frustum
|
18774 | * @param {number} bottom Bottom bound of the frustum
|
18775 | * @param {number} top Top bound of the frustum
|
18776 | * @param {number} near Near bound of the frustum
|
18777 | * @param {number} far Far bound of the frustum
|
18778 | * @returns {mat4} out
|
18779 | */
|
18780 |
|
18781 | function orthoZO(out, left, right, bottom, top, near, far) {
|
18782 | var lr = 1 / (left - right);
|
18783 | var bt = 1 / (bottom - top);
|
18784 | var nf = 1 / (near - far);
|
18785 | out[0] = -2 * lr;
|
18786 | out[1] = 0;
|
18787 | out[2] = 0;
|
18788 | out[3] = 0;
|
18789 | out[4] = 0;
|
18790 | out[5] = -2 * bt;
|
18791 | out[6] = 0;
|
18792 | out[7] = 0;
|
18793 | out[8] = 0;
|
18794 | out[9] = 0;
|
18795 | out[10] = nf;
|
18796 | out[11] = 0;
|
18797 | out[12] = (left + right) * lr;
|
18798 | out[13] = (top + bottom) * bt;
|
18799 | out[14] = near * nf;
|
18800 | out[15] = 1;
|
18801 | return out;
|
18802 | }
|
18803 | /**
|
18804 | * Generates a look-at matrix with the given eye position, focal point, and up axis.
|
18805 | * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.
|
18806 | *
|
18807 | * @param {mat4} out mat4 frustum matrix will be written into
|
18808 | * @param {ReadonlyVec3} eye Position of the viewer
|
18809 | * @param {ReadonlyVec3} center Point the viewer is looking at
|
18810 | * @param {ReadonlyVec3} up vec3 pointing up
|
18811 | * @returns {mat4} out
|
18812 | */
|
18813 |
|
18814 | function lookAt(out, eye, center, up) {
|
18815 | var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;
|
18816 | var eyex = eye[0];
|
18817 | var eyey = eye[1];
|
18818 | var eyez = eye[2];
|
18819 | var upx = up[0];
|
18820 | var upy = up[1];
|
18821 | var upz = up[2];
|
18822 | var centerx = center[0];
|
18823 | var centery = center[1];
|
18824 | var centerz = center[2];
|
18825 |
|
18826 | if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) {
|
18827 | return identity$2(out);
|
18828 | }
|
18829 |
|
18830 | z0 = eyex - centerx;
|
18831 | z1 = eyey - centery;
|
18832 | z2 = eyez - centerz;
|
18833 | len = 1 / Math.hypot(z0, z1, z2);
|
18834 | z0 *= len;
|
18835 | z1 *= len;
|
18836 | z2 *= len;
|
18837 | x0 = upy * z2 - upz * z1;
|
18838 | x1 = upz * z0 - upx * z2;
|
18839 | x2 = upx * z1 - upy * z0;
|
18840 | len = Math.hypot(x0, x1, x2);
|
18841 |
|
18842 | if (!len) {
|
18843 | x0 = 0;
|
18844 | x1 = 0;
|
18845 | x2 = 0;
|
18846 | } else {
|
18847 | len = 1 / len;
|
18848 | x0 *= len;
|
18849 | x1 *= len;
|
18850 | x2 *= len;
|
18851 | }
|
18852 |
|
18853 | y0 = z1 * x2 - z2 * x1;
|
18854 | y1 = z2 * x0 - z0 * x2;
|
18855 | y2 = z0 * x1 - z1 * x0;
|
18856 | len = Math.hypot(y0, y1, y2);
|
18857 |
|
18858 | if (!len) {
|
18859 | y0 = 0;
|
18860 | y1 = 0;
|
18861 | y2 = 0;
|
18862 | } else {
|
18863 | len = 1 / len;
|
18864 | y0 *= len;
|
18865 | y1 *= len;
|
18866 | y2 *= len;
|
18867 | }
|
18868 |
|
18869 | out[0] = x0;
|
18870 | out[1] = y0;
|
18871 | out[2] = z0;
|
18872 | out[3] = 0;
|
18873 | out[4] = x1;
|
18874 | out[5] = y1;
|
18875 | out[6] = z1;
|
18876 | out[7] = 0;
|
18877 | out[8] = x2;
|
18878 | out[9] = y2;
|
18879 | out[10] = z2;
|
18880 | out[11] = 0;
|
18881 | out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);
|
18882 | out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);
|
18883 | out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);
|
18884 | out[15] = 1;
|
18885 | return out;
|
18886 | }
|
18887 | /**
|
18888 | * Generates a matrix that makes something look at something else.
|
18889 | *
|
18890 | * @param {mat4} out mat4 frustum matrix will be written into
|
18891 | * @param {ReadonlyVec3} eye Position of the viewer
|
18892 | * @param {ReadonlyVec3} center Point the viewer is looking at
|
18893 | * @param {ReadonlyVec3} up vec3 pointing up
|
18894 | * @returns {mat4} out
|
18895 | */
|
18896 |
|
18897 | function targetTo(out, eye, target, up) {
|
18898 | var eyex = eye[0],
|
18899 | eyey = eye[1],
|
18900 | eyez = eye[2],
|
18901 | upx = up[0],
|
18902 | upy = up[1],
|
18903 | upz = up[2];
|
18904 | var z0 = eyex - target[0],
|
18905 | z1 = eyey - target[1],
|
18906 | z2 = eyez - target[2];
|
18907 | var len = z0 * z0 + z1 * z1 + z2 * z2;
|
18908 |
|
18909 | if (len > 0) {
|
18910 | len = 1 / Math.sqrt(len);
|
18911 | z0 *= len;
|
18912 | z1 *= len;
|
18913 | z2 *= len;
|
18914 | }
|
18915 |
|
18916 | var x0 = upy * z2 - upz * z1,
|
18917 | x1 = upz * z0 - upx * z2,
|
18918 | x2 = upx * z1 - upy * z0;
|
18919 | len = x0 * x0 + x1 * x1 + x2 * x2;
|
18920 |
|
18921 | if (len > 0) {
|
18922 | len = 1 / Math.sqrt(len);
|
18923 | x0 *= len;
|
18924 | x1 *= len;
|
18925 | x2 *= len;
|
18926 | }
|
18927 |
|
18928 | out[0] = x0;
|
18929 | out[1] = x1;
|
18930 | out[2] = x2;
|
18931 | out[3] = 0;
|
18932 | out[4] = z1 * x2 - z2 * x1;
|
18933 | out[5] = z2 * x0 - z0 * x2;
|
18934 | out[6] = z0 * x1 - z1 * x0;
|
18935 | out[7] = 0;
|
18936 | out[8] = z0;
|
18937 | out[9] = z1;
|
18938 | out[10] = z2;
|
18939 | out[11] = 0;
|
18940 | out[12] = eyex;
|
18941 | out[13] = eyey;
|
18942 | out[14] = eyez;
|
18943 | out[15] = 1;
|
18944 | return out;
|
18945 | }
|
18946 | /**
|
18947 | * Returns a string representation of a mat4
|
18948 | *
|
18949 | * @param {ReadonlyMat4} a matrix to represent as a string
|
18950 | * @returns {String} string representation of the matrix
|
18951 | */
|
18952 |
|
18953 | function str$5(a) {
|
18954 | return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")";
|
18955 | }
|
18956 | /**
|
18957 | * Returns Frobenius norm of a mat4
|
18958 | *
|
18959 | * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of
|
18960 | * @returns {Number} Frobenius norm
|
18961 | */
|
18962 |
|
18963 | function frob(a) {
|
18964 | return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);
|
18965 | }
|
18966 | /**
|
18967 | * Adds two mat4's
|
18968 | *
|
18969 | * @param {mat4} out the receiving matrix
|
18970 | * @param {ReadonlyMat4} a the first operand
|
18971 | * @param {ReadonlyMat4} b the second operand
|
18972 | * @returns {mat4} out
|
18973 | */
|
18974 |
|
18975 | function add$5(out, a, b) {
|
18976 | out[0] = a[0] + b[0];
|
18977 | out[1] = a[1] + b[1];
|
18978 | out[2] = a[2] + b[2];
|
18979 | out[3] = a[3] + b[3];
|
18980 | out[4] = a[4] + b[4];
|
18981 | out[5] = a[5] + b[5];
|
18982 | out[6] = a[6] + b[6];
|
18983 | out[7] = a[7] + b[7];
|
18984 | out[8] = a[8] + b[8];
|
18985 | out[9] = a[9] + b[9];
|
18986 | out[10] = a[10] + b[10];
|
18987 | out[11] = a[11] + b[11];
|
18988 | out[12] = a[12] + b[12];
|
18989 | out[13] = a[13] + b[13];
|
18990 | out[14] = a[14] + b[14];
|
18991 | out[15] = a[15] + b[15];
|
18992 | return out;
|
18993 | }
|
18994 | /**
|
18995 | * Subtracts matrix b from matrix a
|
18996 | *
|
18997 | * @param {mat4} out the receiving matrix
|
18998 | * @param {ReadonlyMat4} a the first operand
|
18999 | * @param {ReadonlyMat4} b the second operand
|
19000 | * @returns {mat4} out
|
19001 | */
|
19002 |
|
19003 | function subtract$3(out, a, b) {
|
19004 | out[0] = a[0] - b[0];
|
19005 | out[1] = a[1] - b[1];
|
19006 | out[2] = a[2] - b[2];
|
19007 | out[3] = a[3] - b[3];
|
19008 | out[4] = a[4] - b[4];
|
19009 | out[5] = a[5] - b[5];
|
19010 | out[6] = a[6] - b[6];
|
19011 | out[7] = a[7] - b[7];
|
19012 | out[8] = a[8] - b[8];
|
19013 | out[9] = a[9] - b[9];
|
19014 | out[10] = a[10] - b[10];
|
19015 | out[11] = a[11] - b[11];
|
19016 | out[12] = a[12] - b[12];
|
19017 | out[13] = a[13] - b[13];
|
19018 | out[14] = a[14] - b[14];
|
19019 | out[15] = a[15] - b[15];
|
19020 | return out;
|
19021 | }
|
19022 | /**
|
19023 | * Multiply each element of the matrix by a scalar.
|
19024 | *
|
19025 | * @param {mat4} out the receiving matrix
|
19026 | * @param {ReadonlyMat4} a the matrix to scale
|
19027 | * @param {Number} b amount to scale the matrix's elements by
|
19028 | * @returns {mat4} out
|
19029 | */
|
19030 |
|
19031 | function multiplyScalar(out, a, b) {
|
19032 | out[0] = a[0] * b;
|
19033 | out[1] = a[1] * b;
|
19034 | out[2] = a[2] * b;
|
19035 | out[3] = a[3] * b;
|
19036 | out[4] = a[4] * b;
|
19037 | out[5] = a[5] * b;
|
19038 | out[6] = a[6] * b;
|
19039 | out[7] = a[7] * b;
|
19040 | out[8] = a[8] * b;
|
19041 | out[9] = a[9] * b;
|
19042 | out[10] = a[10] * b;
|
19043 | out[11] = a[11] * b;
|
19044 | out[12] = a[12] * b;
|
19045 | out[13] = a[13] * b;
|
19046 | out[14] = a[14] * b;
|
19047 | out[15] = a[15] * b;
|
19048 | return out;
|
19049 | }
|
19050 | /**
|
19051 | * Adds two mat4's after multiplying each element of the second operand by a scalar value.
|
19052 | *
|
19053 | * @param {mat4} out the receiving vector
|
19054 | * @param {ReadonlyMat4} a the first operand
|
19055 | * @param {ReadonlyMat4} b the second operand
|
19056 | * @param {Number} scale the amount to scale b's elements by before adding
|
19057 | * @returns {mat4} out
|
19058 | */
|
19059 |
|
19060 | function multiplyScalarAndAdd(out, a, b, scale) {
|
19061 | out[0] = a[0] + b[0] * scale;
|
19062 | out[1] = a[1] + b[1] * scale;
|
19063 | out[2] = a[2] + b[2] * scale;
|
19064 | out[3] = a[3] + b[3] * scale;
|
19065 | out[4] = a[4] + b[4] * scale;
|
19066 | out[5] = a[5] + b[5] * scale;
|
19067 | out[6] = a[6] + b[6] * scale;
|
19068 | out[7] = a[7] + b[7] * scale;
|
19069 | out[8] = a[8] + b[8] * scale;
|
19070 | out[9] = a[9] + b[9] * scale;
|
19071 | out[10] = a[10] + b[10] * scale;
|
19072 | out[11] = a[11] + b[11] * scale;
|
19073 | out[12] = a[12] + b[12] * scale;
|
19074 | out[13] = a[13] + b[13] * scale;
|
19075 | out[14] = a[14] + b[14] * scale;
|
19076 | out[15] = a[15] + b[15] * scale;
|
19077 | return out;
|
19078 | }
|
19079 | /**
|
19080 | * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)
|
19081 | *
|
19082 | * @param {ReadonlyMat4} a The first matrix.
|
19083 | * @param {ReadonlyMat4} b The second matrix.
|
19084 | * @returns {Boolean} True if the matrices are equal, false otherwise.
|
19085 | */
|
19086 |
|
19087 | function exactEquals$5(a, b) {
|
19088 | return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];
|
19089 | }
|
19090 | /**
|
19091 | * Returns whether or not the matrices have approximately the same elements in the same position.
|
19092 | *
|
19093 | * @param {ReadonlyMat4} a The first matrix.
|
19094 | * @param {ReadonlyMat4} b The second matrix.
|
19095 | * @returns {Boolean} True if the matrices are equal, false otherwise.
|
19096 | */
|
19097 |
|
19098 | function equals$6(a, b) {
|
19099 | var a0 = a[0],
|
19100 | a1 = a[1],
|
19101 | a2 = a[2],
|
19102 | a3 = a[3];
|
19103 | var a4 = a[4],
|
19104 | a5 = a[5],
|
19105 | a6 = a[6],
|
19106 | a7 = a[7];
|
19107 | var a8 = a[8],
|
19108 | a9 = a[9],
|
19109 | a10 = a[10],
|
19110 | a11 = a[11];
|
19111 | var a12 = a[12],
|
19112 | a13 = a[13],
|
19113 | a14 = a[14],
|
19114 | a15 = a[15];
|
19115 | var b0 = b[0],
|
19116 | b1 = b[1],
|
19117 | b2 = b[2],
|
19118 | b3 = b[3];
|
19119 | var b4 = b[4],
|
19120 | b5 = b[5],
|
19121 | b6 = b[6],
|
19122 | b7 = b[7];
|
19123 | var b8 = b[8],
|
19124 | b9 = b[9],
|
19125 | b10 = b[10],
|
19126 | b11 = b[11];
|
19127 | var b12 = b[12],
|
19128 | b13 = b[13],
|
19129 | b14 = b[14],
|
19130 | b15 = b[15];
|
19131 | return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));
|
19132 | }
|
19133 | /**
|
19134 | * Alias for {@link mat4.multiply}
|
19135 | * @function
|
19136 | */
|
19137 |
|
19138 | var mul$5 = multiply$5;
|
19139 | /**
|
19140 | * Alias for {@link mat4.subtract}
|
19141 | * @function
|
19142 | */
|
19143 |
|
19144 | var sub$3 = subtract$3;
|
19145 |
|
19146 | var mat4 = /*#__PURE__*/Object.freeze({
|
19147 | __proto__: null,
|
19148 | create: create$5,
|
19149 | clone: clone$5,
|
19150 | copy: copy$5,
|
19151 | fromValues: fromValues$5,
|
19152 | set: set$5,
|
19153 | identity: identity$2,
|
19154 | transpose: transpose,
|
19155 | invert: invert$2,
|
19156 | adjoint: adjoint,
|
19157 | determinant: determinant,
|
19158 | multiply: multiply$5,
|
19159 | translate: translate$1,
|
19160 | scale: scale$5,
|
19161 | rotate: rotate$1,
|
19162 | rotateX: rotateX$3,
|
19163 | rotateY: rotateY$3,
|
19164 | rotateZ: rotateZ$3,
|
19165 | fromTranslation: fromTranslation$1,
|
19166 | fromScaling: fromScaling,
|
19167 | fromRotation: fromRotation$1,
|
19168 | fromXRotation: fromXRotation,
|
19169 | fromYRotation: fromYRotation,
|
19170 | fromZRotation: fromZRotation,
|
19171 | fromRotationTranslation: fromRotationTranslation$1,
|
19172 | fromQuat2: fromQuat2,
|
19173 | getTranslation: getTranslation$1,
|
19174 | getScaling: getScaling,
|
19175 | getRotation: getRotation,
|
19176 | fromRotationTranslationScale: fromRotationTranslationScale,
|
19177 | fromRotationTranslationScaleOrigin: fromRotationTranslationScaleOrigin,
|
19178 | fromQuat: fromQuat,
|
19179 | frustum: frustum,
|
19180 | perspectiveNO: perspectiveNO,
|
19181 | perspective: perspective,
|
19182 | perspectiveZO: perspectiveZO,
|
19183 | perspectiveFromFieldOfView: perspectiveFromFieldOfView,
|
19184 | orthoNO: orthoNO,
|
19185 | ortho: ortho,
|
19186 | orthoZO: orthoZO,
|
19187 | lookAt: lookAt,
|
19188 | targetTo: targetTo,
|
19189 | str: str$5,
|
19190 | frob: frob,
|
19191 | add: add$5,
|
19192 | subtract: subtract$3,
|
19193 | multiplyScalar: multiplyScalar,
|
19194 | multiplyScalarAndAdd: multiplyScalarAndAdd,
|
19195 | exactEquals: exactEquals$5,
|
19196 | equals: equals$6,
|
19197 | mul: mul$5,
|
19198 | sub: sub$3
|
19199 | });
|
19200 |
|
19201 | /**
|
19202 | * 3 Dimensional Vector
|
19203 | * @module vec3
|
19204 | */
|
19205 |
|
19206 | /**
|
19207 | * Creates a new, empty vec3
|
19208 | *
|
19209 | * @returns {vec3} a new 3D vector
|
19210 | */
|
19211 |
|
19212 | function create$4() {
|
19213 | var out = new ARRAY_TYPE(3);
|
19214 |
|
19215 | if (ARRAY_TYPE != Float32Array) {
|
19216 | out[0] = 0;
|
19217 | out[1] = 0;
|
19218 | out[2] = 0;
|
19219 | }
|
19220 |
|
19221 | return out;
|
19222 | }
|
19223 | /**
|
19224 | * Creates a new vec3 initialized with values from an existing vector
|
19225 | *
|
19226 | * @param {ReadonlyVec3} a vector to clone
|
19227 | * @returns {vec3} a new 3D vector
|
19228 | */
|
19229 |
|
19230 | function clone$4(a) {
|
19231 | var out = new ARRAY_TYPE(3);
|
19232 | out[0] = a[0];
|
19233 | out[1] = a[1];
|
19234 | out[2] = a[2];
|
19235 | return out;
|
19236 | }
|
19237 | /**
|
19238 | * Calculates the length of a vec3
|
19239 | *
|
19240 | * @param {ReadonlyVec3} a vector to calculate length of
|
19241 | * @returns {Number} length of a
|
19242 | */
|
19243 |
|
19244 | function length$4(a) {
|
19245 | var x = a[0];
|
19246 | var y = a[1];
|
19247 | var z = a[2];
|
19248 | return Math.hypot(x, y, z);
|
19249 | }
|
19250 | /**
|
19251 | * Creates a new vec3 initialized with the given values
|
19252 | *
|
19253 | * @param {Number} x X component
|
19254 | * @param {Number} y Y component
|
19255 | * @param {Number} z Z component
|
19256 | * @returns {vec3} a new 3D vector
|
19257 | */
|
19258 |
|
19259 | function fromValues$4(x, y, z) {
|
19260 | var out = new ARRAY_TYPE(3);
|
19261 | out[0] = x;
|
19262 | out[1] = y;
|
19263 | out[2] = z;
|
19264 | return out;
|
19265 | }
|
19266 | /**
|
19267 | * Copy the values from one vec3 to another
|
19268 | *
|
19269 | * @param {vec3} out the receiving vector
|
19270 | * @param {ReadonlyVec3} a the source vector
|
19271 | * @returns {vec3} out
|
19272 | */
|
19273 |
|
19274 | function copy$4(out, a) {
|
19275 | out[0] = a[0];
|
19276 | out[1] = a[1];
|
19277 | out[2] = a[2];
|
19278 | return out;
|
19279 | }
|
19280 | /**
|
19281 | * Set the components of a vec3 to the given values
|
19282 | *
|
19283 | * @param {vec3} out the receiving vector
|
19284 | * @param {Number} x X component
|
19285 | * @param {Number} y Y component
|
19286 | * @param {Number} z Z component
|
19287 | * @returns {vec3} out
|
19288 | */
|
19289 |
|
19290 | function set$4(out, x, y, z) {
|
19291 | out[0] = x;
|
19292 | out[1] = y;
|
19293 | out[2] = z;
|
19294 | return out;
|
19295 | }
|
19296 | /**
|
19297 | * Adds two vec3's
|
19298 | *
|
19299 | * @param {vec3} out the receiving vector
|
19300 | * @param {ReadonlyVec3} a the first operand
|
19301 | * @param {ReadonlyVec3} b the second operand
|
19302 | * @returns {vec3} out
|
19303 | */
|
19304 |
|
19305 | function add$4(out, a, b) {
|
19306 | out[0] = a[0] + b[0];
|
19307 | out[1] = a[1] + b[1];
|
19308 | out[2] = a[2] + b[2];
|
19309 | return out;
|
19310 | }
|
19311 | /**
|
19312 | * Subtracts vector b from vector a
|
19313 | *
|
19314 | * @param {vec3} out the receiving vector
|
19315 | * @param {ReadonlyVec3} a the first operand
|
19316 | * @param {ReadonlyVec3} b the second operand
|
19317 | * @returns {vec3} out
|
19318 | */
|
19319 |
|
19320 | function subtract$2(out, a, b) {
|
19321 | out[0] = a[0] - b[0];
|
19322 | out[1] = a[1] - b[1];
|
19323 | out[2] = a[2] - b[2];
|
19324 | return out;
|
19325 | }
|
19326 | /**
|
19327 | * Multiplies two vec3's
|
19328 | *
|
19329 | * @param {vec3} out the receiving vector
|
19330 | * @param {ReadonlyVec3} a the first operand
|
19331 | * @param {ReadonlyVec3} b the second operand
|
19332 | * @returns {vec3} out
|
19333 | */
|
19334 |
|
19335 | function multiply$4(out, a, b) {
|
19336 | out[0] = a[0] * b[0];
|
19337 | out[1] = a[1] * b[1];
|
19338 | out[2] = a[2] * b[2];
|
19339 | return out;
|
19340 | }
|
19341 | /**
|
19342 | * Divides two vec3's
|
19343 | *
|
19344 | * @param {vec3} out the receiving vector
|
19345 | * @param {ReadonlyVec3} a the first operand
|
19346 | * @param {ReadonlyVec3} b the second operand
|
19347 | * @returns {vec3} out
|
19348 | */
|
19349 |
|
19350 | function divide$2(out, a, b) {
|
19351 | out[0] = a[0] / b[0];
|
19352 | out[1] = a[1] / b[1];
|
19353 | out[2] = a[2] / b[2];
|
19354 | return out;
|
19355 | }
|
19356 | /**
|
19357 | * Math.ceil the components of a vec3
|
19358 | *
|
19359 | * @param {vec3} out the receiving vector
|
19360 | * @param {ReadonlyVec3} a vector to ceil
|
19361 | * @returns {vec3} out
|
19362 | */
|
19363 |
|
19364 | function ceil$2(out, a) {
|
19365 | out[0] = Math.ceil(a[0]);
|
19366 | out[1] = Math.ceil(a[1]);
|
19367 | out[2] = Math.ceil(a[2]);
|
19368 | return out;
|
19369 | }
|
19370 | /**
|
19371 | * Math.floor the components of a vec3
|
19372 | *
|
19373 | * @param {vec3} out the receiving vector
|
19374 | * @param {ReadonlyVec3} a vector to floor
|
19375 | * @returns {vec3} out
|
19376 | */
|
19377 |
|
19378 | function floor$2(out, a) {
|
19379 | out[0] = Math.floor(a[0]);
|
19380 | out[1] = Math.floor(a[1]);
|
19381 | out[2] = Math.floor(a[2]);
|
19382 | return out;
|
19383 | }
|
19384 | /**
|
19385 | * Returns the minimum of two vec3's
|
19386 | *
|
19387 | * @param {vec3} out the receiving vector
|
19388 | * @param {ReadonlyVec3} a the first operand
|
19389 | * @param {ReadonlyVec3} b the second operand
|
19390 | * @returns {vec3} out
|
19391 | */
|
19392 |
|
19393 | function min$2(out, a, b) {
|
19394 | out[0] = Math.min(a[0], b[0]);
|
19395 | out[1] = Math.min(a[1], b[1]);
|
19396 | out[2] = Math.min(a[2], b[2]);
|
19397 | return out;
|
19398 | }
|
19399 | /**
|
19400 | * Returns the maximum of two vec3's
|
19401 | *
|
19402 | * @param {vec3} out the receiving vector
|
19403 | * @param {ReadonlyVec3} a the first operand
|
19404 | * @param {ReadonlyVec3} b the second operand
|
19405 | * @returns {vec3} out
|
19406 | */
|
19407 |
|
19408 | function max$2(out, a, b) {
|
19409 | out[0] = Math.max(a[0], b[0]);
|
19410 | out[1] = Math.max(a[1], b[1]);
|
19411 | out[2] = Math.max(a[2], b[2]);
|
19412 | return out;
|
19413 | }
|
19414 | /**
|
19415 | * Math.round the components of a vec3
|
19416 | *
|
19417 | * @param {vec3} out the receiving vector
|
19418 | * @param {ReadonlyVec3} a vector to round
|
19419 | * @returns {vec3} out
|
19420 | */
|
19421 |
|
19422 | function round$2(out, a) {
|
19423 | out[0] = Math.round(a[0]);
|
19424 | out[1] = Math.round(a[1]);
|
19425 | out[2] = Math.round(a[2]);
|
19426 | return out;
|
19427 | }
|
19428 | /**
|
19429 | * Scales a vec3 by a scalar number
|
19430 | *
|
19431 | * @param {vec3} out the receiving vector
|
19432 | * @param {ReadonlyVec3} a the vector to scale
|
19433 | * @param {Number} b amount to scale the vector by
|
19434 | * @returns {vec3} out
|
19435 | */
|
19436 |
|
19437 | function scale$4(out, a, b) {
|
19438 | out[0] = a[0] * b;
|
19439 | out[1] = a[1] * b;
|
19440 | out[2] = a[2] * b;
|
19441 | return out;
|
19442 | }
|
19443 | /**
|
19444 | * Adds two vec3's after scaling the second operand by a scalar value
|
19445 | *
|
19446 | * @param {vec3} out the receiving vector
|
19447 | * @param {ReadonlyVec3} a the first operand
|
19448 | * @param {ReadonlyVec3} b the second operand
|
19449 | * @param {Number} scale the amount to scale b by before adding
|
19450 | * @returns {vec3} out
|
19451 | */
|
19452 |
|
19453 | function scaleAndAdd$2(out, a, b, scale) {
|
19454 | out[0] = a[0] + b[0] * scale;
|
19455 | out[1] = a[1] + b[1] * scale;
|
19456 | out[2] = a[2] + b[2] * scale;
|
19457 | return out;
|
19458 | }
|
19459 | /**
|
19460 | * Calculates the euclidian distance between two vec3's
|
19461 | *
|
19462 | * @param {ReadonlyVec3} a the first operand
|
19463 | * @param {ReadonlyVec3} b the second operand
|
19464 | * @returns {Number} distance between a and b
|
19465 | */
|
19466 |
|
19467 | function distance$2(a, b) {
|
19468 | var x = b[0] - a[0];
|
19469 | var y = b[1] - a[1];
|
19470 | var z = b[2] - a[2];
|
19471 | return Math.hypot(x, y, z);
|
19472 | }
|
19473 | /**
|
19474 | * Calculates the squared euclidian distance between two vec3's
|
19475 | *
|
19476 | * @param {ReadonlyVec3} a the first operand
|
19477 | * @param {ReadonlyVec3} b the second operand
|
19478 | * @returns {Number} squared distance between a and b
|
19479 | */
|
19480 |
|
19481 | function squaredDistance$2(a, b) {
|
19482 | var x = b[0] - a[0];
|
19483 | var y = b[1] - a[1];
|
19484 | var z = b[2] - a[2];
|
19485 | return x * x + y * y + z * z;
|
19486 | }
|
19487 | /**
|
19488 | * Calculates the squared length of a vec3
|
19489 | *
|
19490 | * @param {ReadonlyVec3} a vector to calculate squared length of
|
19491 | * @returns {Number} squared length of a
|
19492 | */
|
19493 |
|
19494 | function squaredLength$4(a) {
|
19495 | var x = a[0];
|
19496 | var y = a[1];
|
19497 | var z = a[2];
|
19498 | return x * x + y * y + z * z;
|
19499 | }
|
19500 | /**
|
19501 | * Negates the components of a vec3
|
19502 | *
|
19503 | * @param {vec3} out the receiving vector
|
19504 | * @param {ReadonlyVec3} a vector to negate
|
19505 | * @returns {vec3} out
|
19506 | */
|
19507 |
|
19508 | function negate$2(out, a) {
|
19509 | out[0] = -a[0];
|
19510 | out[1] = -a[1];
|
19511 | out[2] = -a[2];
|
19512 | return out;
|
19513 | }
|
19514 | /**
|
19515 | * Returns the inverse of the components of a vec3
|
19516 | *
|
19517 | * @param {vec3} out the receiving vector
|
19518 | * @param {ReadonlyVec3} a vector to invert
|
19519 | * @returns {vec3} out
|
19520 | */
|
19521 |
|
19522 | function inverse$2(out, a) {
|
19523 | out[0] = 1.0 / a[0];
|
19524 | out[1] = 1.0 / a[1];
|
19525 | out[2] = 1.0 / a[2];
|
19526 | return out;
|
19527 | }
|
19528 | /**
|
19529 | * Normalize a vec3
|
19530 | *
|
19531 | * @param {vec3} out the receiving vector
|
19532 | * @param {ReadonlyVec3} a vector to normalize
|
19533 | * @returns {vec3} out
|
19534 | */
|
19535 |
|
19536 | function normalize$4(out, a) {
|
19537 | var x = a[0];
|
19538 | var y = a[1];
|
19539 | var z = a[2];
|
19540 | var len = x * x + y * y + z * z;
|
19541 |
|
19542 | if (len > 0) {
|
19543 | //TODO: evaluate use of glm_invsqrt here?
|
19544 | len = 1 / Math.sqrt(len);
|
19545 | }
|
19546 |
|
19547 | out[0] = a[0] * len;
|
19548 | out[1] = a[1] * len;
|
19549 | out[2] = a[2] * len;
|
19550 | return out;
|
19551 | }
|
19552 | /**
|
19553 | * Calculates the dot product of two vec3's
|
19554 | *
|
19555 | * @param {ReadonlyVec3} a the first operand
|
19556 | * @param {ReadonlyVec3} b the second operand
|
19557 | * @returns {Number} dot product of a and b
|
19558 | */
|
19559 |
|
19560 | function dot$5(a, b) {
|
19561 | return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
19562 | }
|
19563 | /**
|
19564 | * Computes the cross product of two vec3's
|
19565 | *
|
19566 | * @param {vec3} out the receiving vector
|
19567 | * @param {ReadonlyVec3} a the first operand
|
19568 | * @param {ReadonlyVec3} b the second operand
|
19569 | * @returns {vec3} out
|
19570 | */
|
19571 |
|
19572 | function cross$2(out, a, b) {
|
19573 | var ax = a[0],
|
19574 | ay = a[1],
|
19575 | az = a[2];
|
19576 | var bx = b[0],
|
19577 | by = b[1],
|
19578 | bz = b[2];
|
19579 | out[0] = ay * bz - az * by;
|
19580 | out[1] = az * bx - ax * bz;
|
19581 | out[2] = ax * by - ay * bx;
|
19582 | return out;
|
19583 | }
|
19584 | /**
|
19585 | * Performs a linear interpolation between two vec3's
|
19586 | *
|
19587 | * @param {vec3} out the receiving vector
|
19588 | * @param {ReadonlyVec3} a the first operand
|
19589 | * @param {ReadonlyVec3} b the second operand
|
19590 | * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
|
19591 | * @returns {vec3} out
|
19592 | */
|
19593 |
|
19594 | function lerp$4(out, a, b, t) {
|
19595 | var ax = a[0];
|
19596 | var ay = a[1];
|
19597 | var az = a[2];
|
19598 | out[0] = ax + t * (b[0] - ax);
|
19599 | out[1] = ay + t * (b[1] - ay);
|
19600 | out[2] = az + t * (b[2] - az);
|
19601 | return out;
|
19602 | }
|
19603 | /**
|
19604 | * Performs a hermite interpolation with two control points
|
19605 | *
|
19606 | * @param {vec3} out the receiving vector
|
19607 | * @param {ReadonlyVec3} a the first operand
|
19608 | * @param {ReadonlyVec3} b the second operand
|
19609 | * @param {ReadonlyVec3} c the third operand
|
19610 | * @param {ReadonlyVec3} d the fourth operand
|
19611 | * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
|
19612 | * @returns {vec3} out
|
19613 | */
|
19614 |
|
19615 | function hermite(out, a, b, c, d, t) {
|
19616 | var factorTimes2 = t * t;
|
19617 | var factor1 = factorTimes2 * (2 * t - 3) + 1;
|
19618 | var factor2 = factorTimes2 * (t - 2) + t;
|
19619 | var factor3 = factorTimes2 * (t - 1);
|
19620 | var factor4 = factorTimes2 * (3 - 2 * t);
|
19621 | out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;
|
19622 | out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;
|
19623 | out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;
|
19624 | return out;
|
19625 | }
|
19626 | /**
|
19627 | * Performs a bezier interpolation with two control points
|
19628 | *
|
19629 | * @param {vec3} out the receiving vector
|
19630 | * @param {ReadonlyVec3} a the first operand
|
19631 | * @param {ReadonlyVec3} b the second operand
|
19632 | * @param {ReadonlyVec3} c the third operand
|
19633 | * @param {ReadonlyVec3} d the fourth operand
|
19634 | * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
|
19635 | * @returns {vec3} out
|
19636 | */
|
19637 |
|
19638 | function bezier(out, a, b, c, d, t) {
|
19639 | var inverseFactor = 1 - t;
|
19640 | var inverseFactorTimesTwo = inverseFactor * inverseFactor;
|
19641 | var factorTimes2 = t * t;
|
19642 | var factor1 = inverseFactorTimesTwo * inverseFactor;
|
19643 | var factor2 = 3 * t * inverseFactorTimesTwo;
|
19644 | var factor3 = 3 * factorTimes2 * inverseFactor;
|
19645 | var factor4 = factorTimes2 * t;
|
19646 | out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;
|
19647 | out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;
|
19648 | out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;
|
19649 | return out;
|
19650 | }
|
19651 | /**
|
19652 | * Generates a random vector with the given scale
|
19653 | *
|
19654 | * @param {vec3} out the receiving vector
|
19655 | * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned
|
19656 | * @returns {vec3} out
|
19657 | */
|
19658 |
|
19659 | function random$3(out, scale) {
|
19660 | scale = scale || 1.0;
|
19661 | var r = RANDOM() * 2.0 * Math.PI;
|
19662 | var z = RANDOM() * 2.0 - 1.0;
|
19663 | var zScale = Math.sqrt(1.0 - z * z) * scale;
|
19664 | out[0] = Math.cos(r) * zScale;
|
19665 | out[1] = Math.sin(r) * zScale;
|
19666 | out[2] = z * scale;
|
19667 | return out;
|
19668 | }
|
19669 | /**
|
19670 | * Transforms the vec3 with a mat4.
|
19671 | * 4th vector component is implicitly '1'
|
19672 | *
|
19673 | * @param {vec3} out the receiving vector
|
19674 | * @param {ReadonlyVec3} a the vector to transform
|
19675 | * @param {ReadonlyMat4} m matrix to transform with
|
19676 | * @returns {vec3} out
|
19677 | */
|
19678 |
|
19679 | function transformMat4$2(out, a, m) {
|
19680 | var x = a[0],
|
19681 | y = a[1],
|
19682 | z = a[2];
|
19683 | var w = m[3] * x + m[7] * y + m[11] * z + m[15];
|
19684 | w = w || 1.0;
|
19685 | out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;
|
19686 | out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;
|
19687 | out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;
|
19688 | return out;
|
19689 | }
|
19690 | /**
|
19691 | * Transforms the vec3 with a mat3.
|
19692 | *
|
19693 | * @param {vec3} out the receiving vector
|
19694 | * @param {ReadonlyVec3} a the vector to transform
|
19695 | * @param {ReadonlyMat3} m the 3x3 matrix to transform with
|
19696 | * @returns {vec3} out
|
19697 | */
|
19698 |
|
19699 | function transformMat3$1(out, a, m) {
|
19700 | var x = a[0],
|
19701 | y = a[1],
|
19702 | z = a[2];
|
19703 | out[0] = x * m[0] + y * m[3] + z * m[6];
|
19704 | out[1] = x * m[1] + y * m[4] + z * m[7];
|
19705 | out[2] = x * m[2] + y * m[5] + z * m[8];
|
19706 | return out;
|
19707 | }
|
19708 | /**
|
19709 | * Transforms the vec3 with a quat
|
19710 | * Can also be used for dual quaternions. (Multiply it with the real part)
|
19711 | *
|
19712 | * @param {vec3} out the receiving vector
|
19713 | * @param {ReadonlyVec3} a the vector to transform
|
19714 | * @param {ReadonlyQuat} q quaternion to transform with
|
19715 | * @returns {vec3} out
|
19716 | */
|
19717 |
|
19718 | function transformQuat$1(out, a, q) {
|
19719 | // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed
|
19720 | var qx = q[0],
|
19721 | qy = q[1],
|
19722 | qz = q[2],
|
19723 | qw = q[3];
|
19724 | var x = a[0],
|
19725 | y = a[1],
|
19726 | z = a[2]; // var qvec = [qx, qy, qz];
|
19727 | // var uv = vec3.cross([], qvec, a);
|
19728 |
|
19729 | var uvx = qy * z - qz * y,
|
19730 | uvy = qz * x - qx * z,
|
19731 | uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);
|
19732 |
|
19733 | var uuvx = qy * uvz - qz * uvy,
|
19734 | uuvy = qz * uvx - qx * uvz,
|
19735 | uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);
|
19736 |
|
19737 | var w2 = qw * 2;
|
19738 | uvx *= w2;
|
19739 | uvy *= w2;
|
19740 | uvz *= w2; // vec3.scale(uuv, uuv, 2);
|
19741 |
|
19742 | uuvx *= 2;
|
19743 | uuvy *= 2;
|
19744 | uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));
|
19745 |
|
19746 | out[0] = x + uvx + uuvx;
|
19747 | out[1] = y + uvy + uuvy;
|
19748 | out[2] = z + uvz + uuvz;
|
19749 | return out;
|
19750 | }
|
19751 | /**
|
19752 | * Rotate a 3D vector around the x-axis
|
19753 | * @param {vec3} out The receiving vec3
|
19754 | * @param {ReadonlyVec3} a The vec3 point to rotate
|
19755 | * @param {ReadonlyVec3} b The origin of the rotation
|
19756 | * @param {Number} rad The angle of rotation in radians
|
19757 | * @returns {vec3} out
|
19758 | */
|
19759 |
|
19760 | function rotateX$2(out, a, b, rad) {
|
19761 | var p = [],
|
19762 | r = []; //Translate point to the origin
|
19763 |
|
19764 | p[0] = a[0] - b[0];
|
19765 | p[1] = a[1] - b[1];
|
19766 | p[2] = a[2] - b[2]; //perform rotation
|
19767 |
|
19768 | r[0] = p[0];
|
19769 | r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);
|
19770 | r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position
|
19771 |
|
19772 | out[0] = r[0] + b[0];
|
19773 | out[1] = r[1] + b[1];
|
19774 | out[2] = r[2] + b[2];
|
19775 | return out;
|
19776 | }
|
19777 | /**
|
19778 | * Rotate a 3D vector around the y-axis
|
19779 | * @param {vec3} out The receiving vec3
|
19780 | * @param {ReadonlyVec3} a The vec3 point to rotate
|
19781 | * @param {ReadonlyVec3} b The origin of the rotation
|
19782 | * @param {Number} rad The angle of rotation in radians
|
19783 | * @returns {vec3} out
|
19784 | */
|
19785 |
|
19786 | function rotateY$2(out, a, b, rad) {
|
19787 | var p = [],
|
19788 | r = []; //Translate point to the origin
|
19789 |
|
19790 | p[0] = a[0] - b[0];
|
19791 | p[1] = a[1] - b[1];
|
19792 | p[2] = a[2] - b[2]; //perform rotation
|
19793 |
|
19794 | r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);
|
19795 | r[1] = p[1];
|
19796 | r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position
|
19797 |
|
19798 | out[0] = r[0] + b[0];
|
19799 | out[1] = r[1] + b[1];
|
19800 | out[2] = r[2] + b[2];
|
19801 | return out;
|
19802 | }
|
19803 | /**
|
19804 | * Rotate a 3D vector around the z-axis
|
19805 | * @param {vec3} out The receiving vec3
|
19806 | * @param {ReadonlyVec3} a The vec3 point to rotate
|
19807 | * @param {ReadonlyVec3} b The origin of the rotation
|
19808 | * @param {Number} rad The angle of rotation in radians
|
19809 | * @returns {vec3} out
|
19810 | */
|
19811 |
|
19812 | function rotateZ$2(out, a, b, rad) {
|
19813 | var p = [],
|
19814 | r = []; //Translate point to the origin
|
19815 |
|
19816 | p[0] = a[0] - b[0];
|
19817 | p[1] = a[1] - b[1];
|
19818 | p[2] = a[2] - b[2]; //perform rotation
|
19819 |
|
19820 | r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);
|
19821 | r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);
|
19822 | r[2] = p[2]; //translate to correct position
|
19823 |
|
19824 | out[0] = r[0] + b[0];
|
19825 | out[1] = r[1] + b[1];
|
19826 | out[2] = r[2] + b[2];
|
19827 | return out;
|
19828 | }
|
19829 | /**
|
19830 | * Get the angle between two 3D vectors
|
19831 | * @param {ReadonlyVec3} a The first operand
|
19832 | * @param {ReadonlyVec3} b The second operand
|
19833 | * @returns {Number} The angle in radians
|
19834 | */
|
19835 |
|
19836 | function angle$1(a, b) {
|
19837 | var ax = a[0],
|
19838 | ay = a[1],
|
19839 | az = a[2],
|
19840 | bx = b[0],
|
19841 | by = b[1],
|
19842 | bz = b[2],
|
19843 | mag1 = Math.sqrt(ax * ax + ay * ay + az * az),
|
19844 | mag2 = Math.sqrt(bx * bx + by * by + bz * bz),
|
19845 | mag = mag1 * mag2,
|
19846 | cosine = mag && dot$5(a, b) / mag;
|
19847 | return Math.acos(Math.min(Math.max(cosine, -1), 1));
|
19848 | }
|
19849 | /**
|
19850 | * Set the components of a vec3 to zero
|
19851 | *
|
19852 | * @param {vec3} out the receiving vector
|
19853 | * @returns {vec3} out
|
19854 | */
|
19855 |
|
19856 | function zero$2(out) {
|
19857 | out[0] = 0.0;
|
19858 | out[1] = 0.0;
|
19859 | out[2] = 0.0;
|
19860 | return out;
|
19861 | }
|
19862 | /**
|
19863 | * Returns a string representation of a vector
|
19864 | *
|
19865 | * @param {ReadonlyVec3} a vector to represent as a string
|
19866 | * @returns {String} string representation of the vector
|
19867 | */
|
19868 |
|
19869 | function str$4(a) {
|
19870 | return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")";
|
19871 | }
|
19872 | /**
|
19873 | * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)
|
19874 | *
|
19875 | * @param {ReadonlyVec3} a The first vector.
|
19876 | * @param {ReadonlyVec3} b The second vector.
|
19877 | * @returns {Boolean} True if the vectors are equal, false otherwise.
|
19878 | */
|
19879 |
|
19880 | function exactEquals$4(a, b) {
|
19881 | return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];
|
19882 | }
|
19883 | /**
|
19884 | * Returns whether or not the vectors have approximately the same elements in the same position.
|
19885 | *
|
19886 | * @param {ReadonlyVec3} a The first vector.
|
19887 | * @param {ReadonlyVec3} b The second vector.
|
19888 | * @returns {Boolean} True if the vectors are equal, false otherwise.
|
19889 | */
|
19890 |
|
19891 | function equals$5(a, b) {
|
19892 | var a0 = a[0],
|
19893 | a1 = a[1],
|
19894 | a2 = a[2];
|
19895 | var b0 = b[0],
|
19896 | b1 = b[1],
|
19897 | b2 = b[2];
|
19898 | return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));
|
19899 | }
|
19900 | /**
|
19901 | * Alias for {@link vec3.subtract}
|
19902 | * @function
|
19903 | */
|
19904 |
|
19905 | var sub$2 = subtract$2;
|
19906 | /**
|
19907 | * Alias for {@link vec3.multiply}
|
19908 | * @function
|
19909 | */
|
19910 |
|
19911 | var mul$4 = multiply$4;
|
19912 | /**
|
19913 | * Alias for {@link vec3.divide}
|
19914 | * @function
|
19915 | */
|
19916 |
|
19917 | var div$2 = divide$2;
|
19918 | /**
|
19919 | * Alias for {@link vec3.distance}
|
19920 | * @function
|
19921 | */
|
19922 |
|
19923 | var dist$2 = distance$2;
|
19924 | /**
|
19925 | * Alias for {@link vec3.squaredDistance}
|
19926 | * @function
|
19927 | */
|
19928 |
|
19929 | var sqrDist$2 = squaredDistance$2;
|
19930 | /**
|
19931 | * Alias for {@link vec3.length}
|
19932 | * @function
|
19933 | */
|
19934 |
|
19935 | var len$4 = length$4;
|
19936 | /**
|
19937 | * Alias for {@link vec3.squaredLength}
|
19938 | * @function
|
19939 | */
|
19940 |
|
19941 | var sqrLen$4 = squaredLength$4;
|
19942 | /**
|
19943 | * Perform some operation over an array of vec3s.
|
19944 | *
|
19945 | * @param {Array} a the array of vectors to iterate over
|
19946 | * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed
|
19947 | * @param {Number} offset Number of elements to skip at the beginning of the array
|
19948 | * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array
|
19949 | * @param {Function} fn Function to call for each vector in the array
|
19950 | * @param {Object} [arg] additional argument to pass to fn
|
19951 | * @returns {Array} a
|
19952 | * @function
|
19953 | */
|
19954 |
|
19955 | var forEach$2 = function () {
|
19956 | var vec = create$4();
|
19957 | return function (a, stride, offset, count, fn, arg) {
|
19958 | var i, l;
|
19959 |
|
19960 | if (!stride) {
|
19961 | stride = 3;
|
19962 | }
|
19963 |
|
19964 | if (!offset) {
|
19965 | offset = 0;
|
19966 | }
|
19967 |
|
19968 | if (count) {
|
19969 | l = Math.min(count * stride + offset, a.length);
|
19970 | } else {
|
19971 | l = a.length;
|
19972 | }
|
19973 |
|
19974 | for (i = offset; i < l; i += stride) {
|
19975 | vec[0] = a[i];
|
19976 | vec[1] = a[i + 1];
|
19977 | vec[2] = a[i + 2];
|
19978 | fn(vec, vec, arg);
|
19979 | a[i] = vec[0];
|
19980 | a[i + 1] = vec[1];
|
19981 | a[i + 2] = vec[2];
|
19982 | }
|
19983 |
|
19984 | return a;
|
19985 | };
|
19986 | }();
|
19987 |
|
19988 | var vec3 = /*#__PURE__*/Object.freeze({
|
19989 | __proto__: null,
|
19990 | create: create$4,
|
19991 | clone: clone$4,
|
19992 | length: length$4,
|
19993 | fromValues: fromValues$4,
|
19994 | copy: copy$4,
|
19995 | set: set$4,
|
19996 | add: add$4,
|
19997 | subtract: subtract$2,
|
19998 | multiply: multiply$4,
|
19999 | divide: divide$2,
|
20000 | ceil: ceil$2,
|
20001 | floor: floor$2,
|
20002 | min: min$2,
|
20003 | max: max$2,
|
20004 | round: round$2,
|
20005 | scale: scale$4,
|
20006 | scaleAndAdd: scaleAndAdd$2,
|
20007 | distance: distance$2,
|
20008 | squaredDistance: squaredDistance$2,
|
20009 | squaredLength: squaredLength$4,
|
20010 | negate: negate$2,
|
20011 | inverse: inverse$2,
|
20012 | normalize: normalize$4,
|
20013 | dot: dot$5,
|
20014 | cross: cross$2,
|
20015 | lerp: lerp$4,
|
20016 | hermite: hermite,
|
20017 | bezier: bezier,
|
20018 | random: random$3,
|
20019 | transformMat4: transformMat4$2,
|
20020 | transformMat3: transformMat3$1,
|
20021 | transformQuat: transformQuat$1,
|
20022 | rotateX: rotateX$2,
|
20023 | rotateY: rotateY$2,
|
20024 | rotateZ: rotateZ$2,
|
20025 | angle: angle$1,
|
20026 | zero: zero$2,
|
20027 | str: str$4,
|
20028 | exactEquals: exactEquals$4,
|
20029 | equals: equals$5,
|
20030 | sub: sub$2,
|
20031 | mul: mul$4,
|
20032 | div: div$2,
|
20033 | dist: dist$2,
|
20034 | sqrDist: sqrDist$2,
|
20035 | len: len$4,
|
20036 | sqrLen: sqrLen$4,
|
20037 | forEach: forEach$2
|
20038 | });
|
20039 |
|
20040 | /**
|
20041 | * 4 Dimensional Vector
|
20042 | * @module vec4
|
20043 | */
|
20044 |
|
20045 | /**
|
20046 | * Creates a new, empty vec4
|
20047 | *
|
20048 | * @returns {vec4} a new 4D vector
|
20049 | */
|
20050 |
|
20051 | function create$3() {
|
20052 | var out = new ARRAY_TYPE(4);
|
20053 |
|
20054 | if (ARRAY_TYPE != Float32Array) {
|
20055 | out[0] = 0;
|
20056 | out[1] = 0;
|
20057 | out[2] = 0;
|
20058 | out[3] = 0;
|
20059 | }
|
20060 |
|
20061 | return out;
|
20062 | }
|
20063 | /**
|
20064 | * Creates a new vec4 initialized with values from an existing vector
|
20065 | *
|
20066 | * @param {ReadonlyVec4} a vector to clone
|
20067 | * @returns {vec4} a new 4D vector
|
20068 | */
|
20069 |
|
20070 | function clone$3(a) {
|
20071 | var out = new ARRAY_TYPE(4);
|
20072 | out[0] = a[0];
|
20073 | out[1] = a[1];
|
20074 | out[2] = a[2];
|
20075 | out[3] = a[3];
|
20076 | return out;
|
20077 | }
|
20078 | /**
|
20079 | * Creates a new vec4 initialized with the given values
|
20080 | *
|
20081 | * @param {Number} x X component
|
20082 | * @param {Number} y Y component
|
20083 | * @param {Number} z Z component
|
20084 | * @param {Number} w W component
|
20085 | * @returns {vec4} a new 4D vector
|
20086 | */
|
20087 |
|
20088 | function fromValues$3(x, y, z, w) {
|
20089 | var out = new ARRAY_TYPE(4);
|
20090 | out[0] = x;
|
20091 | out[1] = y;
|
20092 | out[2] = z;
|
20093 | out[3] = w;
|
20094 | return out;
|
20095 | }
|
20096 | /**
|
20097 | * Copy the values from one vec4 to another
|
20098 | *
|
20099 | * @param {vec4} out the receiving vector
|
20100 | * @param {ReadonlyVec4} a the source vector
|
20101 | * @returns {vec4} out
|
20102 | */
|
20103 |
|
20104 | function copy$3(out, a) {
|
20105 | out[0] = a[0];
|
20106 | out[1] = a[1];
|
20107 | out[2] = a[2];
|
20108 | out[3] = a[3];
|
20109 | return out;
|
20110 | }
|
20111 | /**
|
20112 | * Set the components of a vec4 to the given values
|
20113 | *
|
20114 | * @param {vec4} out the receiving vector
|
20115 | * @param {Number} x X component
|
20116 | * @param {Number} y Y component
|
20117 | * @param {Number} z Z component
|
20118 | * @param {Number} w W component
|
20119 | * @returns {vec4} out
|
20120 | */
|
20121 |
|
20122 | function set$3(out, x, y, z, w) {
|
20123 | out[0] = x;
|
20124 | out[1] = y;
|
20125 | out[2] = z;
|
20126 | out[3] = w;
|
20127 | return out;
|
20128 | }
|
20129 | /**
|
20130 | * Adds two vec4's
|
20131 | *
|
20132 | * @param {vec4} out the receiving vector
|
20133 | * @param {ReadonlyVec4} a the first operand
|
20134 | * @param {ReadonlyVec4} b the second operand
|
20135 | * @returns {vec4} out
|
20136 | */
|
20137 |
|
20138 | function add$3(out, a, b) {
|
20139 | out[0] = a[0] + b[0];
|
20140 | out[1] = a[1] + b[1];
|
20141 | out[2] = a[2] + b[2];
|
20142 | out[3] = a[3] + b[3];
|
20143 | return out;
|
20144 | }
|
20145 | /**
|
20146 | * Subtracts vector b from vector a
|
20147 | *
|
20148 | * @param {vec4} out the receiving vector
|
20149 | * @param {ReadonlyVec4} a the first operand
|
20150 | * @param {ReadonlyVec4} b the second operand
|
20151 | * @returns {vec4} out
|
20152 | */
|
20153 |
|
20154 | function subtract$1(out, a, b) {
|
20155 | out[0] = a[0] - b[0];
|
20156 | out[1] = a[1] - b[1];
|
20157 | out[2] = a[2] - b[2];
|
20158 | out[3] = a[3] - b[3];
|
20159 | return out;
|
20160 | }
|
20161 | /**
|
20162 | * Multiplies two vec4's
|
20163 | *
|
20164 | * @param {vec4} out the receiving vector
|
20165 | * @param {ReadonlyVec4} a the first operand
|
20166 | * @param {ReadonlyVec4} b the second operand
|
20167 | * @returns {vec4} out
|
20168 | */
|
20169 |
|
20170 | function multiply$3(out, a, b) {
|
20171 | out[0] = a[0] * b[0];
|
20172 | out[1] = a[1] * b[1];
|
20173 | out[2] = a[2] * b[2];
|
20174 | out[3] = a[3] * b[3];
|
20175 | return out;
|
20176 | }
|
20177 | /**
|
20178 | * Divides two vec4's
|
20179 | *
|
20180 | * @param {vec4} out the receiving vector
|
20181 | * @param {ReadonlyVec4} a the first operand
|
20182 | * @param {ReadonlyVec4} b the second operand
|
20183 | * @returns {vec4} out
|
20184 | */
|
20185 |
|
20186 | function divide$1(out, a, b) {
|
20187 | out[0] = a[0] / b[0];
|
20188 | out[1] = a[1] / b[1];
|
20189 | out[2] = a[2] / b[2];
|
20190 | out[3] = a[3] / b[3];
|
20191 | return out;
|
20192 | }
|
20193 | /**
|
20194 | * Math.ceil the components of a vec4
|
20195 | *
|
20196 | * @param {vec4} out the receiving vector
|
20197 | * @param {ReadonlyVec4} a vector to ceil
|
20198 | * @returns {vec4} out
|
20199 | */
|
20200 |
|
20201 | function ceil$1(out, a) {
|
20202 | out[0] = Math.ceil(a[0]);
|
20203 | out[1] = Math.ceil(a[1]);
|
20204 | out[2] = Math.ceil(a[2]);
|
20205 | out[3] = Math.ceil(a[3]);
|
20206 | return out;
|
20207 | }
|
20208 | /**
|
20209 | * Math.floor the components of a vec4
|
20210 | *
|
20211 | * @param {vec4} out the receiving vector
|
20212 | * @param {ReadonlyVec4} a vector to floor
|
20213 | * @returns {vec4} out
|
20214 | */
|
20215 |
|
20216 | function floor$1(out, a) {
|
20217 | out[0] = Math.floor(a[0]);
|
20218 | out[1] = Math.floor(a[1]);
|
20219 | out[2] = Math.floor(a[2]);
|
20220 | out[3] = Math.floor(a[3]);
|
20221 | return out;
|
20222 | }
|
20223 | /**
|
20224 | * Returns the minimum of two vec4's
|
20225 | *
|
20226 | * @param {vec4} out the receiving vector
|
20227 | * @param {ReadonlyVec4} a the first operand
|
20228 | * @param {ReadonlyVec4} b the second operand
|
20229 | * @returns {vec4} out
|
20230 | */
|
20231 |
|
20232 | function min$1(out, a, b) {
|
20233 | out[0] = Math.min(a[0], b[0]);
|
20234 | out[1] = Math.min(a[1], b[1]);
|
20235 | out[2] = Math.min(a[2], b[2]);
|
20236 | out[3] = Math.min(a[3], b[3]);
|
20237 | return out;
|
20238 | }
|
20239 | /**
|
20240 | * Returns the maximum of two vec4's
|
20241 | *
|
20242 | * @param {vec4} out the receiving vector
|
20243 | * @param {ReadonlyVec4} a the first operand
|
20244 | * @param {ReadonlyVec4} b the second operand
|
20245 | * @returns {vec4} out
|
20246 | */
|
20247 |
|
20248 | function max$1(out, a, b) {
|
20249 | out[0] = Math.max(a[0], b[0]);
|
20250 | out[1] = Math.max(a[1], b[1]);
|
20251 | out[2] = Math.max(a[2], b[2]);
|
20252 | out[3] = Math.max(a[3], b[3]);
|
20253 | return out;
|
20254 | }
|
20255 | /**
|
20256 | * Math.round the components of a vec4
|
20257 | *
|
20258 | * @param {vec4} out the receiving vector
|
20259 | * @param {ReadonlyVec4} a vector to round
|
20260 | * @returns {vec4} out
|
20261 | */
|
20262 |
|
20263 | function round$1(out, a) {
|
20264 | out[0] = Math.round(a[0]);
|
20265 | out[1] = Math.round(a[1]);
|
20266 | out[2] = Math.round(a[2]);
|
20267 | out[3] = Math.round(a[3]);
|
20268 | return out;
|
20269 | }
|
20270 | /**
|
20271 | * Scales a vec4 by a scalar number
|
20272 | *
|
20273 | * @param {vec4} out the receiving vector
|
20274 | * @param {ReadonlyVec4} a the vector to scale
|
20275 | * @param {Number} b amount to scale the vector by
|
20276 | * @returns {vec4} out
|
20277 | */
|
20278 |
|
20279 | function scale$3(out, a, b) {
|
20280 | out[0] = a[0] * b;
|
20281 | out[1] = a[1] * b;
|
20282 | out[2] = a[2] * b;
|
20283 | out[3] = a[3] * b;
|
20284 | return out;
|
20285 | }
|
20286 | /**
|
20287 | * Adds two vec4's after scaling the second operand by a scalar value
|
20288 | *
|
20289 | * @param {vec4} out the receiving vector
|
20290 | * @param {ReadonlyVec4} a the first operand
|
20291 | * @param {ReadonlyVec4} b the second operand
|
20292 | * @param {Number} scale the amount to scale b by before adding
|
20293 | * @returns {vec4} out
|
20294 | */
|
20295 |
|
20296 | function scaleAndAdd$1(out, a, b, scale) {
|
20297 | out[0] = a[0] + b[0] * scale;
|
20298 | out[1] = a[1] + b[1] * scale;
|
20299 | out[2] = a[2] + b[2] * scale;
|
20300 | out[3] = a[3] + b[3] * scale;
|
20301 | return out;
|
20302 | }
|
20303 | /**
|
20304 | * Calculates the euclidian distance between two vec4's
|
20305 | *
|
20306 | * @param {ReadonlyVec4} a the first operand
|
20307 | * @param {ReadonlyVec4} b the second operand
|
20308 | * @returns {Number} distance between a and b
|
20309 | */
|
20310 |
|
20311 | function distance$1(a, b) {
|
20312 | var x = b[0] - a[0];
|
20313 | var y = b[1] - a[1];
|
20314 | var z = b[2] - a[2];
|
20315 | var w = b[3] - a[3];
|
20316 | return Math.hypot(x, y, z, w);
|
20317 | }
|
20318 | /**
|
20319 | * Calculates the squared euclidian distance between two vec4's
|
20320 | *
|
20321 | * @param {ReadonlyVec4} a the first operand
|
20322 | * @param {ReadonlyVec4} b the second operand
|
20323 | * @returns {Number} squared distance between a and b
|
20324 | */
|
20325 |
|
20326 | function squaredDistance$1(a, b) {
|
20327 | var x = b[0] - a[0];
|
20328 | var y = b[1] - a[1];
|
20329 | var z = b[2] - a[2];
|
20330 | var w = b[3] - a[3];
|
20331 | return x * x + y * y + z * z + w * w;
|
20332 | }
|
20333 | /**
|
20334 | * Calculates the length of a vec4
|
20335 | *
|
20336 | * @param {ReadonlyVec4} a vector to calculate length of
|
20337 | * @returns {Number} length of a
|
20338 | */
|
20339 |
|
20340 | function length$3(a) {
|
20341 | var x = a[0];
|
20342 | var y = a[1];
|
20343 | var z = a[2];
|
20344 | var w = a[3];
|
20345 | return Math.hypot(x, y, z, w);
|
20346 | }
|
20347 | /**
|
20348 | * Calculates the squared length of a vec4
|
20349 | *
|
20350 | * @param {ReadonlyVec4} a vector to calculate squared length of
|
20351 | * @returns {Number} squared length of a
|
20352 | */
|
20353 |
|
20354 | function squaredLength$3(a) {
|
20355 | var x = a[0];
|
20356 | var y = a[1];
|
20357 | var z = a[2];
|
20358 | var w = a[3];
|
20359 | return x * x + y * y + z * z + w * w;
|
20360 | }
|
20361 | /**
|
20362 | * Negates the components of a vec4
|
20363 | *
|
20364 | * @param {vec4} out the receiving vector
|
20365 | * @param {ReadonlyVec4} a vector to negate
|
20366 | * @returns {vec4} out
|
20367 | */
|
20368 |
|
20369 | function negate$1(out, a) {
|
20370 | out[0] = -a[0];
|
20371 | out[1] = -a[1];
|
20372 | out[2] = -a[2];
|
20373 | out[3] = -a[3];
|
20374 | return out;
|
20375 | }
|
20376 | /**
|
20377 | * Returns the inverse of the components of a vec4
|
20378 | *
|
20379 | * @param {vec4} out the receiving vector
|
20380 | * @param {ReadonlyVec4} a vector to invert
|
20381 | * @returns {vec4} out
|
20382 | */
|
20383 |
|
20384 | function inverse$1(out, a) {
|
20385 | out[0] = 1.0 / a[0];
|
20386 | out[1] = 1.0 / a[1];
|
20387 | out[2] = 1.0 / a[2];
|
20388 | out[3] = 1.0 / a[3];
|
20389 | return out;
|
20390 | }
|
20391 | /**
|
20392 | * Normalize a vec4
|
20393 | *
|
20394 | * @param {vec4} out the receiving vector
|
20395 | * @param {ReadonlyVec4} a vector to normalize
|
20396 | * @returns {vec4} out
|
20397 | */
|
20398 |
|
20399 | function normalize$3(out, a) {
|
20400 | var x = a[0];
|
20401 | var y = a[1];
|
20402 | var z = a[2];
|
20403 | var w = a[3];
|
20404 | var len = x * x + y * y + z * z + w * w;
|
20405 |
|
20406 | if (len > 0) {
|
20407 | len = 1 / Math.sqrt(len);
|
20408 | }
|
20409 |
|
20410 | out[0] = x * len;
|
20411 | out[1] = y * len;
|
20412 | out[2] = z * len;
|
20413 | out[3] = w * len;
|
20414 | return out;
|
20415 | }
|
20416 | /**
|
20417 | * Calculates the dot product of two vec4's
|
20418 | *
|
20419 | * @param {ReadonlyVec4} a the first operand
|
20420 | * @param {ReadonlyVec4} b the second operand
|
20421 | * @returns {Number} dot product of a and b
|
20422 | */
|
20423 |
|
20424 | function dot$4(a, b) {
|
20425 | return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
|
20426 | }
|
20427 | /**
|
20428 | * Returns the cross-product of three vectors in a 4-dimensional space
|
20429 | *
|
20430 | * @param {ReadonlyVec4} result the receiving vector
|
20431 | * @param {ReadonlyVec4} U the first vector
|
20432 | * @param {ReadonlyVec4} V the second vector
|
20433 | * @param {ReadonlyVec4} W the third vector
|
20434 | * @returns {vec4} result
|
20435 | */
|
20436 |
|
20437 | function cross$1(out, u, v, w) {
|
20438 | var A = v[0] * w[1] - v[1] * w[0],
|
20439 | B = v[0] * w[2] - v[2] * w[0],
|
20440 | C = v[0] * w[3] - v[3] * w[0],
|
20441 | D = v[1] * w[2] - v[2] * w[1],
|
20442 | E = v[1] * w[3] - v[3] * w[1],
|
20443 | F = v[2] * w[3] - v[3] * w[2];
|
20444 | var G = u[0];
|
20445 | var H = u[1];
|
20446 | var I = u[2];
|
20447 | var J = u[3];
|
20448 | out[0] = H * F - I * E + J * D;
|
20449 | out[1] = -(G * F) + I * C - J * B;
|
20450 | out[2] = G * E - H * C + J * A;
|
20451 | out[3] = -(G * D) + H * B - I * A;
|
20452 | return out;
|
20453 | }
|
20454 | /**
|
20455 | * Performs a linear interpolation between two vec4's
|
20456 | *
|
20457 | * @param {vec4} out the receiving vector
|
20458 | * @param {ReadonlyVec4} a the first operand
|
20459 | * @param {ReadonlyVec4} b the second operand
|
20460 | * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
|
20461 | * @returns {vec4} out
|
20462 | */
|
20463 |
|
20464 | function lerp$3(out, a, b, t) {
|
20465 | var ax = a[0];
|
20466 | var ay = a[1];
|
20467 | var az = a[2];
|
20468 | var aw = a[3];
|
20469 | out[0] = ax + t * (b[0] - ax);
|
20470 | out[1] = ay + t * (b[1] - ay);
|
20471 | out[2] = az + t * (b[2] - az);
|
20472 | out[3] = aw + t * (b[3] - aw);
|
20473 | return out;
|
20474 | }
|
20475 | /**
|
20476 | * Generates a random vector with the given scale
|
20477 | *
|
20478 | * @param {vec4} out the receiving vector
|
20479 | * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned
|
20480 | * @returns {vec4} out
|
20481 | */
|
20482 |
|
20483 | function random$2(out, scale) {
|
20484 | scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a
|
20485 | // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.
|
20486 | // http://projecteuclid.org/euclid.aoms/1177692644;
|
20487 |
|
20488 | var v1, v2, v3, v4;
|
20489 | var s1, s2;
|
20490 |
|
20491 | do {
|
20492 | v1 = RANDOM() * 2 - 1;
|
20493 | v2 = RANDOM() * 2 - 1;
|
20494 | s1 = v1 * v1 + v2 * v2;
|
20495 | } while (s1 >= 1);
|
20496 |
|
20497 | do {
|
20498 | v3 = RANDOM() * 2 - 1;
|
20499 | v4 = RANDOM() * 2 - 1;
|
20500 | s2 = v3 * v3 + v4 * v4;
|
20501 | } while (s2 >= 1);
|
20502 |
|
20503 | var d = Math.sqrt((1 - s1) / s2);
|
20504 | out[0] = scale * v1;
|
20505 | out[1] = scale * v2;
|
20506 | out[2] = scale * v3 * d;
|
20507 | out[3] = scale * v4 * d;
|
20508 | return out;
|
20509 | }
|
20510 | /**
|
20511 | * Transforms the vec4 with a mat4.
|
20512 | *
|
20513 | * @param {vec4} out the receiving vector
|
20514 | * @param {ReadonlyVec4} a the vector to transform
|
20515 | * @param {ReadonlyMat4} m matrix to transform with
|
20516 | * @returns {vec4} out
|
20517 | */
|
20518 |
|
20519 | function transformMat4$1(out, a, m) {
|
20520 | var x = a[0],
|
20521 | y = a[1],
|
20522 | z = a[2],
|
20523 | w = a[3];
|
20524 | out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
|
20525 | out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
|
20526 | out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
|
20527 | out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
|
20528 | return out;
|
20529 | }
|
20530 | /**
|
20531 | * Transforms the vec4 with a quat
|
20532 | *
|
20533 | * @param {vec4} out the receiving vector
|
20534 | * @param {ReadonlyVec4} a the vector to transform
|
20535 | * @param {ReadonlyQuat} q quaternion to transform with
|
20536 | * @returns {vec4} out
|
20537 | */
|
20538 |
|
20539 | function transformQuat(out, a, q) {
|
20540 | var x = a[0],
|
20541 | y = a[1],
|
20542 | z = a[2];
|
20543 | var qx = q[0],
|
20544 | qy = q[1],
|
20545 | qz = q[2],
|
20546 | qw = q[3]; // calculate quat * vec
|
20547 |
|
20548 | var ix = qw * x + qy * z - qz * y;
|
20549 | var iy = qw * y + qz * x - qx * z;
|
20550 | var iz = qw * z + qx * y - qy * x;
|
20551 | var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat
|
20552 |
|
20553 | out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
|
20554 | out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
|
20555 | out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
|
20556 | out[3] = a[3];
|
20557 | return out;
|
20558 | }
|
20559 | /**
|
20560 | * Set the components of a vec4 to zero
|
20561 | *
|
20562 | * @param {vec4} out the receiving vector
|
20563 | * @returns {vec4} out
|
20564 | */
|
20565 |
|
20566 | function zero$1(out) {
|
20567 | out[0] = 0.0;
|
20568 | out[1] = 0.0;
|
20569 | out[2] = 0.0;
|
20570 | out[3] = 0.0;
|
20571 | return out;
|
20572 | }
|
20573 | /**
|
20574 | * Returns a string representation of a vector
|
20575 | *
|
20576 | * @param {ReadonlyVec4} a vector to represent as a string
|
20577 | * @returns {String} string representation of the vector
|
20578 | */
|
20579 |
|
20580 | function str$3(a) {
|
20581 | return "vec4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")";
|
20582 | }
|
20583 | /**
|
20584 | * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)
|
20585 | *
|
20586 | * @param {ReadonlyVec4} a The first vector.
|
20587 | * @param {ReadonlyVec4} b The second vector.
|
20588 | * @returns {Boolean} True if the vectors are equal, false otherwise.
|
20589 | */
|
20590 |
|
20591 | function exactEquals$3(a, b) {
|
20592 | return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];
|
20593 | }
|
20594 | /**
|
20595 | * Returns whether or not the vectors have approximately the same elements in the same position.
|
20596 | *
|
20597 | * @param {ReadonlyVec4} a The first vector.
|
20598 | * @param {ReadonlyVec4} b The second vector.
|
20599 | * @returns {Boolean} True if the vectors are equal, false otherwise.
|
20600 | */
|
20601 |
|
20602 | function equals$4(a, b) {
|
20603 | var a0 = a[0],
|
20604 | a1 = a[1],
|
20605 | a2 = a[2],
|
20606 | a3 = a[3];
|
20607 | var b0 = b[0],
|
20608 | b1 = b[1],
|
20609 | b2 = b[2],
|
20610 | b3 = b[3];
|
20611 | return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));
|
20612 | }
|
20613 | /**
|
20614 | * Alias for {@link vec4.subtract}
|
20615 | * @function
|
20616 | */
|
20617 |
|
20618 | var sub$1 = subtract$1;
|
20619 | /**
|
20620 | * Alias for {@link vec4.multiply}
|
20621 | * @function
|
20622 | */
|
20623 |
|
20624 | var mul$3 = multiply$3;
|
20625 | /**
|
20626 | * Alias for {@link vec4.divide}
|
20627 | * @function
|
20628 | */
|
20629 |
|
20630 | var div$1 = divide$1;
|
20631 | /**
|
20632 | * Alias for {@link vec4.distance}
|
20633 | * @function
|
20634 | */
|
20635 |
|
20636 | var dist$1 = distance$1;
|
20637 | /**
|
20638 | * Alias for {@link vec4.squaredDistance}
|
20639 | * @function
|
20640 | */
|
20641 |
|
20642 | var sqrDist$1 = squaredDistance$1;
|
20643 | /**
|
20644 | * Alias for {@link vec4.length}
|
20645 | * @function
|
20646 | */
|
20647 |
|
20648 | var len$3 = length$3;
|
20649 | /**
|
20650 | * Alias for {@link vec4.squaredLength}
|
20651 | * @function
|
20652 | */
|
20653 |
|
20654 | var sqrLen$3 = squaredLength$3;
|
20655 | /**
|
20656 | * Perform some operation over an array of vec4s.
|
20657 | *
|
20658 | * @param {Array} a the array of vectors to iterate over
|
20659 | * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed
|
20660 | * @param {Number} offset Number of elements to skip at the beginning of the array
|
20661 | * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array
|
20662 | * @param {Function} fn Function to call for each vector in the array
|
20663 | * @param {Object} [arg] additional argument to pass to fn
|
20664 | * @returns {Array} a
|
20665 | * @function
|
20666 | */
|
20667 |
|
20668 | var forEach$1 = function () {
|
20669 | var vec = create$3();
|
20670 | return function (a, stride, offset, count, fn, arg) {
|
20671 | var i, l;
|
20672 |
|
20673 | if (!stride) {
|
20674 | stride = 4;
|
20675 | }
|
20676 |
|
20677 | if (!offset) {
|
20678 | offset = 0;
|
20679 | }
|
20680 |
|
20681 | if (count) {
|
20682 | l = Math.min(count * stride + offset, a.length);
|
20683 | } else {
|
20684 | l = a.length;
|
20685 | }
|
20686 |
|
20687 | for (i = offset; i < l; i += stride) {
|
20688 | vec[0] = a[i];
|
20689 | vec[1] = a[i + 1];
|
20690 | vec[2] = a[i + 2];
|
20691 | vec[3] = a[i + 3];
|
20692 | fn(vec, vec, arg);
|
20693 | a[i] = vec[0];
|
20694 | a[i + 1] = vec[1];
|
20695 | a[i + 2] = vec[2];
|
20696 | a[i + 3] = vec[3];
|
20697 | }
|
20698 |
|
20699 | return a;
|
20700 | };
|
20701 | }();
|
20702 |
|
20703 | var vec4 = /*#__PURE__*/Object.freeze({
|
20704 | __proto__: null,
|
20705 | create: create$3,
|
20706 | clone: clone$3,
|
20707 | fromValues: fromValues$3,
|
20708 | copy: copy$3,
|
20709 | set: set$3,
|
20710 | add: add$3,
|
20711 | subtract: subtract$1,
|
20712 | multiply: multiply$3,
|
20713 | divide: divide$1,
|
20714 | ceil: ceil$1,
|
20715 | floor: floor$1,
|
20716 | min: min$1,
|
20717 | max: max$1,
|
20718 | round: round$1,
|
20719 | scale: scale$3,
|
20720 | scaleAndAdd: scaleAndAdd$1,
|
20721 | distance: distance$1,
|
20722 | squaredDistance: squaredDistance$1,
|
20723 | length: length$3,
|
20724 | squaredLength: squaredLength$3,
|
20725 | negate: negate$1,
|
20726 | inverse: inverse$1,
|
20727 | normalize: normalize$3,
|
20728 | dot: dot$4,
|
20729 | cross: cross$1,
|
20730 | lerp: lerp$3,
|
20731 | random: random$2,
|
20732 | transformMat4: transformMat4$1,
|
20733 | transformQuat: transformQuat,
|
20734 | zero: zero$1,
|
20735 | str: str$3,
|
20736 | exactEquals: exactEquals$3,
|
20737 | equals: equals$4,
|
20738 | sub: sub$1,
|
20739 | mul: mul$3,
|
20740 | div: div$1,
|
20741 | dist: dist$1,
|
20742 | sqrDist: sqrDist$1,
|
20743 | len: len$3,
|
20744 | sqrLen: sqrLen$3,
|
20745 | forEach: forEach$1
|
20746 | });
|
20747 |
|
20748 | /**
|
20749 | * Quaternion
|
20750 | * @module quat
|
20751 | */
|
20752 |
|
20753 | /**
|
20754 | * Creates a new identity quat
|
20755 | *
|
20756 | * @returns {quat} a new quaternion
|
20757 | */
|
20758 |
|
20759 | function create$2() {
|
20760 | var out = new ARRAY_TYPE(4);
|
20761 |
|
20762 | if (ARRAY_TYPE != Float32Array) {
|
20763 | out[0] = 0;
|
20764 | out[1] = 0;
|
20765 | out[2] = 0;
|
20766 | }
|
20767 |
|
20768 | out[3] = 1;
|
20769 | return out;
|
20770 | }
|
20771 | /**
|
20772 | * Set a quat to the identity quaternion
|
20773 | *
|
20774 | * @param {quat} out the receiving quaternion
|
20775 | * @returns {quat} out
|
20776 | */
|
20777 |
|
20778 | function identity$1(out) {
|
20779 | out[0] = 0;
|
20780 | out[1] = 0;
|
20781 | out[2] = 0;
|
20782 | out[3] = 1;
|
20783 | return out;
|
20784 | }
|
20785 | /**
|
20786 | * Sets a quat from the given angle and rotation axis,
|
20787 | * then returns it.
|
20788 | *
|
20789 | * @param {quat} out the receiving quaternion
|
20790 | * @param {ReadonlyVec3} axis the axis around which to rotate
|
20791 | * @param {Number} rad the angle in radians
|
20792 | * @returns {quat} out
|
20793 | **/
|
20794 |
|
20795 | function setAxisAngle(out, axis, rad) {
|
20796 | rad = rad * 0.5;
|
20797 | var s = Math.sin(rad);
|
20798 | out[0] = s * axis[0];
|
20799 | out[1] = s * axis[1];
|
20800 | out[2] = s * axis[2];
|
20801 | out[3] = Math.cos(rad);
|
20802 | return out;
|
20803 | }
|
20804 | /**
|
20805 | * Gets the rotation axis and angle for a given
|
20806 | * quaternion. If a quaternion is created with
|
20807 | * setAxisAngle, this method will return the same
|
20808 | * values as providied in the original parameter list
|
20809 | * OR functionally equivalent values.
|
20810 | * Example: The quaternion formed by axis [0, 0, 1] and
|
20811 | * angle -90 is the same as the quaternion formed by
|
20812 | * [0, 0, 1] and 270. This method favors the latter.
|
20813 | * @param {vec3} out_axis Vector receiving the axis of rotation
|
20814 | * @param {ReadonlyQuat} q Quaternion to be decomposed
|
20815 | * @return {Number} Angle, in radians, of the rotation
|
20816 | */
|
20817 |
|
20818 | function getAxisAngle(out_axis, q) {
|
20819 | var rad = Math.acos(q[3]) * 2.0;
|
20820 | var s = Math.sin(rad / 2.0);
|
20821 |
|
20822 | if (s > EPSILON) {
|
20823 | out_axis[0] = q[0] / s;
|
20824 | out_axis[1] = q[1] / s;
|
20825 | out_axis[2] = q[2] / s;
|
20826 | } else {
|
20827 | // If s is zero, return any axis (no rotation - axis does not matter)
|
20828 | out_axis[0] = 1;
|
20829 | out_axis[1] = 0;
|
20830 | out_axis[2] = 0;
|
20831 | }
|
20832 |
|
20833 | return rad;
|
20834 | }
|
20835 | /**
|
20836 | * Gets the angular distance between two unit quaternions
|
20837 | *
|
20838 | * @param {ReadonlyQuat} a Origin unit quaternion
|
20839 | * @param {ReadonlyQuat} b Destination unit quaternion
|
20840 | * @return {Number} Angle, in radians, between the two quaternions
|
20841 | */
|
20842 |
|
20843 | function getAngle(a, b) {
|
20844 | var dotproduct = dot$3(a, b);
|
20845 | return Math.acos(2 * dotproduct * dotproduct - 1);
|
20846 | }
|
20847 | /**
|
20848 | * Multiplies two quat's
|
20849 | *
|
20850 | * @param {quat} out the receiving quaternion
|
20851 | * @param {ReadonlyQuat} a the first operand
|
20852 | * @param {ReadonlyQuat} b the second operand
|
20853 | * @returns {quat} out
|
20854 | */
|
20855 |
|
20856 | function multiply$2(out, a, b) {
|
20857 | var ax = a[0],
|
20858 | ay = a[1],
|
20859 | az = a[2],
|
20860 | aw = a[3];
|
20861 | var bx = b[0],
|
20862 | by = b[1],
|
20863 | bz = b[2],
|
20864 | bw = b[3];
|
20865 | out[0] = ax * bw + aw * bx + ay * bz - az * by;
|
20866 | out[1] = ay * bw + aw * by + az * bx - ax * bz;
|
20867 | out[2] = az * bw + aw * bz + ax * by - ay * bx;
|
20868 | out[3] = aw * bw - ax * bx - ay * by - az * bz;
|
20869 | return out;
|
20870 | }
|
20871 | /**
|
20872 | * Rotates a quaternion by the given angle about the X axis
|
20873 | *
|
20874 | * @param {quat} out quat receiving operation result
|
20875 | * @param {ReadonlyQuat} a quat to rotate
|
20876 | * @param {number} rad angle (in radians) to rotate
|
20877 | * @returns {quat} out
|
20878 | */
|
20879 |
|
20880 | function rotateX$1(out, a, rad) {
|
20881 | rad *= 0.5;
|
20882 | var ax = a[0],
|
20883 | ay = a[1],
|
20884 | az = a[2],
|
20885 | aw = a[3];
|
20886 | var bx = Math.sin(rad),
|
20887 | bw = Math.cos(rad);
|
20888 | out[0] = ax * bw + aw * bx;
|
20889 | out[1] = ay * bw + az * bx;
|
20890 | out[2] = az * bw - ay * bx;
|
20891 | out[3] = aw * bw - ax * bx;
|
20892 | return out;
|
20893 | }
|
20894 | /**
|
20895 | * Rotates a quaternion by the given angle about the Y axis
|
20896 | *
|
20897 | * @param {quat} out quat receiving operation result
|
20898 | * @param {ReadonlyQuat} a quat to rotate
|
20899 | * @param {number} rad angle (in radians) to rotate
|
20900 | * @returns {quat} out
|
20901 | */
|
20902 |
|
20903 | function rotateY$1(out, a, rad) {
|
20904 | rad *= 0.5;
|
20905 | var ax = a[0],
|
20906 | ay = a[1],
|
20907 | az = a[2],
|
20908 | aw = a[3];
|
20909 | var by = Math.sin(rad),
|
20910 | bw = Math.cos(rad);
|
20911 | out[0] = ax * bw - az * by;
|
20912 | out[1] = ay * bw + aw * by;
|
20913 | out[2] = az * bw + ax * by;
|
20914 | out[3] = aw * bw - ay * by;
|
20915 | return out;
|
20916 | }
|
20917 | /**
|
20918 | * Rotates a quaternion by the given angle about the Z axis
|
20919 | *
|
20920 | * @param {quat} out quat receiving operation result
|
20921 | * @param {ReadonlyQuat} a quat to rotate
|
20922 | * @param {number} rad angle (in radians) to rotate
|
20923 | * @returns {quat} out
|
20924 | */
|
20925 |
|
20926 | function rotateZ$1(out, a, rad) {
|
20927 | rad *= 0.5;
|
20928 | var ax = a[0],
|
20929 | ay = a[1],
|
20930 | az = a[2],
|
20931 | aw = a[3];
|
20932 | var bz = Math.sin(rad),
|
20933 | bw = Math.cos(rad);
|
20934 | out[0] = ax * bw + ay * bz;
|
20935 | out[1] = ay * bw - ax * bz;
|
20936 | out[2] = az * bw + aw * bz;
|
20937 | out[3] = aw * bw - az * bz;
|
20938 | return out;
|
20939 | }
|
20940 | /**
|
20941 | * Calculates the W component of a quat from the X, Y, and Z components.
|
20942 | * Assumes that quaternion is 1 unit in length.
|
20943 | * Any existing W component will be ignored.
|
20944 | *
|
20945 | * @param {quat} out the receiving quaternion
|
20946 | * @param {ReadonlyQuat} a quat to calculate W component of
|
20947 | * @returns {quat} out
|
20948 | */
|
20949 |
|
20950 | function calculateW(out, a) {
|
20951 | var x = a[0],
|
20952 | y = a[1],
|
20953 | z = a[2];
|
20954 | out[0] = x;
|
20955 | out[1] = y;
|
20956 | out[2] = z;
|
20957 | out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));
|
20958 | return out;
|
20959 | }
|
20960 | /**
|
20961 | * Calculate the exponential of a unit quaternion.
|
20962 | *
|
20963 | * @param {quat} out the receiving quaternion
|
20964 | * @param {ReadonlyQuat} a quat to calculate the exponential of
|
20965 | * @returns {quat} out
|
20966 | */
|
20967 |
|
20968 | function exp(out, a) {
|
20969 | var x = a[0],
|
20970 | y = a[1],
|
20971 | z = a[2],
|
20972 | w = a[3];
|
20973 | var r = Math.sqrt(x * x + y * y + z * z);
|
20974 | var et = Math.exp(w);
|
20975 | var s = r > 0 ? et * Math.sin(r) / r : 0;
|
20976 | out[0] = x * s;
|
20977 | out[1] = y * s;
|
20978 | out[2] = z * s;
|
20979 | out[3] = et * Math.cos(r);
|
20980 | return out;
|
20981 | }
|
20982 | /**
|
20983 | * Calculate the natural logarithm of a unit quaternion.
|
20984 | *
|
20985 | * @param {quat} out the receiving quaternion
|
20986 | * @param {ReadonlyQuat} a quat to calculate the exponential of
|
20987 | * @returns {quat} out
|
20988 | */
|
20989 |
|
20990 | function ln(out, a) {
|
20991 | var x = a[0],
|
20992 | y = a[1],
|
20993 | z = a[2],
|
20994 | w = a[3];
|
20995 | var r = Math.sqrt(x * x + y * y + z * z);
|
20996 | var t = r > 0 ? Math.atan2(r, w) / r : 0;
|
20997 | out[0] = x * t;
|
20998 | out[1] = y * t;
|
20999 | out[2] = z * t;
|
21000 | out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);
|
21001 | return out;
|
21002 | }
|
21003 | /**
|
21004 | * Calculate the scalar power of a unit quaternion.
|
21005 | *
|
21006 | * @param {quat} out the receiving quaternion
|
21007 | * @param {ReadonlyQuat} a quat to calculate the exponential of
|
21008 | * @param {Number} b amount to scale the quaternion by
|
21009 | * @returns {quat} out
|
21010 | */
|
21011 |
|
21012 | function pow(out, a, b) {
|
21013 | ln(out, a);
|
21014 | scale$2(out, out, b);
|
21015 | exp(out, out);
|
21016 | return out;
|
21017 | }
|
21018 | /**
|
21019 | * Performs a spherical linear interpolation between two quat
|
21020 | *
|
21021 | * @param {quat} out the receiving quaternion
|
21022 | * @param {ReadonlyQuat} a the first operand
|
21023 | * @param {ReadonlyQuat} b the second operand
|
21024 | * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
|
21025 | * @returns {quat} out
|
21026 | */
|
21027 |
|
21028 | function slerp(out, a, b, t) {
|
21029 | // benchmarks:
|
21030 | // http://jsperf.com/quaternion-slerp-implementations
|
21031 | var ax = a[0],
|
21032 | ay = a[1],
|
21033 | az = a[2],
|
21034 | aw = a[3];
|
21035 | var bx = b[0],
|
21036 | by = b[1],
|
21037 | bz = b[2],
|
21038 | bw = b[3];
|
21039 | var omega, cosom, sinom, scale0, scale1; // calc cosine
|
21040 |
|
21041 | cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)
|
21042 |
|
21043 | if (cosom < 0.0) {
|
21044 | cosom = -cosom;
|
21045 | bx = -bx;
|
21046 | by = -by;
|
21047 | bz = -bz;
|
21048 | bw = -bw;
|
21049 | } // calculate coefficients
|
21050 |
|
21051 |
|
21052 | if (1.0 - cosom > EPSILON) {
|
21053 | // standard case (slerp)
|
21054 | omega = Math.acos(cosom);
|
21055 | sinom = Math.sin(omega);
|
21056 | scale0 = Math.sin((1.0 - t) * omega) / sinom;
|
21057 | scale1 = Math.sin(t * omega) / sinom;
|
21058 | } else {
|
21059 | // "from" and "to" quaternions are very close
|
21060 | // ... so we can do a linear interpolation
|
21061 | scale0 = 1.0 - t;
|
21062 | scale1 = t;
|
21063 | } // calculate final values
|
21064 |
|
21065 |
|
21066 | out[0] = scale0 * ax + scale1 * bx;
|
21067 | out[1] = scale0 * ay + scale1 * by;
|
21068 | out[2] = scale0 * az + scale1 * bz;
|
21069 | out[3] = scale0 * aw + scale1 * bw;
|
21070 | return out;
|
21071 | }
|
21072 | /**
|
21073 | * Generates a random unit quaternion
|
21074 | *
|
21075 | * @param {quat} out the receiving quaternion
|
21076 | * @returns {quat} out
|
21077 | */
|
21078 |
|
21079 | function random$1(out) {
|
21080 | // Implementation of http://planning.cs.uiuc.edu/node198.html
|
21081 | // TODO: Calling random 3 times is probably not the fastest solution
|
21082 | var u1 = RANDOM();
|
21083 | var u2 = RANDOM();
|
21084 | var u3 = RANDOM();
|
21085 | var sqrt1MinusU1 = Math.sqrt(1 - u1);
|
21086 | var sqrtU1 = Math.sqrt(u1);
|
21087 | out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);
|
21088 | out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);
|
21089 | out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);
|
21090 | out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);
|
21091 | return out;
|
21092 | }
|
21093 | /**
|
21094 | * Calculates the inverse of a quat
|
21095 | *
|
21096 | * @param {quat} out the receiving quaternion
|
21097 | * @param {ReadonlyQuat} a quat to calculate inverse of
|
21098 | * @returns {quat} out
|
21099 | */
|
21100 |
|
21101 | function invert$1(out, a) {
|
21102 | var a0 = a[0],
|
21103 | a1 = a[1],
|
21104 | a2 = a[2],
|
21105 | a3 = a[3];
|
21106 | var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;
|
21107 | var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0
|
21108 |
|
21109 | out[0] = -a0 * invDot;
|
21110 | out[1] = -a1 * invDot;
|
21111 | out[2] = -a2 * invDot;
|
21112 | out[3] = a3 * invDot;
|
21113 | return out;
|
21114 | }
|
21115 | /**
|
21116 | * Calculates the conjugate of a quat
|
21117 | * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.
|
21118 | *
|
21119 | * @param {quat} out the receiving quaternion
|
21120 | * @param {ReadonlyQuat} a quat to calculate conjugate of
|
21121 | * @returns {quat} out
|
21122 | */
|
21123 |
|
21124 | function conjugate$1(out, a) {
|
21125 | out[0] = -a[0];
|
21126 | out[1] = -a[1];
|
21127 | out[2] = -a[2];
|
21128 | out[3] = a[3];
|
21129 | return out;
|
21130 | }
|
21131 | /**
|
21132 | * Creates a quaternion from the given 3x3 rotation matrix.
|
21133 | *
|
21134 | * NOTE: The resultant quaternion is not normalized, so you should be sure
|
21135 | * to renormalize the quaternion yourself where necessary.
|
21136 | *
|
21137 | * @param {quat} out the receiving quaternion
|
21138 | * @param {ReadonlyMat3} m rotation matrix
|
21139 | * @returns {quat} out
|
21140 | * @function
|
21141 | */
|
21142 |
|
21143 | function fromMat3(out, m) {
|
21144 | // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes
|
21145 | // article "Quaternion Calculus and Fast Animation".
|
21146 | var fTrace = m[0] + m[4] + m[8];
|
21147 | var fRoot;
|
21148 |
|
21149 | if (fTrace > 0.0) {
|
21150 | // |w| > 1/2, may as well choose w > 1/2
|
21151 | fRoot = Math.sqrt(fTrace + 1.0); // 2w
|
21152 |
|
21153 | out[3] = 0.5 * fRoot;
|
21154 | fRoot = 0.5 / fRoot; // 1/(4w)
|
21155 |
|
21156 | out[0] = (m[5] - m[7]) * fRoot;
|
21157 | out[1] = (m[6] - m[2]) * fRoot;
|
21158 | out[2] = (m[1] - m[3]) * fRoot;
|
21159 | } else {
|
21160 | // |w| <= 1/2
|
21161 | var i = 0;
|
21162 | if (m[4] > m[0]) i = 1;
|
21163 | if (m[8] > m[i * 3 + i]) i = 2;
|
21164 | var j = (i + 1) % 3;
|
21165 | var k = (i + 2) % 3;
|
21166 | fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);
|
21167 | out[i] = 0.5 * fRoot;
|
21168 | fRoot = 0.5 / fRoot;
|
21169 | out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;
|
21170 | out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;
|
21171 | out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;
|
21172 | }
|
21173 |
|
21174 | return out;
|
21175 | }
|
21176 | /**
|
21177 | * Creates a quaternion from the given euler angle x, y, z.
|
21178 | *
|
21179 | * @param {quat} out the receiving quaternion
|
21180 | * @param {x} Angle to rotate around X axis in degrees.
|
21181 | * @param {y} Angle to rotate around Y axis in degrees.
|
21182 | * @param {z} Angle to rotate around Z axis in degrees.
|
21183 | * @returns {quat} out
|
21184 | * @function
|
21185 | */
|
21186 |
|
21187 | function fromEuler(out, x, y, z) {
|
21188 | var halfToRad = 0.5 * Math.PI / 180.0;
|
21189 | x *= halfToRad;
|
21190 | y *= halfToRad;
|
21191 | z *= halfToRad;
|
21192 | var sx = Math.sin(x);
|
21193 | var cx = Math.cos(x);
|
21194 | var sy = Math.sin(y);
|
21195 | var cy = Math.cos(y);
|
21196 | var sz = Math.sin(z);
|
21197 | var cz = Math.cos(z);
|
21198 | out[0] = sx * cy * cz - cx * sy * sz;
|
21199 | out[1] = cx * sy * cz + sx * cy * sz;
|
21200 | out[2] = cx * cy * sz - sx * sy * cz;
|
21201 | out[3] = cx * cy * cz + sx * sy * sz;
|
21202 | return out;
|
21203 | }
|
21204 | /**
|
21205 | * Returns a string representation of a quatenion
|
21206 | *
|
21207 | * @param {ReadonlyQuat} a vector to represent as a string
|
21208 | * @returns {String} string representation of the vector
|
21209 | */
|
21210 |
|
21211 | function str$2(a) {
|
21212 | return "quat(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")";
|
21213 | }
|
21214 | /**
|
21215 | * Creates a new quat initialized with values from an existing quaternion
|
21216 | *
|
21217 | * @param {ReadonlyQuat} a quaternion to clone
|
21218 | * @returns {quat} a new quaternion
|
21219 | * @function
|
21220 | */
|
21221 |
|
21222 | var clone$2 = clone$3;
|
21223 | /**
|
21224 | * Creates a new quat initialized with the given values
|
21225 | *
|
21226 | * @param {Number} x X component
|
21227 | * @param {Number} y Y component
|
21228 | * @param {Number} z Z component
|
21229 | * @param {Number} w W component
|
21230 | * @returns {quat} a new quaternion
|
21231 | * @function
|
21232 | */
|
21233 |
|
21234 | var fromValues$2 = fromValues$3;
|
21235 | /**
|
21236 | * Copy the values from one quat to another
|
21237 | *
|
21238 | * @param {quat} out the receiving quaternion
|
21239 | * @param {ReadonlyQuat} a the source quaternion
|
21240 | * @returns {quat} out
|
21241 | * @function
|
21242 | */
|
21243 |
|
21244 | var copy$2 = copy$3;
|
21245 | /**
|
21246 | * Set the components of a quat to the given values
|
21247 | *
|
21248 | * @param {quat} out the receiving quaternion
|
21249 | * @param {Number} x X component
|
21250 | * @param {Number} y Y component
|
21251 | * @param {Number} z Z component
|
21252 | * @param {Number} w W component
|
21253 | * @returns {quat} out
|
21254 | * @function
|
21255 | */
|
21256 |
|
21257 | var set$2 = set$3;
|
21258 | /**
|
21259 | * Adds two quat's
|
21260 | *
|
21261 | * @param {quat} out the receiving quaternion
|
21262 | * @param {ReadonlyQuat} a the first operand
|
21263 | * @param {ReadonlyQuat} b the second operand
|
21264 | * @returns {quat} out
|
21265 | * @function
|
21266 | */
|
21267 |
|
21268 | var add$2 = add$3;
|
21269 | /**
|
21270 | * Alias for {@link quat.multiply}
|
21271 | * @function
|
21272 | */
|
21273 |
|
21274 | var mul$2 = multiply$2;
|
21275 | /**
|
21276 | * Scales a quat by a scalar number
|
21277 | *
|
21278 | * @param {quat} out the receiving vector
|
21279 | * @param {ReadonlyQuat} a the vector to scale
|
21280 | * @param {Number} b amount to scale the vector by
|
21281 | * @returns {quat} out
|
21282 | * @function
|
21283 | */
|
21284 |
|
21285 | var scale$2 = scale$3;
|
21286 | /**
|
21287 | * Calculates the dot product of two quat's
|
21288 | *
|
21289 | * @param {ReadonlyQuat} a the first operand
|
21290 | * @param {ReadonlyQuat} b the second operand
|
21291 | * @returns {Number} dot product of a and b
|
21292 | * @function
|
21293 | */
|
21294 |
|
21295 | var dot$3 = dot$4;
|
21296 | /**
|
21297 | * Performs a linear interpolation between two quat's
|
21298 | *
|
21299 | * @param {quat} out the receiving quaternion
|
21300 | * @param {ReadonlyQuat} a the first operand
|
21301 | * @param {ReadonlyQuat} b the second operand
|
21302 | * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
|
21303 | * @returns {quat} out
|
21304 | * @function
|
21305 | */
|
21306 |
|
21307 | var lerp$2 = lerp$3;
|
21308 | /**
|
21309 | * Calculates the length of a quat
|
21310 | *
|
21311 | * @param {ReadonlyQuat} a vector to calculate length of
|
21312 | * @returns {Number} length of a
|
21313 | */
|
21314 |
|
21315 | var length$2 = length$3;
|
21316 | /**
|
21317 | * Alias for {@link quat.length}
|
21318 | * @function
|
21319 | */
|
21320 |
|
21321 | var len$2 = length$2;
|
21322 | /**
|
21323 | * Calculates the squared length of a quat
|
21324 | *
|
21325 | * @param {ReadonlyQuat} a vector to calculate squared length of
|
21326 | * @returns {Number} squared length of a
|
21327 | * @function
|
21328 | */
|
21329 |
|
21330 | var squaredLength$2 = squaredLength$3;
|
21331 | /**
|
21332 | * Alias for {@link quat.squaredLength}
|
21333 | * @function
|
21334 | */
|
21335 |
|
21336 | var sqrLen$2 = squaredLength$2;
|
21337 | /**
|
21338 | * Normalize a quat
|
21339 | *
|
21340 | * @param {quat} out the receiving quaternion
|
21341 | * @param {ReadonlyQuat} a quaternion to normalize
|
21342 | * @returns {quat} out
|
21343 | * @function
|
21344 | */
|
21345 |
|
21346 | var normalize$2 = normalize$3;
|
21347 | /**
|
21348 | * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)
|
21349 | *
|
21350 | * @param {ReadonlyQuat} a The first quaternion.
|
21351 | * @param {ReadonlyQuat} b The second quaternion.
|
21352 | * @returns {Boolean} True if the vectors are equal, false otherwise.
|
21353 | */
|
21354 |
|
21355 | var exactEquals$2 = exactEquals$3;
|
21356 | /**
|
21357 | * Returns whether or not the quaternions have approximately the same elements in the same position.
|
21358 | *
|
21359 | * @param {ReadonlyQuat} a The first vector.
|
21360 | * @param {ReadonlyQuat} b The second vector.
|
21361 | * @returns {Boolean} True if the vectors are equal, false otherwise.
|
21362 | */
|
21363 |
|
21364 | var equals$3 = equals$4;
|
21365 | /**
|
21366 | * Sets a quaternion to represent the shortest rotation from one
|
21367 | * vector to another.
|
21368 | *
|
21369 | * Both vectors are assumed to be unit length.
|
21370 | *
|
21371 | * @param {quat} out the receiving quaternion.
|
21372 | * @param {ReadonlyVec3} a the initial vector
|
21373 | * @param {ReadonlyVec3} b the destination vector
|
21374 | * @returns {quat} out
|
21375 | */
|
21376 |
|
21377 | var rotationTo = function () {
|
21378 | var tmpvec3 = create$4();
|
21379 | var xUnitVec3 = fromValues$4(1, 0, 0);
|
21380 | var yUnitVec3 = fromValues$4(0, 1, 0);
|
21381 | return function (out, a, b) {
|
21382 | var dot = dot$5(a, b);
|
21383 |
|
21384 | if (dot < -0.999999) {
|
21385 | cross$2(tmpvec3, xUnitVec3, a);
|
21386 | if (len$4(tmpvec3) < 0.000001) cross$2(tmpvec3, yUnitVec3, a);
|
21387 | normalize$4(tmpvec3, tmpvec3);
|
21388 | setAxisAngle(out, tmpvec3, Math.PI);
|
21389 | return out;
|
21390 | } else if (dot > 0.999999) {
|
21391 | out[0] = 0;
|
21392 | out[1] = 0;
|
21393 | out[2] = 0;
|
21394 | out[3] = 1;
|
21395 | return out;
|
21396 | } else {
|
21397 | cross$2(tmpvec3, a, b);
|
21398 | out[0] = tmpvec3[0];
|
21399 | out[1] = tmpvec3[1];
|
21400 | out[2] = tmpvec3[2];
|
21401 | out[3] = 1 + dot;
|
21402 | return normalize$2(out, out);
|
21403 | }
|
21404 | };
|
21405 | }();
|
21406 | /**
|
21407 | * Performs a spherical linear interpolation with two control points
|
21408 | *
|
21409 | * @param {quat} out the receiving quaternion
|
21410 | * @param {ReadonlyQuat} a the first operand
|
21411 | * @param {ReadonlyQuat} b the second operand
|
21412 | * @param {ReadonlyQuat} c the third operand
|
21413 | * @param {ReadonlyQuat} d the fourth operand
|
21414 | * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
|
21415 | * @returns {quat} out
|
21416 | */
|
21417 |
|
21418 | var sqlerp = function () {
|
21419 | var temp1 = create$2();
|
21420 | var temp2 = create$2();
|
21421 | return function (out, a, b, c, d, t) {
|
21422 | slerp(temp1, a, d, t);
|
21423 | slerp(temp2, b, c, t);
|
21424 | slerp(out, temp1, temp2, 2 * t * (1 - t));
|
21425 | return out;
|
21426 | };
|
21427 | }();
|
21428 | /**
|
21429 | * Sets the specified quaternion with values corresponding to the given
|
21430 | * axes. Each axis is a vec3 and is expected to be unit length and
|
21431 | * perpendicular to all other specified axes.
|
21432 | *
|
21433 | * @param {ReadonlyVec3} view the vector representing the viewing direction
|
21434 | * @param {ReadonlyVec3} right the vector representing the local "right" direction
|
21435 | * @param {ReadonlyVec3} up the vector representing the local "up" direction
|
21436 | * @returns {quat} out
|
21437 | */
|
21438 |
|
21439 | var setAxes = function () {
|
21440 | var matr = create$6();
|
21441 | return function (out, view, right, up) {
|
21442 | matr[0] = right[0];
|
21443 | matr[3] = right[1];
|
21444 | matr[6] = right[2];
|
21445 | matr[1] = up[0];
|
21446 | matr[4] = up[1];
|
21447 | matr[7] = up[2];
|
21448 | matr[2] = -view[0];
|
21449 | matr[5] = -view[1];
|
21450 | matr[8] = -view[2];
|
21451 | return normalize$2(out, fromMat3(out, matr));
|
21452 | };
|
21453 | }();
|
21454 |
|
21455 | var quat = /*#__PURE__*/Object.freeze({
|
21456 | __proto__: null,
|
21457 | create: create$2,
|
21458 | identity: identity$1,
|
21459 | setAxisAngle: setAxisAngle,
|
21460 | getAxisAngle: getAxisAngle,
|
21461 | getAngle: getAngle,
|
21462 | multiply: multiply$2,
|
21463 | rotateX: rotateX$1,
|
21464 | rotateY: rotateY$1,
|
21465 | rotateZ: rotateZ$1,
|
21466 | calculateW: calculateW,
|
21467 | exp: exp,
|
21468 | ln: ln,
|
21469 | pow: pow,
|
21470 | slerp: slerp,
|
21471 | random: random$1,
|
21472 | invert: invert$1,
|
21473 | conjugate: conjugate$1,
|
21474 | fromMat3: fromMat3,
|
21475 | fromEuler: fromEuler,
|
21476 | str: str$2,
|
21477 | clone: clone$2,
|
21478 | fromValues: fromValues$2,
|
21479 | copy: copy$2,
|
21480 | set: set$2,
|
21481 | add: add$2,
|
21482 | mul: mul$2,
|
21483 | scale: scale$2,
|
21484 | dot: dot$3,
|
21485 | lerp: lerp$2,
|
21486 | length: length$2,
|
21487 | len: len$2,
|
21488 | squaredLength: squaredLength$2,
|
21489 | sqrLen: sqrLen$2,
|
21490 | normalize: normalize$2,
|
21491 | exactEquals: exactEquals$2,
|
21492 | equals: equals$3,
|
21493 | rotationTo: rotationTo,
|
21494 | sqlerp: sqlerp,
|
21495 | setAxes: setAxes
|
21496 | });
|
21497 |
|
21498 | /**
|
21499 | * Dual Quaternion<br>
|
21500 | * Format: [real, dual]<br>
|
21501 | * Quaternion format: XYZW<br>
|
21502 | * Make sure to have normalized dual quaternions, otherwise the functions may not work as intended.<br>
|
21503 | * @module quat2
|
21504 | */
|
21505 |
|
21506 | /**
|
21507 | * Creates a new identity dual quat
|
21508 | *
|
21509 | * @returns {quat2} a new dual quaternion [real -> rotation, dual -> translation]
|
21510 | */
|
21511 |
|
21512 | function create$1() {
|
21513 | var dq = new ARRAY_TYPE(8);
|
21514 |
|
21515 | if (ARRAY_TYPE != Float32Array) {
|
21516 | dq[0] = 0;
|
21517 | dq[1] = 0;
|
21518 | dq[2] = 0;
|
21519 | dq[4] = 0;
|
21520 | dq[5] = 0;
|
21521 | dq[6] = 0;
|
21522 | dq[7] = 0;
|
21523 | }
|
21524 |
|
21525 | dq[3] = 1;
|
21526 | return dq;
|
21527 | }
|
21528 | /**
|
21529 | * Creates a new quat initialized with values from an existing quaternion
|
21530 | *
|
21531 | * @param {ReadonlyQuat2} a dual quaternion to clone
|
21532 | * @returns {quat2} new dual quaternion
|
21533 | * @function
|
21534 | */
|
21535 |
|
21536 | function clone$1(a) {
|
21537 | var dq = new ARRAY_TYPE(8);
|
21538 | dq[0] = a[0];
|
21539 | dq[1] = a[1];
|
21540 | dq[2] = a[2];
|
21541 | dq[3] = a[3];
|
21542 | dq[4] = a[4];
|
21543 | dq[5] = a[5];
|
21544 | dq[6] = a[6];
|
21545 | dq[7] = a[7];
|
21546 | return dq;
|
21547 | }
|
21548 | /**
|
21549 | * Creates a new dual quat initialized with the given values
|
21550 | *
|
21551 | * @param {Number} x1 X component
|
21552 | * @param {Number} y1 Y component
|
21553 | * @param {Number} z1 Z component
|
21554 | * @param {Number} w1 W component
|
21555 | * @param {Number} x2 X component
|
21556 | * @param {Number} y2 Y component
|
21557 | * @param {Number} z2 Z component
|
21558 | * @param {Number} w2 W component
|
21559 | * @returns {quat2} new dual quaternion
|
21560 | * @function
|
21561 | */
|
21562 |
|
21563 | function fromValues$1(x1, y1, z1, w1, x2, y2, z2, w2) {
|
21564 | var dq = new ARRAY_TYPE(8);
|
21565 | dq[0] = x1;
|
21566 | dq[1] = y1;
|
21567 | dq[2] = z1;
|
21568 | dq[3] = w1;
|
21569 | dq[4] = x2;
|
21570 | dq[5] = y2;
|
21571 | dq[6] = z2;
|
21572 | dq[7] = w2;
|
21573 | return dq;
|
21574 | }
|
21575 | /**
|
21576 | * Creates a new dual quat from the given values (quat and translation)
|
21577 | *
|
21578 | * @param {Number} x1 X component
|
21579 | * @param {Number} y1 Y component
|
21580 | * @param {Number} z1 Z component
|
21581 | * @param {Number} w1 W component
|
21582 | * @param {Number} x2 X component (translation)
|
21583 | * @param {Number} y2 Y component (translation)
|
21584 | * @param {Number} z2 Z component (translation)
|
21585 | * @returns {quat2} new dual quaternion
|
21586 | * @function
|
21587 | */
|
21588 |
|
21589 | function fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) {
|
21590 | var dq = new ARRAY_TYPE(8);
|
21591 | dq[0] = x1;
|
21592 | dq[1] = y1;
|
21593 | dq[2] = z1;
|
21594 | dq[3] = w1;
|
21595 | var ax = x2 * 0.5,
|
21596 | ay = y2 * 0.5,
|
21597 | az = z2 * 0.5;
|
21598 | dq[4] = ax * w1 + ay * z1 - az * y1;
|
21599 | dq[5] = ay * w1 + az * x1 - ax * z1;
|
21600 | dq[6] = az * w1 + ax * y1 - ay * x1;
|
21601 | dq[7] = -ax * x1 - ay * y1 - az * z1;
|
21602 | return dq;
|
21603 | }
|
21604 | /**
|
21605 | * Creates a dual quat from a quaternion and a translation
|
21606 | *
|
21607 | * @param {ReadonlyQuat2} dual quaternion receiving operation result
|
21608 | * @param {ReadonlyQuat} q a normalized quaternion
|
21609 | * @param {ReadonlyVec3} t tranlation vector
|
21610 | * @returns {quat2} dual quaternion receiving operation result
|
21611 | * @function
|
21612 | */
|
21613 |
|
21614 | function fromRotationTranslation(out, q, t) {
|
21615 | var ax = t[0] * 0.5,
|
21616 | ay = t[1] * 0.5,
|
21617 | az = t[2] * 0.5,
|
21618 | bx = q[0],
|
21619 | by = q[1],
|
21620 | bz = q[2],
|
21621 | bw = q[3];
|
21622 | out[0] = bx;
|
21623 | out[1] = by;
|
21624 | out[2] = bz;
|
21625 | out[3] = bw;
|
21626 | out[4] = ax * bw + ay * bz - az * by;
|
21627 | out[5] = ay * bw + az * bx - ax * bz;
|
21628 | out[6] = az * bw + ax * by - ay * bx;
|
21629 | out[7] = -ax * bx - ay * by - az * bz;
|
21630 | return out;
|
21631 | }
|
21632 | /**
|
21633 | * Creates a dual quat from a translation
|
21634 | *
|
21635 | * @param {ReadonlyQuat2} dual quaternion receiving operation result
|
21636 | * @param {ReadonlyVec3} t translation vector
|
21637 | * @returns {quat2} dual quaternion receiving operation result
|
21638 | * @function
|
21639 | */
|
21640 |
|
21641 | function fromTranslation(out, t) {
|
21642 | out[0] = 0;
|
21643 | out[1] = 0;
|
21644 | out[2] = 0;
|
21645 | out[3] = 1;
|
21646 | out[4] = t[0] * 0.5;
|
21647 | out[5] = t[1] * 0.5;
|
21648 | out[6] = t[2] * 0.5;
|
21649 | out[7] = 0;
|
21650 | return out;
|
21651 | }
|
21652 | /**
|
21653 | * Creates a dual quat from a quaternion
|
21654 | *
|
21655 | * @param {ReadonlyQuat2} dual quaternion receiving operation result
|
21656 | * @param {ReadonlyQuat} q the quaternion
|
21657 | * @returns {quat2} dual quaternion receiving operation result
|
21658 | * @function
|
21659 | */
|
21660 |
|
21661 | function fromRotation(out, q) {
|
21662 | out[0] = q[0];
|
21663 | out[1] = q[1];
|
21664 | out[2] = q[2];
|
21665 | out[3] = q[3];
|
21666 | out[4] = 0;
|
21667 | out[5] = 0;
|
21668 | out[6] = 0;
|
21669 | out[7] = 0;
|
21670 | return out;
|
21671 | }
|
21672 | /**
|
21673 | * Creates a new dual quat from a matrix (4x4)
|
21674 | *
|
21675 | * @param {quat2} out the dual quaternion
|
21676 | * @param {ReadonlyMat4} a the matrix
|
21677 | * @returns {quat2} dual quat receiving operation result
|
21678 | * @function
|
21679 | */
|
21680 |
|
21681 | function fromMat4(out, a) {
|
21682 | //TODO Optimize this
|
21683 | var outer = create$2();
|
21684 | getRotation(outer, a);
|
21685 | var t = new ARRAY_TYPE(3);
|
21686 | getTranslation$1(t, a);
|
21687 | fromRotationTranslation(out, outer, t);
|
21688 | return out;
|
21689 | }
|
21690 | /**
|
21691 | * Copy the values from one dual quat to another
|
21692 | *
|
21693 | * @param {quat2} out the receiving dual quaternion
|
21694 | * @param {ReadonlyQuat2} a the source dual quaternion
|
21695 | * @returns {quat2} out
|
21696 | * @function
|
21697 | */
|
21698 |
|
21699 | function copy$1(out, a) {
|
21700 | out[0] = a[0];
|
21701 | out[1] = a[1];
|
21702 | out[2] = a[2];
|
21703 | out[3] = a[3];
|
21704 | out[4] = a[4];
|
21705 | out[5] = a[5];
|
21706 | out[6] = a[6];
|
21707 | out[7] = a[7];
|
21708 | return out;
|
21709 | }
|
21710 | /**
|
21711 | * Set a dual quat to the identity dual quaternion
|
21712 | *
|
21713 | * @param {quat2} out the receiving quaternion
|
21714 | * @returns {quat2} out
|
21715 | */
|
21716 |
|
21717 | function identity(out) {
|
21718 | out[0] = 0;
|
21719 | out[1] = 0;
|
21720 | out[2] = 0;
|
21721 | out[3] = 1;
|
21722 | out[4] = 0;
|
21723 | out[5] = 0;
|
21724 | out[6] = 0;
|
21725 | out[7] = 0;
|
21726 | return out;
|
21727 | }
|
21728 | /**
|
21729 | * Set the components of a dual quat to the given values
|
21730 | *
|
21731 | * @param {quat2} out the receiving quaternion
|
21732 | * @param {Number} x1 X component
|
21733 | * @param {Number} y1 Y component
|
21734 | * @param {Number} z1 Z component
|
21735 | * @param {Number} w1 W component
|
21736 | * @param {Number} x2 X component
|
21737 | * @param {Number} y2 Y component
|
21738 | * @param {Number} z2 Z component
|
21739 | * @param {Number} w2 W component
|
21740 | * @returns {quat2} out
|
21741 | * @function
|
21742 | */
|
21743 |
|
21744 | function set$1(out, x1, y1, z1, w1, x2, y2, z2, w2) {
|
21745 | out[0] = x1;
|
21746 | out[1] = y1;
|
21747 | out[2] = z1;
|
21748 | out[3] = w1;
|
21749 | out[4] = x2;
|
21750 | out[5] = y2;
|
21751 | out[6] = z2;
|
21752 | out[7] = w2;
|
21753 | return out;
|
21754 | }
|
21755 | /**
|
21756 | * Gets the real part of a dual quat
|
21757 | * @param {quat} out real part
|
21758 | * @param {ReadonlyQuat2} a Dual Quaternion
|
21759 | * @return {quat} real part
|
21760 | */
|
21761 |
|
21762 | var getReal = copy$2;
|
21763 | /**
|
21764 | * Gets the dual part of a dual quat
|
21765 | * @param {quat} out dual part
|
21766 | * @param {ReadonlyQuat2} a Dual Quaternion
|
21767 | * @return {quat} dual part
|
21768 | */
|
21769 |
|
21770 | function getDual(out, a) {
|
21771 | out[0] = a[4];
|
21772 | out[1] = a[5];
|
21773 | out[2] = a[6];
|
21774 | out[3] = a[7];
|
21775 | return out;
|
21776 | }
|
21777 | /**
|
21778 | * Set the real component of a dual quat to the given quaternion
|
21779 | *
|
21780 | * @param {quat2} out the receiving quaternion
|
21781 | * @param {ReadonlyQuat} q a quaternion representing the real part
|
21782 | * @returns {quat2} out
|
21783 | * @function
|
21784 | */
|
21785 |
|
21786 | var setReal = copy$2;
|
21787 | /**
|
21788 | * Set the dual component of a dual quat to the given quaternion
|
21789 | *
|
21790 | * @param {quat2} out the receiving quaternion
|
21791 | * @param {ReadonlyQuat} q a quaternion representing the dual part
|
21792 | * @returns {quat2} out
|
21793 | * @function
|
21794 | */
|
21795 |
|
21796 | function setDual(out, q) {
|
21797 | out[4] = q[0];
|
21798 | out[5] = q[1];
|
21799 | out[6] = q[2];
|
21800 | out[7] = q[3];
|
21801 | return out;
|
21802 | }
|
21803 | /**
|
21804 | * Gets the translation of a normalized dual quat
|
21805 | * @param {vec3} out translation
|
21806 | * @param {ReadonlyQuat2} a Dual Quaternion to be decomposed
|
21807 | * @return {vec3} translation
|
21808 | */
|
21809 |
|
21810 | function getTranslation(out, a) {
|
21811 | var ax = a[4],
|
21812 | ay = a[5],
|
21813 | az = a[6],
|
21814 | aw = a[7],
|
21815 | bx = -a[0],
|
21816 | by = -a[1],
|
21817 | bz = -a[2],
|
21818 | bw = a[3];
|
21819 | out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;
|
21820 | out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;
|
21821 | out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;
|
21822 | return out;
|
21823 | }
|
21824 | /**
|
21825 | * Translates a dual quat by the given vector
|
21826 | *
|
21827 | * @param {quat2} out the receiving dual quaternion
|
21828 | * @param {ReadonlyQuat2} a the dual quaternion to translate
|
21829 | * @param {ReadonlyVec3} v vector to translate by
|
21830 | * @returns {quat2} out
|
21831 | */
|
21832 |
|
21833 | function translate(out, a, v) {
|
21834 | var ax1 = a[0],
|
21835 | ay1 = a[1],
|
21836 | az1 = a[2],
|
21837 | aw1 = a[3],
|
21838 | bx1 = v[0] * 0.5,
|
21839 | by1 = v[1] * 0.5,
|
21840 | bz1 = v[2] * 0.5,
|
21841 | ax2 = a[4],
|
21842 | ay2 = a[5],
|
21843 | az2 = a[6],
|
21844 | aw2 = a[7];
|
21845 | out[0] = ax1;
|
21846 | out[1] = ay1;
|
21847 | out[2] = az1;
|
21848 | out[3] = aw1;
|
21849 | out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2;
|
21850 | out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2;
|
21851 | out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2;
|
21852 | out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2;
|
21853 | return out;
|
21854 | }
|
21855 | /**
|
21856 | * Rotates a dual quat around the X axis
|
21857 | *
|
21858 | * @param {quat2} out the receiving dual quaternion
|
21859 | * @param {ReadonlyQuat2} a the dual quaternion to rotate
|
21860 | * @param {number} rad how far should the rotation be
|
21861 | * @returns {quat2} out
|
21862 | */
|
21863 |
|
21864 | function rotateX(out, a, rad) {
|
21865 | var bx = -a[0],
|
21866 | by = -a[1],
|
21867 | bz = -a[2],
|
21868 | bw = a[3],
|
21869 | ax = a[4],
|
21870 | ay = a[5],
|
21871 | az = a[6],
|
21872 | aw = a[7],
|
21873 | ax1 = ax * bw + aw * bx + ay * bz - az * by,
|
21874 | ay1 = ay * bw + aw * by + az * bx - ax * bz,
|
21875 | az1 = az * bw + aw * bz + ax * by - ay * bx,
|
21876 | aw1 = aw * bw - ax * bx - ay * by - az * bz;
|
21877 | rotateX$1(out, a, rad);
|
21878 | bx = out[0];
|
21879 | by = out[1];
|
21880 | bz = out[2];
|
21881 | bw = out[3];
|
21882 | out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
|
21883 | out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
|
21884 | out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
|
21885 | out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
|
21886 | return out;
|
21887 | }
|
21888 | /**
|
21889 | * Rotates a dual quat around the Y axis
|
21890 | *
|
21891 | * @param {quat2} out the receiving dual quaternion
|
21892 | * @param {ReadonlyQuat2} a the dual quaternion to rotate
|
21893 | * @param {number} rad how far should the rotation be
|
21894 | * @returns {quat2} out
|
21895 | */
|
21896 |
|
21897 | function rotateY(out, a, rad) {
|
21898 | var bx = -a[0],
|
21899 | by = -a[1],
|
21900 | bz = -a[2],
|
21901 | bw = a[3],
|
21902 | ax = a[4],
|
21903 | ay = a[5],
|
21904 | az = a[6],
|
21905 | aw = a[7],
|
21906 | ax1 = ax * bw + aw * bx + ay * bz - az * by,
|
21907 | ay1 = ay * bw + aw * by + az * bx - ax * bz,
|
21908 | az1 = az * bw + aw * bz + ax * by - ay * bx,
|
21909 | aw1 = aw * bw - ax * bx - ay * by - az * bz;
|
21910 | rotateY$1(out, a, rad);
|
21911 | bx = out[0];
|
21912 | by = out[1];
|
21913 | bz = out[2];
|
21914 | bw = out[3];
|
21915 | out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
|
21916 | out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
|
21917 | out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
|
21918 | out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
|
21919 | return out;
|
21920 | }
|
21921 | /**
|
21922 | * Rotates a dual quat around the Z axis
|
21923 | *
|
21924 | * @param {quat2} out the receiving dual quaternion
|
21925 | * @param {ReadonlyQuat2} a the dual quaternion to rotate
|
21926 | * @param {number} rad how far should the rotation be
|
21927 | * @returns {quat2} out
|
21928 | */
|
21929 |
|
21930 | function rotateZ(out, a, rad) {
|
21931 | var bx = -a[0],
|
21932 | by = -a[1],
|
21933 | bz = -a[2],
|
21934 | bw = a[3],
|
21935 | ax = a[4],
|
21936 | ay = a[5],
|
21937 | az = a[6],
|
21938 | aw = a[7],
|
21939 | ax1 = ax * bw + aw * bx + ay * bz - az * by,
|
21940 | ay1 = ay * bw + aw * by + az * bx - ax * bz,
|
21941 | az1 = az * bw + aw * bz + ax * by - ay * bx,
|
21942 | aw1 = aw * bw - ax * bx - ay * by - az * bz;
|
21943 | rotateZ$1(out, a, rad);
|
21944 | bx = out[0];
|
21945 | by = out[1];
|
21946 | bz = out[2];
|
21947 | bw = out[3];
|
21948 | out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
|
21949 | out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
|
21950 | out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
|
21951 | out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
|
21952 | return out;
|
21953 | }
|
21954 | /**
|
21955 | * Rotates a dual quat by a given quaternion (a * q)
|
21956 | *
|
21957 | * @param {quat2} out the receiving dual quaternion
|
21958 | * @param {ReadonlyQuat2} a the dual quaternion to rotate
|
21959 | * @param {ReadonlyQuat} q quaternion to rotate by
|
21960 | * @returns {quat2} out
|
21961 | */
|
21962 |
|
21963 | function rotateByQuatAppend(out, a, q) {
|
21964 | var qx = q[0],
|
21965 | qy = q[1],
|
21966 | qz = q[2],
|
21967 | qw = q[3],
|
21968 | ax = a[0],
|
21969 | ay = a[1],
|
21970 | az = a[2],
|
21971 | aw = a[3];
|
21972 | out[0] = ax * qw + aw * qx + ay * qz - az * qy;
|
21973 | out[1] = ay * qw + aw * qy + az * qx - ax * qz;
|
21974 | out[2] = az * qw + aw * qz + ax * qy - ay * qx;
|
21975 | out[3] = aw * qw - ax * qx - ay * qy - az * qz;
|
21976 | ax = a[4];
|
21977 | ay = a[5];
|
21978 | az = a[6];
|
21979 | aw = a[7];
|
21980 | out[4] = ax * qw + aw * qx + ay * qz - az * qy;
|
21981 | out[5] = ay * qw + aw * qy + az * qx - ax * qz;
|
21982 | out[6] = az * qw + aw * qz + ax * qy - ay * qx;
|
21983 | out[7] = aw * qw - ax * qx - ay * qy - az * qz;
|
21984 | return out;
|
21985 | }
|
21986 | /**
|
21987 | * Rotates a dual quat by a given quaternion (q * a)
|
21988 | *
|
21989 | * @param {quat2} out the receiving dual quaternion
|
21990 | * @param {ReadonlyQuat} q quaternion to rotate by
|
21991 | * @param {ReadonlyQuat2} a the dual quaternion to rotate
|
21992 | * @returns {quat2} out
|
21993 | */
|
21994 |
|
21995 | function rotateByQuatPrepend(out, q, a) {
|
21996 | var qx = q[0],
|
21997 | qy = q[1],
|
21998 | qz = q[2],
|
21999 | qw = q[3],
|
22000 | bx = a[0],
|
22001 | by = a[1],
|
22002 | bz = a[2],
|
22003 | bw = a[3];
|
22004 | out[0] = qx * bw + qw * bx + qy * bz - qz * by;
|
22005 | out[1] = qy * bw + qw * by + qz * bx - qx * bz;
|
22006 | out[2] = qz * bw + qw * bz + qx * by - qy * bx;
|
22007 | out[3] = qw * bw - qx * bx - qy * by - qz * bz;
|
22008 | bx = a[4];
|
22009 | by = a[5];
|
22010 | bz = a[6];
|
22011 | bw = a[7];
|
22012 | out[4] = qx * bw + qw * bx + qy * bz - qz * by;
|
22013 | out[5] = qy * bw + qw * by + qz * bx - qx * bz;
|
22014 | out[6] = qz * bw + qw * bz + qx * by - qy * bx;
|
22015 | out[7] = qw * bw - qx * bx - qy * by - qz * bz;
|
22016 | return out;
|
22017 | }
|
22018 | /**
|
22019 | * Rotates a dual quat around a given axis. Does the normalisation automatically
|
22020 | *
|
22021 | * @param {quat2} out the receiving dual quaternion
|
22022 | * @param {ReadonlyQuat2} a the dual quaternion to rotate
|
22023 | * @param {ReadonlyVec3} axis the axis to rotate around
|
22024 | * @param {Number} rad how far the rotation should be
|
22025 | * @returns {quat2} out
|
22026 | */
|
22027 |
|
22028 | function rotateAroundAxis(out, a, axis, rad) {
|
22029 | //Special case for rad = 0
|
22030 | if (Math.abs(rad) < EPSILON) {
|
22031 | return copy$1(out, a);
|
22032 | }
|
22033 |
|
22034 | var axisLength = Math.hypot(axis[0], axis[1], axis[2]);
|
22035 | rad = rad * 0.5;
|
22036 | var s = Math.sin(rad);
|
22037 | var bx = s * axis[0] / axisLength;
|
22038 | var by = s * axis[1] / axisLength;
|
22039 | var bz = s * axis[2] / axisLength;
|
22040 | var bw = Math.cos(rad);
|
22041 | var ax1 = a[0],
|
22042 | ay1 = a[1],
|
22043 | az1 = a[2],
|
22044 | aw1 = a[3];
|
22045 | out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
|
22046 | out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
|
22047 | out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
|
22048 | out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
|
22049 | var ax = a[4],
|
22050 | ay = a[5],
|
22051 | az = a[6],
|
22052 | aw = a[7];
|
22053 | out[4] = ax * bw + aw * bx + ay * bz - az * by;
|
22054 | out[5] = ay * bw + aw * by + az * bx - ax * bz;
|
22055 | out[6] = az * bw + aw * bz + ax * by - ay * bx;
|
22056 | out[7] = aw * bw - ax * bx - ay * by - az * bz;
|
22057 | return out;
|
22058 | }
|
22059 | /**
|
22060 | * Adds two dual quat's
|
22061 | *
|
22062 | * @param {quat2} out the receiving dual quaternion
|
22063 | * @param {ReadonlyQuat2} a the first operand
|
22064 | * @param {ReadonlyQuat2} b the second operand
|
22065 | * @returns {quat2} out
|
22066 | * @function
|
22067 | */
|
22068 |
|
22069 | function add$1(out, a, b) {
|
22070 | out[0] = a[0] + b[0];
|
22071 | out[1] = a[1] + b[1];
|
22072 | out[2] = a[2] + b[2];
|
22073 | out[3] = a[3] + b[3];
|
22074 | out[4] = a[4] + b[4];
|
22075 | out[5] = a[5] + b[5];
|
22076 | out[6] = a[6] + b[6];
|
22077 | out[7] = a[7] + b[7];
|
22078 | return out;
|
22079 | }
|
22080 | /**
|
22081 | * Multiplies two dual quat's
|
22082 | *
|
22083 | * @param {quat2} out the receiving dual quaternion
|
22084 | * @param {ReadonlyQuat2} a the first operand
|
22085 | * @param {ReadonlyQuat2} b the second operand
|
22086 | * @returns {quat2} out
|
22087 | */
|
22088 |
|
22089 | function multiply$1(out, a, b) {
|
22090 | var ax0 = a[0],
|
22091 | ay0 = a[1],
|
22092 | az0 = a[2],
|
22093 | aw0 = a[3],
|
22094 | bx1 = b[4],
|
22095 | by1 = b[5],
|
22096 | bz1 = b[6],
|
22097 | bw1 = b[7],
|
22098 | ax1 = a[4],
|
22099 | ay1 = a[5],
|
22100 | az1 = a[6],
|
22101 | aw1 = a[7],
|
22102 | bx0 = b[0],
|
22103 | by0 = b[1],
|
22104 | bz0 = b[2],
|
22105 | bw0 = b[3];
|
22106 | out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0;
|
22107 | out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0;
|
22108 | out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0;
|
22109 | out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0;
|
22110 | out[4] = ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0;
|
22111 | out[5] = ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0;
|
22112 | out[6] = az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0;
|
22113 | out[7] = aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0;
|
22114 | return out;
|
22115 | }
|
22116 | /**
|
22117 | * Alias for {@link quat2.multiply}
|
22118 | * @function
|
22119 | */
|
22120 |
|
22121 | var mul$1 = multiply$1;
|
22122 | /**
|
22123 | * Scales a dual quat by a scalar number
|
22124 | *
|
22125 | * @param {quat2} out the receiving dual quat
|
22126 | * @param {ReadonlyQuat2} a the dual quat to scale
|
22127 | * @param {Number} b amount to scale the dual quat by
|
22128 | * @returns {quat2} out
|
22129 | * @function
|
22130 | */
|
22131 |
|
22132 | function scale$1(out, a, b) {
|
22133 | out[0] = a[0] * b;
|
22134 | out[1] = a[1] * b;
|
22135 | out[2] = a[2] * b;
|
22136 | out[3] = a[3] * b;
|
22137 | out[4] = a[4] * b;
|
22138 | out[5] = a[5] * b;
|
22139 | out[6] = a[6] * b;
|
22140 | out[7] = a[7] * b;
|
22141 | return out;
|
22142 | }
|
22143 | /**
|
22144 | * Calculates the dot product of two dual quat's (The dot product of the real parts)
|
22145 | *
|
22146 | * @param {ReadonlyQuat2} a the first operand
|
22147 | * @param {ReadonlyQuat2} b the second operand
|
22148 | * @returns {Number} dot product of a and b
|
22149 | * @function
|
22150 | */
|
22151 |
|
22152 | var dot$2 = dot$3;
|
22153 | /**
|
22154 | * Performs a linear interpolation between two dual quats's
|
22155 | * NOTE: The resulting dual quaternions won't always be normalized (The error is most noticeable when t = 0.5)
|
22156 | *
|
22157 | * @param {quat2} out the receiving dual quat
|
22158 | * @param {ReadonlyQuat2} a the first operand
|
22159 | * @param {ReadonlyQuat2} b the second operand
|
22160 | * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
|
22161 | * @returns {quat2} out
|
22162 | */
|
22163 |
|
22164 | function lerp$1(out, a, b, t) {
|
22165 | var mt = 1 - t;
|
22166 | if (dot$2(a, b) < 0) t = -t;
|
22167 | out[0] = a[0] * mt + b[0] * t;
|
22168 | out[1] = a[1] * mt + b[1] * t;
|
22169 | out[2] = a[2] * mt + b[2] * t;
|
22170 | out[3] = a[3] * mt + b[3] * t;
|
22171 | out[4] = a[4] * mt + b[4] * t;
|
22172 | out[5] = a[5] * mt + b[5] * t;
|
22173 | out[6] = a[6] * mt + b[6] * t;
|
22174 | out[7] = a[7] * mt + b[7] * t;
|
22175 | return out;
|
22176 | }
|
22177 | /**
|
22178 | * Calculates the inverse of a dual quat. If they are normalized, conjugate is cheaper
|
22179 | *
|
22180 | * @param {quat2} out the receiving dual quaternion
|
22181 | * @param {ReadonlyQuat2} a dual quat to calculate inverse of
|
22182 | * @returns {quat2} out
|
22183 | */
|
22184 |
|
22185 | function invert(out, a) {
|
22186 | var sqlen = squaredLength$1(a);
|
22187 | out[0] = -a[0] / sqlen;
|
22188 | out[1] = -a[1] / sqlen;
|
22189 | out[2] = -a[2] / sqlen;
|
22190 | out[3] = a[3] / sqlen;
|
22191 | out[4] = -a[4] / sqlen;
|
22192 | out[5] = -a[5] / sqlen;
|
22193 | out[6] = -a[6] / sqlen;
|
22194 | out[7] = a[7] / sqlen;
|
22195 | return out;
|
22196 | }
|
22197 | /**
|
22198 | * Calculates the conjugate of a dual quat
|
22199 | * If the dual quaternion is normalized, this function is faster than quat2.inverse and produces the same result.
|
22200 | *
|
22201 | * @param {quat2} out the receiving quaternion
|
22202 | * @param {ReadonlyQuat2} a quat to calculate conjugate of
|
22203 | * @returns {quat2} out
|
22204 | */
|
22205 |
|
22206 | function conjugate(out, a) {
|
22207 | out[0] = -a[0];
|
22208 | out[1] = -a[1];
|
22209 | out[2] = -a[2];
|
22210 | out[3] = a[3];
|
22211 | out[4] = -a[4];
|
22212 | out[5] = -a[5];
|
22213 | out[6] = -a[6];
|
22214 | out[7] = a[7];
|
22215 | return out;
|
22216 | }
|
22217 | /**
|
22218 | * Calculates the length of a dual quat
|
22219 | *
|
22220 | * @param {ReadonlyQuat2} a dual quat to calculate length of
|
22221 | * @returns {Number} length of a
|
22222 | * @function
|
22223 | */
|
22224 |
|
22225 | var length$1 = length$2;
|
22226 | /**
|
22227 | * Alias for {@link quat2.length}
|
22228 | * @function
|
22229 | */
|
22230 |
|
22231 | var len$1 = length$1;
|
22232 | /**
|
22233 | * Calculates the squared length of a dual quat
|
22234 | *
|
22235 | * @param {ReadonlyQuat2} a dual quat to calculate squared length of
|
22236 | * @returns {Number} squared length of a
|
22237 | * @function
|
22238 | */
|
22239 |
|
22240 | var squaredLength$1 = squaredLength$2;
|
22241 | /**
|
22242 | * Alias for {@link quat2.squaredLength}
|
22243 | * @function
|
22244 | */
|
22245 |
|
22246 | var sqrLen$1 = squaredLength$1;
|
22247 | /**
|
22248 | * Normalize a dual quat
|
22249 | *
|
22250 | * @param {quat2} out the receiving dual quaternion
|
22251 | * @param {ReadonlyQuat2} a dual quaternion to normalize
|
22252 | * @returns {quat2} out
|
22253 | * @function
|
22254 | */
|
22255 |
|
22256 | function normalize$1(out, a) {
|
22257 | var magnitude = squaredLength$1(a);
|
22258 |
|
22259 | if (magnitude > 0) {
|
22260 | magnitude = Math.sqrt(magnitude);
|
22261 | var a0 = a[0] / magnitude;
|
22262 | var a1 = a[1] / magnitude;
|
22263 | var a2 = a[2] / magnitude;
|
22264 | var a3 = a[3] / magnitude;
|
22265 | var b0 = a[4];
|
22266 | var b1 = a[5];
|
22267 | var b2 = a[6];
|
22268 | var b3 = a[7];
|
22269 | var a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3;
|
22270 | out[0] = a0;
|
22271 | out[1] = a1;
|
22272 | out[2] = a2;
|
22273 | out[3] = a3;
|
22274 | out[4] = (b0 - a0 * a_dot_b) / magnitude;
|
22275 | out[5] = (b1 - a1 * a_dot_b) / magnitude;
|
22276 | out[6] = (b2 - a2 * a_dot_b) / magnitude;
|
22277 | out[7] = (b3 - a3 * a_dot_b) / magnitude;
|
22278 | }
|
22279 |
|
22280 | return out;
|
22281 | }
|
22282 | /**
|
22283 | * Returns a string representation of a dual quatenion
|
22284 | *
|
22285 | * @param {ReadonlyQuat2} a dual quaternion to represent as a string
|
22286 | * @returns {String} string representation of the dual quat
|
22287 | */
|
22288 |
|
22289 | function str$1(a) {
|
22290 | return "quat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ")";
|
22291 | }
|
22292 | /**
|
22293 | * Returns whether or not the dual quaternions have exactly the same elements in the same position (when compared with ===)
|
22294 | *
|
22295 | * @param {ReadonlyQuat2} a the first dual quaternion.
|
22296 | * @param {ReadonlyQuat2} b the second dual quaternion.
|
22297 | * @returns {Boolean} true if the dual quaternions are equal, false otherwise.
|
22298 | */
|
22299 |
|
22300 | function exactEquals$1(a, b) {
|
22301 | return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7];
|
22302 | }
|
22303 | /**
|
22304 | * Returns whether or not the dual quaternions have approximately the same elements in the same position.
|
22305 | *
|
22306 | * @param {ReadonlyQuat2} a the first dual quat.
|
22307 | * @param {ReadonlyQuat2} b the second dual quat.
|
22308 | * @returns {Boolean} true if the dual quats are equal, false otherwise.
|
22309 | */
|
22310 |
|
22311 | function equals$2(a, b) {
|
22312 | var a0 = a[0],
|
22313 | a1 = a[1],
|
22314 | a2 = a[2],
|
22315 | a3 = a[3],
|
22316 | a4 = a[4],
|
22317 | a5 = a[5],
|
22318 | a6 = a[6],
|
22319 | a7 = a[7];
|
22320 | var b0 = b[0],
|
22321 | b1 = b[1],
|
22322 | b2 = b[2],
|
22323 | b3 = b[3],
|
22324 | b4 = b[4],
|
22325 | b5 = b[5],
|
22326 | b6 = b[6],
|
22327 | b7 = b[7];
|
22328 | return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7));
|
22329 | }
|
22330 |
|
22331 | var quat2 = /*#__PURE__*/Object.freeze({
|
22332 | __proto__: null,
|
22333 | create: create$1,
|
22334 | clone: clone$1,
|
22335 | fromValues: fromValues$1,
|
22336 | fromRotationTranslationValues: fromRotationTranslationValues,
|
22337 | fromRotationTranslation: fromRotationTranslation,
|
22338 | fromTranslation: fromTranslation,
|
22339 | fromRotation: fromRotation,
|
22340 | fromMat4: fromMat4,
|
22341 | copy: copy$1,
|
22342 | identity: identity,
|
22343 | set: set$1,
|
22344 | getReal: getReal,
|
22345 | getDual: getDual,
|
22346 | setReal: setReal,
|
22347 | setDual: setDual,
|
22348 | getTranslation: getTranslation,
|
22349 | translate: translate,
|
22350 | rotateX: rotateX,
|
22351 | rotateY: rotateY,
|
22352 | rotateZ: rotateZ,
|
22353 | rotateByQuatAppend: rotateByQuatAppend,
|
22354 | rotateByQuatPrepend: rotateByQuatPrepend,
|
22355 | rotateAroundAxis: rotateAroundAxis,
|
22356 | add: add$1,
|
22357 | multiply: multiply$1,
|
22358 | mul: mul$1,
|
22359 | scale: scale$1,
|
22360 | dot: dot$2,
|
22361 | lerp: lerp$1,
|
22362 | invert: invert,
|
22363 | conjugate: conjugate,
|
22364 | length: length$1,
|
22365 | len: len$1,
|
22366 | squaredLength: squaredLength$1,
|
22367 | sqrLen: sqrLen$1,
|
22368 | normalize: normalize$1,
|
22369 | str: str$1,
|
22370 | exactEquals: exactEquals$1,
|
22371 | equals: equals$2
|
22372 | });
|
22373 |
|
22374 | /**
|
22375 | * 2 Dimensional Vector
|
22376 | * @module vec2
|
22377 | */
|
22378 |
|
22379 | /**
|
22380 | * Creates a new, empty vec2
|
22381 | *
|
22382 | * @returns {vec2} a new 2D vector
|
22383 | */
|
22384 |
|
22385 | function create() {
|
22386 | var out = new ARRAY_TYPE(2);
|
22387 |
|
22388 | if (ARRAY_TYPE != Float32Array) {
|
22389 | out[0] = 0;
|
22390 | out[1] = 0;
|
22391 | }
|
22392 |
|
22393 | return out;
|
22394 | }
|
22395 | /**
|
22396 | * Creates a new vec2 initialized with values from an existing vector
|
22397 | *
|
22398 | * @param {ReadonlyVec2} a vector to clone
|
22399 | * @returns {vec2} a new 2D vector
|
22400 | */
|
22401 |
|
22402 | function clone(a) {
|
22403 | var out = new ARRAY_TYPE(2);
|
22404 | out[0] = a[0];
|
22405 | out[1] = a[1];
|
22406 | return out;
|
22407 | }
|
22408 | /**
|
22409 | * Creates a new vec2 initialized with the given values
|
22410 | *
|
22411 | * @param {Number} x X component
|
22412 | * @param {Number} y Y component
|
22413 | * @returns {vec2} a new 2D vector
|
22414 | */
|
22415 |
|
22416 | function fromValues(x, y) {
|
22417 | var out = new ARRAY_TYPE(2);
|
22418 | out[0] = x;
|
22419 | out[1] = y;
|
22420 | return out;
|
22421 | }
|
22422 | /**
|
22423 | * Copy the values from one vec2 to another
|
22424 | *
|
22425 | * @param {vec2} out the receiving vector
|
22426 | * @param {ReadonlyVec2} a the source vector
|
22427 | * @returns {vec2} out
|
22428 | */
|
22429 |
|
22430 | function copy(out, a) {
|
22431 | out[0] = a[0];
|
22432 | out[1] = a[1];
|
22433 | return out;
|
22434 | }
|
22435 | /**
|
22436 | * Set the components of a vec2 to the given values
|
22437 | *
|
22438 | * @param {vec2} out the receiving vector
|
22439 | * @param {Number} x X component
|
22440 | * @param {Number} y Y component
|
22441 | * @returns {vec2} out
|
22442 | */
|
22443 |
|
22444 | function set(out, x, y) {
|
22445 | out[0] = x;
|
22446 | out[1] = y;
|
22447 | return out;
|
22448 | }
|
22449 | /**
|
22450 | * Adds two vec2's
|
22451 | *
|
22452 | * @param {vec2} out the receiving vector
|
22453 | * @param {ReadonlyVec2} a the first operand
|
22454 | * @param {ReadonlyVec2} b the second operand
|
22455 | * @returns {vec2} out
|
22456 | */
|
22457 |
|
22458 | function add(out, a, b) {
|
22459 | out[0] = a[0] + b[0];
|
22460 | out[1] = a[1] + b[1];
|
22461 | return out;
|
22462 | }
|
22463 | /**
|
22464 | * Subtracts vector b from vector a
|
22465 | *
|
22466 | * @param {vec2} out the receiving vector
|
22467 | * @param {ReadonlyVec2} a the first operand
|
22468 | * @param {ReadonlyVec2} b the second operand
|
22469 | * @returns {vec2} out
|
22470 | */
|
22471 |
|
22472 | function subtract(out, a, b) {
|
22473 | out[0] = a[0] - b[0];
|
22474 | out[1] = a[1] - b[1];
|
22475 | return out;
|
22476 | }
|
22477 | /**
|
22478 | * Multiplies two vec2's
|
22479 | *
|
22480 | * @param {vec2} out the receiving vector
|
22481 | * @param {ReadonlyVec2} a the first operand
|
22482 | * @param {ReadonlyVec2} b the second operand
|
22483 | * @returns {vec2} out
|
22484 | */
|
22485 |
|
22486 | function multiply(out, a, b) {
|
22487 | out[0] = a[0] * b[0];
|
22488 | out[1] = a[1] * b[1];
|
22489 | return out;
|
22490 | }
|
22491 | /**
|
22492 | * Divides two vec2's
|
22493 | *
|
22494 | * @param {vec2} out the receiving vector
|
22495 | * @param {ReadonlyVec2} a the first operand
|
22496 | * @param {ReadonlyVec2} b the second operand
|
22497 | * @returns {vec2} out
|
22498 | */
|
22499 |
|
22500 | function divide(out, a, b) {
|
22501 | out[0] = a[0] / b[0];
|
22502 | out[1] = a[1] / b[1];
|
22503 | return out;
|
22504 | }
|
22505 | /**
|
22506 | * Math.ceil the components of a vec2
|
22507 | *
|
22508 | * @param {vec2} out the receiving vector
|
22509 | * @param {ReadonlyVec2} a vector to ceil
|
22510 | * @returns {vec2} out
|
22511 | */
|
22512 |
|
22513 | function ceil(out, a) {
|
22514 | out[0] = Math.ceil(a[0]);
|
22515 | out[1] = Math.ceil(a[1]);
|
22516 | return out;
|
22517 | }
|
22518 | /**
|
22519 | * Math.floor the components of a vec2
|
22520 | *
|
22521 | * @param {vec2} out the receiving vector
|
22522 | * @param {ReadonlyVec2} a vector to floor
|
22523 | * @returns {vec2} out
|
22524 | */
|
22525 |
|
22526 | function floor(out, a) {
|
22527 | out[0] = Math.floor(a[0]);
|
22528 | out[1] = Math.floor(a[1]);
|
22529 | return out;
|
22530 | }
|
22531 | /**
|
22532 | * Returns the minimum of two vec2's
|
22533 | *
|
22534 | * @param {vec2} out the receiving vector
|
22535 | * @param {ReadonlyVec2} a the first operand
|
22536 | * @param {ReadonlyVec2} b the second operand
|
22537 | * @returns {vec2} out
|
22538 | */
|
22539 |
|
22540 | function min(out, a, b) {
|
22541 | out[0] = Math.min(a[0], b[0]);
|
22542 | out[1] = Math.min(a[1], b[1]);
|
22543 | return out;
|
22544 | }
|
22545 | /**
|
22546 | * Returns the maximum of two vec2's
|
22547 | *
|
22548 | * @param {vec2} out the receiving vector
|
22549 | * @param {ReadonlyVec2} a the first operand
|
22550 | * @param {ReadonlyVec2} b the second operand
|
22551 | * @returns {vec2} out
|
22552 | */
|
22553 |
|
22554 | function max(out, a, b) {
|
22555 | out[0] = Math.max(a[0], b[0]);
|
22556 | out[1] = Math.max(a[1], b[1]);
|
22557 | return out;
|
22558 | }
|
22559 | /**
|
22560 | * Math.round the components of a vec2
|
22561 | *
|
22562 | * @param {vec2} out the receiving vector
|
22563 | * @param {ReadonlyVec2} a vector to round
|
22564 | * @returns {vec2} out
|
22565 | */
|
22566 |
|
22567 | function round(out, a) {
|
22568 | out[0] = Math.round(a[0]);
|
22569 | out[1] = Math.round(a[1]);
|
22570 | return out;
|
22571 | }
|
22572 | /**
|
22573 | * Scales a vec2 by a scalar number
|
22574 | *
|
22575 | * @param {vec2} out the receiving vector
|
22576 | * @param {ReadonlyVec2} a the vector to scale
|
22577 | * @param {Number} b amount to scale the vector by
|
22578 | * @returns {vec2} out
|
22579 | */
|
22580 |
|
22581 | function scale(out, a, b) {
|
22582 | out[0] = a[0] * b;
|
22583 | out[1] = a[1] * b;
|
22584 | return out;
|
22585 | }
|
22586 | /**
|
22587 | * Adds two vec2's after scaling the second operand by a scalar value
|
22588 | *
|
22589 | * @param {vec2} out the receiving vector
|
22590 | * @param {ReadonlyVec2} a the first operand
|
22591 | * @param {ReadonlyVec2} b the second operand
|
22592 | * @param {Number} scale the amount to scale b by before adding
|
22593 | * @returns {vec2} out
|
22594 | */
|
22595 |
|
22596 | function scaleAndAdd(out, a, b, scale) {
|
22597 | out[0] = a[0] + b[0] * scale;
|
22598 | out[1] = a[1] + b[1] * scale;
|
22599 | return out;
|
22600 | }
|
22601 | /**
|
22602 | * Calculates the euclidian distance between two vec2's
|
22603 | *
|
22604 | * @param {ReadonlyVec2} a the first operand
|
22605 | * @param {ReadonlyVec2} b the second operand
|
22606 | * @returns {Number} distance between a and b
|
22607 | */
|
22608 |
|
22609 | function distance(a, b) {
|
22610 | var x = b[0] - a[0],
|
22611 | y = b[1] - a[1];
|
22612 | return Math.hypot(x, y);
|
22613 | }
|
22614 | /**
|
22615 | * Calculates the squared euclidian distance between two vec2's
|
22616 | *
|
22617 | * @param {ReadonlyVec2} a the first operand
|
22618 | * @param {ReadonlyVec2} b the second operand
|
22619 | * @returns {Number} squared distance between a and b
|
22620 | */
|
22621 |
|
22622 | function squaredDistance(a, b) {
|
22623 | var x = b[0] - a[0],
|
22624 | y = b[1] - a[1];
|
22625 | return x * x + y * y;
|
22626 | }
|
22627 | /**
|
22628 | * Calculates the length of a vec2
|
22629 | *
|
22630 | * @param {ReadonlyVec2} a vector to calculate length of
|
22631 | * @returns {Number} length of a
|
22632 | */
|
22633 |
|
22634 | function length(a) {
|
22635 | var x = a[0],
|
22636 | y = a[1];
|
22637 | return Math.hypot(x, y);
|
22638 | }
|
22639 | /**
|
22640 | * Calculates the squared length of a vec2
|
22641 | *
|
22642 | * @param {ReadonlyVec2} a vector to calculate squared length of
|
22643 | * @returns {Number} squared length of a
|
22644 | */
|
22645 |
|
22646 | function squaredLength(a) {
|
22647 | var x = a[0],
|
22648 | y = a[1];
|
22649 | return x * x + y * y;
|
22650 | }
|
22651 | /**
|
22652 | * Negates the components of a vec2
|
22653 | *
|
22654 | * @param {vec2} out the receiving vector
|
22655 | * @param {ReadonlyVec2} a vector to negate
|
22656 | * @returns {vec2} out
|
22657 | */
|
22658 |
|
22659 | function negate(out, a) {
|
22660 | out[0] = -a[0];
|
22661 | out[1] = -a[1];
|
22662 | return out;
|
22663 | }
|
22664 | /**
|
22665 | * Returns the inverse of the components of a vec2
|
22666 | *
|
22667 | * @param {vec2} out the receiving vector
|
22668 | * @param {ReadonlyVec2} a vector to invert
|
22669 | * @returns {vec2} out
|
22670 | */
|
22671 |
|
22672 | function inverse(out, a) {
|
22673 | out[0] = 1.0 / a[0];
|
22674 | out[1] = 1.0 / a[1];
|
22675 | return out;
|
22676 | }
|
22677 | /**
|
22678 | * Normalize a vec2
|
22679 | *
|
22680 | * @param {vec2} out the receiving vector
|
22681 | * @param {ReadonlyVec2} a vector to normalize
|
22682 | * @returns {vec2} out
|
22683 | */
|
22684 |
|
22685 | function normalize(out, a) {
|
22686 | var x = a[0],
|
22687 | y = a[1];
|
22688 | var len = x * x + y * y;
|
22689 |
|
22690 | if (len > 0) {
|
22691 | //TODO: evaluate use of glm_invsqrt here?
|
22692 | len = 1 / Math.sqrt(len);
|
22693 | }
|
22694 |
|
22695 | out[0] = a[0] * len;
|
22696 | out[1] = a[1] * len;
|
22697 | return out;
|
22698 | }
|
22699 | /**
|
22700 | * Calculates the dot product of two vec2's
|
22701 | *
|
22702 | * @param {ReadonlyVec2} a the first operand
|
22703 | * @param {ReadonlyVec2} b the second operand
|
22704 | * @returns {Number} dot product of a and b
|
22705 | */
|
22706 |
|
22707 | function dot$1(a, b) {
|
22708 | return a[0] * b[0] + a[1] * b[1];
|
22709 | }
|
22710 | /**
|
22711 | * Computes the cross product of two vec2's
|
22712 | * Note that the cross product must by definition produce a 3D vector
|
22713 | *
|
22714 | * @param {vec3} out the receiving vector
|
22715 | * @param {ReadonlyVec2} a the first operand
|
22716 | * @param {ReadonlyVec2} b the second operand
|
22717 | * @returns {vec3} out
|
22718 | */
|
22719 |
|
22720 | function cross(out, a, b) {
|
22721 | var z = a[0] * b[1] - a[1] * b[0];
|
22722 | out[0] = out[1] = 0;
|
22723 | out[2] = z;
|
22724 | return out;
|
22725 | }
|
22726 | /**
|
22727 | * Performs a linear interpolation between two vec2's
|
22728 | *
|
22729 | * @param {vec2} out the receiving vector
|
22730 | * @param {ReadonlyVec2} a the first operand
|
22731 | * @param {ReadonlyVec2} b the second operand
|
22732 | * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
|
22733 | * @returns {vec2} out
|
22734 | */
|
22735 |
|
22736 | function lerp(out, a, b, t) {
|
22737 | var ax = a[0],
|
22738 | ay = a[1];
|
22739 | out[0] = ax + t * (b[0] - ax);
|
22740 | out[1] = ay + t * (b[1] - ay);
|
22741 | return out;
|
22742 | }
|
22743 | /**
|
22744 | * Generates a random vector with the given scale
|
22745 | *
|
22746 | * @param {vec2} out the receiving vector
|
22747 | * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned
|
22748 | * @returns {vec2} out
|
22749 | */
|
22750 |
|
22751 | function random(out, scale) {
|
22752 | scale = scale || 1.0;
|
22753 | var r = RANDOM() * 2.0 * Math.PI;
|
22754 | out[0] = Math.cos(r) * scale;
|
22755 | out[1] = Math.sin(r) * scale;
|
22756 | return out;
|
22757 | }
|
22758 | /**
|
22759 | * Transforms the vec2 with a mat2
|
22760 | *
|
22761 | * @param {vec2} out the receiving vector
|
22762 | * @param {ReadonlyVec2} a the vector to transform
|
22763 | * @param {ReadonlyMat2} m matrix to transform with
|
22764 | * @returns {vec2} out
|
22765 | */
|
22766 |
|
22767 | function transformMat2(out, a, m) {
|
22768 | var x = a[0],
|
22769 | y = a[1];
|
22770 | out[0] = m[0] * x + m[2] * y;
|
22771 | out[1] = m[1] * x + m[3] * y;
|
22772 | return out;
|
22773 | }
|
22774 | /**
|
22775 | * Transforms the vec2 with a mat2d
|
22776 | *
|
22777 | * @param {vec2} out the receiving vector
|
22778 | * @param {ReadonlyVec2} a the vector to transform
|
22779 | * @param {ReadonlyMat2d} m matrix to transform with
|
22780 | * @returns {vec2} out
|
22781 | */
|
22782 |
|
22783 | function transformMat2d(out, a, m) {
|
22784 | var x = a[0],
|
22785 | y = a[1];
|
22786 | out[0] = m[0] * x + m[2] * y + m[4];
|
22787 | out[1] = m[1] * x + m[3] * y + m[5];
|
22788 | return out;
|
22789 | }
|
22790 | /**
|
22791 | * Transforms the vec2 with a mat3
|
22792 | * 3rd vector component is implicitly '1'
|
22793 | *
|
22794 | * @param {vec2} out the receiving vector
|
22795 | * @param {ReadonlyVec2} a the vector to transform
|
22796 | * @param {ReadonlyMat3} m matrix to transform with
|
22797 | * @returns {vec2} out
|
22798 | */
|
22799 |
|
22800 | function transformMat3(out, a, m) {
|
22801 | var x = a[0],
|
22802 | y = a[1];
|
22803 | out[0] = m[0] * x + m[3] * y + m[6];
|
22804 | out[1] = m[1] * x + m[4] * y + m[7];
|
22805 | return out;
|
22806 | }
|
22807 | /**
|
22808 | * Transforms the vec2 with a mat4
|
22809 | * 3rd vector component is implicitly '0'
|
22810 | * 4th vector component is implicitly '1'
|
22811 | *
|
22812 | * @param {vec2} out the receiving vector
|
22813 | * @param {ReadonlyVec2} a the vector to transform
|
22814 | * @param {ReadonlyMat4} m matrix to transform with
|
22815 | * @returns {vec2} out
|
22816 | */
|
22817 |
|
22818 | function transformMat4(out, a, m) {
|
22819 | var x = a[0];
|
22820 | var y = a[1];
|
22821 | out[0] = m[0] * x + m[4] * y + m[12];
|
22822 | out[1] = m[1] * x + m[5] * y + m[13];
|
22823 | return out;
|
22824 | }
|
22825 | /**
|
22826 | * Rotate a 2D vector
|
22827 | * @param {vec2} out The receiving vec2
|
22828 | * @param {ReadonlyVec2} a The vec2 point to rotate
|
22829 | * @param {ReadonlyVec2} b The origin of the rotation
|
22830 | * @param {Number} rad The angle of rotation in radians
|
22831 | * @returns {vec2} out
|
22832 | */
|
22833 |
|
22834 | function rotate(out, a, b, rad) {
|
22835 | //Translate point to the origin
|
22836 | var p0 = a[0] - b[0],
|
22837 | p1 = a[1] - b[1],
|
22838 | sinC = Math.sin(rad),
|
22839 | cosC = Math.cos(rad); //perform rotation and translate to correct position
|
22840 |
|
22841 | out[0] = p0 * cosC - p1 * sinC + b[0];
|
22842 | out[1] = p0 * sinC + p1 * cosC + b[1];
|
22843 | return out;
|
22844 | }
|
22845 | /**
|
22846 | * Get the angle between two 2D vectors
|
22847 | * @param {ReadonlyVec2} a The first operand
|
22848 | * @param {ReadonlyVec2} b The second operand
|
22849 | * @returns {Number} The angle in radians
|
22850 | */
|
22851 |
|
22852 | function angle(a, b) {
|
22853 | var x1 = a[0],
|
22854 | y1 = a[1],
|
22855 | x2 = b[0],
|
22856 | y2 = b[1],
|
22857 | // mag is the product of the magnitudes of a and b
|
22858 | mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),
|
22859 | // mag &&.. short circuits if mag == 0
|
22860 | cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1
|
22861 |
|
22862 | return Math.acos(Math.min(Math.max(cosine, -1), 1));
|
22863 | }
|
22864 | /**
|
22865 | * Set the components of a vec2 to zero
|
22866 | *
|
22867 | * @param {vec2} out the receiving vector
|
22868 | * @returns {vec2} out
|
22869 | */
|
22870 |
|
22871 | function zero(out) {
|
22872 | out[0] = 0.0;
|
22873 | out[1] = 0.0;
|
22874 | return out;
|
22875 | }
|
22876 | /**
|
22877 | * Returns a string representation of a vector
|
22878 | *
|
22879 | * @param {ReadonlyVec2} a vector to represent as a string
|
22880 | * @returns {String} string representation of the vector
|
22881 | */
|
22882 |
|
22883 | function str(a) {
|
22884 | return "vec2(" + a[0] + ", " + a[1] + ")";
|
22885 | }
|
22886 | /**
|
22887 | * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)
|
22888 | *
|
22889 | * @param {ReadonlyVec2} a The first vector.
|
22890 | * @param {ReadonlyVec2} b The second vector.
|
22891 | * @returns {Boolean} True if the vectors are equal, false otherwise.
|
22892 | */
|
22893 |
|
22894 | function exactEquals(a, b) {
|
22895 | return a[0] === b[0] && a[1] === b[1];
|
22896 | }
|
22897 | /**
|
22898 | * Returns whether or not the vectors have approximately the same elements in the same position.
|
22899 | *
|
22900 | * @param {ReadonlyVec2} a The first vector.
|
22901 | * @param {ReadonlyVec2} b The second vector.
|
22902 | * @returns {Boolean} True if the vectors are equal, false otherwise.
|
22903 | */
|
22904 |
|
22905 | function equals$1(a, b) {
|
22906 | var a0 = a[0],
|
22907 | a1 = a[1];
|
22908 | var b0 = b[0],
|
22909 | b1 = b[1];
|
22910 | return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));
|
22911 | }
|
22912 | /**
|
22913 | * Alias for {@link vec2.length}
|
22914 | * @function
|
22915 | */
|
22916 |
|
22917 | var len = length;
|
22918 | /**
|
22919 | * Alias for {@link vec2.subtract}
|
22920 | * @function
|
22921 | */
|
22922 |
|
22923 | var sub = subtract;
|
22924 | /**
|
22925 | * Alias for {@link vec2.multiply}
|
22926 | * @function
|
22927 | */
|
22928 |
|
22929 | var mul = multiply;
|
22930 | /**
|
22931 | * Alias for {@link vec2.divide}
|
22932 | * @function
|
22933 | */
|
22934 |
|
22935 | var div = divide;
|
22936 | /**
|
22937 | * Alias for {@link vec2.distance}
|
22938 | * @function
|
22939 | */
|
22940 |
|
22941 | var dist = distance;
|
22942 | /**
|
22943 | * Alias for {@link vec2.squaredDistance}
|
22944 | * @function
|
22945 | */
|
22946 |
|
22947 | var sqrDist = squaredDistance;
|
22948 | /**
|
22949 | * Alias for {@link vec2.squaredLength}
|
22950 | * @function
|
22951 | */
|
22952 |
|
22953 | var sqrLen = squaredLength;
|
22954 | /**
|
22955 | * Perform some operation over an array of vec2s.
|
22956 | *
|
22957 | * @param {Array} a the array of vectors to iterate over
|
22958 | * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed
|
22959 | * @param {Number} offset Number of elements to skip at the beginning of the array
|
22960 | * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array
|
22961 | * @param {Function} fn Function to call for each vector in the array
|
22962 | * @param {Object} [arg] additional argument to pass to fn
|
22963 | * @returns {Array} a
|
22964 | * @function
|
22965 | */
|
22966 |
|
22967 | var forEach = function () {
|
22968 | var vec = create();
|
22969 | return function (a, stride, offset, count, fn, arg) {
|
22970 | var i, l;
|
22971 |
|
22972 | if (!stride) {
|
22973 | stride = 2;
|
22974 | }
|
22975 |
|
22976 | if (!offset) {
|
22977 | offset = 0;
|
22978 | }
|
22979 |
|
22980 | if (count) {
|
22981 | l = Math.min(count * stride + offset, a.length);
|
22982 | } else {
|
22983 | l = a.length;
|
22984 | }
|
22985 |
|
22986 | for (i = offset; i < l; i += stride) {
|
22987 | vec[0] = a[i];
|
22988 | vec[1] = a[i + 1];
|
22989 | fn(vec, vec, arg);
|
22990 | a[i] = vec[0];
|
22991 | a[i + 1] = vec[1];
|
22992 | }
|
22993 |
|
22994 | return a;
|
22995 | };
|
22996 | }();
|
22997 |
|
22998 | var vec2 = /*#__PURE__*/Object.freeze({
|
22999 | __proto__: null,
|
23000 | create: create,
|
23001 | clone: clone,
|
23002 | fromValues: fromValues,
|
23003 | copy: copy,
|
23004 | set: set,
|
23005 | add: add,
|
23006 | subtract: subtract,
|
23007 | multiply: multiply,
|
23008 | divide: divide,
|
23009 | ceil: ceil,
|
23010 | floor: floor,
|
23011 | min: min,
|
23012 | max: max,
|
23013 | round: round,
|
23014 | scale: scale,
|
23015 | scaleAndAdd: scaleAndAdd,
|
23016 | distance: distance,
|
23017 | squaredDistance: squaredDistance,
|
23018 | length: length,
|
23019 | squaredLength: squaredLength,
|
23020 | negate: negate,
|
23021 | inverse: inverse,
|
23022 | normalize: normalize,
|
23023 | dot: dot$1,
|
23024 | cross: cross,
|
23025 | lerp: lerp,
|
23026 | random: random,
|
23027 | transformMat2: transformMat2,
|
23028 | transformMat2d: transformMat2d,
|
23029 | transformMat3: transformMat3,
|
23030 | transformMat4: transformMat4,
|
23031 | rotate: rotate,
|
23032 | angle: angle,
|
23033 | zero: zero,
|
23034 | str: str,
|
23035 | exactEquals: exactEquals,
|
23036 | equals: equals$1,
|
23037 | len: len,
|
23038 | sub: sub,
|
23039 | mul: mul,
|
23040 | div: div,
|
23041 | dist: dist,
|
23042 | sqrDist: sqrDist,
|
23043 | sqrLen: sqrLen,
|
23044 | forEach: forEach
|
23045 | });
|
23046 |
|
23047 | class CircleStyleLayer extends StyleLayer {
|
23048 | constructor(layer) {
|
23049 | super(layer, properties$8);
|
23050 | }
|
23051 | createBucket(parameters) {
|
23052 | return new CircleBucket(parameters);
|
23053 | }
|
23054 | queryRadius(bucket) {
|
23055 | const circleBucket = bucket;
|
23056 | return getMaximumPaintValue('circle-radius', this, circleBucket) +
|
23057 | getMaximumPaintValue('circle-stroke-width', this, circleBucket) +
|
23058 | translateDistance(this.paint.get('circle-translate'));
|
23059 | }
|
23060 | queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform, pixelsToTileUnits, pixelPosMatrix) {
|
23061 | const translatedPolygon = translate$4(queryGeometry, this.paint.get('circle-translate'), this.paint.get('circle-translate-anchor'), transform.angle, pixelsToTileUnits);
|
23062 | const radius = this.paint.get('circle-radius').evaluate(feature, featureState);
|
23063 | const stroke = this.paint.get('circle-stroke-width').evaluate(feature, featureState);
|
23064 | const size = radius + stroke;
|
23065 | // For pitch-alignment: map, compare feature geometry to query geometry in the plane of the tile
|
23066 | // // Otherwise, compare geometry in the plane of the viewport
|
23067 | // // A circle with fixed scaling relative to the viewport gets larger in tile space as it moves into the distance
|
23068 | // // A circle with fixed scaling relative to the map gets smaller in viewport space as it moves into the distance
|
23069 | const alignWithMap = this.paint.get('circle-pitch-alignment') === 'map';
|
23070 | const transformedPolygon = alignWithMap ? translatedPolygon : projectQueryGeometry$1(translatedPolygon, pixelPosMatrix);
|
23071 | const transformedSize = alignWithMap ? size * pixelsToTileUnits : size;
|
23072 | for (const ring of geometry) {
|
23073 | for (const point of ring) {
|
23074 | const transformedPoint = alignWithMap ? point : projectPoint(point, pixelPosMatrix);
|
23075 | let adjustedSize = transformedSize;
|
23076 | const projectedCenter = transformMat4$1([], [point.x, point.y, 0, 1], pixelPosMatrix);
|
23077 | if (this.paint.get('circle-pitch-scale') === 'viewport' && this.paint.get('circle-pitch-alignment') === 'map') {
|
23078 | adjustedSize *= projectedCenter[3] / transform.cameraToCenterDistance;
|
23079 | }
|
23080 | else if (this.paint.get('circle-pitch-scale') === 'map' && this.paint.get('circle-pitch-alignment') === 'viewport') {
|
23081 | adjustedSize *= transform.cameraToCenterDistance / projectedCenter[3];
|
23082 | }
|
23083 | if (polygonIntersectsBufferedPoint(transformedPolygon, transformedPoint, adjustedSize))
|
23084 | return true;
|
23085 | }
|
23086 | }
|
23087 | return false;
|
23088 | }
|
23089 | }
|
23090 | function projectPoint(p, pixelPosMatrix) {
|
23091 | const point = transformMat4$1([], [p.x, p.y, 0, 1], pixelPosMatrix);
|
23092 | return new pointGeometry(point[0] / point[3], point[1] / point[3]);
|
23093 | }
|
23094 | function projectQueryGeometry$1(queryGeometry, pixelPosMatrix) {
|
23095 | return queryGeometry.map((p) => {
|
23096 | return projectPoint(p, pixelPosMatrix);
|
23097 | });
|
23098 | }
|
23099 |
|
23100 | class HeatmapBucket extends CircleBucket {
|
23101 | }
|
23102 | register('HeatmapBucket', HeatmapBucket, { omit: ['layers'] });
|
23103 |
|
23104 | // This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
|
23105 | const paint$7 = new Properties({
|
23106 | "heatmap-radius": new DataDrivenProperty(spec["paint_heatmap"]["heatmap-radius"]),
|
23107 | "heatmap-weight": new DataDrivenProperty(spec["paint_heatmap"]["heatmap-weight"]),
|
23108 | "heatmap-intensity": new DataConstantProperty(spec["paint_heatmap"]["heatmap-intensity"]),
|
23109 | "heatmap-color": new ColorRampProperty(spec["paint_heatmap"]["heatmap-color"]),
|
23110 | "heatmap-opacity": new DataConstantProperty(spec["paint_heatmap"]["heatmap-opacity"]),
|
23111 | });
|
23112 | var properties$7 = { paint: paint$7 };
|
23113 |
|
23114 | function createImage(image, { width, height }, channels, data) {
|
23115 | if (!data) {
|
23116 | data = new Uint8Array(width * height * channels);
|
23117 | }
|
23118 | else if (data instanceof Uint8ClampedArray) {
|
23119 | data = new Uint8Array(data.buffer);
|
23120 | }
|
23121 | else if (data.length !== width * height * channels) {
|
23122 | throw new RangeError(`mismatched image size. expected: ${data.length} but got: ${width * height * channels}`);
|
23123 | }
|
23124 | image.width = width;
|
23125 | image.height = height;
|
23126 | image.data = data;
|
23127 | return image;
|
23128 | }
|
23129 | function resizeImage(image, { width, height }, channels) {
|
23130 | if (width === image.width && height === image.height) {
|
23131 | return;
|
23132 | }
|
23133 | const newImage = createImage({}, { width, height }, channels);
|
23134 | copyImage(image, newImage, { x: 0, y: 0 }, { x: 0, y: 0 }, {
|
23135 | width: Math.min(image.width, width),
|
23136 | height: Math.min(image.height, height)
|
23137 | }, channels);
|
23138 | image.width = width;
|
23139 | image.height = height;
|
23140 | image.data = newImage.data;
|
23141 | }
|
23142 | function copyImage(srcImg, dstImg, srcPt, dstPt, size, channels) {
|
23143 | if (size.width === 0 || size.height === 0) {
|
23144 | return dstImg;
|
23145 | }
|
23146 | if (size.width > srcImg.width ||
|
23147 | size.height > srcImg.height ||
|
23148 | srcPt.x > srcImg.width - size.width ||
|
23149 | srcPt.y > srcImg.height - size.height) {
|
23150 | throw new RangeError('out of range source coordinates for image copy');
|
23151 | }
|
23152 | if (size.width > dstImg.width ||
|
23153 | size.height > dstImg.height ||
|
23154 | dstPt.x > dstImg.width - size.width ||
|
23155 | dstPt.y > dstImg.height - size.height) {
|
23156 | throw new RangeError('out of range destination coordinates for image copy');
|
23157 | }
|
23158 | const srcData = srcImg.data;
|
23159 | const dstData = dstImg.data;
|
23160 | assert$1(srcData !== dstData);
|
23161 | for (let y = 0; y < size.height; y++) {
|
23162 | const srcOffset = ((srcPt.y + y) * srcImg.width + srcPt.x) * channels;
|
23163 | const dstOffset = ((dstPt.y + y) * dstImg.width + dstPt.x) * channels;
|
23164 | for (let i = 0; i < size.width * channels; i++) {
|
23165 | dstData[dstOffset + i] = srcData[srcOffset + i];
|
23166 | }
|
23167 | }
|
23168 | return dstImg;
|
23169 | }
|
23170 | class AlphaImage {
|
23171 | constructor(size, data) {
|
23172 | createImage(this, size, 1, data);
|
23173 | }
|
23174 | resize(size) {
|
23175 | resizeImage(this, size, 1);
|
23176 | }
|
23177 | clone() {
|
23178 | return new AlphaImage({ width: this.width, height: this.height }, new Uint8Array(this.data));
|
23179 | }
|
23180 | static copy(srcImg, dstImg, srcPt, dstPt, size) {
|
23181 | copyImage(srcImg, dstImg, srcPt, dstPt, size, 1);
|
23182 | }
|
23183 | }
|
23184 | // Not premultiplied, because ImageData is not premultiplied.
|
23185 | // UNPACK_PREMULTIPLY_ALPHA_WEBGL must be used when uploading to a texture.
|
23186 | class RGBAImage {
|
23187 | constructor(size, data) {
|
23188 | createImage(this, size, 4, data);
|
23189 | }
|
23190 | resize(size) {
|
23191 | resizeImage(this, size, 4);
|
23192 | }
|
23193 | replace(data, copy) {
|
23194 | if (copy) {
|
23195 | this.data.set(data);
|
23196 | }
|
23197 | else if (data instanceof Uint8ClampedArray) {
|
23198 | this.data = new Uint8Array(data.buffer);
|
23199 | }
|
23200 | else {
|
23201 | this.data = data;
|
23202 | }
|
23203 | }
|
23204 | clone() {
|
23205 | return new RGBAImage({ width: this.width, height: this.height }, new Uint8Array(this.data));
|
23206 | }
|
23207 | static copy(srcImg, dstImg, srcPt, dstPt, size) {
|
23208 | copyImage(srcImg, dstImg, srcPt, dstPt, size, 4);
|
23209 | }
|
23210 | }
|
23211 | register('AlphaImage', AlphaImage);
|
23212 | register('RGBAImage', RGBAImage);
|
23213 |
|
23214 | /**
|
23215 | * Given an expression that should evaluate to a color ramp,
|
23216 | * return a RGBA image representing that ramp expression.
|
23217 | *
|
23218 | * @private
|
23219 | */
|
23220 | function renderColorRamp(params) {
|
23221 | const evaluationGlobals = {};
|
23222 | const width = params.resolution || 256;
|
23223 | const height = params.clips ? params.clips.length : 1;
|
23224 | const image = params.image || new RGBAImage({ width, height });
|
23225 | assert$1(isPowerOfTwo(width));
|
23226 | const renderPixel = (stride, index, progress) => {
|
23227 | evaluationGlobals[params.evaluationKey] = progress;
|
23228 | const pxColor = params.expression.evaluate(evaluationGlobals);
|
23229 | // the colors are being unpremultiplied because Color uses
|
23230 | // premultiplied values, and the Texture class expects unpremultiplied ones
|
23231 | image.data[stride + index + 0] = Math.floor(pxColor.r * 255 / pxColor.a);
|
23232 | image.data[stride + index + 1] = Math.floor(pxColor.g * 255 / pxColor.a);
|
23233 | image.data[stride + index + 2] = Math.floor(pxColor.b * 255 / pxColor.a);
|
23234 | image.data[stride + index + 3] = Math.floor(pxColor.a * 255);
|
23235 | };
|
23236 | if (!params.clips) {
|
23237 | for (let i = 0, j = 0; i < width; i++, j += 4) {
|
23238 | const progress = i / (width - 1);
|
23239 | renderPixel(0, j, progress);
|
23240 | }
|
23241 | }
|
23242 | else {
|
23243 | for (let clip = 0, stride = 0; clip < height; ++clip, stride += width * 4) {
|
23244 | for (let i = 0, j = 0; i < width; i++, j += 4) {
|
23245 | // Remap progress between clips
|
23246 | const progress = i / (width - 1);
|
23247 | const { start, end } = params.clips[clip];
|
23248 | const evaluationProgress = start * (1 - progress) + end * progress;
|
23249 | renderPixel(stride, j, evaluationProgress);
|
23250 | }
|
23251 | }
|
23252 | }
|
23253 | return image;
|
23254 | }
|
23255 |
|
23256 | class HeatmapStyleLayer extends StyleLayer {
|
23257 | constructor(layer) {
|
23258 | super(layer, properties$7);
|
23259 | // make sure color ramp texture is generated for default heatmap color too
|
23260 | this._updateColorRamp();
|
23261 | }
|
23262 | createBucket(options) {
|
23263 | return new HeatmapBucket(options);
|
23264 | }
|
23265 | _handleSpecialPaintPropertyUpdate(name) {
|
23266 | if (name === 'heatmap-color') {
|
23267 | this._updateColorRamp();
|
23268 | }
|
23269 | }
|
23270 | _updateColorRamp() {
|
23271 | const expression = this._transitionablePaint._values['heatmap-color'].value.expression;
|
23272 | this.colorRamp = renderColorRamp({
|
23273 | expression,
|
23274 | evaluationKey: 'heatmapDensity',
|
23275 | image: this.colorRamp
|
23276 | });
|
23277 | this.colorRampTexture = null;
|
23278 | }
|
23279 | resize() {
|
23280 | if (this.heatmapFbo) {
|
23281 | this.heatmapFbo.destroy();
|
23282 | this.heatmapFbo = null;
|
23283 | }
|
23284 | }
|
23285 | queryRadius() {
|
23286 | return 0;
|
23287 | }
|
23288 | queryIntersectsFeature() {
|
23289 | return false;
|
23290 | }
|
23291 | hasOffscreenPass() {
|
23292 | return this.paint.get('heatmap-opacity') !== 0 && this.visibility !== 'none';
|
23293 | }
|
23294 | }
|
23295 |
|
23296 | // This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
|
23297 | const paint$6 = new Properties({
|
23298 | "hillshade-illumination-direction": new DataConstantProperty(spec["paint_hillshade"]["hillshade-illumination-direction"]),
|
23299 | "hillshade-illumination-anchor": new DataConstantProperty(spec["paint_hillshade"]["hillshade-illumination-anchor"]),
|
23300 | "hillshade-exaggeration": new DataConstantProperty(spec["paint_hillshade"]["hillshade-exaggeration"]),
|
23301 | "hillshade-shadow-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-shadow-color"]),
|
23302 | "hillshade-highlight-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-highlight-color"]),
|
23303 | "hillshade-accent-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-accent-color"]),
|
23304 | });
|
23305 | var properties$6 = { paint: paint$6 };
|
23306 |
|
23307 | class HillshadeStyleLayer extends StyleLayer {
|
23308 | constructor(layer) {
|
23309 | super(layer, properties$6);
|
23310 | }
|
23311 | hasOffscreenPass() {
|
23312 | return this.paint.get('hillshade-exaggeration') !== 0 && this.visibility !== 'none';
|
23313 | }
|
23314 | }
|
23315 |
|
23316 | const layout$4 = createLayout([
|
23317 | { name: 'a_pos', components: 2, type: 'Int16' }
|
23318 | ], 4);
|
23319 | const { members: members$3, size: size$3, alignment: alignment$3 } = layout$4;
|
23320 |
|
23321 | var earcut$2 = {exports: {}};
|
23322 |
|
23323 | ;
|
23324 |
|
23325 | earcut$2.exports = earcut;
|
23326 | var _default = earcut$2.exports.default = earcut;
|
23327 |
|
23328 | function earcut(data, holeIndices, dim) {
|
23329 |
|
23330 | dim = dim || 2;
|
23331 |
|
23332 | var hasHoles = holeIndices && holeIndices.length,
|
23333 | outerLen = hasHoles ? holeIndices[0] * dim : data.length,
|
23334 | outerNode = linkedList(data, 0, outerLen, dim, true),
|
23335 | triangles = [];
|
23336 |
|
23337 | if (!outerNode || outerNode.next === outerNode.prev) return triangles;
|
23338 |
|
23339 | var minX, minY, maxX, maxY, x, y, invSize;
|
23340 |
|
23341 | if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
|
23342 |
|
23343 | // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
|
23344 | if (data.length > 80 * dim) {
|
23345 | minX = maxX = data[0];
|
23346 | minY = maxY = data[1];
|
23347 |
|
23348 | for (var i = dim; i < outerLen; i += dim) {
|
23349 | x = data[i];
|
23350 | y = data[i + 1];
|
23351 | if (x < minX) minX = x;
|
23352 | if (y < minY) minY = y;
|
23353 | if (x > maxX) maxX = x;
|
23354 | if (y > maxY) maxY = y;
|
23355 | }
|
23356 |
|
23357 | // minX, minY and invSize are later used to transform coords into integers for z-order calculation
|
23358 | invSize = Math.max(maxX - minX, maxY - minY);
|
23359 | invSize = invSize !== 0 ? 1 / invSize : 0;
|
23360 | }
|
23361 |
|
23362 | earcutLinked(outerNode, triangles, dim, minX, minY, invSize);
|
23363 |
|
23364 | return triangles;
|
23365 | }
|
23366 |
|
23367 | // create a circular doubly linked list from polygon points in the specified winding order
|
23368 | function linkedList(data, start, end, dim, clockwise) {
|
23369 | var i, last;
|
23370 |
|
23371 | if (clockwise === (signedArea$1(data, start, end, dim) > 0)) {
|
23372 | for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);
|
23373 | } else {
|
23374 | for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);
|
23375 | }
|
23376 |
|
23377 | if (last && equals(last, last.next)) {
|
23378 | removeNode(last);
|
23379 | last = last.next;
|
23380 | }
|
23381 |
|
23382 | return last;
|
23383 | }
|
23384 |
|
23385 | // eliminate colinear or duplicate points
|
23386 | function filterPoints(start, end) {
|
23387 | if (!start) return start;
|
23388 | if (!end) end = start;
|
23389 |
|
23390 | var p = start,
|
23391 | again;
|
23392 | do {
|
23393 | again = false;
|
23394 |
|
23395 | if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
|
23396 | removeNode(p);
|
23397 | p = end = p.prev;
|
23398 | if (p === p.next) break;
|
23399 | again = true;
|
23400 |
|
23401 | } else {
|
23402 | p = p.next;
|
23403 | }
|
23404 | } while (again || p !== end);
|
23405 |
|
23406 | return end;
|
23407 | }
|
23408 |
|
23409 | // main ear slicing loop which triangulates a polygon (given as a linked list)
|
23410 | function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
|
23411 | if (!ear) return;
|
23412 |
|
23413 | // interlink polygon nodes in z-order
|
23414 | if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
|
23415 |
|
23416 | var stop = ear,
|
23417 | prev, next;
|
23418 |
|
23419 | // iterate through ears, slicing them one by one
|
23420 | while (ear.prev !== ear.next) {
|
23421 | prev = ear.prev;
|
23422 | next = ear.next;
|
23423 |
|
23424 | if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
|
23425 | // cut off the triangle
|
23426 | triangles.push(prev.i / dim);
|
23427 | triangles.push(ear.i / dim);
|
23428 | triangles.push(next.i / dim);
|
23429 |
|
23430 | removeNode(ear);
|
23431 |
|
23432 | // skipping the next vertex leads to less sliver triangles
|
23433 | ear = next.next;
|
23434 | stop = next.next;
|
23435 |
|
23436 | continue;
|
23437 | }
|
23438 |
|
23439 | ear = next;
|
23440 |
|
23441 | // if we looped through the whole remaining polygon and can't find any more ears
|
23442 | if (ear === stop) {
|
23443 | // try filtering points and slicing again
|
23444 | if (!pass) {
|
23445 | earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
|
23446 |
|
23447 | // if this didn't work, try curing all small self-intersections locally
|
23448 | } else if (pass === 1) {
|
23449 | ear = cureLocalIntersections(filterPoints(ear), triangles, dim);
|
23450 | earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
|
23451 |
|
23452 | // as a last resort, try splitting the remaining polygon into two
|
23453 | } else if (pass === 2) {
|
23454 | splitEarcut(ear, triangles, dim, minX, minY, invSize);
|
23455 | }
|
23456 |
|
23457 | break;
|
23458 | }
|
23459 | }
|
23460 | }
|
23461 |
|
23462 | // check whether a polygon node forms a valid ear with adjacent nodes
|
23463 | function isEar(ear) {
|
23464 | var a = ear.prev,
|
23465 | b = ear,
|
23466 | c = ear.next;
|
23467 |
|
23468 | if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
|
23469 |
|
23470 | // now make sure we don't have other points inside the potential ear
|
23471 | var p = ear.next.next;
|
23472 |
|
23473 | while (p !== ear.prev) {
|
23474 | if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
|
23475 | area(p.prev, p, p.next) >= 0) return false;
|
23476 | p = p.next;
|
23477 | }
|
23478 |
|
23479 | return true;
|
23480 | }
|
23481 |
|
23482 | function isEarHashed(ear, minX, minY, invSize) {
|
23483 | var a = ear.prev,
|
23484 | b = ear,
|
23485 | c = ear.next;
|
23486 |
|
23487 | if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
|
23488 |
|
23489 | // triangle bbox; min & max are calculated like this for speed
|
23490 | var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),
|
23491 | minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),
|
23492 | maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),
|
23493 | maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
|
23494 |
|
23495 | // z-order range for the current triangle bbox;
|
23496 | var minZ = zOrder(minTX, minTY, minX, minY, invSize),
|
23497 | maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);
|
23498 |
|
23499 | var p = ear.prevZ,
|
23500 | n = ear.nextZ;
|
23501 |
|
23502 | // look for points inside the triangle in both directions
|
23503 | while (p && p.z >= minZ && n && n.z <= maxZ) {
|
23504 | if (p !== ear.prev && p !== ear.next &&
|
23505 | pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
|
23506 | area(p.prev, p, p.next) >= 0) return false;
|
23507 | p = p.prevZ;
|
23508 |
|
23509 | if (n !== ear.prev && n !== ear.next &&
|
23510 | pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
|
23511 | area(n.prev, n, n.next) >= 0) return false;
|
23512 | n = n.nextZ;
|
23513 | }
|
23514 |
|
23515 | // look for remaining points in decreasing z-order
|
23516 | while (p && p.z >= minZ) {
|
23517 | if (p !== ear.prev && p !== ear.next &&
|
23518 | pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
|
23519 | area(p.prev, p, p.next) >= 0) return false;
|
23520 | p = p.prevZ;
|
23521 | }
|
23522 |
|
23523 | // look for remaining points in increasing z-order
|
23524 | while (n && n.z <= maxZ) {
|
23525 | if (n !== ear.prev && n !== ear.next &&
|
23526 | pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
|
23527 | area(n.prev, n, n.next) >= 0) return false;
|
23528 | n = n.nextZ;
|
23529 | }
|
23530 |
|
23531 | return true;
|
23532 | }
|
23533 |
|
23534 | // go through all polygon nodes and cure small local self-intersections
|
23535 | function cureLocalIntersections(start, triangles, dim) {
|
23536 | var p = start;
|
23537 | do {
|
23538 | var a = p.prev,
|
23539 | b = p.next.next;
|
23540 |
|
23541 | if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
|
23542 |
|
23543 | triangles.push(a.i / dim);
|
23544 | triangles.push(p.i / dim);
|
23545 | triangles.push(b.i / dim);
|
23546 |
|
23547 | // remove two nodes involved
|
23548 | removeNode(p);
|
23549 | removeNode(p.next);
|
23550 |
|
23551 | p = start = b;
|
23552 | }
|
23553 | p = p.next;
|
23554 | } while (p !== start);
|
23555 |
|
23556 | return filterPoints(p);
|
23557 | }
|
23558 |
|
23559 | // try splitting polygon into two and triangulate them independently
|
23560 | function splitEarcut(start, triangles, dim, minX, minY, invSize) {
|
23561 | // look for a valid diagonal that divides the polygon into two
|
23562 | var a = start;
|
23563 | do {
|
23564 | var b = a.next.next;
|
23565 | while (b !== a.prev) {
|
23566 | if (a.i !== b.i && isValidDiagonal(a, b)) {
|
23567 | // split the polygon in two by the diagonal
|
23568 | var c = splitPolygon(a, b);
|
23569 |
|
23570 | // filter colinear points around the cuts
|
23571 | a = filterPoints(a, a.next);
|
23572 | c = filterPoints(c, c.next);
|
23573 |
|
23574 | // run earcut on each half
|
23575 | earcutLinked(a, triangles, dim, minX, minY, invSize);
|
23576 | earcutLinked(c, triangles, dim, minX, minY, invSize);
|
23577 | return;
|
23578 | }
|
23579 | b = b.next;
|
23580 | }
|
23581 | a = a.next;
|
23582 | } while (a !== start);
|
23583 | }
|
23584 |
|
23585 | // link every hole into the outer loop, producing a single-ring polygon without holes
|
23586 | function eliminateHoles(data, holeIndices, outerNode, dim) {
|
23587 | var queue = [],
|
23588 | i, len, start, end, list;
|
23589 |
|
23590 | for (i = 0, len = holeIndices.length; i < len; i++) {
|
23591 | start = holeIndices[i] * dim;
|
23592 | end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
|
23593 | list = linkedList(data, start, end, dim, false);
|
23594 | if (list === list.next) list.steiner = true;
|
23595 | queue.push(getLeftmost(list));
|
23596 | }
|
23597 |
|
23598 | queue.sort(compareX);
|
23599 |
|
23600 | // process holes from left to right
|
23601 | for (i = 0; i < queue.length; i++) {
|
23602 | outerNode = eliminateHole(queue[i], outerNode);
|
23603 | outerNode = filterPoints(outerNode, outerNode.next);
|
23604 | }
|
23605 |
|
23606 | return outerNode;
|
23607 | }
|
23608 |
|
23609 | function compareX(a, b) {
|
23610 | return a.x - b.x;
|
23611 | }
|
23612 |
|
23613 | // find a bridge between vertices that connects hole with an outer ring and and link it
|
23614 | function eliminateHole(hole, outerNode) {
|
23615 | var bridge = findHoleBridge(hole, outerNode);
|
23616 | if (!bridge) {
|
23617 | return outerNode;
|
23618 | }
|
23619 |
|
23620 | var bridgeReverse = splitPolygon(bridge, hole);
|
23621 |
|
23622 | // filter collinear points around the cuts
|
23623 | var filteredBridge = filterPoints(bridge, bridge.next);
|
23624 | filterPoints(bridgeReverse, bridgeReverse.next);
|
23625 |
|
23626 | // Check if input node was removed by the filtering
|
23627 | return outerNode === bridge ? filteredBridge : outerNode;
|
23628 | }
|
23629 |
|
23630 | // David Eberly's algorithm for finding a bridge between hole and outer polygon
|
23631 | function findHoleBridge(hole, outerNode) {
|
23632 | var p = outerNode,
|
23633 | hx = hole.x,
|
23634 | hy = hole.y,
|
23635 | qx = -Infinity,
|
23636 | m;
|
23637 |
|
23638 | // find a segment intersected by a ray from the hole's leftmost point to the left;
|
23639 | // segment's endpoint with lesser x will be potential connection point
|
23640 | do {
|
23641 | if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
|
23642 | var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
|
23643 | if (x <= hx && x > qx) {
|
23644 | qx = x;
|
23645 | if (x === hx) {
|
23646 | if (hy === p.y) return p;
|
23647 | if (hy === p.next.y) return p.next;
|
23648 | }
|
23649 | m = p.x < p.next.x ? p : p.next;
|
23650 | }
|
23651 | }
|
23652 | p = p.next;
|
23653 | } while (p !== outerNode);
|
23654 |
|
23655 | if (!m) return null;
|
23656 |
|
23657 | if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint
|
23658 |
|
23659 | // look for points inside the triangle of hole point, segment intersection and endpoint;
|
23660 | // if there are no points found, we have a valid connection;
|
23661 | // otherwise choose the point of the minimum angle with the ray as connection point
|
23662 |
|
23663 | var stop = m,
|
23664 | mx = m.x,
|
23665 | my = m.y,
|
23666 | tanMin = Infinity,
|
23667 | tan;
|
23668 |
|
23669 | p = m;
|
23670 |
|
23671 | do {
|
23672 | if (hx >= p.x && p.x >= mx && hx !== p.x &&
|
23673 | pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
|
23674 |
|
23675 | tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
|
23676 |
|
23677 | if (locallyInside(p, hole) &&
|
23678 | (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {
|
23679 | m = p;
|
23680 | tanMin = tan;
|
23681 | }
|
23682 | }
|
23683 |
|
23684 | p = p.next;
|
23685 | } while (p !== stop);
|
23686 |
|
23687 | return m;
|
23688 | }
|
23689 |
|
23690 | // whether sector in vertex m contains sector in vertex p in the same coordinates
|
23691 | function sectorContainsSector(m, p) {
|
23692 | return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;
|
23693 | }
|
23694 |
|
23695 | // interlink polygon nodes in z-order
|
23696 | function indexCurve(start, minX, minY, invSize) {
|
23697 | var p = start;
|
23698 | do {
|
23699 | if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);
|
23700 | p.prevZ = p.prev;
|
23701 | p.nextZ = p.next;
|
23702 | p = p.next;
|
23703 | } while (p !== start);
|
23704 |
|
23705 | p.prevZ.nextZ = null;
|
23706 | p.prevZ = null;
|
23707 |
|
23708 | sortLinked(p);
|
23709 | }
|
23710 |
|
23711 | // Simon Tatham's linked list merge sort algorithm
|
23712 | // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
|
23713 | function sortLinked(list) {
|
23714 | var i, p, q, e, tail, numMerges, pSize, qSize,
|
23715 | inSize = 1;
|
23716 |
|
23717 | do {
|
23718 | p = list;
|
23719 | list = null;
|
23720 | tail = null;
|
23721 | numMerges = 0;
|
23722 |
|
23723 | while (p) {
|
23724 | numMerges++;
|
23725 | q = p;
|
23726 | pSize = 0;
|
23727 | for (i = 0; i < inSize; i++) {
|
23728 | pSize++;
|
23729 | q = q.nextZ;
|
23730 | if (!q) break;
|
23731 | }
|
23732 | qSize = inSize;
|
23733 |
|
23734 | while (pSize > 0 || (qSize > 0 && q)) {
|
23735 |
|
23736 | if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
|
23737 | e = p;
|
23738 | p = p.nextZ;
|
23739 | pSize--;
|
23740 | } else {
|
23741 | e = q;
|
23742 | q = q.nextZ;
|
23743 | qSize--;
|
23744 | }
|
23745 |
|
23746 | if (tail) tail.nextZ = e;
|
23747 | else list = e;
|
23748 |
|
23749 | e.prevZ = tail;
|
23750 | tail = e;
|
23751 | }
|
23752 |
|
23753 | p = q;
|
23754 | }
|
23755 |
|
23756 | tail.nextZ = null;
|
23757 | inSize *= 2;
|
23758 |
|
23759 | } while (numMerges > 1);
|
23760 |
|
23761 | return list;
|
23762 | }
|
23763 |
|
23764 | // z-order of a point given coords and inverse of the longer side of data bbox
|
23765 | function zOrder(x, y, minX, minY, invSize) {
|
23766 | // coords are transformed into non-negative 15-bit integer range
|
23767 | x = 32767 * (x - minX) * invSize;
|
23768 | y = 32767 * (y - minY) * invSize;
|
23769 |
|
23770 | x = (x | (x << 8)) & 0x00FF00FF;
|
23771 | x = (x | (x << 4)) & 0x0F0F0F0F;
|
23772 | x = (x | (x << 2)) & 0x33333333;
|
23773 | x = (x | (x << 1)) & 0x55555555;
|
23774 |
|
23775 | y = (y | (y << 8)) & 0x00FF00FF;
|
23776 | y = (y | (y << 4)) & 0x0F0F0F0F;
|
23777 | y = (y | (y << 2)) & 0x33333333;
|
23778 | y = (y | (y << 1)) & 0x55555555;
|
23779 |
|
23780 | return x | (y << 1);
|
23781 | }
|
23782 |
|
23783 | // find the leftmost node of a polygon ring
|
23784 | function getLeftmost(start) {
|
23785 | var p = start,
|
23786 | leftmost = start;
|
23787 | do {
|
23788 | if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;
|
23789 | p = p.next;
|
23790 | } while (p !== start);
|
23791 |
|
23792 | return leftmost;
|
23793 | }
|
23794 |
|
23795 | // check if a point lies within a convex triangle
|
23796 | function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
|
23797 | return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&
|
23798 | (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&
|
23799 | (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;
|
23800 | }
|
23801 |
|
23802 | // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
|
23803 | function isValidDiagonal(a, b) {
|
23804 | return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges
|
23805 | (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible
|
23806 | (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors
|
23807 | equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case
|
23808 | }
|
23809 |
|
23810 | // signed area of a triangle
|
23811 | function area(p, q, r) {
|
23812 | return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
|
23813 | }
|
23814 |
|
23815 | // check if two points are equal
|
23816 | function equals(p1, p2) {
|
23817 | return p1.x === p2.x && p1.y === p2.y;
|
23818 | }
|
23819 |
|
23820 | // check if two segments intersect
|
23821 | function intersects(p1, q1, p2, q2) {
|
23822 | var o1 = sign(area(p1, q1, p2));
|
23823 | var o2 = sign(area(p1, q1, q2));
|
23824 | var o3 = sign(area(p2, q2, p1));
|
23825 | var o4 = sign(area(p2, q2, q1));
|
23826 |
|
23827 | if (o1 !== o2 && o3 !== o4) return true; // general case
|
23828 |
|
23829 | if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1
|
23830 | if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1
|
23831 | if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2
|
23832 | if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2
|
23833 |
|
23834 | return false;
|
23835 | }
|
23836 |
|
23837 | // for collinear points p, q, r, check if point q lies on segment pr
|
23838 | function onSegment(p, q, r) {
|
23839 | return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);
|
23840 | }
|
23841 |
|
23842 | function sign(num) {
|
23843 | return num > 0 ? 1 : num < 0 ? -1 : 0;
|
23844 | }
|
23845 |
|
23846 | // check if a polygon diagonal intersects any polygon segments
|
23847 | function intersectsPolygon(a, b) {
|
23848 | var p = a;
|
23849 | do {
|
23850 | if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&
|
23851 | intersects(p, p.next, a, b)) return true;
|
23852 | p = p.next;
|
23853 | } while (p !== a);
|
23854 |
|
23855 | return false;
|
23856 | }
|
23857 |
|
23858 | // check if a polygon diagonal is locally inside the polygon
|
23859 | function locallyInside(a, b) {
|
23860 | return area(a.prev, a, a.next) < 0 ?
|
23861 | area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :
|
23862 | area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
|
23863 | }
|
23864 |
|
23865 | // check if the middle point of a polygon diagonal is inside the polygon
|
23866 | function middleInside(a, b) {
|
23867 | var p = a,
|
23868 | inside = false,
|
23869 | px = (a.x + b.x) / 2,
|
23870 | py = (a.y + b.y) / 2;
|
23871 | do {
|
23872 | if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
|
23873 | (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
|
23874 | inside = !inside;
|
23875 | p = p.next;
|
23876 | } while (p !== a);
|
23877 |
|
23878 | return inside;
|
23879 | }
|
23880 |
|
23881 | // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
|
23882 | // if one belongs to the outer ring and another to a hole, it merges it into a single ring
|
23883 | function splitPolygon(a, b) {
|
23884 | var a2 = new Node(a.i, a.x, a.y),
|
23885 | b2 = new Node(b.i, b.x, b.y),
|
23886 | an = a.next,
|
23887 | bp = b.prev;
|
23888 |
|
23889 | a.next = b;
|
23890 | b.prev = a;
|
23891 |
|
23892 | a2.next = an;
|
23893 | an.prev = a2;
|
23894 |
|
23895 | b2.next = a2;
|
23896 | a2.prev = b2;
|
23897 |
|
23898 | bp.next = b2;
|
23899 | b2.prev = bp;
|
23900 |
|
23901 | return b2;
|
23902 | }
|
23903 |
|
23904 | // create a node and optionally link it with previous one (in a circular doubly linked list)
|
23905 | function insertNode(i, x, y, last) {
|
23906 | var p = new Node(i, x, y);
|
23907 |
|
23908 | if (!last) {
|
23909 | p.prev = p;
|
23910 | p.next = p;
|
23911 |
|
23912 | } else {
|
23913 | p.next = last.next;
|
23914 | p.prev = last;
|
23915 | last.next.prev = p;
|
23916 | last.next = p;
|
23917 | }
|
23918 | return p;
|
23919 | }
|
23920 |
|
23921 | function removeNode(p) {
|
23922 | p.next.prev = p.prev;
|
23923 | p.prev.next = p.next;
|
23924 |
|
23925 | if (p.prevZ) p.prevZ.nextZ = p.nextZ;
|
23926 | if (p.nextZ) p.nextZ.prevZ = p.prevZ;
|
23927 | }
|
23928 |
|
23929 | function Node(i, x, y) {
|
23930 | // vertex index in coordinates array
|
23931 | this.i = i;
|
23932 |
|
23933 | // vertex coordinates
|
23934 | this.x = x;
|
23935 | this.y = y;
|
23936 |
|
23937 | // previous and next vertex nodes in a polygon ring
|
23938 | this.prev = null;
|
23939 | this.next = null;
|
23940 |
|
23941 | // z-order curve value
|
23942 | this.z = null;
|
23943 |
|
23944 | // previous and next nodes in z-order
|
23945 | this.prevZ = null;
|
23946 | this.nextZ = null;
|
23947 |
|
23948 | // indicates whether this is a steiner point
|
23949 | this.steiner = false;
|
23950 | }
|
23951 |
|
23952 | // return a percentage difference between the polygon area and its triangulation area;
|
23953 | // used to verify correctness of triangulation
|
23954 | earcut.deviation = function (data, holeIndices, dim, triangles) {
|
23955 | var hasHoles = holeIndices && holeIndices.length;
|
23956 | var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
|
23957 |
|
23958 | var polygonArea = Math.abs(signedArea$1(data, 0, outerLen, dim));
|
23959 | if (hasHoles) {
|
23960 | for (var i = 0, len = holeIndices.length; i < len; i++) {
|
23961 | var start = holeIndices[i] * dim;
|
23962 | var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
|
23963 | polygonArea -= Math.abs(signedArea$1(data, start, end, dim));
|
23964 | }
|
23965 | }
|
23966 |
|
23967 | var trianglesArea = 0;
|
23968 | for (i = 0; i < triangles.length; i += 3) {
|
23969 | var a = triangles[i] * dim;
|
23970 | var b = triangles[i + 1] * dim;
|
23971 | var c = triangles[i + 2] * dim;
|
23972 | trianglesArea += Math.abs(
|
23973 | (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -
|
23974 | (data[a] - data[b]) * (data[c + 1] - data[a + 1]));
|
23975 | }
|
23976 |
|
23977 | return polygonArea === 0 && trianglesArea === 0 ? 0 :
|
23978 | Math.abs((trianglesArea - polygonArea) / polygonArea);
|
23979 | };
|
23980 |
|
23981 | function signedArea$1(data, start, end, dim) {
|
23982 | var sum = 0;
|
23983 | for (var i = start, j = end - dim; i < end; i += dim) {
|
23984 | sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
|
23985 | j = i;
|
23986 | }
|
23987 | return sum;
|
23988 | }
|
23989 |
|
23990 | // turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts
|
23991 | earcut.flatten = function (data) {
|
23992 | var dim = data[0][0].length,
|
23993 | result = {vertices: [], holes: [], dimensions: dim},
|
23994 | holeIndex = 0;
|
23995 |
|
23996 | for (var i = 0; i < data.length; i++) {
|
23997 | for (var j = 0; j < data[i].length; j++) {
|
23998 | for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);
|
23999 | }
|
24000 | if (i > 0) {
|
24001 | holeIndex += data[i - 1].length;
|
24002 | result.holes.push(holeIndex);
|
24003 | }
|
24004 | }
|
24005 | return result;
|
24006 | };
|
24007 |
|
24008 | var earcut$1 = earcut$2.exports;
|
24009 |
|
24010 | function quickselect(arr, k, left, right, compare) {
|
24011 | quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare$1);
|
24012 | }
|
24013 |
|
24014 | function quickselectStep(arr, k, left, right, compare) {
|
24015 |
|
24016 | while (right > left) {
|
24017 | if (right - left > 600) {
|
24018 | var n = right - left + 1;
|
24019 | var m = k - left + 1;
|
24020 | var z = Math.log(n);
|
24021 | var s = 0.5 * Math.exp(2 * z / 3);
|
24022 | var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
|
24023 | var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
|
24024 | var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
|
24025 | quickselectStep(arr, k, newLeft, newRight, compare);
|
24026 | }
|
24027 |
|
24028 | var t = arr[k];
|
24029 | var i = left;
|
24030 | var j = right;
|
24031 |
|
24032 | swap(arr, left, k);
|
24033 | if (compare(arr[right], t) > 0) swap(arr, left, right);
|
24034 |
|
24035 | while (i < j) {
|
24036 | swap(arr, i, j);
|
24037 | i++;
|
24038 | j--;
|
24039 | while (compare(arr[i], t) < 0) i++;
|
24040 | while (compare(arr[j], t) > 0) j--;
|
24041 | }
|
24042 |
|
24043 | if (compare(arr[left], t) === 0) swap(arr, left, j);
|
24044 | else {
|
24045 | j++;
|
24046 | swap(arr, j, right);
|
24047 | }
|
24048 |
|
24049 | if (j <= k) left = j + 1;
|
24050 | if (k <= j) right = j - 1;
|
24051 | }
|
24052 | }
|
24053 |
|
24054 | function swap(arr, i, j) {
|
24055 | var tmp = arr[i];
|
24056 | arr[i] = arr[j];
|
24057 | arr[j] = tmp;
|
24058 | }
|
24059 |
|
24060 | function defaultCompare$1(a, b) {
|
24061 | return a < b ? -1 : a > b ? 1 : 0;
|
24062 | }
|
24063 |
|
24064 | // classifies an array of rings into polygons with outer rings and holes
|
24065 | function classifyRings$1(rings, maxRings) {
|
24066 | const len = rings.length;
|
24067 | if (len <= 1)
|
24068 | return [rings];
|
24069 | const polygons = [];
|
24070 | let polygon, ccw;
|
24071 | for (let i = 0; i < len; i++) {
|
24072 | const area = calculateSignedArea(rings[i]);
|
24073 | if (area === 0)
|
24074 | continue;
|
24075 | rings[i].area = Math.abs(area);
|
24076 | if (ccw === undefined)
|
24077 | ccw = area < 0;
|
24078 | if (ccw === area < 0) {
|
24079 | if (polygon)
|
24080 | polygons.push(polygon);
|
24081 | polygon = [rings[i]];
|
24082 | }
|
24083 | else {
|
24084 | polygon.push(rings[i]);
|
24085 | }
|
24086 | }
|
24087 | if (polygon)
|
24088 | polygons.push(polygon);
|
24089 | // Earcut performance degrades with the # of rings in a polygon. For this
|
24090 | // reason, we limit strip out all but the `maxRings` largest rings.
|
24091 | if (maxRings > 1) {
|
24092 | for (let j = 0; j < polygons.length; j++) {
|
24093 | if (polygons[j].length <= maxRings)
|
24094 | continue;
|
24095 | quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas);
|
24096 | polygons[j] = polygons[j].slice(0, maxRings);
|
24097 | }
|
24098 | }
|
24099 | return polygons;
|
24100 | }
|
24101 | function compareAreas(a, b) {
|
24102 | return b.area - a.area;
|
24103 | }
|
24104 |
|
24105 | function hasPattern(type, layers, options) {
|
24106 | const patterns = options.patternDependencies;
|
24107 | let hasPattern = false;
|
24108 | for (const layer of layers) {
|
24109 | const patternProperty = layer.paint.get(`${type}-pattern`);
|
24110 | if (!patternProperty.isConstant()) {
|
24111 | hasPattern = true;
|
24112 | }
|
24113 | const constantPattern = patternProperty.constantOr(null);
|
24114 | if (constantPattern) {
|
24115 | hasPattern = true;
|
24116 | patterns[constantPattern.to] = true;
|
24117 | patterns[constantPattern.from] = true;
|
24118 | }
|
24119 | }
|
24120 | return hasPattern;
|
24121 | }
|
24122 | function addPatternDependencies(type, layers, patternFeature, zoom, options) {
|
24123 | const patterns = options.patternDependencies;
|
24124 | for (const layer of layers) {
|
24125 | const patternProperty = layer.paint.get(`${type}-pattern`);
|
24126 | const patternPropertyValue = patternProperty.value;
|
24127 | if (patternPropertyValue.kind !== 'constant') {
|
24128 | let min = patternPropertyValue.evaluate({ zoom: zoom - 1 }, patternFeature, {}, options.availableImages);
|
24129 | let mid = patternPropertyValue.evaluate({ zoom }, patternFeature, {}, options.availableImages);
|
24130 | let max = patternPropertyValue.evaluate({ zoom: zoom + 1 }, patternFeature, {}, options.availableImages);
|
24131 | min = min && min.name ? min.name : min;
|
24132 | mid = mid && mid.name ? mid.name : mid;
|
24133 | max = max && max.name ? max.name : max;
|
24134 | // add to patternDependencies
|
24135 | patterns[min] = true;
|
24136 | patterns[mid] = true;
|
24137 | patterns[max] = true;
|
24138 | // save for layout
|
24139 | patternFeature.patterns[layer.id] = { min, mid, max };
|
24140 | }
|
24141 | }
|
24142 | return patternFeature;
|
24143 | }
|
24144 |
|
24145 | const EARCUT_MAX_RINGS$1 = 500;
|
24146 | class FillBucket {
|
24147 | constructor(options) {
|
24148 | this.zoom = options.zoom;
|
24149 | this.overscaling = options.overscaling;
|
24150 | this.layers = options.layers;
|
24151 | this.layerIds = this.layers.map(layer => layer.id);
|
24152 | this.index = options.index;
|
24153 | this.hasPattern = false;
|
24154 | this.patternFeatures = [];
|
24155 | this.layoutVertexArray = new FillLayoutArray();
|
24156 | this.indexArray = new TriangleIndexArray();
|
24157 | this.indexArray2 = new LineIndexArray();
|
24158 | this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom);
|
24159 | this.segments = new SegmentVector();
|
24160 | this.segments2 = new SegmentVector();
|
24161 | this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);
|
24162 | }
|
24163 | populate(features, options, canonical) {
|
24164 | this.hasPattern = hasPattern('fill', this.layers, options);
|
24165 | const fillSortKey = this.layers[0].layout.get('fill-sort-key');
|
24166 | const sortFeaturesByKey = !fillSortKey.isConstant();
|
24167 | const bucketFeatures = [];
|
24168 | for (const { feature, id, index, sourceLayerIndex } of features) {
|
24169 | const needGeometry = this.layers[0]._featureFilter.needGeometry;
|
24170 | const evaluationFeature = toEvaluationFeature(feature, needGeometry);
|
24171 | if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical))
|
24172 | continue;
|
24173 | const sortKey = sortFeaturesByKey ?
|
24174 | fillSortKey.evaluate(evaluationFeature, {}, canonical, options.availableImages) :
|
24175 | undefined;
|
24176 | const bucketFeature = {
|
24177 | id,
|
24178 | properties: feature.properties,
|
24179 | type: feature.type,
|
24180 | sourceLayerIndex,
|
24181 | index,
|
24182 | geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature),
|
24183 | patterns: {},
|
24184 | sortKey
|
24185 | };
|
24186 | bucketFeatures.push(bucketFeature);
|
24187 | }
|
24188 | if (sortFeaturesByKey) {
|
24189 | bucketFeatures.sort((a, b) => a.sortKey - b.sortKey);
|
24190 | }
|
24191 | for (const bucketFeature of bucketFeatures) {
|
24192 | const { geometry, index, sourceLayerIndex } = bucketFeature;
|
24193 | if (this.hasPattern) {
|
24194 | const patternFeature = addPatternDependencies('fill', this.layers, bucketFeature, this.zoom, options);
|
24195 | // pattern features are added only once the pattern is loaded into the image atlas
|
24196 | // so are stored during populate until later updated with positions by tile worker in addFeatures
|
24197 | this.patternFeatures.push(patternFeature);
|
24198 | }
|
24199 | else {
|
24200 | this.addFeature(bucketFeature, geometry, index, canonical, {});
|
24201 | }
|
24202 | const feature = features[index].feature;
|
24203 | options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index);
|
24204 | }
|
24205 | }
|
24206 | update(states, vtLayer, imagePositions) {
|
24207 | if (!this.stateDependentLayers.length)
|
24208 | return;
|
24209 | this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions);
|
24210 | }
|
24211 | addFeatures(options, canonical, imagePositions) {
|
24212 | for (const feature of this.patternFeatures) {
|
24213 | this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions);
|
24214 | }
|
24215 | }
|
24216 | isEmpty() {
|
24217 | return this.layoutVertexArray.length === 0;
|
24218 | }
|
24219 | uploadPending() {
|
24220 | return !this.uploaded || this.programConfigurations.needsUpload;
|
24221 | }
|
24222 | upload(context) {
|
24223 | if (!this.uploaded) {
|
24224 | this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$3);
|
24225 | this.indexBuffer = context.createIndexBuffer(this.indexArray);
|
24226 | this.indexBuffer2 = context.createIndexBuffer(this.indexArray2);
|
24227 | }
|
24228 | this.programConfigurations.upload(context);
|
24229 | this.uploaded = true;
|
24230 | }
|
24231 | destroy() {
|
24232 | if (!this.layoutVertexBuffer)
|
24233 | return;
|
24234 | this.layoutVertexBuffer.destroy();
|
24235 | this.indexBuffer.destroy();
|
24236 | this.indexBuffer2.destroy();
|
24237 | this.programConfigurations.destroy();
|
24238 | this.segments.destroy();
|
24239 | this.segments2.destroy();
|
24240 | }
|
24241 | addFeature(feature, geometry, index, canonical, imagePositions) {
|
24242 | for (const polygon of classifyRings$1(geometry, EARCUT_MAX_RINGS$1)) {
|
24243 | let numVertices = 0;
|
24244 | for (const ring of polygon) {
|
24245 | numVertices += ring.length;
|
24246 | }
|
24247 | const triangleSegment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray);
|
24248 | const triangleIndex = triangleSegment.vertexLength;
|
24249 | const flattened = [];
|
24250 | const holeIndices = [];
|
24251 | for (const ring of polygon) {
|
24252 | if (ring.length === 0) {
|
24253 | continue;
|
24254 | }
|
24255 | if (ring !== polygon[0]) {
|
24256 | holeIndices.push(flattened.length / 2);
|
24257 | }
|
24258 | const lineSegment = this.segments2.prepareSegment(ring.length, this.layoutVertexArray, this.indexArray2);
|
24259 | const lineIndex = lineSegment.vertexLength;
|
24260 | this.layoutVertexArray.emplaceBack(ring[0].x, ring[0].y);
|
24261 | this.indexArray2.emplaceBack(lineIndex + ring.length - 1, lineIndex);
|
24262 | flattened.push(ring[0].x);
|
24263 | flattened.push(ring[0].y);
|
24264 | for (let i = 1; i < ring.length; i++) {
|
24265 | this.layoutVertexArray.emplaceBack(ring[i].x, ring[i].y);
|
24266 | this.indexArray2.emplaceBack(lineIndex + i - 1, lineIndex + i);
|
24267 | flattened.push(ring[i].x);
|
24268 | flattened.push(ring[i].y);
|
24269 | }
|
24270 | lineSegment.vertexLength += ring.length;
|
24271 | lineSegment.primitiveLength += ring.length;
|
24272 | }
|
24273 | const indices = earcut$1(flattened, holeIndices);
|
24274 | assert$1(indices.length % 3 === 0);
|
24275 | for (let i = 0; i < indices.length; i += 3) {
|
24276 | this.indexArray.emplaceBack(triangleIndex + indices[i], triangleIndex + indices[i + 1], triangleIndex + indices[i + 2]);
|
24277 | }
|
24278 | triangleSegment.vertexLength += numVertices;
|
24279 | triangleSegment.primitiveLength += indices.length / 3;
|
24280 | }
|
24281 | this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical);
|
24282 | }
|
24283 | }
|
24284 | register('FillBucket', FillBucket, { omit: ['layers', 'patternFeatures'] });
|
24285 |
|
24286 | // This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
|
24287 | const layout$3 = new Properties({
|
24288 | "fill-sort-key": new DataDrivenProperty(spec["layout_fill"]["fill-sort-key"]),
|
24289 | });
|
24290 | const paint$5 = new Properties({
|
24291 | "fill-antialias": new DataConstantProperty(spec["paint_fill"]["fill-antialias"]),
|
24292 | "fill-opacity": new DataDrivenProperty(spec["paint_fill"]["fill-opacity"]),
|
24293 | "fill-color": new DataDrivenProperty(spec["paint_fill"]["fill-color"]),
|
24294 | "fill-outline-color": new DataDrivenProperty(spec["paint_fill"]["fill-outline-color"]),
|
24295 | "fill-translate": new DataConstantProperty(spec["paint_fill"]["fill-translate"]),
|
24296 | "fill-translate-anchor": new DataConstantProperty(spec["paint_fill"]["fill-translate-anchor"]),
|
24297 | "fill-pattern": new CrossFadedDataDrivenProperty(spec["paint_fill"]["fill-pattern"]),
|
24298 | });
|
24299 | var properties$5 = { paint: paint$5, layout: layout$3 };
|
24300 |
|
24301 | class FillStyleLayer extends StyleLayer {
|
24302 | constructor(layer) {
|
24303 | super(layer, properties$5);
|
24304 | }
|
24305 | recalculate(parameters, availableImages) {
|
24306 | super.recalculate(parameters, availableImages);
|
24307 | const outlineColor = this.paint._values['fill-outline-color'];
|
24308 | if (outlineColor.value.kind === 'constant' && outlineColor.value.value === undefined) {
|
24309 | this.paint._values['fill-outline-color'] = this.paint._values['fill-color'];
|
24310 | }
|
24311 | }
|
24312 | createBucket(parameters) {
|
24313 | return new FillBucket(parameters);
|
24314 | }
|
24315 | queryRadius() {
|
24316 | return translateDistance(this.paint.get('fill-translate'));
|
24317 | }
|
24318 | queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform, pixelsToTileUnits) {
|
24319 | const translatedPolygon = translate$4(queryGeometry, this.paint.get('fill-translate'), this.paint.get('fill-translate-anchor'), transform.angle, pixelsToTileUnits);
|
24320 | return polygonIntersectsMultiPolygon(translatedPolygon, geometry);
|
24321 | }
|
24322 | isTileClipped() {
|
24323 | return true;
|
24324 | }
|
24325 | }
|
24326 |
|
24327 | const layout$2 = createLayout([
|
24328 | { name: 'a_pos', components: 2, type: 'Int16' },
|
24329 | { name: 'a_normal_ed', components: 4, type: 'Int16' },
|
24330 | ], 4);
|
24331 | const { members: members$2, size: size$2, alignment: alignment$2 } = layout$2;
|
24332 |
|
24333 | var vectorTile = {};
|
24334 |
|
24335 | ;
|
24336 |
|
24337 | var Point = pointGeometry;
|
24338 |
|
24339 | var vectortilefeature = VectorTileFeature$2;
|
24340 |
|
24341 | function VectorTileFeature$2(pbf, end, extent, keys, values) {
|
24342 | // Public
|
24343 | this.properties = {};
|
24344 | this.extent = extent;
|
24345 | this.type = 0;
|
24346 |
|
24347 | // Private
|
24348 | this._pbf = pbf;
|
24349 | this._geometry = -1;
|
24350 | this._keys = keys;
|
24351 | this._values = values;
|
24352 |
|
24353 | pbf.readFields(readFeature, this, end);
|
24354 | }
|
24355 |
|
24356 | function readFeature(tag, feature, pbf) {
|
24357 | if (tag == 1) feature.id = pbf.readVarint();
|
24358 | else if (tag == 2) readTag(pbf, feature);
|
24359 | else if (tag == 3) feature.type = pbf.readVarint();
|
24360 | else if (tag == 4) feature._geometry = pbf.pos;
|
24361 | }
|
24362 |
|
24363 | function readTag(pbf, feature) {
|
24364 | var end = pbf.readVarint() + pbf.pos;
|
24365 |
|
24366 | while (pbf.pos < end) {
|
24367 | var key = feature._keys[pbf.readVarint()],
|
24368 | value = feature._values[pbf.readVarint()];
|
24369 | feature.properties[key] = value;
|
24370 | }
|
24371 | }
|
24372 |
|
24373 | VectorTileFeature$2.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
|
24374 |
|
24375 | VectorTileFeature$2.prototype.loadGeometry = function() {
|
24376 | var pbf = this._pbf;
|
24377 | pbf.pos = this._geometry;
|
24378 |
|
24379 | var end = pbf.readVarint() + pbf.pos,
|
24380 | cmd = 1,
|
24381 | length = 0,
|
24382 | x = 0,
|
24383 | y = 0,
|
24384 | lines = [],
|
24385 | line;
|
24386 |
|
24387 | while (pbf.pos < end) {
|
24388 | if (length <= 0) {
|
24389 | var cmdLen = pbf.readVarint();
|
24390 | cmd = cmdLen & 0x7;
|
24391 | length = cmdLen >> 3;
|
24392 | }
|
24393 |
|
24394 | length--;
|
24395 |
|
24396 | if (cmd === 1 || cmd === 2) {
|
24397 | x += pbf.readSVarint();
|
24398 | y += pbf.readSVarint();
|
24399 |
|
24400 | if (cmd === 1) { // moveTo
|
24401 | if (line) lines.push(line);
|
24402 | line = [];
|
24403 | }
|
24404 |
|
24405 | line.push(new Point(x, y));
|
24406 |
|
24407 | } else if (cmd === 7) {
|
24408 |
|
24409 | // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
|
24410 | if (line) {
|
24411 | line.push(line[0].clone()); // closePolygon
|
24412 | }
|
24413 |
|
24414 | } else {
|
24415 | throw new Error('unknown command ' + cmd);
|
24416 | }
|
24417 | }
|
24418 |
|
24419 | if (line) lines.push(line);
|
24420 |
|
24421 | return lines;
|
24422 | };
|
24423 |
|
24424 | VectorTileFeature$2.prototype.bbox = function() {
|
24425 | var pbf = this._pbf;
|
24426 | pbf.pos = this._geometry;
|
24427 |
|
24428 | var end = pbf.readVarint() + pbf.pos,
|
24429 | cmd = 1,
|
24430 | length = 0,
|
24431 | x = 0,
|
24432 | y = 0,
|
24433 | x1 = Infinity,
|
24434 | x2 = -Infinity,
|
24435 | y1 = Infinity,
|
24436 | y2 = -Infinity;
|
24437 |
|
24438 | while (pbf.pos < end) {
|
24439 | if (length <= 0) {
|
24440 | var cmdLen = pbf.readVarint();
|
24441 | cmd = cmdLen & 0x7;
|
24442 | length = cmdLen >> 3;
|
24443 | }
|
24444 |
|
24445 | length--;
|
24446 |
|
24447 | if (cmd === 1 || cmd === 2) {
|
24448 | x += pbf.readSVarint();
|
24449 | y += pbf.readSVarint();
|
24450 | if (x < x1) x1 = x;
|
24451 | if (x > x2) x2 = x;
|
24452 | if (y < y1) y1 = y;
|
24453 | if (y > y2) y2 = y;
|
24454 |
|
24455 | } else if (cmd !== 7) {
|
24456 | throw new Error('unknown command ' + cmd);
|
24457 | }
|
24458 | }
|
24459 |
|
24460 | return [x1, y1, x2, y2];
|
24461 | };
|
24462 |
|
24463 | VectorTileFeature$2.prototype.toGeoJSON = function(x, y, z) {
|
24464 | var size = this.extent * Math.pow(2, z),
|
24465 | x0 = this.extent * x,
|
24466 | y0 = this.extent * y,
|
24467 | coords = this.loadGeometry(),
|
24468 | type = VectorTileFeature$2.types[this.type],
|
24469 | i, j;
|
24470 |
|
24471 | function project(line) {
|
24472 | for (var j = 0; j < line.length; j++) {
|
24473 | var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
|
24474 | line[j] = [
|
24475 | (p.x + x0) * 360 / size - 180,
|
24476 | 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
|
24477 | ];
|
24478 | }
|
24479 | }
|
24480 |
|
24481 | switch (this.type) {
|
24482 | case 1:
|
24483 | var points = [];
|
24484 | for (i = 0; i < coords.length; i++) {
|
24485 | points[i] = coords[i][0];
|
24486 | }
|
24487 | coords = points;
|
24488 | project(coords);
|
24489 | break;
|
24490 |
|
24491 | case 2:
|
24492 | for (i = 0; i < coords.length; i++) {
|
24493 | project(coords[i]);
|
24494 | }
|
24495 | break;
|
24496 |
|
24497 | case 3:
|
24498 | coords = classifyRings(coords);
|
24499 | for (i = 0; i < coords.length; i++) {
|
24500 | for (j = 0; j < coords[i].length; j++) {
|
24501 | project(coords[i][j]);
|
24502 | }
|
24503 | }
|
24504 | break;
|
24505 | }
|
24506 |
|
24507 | if (coords.length === 1) {
|
24508 | coords = coords[0];
|
24509 | } else {
|
24510 | type = 'Multi' + type;
|
24511 | }
|
24512 |
|
24513 | var result = {
|
24514 | type: "Feature",
|
24515 | geometry: {
|
24516 | type: type,
|
24517 | coordinates: coords
|
24518 | },
|
24519 | properties: this.properties
|
24520 | };
|
24521 |
|
24522 | if ('id' in this) {
|
24523 | result.id = this.id;
|
24524 | }
|
24525 |
|
24526 | return result;
|
24527 | };
|
24528 |
|
24529 | // classifies an array of rings into polygons with outer rings and holes
|
24530 |
|
24531 | function classifyRings(rings) {
|
24532 | var len = rings.length;
|
24533 |
|
24534 | if (len <= 1) return [rings];
|
24535 |
|
24536 | var polygons = [],
|
24537 | polygon,
|
24538 | ccw;
|
24539 |
|
24540 | for (var i = 0; i < len; i++) {
|
24541 | var area = signedArea(rings[i]);
|
24542 | if (area === 0) continue;
|
24543 |
|
24544 | if (ccw === undefined) ccw = area < 0;
|
24545 |
|
24546 | if (ccw === area < 0) {
|
24547 | if (polygon) polygons.push(polygon);
|
24548 | polygon = [rings[i]];
|
24549 |
|
24550 | } else {
|
24551 | polygon.push(rings[i]);
|
24552 | }
|
24553 | }
|
24554 | if (polygon) polygons.push(polygon);
|
24555 |
|
24556 | return polygons;
|
24557 | }
|
24558 |
|
24559 | function signedArea(ring) {
|
24560 | var sum = 0;
|
24561 | for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
|
24562 | p1 = ring[i];
|
24563 | p2 = ring[j];
|
24564 | sum += (p2.x - p1.x) * (p1.y + p2.y);
|
24565 | }
|
24566 | return sum;
|
24567 | }
|
24568 |
|
24569 | ;
|
24570 |
|
24571 | var VectorTileFeature$1 = vectortilefeature;
|
24572 |
|
24573 | var vectortilelayer = VectorTileLayer$2;
|
24574 |
|
24575 | function VectorTileLayer$2(pbf, end) {
|
24576 | // Public
|
24577 | this.version = 1;
|
24578 | this.name = null;
|
24579 | this.extent = 4096;
|
24580 | this.length = 0;
|
24581 |
|
24582 | // Private
|
24583 | this._pbf = pbf;
|
24584 | this._keys = [];
|
24585 | this._values = [];
|
24586 | this._features = [];
|
24587 |
|
24588 | pbf.readFields(readLayer, this, end);
|
24589 |
|
24590 | this.length = this._features.length;
|
24591 | }
|
24592 |
|
24593 | function readLayer(tag, layer, pbf) {
|
24594 | if (tag === 15) layer.version = pbf.readVarint();
|
24595 | else if (tag === 1) layer.name = pbf.readString();
|
24596 | else if (tag === 5) layer.extent = pbf.readVarint();
|
24597 | else if (tag === 2) layer._features.push(pbf.pos);
|
24598 | else if (tag === 3) layer._keys.push(pbf.readString());
|
24599 | else if (tag === 4) layer._values.push(readValueMessage(pbf));
|
24600 | }
|
24601 |
|
24602 | function readValueMessage(pbf) {
|
24603 | var value = null,
|
24604 | end = pbf.readVarint() + pbf.pos;
|
24605 |
|
24606 | while (pbf.pos < end) {
|
24607 | var tag = pbf.readVarint() >> 3;
|
24608 |
|
24609 | value = tag === 1 ? pbf.readString() :
|
24610 | tag === 2 ? pbf.readFloat() :
|
24611 | tag === 3 ? pbf.readDouble() :
|
24612 | tag === 4 ? pbf.readVarint64() :
|
24613 | tag === 5 ? pbf.readVarint() :
|
24614 | tag === 6 ? pbf.readSVarint() :
|
24615 | tag === 7 ? pbf.readBoolean() : null;
|
24616 | }
|
24617 |
|
24618 | return value;
|
24619 | }
|
24620 |
|
24621 | // return feature `i` from this layer as a `VectorTileFeature`
|
24622 | VectorTileLayer$2.prototype.feature = function(i) {
|
24623 | if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
|
24624 |
|
24625 | this._pbf.pos = this._features[i];
|
24626 |
|
24627 | var end = this._pbf.readVarint() + this._pbf.pos;
|
24628 | return new VectorTileFeature$1(this._pbf, end, this.extent, this._keys, this._values);
|
24629 | };
|
24630 |
|
24631 | ;
|
24632 |
|
24633 | var VectorTileLayer$1 = vectortilelayer;
|
24634 |
|
24635 | var vectortile = VectorTile$1;
|
24636 |
|
24637 | function VectorTile$1(pbf, end) {
|
24638 | this.layers = pbf.readFields(readTile, {}, end);
|
24639 | }
|
24640 |
|
24641 | function readTile(tag, layers, pbf) {
|
24642 | if (tag === 3) {
|
24643 | var layer = new VectorTileLayer$1(pbf, pbf.readVarint() + pbf.pos);
|
24644 | if (layer.length) layers[layer.name] = layer;
|
24645 | }
|
24646 | }
|
24647 |
|
24648 | var VectorTile = vectorTile.VectorTile = vectortile;
|
24649 | var VectorTileFeature = vectorTile.VectorTileFeature = vectortilefeature;
|
24650 | var VectorTileLayer = vectorTile.VectorTileLayer = vectortilelayer;
|
24651 |
|
24652 | const vectorTileFeatureTypes$2 = vectorTile.VectorTileFeature.types;
|
24653 | const EARCUT_MAX_RINGS = 500;
|
24654 | const FACTOR = Math.pow(2, 13);
|
24655 | function addVertex$1(vertexArray, x, y, nx, ny, nz, t, e) {
|
24656 | vertexArray.emplaceBack(
|
24657 | // a_pos
|
24658 | x, y,
|
24659 | // a_normal_ed: 3-component normal and 1-component edgedistance
|
24660 | Math.floor(nx * FACTOR) * 2 + t, ny * FACTOR * 2, nz * FACTOR * 2,
|
24661 | // edgedistance (used for wrapping patterns around extrusion sides)
|
24662 | Math.round(e));
|
24663 | }
|
24664 | class FillExtrusionBucket {
|
24665 | constructor(options) {
|
24666 | this.zoom = options.zoom;
|
24667 | this.overscaling = options.overscaling;
|
24668 | this.layers = options.layers;
|
24669 | this.layerIds = this.layers.map(layer => layer.id);
|
24670 | this.index = options.index;
|
24671 | this.hasPattern = false;
|
24672 | this.layoutVertexArray = new FillExtrusionLayoutArray();
|
24673 | this.indexArray = new TriangleIndexArray();
|
24674 | this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom);
|
24675 | this.segments = new SegmentVector();
|
24676 | this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);
|
24677 | }
|
24678 | populate(features, options, canonical) {
|
24679 | this.features = [];
|
24680 | this.hasPattern = hasPattern('fill-extrusion', this.layers, options);
|
24681 | for (const { feature, id, index, sourceLayerIndex } of features) {
|
24682 | const needGeometry = this.layers[0]._featureFilter.needGeometry;
|
24683 | const evaluationFeature = toEvaluationFeature(feature, needGeometry);
|
24684 | if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical))
|
24685 | continue;
|
24686 | const bucketFeature = {
|
24687 | id,
|
24688 | sourceLayerIndex,
|
24689 | index,
|
24690 | geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature),
|
24691 | properties: feature.properties,
|
24692 | type: feature.type,
|
24693 | patterns: {}
|
24694 | };
|
24695 | if (this.hasPattern) {
|
24696 | this.features.push(addPatternDependencies('fill-extrusion', this.layers, bucketFeature, this.zoom, options));
|
24697 | }
|
24698 | else {
|
24699 | this.addFeature(bucketFeature, bucketFeature.geometry, index, canonical, {});
|
24700 | }
|
24701 | options.featureIndex.insert(feature, bucketFeature.geometry, index, sourceLayerIndex, this.index, true);
|
24702 | }
|
24703 | }
|
24704 | addFeatures(options, canonical, imagePositions) {
|
24705 | for (const feature of this.features) {
|
24706 | const { geometry } = feature;
|
24707 | this.addFeature(feature, geometry, feature.index, canonical, imagePositions);
|
24708 | }
|
24709 | }
|
24710 | update(states, vtLayer, imagePositions) {
|
24711 | if (!this.stateDependentLayers.length)
|
24712 | return;
|
24713 | this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions);
|
24714 | }
|
24715 | isEmpty() {
|
24716 | return this.layoutVertexArray.length === 0;
|
24717 | }
|
24718 | uploadPending() {
|
24719 | return !this.uploaded || this.programConfigurations.needsUpload;
|
24720 | }
|
24721 | upload(context) {
|
24722 | if (!this.uploaded) {
|
24723 | this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$2);
|
24724 | this.indexBuffer = context.createIndexBuffer(this.indexArray);
|
24725 | }
|
24726 | this.programConfigurations.upload(context);
|
24727 | this.uploaded = true;
|
24728 | }
|
24729 | destroy() {
|
24730 | if (!this.layoutVertexBuffer)
|
24731 | return;
|
24732 | this.layoutVertexBuffer.destroy();
|
24733 | this.indexBuffer.destroy();
|
24734 | this.programConfigurations.destroy();
|
24735 | this.segments.destroy();
|
24736 | }
|
24737 | addFeature(feature, geometry, index, canonical, imagePositions) {
|
24738 | for (const polygon of classifyRings$1(geometry, EARCUT_MAX_RINGS)) {
|
24739 | let numVertices = 0;
|
24740 | for (const ring of polygon) {
|
24741 | numVertices += ring.length;
|
24742 | }
|
24743 | let segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray);
|
24744 | for (const ring of polygon) {
|
24745 | if (ring.length === 0) {
|
24746 | continue;
|
24747 | }
|
24748 | if (isEntirelyOutside(ring)) {
|
24749 | continue;
|
24750 | }
|
24751 | let edgeDistance = 0;
|
24752 | for (let p = 0; p < ring.length; p++) {
|
24753 | const p1 = ring[p];
|
24754 | if (p >= 1) {
|
24755 | const p2 = ring[p - 1];
|
24756 | if (!isBoundaryEdge(p1, p2)) {
|
24757 | if (segment.vertexLength + 4 > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) {
|
24758 | segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray);
|
24759 | }
|
24760 | const perp = p1.sub(p2)._perp()._unit();
|
24761 | const dist = p2.dist(p1);
|
24762 | if (edgeDistance + dist > 32768)
|
24763 | edgeDistance = 0;
|
24764 | addVertex$1(this.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 0, edgeDistance);
|
24765 | addVertex$1(this.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 1, edgeDistance);
|
24766 | edgeDistance += dist;
|
24767 | addVertex$1(this.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 0, edgeDistance);
|
24768 | addVertex$1(this.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 1, edgeDistance);
|
24769 | const bottomRight = segment.vertexLength;
|
24770 | // ┌──────┐
|
24771 | // │ 0 1 │ Counter-clockwise winding order.
|
24772 | // │ │ Triangle 1: 0 => 2 => 1
|
24773 | // │ 2 3 │ Triangle 2: 1 => 2 => 3
|
24774 | // └──────┘
|
24775 | this.indexArray.emplaceBack(bottomRight, bottomRight + 2, bottomRight + 1);
|
24776 | this.indexArray.emplaceBack(bottomRight + 1, bottomRight + 2, bottomRight + 3);
|
24777 | segment.vertexLength += 4;
|
24778 | segment.primitiveLength += 2;
|
24779 | }
|
24780 | }
|
24781 | }
|
24782 | }
|
24783 | if (segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) {
|
24784 | segment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray);
|
24785 | }
|
24786 | //Only triangulate and draw the area of the feature if it is a polygon
|
24787 | //Other feature types (e.g. LineString) do not have area, so triangulation is pointless / undefined
|
24788 | if (vectorTileFeatureTypes$2[feature.type] !== 'Polygon')
|
24789 | continue;
|
24790 | const flattened = [];
|
24791 | const holeIndices = [];
|
24792 | const triangleIndex = segment.vertexLength;
|
24793 | for (const ring of polygon) {
|
24794 | if (ring.length === 0) {
|
24795 | continue;
|
24796 | }
|
24797 | if (ring !== polygon[0]) {
|
24798 | holeIndices.push(flattened.length / 2);
|
24799 | }
|
24800 | for (let i = 0; i < ring.length; i++) {
|
24801 | const p = ring[i];
|
24802 | addVertex$1(this.layoutVertexArray, p.x, p.y, 0, 0, 1, 1, 0);
|
24803 | flattened.push(p.x);
|
24804 | flattened.push(p.y);
|
24805 | }
|
24806 | }
|
24807 | const indices = earcut$1(flattened, holeIndices);
|
24808 | assert$1(indices.length % 3 === 0);
|
24809 | for (let j = 0; j < indices.length; j += 3) {
|
24810 | // Counter-clockwise winding order.
|
24811 | this.indexArray.emplaceBack(triangleIndex + indices[j], triangleIndex + indices[j + 2], triangleIndex + indices[j + 1]);
|
24812 | }
|
24813 | segment.primitiveLength += indices.length / 3;
|
24814 | segment.vertexLength += numVertices;
|
24815 | }
|
24816 | this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical);
|
24817 | }
|
24818 | }
|
24819 | register('FillExtrusionBucket', FillExtrusionBucket, { omit: ['layers', 'features'] });
|
24820 | function isBoundaryEdge(p1, p2) {
|
24821 | return (p1.x === p2.x && (p1.x < 0 || p1.x > EXTENT)) ||
|
24822 | (p1.y === p2.y && (p1.y < 0 || p1.y > EXTENT));
|
24823 | }
|
24824 | function isEntirelyOutside(ring) {
|
24825 | return ring.every(p => p.x < 0) ||
|
24826 | ring.every(p => p.x > EXTENT) ||
|
24827 | ring.every(p => p.y < 0) ||
|
24828 | ring.every(p => p.y > EXTENT);
|
24829 | }
|
24830 |
|
24831 | // This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
|
24832 | const paint$4 = new Properties({
|
24833 | "fill-extrusion-opacity": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-opacity"]),
|
24834 | "fill-extrusion-color": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-color"]),
|
24835 | "fill-extrusion-translate": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-translate"]),
|
24836 | "fill-extrusion-translate-anchor": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-translate-anchor"]),
|
24837 | "fill-extrusion-pattern": new CrossFadedDataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-pattern"]),
|
24838 | "fill-extrusion-height": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-height"]),
|
24839 | "fill-extrusion-base": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-base"]),
|
24840 | "fill-extrusion-vertical-gradient": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-vertical-gradient"]),
|
24841 | });
|
24842 | var properties$4 = { paint: paint$4 };
|
24843 |
|
24844 | class Point3D extends pointGeometry {
|
24845 | }
|
24846 | class FillExtrusionStyleLayer extends StyleLayer {
|
24847 | constructor(layer) {
|
24848 | super(layer, properties$4);
|
24849 | }
|
24850 | createBucket(parameters) {
|
24851 | return new FillExtrusionBucket(parameters);
|
24852 | }
|
24853 | queryRadius() {
|
24854 | return translateDistance(this.paint.get('fill-extrusion-translate'));
|
24855 | }
|
24856 | is3D() {
|
24857 | return true;
|
24858 | }
|
24859 | queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform, pixelsToTileUnits, pixelPosMatrix) {
|
24860 | const translatedPolygon = translate$4(queryGeometry, this.paint.get('fill-extrusion-translate'), this.paint.get('fill-extrusion-translate-anchor'), transform.angle, pixelsToTileUnits);
|
24861 | const height = this.paint.get('fill-extrusion-height').evaluate(feature, featureState);
|
24862 | const base = this.paint.get('fill-extrusion-base').evaluate(feature, featureState);
|
24863 | const projectedQueryGeometry = projectQueryGeometry(translatedPolygon, pixelPosMatrix, transform, 0);
|
24864 | const projected = projectExtrusion(geometry, base, height, pixelPosMatrix);
|
24865 | const projectedBase = projected[0];
|
24866 | const projectedTop = projected[1];
|
24867 | return checkIntersection(projectedBase, projectedTop, projectedQueryGeometry);
|
24868 | }
|
24869 | }
|
24870 | function dot(a, b) {
|
24871 | return a.x * b.x + a.y * b.y;
|
24872 | }
|
24873 | function getIntersectionDistance(projectedQueryGeometry, projectedFace) {
|
24874 | if (projectedQueryGeometry.length === 1) {
|
24875 | // For point queries calculate the z at which the point intersects the face
|
24876 | // using barycentric coordinates.
|
24877 | // Find the barycentric coordinates of the projected point within the first
|
24878 | // triangle of the face, using only the xy plane. It doesn't matter if the
|
24879 | // point is outside the first triangle because all the triangles in the face
|
24880 | // are in the same plane.
|
24881 | //
|
24882 | // Check whether points are coincident and use other points if they are.
|
24883 | let i = 0;
|
24884 | const a = projectedFace[i++];
|
24885 | let b;
|
24886 | while (!b || a.equals(b)) {
|
24887 | b = projectedFace[i++];
|
24888 | if (!b)
|
24889 | return Infinity;
|
24890 | }
|
24891 | // Loop until point `c` is not colinear with points `a` and `b`.
|
24892 | for (; i < projectedFace.length; i++) {
|
24893 | const c = projectedFace[i];
|
24894 | const p = projectedQueryGeometry[0];
|
24895 | const ab = b.sub(a);
|
24896 | const ac = c.sub(a);
|
24897 | const ap = p.sub(a);
|
24898 | const dotABAB = dot(ab, ab);
|
24899 | const dotABAC = dot(ab, ac);
|
24900 | const dotACAC = dot(ac, ac);
|
24901 | const dotAPAB = dot(ap, ab);
|
24902 | const dotAPAC = dot(ap, ac);
|
24903 | const denom = dotABAB * dotACAC - dotABAC * dotABAC;
|
24904 | const v = (dotACAC * dotAPAB - dotABAC * dotAPAC) / denom;
|
24905 | const w = (dotABAB * dotAPAC - dotABAC * dotAPAB) / denom;
|
24906 | const u = 1 - v - w;
|
24907 | // Use the barycentric weighting along with the original triangle z coordinates to get the point of intersection.
|
24908 | const distance = a.z * u + b.z * v + c.z * w;
|
24909 | if (isFinite(distance))
|
24910 | return distance;
|
24911 | }
|
24912 | return Infinity;
|
24913 | }
|
24914 | else {
|
24915 | // The counts as closest is less clear when the query is a box. This
|
24916 | // returns the distance to the nearest point on the face, whether it is
|
24917 | // within the query or not. It could be more correct to return the
|
24918 | // distance to the closest point within the query box but this would be
|
24919 | // more complicated and expensive to calculate with little benefit.
|
24920 | let closestDistance = Infinity;
|
24921 | for (const p of projectedFace) {
|
24922 | closestDistance = Math.min(closestDistance, p.z);
|
24923 | }
|
24924 | return closestDistance;
|
24925 | }
|
24926 | }
|
24927 | function checkIntersection(projectedBase, projectedTop, projectedQueryGeometry) {
|
24928 | let closestDistance = Infinity;
|
24929 | if (polygonIntersectsMultiPolygon(projectedQueryGeometry, projectedTop)) {
|
24930 | closestDistance = getIntersectionDistance(projectedQueryGeometry, projectedTop[0]);
|
24931 | }
|
24932 | for (let r = 0; r < projectedTop.length; r++) {
|
24933 | const ringTop = projectedTop[r];
|
24934 | const ringBase = projectedBase[r];
|
24935 | for (let p = 0; p < ringTop.length - 1; p++) {
|
24936 | const topA = ringTop[p];
|
24937 | const topB = ringTop[p + 1];
|
24938 | const baseA = ringBase[p];
|
24939 | const baseB = ringBase[p + 1];
|
24940 | const face = [topA, topB, baseB, baseA, topA];
|
24941 | if (polygonIntersectsPolygon(projectedQueryGeometry, face)) {
|
24942 | closestDistance = Math.min(closestDistance, getIntersectionDistance(projectedQueryGeometry, face));
|
24943 | }
|
24944 | }
|
24945 | }
|
24946 | return closestDistance === Infinity ? false : closestDistance;
|
24947 | }
|
24948 | /*
|
24949 | * Project the geometry using matrix `m`. This is essentially doing
|
24950 | * `vec4.transformMat4([], [p.x, p.y, z, 1], m)` but the multiplication
|
24951 | * is inlined so that parts of the projection that are the same across
|
24952 | * different points can only be done once. This produced a measurable
|
24953 | * performance improvement.
|
24954 | */
|
24955 | function projectExtrusion(geometry, zBase, zTop, m) {
|
24956 | const projectedBase = [];
|
24957 | const projectedTop = [];
|
24958 | const baseXZ = m[8] * zBase;
|
24959 | const baseYZ = m[9] * zBase;
|
24960 | const baseZZ = m[10] * zBase;
|
24961 | const baseWZ = m[11] * zBase;
|
24962 | const topXZ = m[8] * zTop;
|
24963 | const topYZ = m[9] * zTop;
|
24964 | const topZZ = m[10] * zTop;
|
24965 | const topWZ = m[11] * zTop;
|
24966 | for (const r of geometry) {
|
24967 | const ringBase = [];
|
24968 | const ringTop = [];
|
24969 | for (const p of r) {
|
24970 | const x = p.x;
|
24971 | const y = p.y;
|
24972 | const sX = m[0] * x + m[4] * y + m[12];
|
24973 | const sY = m[1] * x + m[5] * y + m[13];
|
24974 | const sZ = m[2] * x + m[6] * y + m[14];
|
24975 | const sW = m[3] * x + m[7] * y + m[15];
|
24976 | const baseX = sX + baseXZ;
|
24977 | const baseY = sY + baseYZ;
|
24978 | const baseZ = sZ + baseZZ;
|
24979 | const baseW = sW + baseWZ;
|
24980 | const topX = sX + topXZ;
|
24981 | const topY = sY + topYZ;
|
24982 | const topZ = sZ + topZZ;
|
24983 | const topW = sW + topWZ;
|
24984 | const b = new pointGeometry(baseX / baseW, baseY / baseW);
|
24985 | b.z = baseZ / baseW;
|
24986 | ringBase.push(b);
|
24987 | const t = new pointGeometry(topX / topW, topY / topW);
|
24988 | t.z = topZ / topW;
|
24989 | ringTop.push(t);
|
24990 | }
|
24991 | projectedBase.push(ringBase);
|
24992 | projectedTop.push(ringTop);
|
24993 | }
|
24994 | return [projectedBase, projectedTop];
|
24995 | }
|
24996 | function projectQueryGeometry(queryGeometry, pixelPosMatrix, transform, z) {
|
24997 | const projectedQueryGeometry = [];
|
24998 | for (const p of queryGeometry) {
|
24999 | const v = [p.x, p.y, z, 1];
|
25000 | transformMat4$1(v, v, pixelPosMatrix);
|
25001 | projectedQueryGeometry.push(new pointGeometry(v[0] / v[3], v[1] / v[3]));
|
25002 | }
|
25003 | return projectedQueryGeometry;
|
25004 | }
|
25005 |
|
25006 | const lineLayoutAttributes = createLayout([
|
25007 | { name: 'a_pos_normal', components: 2, type: 'Int16' },
|
25008 | { name: 'a_data', components: 4, type: 'Uint8' }
|
25009 | ], 4);
|
25010 | const { members: members$1, size: size$1, alignment: alignment$1 } = lineLayoutAttributes;
|
25011 |
|
25012 | const lineLayoutAttributesExt = createLayout([
|
25013 | { name: 'a_uv_x', components: 1, type: 'Float32' },
|
25014 | { name: 'a_split_index', components: 1, type: 'Float32' },
|
25015 | ]);
|
25016 | const { members, size, alignment } = lineLayoutAttributesExt;
|
25017 |
|
25018 | const vectorTileFeatureTypes$1 = vectorTile.VectorTileFeature.types;
|
25019 | // NOTE ON EXTRUDE SCALE:
|
25020 | // scale the extrusion vector so that the normal length is this value.
|
25021 | // contains the "texture" normals (-1..1). this is distinct from the extrude
|
25022 | // normals for line joins, because the x-value remains 0 for the texture
|
25023 | // normal array, while the extrude normal actually moves the vertex to create
|
25024 | // the acute/bevelled line join.
|
25025 | const EXTRUDE_SCALE = 63;
|
25026 | /*
|
25027 | * Sharp corners cause dashed lines to tilt because the distance along the line
|
25028 | * is the same at both the inner and outer corners. To improve the appearance of
|
25029 | * dashed lines we add extra points near sharp corners so that a smaller part
|
25030 | * of the line is tilted.
|
25031 | *
|
25032 | * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an
|
25033 | * extra vertex. The default is 75 degrees.
|
25034 | *
|
25035 | * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner.
|
25036 | */
|
25037 | const COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180));
|
25038 | const SHARP_CORNER_OFFSET = 15;
|
25039 | // Angle per triangle for approximating round line joins.
|
25040 | const DEG_PER_TRIANGLE = 20;
|
25041 | // The number of bits that is used to store the line distance in the buffer.
|
25042 | const LINE_DISTANCE_BUFFER_BITS = 15;
|
25043 | // We don't have enough bits for the line distance as we'd like to have, so
|
25044 | // use this value to scale the line distance (in tile units) down to a smaller
|
25045 | // value. This lets us store longer distances while sacrificing precision.
|
25046 | const LINE_DISTANCE_SCALE = 1 / 2;
|
25047 | // The maximum line distance, in tile units, that fits in the buffer.
|
25048 | const MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS - 1) / LINE_DISTANCE_SCALE;
|
25049 | /**
|
25050 | * @private
|
25051 | */
|
25052 | class LineBucket {
|
25053 | constructor(options) {
|
25054 | this.zoom = options.zoom;
|
25055 | this.overscaling = options.overscaling;
|
25056 | this.layers = options.layers;
|
25057 | this.layerIds = this.layers.map(layer => layer.id);
|
25058 | this.index = options.index;
|
25059 | this.hasPattern = false;
|
25060 | this.patternFeatures = [];
|
25061 | this.lineClipsArray = [];
|
25062 | this.gradients = {};
|
25063 | this.layers.forEach(layer => {
|
25064 | this.gradients[layer.id] = {};
|
25065 | });
|
25066 | this.layoutVertexArray = new LineLayoutArray();
|
25067 | this.layoutVertexArray2 = new LineExtLayoutArray();
|
25068 | this.indexArray = new TriangleIndexArray();
|
25069 | this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom);
|
25070 | this.segments = new SegmentVector();
|
25071 | this.maxLineLength = 0;
|
25072 | this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);
|
25073 | }
|
25074 | populate(features, options, canonical) {
|
25075 | this.hasPattern = hasPattern('line', this.layers, options);
|
25076 | const lineSortKey = this.layers[0].layout.get('line-sort-key');
|
25077 | const sortFeaturesByKey = !lineSortKey.isConstant();
|
25078 | const bucketFeatures = [];
|
25079 | for (const { feature, id, index, sourceLayerIndex } of features) {
|
25080 | const needGeometry = this.layers[0]._featureFilter.needGeometry;
|
25081 | const evaluationFeature = toEvaluationFeature(feature, needGeometry);
|
25082 | if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical))
|
25083 | continue;
|
25084 | const sortKey = sortFeaturesByKey ?
|
25085 | lineSortKey.evaluate(evaluationFeature, {}, canonical) :
|
25086 | undefined;
|
25087 | const bucketFeature = {
|
25088 | id,
|
25089 | properties: feature.properties,
|
25090 | type: feature.type,
|
25091 | sourceLayerIndex,
|
25092 | index,
|
25093 | geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature),
|
25094 | patterns: {},
|
25095 | sortKey
|
25096 | };
|
25097 | bucketFeatures.push(bucketFeature);
|
25098 | }
|
25099 | if (sortFeaturesByKey) {
|
25100 | bucketFeatures.sort((a, b) => {
|
25101 | return (a.sortKey) - (b.sortKey);
|
25102 | });
|
25103 | }
|
25104 | for (const bucketFeature of bucketFeatures) {
|
25105 | const { geometry, index, sourceLayerIndex } = bucketFeature;
|
25106 | if (this.hasPattern) {
|
25107 | const patternBucketFeature = addPatternDependencies('line', this.layers, bucketFeature, this.zoom, options);
|
25108 | // pattern features are added only once the pattern is loaded into the image atlas
|
25109 | // so are stored during populate until later updated with positions by tile worker in addFeatures
|
25110 | this.patternFeatures.push(patternBucketFeature);
|
25111 | }
|
25112 | else {
|
25113 | this.addFeature(bucketFeature, geometry, index, canonical, {});
|
25114 | }
|
25115 | const feature = features[index].feature;
|
25116 | options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index);
|
25117 | }
|
25118 | }
|
25119 | update(states, vtLayer, imagePositions) {
|
25120 | if (!this.stateDependentLayers.length)
|
25121 | return;
|
25122 | this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions);
|
25123 | }
|
25124 | addFeatures(options, canonical, imagePositions) {
|
25125 | for (const feature of this.patternFeatures) {
|
25126 | this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions);
|
25127 | }
|
25128 | }
|
25129 | isEmpty() {
|
25130 | return this.layoutVertexArray.length === 0;
|
25131 | }
|
25132 | uploadPending() {
|
25133 | return !this.uploaded || this.programConfigurations.needsUpload;
|
25134 | }
|
25135 | upload(context) {
|
25136 | if (!this.uploaded) {
|
25137 | if (this.layoutVertexArray2.length !== 0) {
|
25138 | this.layoutVertexBuffer2 = context.createVertexBuffer(this.layoutVertexArray2, members);
|
25139 | }
|
25140 | this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$1);
|
25141 | this.indexBuffer = context.createIndexBuffer(this.indexArray);
|
25142 | }
|
25143 | this.programConfigurations.upload(context);
|
25144 | this.uploaded = true;
|
25145 | }
|
25146 | destroy() {
|
25147 | if (!this.layoutVertexBuffer)
|
25148 | return;
|
25149 | this.layoutVertexBuffer.destroy();
|
25150 | this.indexBuffer.destroy();
|
25151 | this.programConfigurations.destroy();
|
25152 | this.segments.destroy();
|
25153 | }
|
25154 | lineFeatureClips(feature) {
|
25155 | if (!!feature.properties && Object.prototype.hasOwnProperty.call(feature.properties, 'mapbox_clip_start') && Object.prototype.hasOwnProperty.call(feature.properties, 'mapbox_clip_end')) {
|
25156 | const start = +feature.properties['mapbox_clip_start'];
|
25157 | const end = +feature.properties['mapbox_clip_end'];
|
25158 | return { start, end };
|
25159 | }
|
25160 | }
|
25161 | addFeature(feature, geometry, index, canonical, imagePositions) {
|
25162 | const layout = this.layers[0].layout;
|
25163 | const join = layout.get('line-join').evaluate(feature, {});
|
25164 | const cap = layout.get('line-cap');
|
25165 | const miterLimit = layout.get('line-miter-limit');
|
25166 | const roundLimit = layout.get('line-round-limit');
|
25167 | this.lineClips = this.lineFeatureClips(feature);
|
25168 | for (const line of geometry) {
|
25169 | this.addLine(line, feature, join, cap, miterLimit, roundLimit);
|
25170 | }
|
25171 | this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical);
|
25172 | }
|
25173 | addLine(vertices, feature, join, cap, miterLimit, roundLimit) {
|
25174 | this.distance = 0;
|
25175 | this.scaledDistance = 0;
|
25176 | this.totalDistance = 0;
|
25177 | if (this.lineClips) {
|
25178 | this.lineClipsArray.push(this.lineClips);
|
25179 | // Calculate the total distance, in tile units, of this tiled line feature
|
25180 | for (let i = 0; i < vertices.length - 1; i++) {
|
25181 | this.totalDistance += vertices[i].dist(vertices[i + 1]);
|
25182 | }
|
25183 | this.updateScaledDistance();
|
25184 | this.maxLineLength = Math.max(this.maxLineLength, this.totalDistance);
|
25185 | }
|
25186 | const isPolygon = vectorTileFeatureTypes$1[feature.type] === 'Polygon';
|
25187 | // If the line has duplicate vertices at the ends, adjust start/length to remove them.
|
25188 | let len = vertices.length;
|
25189 | while (len >= 2 && vertices[len - 1].equals(vertices[len - 2])) {
|
25190 | len--;
|
25191 | }
|
25192 | let first = 0;
|
25193 | while (first < len - 1 && vertices[first].equals(vertices[first + 1])) {
|
25194 | first++;
|
25195 | }
|
25196 | // Ignore invalid geometry.
|
25197 | if (len < (isPolygon ? 3 : 2))
|
25198 | return;
|
25199 | if (join === 'bevel')
|
25200 | miterLimit = 1.05;
|
25201 | const sharpCornerOffset = this.overscaling <= 16 ?
|
25202 | SHARP_CORNER_OFFSET * EXTENT / (512 * this.overscaling) :
|
25203 | 0;
|
25204 | // we could be more precise, but it would only save a negligible amount of space
|
25205 | const segment = this.segments.prepareSegment(len * 10, this.layoutVertexArray, this.indexArray);
|
25206 | let currentVertex;
|
25207 | let prevVertex;
|
25208 | let nextVertex;
|
25209 | let prevNormal;
|
25210 | let nextNormal;
|
25211 | // the last two vertices added
|
25212 | this.e1 = this.e2 = -1;
|
25213 | if (isPolygon) {
|
25214 | currentVertex = vertices[len - 2];
|
25215 | nextNormal = vertices[first].sub(currentVertex)._unit()._perp();
|
25216 | }
|
25217 | for (let i = first; i < len; i++) {
|
25218 | nextVertex = i === len - 1 ?
|
25219 | (isPolygon ? vertices[first + 1] : undefined) : // if it's a polygon, treat the last vertex like the first
|
25220 | vertices[i + 1]; // just the next vertex
|
25221 | // if two consecutive vertices exist, skip the current one
|
25222 | if (nextVertex && vertices[i].equals(nextVertex))
|
25223 | continue;
|
25224 | if (nextNormal)
|
25225 | prevNormal = nextNormal;
|
25226 | if (currentVertex)
|
25227 | prevVertex = currentVertex;
|
25228 | currentVertex = vertices[i];
|
25229 | // Calculate the normal towards the next vertex in this line. In case
|
25230 | // there is no next vertex, pretend that the line is continuing straight,
|
25231 | // meaning that we are just using the previous normal.
|
25232 | nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal;
|
25233 | // If we still don't have a previous normal, this is the beginning of a
|
25234 | // non-closed line, so we're doing a straight "join".
|
25235 | prevNormal = prevNormal || nextNormal;
|
25236 | // Determine the normal of the join extrusion. It is the angle bisector
|
25237 | // of the segments between the previous line and the next line.
|
25238 | // In the case of 180° angles, the prev and next normals cancel each other out:
|
25239 | // prevNormal + nextNormal = (0, 0), its magnitude is 0, so the unit vector would be
|
25240 | // undefined. In that case, we're keeping the joinNormal at (0, 0), so that the cosHalfAngle
|
25241 | // below will also become 0 and miterLength will become Infinity.
|
25242 | let joinNormal = prevNormal.add(nextNormal);
|
25243 | if (joinNormal.x !== 0 || joinNormal.y !== 0) {
|
25244 | joinNormal._unit();
|
25245 | }
|
25246 | /* joinNormal prevNormal
|
25247 | * ↖ ↑
|
25248 | * .________. prevVertex
|
25249 | * |
|
25250 | * nextNormal ← | currentVertex
|
25251 | * |
|
25252 | * nextVertex !
|
25253 | *
|
25254 | */
|
25255 | // calculate cosines of the angle (and its half) using dot product
|
25256 | const cosAngle = prevNormal.x * nextNormal.x + prevNormal.y * nextNormal.y;
|
25257 | const cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y;
|
25258 | // Calculate the length of the miter (the ratio of the miter to the width)
|
25259 | // as the inverse of cosine of the angle between next and join normals
|
25260 | const miterLength = cosHalfAngle !== 0 ? 1 / cosHalfAngle : Infinity;
|
25261 | // approximate angle from cosine
|
25262 | const approxAngle = 2 * Math.sqrt(2 - 2 * cosHalfAngle);
|
25263 | const isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex;
|
25264 | const lineTurnsLeft = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0;
|
25265 | if (isSharpCorner && i > first) {
|
25266 | const prevSegmentLength = currentVertex.dist(prevVertex);
|
25267 | if (prevSegmentLength > 2 * sharpCornerOffset) {
|
25268 | const newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round());
|
25269 | this.updateDistance(prevVertex, newPrevVertex);
|
25270 | this.addCurrentVertex(newPrevVertex, prevNormal, 0, 0, segment);
|
25271 | prevVertex = newPrevVertex;
|
25272 | }
|
25273 | }
|
25274 | // The join if a middle vertex, otherwise the cap.
|
25275 | const middleVertex = prevVertex && nextVertex;
|
25276 | let currentJoin = middleVertex ? join : isPolygon ? 'butt' : cap;
|
25277 | if (middleVertex && currentJoin === 'round') {
|
25278 | if (miterLength < roundLimit) {
|
25279 | currentJoin = 'miter';
|
25280 | }
|
25281 | else if (miterLength <= 2) {
|
25282 | currentJoin = 'fakeround';
|
25283 | }
|
25284 | }
|
25285 | if (currentJoin === 'miter' && miterLength > miterLimit) {
|
25286 | currentJoin = 'bevel';
|
25287 | }
|
25288 | if (currentJoin === 'bevel') {
|
25289 | // The maximum extrude length is 128 / 63 = 2 times the width of the line
|
25290 | // so if miterLength >= 2 we need to draw a different type of bevel here.
|
25291 | if (miterLength > 2)
|
25292 | currentJoin = 'flipbevel';
|
25293 | // If the miterLength is really small and the line bevel wouldn't be visible,
|
25294 | // just draw a miter join to save a triangle.
|
25295 | if (miterLength < miterLimit)
|
25296 | currentJoin = 'miter';
|
25297 | }
|
25298 | // Calculate how far along the line the currentVertex is
|
25299 | if (prevVertex)
|
25300 | this.updateDistance(prevVertex, currentVertex);
|
25301 | if (currentJoin === 'miter') {
|
25302 | joinNormal._mult(miterLength);
|
25303 | this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment);
|
25304 | }
|
25305 | else if (currentJoin === 'flipbevel') {
|
25306 | // miter is too big, flip the direction to make a beveled join
|
25307 | if (miterLength > 100) {
|
25308 | // Almost parallel lines
|
25309 | joinNormal = nextNormal.mult(-1);
|
25310 | }
|
25311 | else {
|
25312 | const bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag();
|
25313 | joinNormal._perp()._mult(bevelLength * (lineTurnsLeft ? -1 : 1));
|
25314 | }
|
25315 | this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment);
|
25316 | this.addCurrentVertex(currentVertex, joinNormal.mult(-1), 0, 0, segment);
|
25317 | }
|
25318 | else if (currentJoin === 'bevel' || currentJoin === 'fakeround') {
|
25319 | const offset = -Math.sqrt(miterLength * miterLength - 1);
|
25320 | const offsetA = lineTurnsLeft ? offset : 0;
|
25321 | const offsetB = lineTurnsLeft ? 0 : offset;
|
25322 | // Close previous segment with a bevel
|
25323 | if (prevVertex) {
|
25324 | this.addCurrentVertex(currentVertex, prevNormal, offsetA, offsetB, segment);
|
25325 | }
|
25326 | if (currentJoin === 'fakeround') {
|
25327 | // The join angle is sharp enough that a round join would be visible.
|
25328 | // Bevel joins fill the gap between segments with a single pie slice triangle.
|
25329 | // Create a round join by adding multiple pie slices. The join isn't actually round, but
|
25330 | // it looks like it is at the sizes we render lines at.
|
25331 | // pick the number of triangles for approximating round join by based on the angle between normals
|
25332 | const n = Math.round((approxAngle * 180 / Math.PI) / DEG_PER_TRIANGLE);
|
25333 | for (let m = 1; m < n; m++) {
|
25334 | let t = m / n;
|
25335 | if (t !== 0.5) {
|
25336 | // approximate spherical interpolation https://observablehq.com/@mourner/approximating-geometric-slerp
|
25337 | const t2 = t - 0.5;
|
25338 | const A = 1.0904 + cosAngle * (-3.2452 + cosAngle * (3.55645 - cosAngle * 1.43519));
|
25339 | const B = 0.848013 + cosAngle * (-1.06021 + cosAngle * 0.215638);
|
25340 | t = t + t * t2 * (t - 1) * (A * t2 * t2 + B);
|
25341 | }
|
25342 | const extrude = nextNormal.sub(prevNormal)._mult(t)._add(prevNormal)._unit()._mult(lineTurnsLeft ? -1 : 1);
|
25343 | this.addHalfVertex(currentVertex, extrude.x, extrude.y, false, lineTurnsLeft, 0, segment);
|
25344 | }
|
25345 | }
|
25346 | if (nextVertex) {
|
25347 | // Start next segment
|
25348 | this.addCurrentVertex(currentVertex, nextNormal, -offsetA, -offsetB, segment);
|
25349 | }
|
25350 | }
|
25351 | else if (currentJoin === 'butt') {
|
25352 | this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); // butt cap
|
25353 | }
|
25354 | else if (currentJoin === 'square') {
|
25355 | const offset = prevVertex ? 1 : -1; // closing or starting square cap
|
25356 | this.addCurrentVertex(currentVertex, joinNormal, offset, offset, segment);
|
25357 | }
|
25358 | else if (currentJoin === 'round') {
|
25359 | if (prevVertex) {
|
25360 | // Close previous segment with butt
|
25361 | this.addCurrentVertex(currentVertex, prevNormal, 0, 0, segment);
|
25362 | // Add round cap or linejoin at end of segment
|
25363 | this.addCurrentVertex(currentVertex, prevNormal, 1, 1, segment, true);
|
25364 | }
|
25365 | if (nextVertex) {
|
25366 | // Add round cap before first segment
|
25367 | this.addCurrentVertex(currentVertex, nextNormal, -1, -1, segment, true);
|
25368 | // Start next segment with a butt
|
25369 | this.addCurrentVertex(currentVertex, nextNormal, 0, 0, segment);
|
25370 | }
|
25371 | }
|
25372 | if (isSharpCorner && i < len - 1) {
|
25373 | const nextSegmentLength = currentVertex.dist(nextVertex);
|
25374 | if (nextSegmentLength > 2 * sharpCornerOffset) {
|
25375 | const newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round());
|
25376 | this.updateDistance(currentVertex, newCurrentVertex);
|
25377 | this.addCurrentVertex(newCurrentVertex, nextNormal, 0, 0, segment);
|
25378 | currentVertex = newCurrentVertex;
|
25379 | }
|
25380 | }
|
25381 | }
|
25382 | }
|
25383 | /**
|
25384 | * Add two vertices to the buffers.
|
25385 | *
|
25386 | * @param p the line vertex to add buffer vertices for
|
25387 | * @param normal vertex normal
|
25388 | * @param endLeft extrude to shift the left vertex along the line
|
25389 | * @param endRight extrude to shift the left vertex along the line
|
25390 | * @param segment the segment object to add the vertex to
|
25391 | * @param round whether this is a round cap
|
25392 | * @private
|
25393 | */
|
25394 | addCurrentVertex(p, normal, endLeft, endRight, segment, round = false) {
|
25395 | // left and right extrude vectors, perpendicularly shifted by endLeft/endRight
|
25396 | const leftX = normal.x + normal.y * endLeft;
|
25397 | const leftY = normal.y - normal.x * endLeft;
|
25398 | const rightX = -normal.x + normal.y * endRight;
|
25399 | const rightY = -normal.y - normal.x * endRight;
|
25400 | this.addHalfVertex(p, leftX, leftY, round, false, endLeft, segment);
|
25401 | this.addHalfVertex(p, rightX, rightY, round, true, -endRight, segment);
|
25402 | // There is a maximum "distance along the line" that we can store in the buffers.
|
25403 | // When we get close to the distance, reset it to zero and add the vertex again with
|
25404 | // a distance of zero. The max distance is determined by the number of bits we allocate
|
25405 | // to `linesofar`.
|
25406 | if (this.distance > MAX_LINE_DISTANCE / 2 && this.totalDistance === 0) {
|
25407 | this.distance = 0;
|
25408 | this.addCurrentVertex(p, normal, endLeft, endRight, segment, round);
|
25409 | }
|
25410 | }
|
25411 | addHalfVertex({ x, y }, extrudeX, extrudeY, round, up, dir, segment) {
|
25412 | const totalDistance = this.lineClips ? this.scaledDistance * (MAX_LINE_DISTANCE - 1) : this.scaledDistance;
|
25413 | // scale down so that we can store longer distances while sacrificing precision.
|
25414 | const linesofarScaled = totalDistance * LINE_DISTANCE_SCALE;
|
25415 | this.layoutVertexArray.emplaceBack(
|
25416 | // a_pos_normal
|
25417 | // Encode round/up the least significant bits
|
25418 | (x << 1) + (round ? 1 : 0), (y << 1) + (up ? 1 : 0),
|
25419 | // a_data
|
25420 | // add 128 to store a byte in an unsigned byte
|
25421 | Math.round(EXTRUDE_SCALE * extrudeX) + 128, Math.round(EXTRUDE_SCALE * extrudeY) + 128,
|
25422 | // Encode the -1/0/1 direction value into the first two bits of .z of a_data.
|
25423 | // Combine it with the lower 6 bits of `linesofarScaled` (shifted by 2 bits to make
|
25424 | // room for the direction value). The upper 8 bits of `linesofarScaled` are placed in
|
25425 | // the `w` component.
|
25426 | ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | ((linesofarScaled & 0x3F) << 2), linesofarScaled >> 6);
|
25427 | // Constructs a second vertex buffer with higher precision line progress
|
25428 | if (this.lineClips) {
|
25429 | const progressRealigned = this.scaledDistance - this.lineClips.start;
|
25430 | const endClipRealigned = this.lineClips.end - this.lineClips.start;
|
25431 | const uvX = progressRealigned / endClipRealigned;
|
25432 | this.layoutVertexArray2.emplaceBack(uvX, this.lineClipsArray.length);
|
25433 | }
|
25434 | const e = segment.vertexLength++;
|
25435 | if (this.e1 >= 0 && this.e2 >= 0) {
|
25436 | this.indexArray.emplaceBack(this.e1, this.e2, e);
|
25437 | segment.primitiveLength++;
|
25438 | }
|
25439 | if (up) {
|
25440 | this.e2 = e;
|
25441 | }
|
25442 | else {
|
25443 | this.e1 = e;
|
25444 | }
|
25445 | }
|
25446 | updateScaledDistance() {
|
25447 | // Knowing the ratio of the full linestring covered by this tiled feature, as well
|
25448 | // as the total distance (in tile units) of this tiled feature, and the distance
|
25449 | // (in tile units) of the current vertex, we can determine the relative distance
|
25450 | // of this vertex along the full linestring feature and scale it to [0, 2^15)
|
25451 | this.scaledDistance = this.lineClips ?
|
25452 | this.lineClips.start + (this.lineClips.end - this.lineClips.start) * this.distance / this.totalDistance :
|
25453 | this.distance;
|
25454 | }
|
25455 | updateDistance(prev, next) {
|
25456 | this.distance += prev.dist(next);
|
25457 | this.updateScaledDistance();
|
25458 | }
|
25459 | }
|
25460 | register('LineBucket', LineBucket, { omit: ['layers', 'patternFeatures'] });
|
25461 |
|
25462 | // This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
|
25463 | const layout$1 = new Properties({
|
25464 | "line-cap": new DataConstantProperty(spec["layout_line"]["line-cap"]),
|
25465 | "line-join": new DataDrivenProperty(spec["layout_line"]["line-join"]),
|
25466 | "line-miter-limit": new DataConstantProperty(spec["layout_line"]["line-miter-limit"]),
|
25467 | "line-round-limit": new DataConstantProperty(spec["layout_line"]["line-round-limit"]),
|
25468 | "line-sort-key": new DataDrivenProperty(spec["layout_line"]["line-sort-key"]),
|
25469 | });
|
25470 | const paint$3 = new Properties({
|
25471 | "line-opacity": new DataDrivenProperty(spec["paint_line"]["line-opacity"]),
|
25472 | "line-color": new DataDrivenProperty(spec["paint_line"]["line-color"]),
|
25473 | "line-translate": new DataConstantProperty(spec["paint_line"]["line-translate"]),
|
25474 | "line-translate-anchor": new DataConstantProperty(spec["paint_line"]["line-translate-anchor"]),
|
25475 | "line-width": new DataDrivenProperty(spec["paint_line"]["line-width"]),
|
25476 | "line-gap-width": new DataDrivenProperty(spec["paint_line"]["line-gap-width"]),
|
25477 | "line-offset": new DataDrivenProperty(spec["paint_line"]["line-offset"]),
|
25478 | "line-blur": new DataDrivenProperty(spec["paint_line"]["line-blur"]),
|
25479 | "line-dasharray": new CrossFadedProperty(spec["paint_line"]["line-dasharray"]),
|
25480 | "line-pattern": new CrossFadedDataDrivenProperty(spec["paint_line"]["line-pattern"]),
|
25481 | "line-gradient": new ColorRampProperty(spec["paint_line"]["line-gradient"]),
|
25482 | });
|
25483 | var properties$3 = { paint: paint$3, layout: layout$1 };
|
25484 |
|
25485 | class LineFloorwidthProperty extends DataDrivenProperty {
|
25486 | possiblyEvaluate(value, parameters) {
|
25487 | parameters = new EvaluationParameters(Math.floor(parameters.zoom), {
|
25488 | now: parameters.now,
|
25489 | fadeDuration: parameters.fadeDuration,
|
25490 | zoomHistory: parameters.zoomHistory,
|
25491 | transition: parameters.transition
|
25492 | });
|
25493 | return super.possiblyEvaluate(value, parameters);
|
25494 | }
|
25495 | evaluate(value, globals, feature, featureState) {
|
25496 | globals = extend$1({}, globals, { zoom: Math.floor(globals.zoom) });
|
25497 | return super.evaluate(value, globals, feature, featureState);
|
25498 | }
|
25499 | }
|
25500 | const lineFloorwidthProperty = new LineFloorwidthProperty(properties$3.paint.properties['line-width'].specification);
|
25501 | lineFloorwidthProperty.useIntegerZoom = true;
|
25502 | class LineStyleLayer extends StyleLayer {
|
25503 | constructor(layer) {
|
25504 | super(layer, properties$3);
|
25505 | this.gradientVersion = 0;
|
25506 | }
|
25507 | _handleSpecialPaintPropertyUpdate(name) {
|
25508 | if (name === 'line-gradient') {
|
25509 | const expression = this._transitionablePaint._values['line-gradient'].value.expression;
|
25510 | this.stepInterpolant = expression._styleExpression.expression instanceof Step;
|
25511 | this.gradientVersion = (this.gradientVersion + 1) % Number.MAX_SAFE_INTEGER;
|
25512 | }
|
25513 | }
|
25514 | gradientExpression() {
|
25515 | return this._transitionablePaint._values['line-gradient'].value.expression;
|
25516 | }
|
25517 | recalculate(parameters, availableImages) {
|
25518 | super.recalculate(parameters, availableImages);
|
25519 | this.paint._values['line-floorwidth'] =
|
25520 | lineFloorwidthProperty.possiblyEvaluate(this._transitioningPaint._values['line-width'].value, parameters);
|
25521 | }
|
25522 | createBucket(parameters) {
|
25523 | return new LineBucket(parameters);
|
25524 | }
|
25525 | queryRadius(bucket) {
|
25526 | const lineBucket = bucket;
|
25527 | const width = getLineWidth(getMaximumPaintValue('line-width', this, lineBucket), getMaximumPaintValue('line-gap-width', this, lineBucket));
|
25528 | const offset = getMaximumPaintValue('line-offset', this, lineBucket);
|
25529 | return width / 2 + Math.abs(offset) + translateDistance(this.paint.get('line-translate'));
|
25530 | }
|
25531 | queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform, pixelsToTileUnits) {
|
25532 | const translatedPolygon = translate$4(queryGeometry, this.paint.get('line-translate'), this.paint.get('line-translate-anchor'), transform.angle, pixelsToTileUnits);
|
25533 | const halfWidth = pixelsToTileUnits / 2 * getLineWidth(this.paint.get('line-width').evaluate(feature, featureState), this.paint.get('line-gap-width').evaluate(feature, featureState));
|
25534 | const lineOffset = this.paint.get('line-offset').evaluate(feature, featureState);
|
25535 | if (lineOffset) {
|
25536 | geometry = offsetLine(geometry, lineOffset * pixelsToTileUnits);
|
25537 | }
|
25538 | return polygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth);
|
25539 | }
|
25540 | isTileClipped() {
|
25541 | return true;
|
25542 | }
|
25543 | }
|
25544 | function getLineWidth(lineWidth, lineGapWidth) {
|
25545 | if (lineGapWidth > 0) {
|
25546 | return lineGapWidth + 2 * lineWidth;
|
25547 | }
|
25548 | else {
|
25549 | return lineWidth;
|
25550 | }
|
25551 | }
|
25552 |
|
25553 | const symbolLayoutAttributes = createLayout([
|
25554 | { name: 'a_pos_offset', components: 4, type: 'Int16' },
|
25555 | { name: 'a_data', components: 4, type: 'Uint16' },
|
25556 | { name: 'a_pixeloffset', components: 4, type: 'Int16' }
|
25557 | ], 4);
|
25558 | const dynamicLayoutAttributes = createLayout([
|
25559 | { name: 'a_projected_pos', components: 3, type: 'Float32' }
|
25560 | ], 4);
|
25561 | const placementOpacityAttributes = createLayout([
|
25562 | { name: 'a_fade_opacity', components: 1, type: 'Uint32' }
|
25563 | ], 4);
|
25564 | const collisionVertexAttributes = createLayout([
|
25565 | { name: 'a_placed', components: 2, type: 'Uint8' },
|
25566 | { name: 'a_shift', components: 2, type: 'Float32' }
|
25567 | ]);
|
25568 | const collisionBox = createLayout([
|
25569 | // the box is centered around the anchor point
|
25570 | { type: 'Int16', name: 'anchorPointX' },
|
25571 | { type: 'Int16', name: 'anchorPointY' },
|
25572 | // distances to the edges from the anchor
|
25573 | { type: 'Int16', name: 'x1' },
|
25574 | { type: 'Int16', name: 'y1' },
|
25575 | { type: 'Int16', name: 'x2' },
|
25576 | { type: 'Int16', name: 'y2' },
|
25577 | // the index of the feature in the original vectortile
|
25578 | { type: 'Uint32', name: 'featureIndex' },
|
25579 | // the source layer the feature appears in
|
25580 | { type: 'Uint16', name: 'sourceLayerIndex' },
|
25581 | // the bucket the feature appears in
|
25582 | { type: 'Uint16', name: 'bucketIndex' },
|
25583 | ]);
|
25584 | const collisionBoxLayout = createLayout([
|
25585 | { name: 'a_pos', components: 2, type: 'Int16' },
|
25586 | { name: 'a_anchor_pos', components: 2, type: 'Int16' },
|
25587 | { name: 'a_extrude', components: 2, type: 'Int16' }
|
25588 | ], 4);
|
25589 | const collisionCircleLayout = createLayout([
|
25590 | { name: 'a_pos', components: 2, type: 'Float32' },
|
25591 | { name: 'a_radius', components: 1, type: 'Float32' },
|
25592 | { name: 'a_flags', components: 2, type: 'Int16' }
|
25593 | ], 4);
|
25594 | const quadTriangle = createLayout([
|
25595 | { name: 'triangle', components: 3, type: 'Uint16' },
|
25596 | ]);
|
25597 | const placement = createLayout([
|
25598 | { type: 'Int16', name: 'anchorX' },
|
25599 | { type: 'Int16', name: 'anchorY' },
|
25600 | { type: 'Uint16', name: 'glyphStartIndex' },
|
25601 | { type: 'Uint16', name: 'numGlyphs' },
|
25602 | { type: 'Uint32', name: 'vertexStartIndex' },
|
25603 | { type: 'Uint32', name: 'lineStartIndex' },
|
25604 | { type: 'Uint32', name: 'lineLength' },
|
25605 | { type: 'Uint16', name: 'segment' },
|
25606 | { type: 'Uint16', name: 'lowerSize' },
|
25607 | { type: 'Uint16', name: 'upperSize' },
|
25608 | { type: 'Float32', name: 'lineOffsetX' },
|
25609 | { type: 'Float32', name: 'lineOffsetY' },
|
25610 | { type: 'Uint8', name: 'writingMode' },
|
25611 | { type: 'Uint8', name: 'placedOrientation' },
|
25612 | { type: 'Uint8', name: 'hidden' },
|
25613 | { type: 'Uint32', name: 'crossTileID' },
|
25614 | { type: 'Int16', name: 'associatedIconIndex' }
|
25615 | ]);
|
25616 | const symbolInstance = createLayout([
|
25617 | { type: 'Int16', name: 'anchorX' },
|
25618 | { type: 'Int16', name: 'anchorY' },
|
25619 | { type: 'Int16', name: 'rightJustifiedTextSymbolIndex' },
|
25620 | { type: 'Int16', name: 'centerJustifiedTextSymbolIndex' },
|
25621 | { type: 'Int16', name: 'leftJustifiedTextSymbolIndex' },
|
25622 | { type: 'Int16', name: 'verticalPlacedTextSymbolIndex' },
|
25623 | { type: 'Int16', name: 'placedIconSymbolIndex' },
|
25624 | { type: 'Int16', name: 'verticalPlacedIconSymbolIndex' },
|
25625 | { type: 'Uint16', name: 'key' },
|
25626 | { type: 'Uint16', name: 'textBoxStartIndex' },
|
25627 | { type: 'Uint16', name: 'textBoxEndIndex' },
|
25628 | { type: 'Uint16', name: 'verticalTextBoxStartIndex' },
|
25629 | { type: 'Uint16', name: 'verticalTextBoxEndIndex' },
|
25630 | { type: 'Uint16', name: 'iconBoxStartIndex' },
|
25631 | { type: 'Uint16', name: 'iconBoxEndIndex' },
|
25632 | { type: 'Uint16', name: 'verticalIconBoxStartIndex' },
|
25633 | { type: 'Uint16', name: 'verticalIconBoxEndIndex' },
|
25634 | { type: 'Uint16', name: 'featureIndex' },
|
25635 | { type: 'Uint16', name: 'numHorizontalGlyphVertices' },
|
25636 | { type: 'Uint16', name: 'numVerticalGlyphVertices' },
|
25637 | { type: 'Uint16', name: 'numIconVertices' },
|
25638 | { type: 'Uint16', name: 'numVerticalIconVertices' },
|
25639 | { type: 'Uint16', name: 'useRuntimeCollisionCircles' },
|
25640 | { type: 'Uint32', name: 'crossTileID' },
|
25641 | { type: 'Float32', name: 'textBoxScale' },
|
25642 | { type: 'Float32', components: 2, name: 'textOffset' },
|
25643 | { type: 'Float32', name: 'collisionCircleDiameter' },
|
25644 | ]);
|
25645 | const glyphOffset = createLayout([
|
25646 | { type: 'Float32', name: 'offsetX' }
|
25647 | ]);
|
25648 | const lineVertex = createLayout([
|
25649 | { type: 'Int16', name: 'x' },
|
25650 | { type: 'Int16', name: 'y' },
|
25651 | { type: 'Int16', name: 'tileUnitDistanceFromAnchor' }
|
25652 | ]);
|
25653 |
|
25654 | function transformText(text, layer, feature) {
|
25655 | const transform = layer.layout.get('text-transform').evaluate(feature, {});
|
25656 | if (transform === 'uppercase') {
|
25657 | text = text.toLocaleUpperCase();
|
25658 | }
|
25659 | else if (transform === 'lowercase') {
|
25660 | text = text.toLocaleLowerCase();
|
25661 | }
|
25662 | if (plugin.applyArabicShaping) {
|
25663 | text = plugin.applyArabicShaping(text);
|
25664 | }
|
25665 | return text;
|
25666 | }
|
25667 | function transformText$1 (text, layer, feature) {
|
25668 | text.sections.forEach(section => {
|
25669 | section.text = transformText(section.text, layer, feature);
|
25670 | });
|
25671 | return text;
|
25672 | }
|
25673 |
|
25674 | function mergeLines (features) {
|
25675 | const leftIndex = {};
|
25676 | const rightIndex = {};
|
25677 | const mergedFeatures = [];
|
25678 | let mergedIndex = 0;
|
25679 | function add(k) {
|
25680 | mergedFeatures.push(features[k]);
|
25681 | mergedIndex++;
|
25682 | }
|
25683 | function mergeFromRight(leftKey, rightKey, geom) {
|
25684 | const i = rightIndex[leftKey];
|
25685 | delete rightIndex[leftKey];
|
25686 | rightIndex[rightKey] = i;
|
25687 | mergedFeatures[i].geometry[0].pop();
|
25688 | mergedFeatures[i].geometry[0] = mergedFeatures[i].geometry[0].concat(geom[0]);
|
25689 | return i;
|
25690 | }
|
25691 | function mergeFromLeft(leftKey, rightKey, geom) {
|
25692 | const i = leftIndex[rightKey];
|
25693 | delete leftIndex[rightKey];
|
25694 | leftIndex[leftKey] = i;
|
25695 | mergedFeatures[i].geometry[0].shift();
|
25696 | mergedFeatures[i].geometry[0] = geom[0].concat(mergedFeatures[i].geometry[0]);
|
25697 | return i;
|
25698 | }
|
25699 | function getKey(text, geom, onRight) {
|
25700 | const point = onRight ? geom[0][geom[0].length - 1] : geom[0][0];
|
25701 | return `${text}:${point.x}:${point.y}`;
|
25702 | }
|
25703 | for (let k = 0; k < features.length; k++) {
|
25704 | const feature = features[k];
|
25705 | const geom = feature.geometry;
|
25706 | const text = feature.text ? feature.text.toString() : null;
|
25707 | if (!text) {
|
25708 | add(k);
|
25709 | continue;
|
25710 | }
|
25711 | const leftKey = getKey(text, geom), rightKey = getKey(text, geom, true);
|
25712 | if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) {
|
25713 | // found lines with the same text adjacent to both ends of the current line, merge all three
|
25714 | const j = mergeFromLeft(leftKey, rightKey, geom);
|
25715 | const i = mergeFromRight(leftKey, rightKey, mergedFeatures[j].geometry);
|
25716 | delete leftIndex[leftKey];
|
25717 | delete rightIndex[rightKey];
|
25718 | rightIndex[getKey(text, mergedFeatures[i].geometry, true)] = i;
|
25719 | mergedFeatures[j].geometry = null;
|
25720 | }
|
25721 | else if (leftKey in rightIndex) {
|
25722 | // found mergeable line adjacent to the start of the current line, merge
|
25723 | mergeFromRight(leftKey, rightKey, geom);
|
25724 | }
|
25725 | else if (rightKey in leftIndex) {
|
25726 | // found mergeable line adjacent to the end of the current line, merge
|
25727 | mergeFromLeft(leftKey, rightKey, geom);
|
25728 | }
|
25729 | else {
|
25730 | // no adjacent lines, add as a new item
|
25731 | add(k);
|
25732 | leftIndex[leftKey] = mergedIndex - 1;
|
25733 | rightIndex[rightKey] = mergedIndex - 1;
|
25734 | }
|
25735 | }
|
25736 | return mergedFeatures.filter((f) => f.geometry);
|
25737 | }
|
25738 |
|
25739 | const verticalizedCharacterMap = {
|
25740 | '!': '︕',
|
25741 | '#': '#',
|
25742 | '$': '$',
|
25743 | '%': '%',
|
25744 | '&': '&',
|
25745 | '(': '︵',
|
25746 | ')': '︶',
|
25747 | '*': '*',
|
25748 | '+': '+',
|
25749 | ',': '︐',
|
25750 | '-': '︲',
|
25751 | '.': '・',
|
25752 | '/': '/',
|
25753 | ':': '︓',
|
25754 | ';': '︔',
|
25755 | '<': '︿',
|
25756 | '=': '=',
|
25757 | '>': '﹀',
|
25758 | '?': '︖',
|
25759 | '@': '@',
|
25760 | '[': '﹇',
|
25761 | '\\': '\',
|
25762 | ']': '﹈',
|
25763 | '^': '^',
|
25764 | '_': '︳',
|
25765 | '`': '`',
|
25766 | '{': '︷',
|
25767 | '|': '―',
|
25768 | '}': '︸',
|
25769 | '~': '~',
|
25770 | '¢': '¢',
|
25771 | '£': '£',
|
25772 | '¥': '¥',
|
25773 | '¦': '¦',
|
25774 | '¬': '¬',
|
25775 | '¯': ' ̄',
|
25776 | '–': '︲',
|
25777 | '—': '︱',
|
25778 | '‘': '﹃',
|
25779 | '’': '﹄',
|
25780 | '“': '﹁',
|
25781 | '”': '﹂',
|
25782 | '…': '︙',
|
25783 | '‧': '・',
|
25784 | '₩': '₩',
|
25785 | '、': '︑',
|
25786 | '。': '︒',
|
25787 | '〈': '︿',
|
25788 | '〉': '﹀',
|
25789 | '《': '︽',
|
25790 | '》': '︾',
|
25791 | '「': '﹁',
|
25792 | '」': '﹂',
|
25793 | '『': '﹃',
|
25794 | '』': '﹄',
|
25795 | '【': '︻',
|
25796 | '】': '︼',
|
25797 | '〔': '︹',
|
25798 | '〕': '︺',
|
25799 | '〖': '︗',
|
25800 | '〗': '︘',
|
25801 | '!': '︕',
|
25802 | '(': '︵',
|
25803 | ')': '︶',
|
25804 | ',': '︐',
|
25805 | '-': '︲',
|
25806 | '.': '・',
|
25807 | ':': '︓',
|
25808 | ';': '︔',
|
25809 | '<': '︿',
|
25810 | '>': '﹀',
|
25811 | '?': '︖',
|
25812 | '[': '﹇',
|
25813 | ']': '﹈',
|
25814 | '_': '︳',
|
25815 | '{': '︷',
|
25816 | '|': '―',
|
25817 | '}': '︸',
|
25818 | '⦅': '︵',
|
25819 | '⦆': '︶',
|
25820 | '。': '︒',
|
25821 | '「': '﹁',
|
25822 | '」': '﹂'
|
25823 | };
|
25824 | function verticalizePunctuation(input) {
|
25825 | let output = '';
|
25826 | for (let i = 0; i < input.length; i++) {
|
25827 | const nextCharCode = input.charCodeAt(i + 1) || null;
|
25828 | const prevCharCode = input.charCodeAt(i - 1) || null;
|
25829 | const canReplacePunctuation = ((!nextCharCode || !charHasRotatedVerticalOrientation(nextCharCode) || verticalizedCharacterMap[input[i + 1]]) &&
|
25830 | (!prevCharCode || !charHasRotatedVerticalOrientation(prevCharCode) || verticalizedCharacterMap[input[i - 1]]));
|
25831 | if (canReplacePunctuation && verticalizedCharacterMap[input[i]]) {
|
25832 | output += verticalizedCharacterMap[input[i]];
|
25833 | }
|
25834 | else {
|
25835 | output += input[i];
|
25836 | }
|
25837 | }
|
25838 | return output;
|
25839 | }
|
25840 |
|
25841 | // ONE_EM constant used to go between "em" units used in style spec and "points" used internally for layout
|
25842 | var ONE_EM = 24;
|
25843 |
|
25844 | var ieee754$1 = {};
|
25845 |
|
25846 | /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
25847 |
|
25848 | var read = ieee754$1.read = function (buffer, offset, isLE, mLen, nBytes) {
|
25849 | var e, m;
|
25850 | var eLen = (nBytes * 8) - mLen - 1;
|
25851 | var eMax = (1 << eLen) - 1;
|
25852 | var eBias = eMax >> 1;
|
25853 | var nBits = -7;
|
25854 | var i = isLE ? (nBytes - 1) : 0;
|
25855 | var d = isLE ? -1 : 1;
|
25856 | var s = buffer[offset + i];
|
25857 |
|
25858 | i += d;
|
25859 |
|
25860 | e = s & ((1 << (-nBits)) - 1);
|
25861 | s >>= (-nBits);
|
25862 | nBits += eLen;
|
25863 | for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
|
25864 |
|
25865 | m = e & ((1 << (-nBits)) - 1);
|
25866 | e >>= (-nBits);
|
25867 | nBits += mLen;
|
25868 | for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
|
25869 |
|
25870 | if (e === 0) {
|
25871 | e = 1 - eBias;
|
25872 | } else if (e === eMax) {
|
25873 | return m ? NaN : ((s ? -1 : 1) * Infinity)
|
25874 | } else {
|
25875 | m = m + Math.pow(2, mLen);
|
25876 | e = e - eBias;
|
25877 | }
|
25878 | return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
|
25879 | };
|
25880 |
|
25881 | var write = ieee754$1.write = function (buffer, value, offset, isLE, mLen, nBytes) {
|
25882 | var e, m, c;
|
25883 | var eLen = (nBytes * 8) - mLen - 1;
|
25884 | var eMax = (1 << eLen) - 1;
|
25885 | var eBias = eMax >> 1;
|
25886 | var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
|
25887 | var i = isLE ? 0 : (nBytes - 1);
|
25888 | var d = isLE ? 1 : -1;
|
25889 | var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
|
25890 |
|
25891 | value = Math.abs(value);
|
25892 |
|
25893 | if (isNaN(value) || value === Infinity) {
|
25894 | m = isNaN(value) ? 1 : 0;
|
25895 | e = eMax;
|
25896 | } else {
|
25897 | e = Math.floor(Math.log(value) / Math.LN2);
|
25898 | if (value * (c = Math.pow(2, -e)) < 1) {
|
25899 | e--;
|
25900 | c *= 2;
|
25901 | }
|
25902 | if (e + eBias >= 1) {
|
25903 | value += rt / c;
|
25904 | } else {
|
25905 | value += rt * Math.pow(2, 1 - eBias);
|
25906 | }
|
25907 | if (value * c >= 2) {
|
25908 | e++;
|
25909 | c /= 2;
|
25910 | }
|
25911 |
|
25912 | if (e + eBias >= eMax) {
|
25913 | m = 0;
|
25914 | e = eMax;
|
25915 | } else if (e + eBias >= 1) {
|
25916 | m = ((value * c) - 1) * Math.pow(2, mLen);
|
25917 | e = e + eBias;
|
25918 | } else {
|
25919 | m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
|
25920 | e = 0;
|
25921 | }
|
25922 | }
|
25923 |
|
25924 | for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
|
25925 |
|
25926 | e = (e << mLen) | m;
|
25927 | eLen += mLen;
|
25928 | for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
|
25929 |
|
25930 | buffer[offset + i - d] |= s * 128;
|
25931 | };
|
25932 |
|
25933 | ;
|
25934 |
|
25935 | var pbf = Pbf;
|
25936 |
|
25937 | var ieee754 = ieee754$1;
|
25938 |
|
25939 | function Pbf(buf) {
|
25940 | this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
|
25941 | this.pos = 0;
|
25942 | this.type = 0;
|
25943 | this.length = this.buf.length;
|
25944 | }
|
25945 |
|
25946 | Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
|
25947 | Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
|
25948 | Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
|
25949 | Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
|
25950 |
|
25951 | var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
|
25952 | SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
|
25953 |
|
25954 | // Threshold chosen based on both benchmarking and knowledge about browser string
|
25955 | // data structures (which currently switch structure types at 12 bytes or more)
|
25956 | var TEXT_DECODER_MIN_LENGTH = 12;
|
25957 | var utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf8');
|
25958 |
|
25959 | Pbf.prototype = {
|
25960 |
|
25961 | destroy: function() {
|
25962 | this.buf = null;
|
25963 | },
|
25964 |
|
25965 | // === READING =================================================================
|
25966 |
|
25967 | readFields: function(readField, result, end) {
|
25968 | end = end || this.length;
|
25969 |
|
25970 | while (this.pos < end) {
|
25971 | var val = this.readVarint(),
|
25972 | tag = val >> 3,
|
25973 | startPos = this.pos;
|
25974 |
|
25975 | this.type = val & 0x7;
|
25976 | readField(tag, result, this);
|
25977 |
|
25978 | if (this.pos === startPos) this.skip(val);
|
25979 | }
|
25980 | return result;
|
25981 | },
|
25982 |
|
25983 | readMessage: function(readField, result) {
|
25984 | return this.readFields(readField, result, this.readVarint() + this.pos);
|
25985 | },
|
25986 |
|
25987 | readFixed32: function() {
|
25988 | var val = readUInt32(this.buf, this.pos);
|
25989 | this.pos += 4;
|
25990 | return val;
|
25991 | },
|
25992 |
|
25993 | readSFixed32: function() {
|
25994 | var val = readInt32(this.buf, this.pos);
|
25995 | this.pos += 4;
|
25996 | return val;
|
25997 | },
|
25998 |
|
25999 | // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
|
26000 |
|
26001 | readFixed64: function() {
|
26002 | var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
|
26003 | this.pos += 8;
|
26004 | return val;
|
26005 | },
|
26006 |
|
26007 | readSFixed64: function() {
|
26008 | var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
|
26009 | this.pos += 8;
|
26010 | return val;
|
26011 | },
|
26012 |
|
26013 | readFloat: function() {
|
26014 | var val = ieee754.read(this.buf, this.pos, true, 23, 4);
|
26015 | this.pos += 4;
|
26016 | return val;
|
26017 | },
|
26018 |
|
26019 | readDouble: function() {
|
26020 | var val = ieee754.read(this.buf, this.pos, true, 52, 8);
|
26021 | this.pos += 8;
|
26022 | return val;
|
26023 | },
|
26024 |
|
26025 | readVarint: function(isSigned) {
|
26026 | var buf = this.buf,
|
26027 | val, b;
|
26028 |
|
26029 | b = buf[this.pos++]; val = b & 0x7f; if (b < 0x80) return val;
|
26030 | b = buf[this.pos++]; val |= (b & 0x7f) << 7; if (b < 0x80) return val;
|
26031 | b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
|
26032 | b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
|
26033 | b = buf[this.pos]; val |= (b & 0x0f) << 28;
|
26034 |
|
26035 | return readVarintRemainder(val, isSigned, this);
|
26036 | },
|
26037 |
|
26038 | readVarint64: function() { // for compatibility with v2.0.1
|
26039 | return this.readVarint(true);
|
26040 | },
|
26041 |
|
26042 | readSVarint: function() {
|
26043 | var num = this.readVarint();
|
26044 | return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
|
26045 | },
|
26046 |
|
26047 | readBoolean: function() {
|
26048 | return Boolean(this.readVarint());
|
26049 | },
|
26050 |
|
26051 | readString: function() {
|
26052 | var end = this.readVarint() + this.pos;
|
26053 | var pos = this.pos;
|
26054 | this.pos = end;
|
26055 |
|
26056 | if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) {
|
26057 | // longer strings are fast with the built-in browser TextDecoder API
|
26058 | return readUtf8TextDecoder(this.buf, pos, end);
|
26059 | }
|
26060 | // short strings are fast with our custom implementation
|
26061 | return readUtf8(this.buf, pos, end);
|
26062 | },
|
26063 |
|
26064 | readBytes: function() {
|
26065 | var end = this.readVarint() + this.pos,
|
26066 | buffer = this.buf.subarray(this.pos, end);
|
26067 | this.pos = end;
|
26068 | return buffer;
|
26069 | },
|
26070 |
|
26071 | // verbose for performance reasons; doesn't affect gzipped size
|
26072 |
|
26073 | readPackedVarint: function(arr, isSigned) {
|
26074 | if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));
|
26075 | var end = readPackedEnd(this);
|
26076 | arr = arr || [];
|
26077 | while (this.pos < end) arr.push(this.readVarint(isSigned));
|
26078 | return arr;
|
26079 | },
|
26080 | readPackedSVarint: function(arr) {
|
26081 | if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());
|
26082 | var end = readPackedEnd(this);
|
26083 | arr = arr || [];
|
26084 | while (this.pos < end) arr.push(this.readSVarint());
|
26085 | return arr;
|
26086 | },
|
26087 | readPackedBoolean: function(arr) {
|
26088 | if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());
|
26089 | var end = readPackedEnd(this);
|
26090 | arr = arr || [];
|
26091 | while (this.pos < end) arr.push(this.readBoolean());
|
26092 | return arr;
|
26093 | },
|
26094 | readPackedFloat: function(arr) {
|
26095 | if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());
|
26096 | var end = readPackedEnd(this);
|
26097 | arr = arr || [];
|
26098 | while (this.pos < end) arr.push(this.readFloat());
|
26099 | return arr;
|
26100 | },
|
26101 | readPackedDouble: function(arr) {
|
26102 | if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());
|
26103 | var end = readPackedEnd(this);
|
26104 | arr = arr || [];
|
26105 | while (this.pos < end) arr.push(this.readDouble());
|
26106 | return arr;
|
26107 | },
|
26108 | readPackedFixed32: function(arr) {
|
26109 | if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());
|
26110 | var end = readPackedEnd(this);
|
26111 | arr = arr || [];
|
26112 | while (this.pos < end) arr.push(this.readFixed32());
|
26113 | return arr;
|
26114 | },
|
26115 | readPackedSFixed32: function(arr) {
|
26116 | if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());
|
26117 | var end = readPackedEnd(this);
|
26118 | arr = arr || [];
|
26119 | while (this.pos < end) arr.push(this.readSFixed32());
|
26120 | return arr;
|
26121 | },
|
26122 | readPackedFixed64: function(arr) {
|
26123 | if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());
|
26124 | var end = readPackedEnd(this);
|
26125 | arr = arr || [];
|
26126 | while (this.pos < end) arr.push(this.readFixed64());
|
26127 | return arr;
|
26128 | },
|
26129 | readPackedSFixed64: function(arr) {
|
26130 | if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());
|
26131 | var end = readPackedEnd(this);
|
26132 | arr = arr || [];
|
26133 | while (this.pos < end) arr.push(this.readSFixed64());
|
26134 | return arr;
|
26135 | },
|
26136 |
|
26137 | skip: function(val) {
|
26138 | var type = val & 0x7;
|
26139 | if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
|
26140 | else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
|
26141 | else if (type === Pbf.Fixed32) this.pos += 4;
|
26142 | else if (type === Pbf.Fixed64) this.pos += 8;
|
26143 | else throw new Error('Unimplemented type: ' + type);
|
26144 | },
|
26145 |
|
26146 | // === WRITING =================================================================
|
26147 |
|
26148 | writeTag: function(tag, type) {
|
26149 | this.writeVarint((tag << 3) | type);
|
26150 | },
|
26151 |
|
26152 | realloc: function(min) {
|
26153 | var length = this.length || 16;
|
26154 |
|
26155 | while (length < this.pos + min) length *= 2;
|
26156 |
|
26157 | if (length !== this.length) {
|
26158 | var buf = new Uint8Array(length);
|
26159 | buf.set(this.buf);
|
26160 | this.buf = buf;
|
26161 | this.length = length;
|
26162 | }
|
26163 | },
|
26164 |
|
26165 | finish: function() {
|
26166 | this.length = this.pos;
|
26167 | this.pos = 0;
|
26168 | return this.buf.subarray(0, this.length);
|
26169 | },
|
26170 |
|
26171 | writeFixed32: function(val) {
|
26172 | this.realloc(4);
|
26173 | writeInt32(this.buf, val, this.pos);
|
26174 | this.pos += 4;
|
26175 | },
|
26176 |
|
26177 | writeSFixed32: function(val) {
|
26178 | this.realloc(4);
|
26179 | writeInt32(this.buf, val, this.pos);
|
26180 | this.pos += 4;
|
26181 | },
|
26182 |
|
26183 | writeFixed64: function(val) {
|
26184 | this.realloc(8);
|
26185 | writeInt32(this.buf, val & -1, this.pos);
|
26186 | writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
|
26187 | this.pos += 8;
|
26188 | },
|
26189 |
|
26190 | writeSFixed64: function(val) {
|
26191 | this.realloc(8);
|
26192 | writeInt32(this.buf, val & -1, this.pos);
|
26193 | writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
|
26194 | this.pos += 8;
|
26195 | },
|
26196 |
|
26197 | writeVarint: function(val) {
|
26198 | val = +val || 0;
|
26199 |
|
26200 | if (val > 0xfffffff || val < 0) {
|
26201 | writeBigVarint(val, this);
|
26202 | return;
|
26203 | }
|
26204 |
|
26205 | this.realloc(4);
|
26206 |
|
26207 | this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
|
26208 | this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
|
26209 | this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
|
26210 | this.buf[this.pos++] = (val >>> 7) & 0x7f;
|
26211 | },
|
26212 |
|
26213 | writeSVarint: function(val) {
|
26214 | this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
|
26215 | },
|
26216 |
|
26217 | writeBoolean: function(val) {
|
26218 | this.writeVarint(Boolean(val));
|
26219 | },
|
26220 |
|
26221 | writeString: function(str) {
|
26222 | str = String(str);
|
26223 | this.realloc(str.length * 4);
|
26224 |
|
26225 | this.pos++; // reserve 1 byte for short string length
|
26226 |
|
26227 | var startPos = this.pos;
|
26228 | // write the string directly to the buffer and see how much was written
|
26229 | this.pos = writeUtf8(this.buf, str, this.pos);
|
26230 | var len = this.pos - startPos;
|
26231 |
|
26232 | if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
|
26233 |
|
26234 | // finally, write the message length in the reserved place and restore the position
|
26235 | this.pos = startPos - 1;
|
26236 | this.writeVarint(len);
|
26237 | this.pos += len;
|
26238 | },
|
26239 |
|
26240 | writeFloat: function(val) {
|
26241 | this.realloc(4);
|
26242 | ieee754.write(this.buf, val, this.pos, true, 23, 4);
|
26243 | this.pos += 4;
|
26244 | },
|
26245 |
|
26246 | writeDouble: function(val) {
|
26247 | this.realloc(8);
|
26248 | ieee754.write(this.buf, val, this.pos, true, 52, 8);
|
26249 | this.pos += 8;
|
26250 | },
|
26251 |
|
26252 | writeBytes: function(buffer) {
|
26253 | var len = buffer.length;
|
26254 | this.writeVarint(len);
|
26255 | this.realloc(len);
|
26256 | for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
|
26257 | },
|
26258 |
|
26259 | writeRawMessage: function(fn, obj) {
|
26260 | this.pos++; // reserve 1 byte for short message length
|
26261 |
|
26262 | // write the message directly to the buffer and see how much was written
|
26263 | var startPos = this.pos;
|
26264 | fn(obj, this);
|
26265 | var len = this.pos - startPos;
|
26266 |
|
26267 | if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
|
26268 |
|
26269 | // finally, write the message length in the reserved place and restore the position
|
26270 | this.pos = startPos - 1;
|
26271 | this.writeVarint(len);
|
26272 | this.pos += len;
|
26273 | },
|
26274 |
|
26275 | writeMessage: function(tag, fn, obj) {
|
26276 | this.writeTag(tag, Pbf.Bytes);
|
26277 | this.writeRawMessage(fn, obj);
|
26278 | },
|
26279 |
|
26280 | writePackedVarint: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedVarint, arr); },
|
26281 | writePackedSVarint: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSVarint, arr); },
|
26282 | writePackedBoolean: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedBoolean, arr); },
|
26283 | writePackedFloat: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFloat, arr); },
|
26284 | writePackedDouble: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedDouble, arr); },
|
26285 | writePackedFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed32, arr); },
|
26286 | writePackedSFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr); },
|
26287 | writePackedFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed64, arr); },
|
26288 | writePackedSFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr); },
|
26289 |
|
26290 | writeBytesField: function(tag, buffer) {
|
26291 | this.writeTag(tag, Pbf.Bytes);
|
26292 | this.writeBytes(buffer);
|
26293 | },
|
26294 | writeFixed32Field: function(tag, val) {
|
26295 | this.writeTag(tag, Pbf.Fixed32);
|
26296 | this.writeFixed32(val);
|
26297 | },
|
26298 | writeSFixed32Field: function(tag, val) {
|
26299 | this.writeTag(tag, Pbf.Fixed32);
|
26300 | this.writeSFixed32(val);
|
26301 | },
|
26302 | writeFixed64Field: function(tag, val) {
|
26303 | this.writeTag(tag, Pbf.Fixed64);
|
26304 | this.writeFixed64(val);
|
26305 | },
|
26306 | writeSFixed64Field: function(tag, val) {
|
26307 | this.writeTag(tag, Pbf.Fixed64);
|
26308 | this.writeSFixed64(val);
|
26309 | },
|
26310 | writeVarintField: function(tag, val) {
|
26311 | this.writeTag(tag, Pbf.Varint);
|
26312 | this.writeVarint(val);
|
26313 | },
|
26314 | writeSVarintField: function(tag, val) {
|
26315 | this.writeTag(tag, Pbf.Varint);
|
26316 | this.writeSVarint(val);
|
26317 | },
|
26318 | writeStringField: function(tag, str) {
|
26319 | this.writeTag(tag, Pbf.Bytes);
|
26320 | this.writeString(str);
|
26321 | },
|
26322 | writeFloatField: function(tag, val) {
|
26323 | this.writeTag(tag, Pbf.Fixed32);
|
26324 | this.writeFloat(val);
|
26325 | },
|
26326 | writeDoubleField: function(tag, val) {
|
26327 | this.writeTag(tag, Pbf.Fixed64);
|
26328 | this.writeDouble(val);
|
26329 | },
|
26330 | writeBooleanField: function(tag, val) {
|
26331 | this.writeVarintField(tag, Boolean(val));
|
26332 | }
|
26333 | };
|
26334 |
|
26335 | function readVarintRemainder(l, s, p) {
|
26336 | var buf = p.buf,
|
26337 | h, b;
|
26338 |
|
26339 | b = buf[p.pos++]; h = (b & 0x70) >> 4; if (b < 0x80) return toNum(l, h, s);
|
26340 | b = buf[p.pos++]; h |= (b & 0x7f) << 3; if (b < 0x80) return toNum(l, h, s);
|
26341 | b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
|
26342 | b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
|
26343 | b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
|
26344 | b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
|
26345 |
|
26346 | throw new Error('Expected varint not more than 10 bytes');
|
26347 | }
|
26348 |
|
26349 | function readPackedEnd(pbf) {
|
26350 | return pbf.type === Pbf.Bytes ?
|
26351 | pbf.readVarint() + pbf.pos : pbf.pos + 1;
|
26352 | }
|
26353 |
|
26354 | function toNum(low, high, isSigned) {
|
26355 | if (isSigned) {
|
26356 | return high * 0x100000000 + (low >>> 0);
|
26357 | }
|
26358 |
|
26359 | return ((high >>> 0) * 0x100000000) + (low >>> 0);
|
26360 | }
|
26361 |
|
26362 | function writeBigVarint(val, pbf) {
|
26363 | var low, high;
|
26364 |
|
26365 | if (val >= 0) {
|
26366 | low = (val % 0x100000000) | 0;
|
26367 | high = (val / 0x100000000) | 0;
|
26368 | } else {
|
26369 | low = ~(-val % 0x100000000);
|
26370 | high = ~(-val / 0x100000000);
|
26371 |
|
26372 | if (low ^ 0xffffffff) {
|
26373 | low = (low + 1) | 0;
|
26374 | } else {
|
26375 | low = 0;
|
26376 | high = (high + 1) | 0;
|
26377 | }
|
26378 | }
|
26379 |
|
26380 | if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
|
26381 | throw new Error('Given varint doesn\'t fit into 10 bytes');
|
26382 | }
|
26383 |
|
26384 | pbf.realloc(10);
|
26385 |
|
26386 | writeBigVarintLow(low, high, pbf);
|
26387 | writeBigVarintHigh(high, pbf);
|
26388 | }
|
26389 |
|
26390 | function writeBigVarintLow(low, high, pbf) {
|
26391 | pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
|
26392 | pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
|
26393 | pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
|
26394 | pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
|
26395 | pbf.buf[pbf.pos] = low & 0x7f;
|
26396 | }
|
26397 |
|
26398 | function writeBigVarintHigh(high, pbf) {
|
26399 | var lsb = (high & 0x07) << 4;
|
26400 |
|
26401 | pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
|
26402 | pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
|
26403 | pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
|
26404 | pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
|
26405 | pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
|
26406 | pbf.buf[pbf.pos++] = high & 0x7f;
|
26407 | }
|
26408 |
|
26409 | function makeRoomForExtraLength(startPos, len, pbf) {
|
26410 | var extraLen =
|
26411 | len <= 0x3fff ? 1 :
|
26412 | len <= 0x1fffff ? 2 :
|
26413 | len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));
|
26414 |
|
26415 | // if 1 byte isn't enough for encoding message length, shift the data to the right
|
26416 | pbf.realloc(extraLen);
|
26417 | for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
|
26418 | }
|
26419 |
|
26420 | function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); }
|
26421 | function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); }
|
26422 | function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); }
|
26423 | function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); }
|
26424 | function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); }
|
26425 | function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); }
|
26426 | function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
|
26427 | function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); }
|
26428 | function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
|
26429 |
|
26430 | // Buffer code below from https://github.com/feross/buffer, MIT-licensed
|
26431 |
|
26432 | function readUInt32(buf, pos) {
|
26433 | return ((buf[pos]) |
|
26434 | (buf[pos + 1] << 8) |
|
26435 | (buf[pos + 2] << 16)) +
|
26436 | (buf[pos + 3] * 0x1000000);
|
26437 | }
|
26438 |
|
26439 | function writeInt32(buf, val, pos) {
|
26440 | buf[pos] = val;
|
26441 | buf[pos + 1] = (val >>> 8);
|
26442 | buf[pos + 2] = (val >>> 16);
|
26443 | buf[pos + 3] = (val >>> 24);
|
26444 | }
|
26445 |
|
26446 | function readInt32(buf, pos) {
|
26447 | return ((buf[pos]) |
|
26448 | (buf[pos + 1] << 8) |
|
26449 | (buf[pos + 2] << 16)) +
|
26450 | (buf[pos + 3] << 24);
|
26451 | }
|
26452 |
|
26453 | function readUtf8(buf, pos, end) {
|
26454 | var str = '';
|
26455 | var i = pos;
|
26456 |
|
26457 | while (i < end) {
|
26458 | var b0 = buf[i];
|
26459 | var c = null; // codepoint
|
26460 | var bytesPerSequence =
|
26461 | b0 > 0xEF ? 4 :
|
26462 | b0 > 0xDF ? 3 :
|
26463 | b0 > 0xBF ? 2 : 1;
|
26464 |
|
26465 | if (i + bytesPerSequence > end) break;
|
26466 |
|
26467 | var b1, b2, b3;
|
26468 |
|
26469 | if (bytesPerSequence === 1) {
|
26470 | if (b0 < 0x80) {
|
26471 | c = b0;
|
26472 | }
|
26473 | } else if (bytesPerSequence === 2) {
|
26474 | b1 = buf[i + 1];
|
26475 | if ((b1 & 0xC0) === 0x80) {
|
26476 | c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
|
26477 | if (c <= 0x7F) {
|
26478 | c = null;
|
26479 | }
|
26480 | }
|
26481 | } else if (bytesPerSequence === 3) {
|
26482 | b1 = buf[i + 1];
|
26483 | b2 = buf[i + 2];
|
26484 | if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
|
26485 | c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
|
26486 | if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
|
26487 | c = null;
|
26488 | }
|
26489 | }
|
26490 | } else if (bytesPerSequence === 4) {
|
26491 | b1 = buf[i + 1];
|
26492 | b2 = buf[i + 2];
|
26493 | b3 = buf[i + 3];
|
26494 | if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
|
26495 | c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
|
26496 | if (c <= 0xFFFF || c >= 0x110000) {
|
26497 | c = null;
|
26498 | }
|
26499 | }
|
26500 | }
|
26501 |
|
26502 | if (c === null) {
|
26503 | c = 0xFFFD;
|
26504 | bytesPerSequence = 1;
|
26505 |
|
26506 | } else if (c > 0xFFFF) {
|
26507 | c -= 0x10000;
|
26508 | str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
|
26509 | c = 0xDC00 | c & 0x3FF;
|
26510 | }
|
26511 |
|
26512 | str += String.fromCharCode(c);
|
26513 | i += bytesPerSequence;
|
26514 | }
|
26515 |
|
26516 | return str;
|
26517 | }
|
26518 |
|
26519 | function readUtf8TextDecoder(buf, pos, end) {
|
26520 | return utf8TextDecoder.decode(buf.subarray(pos, end));
|
26521 | }
|
26522 |
|
26523 | function writeUtf8(buf, str, pos) {
|
26524 | for (var i = 0, c, lead; i < str.length; i++) {
|
26525 | c = str.charCodeAt(i); // code point
|
26526 |
|
26527 | if (c > 0xD7FF && c < 0xE000) {
|
26528 | if (lead) {
|
26529 | if (c < 0xDC00) {
|
26530 | buf[pos++] = 0xEF;
|
26531 | buf[pos++] = 0xBF;
|
26532 | buf[pos++] = 0xBD;
|
26533 | lead = c;
|
26534 | continue;
|
26535 | } else {
|
26536 | c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
|
26537 | lead = null;
|
26538 | }
|
26539 | } else {
|
26540 | if (c > 0xDBFF || (i + 1 === str.length)) {
|
26541 | buf[pos++] = 0xEF;
|
26542 | buf[pos++] = 0xBF;
|
26543 | buf[pos++] = 0xBD;
|
26544 | } else {
|
26545 | lead = c;
|
26546 | }
|
26547 | continue;
|
26548 | }
|
26549 | } else if (lead) {
|
26550 | buf[pos++] = 0xEF;
|
26551 | buf[pos++] = 0xBF;
|
26552 | buf[pos++] = 0xBD;
|
26553 | lead = null;
|
26554 | }
|
26555 |
|
26556 | if (c < 0x80) {
|
26557 | buf[pos++] = c;
|
26558 | } else {
|
26559 | if (c < 0x800) {
|
26560 | buf[pos++] = c >> 0x6 | 0xC0;
|
26561 | } else {
|
26562 | if (c < 0x10000) {
|
26563 | buf[pos++] = c >> 0xC | 0xE0;
|
26564 | } else {
|
26565 | buf[pos++] = c >> 0x12 | 0xF0;
|
26566 | buf[pos++] = c >> 0xC & 0x3F | 0x80;
|
26567 | }
|
26568 | buf[pos++] = c >> 0x6 & 0x3F | 0x80;
|
26569 | }
|
26570 | buf[pos++] = c & 0x3F | 0x80;
|
26571 | }
|
26572 | }
|
26573 | return pos;
|
26574 | }
|
26575 |
|
26576 | const border$1 = 3;
|
26577 | function readFontstacks(tag, glyphs, pbf) {
|
26578 | if (tag === 1) {
|
26579 | pbf.readMessage(readFontstack, glyphs);
|
26580 | }
|
26581 | }
|
26582 | function readFontstack(tag, glyphs, pbf) {
|
26583 | if (tag === 3) {
|
26584 | const { id, bitmap, width, height, left, top, advance } = pbf.readMessage(readGlyph, {});
|
26585 | glyphs.push({
|
26586 | id,
|
26587 | bitmap: new AlphaImage({
|
26588 | width: width + 2 * border$1,
|
26589 | height: height + 2 * border$1
|
26590 | }, bitmap),
|
26591 | metrics: { width, height, left, top, advance }
|
26592 | });
|
26593 | }
|
26594 | }
|
26595 | function readGlyph(tag, glyph, pbf) {
|
26596 | if (tag === 1)
|
26597 | glyph.id = pbf.readVarint();
|
26598 | else if (tag === 2)
|
26599 | glyph.bitmap = pbf.readBytes();
|
26600 | else if (tag === 3)
|
26601 | glyph.width = pbf.readVarint();
|
26602 | else if (tag === 4)
|
26603 | glyph.height = pbf.readVarint();
|
26604 | else if (tag === 5)
|
26605 | glyph.left = pbf.readSVarint();
|
26606 | else if (tag === 6)
|
26607 | glyph.top = pbf.readSVarint();
|
26608 | else if (tag === 7)
|
26609 | glyph.advance = pbf.readVarint();
|
26610 | }
|
26611 | function parseGlyphPBF (data) {
|
26612 | return new pbf(data).readFields(readFontstacks, []);
|
26613 | }
|
26614 | const GLYPH_PBF_BORDER = border$1;
|
26615 |
|
26616 | function potpack(boxes) {
|
26617 |
|
26618 | // calculate total box area and maximum box width
|
26619 | let area = 0;
|
26620 | let maxWidth = 0;
|
26621 |
|
26622 | for (const box of boxes) {
|
26623 | area += box.w * box.h;
|
26624 | maxWidth = Math.max(maxWidth, box.w);
|
26625 | }
|
26626 |
|
26627 | // sort the boxes for insertion by height, descending
|
26628 | boxes.sort((a, b) => b.h - a.h);
|
26629 |
|
26630 | // aim for a squarish resulting container,
|
26631 | // slightly adjusted for sub-100% space utilization
|
26632 | const startWidth = Math.max(Math.ceil(Math.sqrt(area / 0.95)), maxWidth);
|
26633 |
|
26634 | // start with a single empty space, unbounded at the bottom
|
26635 | const spaces = [{x: 0, y: 0, w: startWidth, h: Infinity}];
|
26636 |
|
26637 | let width = 0;
|
26638 | let height = 0;
|
26639 |
|
26640 | for (const box of boxes) {
|
26641 | // look through spaces backwards so that we check smaller spaces first
|
26642 | for (let i = spaces.length - 1; i >= 0; i--) {
|
26643 | const space = spaces[i];
|
26644 |
|
26645 | // look for empty spaces that can accommodate the current box
|
26646 | if (box.w > space.w || box.h > space.h) continue;
|
26647 |
|
26648 | // found the space; add the box to its top-left corner
|
26649 | // |-------|-------|
|
26650 | // | box | |
|
26651 | // |_______| |
|
26652 | // | space |
|
26653 | // |_______________|
|
26654 | box.x = space.x;
|
26655 | box.y = space.y;
|
26656 |
|
26657 | height = Math.max(height, box.y + box.h);
|
26658 | width = Math.max(width, box.x + box.w);
|
26659 |
|
26660 | if (box.w === space.w && box.h === space.h) {
|
26661 | // space matches the box exactly; remove it
|
26662 | const last = spaces.pop();
|
26663 | if (i < spaces.length) spaces[i] = last;
|
26664 |
|
26665 | } else if (box.h === space.h) {
|
26666 | // space matches the box height; update it accordingly
|
26667 | // |-------|---------------|
|
26668 | // | box | updated space |
|
26669 | // |_______|_______________|
|
26670 | space.x += box.w;
|
26671 | space.w -= box.w;
|
26672 |
|
26673 | } else if (box.w === space.w) {
|
26674 | // space matches the box width; update it accordingly
|
26675 | // |---------------|
|
26676 | // | box |
|
26677 | // |_______________|
|
26678 | // | updated space |
|
26679 | // |_______________|
|
26680 | space.y += box.h;
|
26681 | space.h -= box.h;
|
26682 |
|
26683 | } else {
|
26684 | // otherwise the box splits the space into two spaces
|
26685 | // |-------|-----------|
|
26686 | // | box | new space |
|
26687 | // |_______|___________|
|
26688 | // | updated space |
|
26689 | // |___________________|
|
26690 | spaces.push({
|
26691 | x: space.x + box.w,
|
26692 | y: space.y,
|
26693 | w: space.w - box.w,
|
26694 | h: box.h
|
26695 | });
|
26696 | space.y += box.h;
|
26697 | space.h -= box.h;
|
26698 | }
|
26699 | break;
|
26700 | }
|
26701 | }
|
26702 |
|
26703 | return {
|
26704 | w: width, // container width
|
26705 | h: height, // container height
|
26706 | fill: (area / (width * height)) || 0 // space utilization
|
26707 | };
|
26708 | }
|
26709 |
|
26710 | const IMAGE_PADDING = 1;
|
26711 | class ImagePosition {
|
26712 | constructor(paddedRect, { pixelRatio, version, stretchX, stretchY, content }) {
|
26713 | this.paddedRect = paddedRect;
|
26714 | this.pixelRatio = pixelRatio;
|
26715 | this.stretchX = stretchX;
|
26716 | this.stretchY = stretchY;
|
26717 | this.content = content;
|
26718 | this.version = version;
|
26719 | }
|
26720 | get tl() {
|
26721 | return [
|
26722 | this.paddedRect.x + IMAGE_PADDING,
|
26723 | this.paddedRect.y + IMAGE_PADDING
|
26724 | ];
|
26725 | }
|
26726 | get br() {
|
26727 | return [
|
26728 | this.paddedRect.x + this.paddedRect.w - IMAGE_PADDING,
|
26729 | this.paddedRect.y + this.paddedRect.h - IMAGE_PADDING
|
26730 | ];
|
26731 | }
|
26732 | get tlbr() {
|
26733 | return this.tl.concat(this.br);
|
26734 | }
|
26735 | get displaySize() {
|
26736 | return [
|
26737 | (this.paddedRect.w - IMAGE_PADDING * 2) / this.pixelRatio,
|
26738 | (this.paddedRect.h - IMAGE_PADDING * 2) / this.pixelRatio
|
26739 | ];
|
26740 | }
|
26741 | }
|
26742 | class ImageAtlas {
|
26743 | constructor(icons, patterns) {
|
26744 | const iconPositions = {}, patternPositions = {};
|
26745 | this.haveRenderCallbacks = [];
|
26746 | const bins = [];
|
26747 | this.addImages(icons, iconPositions, bins);
|
26748 | this.addImages(patterns, patternPositions, bins);
|
26749 | const { w, h } = potpack(bins);
|
26750 | const image = new RGBAImage({ width: w || 1, height: h || 1 });
|
26751 | for (const id in icons) {
|
26752 | const src = icons[id];
|
26753 | const bin = iconPositions[id].paddedRect;
|
26754 | RGBAImage.copy(src.data, image, { x: 0, y: 0 }, { x: bin.x + IMAGE_PADDING, y: bin.y + IMAGE_PADDING }, src.data);
|
26755 | }
|
26756 | for (const id in patterns) {
|
26757 | const src = patterns[id];
|
26758 | const bin = patternPositions[id].paddedRect;
|
26759 | const x = bin.x + IMAGE_PADDING, y = bin.y + IMAGE_PADDING, w = src.data.width, h = src.data.height;
|
26760 | RGBAImage.copy(src.data, image, { x: 0, y: 0 }, { x, y }, src.data);
|
26761 | // Add 1 pixel wrapped padding on each side of the image.
|
26762 | RGBAImage.copy(src.data, image, { x: 0, y: h - 1 }, { x, y: y - 1 }, { width: w, height: 1 }); // T
|
26763 | RGBAImage.copy(src.data, image, { x: 0, y: 0 }, { x, y: y + h }, { width: w, height: 1 }); // B
|
26764 | RGBAImage.copy(src.data, image, { x: w - 1, y: 0 }, { x: x - 1, y }, { width: 1, height: h }); // L
|
26765 | RGBAImage.copy(src.data, image, { x: 0, y: 0 }, { x: x + w, y }, { width: 1, height: h }); // R
|
26766 | }
|
26767 | this.image = image;
|
26768 | this.iconPositions = iconPositions;
|
26769 | this.patternPositions = patternPositions;
|
26770 | }
|
26771 | addImages(images, positions, bins) {
|
26772 | for (const id in images) {
|
26773 | const src = images[id];
|
26774 | const bin = {
|
26775 | x: 0,
|
26776 | y: 0,
|
26777 | w: src.data.width + 2 * IMAGE_PADDING,
|
26778 | h: src.data.height + 2 * IMAGE_PADDING,
|
26779 | };
|
26780 | bins.push(bin);
|
26781 | positions[id] = new ImagePosition(bin, src);
|
26782 | if (src.hasRenderCallback) {
|
26783 | this.haveRenderCallbacks.push(id);
|
26784 | }
|
26785 | }
|
26786 | }
|
26787 | patchUpdatedImages(imageManager, texture) {
|
26788 | imageManager.dispatchRenderCallbacks(this.haveRenderCallbacks);
|
26789 | for (const name in imageManager.updatedImages) {
|
26790 | this.patchUpdatedImage(this.iconPositions[name], imageManager.getImage(name), texture);
|
26791 | this.patchUpdatedImage(this.patternPositions[name], imageManager.getImage(name), texture);
|
26792 | }
|
26793 | }
|
26794 | patchUpdatedImage(position, image, texture) {
|
26795 | if (!position || !image)
|
26796 | return;
|
26797 | if (position.version === image.version)
|
26798 | return;
|
26799 | position.version = image.version;
|
26800 | const [x, y] = position.tl;
|
26801 | texture.update(image.data, undefined, { x, y });
|
26802 | }
|
26803 | }
|
26804 | register('ImagePosition', ImagePosition);
|
26805 | register('ImageAtlas', ImageAtlas);
|
26806 |
|
26807 | exports.WritingMode = void 0;
|
26808 | (function (WritingMode) {
|
26809 | WritingMode[WritingMode["none"] = 0] = "none";
|
26810 | WritingMode[WritingMode["horizontal"] = 1] = "horizontal";
|
26811 | WritingMode[WritingMode["vertical"] = 2] = "vertical";
|
26812 | WritingMode[WritingMode["horizontalOnly"] = 3] = "horizontalOnly";
|
26813 | })(exports.WritingMode || (exports.WritingMode = {}));
|
26814 | const SHAPING_DEFAULT_OFFSET = -17;
|
26815 | function isEmpty(positionedLines) {
|
26816 | for (const line of positionedLines) {
|
26817 | if (line.positionedGlyphs.length !== 0) {
|
26818 | return false;
|
26819 | }
|
26820 | }
|
26821 | return true;
|
26822 | }
|
26823 | // Max number of images in label is 6401 U+E000–U+F8FF that covers
|
26824 | // Basic Multilingual Plane Unicode Private Use Area (PUA).
|
26825 | const PUAbegin = 0xE000;
|
26826 | const PUAend = 0xF8FF;
|
26827 | class SectionOptions {
|
26828 | constructor() {
|
26829 | this.scale = 1.0;
|
26830 | this.fontStack = '';
|
26831 | this.imageName = null;
|
26832 | }
|
26833 | static forText(scale, fontStack) {
|
26834 | const textOptions = new SectionOptions();
|
26835 | textOptions.scale = scale || 1;
|
26836 | textOptions.fontStack = fontStack;
|
26837 | return textOptions;
|
26838 | }
|
26839 | static forImage(imageName) {
|
26840 | const imageOptions = new SectionOptions();
|
26841 | imageOptions.imageName = imageName;
|
26842 | return imageOptions;
|
26843 | }
|
26844 | }
|
26845 | class TaggedString {
|
26846 | constructor() {
|
26847 | this.text = '';
|
26848 | this.sectionIndex = [];
|
26849 | this.sections = [];
|
26850 | this.imageSectionID = null;
|
26851 | }
|
26852 | static fromFeature(text, defaultFontStack) {
|
26853 | const result = new TaggedString();
|
26854 | for (let i = 0; i < text.sections.length; i++) {
|
26855 | const section = text.sections[i];
|
26856 | if (!section.image) {
|
26857 | result.addTextSection(section, defaultFontStack);
|
26858 | }
|
26859 | else {
|
26860 | result.addImageSection(section);
|
26861 | }
|
26862 | }
|
26863 | return result;
|
26864 | }
|
26865 | length() {
|
26866 | return this.text.length;
|
26867 | }
|
26868 | getSection(index) {
|
26869 | return this.sections[this.sectionIndex[index]];
|
26870 | }
|
26871 | getSectionIndex(index) {
|
26872 | return this.sectionIndex[index];
|
26873 | }
|
26874 | getCharCode(index) {
|
26875 | return this.text.charCodeAt(index);
|
26876 | }
|
26877 | verticalizePunctuation() {
|
26878 | this.text = verticalizePunctuation(this.text);
|
26879 | }
|
26880 | trim() {
|
26881 | let beginningWhitespace = 0;
|
26882 | for (let i = 0; i < this.text.length && whitespace[this.text.charCodeAt(i)]; i++) {
|
26883 | beginningWhitespace++;
|
26884 | }
|
26885 | let trailingWhitespace = this.text.length;
|
26886 | for (let i = this.text.length - 1; i >= 0 && i >= beginningWhitespace && whitespace[this.text.charCodeAt(i)]; i--) {
|
26887 | trailingWhitespace--;
|
26888 | }
|
26889 | this.text = this.text.substring(beginningWhitespace, trailingWhitespace);
|
26890 | this.sectionIndex = this.sectionIndex.slice(beginningWhitespace, trailingWhitespace);
|
26891 | }
|
26892 | substring(start, end) {
|
26893 | const substring = new TaggedString();
|
26894 | substring.text = this.text.substring(start, end);
|
26895 | substring.sectionIndex = this.sectionIndex.slice(start, end);
|
26896 | substring.sections = this.sections;
|
26897 | return substring;
|
26898 | }
|
26899 | toString() {
|
26900 | return this.text;
|
26901 | }
|
26902 | getMaxScale() {
|
26903 | return this.sectionIndex.reduce((max, index) => Math.max(max, this.sections[index].scale), 0);
|
26904 | }
|
26905 | addTextSection(section, defaultFontStack) {
|
26906 | this.text += section.text;
|
26907 | this.sections.push(SectionOptions.forText(section.scale, section.fontStack || defaultFontStack));
|
26908 | const index = this.sections.length - 1;
|
26909 | for (let i = 0; i < section.text.length; ++i) {
|
26910 | this.sectionIndex.push(index);
|
26911 | }
|
26912 | }
|
26913 | addImageSection(section) {
|
26914 | const imageName = section.image ? section.image.name : '';
|
26915 | if (imageName.length === 0) {
|
26916 | warnOnce('Can\'t add FormattedSection with an empty image.');
|
26917 | return;
|
26918 | }
|
26919 | const nextImageSectionCharCode = this.getNextImageSectionCharCode();
|
26920 | if (!nextImageSectionCharCode) {
|
26921 | warnOnce(`Reached maximum number of images ${PUAend - PUAbegin + 2}`);
|
26922 | return;
|
26923 | }
|
26924 | this.text += String.fromCharCode(nextImageSectionCharCode);
|
26925 | this.sections.push(SectionOptions.forImage(imageName));
|
26926 | this.sectionIndex.push(this.sections.length - 1);
|
26927 | }
|
26928 | getNextImageSectionCharCode() {
|
26929 | if (!this.imageSectionID) {
|
26930 | this.imageSectionID = PUAbegin;
|
26931 | return this.imageSectionID;
|
26932 | }
|
26933 | if (this.imageSectionID >= PUAend)
|
26934 | return null;
|
26935 | return ++this.imageSectionID;
|
26936 | }
|
26937 | }
|
26938 | function breakLines(input, lineBreakPoints) {
|
26939 | const lines = [];
|
26940 | const text = input.text;
|
26941 | let start = 0;
|
26942 | for (const lineBreak of lineBreakPoints) {
|
26943 | lines.push(input.substring(start, lineBreak));
|
26944 | start = lineBreak;
|
26945 | }
|
26946 | if (start < text.length) {
|
26947 | lines.push(input.substring(start, text.length));
|
26948 | }
|
26949 | return lines;
|
26950 | }
|
26951 | function shapeText(text, glyphMap, glyphPositions, imagePositions, defaultFontStack, maxWidth, lineHeight, textAnchor, textJustify, spacing, translate, writingMode, allowVerticalPlacement, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom) {
|
26952 | const logicalInput = TaggedString.fromFeature(text, defaultFontStack);
|
26953 | if (writingMode === exports.WritingMode.vertical) {
|
26954 | logicalInput.verticalizePunctuation();
|
26955 | }
|
26956 | let lines;
|
26957 | const { processBidirectionalText, processStyledBidirectionalText } = plugin;
|
26958 | if (processBidirectionalText && logicalInput.sections.length === 1) {
|
26959 | // Bidi doesn't have to be style-aware
|
26960 | lines = [];
|
26961 | const untaggedLines = processBidirectionalText(logicalInput.toString(), determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize));
|
26962 | for (const line of untaggedLines) {
|
26963 | const taggedLine = new TaggedString();
|
26964 | taggedLine.text = line;
|
26965 | taggedLine.sections = logicalInput.sections;
|
26966 | for (let i = 0; i < line.length; i++) {
|
26967 | taggedLine.sectionIndex.push(0);
|
26968 | }
|
26969 | lines.push(taggedLine);
|
26970 | }
|
26971 | }
|
26972 | else if (processStyledBidirectionalText) {
|
26973 | // Need version of mapbox-gl-rtl-text with style support for combining RTL text
|
26974 | // with formatting
|
26975 | lines = [];
|
26976 | const processedLines = processStyledBidirectionalText(logicalInput.text, logicalInput.sectionIndex, determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize));
|
26977 | for (const line of processedLines) {
|
26978 | const taggedLine = new TaggedString();
|
26979 | taggedLine.text = line[0];
|
26980 | taggedLine.sectionIndex = line[1];
|
26981 | taggedLine.sections = logicalInput.sections;
|
26982 | lines.push(taggedLine);
|
26983 | }
|
26984 | }
|
26985 | else {
|
26986 | lines = breakLines(logicalInput, determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize));
|
26987 | }
|
26988 | const positionedLines = [];
|
26989 | const shaping = {
|
26990 | positionedLines,
|
26991 | text: logicalInput.toString(),
|
26992 | top: translate[1],
|
26993 | bottom: translate[1],
|
26994 | left: translate[0],
|
26995 | right: translate[0],
|
26996 | writingMode,
|
26997 | iconsInText: false,
|
26998 | verticalizable: false
|
26999 | };
|
27000 | shapeLines(shaping, glyphMap, glyphPositions, imagePositions, lines, lineHeight, textAnchor, textJustify, writingMode, spacing, allowVerticalPlacement, layoutTextSizeThisZoom);
|
27001 | if (isEmpty(positionedLines))
|
27002 | return false;
|
27003 | return shaping;
|
27004 | }
|
27005 | // using computed properties due to https://github.com/facebook/flow/issues/380
|
27006 | /* eslint no-useless-computed-key: 0 */
|
27007 | const whitespace = {
|
27008 | [0x09]: true,
|
27009 | [0x0a]: true,
|
27010 | [0x0b]: true,
|
27011 | [0x0c]: true,
|
27012 | [0x0d]: true,
|
27013 | [0x20]: true, // space
|
27014 | };
|
27015 | const breakable = {
|
27016 | [0x0a]: true,
|
27017 | [0x20]: true,
|
27018 | [0x26]: true,
|
27019 | [0x28]: true,
|
27020 | [0x29]: true,
|
27021 | [0x2b]: true,
|
27022 | [0x2d]: true,
|
27023 | [0x2f]: true,
|
27024 | [0xad]: true,
|
27025 | [0xb7]: true,
|
27026 | [0x200b]: true,
|
27027 | [0x2010]: true,
|
27028 | [0x2013]: true,
|
27029 | [0x2027]: true // interpunct
|
27030 | // Many other characters may be reasonable breakpoints
|
27031 | // Consider "neutral orientation" characters at scriptDetection.charHasNeutralVerticalOrientation
|
27032 | // See https://github.com/mapbox/mapbox-gl-js/issues/3658
|
27033 | };
|
27034 | function getGlyphAdvance(codePoint, section, glyphMap, imagePositions, spacing, layoutTextSize) {
|
27035 | if (!section.imageName) {
|
27036 | const positions = glyphMap[section.fontStack];
|
27037 | const glyph = positions && positions[codePoint];
|
27038 | if (!glyph)
|
27039 | return 0;
|
27040 | return glyph.metrics.advance * section.scale + spacing;
|
27041 | }
|
27042 | else {
|
27043 | const imagePosition = imagePositions[section.imageName];
|
27044 | if (!imagePosition)
|
27045 | return 0;
|
27046 | return imagePosition.displaySize[0] * section.scale * ONE_EM / layoutTextSize + spacing;
|
27047 | }
|
27048 | }
|
27049 | function determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphMap, imagePositions, layoutTextSize) {
|
27050 | let totalWidth = 0;
|
27051 | for (let index = 0; index < logicalInput.length(); index++) {
|
27052 | const section = logicalInput.getSection(index);
|
27053 | totalWidth += getGlyphAdvance(logicalInput.getCharCode(index), section, glyphMap, imagePositions, spacing, layoutTextSize);
|
27054 | }
|
27055 | const lineCount = Math.max(1, Math.ceil(totalWidth / maxWidth));
|
27056 | return totalWidth / lineCount;
|
27057 | }
|
27058 | function calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) {
|
27059 | const raggedness = Math.pow(lineWidth - targetWidth, 2);
|
27060 | if (isLastBreak) {
|
27061 | // Favor finals lines shorter than average over longer than average
|
27062 | if (lineWidth < targetWidth) {
|
27063 | return raggedness / 2;
|
27064 | }
|
27065 | else {
|
27066 | return raggedness * 2;
|
27067 | }
|
27068 | }
|
27069 | return raggedness + Math.abs(penalty) * penalty;
|
27070 | }
|
27071 | function calculatePenalty(codePoint, nextCodePoint, penalizableIdeographicBreak) {
|
27072 | let penalty = 0;
|
27073 | // Force break on newline
|
27074 | if (codePoint === 0x0a) {
|
27075 | penalty -= 10000;
|
27076 | }
|
27077 | // Penalize breaks between characters that allow ideographic breaking because
|
27078 | // they are less preferable than breaks at spaces (or zero width spaces).
|
27079 | if (penalizableIdeographicBreak) {
|
27080 | penalty += 150;
|
27081 | }
|
27082 | // Penalize open parenthesis at end of line
|
27083 | if (codePoint === 0x28 || codePoint === 0xff08) {
|
27084 | penalty += 50;
|
27085 | }
|
27086 | // Penalize close parenthesis at beginning of line
|
27087 | if (nextCodePoint === 0x29 || nextCodePoint === 0xff09) {
|
27088 | penalty += 50;
|
27089 | }
|
27090 | return penalty;
|
27091 | }
|
27092 | function evaluateBreak(breakIndex, breakX, targetWidth, potentialBreaks, penalty, isLastBreak) {
|
27093 | // We could skip evaluating breaks where the line length (breakX - priorBreak.x) > maxWidth
|
27094 | // ...but in fact we allow lines longer than maxWidth (if there's no break points)
|
27095 | // ...and when targetWidth and maxWidth are close, strictly enforcing maxWidth can give
|
27096 | // more lopsided results.
|
27097 | let bestPriorBreak = null;
|
27098 | let bestBreakBadness = calculateBadness(breakX, targetWidth, penalty, isLastBreak);
|
27099 | for (const potentialBreak of potentialBreaks) {
|
27100 | const lineWidth = breakX - potentialBreak.x;
|
27101 | const breakBadness = calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) + potentialBreak.badness;
|
27102 | if (breakBadness <= bestBreakBadness) {
|
27103 | bestPriorBreak = potentialBreak;
|
27104 | bestBreakBadness = breakBadness;
|
27105 | }
|
27106 | }
|
27107 | return {
|
27108 | index: breakIndex,
|
27109 | x: breakX,
|
27110 | priorBreak: bestPriorBreak,
|
27111 | badness: bestBreakBadness
|
27112 | };
|
27113 | }
|
27114 | function leastBadBreaks(lastLineBreak) {
|
27115 | if (!lastLineBreak) {
|
27116 | return [];
|
27117 | }
|
27118 | return leastBadBreaks(lastLineBreak.priorBreak).concat(lastLineBreak.index);
|
27119 | }
|
27120 | function determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize) {
|
27121 | if (symbolPlacement !== 'point')
|
27122 | return [];
|
27123 | if (!logicalInput)
|
27124 | return [];
|
27125 | const potentialLineBreaks = [];
|
27126 | const targetWidth = determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphMap, imagePositions, layoutTextSize);
|
27127 | const hasServerSuggestedBreakpoints = logicalInput.text.indexOf('\u200b') >= 0;
|
27128 | let currentX = 0;
|
27129 | for (let i = 0; i < logicalInput.length(); i++) {
|
27130 | const section = logicalInput.getSection(i);
|
27131 | const codePoint = logicalInput.getCharCode(i);
|
27132 | if (!whitespace[codePoint])
|
27133 | currentX += getGlyphAdvance(codePoint, section, glyphMap, imagePositions, spacing, layoutTextSize);
|
27134 | // Ideographic characters, spaces, and word-breaking punctuation that often appear without
|
27135 | // surrounding spaces.
|
27136 | if ((i < logicalInput.length() - 1)) {
|
27137 | const ideographicBreak = charAllowsIdeographicBreaking(codePoint);
|
27138 | if (breakable[codePoint] || ideographicBreak || section.imageName) {
|
27139 | potentialLineBreaks.push(evaluateBreak(i + 1, currentX, targetWidth, potentialLineBreaks, calculatePenalty(codePoint, logicalInput.getCharCode(i + 1), ideographicBreak && hasServerSuggestedBreakpoints), false));
|
27140 | }
|
27141 | }
|
27142 | }
|
27143 | return leastBadBreaks(evaluateBreak(logicalInput.length(), currentX, targetWidth, potentialLineBreaks, 0, true));
|
27144 | }
|
27145 | function getAnchorAlignment(anchor) {
|
27146 | let horizontalAlign = 0.5, verticalAlign = 0.5;
|
27147 | switch (anchor) {
|
27148 | case 'right':
|
27149 | case 'top-right':
|
27150 | case 'bottom-right':
|
27151 | horizontalAlign = 1;
|
27152 | break;
|
27153 | case 'left':
|
27154 | case 'top-left':
|
27155 | case 'bottom-left':
|
27156 | horizontalAlign = 0;
|
27157 | break;
|
27158 | }
|
27159 | switch (anchor) {
|
27160 | case 'bottom':
|
27161 | case 'bottom-right':
|
27162 | case 'bottom-left':
|
27163 | verticalAlign = 1;
|
27164 | break;
|
27165 | case 'top':
|
27166 | case 'top-right':
|
27167 | case 'top-left':
|
27168 | verticalAlign = 0;
|
27169 | break;
|
27170 | }
|
27171 | return { horizontalAlign, verticalAlign };
|
27172 | }
|
27173 | function shapeLines(shaping, glyphMap, glyphPositions, imagePositions, lines, lineHeight, textAnchor, textJustify, writingMode, spacing, allowVerticalPlacement, layoutTextSizeThisZoom) {
|
27174 | let x = 0;
|
27175 | let y = SHAPING_DEFAULT_OFFSET;
|
27176 | let maxLineLength = 0;
|
27177 | let maxLineHeight = 0;
|
27178 | const justify = textJustify === 'right' ? 1 :
|
27179 | textJustify === 'left' ? 0 : 0.5;
|
27180 | let lineIndex = 0;
|
27181 | for (const line of lines) {
|
27182 | line.trim();
|
27183 | const lineMaxScale = line.getMaxScale();
|
27184 | const maxLineOffset = (lineMaxScale - 1) * ONE_EM;
|
27185 | const positionedLine = { positionedGlyphs: [], lineOffset: 0 };
|
27186 | shaping.positionedLines[lineIndex] = positionedLine;
|
27187 | const positionedGlyphs = positionedLine.positionedGlyphs;
|
27188 | let lineOffset = 0.0;
|
27189 | if (!line.length()) {
|
27190 | y += lineHeight; // Still need a line feed after empty line
|
27191 | ++lineIndex;
|
27192 | continue;
|
27193 | }
|
27194 | for (let i = 0; i < line.length(); i++) {
|
27195 | const section = line.getSection(i);
|
27196 | const sectionIndex = line.getSectionIndex(i);
|
27197 | const codePoint = line.getCharCode(i);
|
27198 | let baselineOffset = 0.0;
|
27199 | let metrics = null;
|
27200 | let rect = null;
|
27201 | let imageName = null;
|
27202 | let verticalAdvance = ONE_EM;
|
27203 | const vertical = !(writingMode === exports.WritingMode.horizontal ||
|
27204 | // Don't verticalize glyphs that have no upright orientation if vertical placement is disabled.
|
27205 | (!allowVerticalPlacement && !charHasUprightVerticalOrientation(codePoint)) ||
|
27206 | // If vertical placement is enabled, don't verticalize glyphs that
|
27207 | // are from complex text layout script, or whitespaces.
|
27208 | (allowVerticalPlacement && (whitespace[codePoint] || charInComplexShapingScript(codePoint))));
|
27209 | if (!section.imageName) {
|
27210 | const positions = glyphPositions[section.fontStack];
|
27211 | const glyphPosition = positions && positions[codePoint];
|
27212 | if (glyphPosition && glyphPosition.rect) {
|
27213 | rect = glyphPosition.rect;
|
27214 | metrics = glyphPosition.metrics;
|
27215 | }
|
27216 | else {
|
27217 | const glyphs = glyphMap[section.fontStack];
|
27218 | const glyph = glyphs && glyphs[codePoint];
|
27219 | if (!glyph)
|
27220 | continue;
|
27221 | metrics = glyph.metrics;
|
27222 | }
|
27223 | // We don't know the baseline, but since we're laying out
|
27224 | // at 24 points, we can calculate how much it will move when
|
27225 | // we scale up or down.
|
27226 | baselineOffset = (lineMaxScale - section.scale) * ONE_EM;
|
27227 | }
|
27228 | else {
|
27229 | const imagePosition = imagePositions[section.imageName];
|
27230 | if (!imagePosition)
|
27231 | continue;
|
27232 | imageName = section.imageName;
|
27233 | shaping.iconsInText = shaping.iconsInText || true;
|
27234 | rect = imagePosition.paddedRect;
|
27235 | const size = imagePosition.displaySize;
|
27236 | // If needed, allow to set scale factor for an image using
|
27237 | // alias "image-scale" that could be alias for "font-scale"
|
27238 | // when FormattedSection is an image section.
|
27239 | section.scale = section.scale * ONE_EM / layoutTextSizeThisZoom;
|
27240 | metrics = { width: size[0],
|
27241 | height: size[1],
|
27242 | left: IMAGE_PADDING,
|
27243 | top: -GLYPH_PBF_BORDER,
|
27244 | advance: vertical ? size[1] : size[0] };
|
27245 | // Difference between one EM and an image size.
|
27246 | // Aligns bottom of an image to a baseline level.
|
27247 | const imageOffset = ONE_EM - size[1] * section.scale;
|
27248 | baselineOffset = maxLineOffset + imageOffset;
|
27249 | verticalAdvance = metrics.advance;
|
27250 | // Difference between height of an image and one EM at max line scale.
|
27251 | // Pushes current line down if an image size is over 1 EM at max line scale.
|
27252 | const offset = vertical ? size[0] * section.scale - ONE_EM * lineMaxScale :
|
27253 | size[1] * section.scale - ONE_EM * lineMaxScale;
|
27254 | if (offset > 0 && offset > lineOffset) {
|
27255 | lineOffset = offset;
|
27256 | }
|
27257 | }
|
27258 | if (!vertical) {
|
27259 | positionedGlyphs.push({ glyph: codePoint, imageName, x, y: y + baselineOffset, vertical, scale: section.scale, fontStack: section.fontStack, sectionIndex, metrics, rect });
|
27260 | x += metrics.advance * section.scale + spacing;
|
27261 | }
|
27262 | else {
|
27263 | shaping.verticalizable = true;
|
27264 | positionedGlyphs.push({ glyph: codePoint, imageName, x, y: y + baselineOffset, vertical, scale: section.scale, fontStack: section.fontStack, sectionIndex, metrics, rect });
|
27265 | x += verticalAdvance * section.scale + spacing;
|
27266 | }
|
27267 | }
|
27268 | // Only justify if we placed at least one glyph
|
27269 | if (positionedGlyphs.length !== 0) {
|
27270 | const lineLength = x - spacing;
|
27271 | maxLineLength = Math.max(lineLength, maxLineLength);
|
27272 | justifyLine(positionedGlyphs, 0, positionedGlyphs.length - 1, justify, lineOffset);
|
27273 | }
|
27274 | x = 0;
|
27275 | const currentLineHeight = lineHeight * lineMaxScale + lineOffset;
|
27276 | positionedLine.lineOffset = Math.max(lineOffset, maxLineOffset);
|
27277 | y += currentLineHeight;
|
27278 | maxLineHeight = Math.max(currentLineHeight, maxLineHeight);
|
27279 | ++lineIndex;
|
27280 | }
|
27281 | // Calculate the bounding box and justify / align text block.
|
27282 | const height = y - SHAPING_DEFAULT_OFFSET;
|
27283 | const { horizontalAlign, verticalAlign } = getAnchorAlignment(textAnchor);
|
27284 | align(shaping.positionedLines, justify, horizontalAlign, verticalAlign, maxLineLength, maxLineHeight, lineHeight, height, lines.length);
|
27285 | shaping.top += -verticalAlign * height;
|
27286 | shaping.bottom = shaping.top + height;
|
27287 | shaping.left += -horizontalAlign * maxLineLength;
|
27288 | shaping.right = shaping.left + maxLineLength;
|
27289 | }
|
27290 | // justify right = 1, left = 0, center = 0.5
|
27291 | function justifyLine(positionedGlyphs, start, end, justify, lineOffset) {
|
27292 | if (!justify && !lineOffset)
|
27293 | return;
|
27294 | const lastPositionedGlyph = positionedGlyphs[end];
|
27295 | const lastAdvance = lastPositionedGlyph.metrics.advance * lastPositionedGlyph.scale;
|
27296 | const lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify;
|
27297 | for (let j = start; j <= end; j++) {
|
27298 | positionedGlyphs[j].x -= lineIndent;
|
27299 | positionedGlyphs[j].y += lineOffset;
|
27300 | }
|
27301 | }
|
27302 | function align(positionedLines, justify, horizontalAlign, verticalAlign, maxLineLength, maxLineHeight, lineHeight, blockHeight, lineCount) {
|
27303 | const shiftX = (justify - horizontalAlign) * maxLineLength;
|
27304 | let shiftY = 0;
|
27305 | if (maxLineHeight !== lineHeight) {
|
27306 | shiftY = -blockHeight * verticalAlign - SHAPING_DEFAULT_OFFSET;
|
27307 | }
|
27308 | else {
|
27309 | shiftY = (-verticalAlign * lineCount + 0.5) * lineHeight;
|
27310 | }
|
27311 | for (const line of positionedLines) {
|
27312 | for (const positionedGlyph of line.positionedGlyphs) {
|
27313 | positionedGlyph.x += shiftX;
|
27314 | positionedGlyph.y += shiftY;
|
27315 | }
|
27316 | }
|
27317 | }
|
27318 | function shapeIcon(image, iconOffset, iconAnchor) {
|
27319 | const { horizontalAlign, verticalAlign } = getAnchorAlignment(iconAnchor);
|
27320 | const dx = iconOffset[0];
|
27321 | const dy = iconOffset[1];
|
27322 | const x1 = dx - image.displaySize[0] * horizontalAlign;
|
27323 | const x2 = x1 + image.displaySize[0];
|
27324 | const y1 = dy - image.displaySize[1] * verticalAlign;
|
27325 | const y2 = y1 + image.displaySize[1];
|
27326 | return { image, top: y1, bottom: y2, left: x1, right: x2 };
|
27327 | }
|
27328 | function fitIconToText(shapedIcon, shapedText, textFit, padding, iconOffset, fontScale) {
|
27329 | assert$1(textFit !== 'none');
|
27330 | assert$1(Array.isArray(padding) && padding.length === 4);
|
27331 | assert$1(Array.isArray(iconOffset) && iconOffset.length === 2);
|
27332 | const image = shapedIcon.image;
|
27333 | let collisionPadding;
|
27334 | if (image.content) {
|
27335 | const content = image.content;
|
27336 | const pixelRatio = image.pixelRatio || 1;
|
27337 | collisionPadding = [
|
27338 | content[0] / pixelRatio,
|
27339 | content[1] / pixelRatio,
|
27340 | image.displaySize[0] - content[2] / pixelRatio,
|
27341 | image.displaySize[1] - content[3] / pixelRatio
|
27342 | ];
|
27343 | }
|
27344 | // We don't respect the icon-anchor, because icon-text-fit is set. Instead,
|
27345 | // the icon will be centered on the text, then stretched in the given
|
27346 | // dimensions.
|
27347 | const textLeft = shapedText.left * fontScale;
|
27348 | const textRight = shapedText.right * fontScale;
|
27349 | let top, right, bottom, left;
|
27350 | if (textFit === 'width' || textFit === 'both') {
|
27351 | // Stretched horizontally to the text width
|
27352 | left = iconOffset[0] + textLeft - padding[3];
|
27353 | right = iconOffset[0] + textRight + padding[1];
|
27354 | }
|
27355 | else {
|
27356 | // Centered on the text
|
27357 | left = iconOffset[0] + (textLeft + textRight - image.displaySize[0]) / 2;
|
27358 | right = left + image.displaySize[0];
|
27359 | }
|
27360 | const textTop = shapedText.top * fontScale;
|
27361 | const textBottom = shapedText.bottom * fontScale;
|
27362 | if (textFit === 'height' || textFit === 'both') {
|
27363 | // Stretched vertically to the text height
|
27364 | top = iconOffset[1] + textTop - padding[0];
|
27365 | bottom = iconOffset[1] + textBottom + padding[2];
|
27366 | }
|
27367 | else {
|
27368 | // Centered on the text
|
27369 | top = iconOffset[1] + (textTop + textBottom - image.displaySize[1]) / 2;
|
27370 | bottom = top + image.displaySize[1];
|
27371 | }
|
27372 | return { image, top, right, bottom, left, collisionPadding };
|
27373 | }
|
27374 |
|
27375 | const SIZE_PACK_FACTOR = 128;
|
27376 | // For {text,icon}-size, get the bucket-level data that will be needed by
|
27377 | // the painter to set symbol-size-related uniforms
|
27378 | function getSizeData(tileZoom, value) {
|
27379 | const { expression } = value;
|
27380 | if (expression.kind === 'constant') {
|
27381 | const layoutSize = expression.evaluate(new EvaluationParameters(tileZoom + 1));
|
27382 | return { kind: 'constant', layoutSize };
|
27383 | }
|
27384 | else if (expression.kind === 'source') {
|
27385 | return { kind: 'source' };
|
27386 | }
|
27387 | else {
|
27388 | const { zoomStops, interpolationType } = expression;
|
27389 | // calculate covering zoom stops for zoom-dependent values
|
27390 | let lower = 0;
|
27391 | while (lower < zoomStops.length && zoomStops[lower] <= tileZoom)
|
27392 | lower++;
|
27393 | lower = Math.max(0, lower - 1);
|
27394 | let upper = lower;
|
27395 | while (upper < zoomStops.length && zoomStops[upper] < tileZoom + 1)
|
27396 | upper++;
|
27397 | upper = Math.min(zoomStops.length - 1, upper);
|
27398 | const minZoom = zoomStops[lower];
|
27399 | const maxZoom = zoomStops[upper];
|
27400 | // We'd like to be able to use CameraExpression or CompositeExpression in these
|
27401 | // return types rather than ExpressionSpecification, but the former are not
|
27402 | // transferrable across Web Worker boundaries.
|
27403 | if (expression.kind === 'composite') {
|
27404 | return { kind: 'composite', minZoom, maxZoom, interpolationType };
|
27405 | }
|
27406 | // for camera functions, also save off the function values
|
27407 | // evaluated at the covering zoom levels
|
27408 | const minSize = expression.evaluate(new EvaluationParameters(minZoom));
|
27409 | const maxSize = expression.evaluate(new EvaluationParameters(maxZoom));
|
27410 | return { kind: 'camera', minZoom, maxZoom, minSize, maxSize, interpolationType };
|
27411 | }
|
27412 | }
|
27413 | function evaluateSizeForFeature(sizeData, { uSize, uSizeT }, { lowerSize, upperSize }) {
|
27414 | if (sizeData.kind === 'source') {
|
27415 | return lowerSize / SIZE_PACK_FACTOR;
|
27416 | }
|
27417 | else if (sizeData.kind === 'composite') {
|
27418 | return number(lowerSize / SIZE_PACK_FACTOR, upperSize / SIZE_PACK_FACTOR, uSizeT);
|
27419 | }
|
27420 | return uSize;
|
27421 | }
|
27422 | function evaluateSizeForZoom(sizeData, zoom) {
|
27423 | let uSizeT = 0;
|
27424 | let uSize = 0;
|
27425 | if (sizeData.kind === 'constant') {
|
27426 | uSize = sizeData.layoutSize;
|
27427 | }
|
27428 | else if (sizeData.kind !== 'source') {
|
27429 | const { interpolationType, minZoom, maxZoom } = sizeData;
|
27430 | // Even though we could get the exact value of the camera function
|
27431 | // at z = tr.zoom, we intentionally do not: instead, we interpolate
|
27432 | // between the camera function values at a pair of zoom stops covering
|
27433 | // [tileZoom, tileZoom + 1] in order to be consistent with this
|
27434 | // restriction on composite functions
|
27435 | const t = !interpolationType ? 0 : clamp(Interpolate.interpolationFactor(interpolationType, zoom, minZoom, maxZoom), 0, 1);
|
27436 | if (sizeData.kind === 'camera') {
|
27437 | uSize = number(sizeData.minSize, sizeData.maxSize, t);
|
27438 | }
|
27439 | else {
|
27440 | uSizeT = t;
|
27441 | }
|
27442 | }
|
27443 | return { uSizeT, uSize };
|
27444 | }
|
27445 |
|
27446 | class Anchor extends pointGeometry {
|
27447 | constructor(x, y, angle, segment) {
|
27448 | super(x, y);
|
27449 | this.angle = angle;
|
27450 | if (segment !== undefined) {
|
27451 | this.segment = segment;
|
27452 | }
|
27453 | }
|
27454 | clone() {
|
27455 | return new Anchor(this.x, this.y, this.angle, this.segment);
|
27456 | }
|
27457 | }
|
27458 | register('Anchor', Anchor);
|
27459 |
|
27460 | /**
|
27461 | * Labels placed around really sharp angles aren't readable. Check if any
|
27462 | * part of the potential label has a combined angle that is too big.
|
27463 | *
|
27464 | * @param line
|
27465 | * @param anchor The point on the line around which the label is anchored.
|
27466 | * @param labelLength The length of the label in geometry units.
|
27467 | * @param windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big.
|
27468 | * @param maxAngle The maximum combined angle that any window along the label is allowed to have.
|
27469 | *
|
27470 | * @returns {boolean} whether the label should be placed
|
27471 | * @private
|
27472 | */
|
27473 | function checkMaxAngle(line, anchor, labelLength, windowSize, maxAngle) {
|
27474 | // horizontal labels always pass
|
27475 | if (anchor.segment === undefined)
|
27476 | return true;
|
27477 | let p = anchor;
|
27478 | let index = anchor.segment + 1;
|
27479 | let anchorDistance = 0;
|
27480 | // move backwards along the line to the first segment the label appears on
|
27481 | while (anchorDistance > -labelLength / 2) {
|
27482 | index--;
|
27483 | // there isn't enough room for the label after the beginning of the line
|
27484 | if (index < 0)
|
27485 | return false;
|
27486 | anchorDistance -= line[index].dist(p);
|
27487 | p = line[index];
|
27488 | }
|
27489 | anchorDistance += line[index].dist(line[index + 1]);
|
27490 | index++;
|
27491 | // store recent corners and their total angle difference
|
27492 | const recentCorners = [];
|
27493 | let recentAngleDelta = 0;
|
27494 | // move forwards by the length of the label and check angles along the way
|
27495 | while (anchorDistance < labelLength / 2) {
|
27496 | const prev = line[index - 1];
|
27497 | const current = line[index];
|
27498 | const next = line[index + 1];
|
27499 | // there isn't enough room for the label before the end of the line
|
27500 | if (!next)
|
27501 | return false;
|
27502 | let angleDelta = prev.angleTo(current) - current.angleTo(next);
|
27503 | // restrict angle to -pi..pi range
|
27504 | angleDelta = Math.abs(((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI);
|
27505 | recentCorners.push({
|
27506 | distance: anchorDistance,
|
27507 | angleDelta
|
27508 | });
|
27509 | recentAngleDelta += angleDelta;
|
27510 | // remove corners that are far enough away from the list of recent anchors
|
27511 | while (anchorDistance - recentCorners[0].distance > windowSize) {
|
27512 | recentAngleDelta -= recentCorners.shift().angleDelta;
|
27513 | }
|
27514 | // the sum of angles within the window area exceeds the maximum allowed value. check fails.
|
27515 | if (recentAngleDelta > maxAngle)
|
27516 | return false;
|
27517 | index++;
|
27518 | anchorDistance += current.dist(next);
|
27519 | }
|
27520 | // no part of the line had an angle greater than the maximum allowed. check passes.
|
27521 | return true;
|
27522 | }
|
27523 |
|
27524 | function getLineLength(line) {
|
27525 | let lineLength = 0;
|
27526 | for (let k = 0; k < line.length - 1; k++) {
|
27527 | lineLength += line[k].dist(line[k + 1]);
|
27528 | }
|
27529 | return lineLength;
|
27530 | }
|
27531 | function getAngleWindowSize(shapedText, glyphSize, boxScale) {
|
27532 | return shapedText ?
|
27533 | 3 / 5 * glyphSize * boxScale :
|
27534 | 0;
|
27535 | }
|
27536 | function getShapedLabelLength(shapedText, shapedIcon) {
|
27537 | return Math.max(shapedText ? shapedText.right - shapedText.left : 0, shapedIcon ? shapedIcon.right - shapedIcon.left : 0);
|
27538 | }
|
27539 | function getCenterAnchor(line, maxAngle, shapedText, shapedIcon, glyphSize, boxScale) {
|
27540 | const angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale);
|
27541 | const labelLength = getShapedLabelLength(shapedText, shapedIcon) * boxScale;
|
27542 | let prevDistance = 0;
|
27543 | const centerDistance = getLineLength(line) / 2;
|
27544 | for (let i = 0; i < line.length - 1; i++) {
|
27545 | const a = line[i], b = line[i + 1];
|
27546 | const segmentDistance = a.dist(b);
|
27547 | if (prevDistance + segmentDistance > centerDistance) {
|
27548 | // The center is on this segment
|
27549 | const t = (centerDistance - prevDistance) / segmentDistance, x = number(a.x, b.x, t), y = number(a.y, b.y, t);
|
27550 | const anchor = new Anchor(x, y, b.angleTo(a), i);
|
27551 | anchor._round();
|
27552 | if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) {
|
27553 | return anchor;
|
27554 | }
|
27555 | else {
|
27556 | return;
|
27557 | }
|
27558 | }
|
27559 | prevDistance += segmentDistance;
|
27560 | }
|
27561 | }
|
27562 | function getAnchors(line, spacing, maxAngle, shapedText, shapedIcon, glyphSize, boxScale, overscaling, tileExtent) {
|
27563 | // Resample a line to get anchor points for labels and check that each
|
27564 | // potential label passes text-max-angle check and has enough froom to fit
|
27565 | // on the line.
|
27566 | const angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale);
|
27567 | const shapedLabelLength = getShapedLabelLength(shapedText, shapedIcon);
|
27568 | const labelLength = shapedLabelLength * boxScale;
|
27569 | // Is the line continued from outside the tile boundary?
|
27570 | const isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent;
|
27571 | // Is the label long, relative to the spacing?
|
27572 | // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges.
|
27573 | if (spacing - labelLength < spacing / 4) {
|
27574 | spacing = labelLength + spacing / 4;
|
27575 | }
|
27576 | // Offset the first anchor by:
|
27577 | // Either half the label length plus a fixed extra offset if the line is not continued
|
27578 | // Or half the spacing if the line is continued.
|
27579 | // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections.
|
27580 | const fixedExtraOffset = glyphSize * 2;
|
27581 | const offset = !isLineContinued ?
|
27582 | ((shapedLabelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing :
|
27583 | (spacing / 2 * overscaling) % spacing;
|
27584 | return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, false, tileExtent);
|
27585 | }
|
27586 | function resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) {
|
27587 | const halfLabelLength = labelLength / 2;
|
27588 | const lineLength = getLineLength(line);
|
27589 | let distance = 0, markedDistance = offset - spacing;
|
27590 | let anchors = [];
|
27591 | for (let i = 0; i < line.length - 1; i++) {
|
27592 | const a = line[i], b = line[i + 1];
|
27593 | const segmentDist = a.dist(b), angle = b.angleTo(a);
|
27594 | while (markedDistance + spacing < distance + segmentDist) {
|
27595 | markedDistance += spacing;
|
27596 | const t = (markedDistance - distance) / segmentDist, x = number(a.x, b.x, t), y = number(a.y, b.y, t);
|
27597 | // Check that the point is within the tile boundaries and that
|
27598 | // the label would fit before the beginning and end of the line
|
27599 | // if placed at this point.
|
27600 | if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent &&
|
27601 | markedDistance - halfLabelLength >= 0 &&
|
27602 | markedDistance + halfLabelLength <= lineLength) {
|
27603 | const anchor = new Anchor(x, y, angle, i);
|
27604 | anchor._round();
|
27605 | if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) {
|
27606 | anchors.push(anchor);
|
27607 | }
|
27608 | }
|
27609 | }
|
27610 | distance += segmentDist;
|
27611 | }
|
27612 | if (!placeAtMiddle && !anchors.length && !isLineContinued) {
|
27613 | // The first attempt at finding anchors at which labels can be placed failed.
|
27614 | // Try again, but this time just try placing one anchor at the middle of the line.
|
27615 | // This has the most effect for short lines in overscaled tiles, since the
|
27616 | // initial offset used in overscaled tiles is calculated to align labels with positions in
|
27617 | // parent tiles instead of placing the label as close to the beginning as possible.
|
27618 | anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent);
|
27619 | }
|
27620 | return anchors;
|
27621 | }
|
27622 |
|
27623 | /**
|
27624 | * Returns the part of a multiline that intersects with the provided rectangular box.
|
27625 | *
|
27626 | * @param lines
|
27627 | * @param x1 the left edge of the box
|
27628 | * @param y1 the top edge of the box
|
27629 | * @param x2 the right edge of the box
|
27630 | * @param y2 the bottom edge of the box
|
27631 | * @returns lines
|
27632 | * @private
|
27633 | */
|
27634 | function clipLine(lines, x1, y1, x2, y2) {
|
27635 | const clippedLines = [];
|
27636 | for (let l = 0; l < lines.length; l++) {
|
27637 | const line = lines[l];
|
27638 | let clippedLine;
|
27639 | for (let i = 0; i < line.length - 1; i++) {
|
27640 | let p0 = line[i];
|
27641 | let p1 = line[i + 1];
|
27642 | if (p0.x < x1 && p1.x < x1) {
|
27643 | continue;
|
27644 | }
|
27645 | else if (p0.x < x1) {
|
27646 | p0 = new pointGeometry(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();
|
27647 | }
|
27648 | else if (p1.x < x1) {
|
27649 | p1 = new pointGeometry(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();
|
27650 | }
|
27651 | if (p0.y < y1 && p1.y < y1) {
|
27652 | continue;
|
27653 | }
|
27654 | else if (p0.y < y1) {
|
27655 | p0 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();
|
27656 | }
|
27657 | else if (p1.y < y1) {
|
27658 | p1 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();
|
27659 | }
|
27660 | if (p0.x >= x2 && p1.x >= x2) {
|
27661 | continue;
|
27662 | }
|
27663 | else if (p0.x >= x2) {
|
27664 | p0 = new pointGeometry(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();
|
27665 | }
|
27666 | else if (p1.x >= x2) {
|
27667 | p1 = new pointGeometry(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();
|
27668 | }
|
27669 | if (p0.y >= y2 && p1.y >= y2) {
|
27670 | continue;
|
27671 | }
|
27672 | else if (p0.y >= y2) {
|
27673 | p0 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();
|
27674 | }
|
27675 | else if (p1.y >= y2) {
|
27676 | p1 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();
|
27677 | }
|
27678 | if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) {
|
27679 | clippedLine = [p0];
|
27680 | clippedLines.push(clippedLine);
|
27681 | }
|
27682 | clippedLine.push(p1);
|
27683 | }
|
27684 | }
|
27685 | return clippedLines;
|
27686 | }
|
27687 |
|
27688 | // If you have a 10px icon that isn't perfectly aligned to the pixel grid it will cover 11 actual
|
27689 | // pixels. The quad needs to be padded to account for this, otherwise they'll look slightly clipped
|
27690 | // on one edge in some cases.
|
27691 | const border = IMAGE_PADDING;
|
27692 | /**
|
27693 | * Create the quads used for rendering an icon.
|
27694 | * @private
|
27695 | */
|
27696 | function getIconQuads(shapedIcon, iconRotate, isSDFIcon, hasIconTextFit) {
|
27697 | const quads = [];
|
27698 | const image = shapedIcon.image;
|
27699 | const pixelRatio = image.pixelRatio;
|
27700 | const imageWidth = image.paddedRect.w - 2 * border;
|
27701 | const imageHeight = image.paddedRect.h - 2 * border;
|
27702 | const iconWidth = shapedIcon.right - shapedIcon.left;
|
27703 | const iconHeight = shapedIcon.bottom - shapedIcon.top;
|
27704 | const stretchX = image.stretchX || [[0, imageWidth]];
|
27705 | const stretchY = image.stretchY || [[0, imageHeight]];
|
27706 | const reduceRanges = (sum, range) => sum + range[1] - range[0];
|
27707 | const stretchWidth = stretchX.reduce(reduceRanges, 0);
|
27708 | const stretchHeight = stretchY.reduce(reduceRanges, 0);
|
27709 | const fixedWidth = imageWidth - stretchWidth;
|
27710 | const fixedHeight = imageHeight - stretchHeight;
|
27711 | let stretchOffsetX = 0;
|
27712 | let stretchContentWidth = stretchWidth;
|
27713 | let stretchOffsetY = 0;
|
27714 | let stretchContentHeight = stretchHeight;
|
27715 | let fixedOffsetX = 0;
|
27716 | let fixedContentWidth = fixedWidth;
|
27717 | let fixedOffsetY = 0;
|
27718 | let fixedContentHeight = fixedHeight;
|
27719 | if (image.content && hasIconTextFit) {
|
27720 | const content = image.content;
|
27721 | stretchOffsetX = sumWithinRange(stretchX, 0, content[0]);
|
27722 | stretchOffsetY = sumWithinRange(stretchY, 0, content[1]);
|
27723 | stretchContentWidth = sumWithinRange(stretchX, content[0], content[2]);
|
27724 | stretchContentHeight = sumWithinRange(stretchY, content[1], content[3]);
|
27725 | fixedOffsetX = content[0] - stretchOffsetX;
|
27726 | fixedOffsetY = content[1] - stretchOffsetY;
|
27727 | fixedContentWidth = content[2] - content[0] - stretchContentWidth;
|
27728 | fixedContentHeight = content[3] - content[1] - stretchContentHeight;
|
27729 | }
|
27730 | const makeBox = (left, top, right, bottom) => {
|
27731 | const leftEm = getEmOffset(left.stretch - stretchOffsetX, stretchContentWidth, iconWidth, shapedIcon.left);
|
27732 | const leftPx = getPxOffset(left.fixed - fixedOffsetX, fixedContentWidth, left.stretch, stretchWidth);
|
27733 | const topEm = getEmOffset(top.stretch - stretchOffsetY, stretchContentHeight, iconHeight, shapedIcon.top);
|
27734 | const topPx = getPxOffset(top.fixed - fixedOffsetY, fixedContentHeight, top.stretch, stretchHeight);
|
27735 | const rightEm = getEmOffset(right.stretch - stretchOffsetX, stretchContentWidth, iconWidth, shapedIcon.left);
|
27736 | const rightPx = getPxOffset(right.fixed - fixedOffsetX, fixedContentWidth, right.stretch, stretchWidth);
|
27737 | const bottomEm = getEmOffset(bottom.stretch - stretchOffsetY, stretchContentHeight, iconHeight, shapedIcon.top);
|
27738 | const bottomPx = getPxOffset(bottom.fixed - fixedOffsetY, fixedContentHeight, bottom.stretch, stretchHeight);
|
27739 | const tl = new pointGeometry(leftEm, topEm);
|
27740 | const tr = new pointGeometry(rightEm, topEm);
|
27741 | const br = new pointGeometry(rightEm, bottomEm);
|
27742 | const bl = new pointGeometry(leftEm, bottomEm);
|
27743 | const pixelOffsetTL = new pointGeometry(leftPx / pixelRatio, topPx / pixelRatio);
|
27744 | const pixelOffsetBR = new pointGeometry(rightPx / pixelRatio, bottomPx / pixelRatio);
|
27745 | const angle = iconRotate * Math.PI / 180;
|
27746 | if (angle) {
|
27747 | const sin = Math.sin(angle), cos = Math.cos(angle), matrix = [cos, -sin, sin, cos];
|
27748 | tl._matMult(matrix);
|
27749 | tr._matMult(matrix);
|
27750 | bl._matMult(matrix);
|
27751 | br._matMult(matrix);
|
27752 | }
|
27753 | const x1 = left.stretch + left.fixed;
|
27754 | const x2 = right.stretch + right.fixed;
|
27755 | const y1 = top.stretch + top.fixed;
|
27756 | const y2 = bottom.stretch + bottom.fixed;
|
27757 | const subRect = {
|
27758 | x: image.paddedRect.x + border + x1,
|
27759 | y: image.paddedRect.y + border + y1,
|
27760 | w: x2 - x1,
|
27761 | h: y2 - y1
|
27762 | };
|
27763 | const minFontScaleX = fixedContentWidth / pixelRatio / iconWidth;
|
27764 | const minFontScaleY = fixedContentHeight / pixelRatio / iconHeight;
|
27765 | // Icon quad is padded, so texture coordinates also need to be padded.
|
27766 | return { tl, tr, bl, br, tex: subRect, writingMode: undefined, glyphOffset: [0, 0], sectionIndex: 0, pixelOffsetTL, pixelOffsetBR, minFontScaleX, minFontScaleY, isSDF: isSDFIcon };
|
27767 | };
|
27768 | if (!hasIconTextFit || (!image.stretchX && !image.stretchY)) {
|
27769 | quads.push(makeBox({ fixed: 0, stretch: -1 }, { fixed: 0, stretch: -1 }, { fixed: 0, stretch: imageWidth + 1 }, { fixed: 0, stretch: imageHeight + 1 }));
|
27770 | }
|
27771 | else {
|
27772 | const xCuts = stretchZonesToCuts(stretchX, fixedWidth, stretchWidth);
|
27773 | const yCuts = stretchZonesToCuts(stretchY, fixedHeight, stretchHeight);
|
27774 | for (let xi = 0; xi < xCuts.length - 1; xi++) {
|
27775 | const x1 = xCuts[xi];
|
27776 | const x2 = xCuts[xi + 1];
|
27777 | for (let yi = 0; yi < yCuts.length - 1; yi++) {
|
27778 | const y1 = yCuts[yi];
|
27779 | const y2 = yCuts[yi + 1];
|
27780 | quads.push(makeBox(x1, y1, x2, y2));
|
27781 | }
|
27782 | }
|
27783 | }
|
27784 | return quads;
|
27785 | }
|
27786 | function sumWithinRange(ranges, min, max) {
|
27787 | let sum = 0;
|
27788 | for (const range of ranges) {
|
27789 | sum += Math.max(min, Math.min(max, range[1])) - Math.max(min, Math.min(max, range[0]));
|
27790 | }
|
27791 | return sum;
|
27792 | }
|
27793 | function stretchZonesToCuts(stretchZones, fixedSize, stretchSize) {
|
27794 | const cuts = [{ fixed: -border, stretch: 0 }];
|
27795 | for (const [c1, c2] of stretchZones) {
|
27796 | const last = cuts[cuts.length - 1];
|
27797 | cuts.push({
|
27798 | fixed: c1 - last.stretch,
|
27799 | stretch: last.stretch
|
27800 | });
|
27801 | cuts.push({
|
27802 | fixed: c1 - last.stretch,
|
27803 | stretch: last.stretch + (c2 - c1)
|
27804 | });
|
27805 | }
|
27806 | cuts.push({
|
27807 | fixed: fixedSize + border,
|
27808 | stretch: stretchSize
|
27809 | });
|
27810 | return cuts;
|
27811 | }
|
27812 | function getEmOffset(stretchOffset, stretchSize, iconSize, iconOffset) {
|
27813 | return stretchOffset / stretchSize * iconSize + iconOffset;
|
27814 | }
|
27815 | function getPxOffset(fixedOffset, fixedSize, stretchOffset, stretchSize) {
|
27816 | return fixedOffset - fixedSize * stretchOffset / stretchSize;
|
27817 | }
|
27818 | /**
|
27819 | * Create the quads used for rendering a text label.
|
27820 | * @private
|
27821 | */
|
27822 | function getGlyphQuads(anchor, shaping, textOffset, layer, alongLine, feature, imageMap, allowVerticalPlacement) {
|
27823 | const textRotate = layer.layout.get('text-rotate').evaluate(feature, {}) * Math.PI / 180;
|
27824 | const quads = [];
|
27825 | for (const line of shaping.positionedLines) {
|
27826 | for (const positionedGlyph of line.positionedGlyphs) {
|
27827 | if (!positionedGlyph.rect)
|
27828 | continue;
|
27829 | const textureRect = positionedGlyph.rect || {};
|
27830 | // The rects have an additional buffer that is not included in their size.
|
27831 | const glyphPadding = 1.0;
|
27832 | let rectBuffer = GLYPH_PBF_BORDER + glyphPadding;
|
27833 | let isSDF = true;
|
27834 | let pixelRatio = 1.0;
|
27835 | let lineOffset = 0.0;
|
27836 | const rotateVerticalGlyph = (alongLine || allowVerticalPlacement) && positionedGlyph.vertical;
|
27837 | const halfAdvance = positionedGlyph.metrics.advance * positionedGlyph.scale / 2;
|
27838 | // Align images and scaled glyphs in the middle of a vertical line.
|
27839 | if (allowVerticalPlacement && shaping.verticalizable) {
|
27840 | const scaledGlyphOffset = (positionedGlyph.scale - 1) * ONE_EM;
|
27841 | const imageOffset = (ONE_EM - positionedGlyph.metrics.width * positionedGlyph.scale) / 2;
|
27842 | lineOffset = line.lineOffset / 2 - (positionedGlyph.imageName ? -imageOffset : scaledGlyphOffset);
|
27843 | }
|
27844 | if (positionedGlyph.imageName) {
|
27845 | const image = imageMap[positionedGlyph.imageName];
|
27846 | isSDF = image.sdf;
|
27847 | pixelRatio = image.pixelRatio;
|
27848 | rectBuffer = IMAGE_PADDING / pixelRatio;
|
27849 | }
|
27850 | const glyphOffset = alongLine ?
|
27851 | [positionedGlyph.x + halfAdvance, positionedGlyph.y] :
|
27852 | [0, 0];
|
27853 | let builtInOffset = alongLine ?
|
27854 | [0, 0] :
|
27855 | [positionedGlyph.x + halfAdvance + textOffset[0], positionedGlyph.y + textOffset[1] - lineOffset];
|
27856 | let verticalizedLabelOffset = [0, 0];
|
27857 | if (rotateVerticalGlyph) {
|
27858 | // Vertical POI labels that are rotated 90deg CW and whose glyphs must preserve upright orientation
|
27859 | // need to be rotated 90deg CCW. After a quad is rotated, it is translated to the original built-in offset.
|
27860 | verticalizedLabelOffset = builtInOffset;
|
27861 | builtInOffset = [0, 0];
|
27862 | }
|
27863 | const x1 = (positionedGlyph.metrics.left - rectBuffer) * positionedGlyph.scale - halfAdvance + builtInOffset[0];
|
27864 | const y1 = (-positionedGlyph.metrics.top - rectBuffer) * positionedGlyph.scale + builtInOffset[1];
|
27865 | const x2 = x1 + textureRect.w * positionedGlyph.scale / pixelRatio;
|
27866 | const y2 = y1 + textureRect.h * positionedGlyph.scale / pixelRatio;
|
27867 | const tl = new pointGeometry(x1, y1);
|
27868 | const tr = new pointGeometry(x2, y1);
|
27869 | const bl = new pointGeometry(x1, y2);
|
27870 | const br = new pointGeometry(x2, y2);
|
27871 | if (rotateVerticalGlyph) {
|
27872 | // Vertical-supporting glyphs are laid out in 24x24 point boxes (1 square em)
|
27873 | // In horizontal orientation, the y values for glyphs are below the midline
|
27874 | // and we use a "yOffset" of -17 to pull them up to the middle.
|
27875 | // By rotating counter-clockwise around the point at the center of the left
|
27876 | // edge of a 24x24 layout box centered below the midline, we align the center
|
27877 | // of the glyphs with the horizontal midline, so the yOffset is no longer
|
27878 | // necessary, but we also pull the glyph to the left along the x axis.
|
27879 | // The y coordinate includes baseline yOffset, thus needs to be accounted
|
27880 | // for when glyph is rotated and translated.
|
27881 | const center = new pointGeometry(-halfAdvance, halfAdvance - SHAPING_DEFAULT_OFFSET);
|
27882 | const verticalRotation = -Math.PI / 2;
|
27883 | // xHalfWidthOffsetCorrection is a difference between full-width and half-width
|
27884 | // advance, should be 0 for full-width glyphs and will pull up half-width glyphs.
|
27885 | const xHalfWidthOffsetCorrection = ONE_EM / 2 - halfAdvance;
|
27886 | const yImageOffsetCorrection = positionedGlyph.imageName ? xHalfWidthOffsetCorrection : 0.0;
|
27887 | const halfWidthOffsetCorrection = new pointGeometry(5 - SHAPING_DEFAULT_OFFSET - xHalfWidthOffsetCorrection, -yImageOffsetCorrection);
|
27888 | const verticalOffsetCorrection = new pointGeometry(...verticalizedLabelOffset);
|
27889 | tl._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection);
|
27890 | tr._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection);
|
27891 | bl._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection);
|
27892 | br._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection);
|
27893 | }
|
27894 | if (textRotate) {
|
27895 | const sin = Math.sin(textRotate), cos = Math.cos(textRotate), matrix = [cos, -sin, sin, cos];
|
27896 | tl._matMult(matrix);
|
27897 | tr._matMult(matrix);
|
27898 | bl._matMult(matrix);
|
27899 | br._matMult(matrix);
|
27900 | }
|
27901 | const pixelOffsetTL = new pointGeometry(0, 0);
|
27902 | const pixelOffsetBR = new pointGeometry(0, 0);
|
27903 | const minFontScaleX = 0;
|
27904 | const minFontScaleY = 0;
|
27905 | quads.push({ tl, tr, bl, br, tex: textureRect, writingMode: shaping.writingMode, glyphOffset, sectionIndex: positionedGlyph.sectionIndex, isSDF, pixelOffsetTL, pixelOffsetBR, minFontScaleX, minFontScaleY });
|
27906 | }
|
27907 | }
|
27908 | return quads;
|
27909 | }
|
27910 |
|
27911 | /**
|
27912 | * A CollisionFeature represents the area of the tile covered by a single label.
|
27913 | * It is used with CollisionIndex to check if the label overlaps with any
|
27914 | * previous labels. A CollisionFeature is mostly just a set of CollisionBox
|
27915 | * objects.
|
27916 | *
|
27917 | * @private
|
27918 | */
|
27919 | class CollisionFeature {
|
27920 | /**
|
27921 | * Create a CollisionFeature, adding its collision box data to the given collisionBoxArray in the process.
|
27922 | * For line aligned labels a collision circle diameter is computed instead.
|
27923 | *
|
27924 | * @param anchor The point along the line around which the label is anchored.
|
27925 | * @param shaped The text or icon shaping results.
|
27926 | * @param boxScale A magic number used to convert from glyph metrics units to geometry units.
|
27927 | * @param padding The amount of padding to add around the label edges.
|
27928 | * @param alignLine Whether the label is aligned with the line or the viewport.
|
27929 | * @private
|
27930 | */
|
27931 | constructor(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaped, boxScale, padding, alignLine, rotate) {
|
27932 | this.boxStartIndex = collisionBoxArray.length;
|
27933 | if (alignLine) {
|
27934 | // Compute height of the shape in glyph metrics and apply collision padding.
|
27935 | // Note that the pixel based 'text-padding' is applied at runtime
|
27936 | let top = shaped.top;
|
27937 | let bottom = shaped.bottom;
|
27938 | const collisionPadding = shaped.collisionPadding;
|
27939 | if (collisionPadding) {
|
27940 | top -= collisionPadding[1];
|
27941 | bottom += collisionPadding[3];
|
27942 | }
|
27943 | let height = bottom - top;
|
27944 | if (height > 0) {
|
27945 | // set minimum box height to avoid very many small labels
|
27946 | height = Math.max(10, height);
|
27947 | this.circleDiameter = height;
|
27948 | }
|
27949 | }
|
27950 | else {
|
27951 | let y1 = shaped.top * boxScale - padding;
|
27952 | let y2 = shaped.bottom * boxScale + padding;
|
27953 | let x1 = shaped.left * boxScale - padding;
|
27954 | let x2 = shaped.right * boxScale + padding;
|
27955 | const collisionPadding = shaped.collisionPadding;
|
27956 | if (collisionPadding) {
|
27957 | x1 -= collisionPadding[0] * boxScale;
|
27958 | y1 -= collisionPadding[1] * boxScale;
|
27959 | x2 += collisionPadding[2] * boxScale;
|
27960 | y2 += collisionPadding[3] * boxScale;
|
27961 | }
|
27962 | if (rotate) {
|
27963 | // Account for *-rotate in point collision boxes
|
27964 | // See https://github.com/mapbox/mapbox-gl-js/issues/6075
|
27965 | // Doesn't account for icon-text-fit
|
27966 | const tl = new pointGeometry(x1, y1);
|
27967 | const tr = new pointGeometry(x2, y1);
|
27968 | const bl = new pointGeometry(x1, y2);
|
27969 | const br = new pointGeometry(x2, y2);
|
27970 | const rotateRadians = rotate * Math.PI / 180;
|
27971 | tl._rotate(rotateRadians);
|
27972 | tr._rotate(rotateRadians);
|
27973 | bl._rotate(rotateRadians);
|
27974 | br._rotate(rotateRadians);
|
27975 | // Collision features require an "on-axis" geometry,
|
27976 | // so take the envelope of the rotated geometry
|
27977 | // (may be quite large for wide labels rotated 45 degrees)
|
27978 | x1 = Math.min(tl.x, tr.x, bl.x, br.x);
|
27979 | x2 = Math.max(tl.x, tr.x, bl.x, br.x);
|
27980 | y1 = Math.min(tl.y, tr.y, bl.y, br.y);
|
27981 | y2 = Math.max(tl.y, tr.y, bl.y, br.y);
|
27982 | }
|
27983 | collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, featureIndex, sourceLayerIndex, bucketIndex);
|
27984 | }
|
27985 | this.boxEndIndex = collisionBoxArray.length;
|
27986 | }
|
27987 | }
|
27988 |
|
27989 | class TinyQueue {
|
27990 | constructor(data = [], compare = defaultCompare) {
|
27991 | this.data = data;
|
27992 | this.length = this.data.length;
|
27993 | this.compare = compare;
|
27994 |
|
27995 | if (this.length > 0) {
|
27996 | for (let i = (this.length >> 1) - 1; i >= 0; i--) this._down(i);
|
27997 | }
|
27998 | }
|
27999 |
|
28000 | push(item) {
|
28001 | this.data.push(item);
|
28002 | this.length++;
|
28003 | this._up(this.length - 1);
|
28004 | }
|
28005 |
|
28006 | pop() {
|
28007 | if (this.length === 0) return undefined;
|
28008 |
|
28009 | const top = this.data[0];
|
28010 | const bottom = this.data.pop();
|
28011 | this.length--;
|
28012 |
|
28013 | if (this.length > 0) {
|
28014 | this.data[0] = bottom;
|
28015 | this._down(0);
|
28016 | }
|
28017 |
|
28018 | return top;
|
28019 | }
|
28020 |
|
28021 | peek() {
|
28022 | return this.data[0];
|
28023 | }
|
28024 |
|
28025 | _up(pos) {
|
28026 | const {data, compare} = this;
|
28027 | const item = data[pos];
|
28028 |
|
28029 | while (pos > 0) {
|
28030 | const parent = (pos - 1) >> 1;
|
28031 | const current = data[parent];
|
28032 | if (compare(item, current) >= 0) break;
|
28033 | data[pos] = current;
|
28034 | pos = parent;
|
28035 | }
|
28036 |
|
28037 | data[pos] = item;
|
28038 | }
|
28039 |
|
28040 | _down(pos) {
|
28041 | const {data, compare} = this;
|
28042 | const halfLength = this.length >> 1;
|
28043 | const item = data[pos];
|
28044 |
|
28045 | while (pos < halfLength) {
|
28046 | let left = (pos << 1) + 1;
|
28047 | let best = data[left];
|
28048 | const right = left + 1;
|
28049 |
|
28050 | if (right < this.length && compare(data[right], best) < 0) {
|
28051 | left = right;
|
28052 | best = data[right];
|
28053 | }
|
28054 | if (compare(best, item) >= 0) break;
|
28055 |
|
28056 | data[pos] = best;
|
28057 | pos = left;
|
28058 | }
|
28059 |
|
28060 | data[pos] = item;
|
28061 | }
|
28062 | }
|
28063 |
|
28064 | function defaultCompare(a, b) {
|
28065 | return a < b ? -1 : a > b ? 1 : 0;
|
28066 | }
|
28067 |
|
28068 | /**
|
28069 | * Finds an approximation of a polygon's Pole Of Inaccessibiliy https://en.wikipedia.org/wiki/Pole_of_inaccessibility
|
28070 | * This is a copy of http://github.com/mapbox/polylabel adapted to use Points
|
28071 | *
|
28072 | * @param polygonRings first item in array is the outer ring followed optionally by the list of holes, should be an element of the result of util/classify_rings
|
28073 | * @param precision Specified in input coordinate units. If 0 returns after first run, if > 0 repeatedly narrows the search space until the radius of the area searched for the best pole is less than precision
|
28074 | * @param debug Print some statistics to the console during execution
|
28075 | * @returns Pole of Inaccessibiliy.
|
28076 | * @private
|
28077 | */
|
28078 | function findPoleOfInaccessibility (polygonRings, precision = 1, debug = false) {
|
28079 | // find the bounding box of the outer ring
|
28080 | let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
28081 | const outerRing = polygonRings[0];
|
28082 | for (let i = 0; i < outerRing.length; i++) {
|
28083 | const p = outerRing[i];
|
28084 | if (!i || p.x < minX)
|
28085 | minX = p.x;
|
28086 | if (!i || p.y < minY)
|
28087 | minY = p.y;
|
28088 | if (!i || p.x > maxX)
|
28089 | maxX = p.x;
|
28090 | if (!i || p.y > maxY)
|
28091 | maxY = p.y;
|
28092 | }
|
28093 | const width = maxX - minX;
|
28094 | const height = maxY - minY;
|
28095 | const cellSize = Math.min(width, height);
|
28096 | let h = cellSize / 2;
|
28097 | // a priority queue of cells in order of their "potential" (max distance to polygon)
|
28098 | const cellQueue = new TinyQueue([], compareMax);
|
28099 | if (cellSize === 0)
|
28100 | return new pointGeometry(minX, minY);
|
28101 | // cover polygon with initial cells
|
28102 | for (let x = minX; x < maxX; x += cellSize) {
|
28103 | for (let y = minY; y < maxY; y += cellSize) {
|
28104 | cellQueue.push(new Cell(x + h, y + h, h, polygonRings));
|
28105 | }
|
28106 | }
|
28107 | // take centroid as the first best guess
|
28108 | let bestCell = getCentroidCell(polygonRings);
|
28109 | let numProbes = cellQueue.length;
|
28110 | while (cellQueue.length) {
|
28111 | // pick the most promising cell from the queue
|
28112 | const cell = cellQueue.pop();
|
28113 | // update the best cell if we found a better one
|
28114 | if (cell.d > bestCell.d || !bestCell.d) {
|
28115 | bestCell = cell;
|
28116 | if (debug)
|
28117 | console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes);
|
28118 | }
|
28119 | // do not drill down further if there's no chance of a better solution
|
28120 | if (cell.max - bestCell.d <= precision)
|
28121 | continue;
|
28122 | // split the cell into four cells
|
28123 | h = cell.h / 2;
|
28124 | cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings));
|
28125 | cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings));
|
28126 | cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings));
|
28127 | cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings));
|
28128 | numProbes += 4;
|
28129 | }
|
28130 | if (debug) {
|
28131 | console.log(`num probes: ${numProbes}`);
|
28132 | console.log(`best distance: ${bestCell.d}`);
|
28133 | }
|
28134 | return bestCell.p;
|
28135 | }
|
28136 | function compareMax(a, b) {
|
28137 | return b.max - a.max;
|
28138 | }
|
28139 | function Cell(x, y, h, polygon) {
|
28140 | this.p = new pointGeometry(x, y);
|
28141 | this.h = h; // half the cell size
|
28142 | this.d = pointToPolygonDist(this.p, polygon); // distance from cell center to polygon
|
28143 | this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell
|
28144 | }
|
28145 | // signed distance from point to polygon outline (negative if point is outside)
|
28146 | function pointToPolygonDist(p, polygon) {
|
28147 | let inside = false;
|
28148 | let minDistSq = Infinity;
|
28149 | for (let k = 0; k < polygon.length; k++) {
|
28150 | const ring = polygon[k];
|
28151 | for (let i = 0, len = ring.length, j = len - 1; i < len; j = i++) {
|
28152 | const a = ring[i];
|
28153 | const b = ring[j];
|
28154 | if ((a.y > p.y !== b.y > p.y) &&
|
28155 | (p.x < (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x))
|
28156 | inside = !inside;
|
28157 | minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b));
|
28158 | }
|
28159 | }
|
28160 | return (inside ? 1 : -1) * Math.sqrt(minDistSq);
|
28161 | }
|
28162 | // get polygon centroid
|
28163 | function getCentroidCell(polygon) {
|
28164 | let area = 0;
|
28165 | let x = 0;
|
28166 | let y = 0;
|
28167 | const points = polygon[0];
|
28168 | for (let i = 0, len = points.length, j = len - 1; i < len; j = i++) {
|
28169 | const a = points[i];
|
28170 | const b = points[j];
|
28171 | const f = a.x * b.y - b.x * a.y;
|
28172 | x += (a.x + b.x) * f;
|
28173 | y += (a.y + b.y) * f;
|
28174 | area += f * 3;
|
28175 | }
|
28176 | return new Cell(x / area, y / area, 0, polygon);
|
28177 | }
|
28178 |
|
28179 | // The radial offset is to the edge of the text box
|
28180 | // In the horizontal direction, the edge of the text box is where glyphs start
|
28181 | // But in the vertical direction, the glyphs appear to "start" at the baseline
|
28182 | // We don't actually load baseline data, but we assume an offset of ONE_EM - 17
|
28183 | // (see "yOffset" in shaping.js)
|
28184 | const baselineOffset = 7;
|
28185 | const INVALID_TEXT_OFFSET = Number.POSITIVE_INFINITY;
|
28186 | function evaluateVariableOffset(anchor, offset) {
|
28187 | function fromRadialOffset(anchor, radialOffset) {
|
28188 | let x = 0, y = 0;
|
28189 | if (radialOffset < 0)
|
28190 | radialOffset = 0; // Ignore negative offset.
|
28191 | // solve for r where r^2 + r^2 = radialOffset^2
|
28192 | const hypotenuse = radialOffset / Math.sqrt(2);
|
28193 | switch (anchor) {
|
28194 | case 'top-right':
|
28195 | case 'top-left':
|
28196 | y = hypotenuse - baselineOffset;
|
28197 | break;
|
28198 | case 'bottom-right':
|
28199 | case 'bottom-left':
|
28200 | y = -hypotenuse + baselineOffset;
|
28201 | break;
|
28202 | case 'bottom':
|
28203 | y = -radialOffset + baselineOffset;
|
28204 | break;
|
28205 | case 'top':
|
28206 | y = radialOffset - baselineOffset;
|
28207 | break;
|
28208 | }
|
28209 | switch (anchor) {
|
28210 | case 'top-right':
|
28211 | case 'bottom-right':
|
28212 | x = -hypotenuse;
|
28213 | break;
|
28214 | case 'top-left':
|
28215 | case 'bottom-left':
|
28216 | x = hypotenuse;
|
28217 | break;
|
28218 | case 'left':
|
28219 | x = radialOffset;
|
28220 | break;
|
28221 | case 'right':
|
28222 | x = -radialOffset;
|
28223 | break;
|
28224 | }
|
28225 | return [x, y];
|
28226 | }
|
28227 | function fromTextOffset(anchor, offsetX, offsetY) {
|
28228 | let x = 0, y = 0;
|
28229 | // Use absolute offset values.
|
28230 | offsetX = Math.abs(offsetX);
|
28231 | offsetY = Math.abs(offsetY);
|
28232 | switch (anchor) {
|
28233 | case 'top-right':
|
28234 | case 'top-left':
|
28235 | case 'top':
|
28236 | y = offsetY - baselineOffset;
|
28237 | break;
|
28238 | case 'bottom-right':
|
28239 | case 'bottom-left':
|
28240 | case 'bottom':
|
28241 | y = -offsetY + baselineOffset;
|
28242 | break;
|
28243 | }
|
28244 | switch (anchor) {
|
28245 | case 'top-right':
|
28246 | case 'bottom-right':
|
28247 | case 'right':
|
28248 | x = -offsetX;
|
28249 | break;
|
28250 | case 'top-left':
|
28251 | case 'bottom-left':
|
28252 | case 'left':
|
28253 | x = offsetX;
|
28254 | break;
|
28255 | }
|
28256 | return [x, y];
|
28257 | }
|
28258 | return (offset[1] !== INVALID_TEXT_OFFSET) ? fromTextOffset(anchor, offset[0], offset[1]) : fromRadialOffset(anchor, offset[0]);
|
28259 | }
|
28260 | function performSymbolLayout(bucket, glyphMap, glyphPositions, imageMap, imagePositions, showCollisionBoxes, canonical) {
|
28261 | bucket.createArrays();
|
28262 | const tileSize = 512 * bucket.overscaling;
|
28263 | bucket.tilePixelRatio = EXTENT / tileSize;
|
28264 | bucket.compareText = {};
|
28265 | bucket.iconsNeedLinear = false;
|
28266 | const layout = bucket.layers[0].layout;
|
28267 | const unevaluatedLayoutValues = bucket.layers[0]._unevaluatedLayout._values;
|
28268 | const sizes = {
|
28269 | // Filled in below, if *SizeData.kind is 'composite'
|
28270 | // compositeIconSizes: undefined,
|
28271 | // compositeTextSizes: undefined,
|
28272 | layoutIconSize: unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(bucket.zoom + 1), canonical),
|
28273 | layoutTextSize: unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(bucket.zoom + 1), canonical),
|
28274 | textMaxSize: unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(18))
|
28275 | };
|
28276 | if (bucket.textSizeData.kind === 'composite') {
|
28277 | const { minZoom, maxZoom } = bucket.textSizeData;
|
28278 | sizes.compositeTextSizes = [
|
28279 | unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(minZoom), canonical),
|
28280 | unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(maxZoom), canonical)
|
28281 | ];
|
28282 | }
|
28283 | if (bucket.iconSizeData.kind === 'composite') {
|
28284 | const { minZoom, maxZoom } = bucket.iconSizeData;
|
28285 | sizes.compositeIconSizes = [
|
28286 | unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(minZoom), canonical),
|
28287 | unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(maxZoom), canonical)
|
28288 | ];
|
28289 | }
|
28290 | const lineHeight = layout.get('text-line-height') * ONE_EM;
|
28291 | const textAlongLine = layout.get('text-rotation-alignment') !== 'viewport' && layout.get('symbol-placement') !== 'point';
|
28292 | const keepUpright = layout.get('text-keep-upright');
|
28293 | const textSize = layout.get('text-size');
|
28294 | for (const feature of bucket.features) {
|
28295 | const fontstack = layout.get('text-font').evaluate(feature, {}, canonical).join(',');
|
28296 | const layoutTextSizeThisZoom = textSize.evaluate(feature, {}, canonical);
|
28297 | const layoutTextSize = sizes.layoutTextSize.evaluate(feature, {}, canonical);
|
28298 | const layoutIconSize = sizes.layoutIconSize.evaluate(feature, {}, canonical);
|
28299 | const shapedTextOrientations = {
|
28300 | horizontal: {},
|
28301 | vertical: undefined
|
28302 | };
|
28303 | const text = feature.text;
|
28304 | let textOffset = [0, 0];
|
28305 | if (text) {
|
28306 | const unformattedText = text.toString();
|
28307 | const spacing = layout.get('text-letter-spacing').evaluate(feature, {}, canonical) * ONE_EM;
|
28308 | const spacingIfAllowed = allowsLetterSpacing(unformattedText) ? spacing : 0;
|
28309 | const textAnchor = layout.get('text-anchor').evaluate(feature, {}, canonical);
|
28310 | const variableTextAnchor = layout.get('text-variable-anchor');
|
28311 | if (!variableTextAnchor) {
|
28312 | const radialOffset = layout.get('text-radial-offset').evaluate(feature, {}, canonical);
|
28313 | // Layers with variable anchors use the `text-radial-offset` property and the [x, y] offset vector
|
28314 | // is calculated at placement time instead of layout time
|
28315 | if (radialOffset) {
|
28316 | // The style spec says don't use `text-offset` and `text-radial-offset` together
|
28317 | // but doesn't actually specify what happens if you use both. We go with the radial offset.
|
28318 | textOffset = evaluateVariableOffset(textAnchor, [radialOffset * ONE_EM, INVALID_TEXT_OFFSET]);
|
28319 | }
|
28320 | else {
|
28321 | textOffset = layout.get('text-offset').evaluate(feature, {}, canonical).map(t => t * ONE_EM);
|
28322 | }
|
28323 | }
|
28324 | let textJustify = textAlongLine ?
|
28325 | 'center' :
|
28326 | layout.get('text-justify').evaluate(feature, {}, canonical);
|
28327 | const symbolPlacement = layout.get('symbol-placement');
|
28328 | const maxWidth = symbolPlacement === 'point' ?
|
28329 | layout.get('text-max-width').evaluate(feature, {}, canonical) * ONE_EM :
|
28330 | 0;
|
28331 | const addVerticalShapingForPointLabelIfNeeded = () => {
|
28332 | if (bucket.allowVerticalPlacement && allowsVerticalWritingMode(unformattedText)) {
|
28333 | // Vertical POI label placement is meant to be used for scripts that support vertical
|
28334 | // writing mode, thus, default left justification is used. If Latin
|
28335 | // scripts would need to be supported, this should take into account other justifications.
|
28336 | shapedTextOrientations.vertical = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor, 'left', spacingIfAllowed, textOffset, exports.WritingMode.vertical, true, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom);
|
28337 | }
|
28338 | };
|
28339 | // If this layer uses text-variable-anchor, generate shapings for all justification possibilities.
|
28340 | if (!textAlongLine && variableTextAnchor) {
|
28341 | const justifications = textJustify === 'auto' ?
|
28342 | variableTextAnchor.map(a => getAnchorJustification(a)) :
|
28343 | [textJustify];
|
28344 | let singleLine = false;
|
28345 | for (let i = 0; i < justifications.length; i++) {
|
28346 | const justification = justifications[i];
|
28347 | if (shapedTextOrientations.horizontal[justification])
|
28348 | continue;
|
28349 | if (singleLine) {
|
28350 | // If the shaping for the first justification was only a single line, we
|
28351 | // can re-use it for the other justifications
|
28352 | shapedTextOrientations.horizontal[justification] = shapedTextOrientations.horizontal[0];
|
28353 | }
|
28354 | else {
|
28355 | // If using text-variable-anchor for the layer, we use a center anchor for all shapings and apply
|
28356 | // the offsets for the anchor in the placement step.
|
28357 | const shaping = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, 'center', justification, spacingIfAllowed, textOffset, exports.WritingMode.horizontal, false, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom);
|
28358 | if (shaping) {
|
28359 | shapedTextOrientations.horizontal[justification] = shaping;
|
28360 | singleLine = shaping.positionedLines.length === 1;
|
28361 | }
|
28362 | }
|
28363 | }
|
28364 | addVerticalShapingForPointLabelIfNeeded();
|
28365 | }
|
28366 | else {
|
28367 | if (textJustify === 'auto') {
|
28368 | textJustify = getAnchorJustification(textAnchor);
|
28369 | }
|
28370 | // Horizontal point or line label.
|
28371 | const shaping = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, exports.WritingMode.horizontal, false, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom);
|
28372 | if (shaping)
|
28373 | shapedTextOrientations.horizontal[textJustify] = shaping;
|
28374 | // Vertical point label (if allowVerticalPlacement is enabled).
|
28375 | addVerticalShapingForPointLabelIfNeeded();
|
28376 | // Verticalized line label.
|
28377 | if (allowsVerticalWritingMode(unformattedText) && textAlongLine && keepUpright) {
|
28378 | shapedTextOrientations.vertical = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, exports.WritingMode.vertical, false, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom);
|
28379 | }
|
28380 | }
|
28381 | }
|
28382 | let shapedIcon;
|
28383 | let isSDFIcon = false;
|
28384 | if (feature.icon && feature.icon.name) {
|
28385 | const image = imageMap[feature.icon.name];
|
28386 | if (image) {
|
28387 | shapedIcon = shapeIcon(imagePositions[feature.icon.name], layout.get('icon-offset').evaluate(feature, {}, canonical), layout.get('icon-anchor').evaluate(feature, {}, canonical));
|
28388 | // null/undefined SDF property treated same as default (false)
|
28389 | isSDFIcon = !!image.sdf;
|
28390 | if (bucket.sdfIcons === undefined) {
|
28391 | bucket.sdfIcons = isSDFIcon;
|
28392 | }
|
28393 | else if (bucket.sdfIcons !== isSDFIcon) {
|
28394 | warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer');
|
28395 | }
|
28396 | if (image.pixelRatio !== bucket.pixelRatio) {
|
28397 | bucket.iconsNeedLinear = true;
|
28398 | }
|
28399 | else if (layout.get('icon-rotate').constantOr(1) !== 0) {
|
28400 | bucket.iconsNeedLinear = true;
|
28401 | }
|
28402 | }
|
28403 | }
|
28404 | const shapedText = getDefaultHorizontalShaping(shapedTextOrientations.horizontal) || shapedTextOrientations.vertical;
|
28405 | bucket.iconsInText = shapedText ? shapedText.iconsInText : false;
|
28406 | if (shapedText || shapedIcon) {
|
28407 | addFeature(bucket, feature, shapedTextOrientations, shapedIcon, imageMap, sizes, layoutTextSize, layoutIconSize, textOffset, isSDFIcon, canonical);
|
28408 | }
|
28409 | }
|
28410 | if (showCollisionBoxes) {
|
28411 | bucket.generateCollisionDebugBuffers();
|
28412 | }
|
28413 | }
|
28414 | // Choose the justification that matches the direction of the TextAnchor
|
28415 | function getAnchorJustification(anchor) {
|
28416 | switch (anchor) {
|
28417 | case 'right':
|
28418 | case 'top-right':
|
28419 | case 'bottom-right':
|
28420 | return 'right';
|
28421 | case 'left':
|
28422 | case 'top-left':
|
28423 | case 'bottom-left':
|
28424 | return 'left';
|
28425 | }
|
28426 | return 'center';
|
28427 | }
|
28428 | /**
|
28429 | * Given a feature and its shaped text and icon data, add a 'symbol
|
28430 | * instance' for each _possible_ placement of the symbol feature.
|
28431 | * (At render timePlaceSymbols#place() selects which of these instances to
|
28432 | * show or hide based on collisions with symbols in other layers.)
|
28433 | * @private
|
28434 | */
|
28435 | function addFeature(bucket, feature, shapedTextOrientations, shapedIcon, imageMap, sizes, layoutTextSize, layoutIconSize, textOffset, isSDFIcon, canonical) {
|
28436 | // To reduce the number of labels that jump around when zooming we need
|
28437 | // to use a text-size value that is the same for all zoom levels.
|
28438 | // bucket calculates text-size at a high zoom level so that all tiles can
|
28439 | // use the same value when calculating anchor positions.
|
28440 | let textMaxSize = sizes.textMaxSize.evaluate(feature, {});
|
28441 | if (textMaxSize === undefined) {
|
28442 | textMaxSize = layoutTextSize;
|
28443 | }
|
28444 | const layout = bucket.layers[0].layout;
|
28445 | const iconOffset = layout.get('icon-offset').evaluate(feature, {}, canonical);
|
28446 | const defaultHorizontalShaping = getDefaultHorizontalShaping(shapedTextOrientations.horizontal);
|
28447 | const glyphSize = 24, fontScale = layoutTextSize / glyphSize, textBoxScale = bucket.tilePixelRatio * fontScale, textMaxBoxScale = bucket.tilePixelRatio * textMaxSize / glyphSize, iconBoxScale = bucket.tilePixelRatio * layoutIconSize, symbolMinDistance = bucket.tilePixelRatio * layout.get('symbol-spacing'), textPadding = layout.get('text-padding') * bucket.tilePixelRatio, iconPadding = layout.get('icon-padding') * bucket.tilePixelRatio, textMaxAngle = layout.get('text-max-angle') / 180 * Math.PI, textAlongLine = layout.get('text-rotation-alignment') !== 'viewport' && layout.get('symbol-placement') !== 'point', iconAlongLine = layout.get('icon-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point', symbolPlacement = layout.get('symbol-placement'), textRepeatDistance = symbolMinDistance / 2;
|
28448 | const iconTextFit = layout.get('icon-text-fit');
|
28449 | let verticallyShapedIcon;
|
28450 | // Adjust shaped icon size when icon-text-fit is used.
|
28451 | if (shapedIcon && iconTextFit !== 'none') {
|
28452 | if (bucket.allowVerticalPlacement && shapedTextOrientations.vertical) {
|
28453 | verticallyShapedIcon = fitIconToText(shapedIcon, shapedTextOrientations.vertical, iconTextFit, layout.get('icon-text-fit-padding'), iconOffset, fontScale);
|
28454 | }
|
28455 | if (defaultHorizontalShaping) {
|
28456 | shapedIcon = fitIconToText(shapedIcon, defaultHorizontalShaping, iconTextFit, layout.get('icon-text-fit-padding'), iconOffset, fontScale);
|
28457 | }
|
28458 | }
|
28459 | const addSymbolAtAnchor = (line, anchor) => {
|
28460 | if (anchor.x < 0 || anchor.x >= EXTENT || anchor.y < 0 || anchor.y >= EXTENT) {
|
28461 | // Symbol layers are drawn across tile boundaries, We filter out symbols
|
28462 | // outside our tile boundaries (which may be included in vector tile buffers)
|
28463 | // to prevent double-drawing symbols.
|
28464 | return;
|
28465 | }
|
28466 | addSymbol(bucket, anchor, line, shapedTextOrientations, shapedIcon, imageMap, verticallyShapedIcon, bucket.layers[0], bucket.collisionBoxArray, feature.index, feature.sourceLayerIndex, bucket.index, textBoxScale, textPadding, textAlongLine, textOffset, iconBoxScale, iconPadding, iconAlongLine, iconOffset, feature, sizes, isSDFIcon, canonical, layoutTextSize);
|
28467 | };
|
28468 | if (symbolPlacement === 'line') {
|
28469 | for (const line of clipLine(feature.geometry, 0, 0, EXTENT, EXTENT)) {
|
28470 | const anchors = getAnchors(line, symbolMinDistance, textMaxAngle, shapedTextOrientations.vertical || defaultHorizontalShaping, shapedIcon, glyphSize, textMaxBoxScale, bucket.overscaling, EXTENT);
|
28471 | for (const anchor of anchors) {
|
28472 | const shapedText = defaultHorizontalShaping;
|
28473 | if (!shapedText || !anchorIsTooClose(bucket, shapedText.text, textRepeatDistance, anchor)) {
|
28474 | addSymbolAtAnchor(line, anchor);
|
28475 | }
|
28476 | }
|
28477 | }
|
28478 | }
|
28479 | else if (symbolPlacement === 'line-center') {
|
28480 | // No clipping, multiple lines per feature are allowed
|
28481 | // "lines" with only one point are ignored as in clipLines
|
28482 | for (const line of feature.geometry) {
|
28483 | if (line.length > 1) {
|
28484 | const anchor = getCenterAnchor(line, textMaxAngle, shapedTextOrientations.vertical || defaultHorizontalShaping, shapedIcon, glyphSize, textMaxBoxScale);
|
28485 | if (anchor) {
|
28486 | addSymbolAtAnchor(line, anchor);
|
28487 | }
|
28488 | }
|
28489 | }
|
28490 | }
|
28491 | else if (feature.type === 'Polygon') {
|
28492 | for (const polygon of classifyRings$1(feature.geometry, 0)) {
|
28493 | // 16 here represents 2 pixels
|
28494 | const poi = findPoleOfInaccessibility(polygon, 16);
|
28495 | addSymbolAtAnchor(polygon[0], new Anchor(poi.x, poi.y, 0));
|
28496 | }
|
28497 | }
|
28498 | else if (feature.type === 'LineString') {
|
28499 | // https://github.com/mapbox/mapbox-gl-js/issues/3808
|
28500 | for (const line of feature.geometry) {
|
28501 | addSymbolAtAnchor(line, new Anchor(line[0].x, line[0].y, 0));
|
28502 | }
|
28503 | }
|
28504 | else if (feature.type === 'Point') {
|
28505 | for (const points of feature.geometry) {
|
28506 | for (const point of points) {
|
28507 | addSymbolAtAnchor([point], new Anchor(point.x, point.y, 0));
|
28508 | }
|
28509 | }
|
28510 | }
|
28511 | }
|
28512 | const MAX_GLYPH_ICON_SIZE = 255;
|
28513 | const MAX_PACKED_SIZE = MAX_GLYPH_ICON_SIZE * SIZE_PACK_FACTOR;
|
28514 | function addTextVertices(bucket, anchor, shapedText, imageMap, layer, textAlongLine, feature, textOffset, lineArray, writingMode, placementTypes, placedTextSymbolIndices, placedIconIndex, sizes, canonical) {
|
28515 | const glyphQuads = getGlyphQuads(anchor, shapedText, textOffset, layer, textAlongLine, feature, imageMap, bucket.allowVerticalPlacement);
|
28516 | const sizeData = bucket.textSizeData;
|
28517 | let textSizeData = null;
|
28518 | if (sizeData.kind === 'source') {
|
28519 | textSizeData = [
|
28520 | SIZE_PACK_FACTOR * layer.layout.get('text-size').evaluate(feature, {})
|
28521 | ];
|
28522 | if (textSizeData[0] > MAX_PACKED_SIZE) {
|
28523 | warnOnce(`${bucket.layerIds[0]}: Value for "text-size" is >= ${MAX_GLYPH_ICON_SIZE}. Reduce your "text-size".`);
|
28524 | }
|
28525 | }
|
28526 | else if (sizeData.kind === 'composite') {
|
28527 | textSizeData = [
|
28528 | SIZE_PACK_FACTOR * sizes.compositeTextSizes[0].evaluate(feature, {}, canonical),
|
28529 | SIZE_PACK_FACTOR * sizes.compositeTextSizes[1].evaluate(feature, {}, canonical)
|
28530 | ];
|
28531 | if (textSizeData[0] > MAX_PACKED_SIZE || textSizeData[1] > MAX_PACKED_SIZE) {
|
28532 | warnOnce(`${bucket.layerIds[0]}: Value for "text-size" is >= ${MAX_GLYPH_ICON_SIZE}. Reduce your "text-size".`);
|
28533 | }
|
28534 | }
|
28535 | bucket.addSymbols(bucket.text, glyphQuads, textSizeData, textOffset, textAlongLine, feature, writingMode, anchor, lineArray.lineStartIndex, lineArray.lineLength, placedIconIndex, canonical);
|
28536 | // The placedSymbolArray is used at render time in drawTileSymbols
|
28537 | // These indices allow access to the array at collision detection time
|
28538 | for (const placementType of placementTypes) {
|
28539 | placedTextSymbolIndices[placementType] = bucket.text.placedSymbolArray.length - 1;
|
28540 | }
|
28541 | return glyphQuads.length * 4;
|
28542 | }
|
28543 | function getDefaultHorizontalShaping(horizontalShaping) {
|
28544 | // We don't care which shaping we get because this is used for collision purposes
|
28545 | // and all the justifications have the same collision box
|
28546 | for (const justification in horizontalShaping) {
|
28547 | return horizontalShaping[justification];
|
28548 | }
|
28549 | return null;
|
28550 | }
|
28551 | /**
|
28552 | * Add a single label & icon placement.
|
28553 | *
|
28554 | * @private
|
28555 | */
|
28556 | function addSymbol(bucket, anchor, line, shapedTextOrientations, shapedIcon, imageMap, verticallyShapedIcon, layer, collisionBoxArray, featureIndex, sourceLayerIndex, bucketIndex, textBoxScale, textPadding, textAlongLine, textOffset, iconBoxScale, iconPadding, iconAlongLine, iconOffset, feature, sizes, isSDFIcon, canonical, layoutTextSize) {
|
28557 | const lineArray = bucket.addToLineVertexArray(anchor, line);
|
28558 | let textCollisionFeature, iconCollisionFeature, verticalTextCollisionFeature, verticalIconCollisionFeature;
|
28559 | let numIconVertices = 0;
|
28560 | let numVerticalIconVertices = 0;
|
28561 | let numHorizontalGlyphVertices = 0;
|
28562 | let numVerticalGlyphVertices = 0;
|
28563 | let placedIconSymbolIndex = -1;
|
28564 | let verticalPlacedIconSymbolIndex = -1;
|
28565 | const placedTextSymbolIndices = {};
|
28566 | let key = murmur3$1('');
|
28567 | let textOffset0 = 0;
|
28568 | let textOffset1 = 0;
|
28569 | if (layer._unevaluatedLayout.getValue('text-radial-offset') === undefined) {
|
28570 | [textOffset0, textOffset1] = layer.layout.get('text-offset').evaluate(feature, {}, canonical).map(t => t * ONE_EM);
|
28571 | }
|
28572 | else {
|
28573 | textOffset0 = layer.layout.get('text-radial-offset').evaluate(feature, {}, canonical) * ONE_EM;
|
28574 | textOffset1 = INVALID_TEXT_OFFSET;
|
28575 | }
|
28576 | if (bucket.allowVerticalPlacement && shapedTextOrientations.vertical) {
|
28577 | const textRotation = layer.layout.get('text-rotate').evaluate(feature, {}, canonical);
|
28578 | const verticalTextRotation = textRotation + 90.0;
|
28579 | const verticalShaping = shapedTextOrientations.vertical;
|
28580 | verticalTextCollisionFeature = new CollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticalShaping, textBoxScale, textPadding, textAlongLine, verticalTextRotation);
|
28581 | if (verticallyShapedIcon) {
|
28582 | verticalIconCollisionFeature = new CollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticallyShapedIcon, iconBoxScale, iconPadding, textAlongLine, verticalTextRotation);
|
28583 | }
|
28584 | }
|
28585 | //Place icon first, so text can have a reference to its index in the placed symbol array.
|
28586 | //Text symbols can lazily shift at render-time because of variable anchor placement.
|
28587 | //If the style specifies an `icon-text-fit` then the icon would have to shift along with it.
|
28588 | // For more info check `updateVariableAnchors` in `draw_symbol.js` .
|
28589 | if (shapedIcon) {
|
28590 | const iconRotate = layer.layout.get('icon-rotate').evaluate(feature, {});
|
28591 | const hasIconTextFit = layer.layout.get('icon-text-fit') !== 'none';
|
28592 | const iconQuads = getIconQuads(shapedIcon, iconRotate, isSDFIcon, hasIconTextFit);
|
28593 | const verticalIconQuads = verticallyShapedIcon ? getIconQuads(verticallyShapedIcon, iconRotate, isSDFIcon, hasIconTextFit) : undefined;
|
28594 | iconCollisionFeature = new CollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconBoxScale, iconPadding, /*align boxes to line*/ false, iconRotate);
|
28595 | numIconVertices = iconQuads.length * 4;
|
28596 | const sizeData = bucket.iconSizeData;
|
28597 | let iconSizeData = null;
|
28598 | if (sizeData.kind === 'source') {
|
28599 | iconSizeData = [
|
28600 | SIZE_PACK_FACTOR * layer.layout.get('icon-size').evaluate(feature, {})
|
28601 | ];
|
28602 | if (iconSizeData[0] > MAX_PACKED_SIZE) {
|
28603 | warnOnce(`${bucket.layerIds[0]}: Value for "icon-size" is >= ${MAX_GLYPH_ICON_SIZE}. Reduce your "icon-size".`);
|
28604 | }
|
28605 | }
|
28606 | else if (sizeData.kind === 'composite') {
|
28607 | iconSizeData = [
|
28608 | SIZE_PACK_FACTOR * sizes.compositeIconSizes[0].evaluate(feature, {}, canonical),
|
28609 | SIZE_PACK_FACTOR * sizes.compositeIconSizes[1].evaluate(feature, {}, canonical)
|
28610 | ];
|
28611 | if (iconSizeData[0] > MAX_PACKED_SIZE || iconSizeData[1] > MAX_PACKED_SIZE) {
|
28612 | warnOnce(`${bucket.layerIds[0]}: Value for "icon-size" is >= ${MAX_GLYPH_ICON_SIZE}. Reduce your "icon-size".`);
|
28613 | }
|
28614 | }
|
28615 | bucket.addSymbols(bucket.icon, iconQuads, iconSizeData, iconOffset, iconAlongLine, feature, exports.WritingMode.none, anchor, lineArray.lineStartIndex, lineArray.lineLength,
|
28616 | // The icon itself does not have an associated symbol since the text isnt placed yet
|
28617 | -1, canonical);
|
28618 | placedIconSymbolIndex = bucket.icon.placedSymbolArray.length - 1;
|
28619 | if (verticalIconQuads) {
|
28620 | numVerticalIconVertices = verticalIconQuads.length * 4;
|
28621 | bucket.addSymbols(bucket.icon, verticalIconQuads, iconSizeData, iconOffset, iconAlongLine, feature, exports.WritingMode.vertical, anchor, lineArray.lineStartIndex, lineArray.lineLength,
|
28622 | // The icon itself does not have an associated symbol since the text isnt placed yet
|
28623 | -1, canonical);
|
28624 | verticalPlacedIconSymbolIndex = bucket.icon.placedSymbolArray.length - 1;
|
28625 | }
|
28626 | }
|
28627 | const justifications = Object.keys(shapedTextOrientations.horizontal);
|
28628 | for (const justification of justifications) {
|
28629 | const shaping = shapedTextOrientations.horizontal[justification];
|
28630 | if (!textCollisionFeature) {
|
28631 | key = murmur3$1(shaping.text);
|
28632 | const textRotate = layer.layout.get('text-rotate').evaluate(feature, {}, canonical);
|
28633 | // As a collision approximation, we can use either the vertical or any of the horizontal versions of the feature
|
28634 | // We're counting on all versions having similar dimensions
|
28635 | textCollisionFeature = new CollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaping, textBoxScale, textPadding, textAlongLine, textRotate);
|
28636 | }
|
28637 | const singleLine = shaping.positionedLines.length === 1;
|
28638 | numHorizontalGlyphVertices += addTextVertices(bucket, anchor, shaping, imageMap, layer, textAlongLine, feature, textOffset, lineArray, shapedTextOrientations.vertical ? exports.WritingMode.horizontal : exports.WritingMode.horizontalOnly, singleLine ? justifications : [justification], placedTextSymbolIndices, placedIconSymbolIndex, sizes, canonical);
|
28639 | if (singleLine) {
|
28640 | break;
|
28641 | }
|
28642 | }
|
28643 | if (shapedTextOrientations.vertical) {
|
28644 | numVerticalGlyphVertices += addTextVertices(bucket, anchor, shapedTextOrientations.vertical, imageMap, layer, textAlongLine, feature, textOffset, lineArray, exports.WritingMode.vertical, ['vertical'], placedTextSymbolIndices, verticalPlacedIconSymbolIndex, sizes, canonical);
|
28645 | }
|
28646 | const textBoxStartIndex = textCollisionFeature ? textCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length;
|
28647 | const textBoxEndIndex = textCollisionFeature ? textCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length;
|
28648 | const verticalTextBoxStartIndex = verticalTextCollisionFeature ? verticalTextCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length;
|
28649 | const verticalTextBoxEndIndex = verticalTextCollisionFeature ? verticalTextCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length;
|
28650 | const iconBoxStartIndex = iconCollisionFeature ? iconCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length;
|
28651 | const iconBoxEndIndex = iconCollisionFeature ? iconCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length;
|
28652 | const verticalIconBoxStartIndex = verticalIconCollisionFeature ? verticalIconCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length;
|
28653 | const verticalIconBoxEndIndex = verticalIconCollisionFeature ? verticalIconCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length;
|
28654 | // Check if runtime collision circles should be used for any of the collision features.
|
28655 | // It is enough to choose the tallest feature shape as circles are always placed on a line.
|
28656 | // All measurements are in glyph metrics and later converted into pixels using proper font size "layoutTextSize"
|
28657 | let collisionCircleDiameter = -1;
|
28658 | const getCollisionCircleHeight = (feature, prevHeight) => {
|
28659 | if (feature && feature.circleDiameter)
|
28660 | return Math.max(feature.circleDiameter, prevHeight);
|
28661 | return prevHeight;
|
28662 | };
|
28663 | collisionCircleDiameter = getCollisionCircleHeight(textCollisionFeature, collisionCircleDiameter);
|
28664 | collisionCircleDiameter = getCollisionCircleHeight(verticalTextCollisionFeature, collisionCircleDiameter);
|
28665 | collisionCircleDiameter = getCollisionCircleHeight(iconCollisionFeature, collisionCircleDiameter);
|
28666 | collisionCircleDiameter = getCollisionCircleHeight(verticalIconCollisionFeature, collisionCircleDiameter);
|
28667 | const useRuntimeCollisionCircles = (collisionCircleDiameter > -1) ? 1 : 0;
|
28668 | // Convert circle collision height into pixels
|
28669 | if (useRuntimeCollisionCircles)
|
28670 | collisionCircleDiameter *= layoutTextSize / ONE_EM;
|
28671 | if (bucket.glyphOffsetArray.length >= SymbolBucket$1.MAX_GLYPHS)
|
28672 | warnOnce('Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907');
|
28673 | if (feature.sortKey !== undefined) {
|
28674 | bucket.addToSortKeyRanges(bucket.symbolInstances.length, feature.sortKey);
|
28675 | }
|
28676 | bucket.symbolInstances.emplaceBack(anchor.x, anchor.y, placedTextSymbolIndices.right >= 0 ? placedTextSymbolIndices.right : -1, placedTextSymbolIndices.center >= 0 ? placedTextSymbolIndices.center : -1, placedTextSymbolIndices.left >= 0 ? placedTextSymbolIndices.left : -1, placedTextSymbolIndices.vertical || -1, placedIconSymbolIndex, verticalPlacedIconSymbolIndex, key, textBoxStartIndex, textBoxEndIndex, verticalTextBoxStartIndex, verticalTextBoxEndIndex, iconBoxStartIndex, iconBoxEndIndex, verticalIconBoxStartIndex, verticalIconBoxEndIndex, featureIndex, numHorizontalGlyphVertices, numVerticalGlyphVertices, numIconVertices, numVerticalIconVertices, useRuntimeCollisionCircles, 0, textBoxScale, textOffset0, textOffset1, collisionCircleDiameter);
|
28677 | }
|
28678 | function anchorIsTooClose(bucket, text, repeatDistance, anchor) {
|
28679 | const compareText = bucket.compareText;
|
28680 | if (!(text in compareText)) {
|
28681 | compareText[text] = [];
|
28682 | }
|
28683 | else {
|
28684 | const otherAnchors = compareText[text];
|
28685 | for (let k = otherAnchors.length - 1; k >= 0; k--) {
|
28686 | if (anchor.dist(otherAnchors[k]) < repeatDistance) {
|
28687 | // If it's within repeatDistance of one anchor, stop looking
|
28688 | return true;
|
28689 | }
|
28690 | }
|
28691 | }
|
28692 | // If anchor is not within repeatDistance of any other anchor, add to array
|
28693 | compareText[text].push(anchor);
|
28694 | return false;
|
28695 | }
|
28696 |
|
28697 | const vectorTileFeatureTypes = vectorTile.VectorTileFeature.types;
|
28698 | // Opacity arrays are frequently updated but don't contain a lot of information, so we pack them
|
28699 | // tight. Each Uint32 is actually four duplicate Uint8s for the four corners of a glyph
|
28700 | // 7 bits are for the current opacity, and the lowest bit is the target opacity
|
28701 | // actually defined in symbol_attributes.js
|
28702 | // const placementOpacityAttributes = [
|
28703 | // { name: 'a_fade_opacity', components: 1, type: 'Uint32' }
|
28704 | // ];
|
28705 | const shaderOpacityAttributes = [
|
28706 | { name: 'a_fade_opacity', components: 1, type: 'Uint8', offset: 0 }
|
28707 | ];
|
28708 | function addVertex(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex, isSDF, pixelOffsetX, pixelOffsetY, minFontScaleX, minFontScaleY) {
|
28709 | const aSizeX = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[0])) : 0;
|
28710 | const aSizeY = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[1])) : 0;
|
28711 | array.emplaceBack(
|
28712 | // a_pos_offset
|
28713 | anchorX, anchorY, Math.round(ox * 32), Math.round(oy * 32),
|
28714 | // a_data
|
28715 | tx, // x coordinate of symbol on glyph atlas texture
|
28716 | ty, // y coordinate of symbol on glyph atlas texture
|
28717 | (aSizeX << 1) + (isSDF ? 1 : 0), aSizeY, pixelOffsetX * 16, pixelOffsetY * 16, minFontScaleX * 256, minFontScaleY * 256);
|
28718 | }
|
28719 | function addDynamicAttributes(dynamicLayoutVertexArray, p, angle) {
|
28720 | dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
|
28721 | dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
|
28722 | dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
|
28723 | dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
|
28724 | }
|
28725 | function containsRTLText(formattedText) {
|
28726 | for (const section of formattedText.sections) {
|
28727 | if (stringContainsRTLText(section.text)) {
|
28728 | return true;
|
28729 | }
|
28730 | }
|
28731 | return false;
|
28732 | }
|
28733 | class SymbolBuffers {
|
28734 | constructor(programConfigurations) {
|
28735 | this.layoutVertexArray = new SymbolLayoutArray();
|
28736 | this.indexArray = new TriangleIndexArray();
|
28737 | this.programConfigurations = programConfigurations;
|
28738 | this.segments = new SegmentVector();
|
28739 | this.dynamicLayoutVertexArray = new SymbolDynamicLayoutArray();
|
28740 | this.opacityVertexArray = new SymbolOpacityArray();
|
28741 | this.placedSymbolArray = new PlacedSymbolArray();
|
28742 | }
|
28743 | isEmpty() {
|
28744 | return this.layoutVertexArray.length === 0 &&
|
28745 | this.indexArray.length === 0 &&
|
28746 | this.dynamicLayoutVertexArray.length === 0 &&
|
28747 | this.opacityVertexArray.length === 0;
|
28748 | }
|
28749 | upload(context, dynamicIndexBuffer, upload, update) {
|
28750 | if (this.isEmpty()) {
|
28751 | return;
|
28752 | }
|
28753 | if (upload) {
|
28754 | this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, symbolLayoutAttributes.members);
|
28755 | this.indexBuffer = context.createIndexBuffer(this.indexArray, dynamicIndexBuffer);
|
28756 | this.dynamicLayoutVertexBuffer = context.createVertexBuffer(this.dynamicLayoutVertexArray, dynamicLayoutAttributes.members, true);
|
28757 | this.opacityVertexBuffer = context.createVertexBuffer(this.opacityVertexArray, shaderOpacityAttributes, true);
|
28758 | // This is a performance hack so that we can write to opacityVertexArray with uint32s
|
28759 | // even though the shaders read uint8s
|
28760 | this.opacityVertexBuffer.itemSize = 1;
|
28761 | }
|
28762 | if (upload || update) {
|
28763 | this.programConfigurations.upload(context);
|
28764 | }
|
28765 | }
|
28766 | destroy() {
|
28767 | if (!this.layoutVertexBuffer)
|
28768 | return;
|
28769 | this.layoutVertexBuffer.destroy();
|
28770 | this.indexBuffer.destroy();
|
28771 | this.programConfigurations.destroy();
|
28772 | this.segments.destroy();
|
28773 | this.dynamicLayoutVertexBuffer.destroy();
|
28774 | this.opacityVertexBuffer.destroy();
|
28775 | }
|
28776 | }
|
28777 | register('SymbolBuffers', SymbolBuffers);
|
28778 | class CollisionBuffers {
|
28779 | constructor(LayoutArray, layoutAttributes, IndexArray) {
|
28780 | this.layoutVertexArray = new LayoutArray();
|
28781 | this.layoutAttributes = layoutAttributes;
|
28782 | this.indexArray = new IndexArray();
|
28783 | this.segments = new SegmentVector();
|
28784 | this.collisionVertexArray = new CollisionVertexArray();
|
28785 | }
|
28786 | upload(context) {
|
28787 | this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, this.layoutAttributes);
|
28788 | this.indexBuffer = context.createIndexBuffer(this.indexArray);
|
28789 | this.collisionVertexBuffer = context.createVertexBuffer(this.collisionVertexArray, collisionVertexAttributes.members, true);
|
28790 | }
|
28791 | destroy() {
|
28792 | if (!this.layoutVertexBuffer)
|
28793 | return;
|
28794 | this.layoutVertexBuffer.destroy();
|
28795 | this.indexBuffer.destroy();
|
28796 | this.segments.destroy();
|
28797 | this.collisionVertexBuffer.destroy();
|
28798 | }
|
28799 | }
|
28800 | register('CollisionBuffers', CollisionBuffers);
|
28801 | /**
|
28802 | * Unlike other buckets, which simply implement #addFeature with type-specific
|
28803 | * logic for (essentially) triangulating feature geometries, SymbolBucket
|
28804 | * requires specialized behavior:
|
28805 | *
|
28806 | * 1. WorkerTile#parse(), the logical owner of the bucket creation process,
|
28807 | * calls SymbolBucket#populate(), which resolves text and icon tokens on
|
28808 | * each feature, adds each glyphs and symbols needed to the passed-in
|
28809 | * collections options.glyphDependencies and options.iconDependencies, and
|
28810 | * stores the feature data for use in subsequent step (this.features).
|
28811 | *
|
28812 | * 2. WorkerTile asynchronously requests from the main thread all of the glyphs
|
28813 | * and icons needed (by this bucket and any others). When glyphs and icons
|
28814 | * have been received, the WorkerTile creates a CollisionIndex and invokes:
|
28815 | *
|
28816 | * 3. performSymbolLayout(bucket, stacks, icons) perform texts shaping and
|
28817 | * layout on a Symbol Bucket. This step populates:
|
28818 | * `this.symbolInstances`: metadata on generated symbols
|
28819 | * `this.collisionBoxArray`: collision data for use by foreground
|
28820 | * `this.text`: SymbolBuffers for text symbols
|
28821 | * `this.icons`: SymbolBuffers for icons
|
28822 | * `this.iconCollisionBox`: Debug SymbolBuffers for icon collision boxes
|
28823 | * `this.textCollisionBox`: Debug SymbolBuffers for text collision boxes
|
28824 | * The results are sent to the foreground for rendering
|
28825 | *
|
28826 | * 4. performSymbolPlacement(bucket, collisionIndex) is run on the foreground,
|
28827 | * and uses the CollisionIndex along with current camera settings to determine
|
28828 | * which symbols can actually show on the map. Collided symbols are hidden
|
28829 | * using a dynamic "OpacityVertexArray".
|
28830 | *
|
28831 | * @private
|
28832 | */
|
28833 | class SymbolBucket {
|
28834 | constructor(options) {
|
28835 | this.collisionBoxArray = options.collisionBoxArray;
|
28836 | this.zoom = options.zoom;
|
28837 | this.overscaling = options.overscaling;
|
28838 | this.layers = options.layers;
|
28839 | this.layerIds = this.layers.map(layer => layer.id);
|
28840 | this.index = options.index;
|
28841 | this.pixelRatio = options.pixelRatio;
|
28842 | this.sourceLayerIndex = options.sourceLayerIndex;
|
28843 | this.hasPattern = false;
|
28844 | this.hasRTLText = false;
|
28845 | this.sortKeyRanges = [];
|
28846 | this.collisionCircleArray = [];
|
28847 | this.placementInvProjMatrix = identity$2([]);
|
28848 | this.placementViewportMatrix = identity$2([]);
|
28849 | const layer = this.layers[0];
|
28850 | const unevaluatedLayoutValues = layer._unevaluatedLayout._values;
|
28851 | this.textSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['text-size']);
|
28852 | this.iconSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']);
|
28853 | const layout = this.layers[0].layout;
|
28854 | const sortKey = layout.get('symbol-sort-key');
|
28855 | const zOrder = layout.get('symbol-z-order');
|
28856 | this.canOverlap =
|
28857 | getOverlapMode(layout, 'text-overlap', 'text-allow-overlap') !== 'never' ||
|
28858 | getOverlapMode(layout, 'icon-overlap', 'icon-allow-overlap') !== 'never' ||
|
28859 | layout.get('text-ignore-placement') ||
|
28860 | layout.get('icon-ignore-placement');
|
28861 | this.sortFeaturesByKey = zOrder !== 'viewport-y' && !sortKey.isConstant();
|
28862 | const zOrderByViewportY = zOrder === 'viewport-y' || (zOrder === 'auto' && !this.sortFeaturesByKey);
|
28863 | this.sortFeaturesByY = zOrderByViewportY && this.canOverlap;
|
28864 | if (layout.get('symbol-placement') === 'point') {
|
28865 | this.writingModes = layout.get('text-writing-mode').map(wm => exports.WritingMode[wm]);
|
28866 | }
|
28867 | this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);
|
28868 | this.sourceID = options.sourceID;
|
28869 | }
|
28870 | createArrays() {
|
28871 | this.text = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, property => /^text/.test(property)));
|
28872 | this.icon = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, property => /^icon/.test(property)));
|
28873 | this.glyphOffsetArray = new GlyphOffsetArray();
|
28874 | this.lineVertexArray = new SymbolLineVertexArray();
|
28875 | this.symbolInstances = new SymbolInstanceArray();
|
28876 | }
|
28877 | calculateGlyphDependencies(text, stack, textAlongLine, allowVerticalPlacement, doesAllowVerticalWritingMode) {
|
28878 | for (let i = 0; i < text.length; i++) {
|
28879 | stack[text.charCodeAt(i)] = true;
|
28880 | if ((textAlongLine || allowVerticalPlacement) && doesAllowVerticalWritingMode) {
|
28881 | const verticalChar = verticalizedCharacterMap[text.charAt(i)];
|
28882 | if (verticalChar) {
|
28883 | stack[verticalChar.charCodeAt(0)] = true;
|
28884 | }
|
28885 | }
|
28886 | }
|
28887 | }
|
28888 | populate(features, options, canonical) {
|
28889 | const layer = this.layers[0];
|
28890 | const layout = layer.layout;
|
28891 | const textFont = layout.get('text-font');
|
28892 | const textField = layout.get('text-field');
|
28893 | const iconImage = layout.get('icon-image');
|
28894 | const hasText = (textField.value.kind !== 'constant' ||
|
28895 | (textField.value.value instanceof Formatted && !textField.value.value.isEmpty()) ||
|
28896 | textField.value.value.toString().length > 0) &&
|
28897 | (textFont.value.kind !== 'constant' || textFont.value.value.length > 0);
|
28898 | // we should always resolve the icon-image value if the property was defined in the style
|
28899 | // this allows us to fire the styleimagemissing event if image evaluation returns null
|
28900 | // the only way to distinguish between null returned from a coalesce statement with no valid images
|
28901 | // and null returned because icon-image wasn't defined is to check whether or not iconImage.parameters is an empty object
|
28902 | const hasIcon = iconImage.value.kind !== 'constant' || !!iconImage.value.value || Object.keys(iconImage.parameters).length > 0;
|
28903 | const symbolSortKey = layout.get('symbol-sort-key');
|
28904 | this.features = [];
|
28905 | if (!hasText && !hasIcon) {
|
28906 | return;
|
28907 | }
|
28908 | const icons = options.iconDependencies;
|
28909 | const stacks = options.glyphDependencies;
|
28910 | const availableImages = options.availableImages;
|
28911 | const globalProperties = new EvaluationParameters(this.zoom);
|
28912 | for (const { feature, id, index, sourceLayerIndex } of features) {
|
28913 | const needGeometry = layer._featureFilter.needGeometry;
|
28914 | const evaluationFeature = toEvaluationFeature(feature, needGeometry);
|
28915 | if (!layer._featureFilter.filter(globalProperties, evaluationFeature, canonical)) {
|
28916 | continue;
|
28917 | }
|
28918 | if (!needGeometry)
|
28919 | evaluationFeature.geometry = loadGeometry(feature);
|
28920 | let text;
|
28921 | if (hasText) {
|
28922 | // Expression evaluation will automatically coerce to Formatted
|
28923 | // but plain string token evaluation skips that pathway so do the
|
28924 | // conversion here.
|
28925 | const resolvedTokens = layer.getValueAndResolveTokens('text-field', evaluationFeature, canonical, availableImages);
|
28926 | const formattedText = Formatted.factory(resolvedTokens);
|
28927 | if (containsRTLText(formattedText)) {
|
28928 | this.hasRTLText = true;
|
28929 | }
|
28930 | if (!this.hasRTLText || // non-rtl text so can proceed safely
|
28931 | getRTLTextPluginStatus() === 'unavailable' || // We don't intend to lazy-load the rtl text plugin, so proceed with incorrect shaping
|
28932 | this.hasRTLText && plugin.isParsed() // Use the rtlText plugin to shape text
|
28933 | ) {
|
28934 | text = transformText$1(formattedText, layer, evaluationFeature);
|
28935 | }
|
28936 | }
|
28937 | let icon;
|
28938 | if (hasIcon) {
|
28939 | // Expression evaluation will automatically coerce to Image
|
28940 | // but plain string token evaluation skips that pathway so do the
|
28941 | // conversion here.
|
28942 | const resolvedTokens = layer.getValueAndResolveTokens('icon-image', evaluationFeature, canonical, availableImages);
|
28943 | if (resolvedTokens instanceof ResolvedImage) {
|
28944 | icon = resolvedTokens;
|
28945 | }
|
28946 | else {
|
28947 | icon = ResolvedImage.fromString(resolvedTokens);
|
28948 | }
|
28949 | }
|
28950 | if (!text && !icon) {
|
28951 | continue;
|
28952 | }
|
28953 | const sortKey = this.sortFeaturesByKey ?
|
28954 | symbolSortKey.evaluate(evaluationFeature, {}, canonical) :
|
28955 | undefined;
|
28956 | const symbolFeature = {
|
28957 | id,
|
28958 | text,
|
28959 | icon,
|
28960 | index,
|
28961 | sourceLayerIndex,
|
28962 | geometry: evaluationFeature.geometry,
|
28963 | properties: feature.properties,
|
28964 | type: vectorTileFeatureTypes[feature.type],
|
28965 | sortKey
|
28966 | };
|
28967 | this.features.push(symbolFeature);
|
28968 | if (icon) {
|
28969 | icons[icon.name] = true;
|
28970 | }
|
28971 | if (text) {
|
28972 | const fontStack = textFont.evaluate(evaluationFeature, {}, canonical).join(',');
|
28973 | const textAlongLine = layout.get('text-rotation-alignment') !== 'viewport' && layout.get('symbol-placement') !== 'point';
|
28974 | this.allowVerticalPlacement = this.writingModes && this.writingModes.indexOf(exports.WritingMode.vertical) >= 0;
|
28975 | for (const section of text.sections) {
|
28976 | if (!section.image) {
|
28977 | const doesAllowVerticalWritingMode = allowsVerticalWritingMode(text.toString());
|
28978 | const sectionFont = section.fontStack || fontStack;
|
28979 | const sectionStack = stacks[sectionFont] = stacks[sectionFont] || {};
|
28980 | this.calculateGlyphDependencies(section.text, sectionStack, textAlongLine, this.allowVerticalPlacement, doesAllowVerticalWritingMode);
|
28981 | }
|
28982 | else {
|
28983 | // Add section image to the list of dependencies.
|
28984 | icons[section.image.name] = true;
|
28985 | }
|
28986 | }
|
28987 | }
|
28988 | }
|
28989 | if (layout.get('symbol-placement') === 'line') {
|
28990 | // Merge adjacent lines with the same text to improve labelling.
|
28991 | // It's better to place labels on one long line than on many short segments.
|
28992 | this.features = mergeLines(this.features);
|
28993 | }
|
28994 | if (this.sortFeaturesByKey) {
|
28995 | this.features.sort((a, b) => {
|
28996 | // a.sortKey is always a number when sortFeaturesByKey is true
|
28997 | return a.sortKey - b.sortKey;
|
28998 | });
|
28999 | }
|
29000 | }
|
29001 | update(states, vtLayer, imagePositions) {
|
29002 | if (!this.stateDependentLayers.length)
|
29003 | return;
|
29004 | this.text.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions);
|
29005 | this.icon.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions);
|
29006 | }
|
29007 | isEmpty() {
|
29008 | // When the bucket encounters only rtl-text but the plugin isnt loaded, no symbol instances will be created.
|
29009 | // In order for the bucket to be serialized, and not discarded as an empty bucket both checks are necessary.
|
29010 | return this.symbolInstances.length === 0 && !this.hasRTLText;
|
29011 | }
|
29012 | uploadPending() {
|
29013 | return !this.uploaded || this.text.programConfigurations.needsUpload || this.icon.programConfigurations.needsUpload;
|
29014 | }
|
29015 | upload(context) {
|
29016 | if (!this.uploaded && this.hasDebugData()) {
|
29017 | this.textCollisionBox.upload(context);
|
29018 | this.iconCollisionBox.upload(context);
|
29019 | }
|
29020 | this.text.upload(context, this.sortFeaturesByY, !this.uploaded, this.text.programConfigurations.needsUpload);
|
29021 | this.icon.upload(context, this.sortFeaturesByY, !this.uploaded, this.icon.programConfigurations.needsUpload);
|
29022 | this.uploaded = true;
|
29023 | }
|
29024 | destroyDebugData() {
|
29025 | this.textCollisionBox.destroy();
|
29026 | this.iconCollisionBox.destroy();
|
29027 | }
|
29028 | destroy() {
|
29029 | this.text.destroy();
|
29030 | this.icon.destroy();
|
29031 | if (this.hasDebugData()) {
|
29032 | this.destroyDebugData();
|
29033 | }
|
29034 | }
|
29035 | addToLineVertexArray(anchor, line) {
|
29036 | const lineStartIndex = this.lineVertexArray.length;
|
29037 | if (anchor.segment !== undefined) {
|
29038 | let sumForwardLength = anchor.dist(line[anchor.segment + 1]);
|
29039 | let sumBackwardLength = anchor.dist(line[anchor.segment]);
|
29040 | const vertices = {};
|
29041 | for (let i = anchor.segment + 1; i < line.length; i++) {
|
29042 | vertices[i] = { x: line[i].x, y: line[i].y, tileUnitDistanceFromAnchor: sumForwardLength };
|
29043 | if (i < line.length - 1) {
|
29044 | sumForwardLength += line[i + 1].dist(line[i]);
|
29045 | }
|
29046 | }
|
29047 | for (let i = anchor.segment || 0; i >= 0; i--) {
|
29048 | vertices[i] = { x: line[i].x, y: line[i].y, tileUnitDistanceFromAnchor: sumBackwardLength };
|
29049 | if (i > 0) {
|
29050 | sumBackwardLength += line[i - 1].dist(line[i]);
|
29051 | }
|
29052 | }
|
29053 | for (let i = 0; i < line.length; i++) {
|
29054 | const vertex = vertices[i];
|
29055 | this.lineVertexArray.emplaceBack(vertex.x, vertex.y, vertex.tileUnitDistanceFromAnchor);
|
29056 | }
|
29057 | }
|
29058 | return {
|
29059 | lineStartIndex,
|
29060 | lineLength: this.lineVertexArray.length - lineStartIndex
|
29061 | };
|
29062 | }
|
29063 | addSymbols(arrays, quads, sizeVertex, lineOffset, alongLine, feature, writingMode, labelAnchor, lineStartIndex, lineLength, associatedIconIndex, canonical) {
|
29064 | const indexArray = arrays.indexArray;
|
29065 | const layoutVertexArray = arrays.layoutVertexArray;
|
29066 | const segment = arrays.segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray, this.canOverlap ? feature.sortKey : undefined);
|
29067 | const glyphOffsetArrayStart = this.glyphOffsetArray.length;
|
29068 | const vertexStartIndex = segment.vertexLength;
|
29069 | const angle = (this.allowVerticalPlacement && writingMode === exports.WritingMode.vertical) ? Math.PI / 2 : 0;
|
29070 | const sections = feature.text && feature.text.sections;
|
29071 | for (let i = 0; i < quads.length; i++) {
|
29072 | const { tl, tr, bl, br, tex, pixelOffsetTL, pixelOffsetBR, minFontScaleX, minFontScaleY, glyphOffset, isSDF, sectionIndex } = quads[i];
|
29073 | const index = segment.vertexLength;
|
29074 | const y = glyphOffset[1];
|
29075 | addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY);
|
29076 | addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY);
|
29077 | addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY);
|
29078 | addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, br.x, y + br.y, tex.x + tex.w, tex.y + tex.h, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY);
|
29079 | addDynamicAttributes(arrays.dynamicLayoutVertexArray, labelAnchor, angle);
|
29080 | indexArray.emplaceBack(index, index + 1, index + 2);
|
29081 | indexArray.emplaceBack(index + 1, index + 2, index + 3);
|
29082 | segment.vertexLength += 4;
|
29083 | segment.primitiveLength += 2;
|
29084 | this.glyphOffsetArray.emplaceBack(glyphOffset[0]);
|
29085 | if (i === quads.length - 1 || sectionIndex !== quads[i + 1].sectionIndex) {
|
29086 | arrays.programConfigurations.populatePaintArrays(layoutVertexArray.length, feature, feature.index, {}, canonical, sections && sections[sectionIndex]);
|
29087 | }
|
29088 | }
|
29089 | arrays.placedSymbolArray.emplaceBack(labelAnchor.x, labelAnchor.y, glyphOffsetArrayStart, this.glyphOffsetArray.length - glyphOffsetArrayStart, vertexStartIndex, lineStartIndex, lineLength, labelAnchor.segment, sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0, lineOffset[0], lineOffset[1], writingMode,
|
29090 | // placedOrientation is null initially; will be updated to horizontal(1)/vertical(2) if placed
|
29091 | 0, false,
|
29092 | // The crossTileID is only filled/used on the foreground for dynamic text anchors
|
29093 | 0, associatedIconIndex);
|
29094 | }
|
29095 | _addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, point, anchorX, anchorY, extrude) {
|
29096 | collisionVertexArray.emplaceBack(0, 0);
|
29097 | return layoutVertexArray.emplaceBack(
|
29098 | // pos
|
29099 | point.x, point.y,
|
29100 | // a_anchor_pos
|
29101 | anchorX, anchorY,
|
29102 | // extrude
|
29103 | Math.round(extrude.x), Math.round(extrude.y));
|
29104 | }
|
29105 | addCollisionDebugVertices(x1, y1, x2, y2, arrays, boxAnchorPoint, symbolInstance) {
|
29106 | const segment = arrays.segments.prepareSegment(4, arrays.layoutVertexArray, arrays.indexArray);
|
29107 | const index = segment.vertexLength;
|
29108 | const layoutVertexArray = arrays.layoutVertexArray;
|
29109 | const collisionVertexArray = arrays.collisionVertexArray;
|
29110 | const anchorX = symbolInstance.anchorX;
|
29111 | const anchorY = symbolInstance.anchorY;
|
29112 | this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x1, y1));
|
29113 | this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x2, y1));
|
29114 | this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x2, y2));
|
29115 | this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x1, y2));
|
29116 | segment.vertexLength += 4;
|
29117 | const indexArray = arrays.indexArray;
|
29118 | indexArray.emplaceBack(index, index + 1);
|
29119 | indexArray.emplaceBack(index + 1, index + 2);
|
29120 | indexArray.emplaceBack(index + 2, index + 3);
|
29121 | indexArray.emplaceBack(index + 3, index);
|
29122 | segment.primitiveLength += 4;
|
29123 | }
|
29124 | addDebugCollisionBoxes(startIndex, endIndex, symbolInstance, isText) {
|
29125 | for (let b = startIndex; b < endIndex; b++) {
|
29126 | const box = this.collisionBoxArray.get(b);
|
29127 | const x1 = box.x1;
|
29128 | const y1 = box.y1;
|
29129 | const x2 = box.x2;
|
29130 | const y2 = box.y2;
|
29131 | this.addCollisionDebugVertices(x1, y1, x2, y2, isText ? this.textCollisionBox : this.iconCollisionBox, box.anchorPoint, symbolInstance);
|
29132 | }
|
29133 | }
|
29134 | generateCollisionDebugBuffers() {
|
29135 | if (this.hasDebugData()) {
|
29136 | this.destroyDebugData();
|
29137 | }
|
29138 | this.textCollisionBox = new CollisionBuffers(CollisionBoxLayoutArray, collisionBoxLayout.members, LineIndexArray);
|
29139 | this.iconCollisionBox = new CollisionBuffers(CollisionBoxLayoutArray, collisionBoxLayout.members, LineIndexArray);
|
29140 | for (let i = 0; i < this.symbolInstances.length; i++) {
|
29141 | const symbolInstance = this.symbolInstances.get(i);
|
29142 | this.addDebugCollisionBoxes(symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance, true);
|
29143 | this.addDebugCollisionBoxes(symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance, true);
|
29144 | this.addDebugCollisionBoxes(symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance, false);
|
29145 | this.addDebugCollisionBoxes(symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex, symbolInstance, false);
|
29146 | }
|
29147 | }
|
29148 | // These flat arrays are meant to be quicker to iterate over than the source
|
29149 | // CollisionBoxArray
|
29150 | _deserializeCollisionBoxesForSymbol(collisionBoxArray, textStartIndex, textEndIndex, verticalTextStartIndex, verticalTextEndIndex, iconStartIndex, iconEndIndex, verticalIconStartIndex, verticalIconEndIndex) {
|
29151 | const collisionArrays = {};
|
29152 | for (let k = textStartIndex; k < textEndIndex; k++) {
|
29153 | const box = collisionBoxArray.get(k);
|
29154 | collisionArrays.textBox = { x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, anchorPointX: box.anchorPointX, anchorPointY: box.anchorPointY };
|
29155 | collisionArrays.textFeatureIndex = box.featureIndex;
|
29156 | break; // Only one box allowed per instance
|
29157 | }
|
29158 | for (let k = verticalTextStartIndex; k < verticalTextEndIndex; k++) {
|
29159 | const box = collisionBoxArray.get(k);
|
29160 | collisionArrays.verticalTextBox = { x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, anchorPointX: box.anchorPointX, anchorPointY: box.anchorPointY };
|
29161 | collisionArrays.verticalTextFeatureIndex = box.featureIndex;
|
29162 | break; // Only one box allowed per instance
|
29163 | }
|
29164 | for (let k = iconStartIndex; k < iconEndIndex; k++) {
|
29165 | // An icon can only have one box now, so this indexing is a bit vestigial...
|
29166 | const box = collisionBoxArray.get(k);
|
29167 | collisionArrays.iconBox = { x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, anchorPointX: box.anchorPointX, anchorPointY: box.anchorPointY };
|
29168 | collisionArrays.iconFeatureIndex = box.featureIndex;
|
29169 | break; // Only one box allowed per instance
|
29170 | }
|
29171 | for (let k = verticalIconStartIndex; k < verticalIconEndIndex; k++) {
|
29172 | // An icon can only have one box now, so this indexing is a bit vestigial...
|
29173 | const box = collisionBoxArray.get(k);
|
29174 | collisionArrays.verticalIconBox = { x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, anchorPointX: box.anchorPointX, anchorPointY: box.anchorPointY };
|
29175 | collisionArrays.verticalIconFeatureIndex = box.featureIndex;
|
29176 | break; // Only one box allowed per instance
|
29177 | }
|
29178 | return collisionArrays;
|
29179 | }
|
29180 | deserializeCollisionBoxes(collisionBoxArray) {
|
29181 | this.collisionArrays = [];
|
29182 | for (let i = 0; i < this.symbolInstances.length; i++) {
|
29183 | const symbolInstance = this.symbolInstances.get(i);
|
29184 | this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol(collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex));
|
29185 | }
|
29186 | }
|
29187 | hasTextData() {
|
29188 | return this.text.segments.get().length > 0;
|
29189 | }
|
29190 | hasIconData() {
|
29191 | return this.icon.segments.get().length > 0;
|
29192 | }
|
29193 | hasDebugData() {
|
29194 | return this.textCollisionBox && this.iconCollisionBox;
|
29195 | }
|
29196 | hasTextCollisionBoxData() {
|
29197 | return this.hasDebugData() && this.textCollisionBox.segments.get().length > 0;
|
29198 | }
|
29199 | hasIconCollisionBoxData() {
|
29200 | return this.hasDebugData() && this.iconCollisionBox.segments.get().length > 0;
|
29201 | }
|
29202 | addIndicesForPlacedSymbol(iconOrText, placedSymbolIndex) {
|
29203 | const placedSymbol = iconOrText.placedSymbolArray.get(placedSymbolIndex);
|
29204 | const endIndex = placedSymbol.vertexStartIndex + placedSymbol.numGlyphs * 4;
|
29205 | for (let vertexIndex = placedSymbol.vertexStartIndex; vertexIndex < endIndex; vertexIndex += 4) {
|
29206 | iconOrText.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2);
|
29207 | iconOrText.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3);
|
29208 | }
|
29209 | }
|
29210 | getSortedSymbolIndexes(angle) {
|
29211 | if (this.sortedAngle === angle && this.symbolInstanceIndexes !== undefined) {
|
29212 | return this.symbolInstanceIndexes;
|
29213 | }
|
29214 | const sin = Math.sin(angle);
|
29215 | const cos = Math.cos(angle);
|
29216 | const rotatedYs = [];
|
29217 | const featureIndexes = [];
|
29218 | const result = [];
|
29219 | for (let i = 0; i < this.symbolInstances.length; ++i) {
|
29220 | result.push(i);
|
29221 | const symbolInstance = this.symbolInstances.get(i);
|
29222 | rotatedYs.push(Math.round(sin * symbolInstance.anchorX + cos * symbolInstance.anchorY) | 0);
|
29223 | featureIndexes.push(symbolInstance.featureIndex);
|
29224 | }
|
29225 | result.sort((aIndex, bIndex) => {
|
29226 | return (rotatedYs[aIndex] - rotatedYs[bIndex]) ||
|
29227 | (featureIndexes[bIndex] - featureIndexes[aIndex]);
|
29228 | });
|
29229 | return result;
|
29230 | }
|
29231 | addToSortKeyRanges(symbolInstanceIndex, sortKey) {
|
29232 | const last = this.sortKeyRanges[this.sortKeyRanges.length - 1];
|
29233 | if (last && last.sortKey === sortKey) {
|
29234 | last.symbolInstanceEnd = symbolInstanceIndex + 1;
|
29235 | }
|
29236 | else {
|
29237 | this.sortKeyRanges.push({
|
29238 | sortKey,
|
29239 | symbolInstanceStart: symbolInstanceIndex,
|
29240 | symbolInstanceEnd: symbolInstanceIndex + 1
|
29241 | });
|
29242 | }
|
29243 | }
|
29244 | sortFeatures(angle) {
|
29245 | if (!this.sortFeaturesByY)
|
29246 | return;
|
29247 | if (this.sortedAngle === angle)
|
29248 | return;
|
29249 | // The current approach to sorting doesn't sort across segments so don't try.
|
29250 | // Sorting within segments separately seemed not to be worth the complexity.
|
29251 | if (this.text.segments.get().length > 1 || this.icon.segments.get().length > 1)
|
29252 | return;
|
29253 | // If the symbols are allowed to overlap sort them by their vertical screen position.
|
29254 | // The index array buffer is rewritten to reference the (unchanged) vertices in the
|
29255 | // sorted order.
|
29256 | // To avoid sorting the actual symbolInstance array we sort an array of indexes.
|
29257 | this.symbolInstanceIndexes = this.getSortedSymbolIndexes(angle);
|
29258 | this.sortedAngle = angle;
|
29259 | this.text.indexArray.clear();
|
29260 | this.icon.indexArray.clear();
|
29261 | this.featureSortOrder = [];
|
29262 | for (const i of this.symbolInstanceIndexes) {
|
29263 | const symbolInstance = this.symbolInstances.get(i);
|
29264 | this.featureSortOrder.push(symbolInstance.featureIndex);
|
29265 | [
|
29266 | symbolInstance.rightJustifiedTextSymbolIndex,
|
29267 | symbolInstance.centerJustifiedTextSymbolIndex,
|
29268 | symbolInstance.leftJustifiedTextSymbolIndex
|
29269 | ].forEach((index, i, array) => {
|
29270 | // Only add a given index the first time it shows up,
|
29271 | // to avoid duplicate opacity entries when multiple justifications
|
29272 | // share the same glyphs.
|
29273 | if (index >= 0 && array.indexOf(index) === i) {
|
29274 | this.addIndicesForPlacedSymbol(this.text, index);
|
29275 | }
|
29276 | });
|
29277 | if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) {
|
29278 | this.addIndicesForPlacedSymbol(this.text, symbolInstance.verticalPlacedTextSymbolIndex);
|
29279 | }
|
29280 | if (symbolInstance.placedIconSymbolIndex >= 0) {
|
29281 | this.addIndicesForPlacedSymbol(this.icon, symbolInstance.placedIconSymbolIndex);
|
29282 | }
|
29283 | if (symbolInstance.verticalPlacedIconSymbolIndex >= 0) {
|
29284 | this.addIndicesForPlacedSymbol(this.icon, symbolInstance.verticalPlacedIconSymbolIndex);
|
29285 | }
|
29286 | }
|
29287 | if (this.text.indexBuffer)
|
29288 | this.text.indexBuffer.updateData(this.text.indexArray);
|
29289 | if (this.icon.indexBuffer)
|
29290 | this.icon.indexBuffer.updateData(this.icon.indexArray);
|
29291 | }
|
29292 | }
|
29293 | register('SymbolBucket', SymbolBucket, {
|
29294 | omit: ['layers', 'collisionBoxArray', 'features', 'compareText']
|
29295 | });
|
29296 | // this constant is based on the size of StructArray indexes used in a symbol
|
29297 | // bucket--namely, glyphOffsetArrayStart
|
29298 | // eg the max valid UInt16 is 65,535
|
29299 | // See https://github.com/mapbox/mapbox-gl-js/issues/2907 for motivation
|
29300 | // lineStartIndex and textBoxStartIndex could potentially be concerns
|
29301 | // but we expect there to be many fewer boxes/lines than glyphs
|
29302 | SymbolBucket.MAX_GLYPHS = 65535;
|
29303 | SymbolBucket.addDynamicAttributes = addDynamicAttributes;
|
29304 | var SymbolBucket$1 = SymbolBucket;
|
29305 |
|
29306 | /**
|
29307 | * Replace tokens in a string template with values in an object
|
29308 | *
|
29309 | * @param properties a key/value relationship between tokens and replacements
|
29310 | * @param text the template string
|
29311 | * @returns the template with tokens replaced
|
29312 | * @private
|
29313 | */
|
29314 | function resolveTokens(properties, text) {
|
29315 | return text.replace(/{([^{}]+)}/g, (match, key) => {
|
29316 | return key in properties ? String(properties[key]) : '';
|
29317 | });
|
29318 | }
|
29319 |
|
29320 | // This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
|
29321 | const layout = new Properties({
|
29322 | "symbol-placement": new DataConstantProperty(spec["layout_symbol"]["symbol-placement"]),
|
29323 | "symbol-spacing": new DataConstantProperty(spec["layout_symbol"]["symbol-spacing"]),
|
29324 | "symbol-avoid-edges": new DataConstantProperty(spec["layout_symbol"]["symbol-avoid-edges"]),
|
29325 | "symbol-sort-key": new DataDrivenProperty(spec["layout_symbol"]["symbol-sort-key"]),
|
29326 | "symbol-z-order": new DataConstantProperty(spec["layout_symbol"]["symbol-z-order"]),
|
29327 | "icon-allow-overlap": new DataConstantProperty(spec["layout_symbol"]["icon-allow-overlap"]),
|
29328 | "icon-overlap": new DataConstantProperty(spec["layout_symbol"]["icon-overlap"]),
|
29329 | "icon-ignore-placement": new DataConstantProperty(spec["layout_symbol"]["icon-ignore-placement"]),
|
29330 | "icon-optional": new DataConstantProperty(spec["layout_symbol"]["icon-optional"]),
|
29331 | "icon-rotation-alignment": new DataConstantProperty(spec["layout_symbol"]["icon-rotation-alignment"]),
|
29332 | "icon-size": new DataDrivenProperty(spec["layout_symbol"]["icon-size"]),
|
29333 | "icon-text-fit": new DataConstantProperty(spec["layout_symbol"]["icon-text-fit"]),
|
29334 | "icon-text-fit-padding": new DataConstantProperty(spec["layout_symbol"]["icon-text-fit-padding"]),
|
29335 | "icon-image": new DataDrivenProperty(spec["layout_symbol"]["icon-image"]),
|
29336 | "icon-rotate": new DataDrivenProperty(spec["layout_symbol"]["icon-rotate"]),
|
29337 | "icon-padding": new DataConstantProperty(spec["layout_symbol"]["icon-padding"]),
|
29338 | "icon-keep-upright": new DataConstantProperty(spec["layout_symbol"]["icon-keep-upright"]),
|
29339 | "icon-offset": new DataDrivenProperty(spec["layout_symbol"]["icon-offset"]),
|
29340 | "icon-anchor": new DataDrivenProperty(spec["layout_symbol"]["icon-anchor"]),
|
29341 | "icon-pitch-alignment": new DataConstantProperty(spec["layout_symbol"]["icon-pitch-alignment"]),
|
29342 | "text-pitch-alignment": new DataConstantProperty(spec["layout_symbol"]["text-pitch-alignment"]),
|
29343 | "text-rotation-alignment": new DataConstantProperty(spec["layout_symbol"]["text-rotation-alignment"]),
|
29344 | "text-field": new DataDrivenProperty(spec["layout_symbol"]["text-field"]),
|
29345 | "text-font": new DataDrivenProperty(spec["layout_symbol"]["text-font"]),
|
29346 | "text-size": new DataDrivenProperty(spec["layout_symbol"]["text-size"]),
|
29347 | "text-max-width": new DataDrivenProperty(spec["layout_symbol"]["text-max-width"]),
|
29348 | "text-line-height": new DataConstantProperty(spec["layout_symbol"]["text-line-height"]),
|
29349 | "text-letter-spacing": new DataDrivenProperty(spec["layout_symbol"]["text-letter-spacing"]),
|
29350 | "text-justify": new DataDrivenProperty(spec["layout_symbol"]["text-justify"]),
|
29351 | "text-radial-offset": new DataDrivenProperty(spec["layout_symbol"]["text-radial-offset"]),
|
29352 | "text-variable-anchor": new DataConstantProperty(spec["layout_symbol"]["text-variable-anchor"]),
|
29353 | "text-anchor": new DataDrivenProperty(spec["layout_symbol"]["text-anchor"]),
|
29354 | "text-max-angle": new DataConstantProperty(spec["layout_symbol"]["text-max-angle"]),
|
29355 | "text-writing-mode": new DataConstantProperty(spec["layout_symbol"]["text-writing-mode"]),
|
29356 | "text-rotate": new DataDrivenProperty(spec["layout_symbol"]["text-rotate"]),
|
29357 | "text-padding": new DataConstantProperty(spec["layout_symbol"]["text-padding"]),
|
29358 | "text-keep-upright": new DataConstantProperty(spec["layout_symbol"]["text-keep-upright"]),
|
29359 | "text-transform": new DataDrivenProperty(spec["layout_symbol"]["text-transform"]),
|
29360 | "text-offset": new DataDrivenProperty(spec["layout_symbol"]["text-offset"]),
|
29361 | "text-allow-overlap": new DataConstantProperty(spec["layout_symbol"]["text-allow-overlap"]),
|
29362 | "text-overlap": new DataConstantProperty(spec["layout_symbol"]["text-overlap"]),
|
29363 | "text-ignore-placement": new DataConstantProperty(spec["layout_symbol"]["text-ignore-placement"]),
|
29364 | "text-optional": new DataConstantProperty(spec["layout_symbol"]["text-optional"]),
|
29365 | });
|
29366 | const paint$2 = new Properties({
|
29367 | "icon-opacity": new DataDrivenProperty(spec["paint_symbol"]["icon-opacity"]),
|
29368 | "icon-color": new DataDrivenProperty(spec["paint_symbol"]["icon-color"]),
|
29369 | "icon-halo-color": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-color"]),
|
29370 | "icon-halo-width": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-width"]),
|
29371 | "icon-halo-blur": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-blur"]),
|
29372 | "icon-translate": new DataConstantProperty(spec["paint_symbol"]["icon-translate"]),
|
29373 | "icon-translate-anchor": new DataConstantProperty(spec["paint_symbol"]["icon-translate-anchor"]),
|
29374 | "text-opacity": new DataDrivenProperty(spec["paint_symbol"]["text-opacity"]),
|
29375 | "text-color": new DataDrivenProperty(spec["paint_symbol"]["text-color"], { runtimeType: ColorType, getOverride: (o) => o.textColor, hasOverride: (o) => !!o.textColor }),
|
29376 | "text-halo-color": new DataDrivenProperty(spec["paint_symbol"]["text-halo-color"]),
|
29377 | "text-halo-width": new DataDrivenProperty(spec["paint_symbol"]["text-halo-width"]),
|
29378 | "text-halo-blur": new DataDrivenProperty(spec["paint_symbol"]["text-halo-blur"]),
|
29379 | "text-translate": new DataConstantProperty(spec["paint_symbol"]["text-translate"]),
|
29380 | "text-translate-anchor": new DataConstantProperty(spec["paint_symbol"]["text-translate-anchor"]),
|
29381 | });
|
29382 | var properties$2 = { paint: paint$2, layout };
|
29383 |
|
29384 | // This is an internal expression class. It is only used in GL JS and
|
29385 | // has GL JS dependencies which can break the standalone style-spec module
|
29386 | class FormatSectionOverride {
|
29387 | constructor(defaultValue) {
|
29388 | assert$1(defaultValue.property.overrides !== undefined);
|
29389 | this.type = defaultValue.property.overrides ? defaultValue.property.overrides.runtimeType : NullType;
|
29390 | this.defaultValue = defaultValue;
|
29391 | }
|
29392 | evaluate(ctx) {
|
29393 | if (ctx.formattedSection) {
|
29394 | const overrides = this.defaultValue.property.overrides;
|
29395 | if (overrides && overrides.hasOverride(ctx.formattedSection)) {
|
29396 | return overrides.getOverride(ctx.formattedSection);
|
29397 | }
|
29398 | }
|
29399 | if (ctx.feature && ctx.featureState) {
|
29400 | return this.defaultValue.evaluate(ctx.feature, ctx.featureState);
|
29401 | }
|
29402 | return this.defaultValue.property.specification.default;
|
29403 | }
|
29404 | eachChild(fn) {
|
29405 | if (!this.defaultValue.isConstant()) {
|
29406 | const expr = this.defaultValue.value;
|
29407 | fn(expr._styleExpression.expression);
|
29408 | }
|
29409 | }
|
29410 | // Cannot be statically evaluated, as the output depends on the evaluation context.
|
29411 | outputDefined() {
|
29412 | return false;
|
29413 | }
|
29414 | serialize() {
|
29415 | return null;
|
29416 | }
|
29417 | }
|
29418 | register('FormatSectionOverride', FormatSectionOverride, { omit: ['defaultValue'] });
|
29419 |
|
29420 | class SymbolStyleLayer extends StyleLayer {
|
29421 | constructor(layer) {
|
29422 | super(layer, properties$2);
|
29423 | }
|
29424 | recalculate(parameters, availableImages) {
|
29425 | super.recalculate(parameters, availableImages);
|
29426 | if (this.layout.get('icon-rotation-alignment') === 'auto') {
|
29427 | if (this.layout.get('symbol-placement') !== 'point') {
|
29428 | this.layout._values['icon-rotation-alignment'] = 'map';
|
29429 | }
|
29430 | else {
|
29431 | this.layout._values['icon-rotation-alignment'] = 'viewport';
|
29432 | }
|
29433 | }
|
29434 | if (this.layout.get('text-rotation-alignment') === 'auto') {
|
29435 | if (this.layout.get('symbol-placement') !== 'point') {
|
29436 | this.layout._values['text-rotation-alignment'] = 'map';
|
29437 | }
|
29438 | else {
|
29439 | this.layout._values['text-rotation-alignment'] = 'viewport';
|
29440 | }
|
29441 | }
|
29442 | // If unspecified, `*-pitch-alignment` inherits `*-rotation-alignment`
|
29443 | if (this.layout.get('text-pitch-alignment') === 'auto') {
|
29444 | this.layout._values['text-pitch-alignment'] = this.layout.get('text-rotation-alignment') === 'map' ? 'map' : 'viewport';
|
29445 | }
|
29446 | if (this.layout.get('icon-pitch-alignment') === 'auto') {
|
29447 | this.layout._values['icon-pitch-alignment'] = this.layout.get('icon-rotation-alignment');
|
29448 | }
|
29449 | if (this.layout.get('symbol-placement') === 'point') {
|
29450 | const writingModes = this.layout.get('text-writing-mode');
|
29451 | if (writingModes) {
|
29452 | // remove duplicates, preserving order
|
29453 | const deduped = [];
|
29454 | for (const m of writingModes) {
|
29455 | if (deduped.indexOf(m) < 0)
|
29456 | deduped.push(m);
|
29457 | }
|
29458 | this.layout._values['text-writing-mode'] = deduped;
|
29459 | }
|
29460 | else {
|
29461 | this.layout._values['text-writing-mode'] = ['horizontal'];
|
29462 | }
|
29463 | }
|
29464 | this._setPaintOverrides();
|
29465 | }
|
29466 | getValueAndResolveTokens(name, feature, canonical, availableImages) {
|
29467 | const value = this.layout.get(name).evaluate(feature, {}, canonical, availableImages);
|
29468 | const unevaluated = this._unevaluatedLayout._values[name];
|
29469 | if (!unevaluated.isDataDriven() && !isExpression(unevaluated.value) && value) {
|
29470 | return resolveTokens(feature.properties, value);
|
29471 | }
|
29472 | return value;
|
29473 | }
|
29474 | createBucket(parameters) {
|
29475 | return new SymbolBucket$1(parameters);
|
29476 | }
|
29477 | queryRadius() {
|
29478 | return 0;
|
29479 | }
|
29480 | queryIntersectsFeature() {
|
29481 | assert$1(false); // Should take a different path in FeatureIndex
|
29482 | return false;
|
29483 | }
|
29484 | _setPaintOverrides() {
|
29485 | for (const overridable of properties$2.paint.overridableProperties) {
|
29486 | if (!SymbolStyleLayer.hasPaintOverride(this.layout, overridable)) {
|
29487 | continue;
|
29488 | }
|
29489 | const overriden = this.paint.get(overridable);
|
29490 | const override = new FormatSectionOverride(overriden);
|
29491 | const styleExpression = new StyleExpression(override, overriden.property.specification);
|
29492 | let expression = null;
|
29493 | if (overriden.value.kind === 'constant' || overriden.value.kind === 'source') {
|
29494 | expression = new ZoomConstantExpression('source', styleExpression);
|
29495 | }
|
29496 | else {
|
29497 | expression = new ZoomDependentExpression('composite', styleExpression, overriden.value.zoomStops, overriden.value._interpolationType);
|
29498 | }
|
29499 | this.paint._values[overridable] = new PossiblyEvaluatedPropertyValue(overriden.property, expression, overriden.parameters);
|
29500 | }
|
29501 | }
|
29502 | _handleOverridablePaintPropertyUpdate(name, oldValue, newValue) {
|
29503 | if (!this.layout || oldValue.isDataDriven() || newValue.isDataDriven()) {
|
29504 | return false;
|
29505 | }
|
29506 | return SymbolStyleLayer.hasPaintOverride(this.layout, name);
|
29507 | }
|
29508 | static hasPaintOverride(layout, propertyName) {
|
29509 | const textField = layout.get('text-field');
|
29510 | const property = properties$2.paint.properties[propertyName];
|
29511 | let hasOverrides = false;
|
29512 | const checkSections = (sections) => {
|
29513 | for (const section of sections) {
|
29514 | if (property.overrides && property.overrides.hasOverride(section)) {
|
29515 | hasOverrides = true;
|
29516 | return;
|
29517 | }
|
29518 | }
|
29519 | };
|
29520 | if (textField.value.kind === 'constant' && textField.value.value instanceof Formatted) {
|
29521 | checkSections(textField.value.value.sections);
|
29522 | }
|
29523 | else if (textField.value.kind === 'source') {
|
29524 | const checkExpression = (expression) => {
|
29525 | if (hasOverrides)
|
29526 | return;
|
29527 | if (expression instanceof Literal && typeOf(expression.value) === FormattedType) {
|
29528 | const formatted = expression.value;
|
29529 | checkSections(formatted.sections);
|
29530 | }
|
29531 | else if (expression instanceof FormatExpression) {
|
29532 | checkSections(expression.sections);
|
29533 | }
|
29534 | else {
|
29535 | expression.eachChild(checkExpression);
|
29536 | }
|
29537 | };
|
29538 | const expr = textField.value;
|
29539 | if (expr._styleExpression) {
|
29540 | checkExpression(expr._styleExpression.expression);
|
29541 | }
|
29542 | }
|
29543 | return hasOverrides;
|
29544 | }
|
29545 | }
|
29546 | function getOverlapMode(layout, overlapProp, allowOverlapProp) {
|
29547 | let result = 'never';
|
29548 | const overlap = layout.get(overlapProp);
|
29549 | if (overlap) {
|
29550 | // if -overlap is set, use it
|
29551 | result = overlap;
|
29552 | }
|
29553 | else if (layout.get(allowOverlapProp)) {
|
29554 | // fall back to -allow-overlap, with false='never', true='always'
|
29555 | result = 'always';
|
29556 | }
|
29557 | return result;
|
29558 | }
|
29559 |
|
29560 | // This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
|
29561 | const paint$1 = new Properties({
|
29562 | "background-color": new DataConstantProperty(spec["paint_background"]["background-color"]),
|
29563 | "background-pattern": new CrossFadedProperty(spec["paint_background"]["background-pattern"]),
|
29564 | "background-opacity": new DataConstantProperty(spec["paint_background"]["background-opacity"]),
|
29565 | });
|
29566 | var properties$1 = { paint: paint$1 };
|
29567 |
|
29568 | class BackgroundStyleLayer extends StyleLayer {
|
29569 | constructor(layer) {
|
29570 | super(layer, properties$1);
|
29571 | }
|
29572 | }
|
29573 |
|
29574 | // This file is generated. Edit build/generate-style-code.ts, then run 'npm run codegen'.
|
29575 | const paint = new Properties({
|
29576 | "raster-opacity": new DataConstantProperty(spec["paint_raster"]["raster-opacity"]),
|
29577 | "raster-hue-rotate": new DataConstantProperty(spec["paint_raster"]["raster-hue-rotate"]),
|
29578 | "raster-brightness-min": new DataConstantProperty(spec["paint_raster"]["raster-brightness-min"]),
|
29579 | "raster-brightness-max": new DataConstantProperty(spec["paint_raster"]["raster-brightness-max"]),
|
29580 | "raster-saturation": new DataConstantProperty(spec["paint_raster"]["raster-saturation"]),
|
29581 | "raster-contrast": new DataConstantProperty(spec["paint_raster"]["raster-contrast"]),
|
29582 | "raster-resampling": new DataConstantProperty(spec["paint_raster"]["raster-resampling"]),
|
29583 | "raster-fade-duration": new DataConstantProperty(spec["paint_raster"]["raster-fade-duration"]),
|
29584 | });
|
29585 | var properties = { paint };
|
29586 |
|
29587 | class RasterStyleLayer extends StyleLayer {
|
29588 | constructor(layer) {
|
29589 | super(layer, properties);
|
29590 | }
|
29591 | }
|
29592 |
|
29593 | function validateCustomStyleLayer(layerObject) {
|
29594 | const errors = [];
|
29595 | const id = layerObject.id;
|
29596 | if (id === undefined) {
|
29597 | errors.push({
|
29598 | message: `layers.${id}: missing required property "id"`
|
29599 | });
|
29600 | }
|
29601 | if (layerObject.render === undefined) {
|
29602 | errors.push({
|
29603 | message: `layers.${id}: missing required method "render"`
|
29604 | });
|
29605 | }
|
29606 | if (layerObject.renderingMode &&
|
29607 | layerObject.renderingMode !== '2d' &&
|
29608 | layerObject.renderingMode !== '3d') {
|
29609 | errors.push({
|
29610 | message: `layers.${id}: property "renderingMode" must be either "2d" or "3d"`
|
29611 | });
|
29612 | }
|
29613 | return errors;
|
29614 | }
|
29615 | class CustomStyleLayer extends StyleLayer {
|
29616 | constructor(implementation) {
|
29617 | super(implementation, {});
|
29618 | this.onAdd = (map) => {
|
29619 | if (this.implementation.onAdd) {
|
29620 | this.implementation.onAdd(map, map.painter.context.gl);
|
29621 | }
|
29622 | };
|
29623 | this.onRemove = (map) => {
|
29624 | if (this.implementation.onRemove) {
|
29625 | this.implementation.onRemove(map, map.painter.context.gl);
|
29626 | }
|
29627 | };
|
29628 | this.implementation = implementation;
|
29629 | }
|
29630 | is3D() {
|
29631 | return this.implementation.renderingMode === '3d';
|
29632 | }
|
29633 | hasOffscreenPass() {
|
29634 | return this.implementation.prerender !== undefined;
|
29635 | }
|
29636 | recalculate() { }
|
29637 | updateTransitions() { }
|
29638 | hasTransition() { return false; }
|
29639 | serialize() {
|
29640 | assert$1(false, 'Custom layers cannot be serialized');
|
29641 | }
|
29642 | }
|
29643 |
|
29644 | const subclasses = {
|
29645 | circle: CircleStyleLayer,
|
29646 | heatmap: HeatmapStyleLayer,
|
29647 | hillshade: HillshadeStyleLayer,
|
29648 | fill: FillStyleLayer,
|
29649 | 'fill-extrusion': FillExtrusionStyleLayer,
|
29650 | line: LineStyleLayer,
|
29651 | symbol: SymbolStyleLayer,
|
29652 | background: BackgroundStyleLayer,
|
29653 | raster: RasterStyleLayer
|
29654 | };
|
29655 | function createStyleLayer(layer) {
|
29656 | if (layer.type === 'custom') {
|
29657 | return new CustomStyleLayer(layer);
|
29658 | }
|
29659 | else {
|
29660 | return new subclasses[layer.type](layer);
|
29661 | }
|
29662 | }
|
29663 |
|
29664 | /**
|
29665 | * Invokes the wrapped function in a non-blocking way when trigger() is called. Invocation requests
|
29666 | * are ignored until the function was actually invoked.
|
29667 | *
|
29668 | * @private
|
29669 | */
|
29670 | class ThrottledInvoker {
|
29671 | constructor(callback) {
|
29672 | this._callback = callback;
|
29673 | this._triggered = false;
|
29674 | if (typeof MessageChannel !== 'undefined') {
|
29675 | this._channel = new MessageChannel();
|
29676 | this._channel.port2.onmessage = () => {
|
29677 | this._triggered = false;
|
29678 | this._callback();
|
29679 | };
|
29680 | }
|
29681 | }
|
29682 | trigger() {
|
29683 | if (!this._triggered) {
|
29684 | this._triggered = true;
|
29685 | if (this._channel) {
|
29686 | this._channel.port1.postMessage(true);
|
29687 | }
|
29688 | else {
|
29689 | setTimeout(() => {
|
29690 | this._triggered = false;
|
29691 | this._callback();
|
29692 | }, 0);
|
29693 | }
|
29694 | }
|
29695 | }
|
29696 | remove() {
|
29697 | delete this._channel;
|
29698 | this._callback = () => { };
|
29699 | }
|
29700 | }
|
29701 |
|
29702 | /**
|
29703 | * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model)
|
29704 | * that maintains the relationship between asynchronous tasks and the objects
|
29705 | * that spin them off - in this case, tasks like parsing parts of styles,
|
29706 | * owned by the styles
|
29707 | *
|
29708 | * @param {WebWorker} target
|
29709 | * @param {WebWorker} parent
|
29710 | * @param {string|number} mapId A unique identifier for the Map instance using this Actor.
|
29711 | * @private
|
29712 | */
|
29713 | class Actor {
|
29714 | constructor(target, parent, mapId) {
|
29715 | this.target = target;
|
29716 | this.parent = parent;
|
29717 | this.mapId = mapId;
|
29718 | this.callbacks = {};
|
29719 | this.tasks = {};
|
29720 | this.taskQueue = [];
|
29721 | this.cancelCallbacks = {};
|
29722 | bindAll(['receive', 'process'], this);
|
29723 | this.invoker = new ThrottledInvoker(this.process);
|
29724 | this.target.addEventListener('message', this.receive, false);
|
29725 | this.globalScope = isWorker() ? target : window;
|
29726 | }
|
29727 | /**
|
29728 | * Sends a message from a main-thread map to a Worker or from a Worker back to
|
29729 | * a main-thread map instance.
|
29730 | *
|
29731 | * @param type The name of the target method to invoke or '[source-type].[source-name].name' for a method on a WorkerSource.
|
29732 | * @param targetMapId A particular mapId to which to send this message.
|
29733 | * @private
|
29734 | */
|
29735 | send(type, data, callback, targetMapId, mustQueue = false) {
|
29736 | // We're using a string ID instead of numbers because they are being used as object keys
|
29737 | // anyway, and thus stringified implicitly. We use random IDs because an actor may receive
|
29738 | // message from multiple other actors which could run in different execution context. A
|
29739 | // linearly increasing ID could produce collisions.
|
29740 | const id = Math.round((Math.random() * 1e18)).toString(36).substring(0, 10);
|
29741 | if (callback) {
|
29742 | this.callbacks[id] = callback;
|
29743 | }
|
29744 | const buffers = isSafari(this.globalScope) ? undefined : [];
|
29745 | this.target.postMessage({
|
29746 | id,
|
29747 | type,
|
29748 | hasCallback: !!callback,
|
29749 | targetMapId,
|
29750 | mustQueue,
|
29751 | sourceMapId: this.mapId,
|
29752 | data: serialize(data, buffers)
|
29753 | }, buffers);
|
29754 | return {
|
29755 | cancel: () => {
|
29756 | if (callback) {
|
29757 | // Set the callback to null so that it never fires after the request is aborted.
|
29758 | delete this.callbacks[id];
|
29759 | }
|
29760 | this.target.postMessage({
|
29761 | id,
|
29762 | type: '<cancel>',
|
29763 | targetMapId,
|
29764 | sourceMapId: this.mapId
|
29765 | });
|
29766 | }
|
29767 | };
|
29768 | }
|
29769 | receive(message) {
|
29770 | const data = message.data, id = data.id;
|
29771 | if (!id) {
|
29772 | return;
|
29773 | }
|
29774 | if (data.targetMapId && this.mapId !== data.targetMapId) {
|
29775 | return;
|
29776 | }
|
29777 | if (data.type === '<cancel>') {
|
29778 | // Remove the original request from the queue. This is only possible if it
|
29779 | // hasn't been kicked off yet. The id will remain in the queue, but because
|
29780 | // there is no associated task, it will be dropped once it's time to execute it.
|
29781 | delete this.tasks[id];
|
29782 | const cancel = this.cancelCallbacks[id];
|
29783 | delete this.cancelCallbacks[id];
|
29784 | if (cancel) {
|
29785 | cancel();
|
29786 | }
|
29787 | }
|
29788 | else {
|
29789 | if (isWorker() || data.mustQueue) {
|
29790 | // In workers, store the tasks that we need to process before actually processing them. This
|
29791 | // is necessary because we want to keep receiving messages, and in particular,
|
29792 | // <cancel> messages. Some tasks may take a while in the worker thread, so before
|
29793 | // executing the next task in our queue, postMessage preempts this and <cancel>
|
29794 | // messages can be processed. We're using a MessageChannel object to get throttle the
|
29795 | // process() flow to one at a time.
|
29796 | this.tasks[id] = data;
|
29797 | this.taskQueue.push(id);
|
29798 | this.invoker.trigger();
|
29799 | }
|
29800 | else {
|
29801 | // In the main thread, process messages immediately so that other work does not slip in
|
29802 | // between getting partial data back from workers.
|
29803 | this.processTask(id, data);
|
29804 | }
|
29805 | }
|
29806 | }
|
29807 | process() {
|
29808 | if (!this.taskQueue.length) {
|
29809 | return;
|
29810 | }
|
29811 | const id = this.taskQueue.shift();
|
29812 | const task = this.tasks[id];
|
29813 | delete this.tasks[id];
|
29814 | // Schedule another process call if we know there's more to process _before_ invoking the
|
29815 | // current task. This is necessary so that processing continues even if the current task
|
29816 | // doesn't execute successfully.
|
29817 | if (this.taskQueue.length) {
|
29818 | this.invoker.trigger();
|
29819 | }
|
29820 | if (!task) {
|
29821 | // If the task ID doesn't have associated task data anymore, it was canceled.
|
29822 | return;
|
29823 | }
|
29824 | this.processTask(id, task);
|
29825 | }
|
29826 | processTask(id, task) {
|
29827 | if (task.type === '<response>') {
|
29828 | // The done() function in the counterpart has been called, and we are now
|
29829 | // firing the callback in the originating actor, if there is one.
|
29830 | const callback = this.callbacks[id];
|
29831 | delete this.callbacks[id];
|
29832 | if (callback) {
|
29833 | // If we get a response, but don't have a callback, the request was canceled.
|
29834 | if (task.error) {
|
29835 | callback(deserialize(task.error));
|
29836 | }
|
29837 | else {
|
29838 | callback(null, deserialize(task.data));
|
29839 | }
|
29840 | }
|
29841 | }
|
29842 | else {
|
29843 | let completed = false;
|
29844 | const buffers = isSafari(this.globalScope) ? undefined : [];
|
29845 | const done = task.hasCallback ? (err, data) => {
|
29846 | completed = true;
|
29847 | delete this.cancelCallbacks[id];
|
29848 | this.target.postMessage({
|
29849 | id,
|
29850 | type: '<response>',
|
29851 | sourceMapId: this.mapId,
|
29852 | error: err ? serialize(err) : null,
|
29853 | data: serialize(data, buffers)
|
29854 | }, buffers);
|
29855 | } : (_) => {
|
29856 | completed = true;
|
29857 | };
|
29858 | let callback = null;
|
29859 | const params = deserialize(task.data);
|
29860 | if (this.parent[task.type]) {
|
29861 | // task.type == 'loadTile', 'removeTile', etc.
|
29862 | callback = this.parent[task.type](task.sourceMapId, params, done);
|
29863 | }
|
29864 | else if (this.parent.getWorkerSource) {
|
29865 | // task.type == sourcetype.method
|
29866 | const keys = task.type.split('.');
|
29867 | const scope = this.parent.getWorkerSource(task.sourceMapId, keys[0], params.source);
|
29868 | callback = scope[keys[1]](params, done);
|
29869 | }
|
29870 | else {
|
29871 | // No function was found.
|
29872 | done(new Error(`Could not find function ${task.type}`));
|
29873 | }
|
29874 | if (!completed && callback && callback.cancel) {
|
29875 | // Allows canceling the task as long as it hasn't been completed yet.
|
29876 | this.cancelCallbacks[id] = callback.cancel;
|
29877 | }
|
29878 | }
|
29879 | }
|
29880 | remove() {
|
29881 | this.invoker.remove();
|
29882 | this.target.removeEventListener('message', this.receive, false);
|
29883 | }
|
29884 | }
|
29885 |
|
29886 | /*
|
29887 | * Approximate radius of the earth in meters.
|
29888 | * Uses the WGS-84 approximation. The radius at the equator is ~6378137 and at the poles is ~6356752. https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84
|
29889 | * 6371008.8 is one published "average radius" see https://en.wikipedia.org/wiki/Earth_radius#Mean_radius, or ftp://athena.fsv.cvut.cz/ZFG/grs80-Moritz.pdf p.4
|
29890 | */
|
29891 | const earthRadius = 6371008.8;
|
29892 | /**
|
29893 | * A `LngLat` object represents a given longitude and latitude coordinate, measured in degrees.
|
29894 | * These coordinates are based on the [WGS84 (EPSG:4326) standard](https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84).
|
29895 | *
|
29896 | * MapLibre GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match the
|
29897 | * [GeoJSON specification](https://tools.ietf.org/html/rfc7946).
|
29898 | *
|
29899 | * Note that any MapLibre GL method that accepts a `LngLat` object as an argument or option
|
29900 | * can also accept an `Array` of two numbers and will perform an implicit conversion.
|
29901 | * This flexible type is documented as {@link LngLatLike}.
|
29902 | *
|
29903 | * @param {number} lng Longitude, measured in degrees.
|
29904 | * @param {number} lat Latitude, measured in degrees.
|
29905 | * @example
|
29906 | * var ll = new maplibregl.LngLat(-123.9749, 40.7736);
|
29907 | * ll.lng; // = -123.9749
|
29908 | * @see [Get coordinates of the mouse pointer](https://maplibre.org/maplibre-gl-js-docs/example/mouse-position/)
|
29909 | * @see [Display a popup](https://maplibre.org/maplibre-gl-js-docs/example/popup/)
|
29910 | * @see [Create a timeline animation](https://maplibre.org/maplibre-gl-js-docs/example/timeline-animation/)
|
29911 | */
|
29912 | class LngLat {
|
29913 | constructor(lng, lat) {
|
29914 | if (isNaN(lng) || isNaN(lat)) {
|
29915 | throw new Error(`Invalid LngLat object: (${lng}, ${lat})`);
|
29916 | }
|
29917 | this.lng = +lng;
|
29918 | this.lat = +lat;
|
29919 | if (this.lat > 90 || this.lat < -90) {
|
29920 | throw new Error('Invalid LngLat latitude value: must be between -90 and 90');
|
29921 | }
|
29922 | }
|
29923 | /**
|
29924 | * Returns a new `LngLat` object whose longitude is wrapped to the range (-180, 180).
|
29925 | *
|
29926 | * @returns {LngLat} The wrapped `LngLat` object.
|
29927 | * @example
|
29928 | * var ll = new maplibregl.LngLat(286.0251, 40.7736);
|
29929 | * var wrapped = ll.wrap();
|
29930 | * wrapped.lng; // = -73.9749
|
29931 | */
|
29932 | wrap() {
|
29933 | return new LngLat(wrap(this.lng, -180, 180), this.lat);
|
29934 | }
|
29935 | /**
|
29936 | * Returns the coordinates represented as an array of two numbers.
|
29937 | *
|
29938 | * @returns {Array<number>} The coordinates represeted as an array of longitude and latitude.
|
29939 | * @example
|
29940 | * var ll = new maplibregl.LngLat(-73.9749, 40.7736);
|
29941 | * ll.toArray(); // = [-73.9749, 40.7736]
|
29942 | */
|
29943 | toArray() {
|
29944 | return [this.lng, this.lat];
|
29945 | }
|
29946 | /**
|
29947 | * Returns the coordinates represent as a string.
|
29948 | *
|
29949 | * @returns {string} The coordinates represented as a string of the format `'LngLat(lng, lat)'`.
|
29950 | * @example
|
29951 | * var ll = new maplibregl.LngLat(-73.9749, 40.7736);
|
29952 | * ll.toString(); // = "LngLat(-73.9749, 40.7736)"
|
29953 | */
|
29954 | toString() {
|
29955 | return `LngLat(${this.lng}, ${this.lat})`;
|
29956 | }
|
29957 | /**
|
29958 | * Returns the approximate distance between a pair of coordinates in meters
|
29959 | * Uses the Haversine Formula (from R.W. Sinnott, "Virtues of the Haversine", Sky and Telescope, vol. 68, no. 2, 1984, p. 159)
|
29960 | *
|
29961 | * @param {LngLat} lngLat coordinates to compute the distance to
|
29962 | * @returns {number} Distance in meters between the two coordinates.
|
29963 | * @example
|
29964 | * var new_york = new maplibregl.LngLat(-74.0060, 40.7128);
|
29965 | * var los_angeles = new maplibregl.LngLat(-118.2437, 34.0522);
|
29966 | * new_york.distanceTo(los_angeles); // = 3935751.690893987, "true distance" using a non-spherical approximation is ~3966km
|
29967 | */
|
29968 | distanceTo(lngLat) {
|
29969 | const rad = Math.PI / 180;
|
29970 | const lat1 = this.lat * rad;
|
29971 | const lat2 = lngLat.lat * rad;
|
29972 | const a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((lngLat.lng - this.lng) * rad);
|
29973 | const maxMeters = earthRadius * Math.acos(Math.min(a, 1));
|
29974 | return maxMeters;
|
29975 | }
|
29976 | /**
|
29977 | * Returns a `LngLatBounds` from the coordinates extended by a given `radius`. The returned `LngLatBounds` completely contains the `radius`.
|
29978 | *
|
29979 | * @param {number} [radius=0] Distance in meters from the coordinates to extend the bounds.
|
29980 | * @returns {LngLatBounds} A new `LngLatBounds` object representing the coordinates extended by the `radius`.
|
29981 | * @example
|
29982 | * var ll = new maplibregl.LngLat(-73.9749, 40.7736);
|
29983 | * ll.toBounds(100).toArray(); // = [[-73.97501862141328, 40.77351016847229], [-73.97478137858673, 40.77368983152771]]
|
29984 | */
|
29985 | toBounds(radius = 0) {
|
29986 | const earthCircumferenceInMetersAtEquator = 40075017;
|
29987 | const latAccuracy = 360 * radius / earthCircumferenceInMetersAtEquator, lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat);
|
29988 | return new LngLatBounds$1(new LngLat(this.lng - lngAccuracy, this.lat - latAccuracy), new LngLat(this.lng + lngAccuracy, this.lat + latAccuracy));
|
29989 | }
|
29990 | /**
|
29991 | * Converts an array of two numbers or an object with `lng` and `lat` or `lon` and `lat` properties
|
29992 | * to a `LngLat` object.
|
29993 | *
|
29994 | * If a `LngLat` object is passed in, the function returns it unchanged.
|
29995 | *
|
29996 | * @param {LngLatLike} input An array of two numbers or object to convert, or a `LngLat` object to return.
|
29997 | * @returns {LngLat} A new `LngLat` object, if a conversion occurred, or the original `LngLat` object.
|
29998 | * @example
|
29999 | * var arr = [-73.9749, 40.7736];
|
30000 | * var ll = maplibregl.LngLat.convert(arr);
|
30001 | * ll; // = LngLat {lng: -73.9749, lat: 40.7736}
|
30002 | */
|
30003 | static convert(input) {
|
30004 | if (input instanceof LngLat) {
|
30005 | return input;
|
30006 | }
|
30007 | if (Array.isArray(input) && (input.length === 2 || input.length === 3)) {
|
30008 | return new LngLat(Number(input[0]), Number(input[1]));
|
30009 | }
|
30010 | if (!Array.isArray(input) && typeof input === 'object' && input !== null) {
|
30011 | return new LngLat(
|
30012 | // flow can't refine this to have one of lng or lat, so we have to cast to any
|
30013 | Number('lng' in input ? input.lng : input.lon), Number(input.lat));
|
30014 | }
|
30015 | throw new Error('`LngLatLike` argument must be specified as a LngLat instance, an object {lng: <lng>, lat: <lat>}, an object {lon: <lng>, lat: <lat>}, or an array of [<lng>, <lat>]');
|
30016 | }
|
30017 | }
|
30018 |
|
30019 | /**
|
30020 | * A `LngLatBounds` object represents a geographical bounding box,
|
30021 | * defined by its southwest and northeast points in longitude and latitude.
|
30022 | *
|
30023 | * If no arguments are provided to the constructor, a `null` bounding box is created.
|
30024 | *
|
30025 | * Note that any Mapbox GL method that accepts a `LngLatBounds` object as an argument or option
|
30026 | * can also accept an `Array` of two {@link LngLatLike} constructs and will perform an implicit conversion.
|
30027 | * This flexible type is documented as {@link LngLatBoundsLike}.
|
30028 | *
|
30029 | * @param {LngLatLike} [sw] The southwest corner of the bounding box.
|
30030 | * @param {LngLatLike} [ne] The northeast corner of the bounding box.
|
30031 | * @example
|
30032 | * var sw = new maplibregl.LngLat(-73.9876, 40.7661);
|
30033 | * var ne = new maplibregl.LngLat(-73.9397, 40.8002);
|
30034 | * var llb = new maplibregl.LngLatBounds(sw, ne);
|
30035 | */
|
30036 | class LngLatBounds {
|
30037 | // This constructor is too flexible to type. It should not be so flexible.
|
30038 | constructor(sw, ne) {
|
30039 | if (!sw) {
|
30040 | // noop
|
30041 | }
|
30042 | else if (ne) {
|
30043 | this.setSouthWest(sw).setNorthEast(ne);
|
30044 | }
|
30045 | else if (sw.length === 4) {
|
30046 | this.setSouthWest([sw[0], sw[1]]).setNorthEast([sw[2], sw[3]]);
|
30047 | }
|
30048 | else {
|
30049 | this.setSouthWest(sw[0]).setNorthEast(sw[1]);
|
30050 | }
|
30051 | }
|
30052 | /**
|
30053 | * Set the northeast corner of the bounding box
|
30054 | *
|
30055 | * @param {LngLatLike} ne a {@link LngLatLike} object describing the northeast corner of the bounding box.
|
30056 | * @returns {LngLatBounds} `this`
|
30057 | */
|
30058 | setNorthEast(ne) {
|
30059 | this._ne = ne instanceof LngLat ? new LngLat(ne.lng, ne.lat) : LngLat.convert(ne);
|
30060 | return this;
|
30061 | }
|
30062 | /**
|
30063 | * Set the southwest corner of the bounding box
|
30064 | *
|
30065 | * @param {LngLatLike} sw a {@link LngLatLike} object describing the southwest corner of the bounding box.
|
30066 | * @returns {LngLatBounds} `this`
|
30067 | */
|
30068 | setSouthWest(sw) {
|
30069 | this._sw = sw instanceof LngLat ? new LngLat(sw.lng, sw.lat) : LngLat.convert(sw);
|
30070 | return this;
|
30071 | }
|
30072 | /**
|
30073 | * Extend the bounds to include a given LngLatLike or LngLatBoundsLike.
|
30074 | *
|
30075 | * @param {LngLatLike|LngLatBoundsLike} obj object to extend to
|
30076 | * @returns {LngLatBounds} `this`
|
30077 | */
|
30078 | extend(obj) {
|
30079 | const sw = this._sw, ne = this._ne;
|
30080 | let sw2, ne2;
|
30081 | if (obj instanceof LngLat) {
|
30082 | sw2 = obj;
|
30083 | ne2 = obj;
|
30084 | }
|
30085 | else if (obj instanceof LngLatBounds) {
|
30086 | sw2 = obj._sw;
|
30087 | ne2 = obj._ne;
|
30088 | if (!sw2 || !ne2)
|
30089 | return this;
|
30090 | }
|
30091 | else {
|
30092 | if (Array.isArray(obj)) {
|
30093 | if (obj.length === 4 || obj.every(Array.isArray)) {
|
30094 | const lngLatBoundsObj = obj;
|
30095 | return this.extend(LngLatBounds.convert(lngLatBoundsObj));
|
30096 | }
|
30097 | else {
|
30098 | const lngLatObj = obj;
|
30099 | return this.extend(LngLat.convert(lngLatObj));
|
30100 | }
|
30101 | }
|
30102 | return this;
|
30103 | }
|
30104 | if (!sw && !ne) {
|
30105 | this._sw = new LngLat(sw2.lng, sw2.lat);
|
30106 | this._ne = new LngLat(ne2.lng, ne2.lat);
|
30107 | }
|
30108 | else {
|
30109 | sw.lng = Math.min(sw2.lng, sw.lng);
|
30110 | sw.lat = Math.min(sw2.lat, sw.lat);
|
30111 | ne.lng = Math.max(ne2.lng, ne.lng);
|
30112 | ne.lat = Math.max(ne2.lat, ne.lat);
|
30113 | }
|
30114 | return this;
|
30115 | }
|
30116 | /**
|
30117 | * Returns the geographical coordinate equidistant from the bounding box's corners.
|
30118 | *
|
30119 | * @returns {LngLat} The bounding box's center.
|
30120 | * @example
|
30121 | * var llb = new maplibregl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);
|
30122 | * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315}
|
30123 | */
|
30124 | getCenter() {
|
30125 | return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2);
|
30126 | }
|
30127 | /**
|
30128 | * Returns the southwest corner of the bounding box.
|
30129 | *
|
30130 | * @returns {LngLat} The southwest corner of the bounding box.
|
30131 | */
|
30132 | getSouthWest() { return this._sw; }
|
30133 | /**
|
30134 | * Returns the northeast corner of the bounding box.
|
30135 | *
|
30136 | * @returns {LngLat} The northeast corner of the bounding box.
|
30137 | */
|
30138 | getNorthEast() { return this._ne; }
|
30139 | /**
|
30140 | * Returns the northwest corner of the bounding box.
|
30141 | *
|
30142 | * @returns {LngLat} The northwest corner of the bounding box.
|
30143 | */
|
30144 | getNorthWest() { return new LngLat(this.getWest(), this.getNorth()); }
|
30145 | /**
|
30146 | * Returns the southeast corner of the bounding box.
|
30147 | *
|
30148 | * @returns {LngLat} The southeast corner of the bounding box.
|
30149 | */
|
30150 | getSouthEast() { return new LngLat(this.getEast(), this.getSouth()); }
|
30151 | /**
|
30152 | * Returns the west edge of the bounding box.
|
30153 | *
|
30154 | * @returns {number} The west edge of the bounding box.
|
30155 | */
|
30156 | getWest() { return this._sw.lng; }
|
30157 | /**
|
30158 | * Returns the south edge of the bounding box.
|
30159 | *
|
30160 | * @returns {number} The south edge of the bounding box.
|
30161 | */
|
30162 | getSouth() { return this._sw.lat; }
|
30163 | /**
|
30164 | * Returns the east edge of the bounding box.
|
30165 | *
|
30166 | * @returns {number} The east edge of the bounding box.
|
30167 | */
|
30168 | getEast() { return this._ne.lng; }
|
30169 | /**
|
30170 | * Returns the north edge of the bounding box.
|
30171 | *
|
30172 | * @returns {number} The north edge of the bounding box.
|
30173 | */
|
30174 | getNorth() { return this._ne.lat; }
|
30175 | /**
|
30176 | * Returns the bounding box represented as an array.
|
30177 | *
|
30178 | * @returns {Array<Array<number>>} The bounding box represented as an array, consisting of the
|
30179 | * southwest and northeast coordinates of the bounding represented as arrays of numbers.
|
30180 | * @example
|
30181 | * var llb = new maplibregl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);
|
30182 | * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]]
|
30183 | */
|
30184 | toArray() {
|
30185 | return [this._sw.toArray(), this._ne.toArray()];
|
30186 | }
|
30187 | /**
|
30188 | * Return the bounding box represented as a string.
|
30189 | *
|
30190 | * @returns {string} The bounding box represents as a string of the format
|
30191 | * `'LngLatBounds(LngLat(lng, lat), LngLat(lng, lat))'`.
|
30192 | * @example
|
30193 | * var llb = new maplibregl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);
|
30194 | * llb.toString(); // = "LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))"
|
30195 | */
|
30196 | toString() {
|
30197 | return `LngLatBounds(${this._sw.toString()}, ${this._ne.toString()})`;
|
30198 | }
|
30199 | /**
|
30200 | * Check if the bounding box is an empty/`null`-type box.
|
30201 | *
|
30202 | * @returns {boolean} True if bounds have been defined, otherwise false.
|
30203 | */
|
30204 | isEmpty() {
|
30205 | return !(this._sw && this._ne);
|
30206 | }
|
30207 | /**
|
30208 | * Check if the point is within the bounding box.
|
30209 | *
|
30210 | * @param {LngLatLike} lnglat geographic point to check against.
|
30211 | * @returns {boolean} True if the point is within the bounding box.
|
30212 | * @example
|
30213 | * var llb = new maplibregl.LngLatBounds(
|
30214 | * new maplibregl.LngLat(-73.9876, 40.7661),
|
30215 | * new maplibregl.LngLat(-73.9397, 40.8002)
|
30216 | * );
|
30217 | *
|
30218 | * var ll = new maplibregl.LngLat(-73.9567, 40.7789);
|
30219 | *
|
30220 | * console.log(llb.contains(ll)); // = true
|
30221 | */
|
30222 | contains(lnglat) {
|
30223 | const { lng, lat } = LngLat.convert(lnglat);
|
30224 | const containsLatitude = this._sw.lat <= lat && lat <= this._ne.lat;
|
30225 | let containsLongitude = this._sw.lng <= lng && lng <= this._ne.lng;
|
30226 | if (this._sw.lng > this._ne.lng) { // wrapped coordinates
|
30227 | containsLongitude = this._sw.lng >= lng && lng >= this._ne.lng;
|
30228 | }
|
30229 | return containsLatitude && containsLongitude;
|
30230 | }
|
30231 | /**
|
30232 | * Converts an array to a `LngLatBounds` object.
|
30233 | *
|
30234 | * If a `LngLatBounds` object is passed in, the function returns it unchanged.
|
30235 | *
|
30236 | * Internally, the function calls `LngLat#convert` to convert arrays to `LngLat` values.
|
30237 | *
|
30238 | * @param {LngLatBoundsLike} input An array of two coordinates to convert, or a `LngLatBounds` object to return.
|
30239 | * @returns {LngLatBounds} A new `LngLatBounds` object, if a conversion occurred, or the original `LngLatBounds` object.
|
30240 | * @example
|
30241 | * var arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]];
|
30242 | * var llb = maplibregl.LngLatBounds.convert(arr);
|
30243 | * llb; // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}}
|
30244 | */
|
30245 | static convert(input) {
|
30246 | if (input instanceof LngLatBounds)
|
30247 | return input;
|
30248 | if (!input)
|
30249 | return input;
|
30250 | return new LngLatBounds(input);
|
30251 | }
|
30252 | }
|
30253 | var LngLatBounds$1 = LngLatBounds;
|
30254 |
|
30255 | /*
|
30256 | * The average circumference of the world in meters.
|
30257 | */
|
30258 | const earthCircumfrence = 2 * Math.PI * earthRadius; // meters
|
30259 | /*
|
30260 | * The circumference at a line of latitude in meters.
|
30261 | */
|
30262 | function circumferenceAtLatitude(latitude) {
|
30263 | return earthCircumfrence * Math.cos(latitude * Math.PI / 180);
|
30264 | }
|
30265 | function mercatorXfromLng(lng) {
|
30266 | return (180 + lng) / 360;
|
30267 | }
|
30268 | function mercatorYfromLat(lat) {
|
30269 | return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360;
|
30270 | }
|
30271 | function mercatorZfromAltitude(altitude, lat) {
|
30272 | return altitude / circumferenceAtLatitude(lat);
|
30273 | }
|
30274 | function lngFromMercatorX(x) {
|
30275 | return x * 360 - 180;
|
30276 | }
|
30277 | function latFromMercatorY(y) {
|
30278 | const y2 = 180 - y * 360;
|
30279 | return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90;
|
30280 | }
|
30281 | function altitudeFromMercatorZ(z, y) {
|
30282 | return z * circumferenceAtLatitude(latFromMercatorY(y));
|
30283 | }
|
30284 | /**
|
30285 | * Determine the Mercator scale factor for a given latitude, see
|
30286 | * https://en.wikipedia.org/wiki/Mercator_projection#Scale_factor
|
30287 | *
|
30288 | * At the equator the scale factor will be 1, which increases at higher latitudes.
|
30289 | *
|
30290 | * @param {number} lat Latitude
|
30291 | * @returns {number} scale factor
|
30292 | * @private
|
30293 | */
|
30294 | function mercatorScale(lat) {
|
30295 | return 1 / Math.cos(lat * Math.PI / 180);
|
30296 | }
|
30297 | /**
|
30298 | * A `MercatorCoordinate` object represents a projected three dimensional position.
|
30299 | *
|
30300 | * `MercatorCoordinate` uses the web mercator projection ([EPSG:3857](https://epsg.io/3857)) with slightly different units:
|
30301 | * - the size of 1 unit is the width of the projected world instead of the "mercator meter"
|
30302 | * - the origin of the coordinate space is at the north-west corner instead of the middle
|
30303 | *
|
30304 | * For example, `MercatorCoordinate(0, 0, 0)` is the north-west corner of the mercator world and
|
30305 | * `MercatorCoordinate(1, 1, 0)` is the south-east corner. If you are familiar with
|
30306 | * [vector tiles](https://github.com/mapbox/vector-tile-spec) it may be helpful to think
|
30307 | * of the coordinate space as the `0/0/0` tile with an extent of `1`.
|
30308 | *
|
30309 | * The `z` dimension of `MercatorCoordinate` is conformal. A cube in the mercator coordinate space would be rendered as a cube.
|
30310 | *
|
30311 | * @param {number} x The x component of the position.
|
30312 | * @param {number} y The y component of the position.
|
30313 | * @param {number} z The z component of the position.
|
30314 | * @example
|
30315 | * var nullIsland = new maplibregl.MercatorCoordinate(0.5, 0.5, 0);
|
30316 | *
|
30317 | * @see [Add a custom style layer](https://maplibre.org/maplibre-gl-js-docs/example/custom-style-layer/)
|
30318 | */
|
30319 | class MercatorCoordinate {
|
30320 | constructor(x, y, z = 0) {
|
30321 | this.x = +x;
|
30322 | this.y = +y;
|
30323 | this.z = +z;
|
30324 | }
|
30325 | /**
|
30326 | * Project a `LngLat` to a `MercatorCoordinate`.
|
30327 | *
|
30328 | * @param {LngLatLike} lngLatLike The location to project.
|
30329 | * @param {number} altitude The altitude in meters of the position.
|
30330 | * @returns {MercatorCoordinate} The projected mercator coordinate.
|
30331 | * @example
|
30332 | * var coord = maplibregl.MercatorCoordinate.fromLngLat({ lng: 0, lat: 0}, 0);
|
30333 | * coord; // MercatorCoordinate(0.5, 0.5, 0)
|
30334 | */
|
30335 | static fromLngLat(lngLatLike, altitude = 0) {
|
30336 | const lngLat = LngLat.convert(lngLatLike);
|
30337 | return new MercatorCoordinate(mercatorXfromLng(lngLat.lng), mercatorYfromLat(lngLat.lat), mercatorZfromAltitude(altitude, lngLat.lat));
|
30338 | }
|
30339 | /**
|
30340 | * Returns the `LngLat` for the coordinate.
|
30341 | *
|
30342 | * @returns {LngLat} The `LngLat` object.
|
30343 | * @example
|
30344 | * var coord = new maplibregl.MercatorCoordinate(0.5, 0.5, 0);
|
30345 | * var lngLat = coord.toLngLat(); // LngLat(0, 0)
|
30346 | */
|
30347 | toLngLat() {
|
30348 | return new LngLat(lngFromMercatorX(this.x), latFromMercatorY(this.y));
|
30349 | }
|
30350 | /**
|
30351 | * Returns the altitude in meters of the coordinate.
|
30352 | *
|
30353 | * @returns {number} The altitude in meters.
|
30354 | * @example
|
30355 | * var coord = new maplibregl.MercatorCoordinate(0, 0, 0.02);
|
30356 | * coord.toAltitude(); // 6914.281956295339
|
30357 | */
|
30358 | toAltitude() {
|
30359 | return altitudeFromMercatorZ(this.z, this.y);
|
30360 | }
|
30361 | /**
|
30362 | * Returns the distance of 1 meter in `MercatorCoordinate` units at this latitude.
|
30363 | *
|
30364 | * For coordinates in real world units using meters, this naturally provides the scale
|
30365 | * to transform into `MercatorCoordinate`s.
|
30366 | *
|
30367 | * @returns {number} Distance of 1 meter in `MercatorCoordinate` units.
|
30368 | */
|
30369 | meterInMercatorCoordinateUnits() {
|
30370 | // 1 meter / circumference at equator in meters * Mercator projection scale factor at this latitude
|
30371 | return 1 / earthCircumfrence * mercatorScale(latFromMercatorY(this.y));
|
30372 | }
|
30373 | }
|
30374 |
|
30375 | /**
|
30376 | * getURL
|
30377 | *
|
30378 | * @param {String} baseUrl Base url of the WMS server
|
30379 | * @param {String} layer Layer name
|
30380 | * @param {Number} x Tile coordinate x
|
30381 | * @param {Number} y Tile coordinate y
|
30382 | * @param {Number} z Tile zoom
|
30383 | * @param {Object} [options]
|
30384 | * @param {String} [options.format='image/png']
|
30385 | * @param {String} [options.service='WMS']
|
30386 | * @param {String} [options.version='1.1.1']
|
30387 | * @param {String} [options.request='GetMap']
|
30388 | * @param {String} [options.srs='EPSG:3857']
|
30389 | * @param {Number} [options.width='256']
|
30390 | * @param {Number} [options.height='256']
|
30391 | * @returns {String} url
|
30392 | * @example
|
30393 | * var baseUrl = 'http://geodata.state.nj.us/imagerywms/Natural2015';
|
30394 | * var layer = 'Natural2015';
|
30395 | * var url = whoots.getURL(baseUrl, layer, 154308, 197167, 19);
|
30396 | */
|
30397 | function getURL(baseUrl, layer, x, y, z, options) {
|
30398 | options = options || {};
|
30399 |
|
30400 | var url = baseUrl + '?' + [
|
30401 | 'bbox=' + getTileBBox(x, y, z),
|
30402 | 'format=' + (options.format || 'image/png'),
|
30403 | 'service=' + (options.service || 'WMS'),
|
30404 | 'version=' + (options.version || '1.1.1'),
|
30405 | 'request=' + (options.request || 'GetMap'),
|
30406 | 'srs=' + (options.srs || 'EPSG:3857'),
|
30407 | 'width=' + (options.width || 256),
|
30408 | 'height=' + (options.height || 256),
|
30409 | 'layers=' + layer
|
30410 | ].join('&');
|
30411 |
|
30412 | return url;
|
30413 | }
|
30414 |
|
30415 |
|
30416 | /**
|
30417 | * getTileBBox
|
30418 | *
|
30419 | * @param {Number} x Tile coordinate x
|
30420 | * @param {Number} y Tile coordinate y
|
30421 | * @param {Number} z Tile zoom
|
30422 | * @returns {String} String of the bounding box
|
30423 | */
|
30424 | function getTileBBox(x, y, z) {
|
30425 | // for Google/OSM tile scheme we need to alter the y
|
30426 | y = (Math.pow(2, z) - y - 1);
|
30427 |
|
30428 | var min = getMercCoords(x * 256, y * 256, z),
|
30429 | max = getMercCoords((x + 1) * 256, (y + 1) * 256, z);
|
30430 |
|
30431 | return min[0] + ',' + min[1] + ',' + max[0] + ',' + max[1];
|
30432 | }
|
30433 |
|
30434 |
|
30435 | /**
|
30436 | * getMercCoords
|
30437 | *
|
30438 | * @param {Number} x Pixel coordinate x
|
30439 | * @param {Number} y Pixel coordinate y
|
30440 | * @param {Number} z Tile zoom
|
30441 | * @returns {Array} [x, y]
|
30442 | */
|
30443 | function getMercCoords(x, y, z) {
|
30444 | var resolution = (2 * Math.PI * 6378137 / 256) / Math.pow(2, z),
|
30445 | merc_x = (x * resolution - 2 * Math.PI * 6378137 / 2.0),
|
30446 | merc_y = (y * resolution - 2 * Math.PI * 6378137 / 2.0);
|
30447 |
|
30448 | return [merc_x, merc_y];
|
30449 | }
|
30450 |
|
30451 | class CanonicalTileID {
|
30452 | constructor(z, x, y) {
|
30453 | assert$1(z >= 0 && z <= 25);
|
30454 | assert$1(x >= 0 && x < Math.pow(2, z));
|
30455 | assert$1(y >= 0 && y < Math.pow(2, z));
|
30456 | this.z = z;
|
30457 | this.x = x;
|
30458 | this.y = y;
|
30459 | this.key = calculateKey(0, z, z, x, y);
|
30460 | }
|
30461 | equals(id) {
|
30462 | return this.z === id.z && this.x === id.x && this.y === id.y;
|
30463 | }
|
30464 | // given a list of urls, choose a url template and return a tile URL
|
30465 | url(urls, pixelRatio, scheme) {
|
30466 | const bbox = getTileBBox(this.x, this.y, this.z);
|
30467 | const quadkey = getQuadkey(this.z, this.x, this.y);
|
30468 | return urls[(this.x + this.y) % urls.length]
|
30469 | .replace(/{prefix}/g, (this.x % 16).toString(16) + (this.y % 16).toString(16))
|
30470 | .replace(/{z}/g, String(this.z))
|
30471 | .replace(/{x}/g, String(this.x))
|
30472 | .replace(/{y}/g, String(scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y))
|
30473 | .replace(/{ratio}/g, pixelRatio > 1 ? '@2x' : '')
|
30474 | .replace(/{quadkey}/g, quadkey)
|
30475 | .replace(/{bbox-epsg-3857}/g, bbox);
|
30476 | }
|
30477 | getTilePoint(coord) {
|
30478 | const tilesAtZoom = Math.pow(2, this.z);
|
30479 | return new pointGeometry((coord.x * tilesAtZoom - this.x) * EXTENT, (coord.y * tilesAtZoom - this.y) * EXTENT);
|
30480 | }
|
30481 | toString() {
|
30482 | return `${this.z}/${this.x}/${this.y}`;
|
30483 | }
|
30484 | }
|
30485 | class UnwrappedTileID {
|
30486 | constructor(wrap, canonical) {
|
30487 | this.wrap = wrap;
|
30488 | this.canonical = canonical;
|
30489 | this.key = calculateKey(wrap, canonical.z, canonical.z, canonical.x, canonical.y);
|
30490 | }
|
30491 | }
|
30492 | class OverscaledTileID {
|
30493 | constructor(overscaledZ, wrap, z, x, y) {
|
30494 | assert$1(overscaledZ >= z);
|
30495 | this.overscaledZ = overscaledZ;
|
30496 | this.wrap = wrap;
|
30497 | this.canonical = new CanonicalTileID(z, +x, +y);
|
30498 | this.key = calculateKey(wrap, overscaledZ, z, x, y);
|
30499 | }
|
30500 | equals(id) {
|
30501 | return this.overscaledZ === id.overscaledZ && this.wrap === id.wrap && this.canonical.equals(id.canonical);
|
30502 | }
|
30503 | scaledTo(targetZ) {
|
30504 | assert$1(targetZ <= this.overscaledZ);
|
30505 | const zDifference = this.canonical.z - targetZ;
|
30506 | if (targetZ > this.canonical.z) {
|
30507 | return new OverscaledTileID(targetZ, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y);
|
30508 | }
|
30509 | else {
|
30510 | return new OverscaledTileID(targetZ, this.wrap, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference);
|
30511 | }
|
30512 | }
|
30513 | /*
|
30514 | * calculateScaledKey is an optimization:
|
30515 | * when withWrap == true, implements the same as this.scaledTo(z).key,
|
30516 | * when withWrap == false, implements the same as this.scaledTo(z).wrapped().key.
|
30517 | */
|
30518 | calculateScaledKey(targetZ, withWrap) {
|
30519 | assert$1(targetZ <= this.overscaledZ);
|
30520 | const zDifference = this.canonical.z - targetZ;
|
30521 | if (targetZ > this.canonical.z) {
|
30522 | return calculateKey(this.wrap * +withWrap, targetZ, this.canonical.z, this.canonical.x, this.canonical.y);
|
30523 | }
|
30524 | else {
|
30525 | return calculateKey(this.wrap * +withWrap, targetZ, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference);
|
30526 | }
|
30527 | }
|
30528 | isChildOf(parent) {
|
30529 | if (parent.wrap !== this.wrap) {
|
30530 | // We can't be a child if we're in a different world copy
|
30531 | return false;
|
30532 | }
|
30533 | const zDifference = this.canonical.z - parent.canonical.z;
|
30534 | // We're first testing for z == 0, to avoid a 32 bit shift, which is undefined.
|
30535 | return parent.overscaledZ === 0 || (parent.overscaledZ < this.overscaledZ &&
|
30536 | parent.canonical.x === (this.canonical.x >> zDifference) &&
|
30537 | parent.canonical.y === (this.canonical.y >> zDifference));
|
30538 | }
|
30539 | children(sourceMaxZoom) {
|
30540 | if (this.overscaledZ >= sourceMaxZoom) {
|
30541 | // return a single tile coord representing a an overscaled tile
|
30542 | return [new OverscaledTileID(this.overscaledZ + 1, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y)];
|
30543 | }
|
30544 | const z = this.canonical.z + 1;
|
30545 | const x = this.canonical.x * 2;
|
30546 | const y = this.canonical.y * 2;
|
30547 | return [
|
30548 | new OverscaledTileID(z, this.wrap, z, x, y),
|
30549 | new OverscaledTileID(z, this.wrap, z, x + 1, y),
|
30550 | new OverscaledTileID(z, this.wrap, z, x, y + 1),
|
30551 | new OverscaledTileID(z, this.wrap, z, x + 1, y + 1)
|
30552 | ];
|
30553 | }
|
30554 | isLessThan(rhs) {
|
30555 | if (this.wrap < rhs.wrap)
|
30556 | return true;
|
30557 | if (this.wrap > rhs.wrap)
|
30558 | return false;
|
30559 | if (this.overscaledZ < rhs.overscaledZ)
|
30560 | return true;
|
30561 | if (this.overscaledZ > rhs.overscaledZ)
|
30562 | return false;
|
30563 | if (this.canonical.x < rhs.canonical.x)
|
30564 | return true;
|
30565 | if (this.canonical.x > rhs.canonical.x)
|
30566 | return false;
|
30567 | if (this.canonical.y < rhs.canonical.y)
|
30568 | return true;
|
30569 | return false;
|
30570 | }
|
30571 | wrapped() {
|
30572 | return new OverscaledTileID(this.overscaledZ, 0, this.canonical.z, this.canonical.x, this.canonical.y);
|
30573 | }
|
30574 | unwrapTo(wrap) {
|
30575 | return new OverscaledTileID(this.overscaledZ, wrap, this.canonical.z, this.canonical.x, this.canonical.y);
|
30576 | }
|
30577 | overscaleFactor() {
|
30578 | return Math.pow(2, this.overscaledZ - this.canonical.z);
|
30579 | }
|
30580 | toUnwrapped() {
|
30581 | return new UnwrappedTileID(this.wrap, this.canonical);
|
30582 | }
|
30583 | toString() {
|
30584 | return `${this.overscaledZ}/${this.canonical.x}/${this.canonical.y}`;
|
30585 | }
|
30586 | getTilePoint(coord) {
|
30587 | return this.canonical.getTilePoint(new MercatorCoordinate(coord.x - this.wrap, coord.y));
|
30588 | }
|
30589 | }
|
30590 | function calculateKey(wrap, overscaledZ, z, x, y) {
|
30591 | wrap *= 2;
|
30592 | if (wrap < 0)
|
30593 | wrap = wrap * -1 - 1;
|
30594 | const dim = 1 << z;
|
30595 | return (dim * dim * wrap + dim * y + x).toString(36) + z.toString(36) + overscaledZ.toString(36);
|
30596 | }
|
30597 | function getQuadkey(z, x, y) {
|
30598 | let quadkey = '', mask;
|
30599 | for (let i = z; i > 0; i--) {
|
30600 | mask = 1 << (i - 1);
|
30601 | quadkey += ((x & mask ? 1 : 0) + (y & mask ? 2 : 0));
|
30602 | }
|
30603 | return quadkey;
|
30604 | }
|
30605 | register('CanonicalTileID', CanonicalTileID);
|
30606 | register('OverscaledTileID', OverscaledTileID, { omit: ['posMatrix'] });
|
30607 |
|
30608 | // DEMData is a data structure for decoding, backfilling, and storing elevation data for processing in the hillshade shaders
|
30609 | // data can be populated either from a pngraw image tile or from serliazed data sent back from a worker. When data is initially
|
30610 | // loaded from a image tile, we decode the pixel values using the appropriate decoding formula, but we store the
|
30611 | // elevation data as an Int32 value. we add 65536 (2^16) to eliminate negative values and enable the use of
|
30612 | // integer overflow when creating the texture used in the hillshadePrepare step.
|
30613 | // DEMData also handles the backfilling of data from a tile's neighboring tiles. This is necessary because we use a pixel's 8
|
30614 | // surrounding pixel values to compute the slope at that pixel, and we cannot accurately calculate the slope at pixels on a
|
30615 | // tile's edge without backfilling from neighboring tiles.
|
30616 | class DEMData {
|
30617 | // RGBAImage data has uniform 1px padding on all sides: square tile edge size defines stride
|
30618 | // and dim is calculated as stride - 2.
|
30619 | constructor(uid, data, encoding) {
|
30620 | this.uid = uid;
|
30621 | if (data.height !== data.width)
|
30622 | throw new RangeError('DEM tiles must be square');
|
30623 | if (encoding && encoding !== 'mapbox' && encoding !== 'terrarium') {
|
30624 | warnOnce(`"${encoding}" is not a valid encoding type. Valid types include "mapbox" and "terrarium".`);
|
30625 | return;
|
30626 | }
|
30627 | this.stride = data.height;
|
30628 | const dim = this.dim = data.height - 2;
|
30629 | this.data = new Uint32Array(data.data.buffer);
|
30630 | this.encoding = encoding || 'mapbox';
|
30631 | // in order to avoid flashing seams between tiles, here we are initially populating a 1px border of pixels around the image
|
30632 | // with the data of the nearest pixel from the image. this data is eventually replaced when the tile's neighboring
|
30633 | // tiles are loaded and the accurate data can be backfilled using DEMData#backfillBorder
|
30634 | for (let x = 0; x < dim; x++) {
|
30635 | // left vertical border
|
30636 | this.data[this._idx(-1, x)] = this.data[this._idx(0, x)];
|
30637 | // right vertical border
|
30638 | this.data[this._idx(dim, x)] = this.data[this._idx(dim - 1, x)];
|
30639 | // left horizontal border
|
30640 | this.data[this._idx(x, -1)] = this.data[this._idx(x, 0)];
|
30641 | // right horizontal border
|
30642 | this.data[this._idx(x, dim)] = this.data[this._idx(x, dim - 1)];
|
30643 | }
|
30644 | // corners
|
30645 | this.data[this._idx(-1, -1)] = this.data[this._idx(0, 0)];
|
30646 | this.data[this._idx(dim, -1)] = this.data[this._idx(dim - 1, 0)];
|
30647 | this.data[this._idx(-1, dim)] = this.data[this._idx(0, dim - 1)];
|
30648 | this.data[this._idx(dim, dim)] = this.data[this._idx(dim - 1, dim - 1)];
|
30649 | }
|
30650 | get(x, y) {
|
30651 | const pixels = new Uint8Array(this.data.buffer);
|
30652 | const index = this._idx(x, y) * 4;
|
30653 | const unpack = this.encoding === 'terrarium' ? this._unpackTerrarium : this._unpackMapbox;
|
30654 | return unpack(pixels[index], pixels[index + 1], pixels[index + 2]);
|
30655 | }
|
30656 | getUnpackVector() {
|
30657 | return this.encoding === 'terrarium' ? [256.0, 1.0, 1.0 / 256.0, 32768.0] : [6553.6, 25.6, 0.1, 10000.0];
|
30658 | }
|
30659 | _idx(x, y) {
|
30660 | if (x < -1 || x >= this.dim + 1 || y < -1 || y >= this.dim + 1)
|
30661 | throw new RangeError('out of range source coordinates for DEM data');
|
30662 | return (y + 1) * this.stride + (x + 1);
|
30663 | }
|
30664 | _unpackMapbox(r, g, b) {
|
30665 | // unpacking formula for mapbox.terrain-rgb:
|
30666 | // https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb
|
30667 | return ((r * 256 * 256 + g * 256.0 + b) / 10.0 - 10000.0);
|
30668 | }
|
30669 | _unpackTerrarium(r, g, b) {
|
30670 | // unpacking formula for mapzen terrarium:
|
30671 | // https://aws.amazon.com/public-datasets/terrain/
|
30672 | return ((r * 256 + g + b / 256) - 32768.0);
|
30673 | }
|
30674 | getPixels() {
|
30675 | return new RGBAImage({ width: this.stride, height: this.stride }, new Uint8Array(this.data.buffer));
|
30676 | }
|
30677 | backfillBorder(borderTile, dx, dy) {
|
30678 | if (this.dim !== borderTile.dim)
|
30679 | throw new Error('dem dimension mismatch');
|
30680 | let xMin = dx * this.dim, xMax = dx * this.dim + this.dim, yMin = dy * this.dim, yMax = dy * this.dim + this.dim;
|
30681 | switch (dx) {
|
30682 | case -1:
|
30683 | xMin = xMax - 1;
|
30684 | break;
|
30685 | case 1:
|
30686 | xMax = xMin + 1;
|
30687 | break;
|
30688 | }
|
30689 | switch (dy) {
|
30690 | case -1:
|
30691 | yMin = yMax - 1;
|
30692 | break;
|
30693 | case 1:
|
30694 | yMax = yMin + 1;
|
30695 | break;
|
30696 | }
|
30697 | const ox = -dx * this.dim;
|
30698 | const oy = -dy * this.dim;
|
30699 | for (let y = yMin; y < yMax; y++) {
|
30700 | for (let x = xMin; x < xMax; x++) {
|
30701 | this.data[this._idx(x, y)] = borderTile.data[this._idx(x + ox, y + oy)];
|
30702 | }
|
30703 | }
|
30704 | }
|
30705 | }
|
30706 | register('DEMData', DEMData);
|
30707 |
|
30708 | class DictionaryCoder {
|
30709 | constructor(strings) {
|
30710 | this._stringToNumber = {};
|
30711 | this._numberToString = [];
|
30712 | for (let i = 0; i < strings.length; i++) {
|
30713 | const string = strings[i];
|
30714 | this._stringToNumber[string] = i;
|
30715 | this._numberToString[i] = string;
|
30716 | }
|
30717 | }
|
30718 | encode(string) {
|
30719 | assert$1(string in this._stringToNumber);
|
30720 | return this._stringToNumber[string];
|
30721 | }
|
30722 | decode(n) {
|
30723 | assert$1(n < this._numberToString.length);
|
30724 | return this._numberToString[n];
|
30725 | }
|
30726 | }
|
30727 |
|
30728 | class GeoJSONFeature {
|
30729 | constructor(vectorTileFeature, z, x, y, id) {
|
30730 | this.type = 'Feature';
|
30731 | this._vectorTileFeature = vectorTileFeature;
|
30732 | vectorTileFeature._z = z;
|
30733 | vectorTileFeature._x = x;
|
30734 | vectorTileFeature._y = y;
|
30735 | this.properties = vectorTileFeature.properties;
|
30736 | this.id = id;
|
30737 | }
|
30738 | get geometry() {
|
30739 | if (this._geometry === undefined) {
|
30740 | this._geometry = this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x, this._vectorTileFeature._y, this._vectorTileFeature._z).geometry;
|
30741 | }
|
30742 | return this._geometry;
|
30743 | }
|
30744 | set geometry(g) {
|
30745 | this._geometry = g;
|
30746 | }
|
30747 | toJSON() {
|
30748 | const json = {
|
30749 | geometry: this.geometry
|
30750 | };
|
30751 | for (const i in this) {
|
30752 | if (i === '_geometry' || i === '_vectorTileFeature')
|
30753 | continue;
|
30754 | json[i] = (this)[i];
|
30755 | }
|
30756 | return json;
|
30757 | }
|
30758 | }
|
30759 |
|
30760 | class FeatureIndex {
|
30761 | constructor(tileID, promoteId) {
|
30762 | this.tileID = tileID;
|
30763 | this.x = tileID.canonical.x;
|
30764 | this.y = tileID.canonical.y;
|
30765 | this.z = tileID.canonical.z;
|
30766 | this.grid = new TransferableGridIndex(EXTENT, 16, 0);
|
30767 | this.grid3D = new TransferableGridIndex(EXTENT, 16, 0);
|
30768 | this.featureIndexArray = new FeatureIndexArray();
|
30769 | this.promoteId = promoteId;
|
30770 | }
|
30771 | insert(feature, geometry, featureIndex, sourceLayerIndex, bucketIndex, is3D) {
|
30772 | const key = this.featureIndexArray.length;
|
30773 | this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex);
|
30774 | const grid = is3D ? this.grid3D : this.grid;
|
30775 | for (let r = 0; r < geometry.length; r++) {
|
30776 | const ring = geometry[r];
|
30777 | const bbox = [Infinity, Infinity, -Infinity, -Infinity];
|
30778 | for (let i = 0; i < ring.length; i++) {
|
30779 | const p = ring[i];
|
30780 | bbox[0] = Math.min(bbox[0], p.x);
|
30781 | bbox[1] = Math.min(bbox[1], p.y);
|
30782 | bbox[2] = Math.max(bbox[2], p.x);
|
30783 | bbox[3] = Math.max(bbox[3], p.y);
|
30784 | }
|
30785 | if (bbox[0] < EXTENT &&
|
30786 | bbox[1] < EXTENT &&
|
30787 | bbox[2] >= 0 &&
|
30788 | bbox[3] >= 0) {
|
30789 | grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]);
|
30790 | }
|
30791 | }
|
30792 | }
|
30793 | loadVTLayers() {
|
30794 | if (!this.vtLayers) {
|
30795 | this.vtLayers = new vectorTile.VectorTile(new pbf(this.rawTileData)).layers;
|
30796 | this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']);
|
30797 | }
|
30798 | return this.vtLayers;
|
30799 | }
|
30800 | // Finds non-symbol features in this tile at a particular position.
|
30801 | query(args, styleLayers, serializedLayers, sourceFeatureState) {
|
30802 | this.loadVTLayers();
|
30803 | const params = args.params || {}, pixelsToTileUnits = EXTENT / args.tileSize / args.scale, filter = createFilter(params.filter);
|
30804 | const queryGeometry = args.queryGeometry;
|
30805 | const queryPadding = args.queryPadding * pixelsToTileUnits;
|
30806 | const bounds = getBounds(queryGeometry);
|
30807 | const matching = this.grid.query(bounds.minX - queryPadding, bounds.minY - queryPadding, bounds.maxX + queryPadding, bounds.maxY + queryPadding);
|
30808 | const cameraBounds = getBounds(args.cameraQueryGeometry);
|
30809 | const matching3D = this.grid3D.query(cameraBounds.minX - queryPadding, cameraBounds.minY - queryPadding, cameraBounds.maxX + queryPadding, cameraBounds.maxY + queryPadding, (bx1, by1, bx2, by2) => {
|
30810 | return polygonIntersectsBox(args.cameraQueryGeometry, bx1 - queryPadding, by1 - queryPadding, bx2 + queryPadding, by2 + queryPadding);
|
30811 | });
|
30812 | for (const key of matching3D) {
|
30813 | matching.push(key);
|
30814 | }
|
30815 | matching.sort(topDownFeatureComparator);
|
30816 | const result = {};
|
30817 | let previousIndex;
|
30818 | for (let k = 0; k < matching.length; k++) {
|
30819 | const index = matching[k];
|
30820 | // don't check the same feature more than once
|
30821 | if (index === previousIndex)
|
30822 | continue;
|
30823 | previousIndex = index;
|
30824 | const match = this.featureIndexArray.get(index);
|
30825 | let featureGeometry = null;
|
30826 | this.loadMatchingFeature(result, match.bucketIndex, match.sourceLayerIndex, match.featureIndex, filter, params.layers, params.availableImages, styleLayers, serializedLayers, sourceFeatureState, (feature, styleLayer, featureState) => {
|
30827 | if (!featureGeometry) {
|
30828 | featureGeometry = loadGeometry(feature);
|
30829 | }
|
30830 | return styleLayer.queryIntersectsFeature(queryGeometry, feature, featureState, featureGeometry, this.z, args.transform, pixelsToTileUnits, args.pixelPosMatrix);
|
30831 | });
|
30832 | }
|
30833 | return result;
|
30834 | }
|
30835 | loadMatchingFeature(result, bucketIndex, sourceLayerIndex, featureIndex, filter, filterLayerIDs, availableImages, styleLayers, serializedLayers, sourceFeatureState, intersectionTest) {
|
30836 | const layerIDs = this.bucketLayerIDs[bucketIndex];
|
30837 | if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs))
|
30838 | return;
|
30839 | const sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex);
|
30840 | const sourceLayer = this.vtLayers[sourceLayerName];
|
30841 | const feature = sourceLayer.feature(featureIndex);
|
30842 | if (filter.needGeometry) {
|
30843 | const evaluationFeature = toEvaluationFeature(feature, true);
|
30844 | if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) {
|
30845 | return;
|
30846 | }
|
30847 | }
|
30848 | else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) {
|
30849 | return;
|
30850 | }
|
30851 | const id = this.getId(feature, sourceLayerName);
|
30852 | for (let l = 0; l < layerIDs.length; l++) {
|
30853 | const layerID = layerIDs[l];
|
30854 | if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) {
|
30855 | continue;
|
30856 | }
|
30857 | const styleLayer = styleLayers[layerID];
|
30858 | if (!styleLayer)
|
30859 | continue;
|
30860 | let featureState = {};
|
30861 | if (id && sourceFeatureState) {
|
30862 | // `feature-state` expression evaluation requires feature state to be available
|
30863 | featureState = sourceFeatureState.getState(styleLayer.sourceLayer || '_geojsonTileLayer', id);
|
30864 | }
|
30865 | const serializedLayer = extend$1({}, serializedLayers[layerID]);
|
30866 | serializedLayer.paint = evaluateProperties(serializedLayer.paint, styleLayer.paint, feature, featureState, availableImages);
|
30867 | serializedLayer.layout = evaluateProperties(serializedLayer.layout, styleLayer.layout, feature, featureState, availableImages);
|
30868 | const intersectionZ = !intersectionTest || intersectionTest(feature, styleLayer, featureState);
|
30869 | if (!intersectionZ) {
|
30870 | // Only applied for non-symbol features
|
30871 | continue;
|
30872 | }
|
30873 | const geojsonFeature = new GeoJSONFeature(feature, this.z, this.x, this.y, id);
|
30874 | geojsonFeature.layer = serializedLayer;
|
30875 | let layerResult = result[layerID];
|
30876 | if (layerResult === undefined) {
|
30877 | layerResult = result[layerID] = [];
|
30878 | }
|
30879 | layerResult.push({ featureIndex, feature: geojsonFeature, intersectionZ });
|
30880 | }
|
30881 | }
|
30882 | // Given a set of symbol indexes that have already been looked up,
|
30883 | // return a matching set of GeoJSONFeatures
|
30884 | lookupSymbolFeatures(symbolFeatureIndexes, serializedLayers, bucketIndex, sourceLayerIndex, filterSpec, filterLayerIDs, availableImages, styleLayers) {
|
30885 | const result = {};
|
30886 | this.loadVTLayers();
|
30887 | const filter = createFilter(filterSpec);
|
30888 | for (const symbolFeatureIndex of symbolFeatureIndexes) {
|
30889 | this.loadMatchingFeature(result, bucketIndex, sourceLayerIndex, symbolFeatureIndex, filter, filterLayerIDs, availableImages, styleLayers, serializedLayers);
|
30890 | }
|
30891 | return result;
|
30892 | }
|
30893 | hasLayer(id) {
|
30894 | for (const layerIDs of this.bucketLayerIDs) {
|
30895 | for (const layerID of layerIDs) {
|
30896 | if (id === layerID)
|
30897 | return true;
|
30898 | }
|
30899 | }
|
30900 | return false;
|
30901 | }
|
30902 | getId(feature, sourceLayerId) {
|
30903 | let id = feature.id;
|
30904 | if (this.promoteId) {
|
30905 | const propName = typeof this.promoteId === 'string' ? this.promoteId : this.promoteId[sourceLayerId];
|
30906 | id = feature.properties[propName];
|
30907 | if (typeof id === 'boolean')
|
30908 | id = Number(id);
|
30909 | }
|
30910 | return id;
|
30911 | }
|
30912 | }
|
30913 | register('FeatureIndex', FeatureIndex, { omit: ['rawTileData', 'sourceLayerCoder'] });
|
30914 | function evaluateProperties(serializedProperties, styleLayerProperties, feature, featureState, availableImages) {
|
30915 | return mapObject(serializedProperties, (property, key) => {
|
30916 | const prop = styleLayerProperties instanceof PossiblyEvaluated ? styleLayerProperties.get(key) : null;
|
30917 | return prop && prop.evaluate ? prop.evaluate(feature, featureState, availableImages) : prop;
|
30918 | });
|
30919 | }
|
30920 | function getBounds(geometry) {
|
30921 | let minX = Infinity;
|
30922 | let minY = Infinity;
|
30923 | let maxX = -Infinity;
|
30924 | let maxY = -Infinity;
|
30925 | for (const p of geometry) {
|
30926 | minX = Math.min(minX, p.x);
|
30927 | minY = Math.min(minY, p.y);
|
30928 | maxX = Math.max(maxX, p.x);
|
30929 | maxY = Math.max(maxY, p.y);
|
30930 | }
|
30931 | return { minX, minY, maxX, maxY };
|
30932 | }
|
30933 | function topDownFeatureComparator(a, b) {
|
30934 | return b - a;
|
30935 | }
|
30936 |
|
30937 | var refProperties = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout'];
|
30938 |
|
30939 | exports.PerformanceMarkers = void 0;
|
30940 | (function (PerformanceMarkers) {
|
30941 | PerformanceMarkers["create"] = "create";
|
30942 | PerformanceMarkers["load"] = "load";
|
30943 | PerformanceMarkers["fullLoad"] = "fullLoad";
|
30944 | })(exports.PerformanceMarkers || (exports.PerformanceMarkers = {}));
|
30945 | let lastFrameTime = null;
|
30946 | let frameTimes = [];
|
30947 | const minFramerateTarget = 30;
|
30948 | const frameTimeTarget = 1000 / minFramerateTarget;
|
30949 | const PerformanceUtils = {
|
30950 | mark(marker) {
|
30951 | performance.mark(marker);
|
30952 | },
|
30953 | frame(timestamp) {
|
30954 | const currTimestamp = timestamp;
|
30955 | if (lastFrameTime != null) {
|
30956 | const frameTime = currTimestamp - lastFrameTime;
|
30957 | frameTimes.push(frameTime);
|
30958 | }
|
30959 | lastFrameTime = currTimestamp;
|
30960 | },
|
30961 | clearMetrics() {
|
30962 | lastFrameTime = null;
|
30963 | frameTimes = [];
|
30964 | performance.clearMeasures('loadTime');
|
30965 | performance.clearMeasures('fullLoadTime');
|
30966 | for (const marker in exports.PerformanceMarkers) {
|
30967 | performance.clearMarks(exports.PerformanceMarkers[marker]);
|
30968 | }
|
30969 | },
|
30970 | getPerformanceMetrics() {
|
30971 | performance.measure('loadTime', exports.PerformanceMarkers.create, exports.PerformanceMarkers.load);
|
30972 | performance.measure('fullLoadTime', exports.PerformanceMarkers.create, exports.PerformanceMarkers.fullLoad);
|
30973 | const loadTime = performance.getEntriesByName('loadTime')[0].duration;
|
30974 | const fullLoadTime = performance.getEntriesByName('fullLoadTime')[0].duration;
|
30975 | const totalFrames = frameTimes.length;
|
30976 | const avgFrameTime = frameTimes.reduce((prev, curr) => prev + curr, 0) / totalFrames / 1000;
|
30977 | const fps = 1 / avgFrameTime;
|
30978 | // count frames that missed our framerate target
|
30979 | const droppedFrames = frameTimes
|
30980 | .filter((frameTime) => frameTime > frameTimeTarget)
|
30981 | .reduce((acc, curr) => {
|
30982 | return acc + (curr - frameTimeTarget) / frameTimeTarget;
|
30983 | }, 0);
|
30984 | const percentDroppedFrames = (droppedFrames / (totalFrames + droppedFrames)) * 100;
|
30985 | return {
|
30986 | loadTime,
|
30987 | fullLoadTime,
|
30988 | fps,
|
30989 | percentDroppedFrames
|
30990 | };
|
30991 | }
|
30992 | };
|
30993 | /**
|
30994 | * Safe wrapper for the performance resource timing API in web workers with graceful degradation
|
30995 | *
|
30996 | * @param {RequestParameters} request
|
30997 | * @private
|
30998 | */
|
30999 | class RequestPerformance {
|
31000 | constructor(request) {
|
31001 | this._marks = {
|
31002 | start: [request.url, 'start'].join('#'),
|
31003 | end: [request.url, 'end'].join('#'),
|
31004 | measure: request.url.toString()
|
31005 | };
|
31006 | performance.mark(this._marks.start);
|
31007 | }
|
31008 | finish() {
|
31009 | performance.mark(this._marks.end);
|
31010 | let resourceTimingData = performance.getEntriesByName(this._marks.measure);
|
31011 | // fallback if web worker implementation of perf.getEntriesByName returns empty
|
31012 | if (resourceTimingData.length === 0) {
|
31013 | performance.measure(this._marks.measure, this._marks.start, this._marks.end);
|
31014 | resourceTimingData = performance.getEntriesByName(this._marks.measure);
|
31015 | // cleanup
|
31016 | performance.clearMarks(this._marks.start);
|
31017 | performance.clearMarks(this._marks.end);
|
31018 | performance.clearMeasures(this._marks.measure);
|
31019 | }
|
31020 | return resourceTimingData;
|
31021 | }
|
31022 | }
|
31023 | var performance$1 = performance;
|
31024 |
|
31025 | exports.AJAXError = AJAXError;
|
31026 | exports.Actor = Actor;
|
31027 | exports.AlphaImage = AlphaImage;
|
31028 | exports.CanonicalTileID = CanonicalTileID;
|
31029 | exports.CollisionBoxArray = CollisionBoxArray;
|
31030 | exports.CollisionCircleLayoutArray = CollisionCircleLayoutArray;
|
31031 | exports.Color = Color;
|
31032 | exports.DEMData = DEMData;
|
31033 | exports.DataConstantProperty = DataConstantProperty;
|
31034 | exports.DictionaryCoder = DictionaryCoder;
|
31035 | exports.EXTENT = EXTENT;
|
31036 | exports.ErrorEvent = ErrorEvent;
|
31037 | exports.EvaluationParameters = EvaluationParameters;
|
31038 | exports.Event = Event;
|
31039 | exports.Evented = Evented;
|
31040 | exports.FeatureIndex = FeatureIndex;
|
31041 | exports.FillBucket = FillBucket;
|
31042 | exports.FillExtrusionBucket = FillExtrusionBucket;
|
31043 | exports.GeoJSONFeature = GeoJSONFeature;
|
31044 | exports.ImageAtlas = ImageAtlas;
|
31045 | exports.ImagePosition = ImagePosition;
|
31046 | exports.LineBucket = LineBucket;
|
31047 | exports.LineStripIndexArray = LineStripIndexArray;
|
31048 | exports.LngLat = LngLat;
|
31049 | exports.LngLatBounds = LngLatBounds$1;
|
31050 | exports.MercatorCoordinate = MercatorCoordinate;
|
31051 | exports.ONE_EM = ONE_EM;
|
31052 | exports.OverscaledTileID = OverscaledTileID;
|
31053 | exports.PerformanceUtils = PerformanceUtils;
|
31054 | exports.PosArray = PosArray;
|
31055 | exports.Properties = Properties;
|
31056 | exports.QuadTriangleArray = QuadTriangleArray;
|
31057 | exports.RGBAImage = RGBAImage;
|
31058 | exports.RasterBoundsArray = RasterBoundsArray;
|
31059 | exports.RequestPerformance = RequestPerformance;
|
31060 | exports.ResourceType = ResourceType;
|
31061 | exports.SegmentVector = SegmentVector;
|
31062 | exports.SymbolBucket = SymbolBucket$1;
|
31063 | exports.Transitionable = Transitionable;
|
31064 | exports.TriangleIndexArray = TriangleIndexArray;
|
31065 | exports.Uniform1f = Uniform1f;
|
31066 | exports.Uniform1i = Uniform1i;
|
31067 | exports.Uniform2f = Uniform2f;
|
31068 | exports.Uniform3f = Uniform3f;
|
31069 | exports.Uniform4f = Uniform4f;
|
31070 | exports.UniformColor = UniformColor;
|
31071 | exports.UniformMatrix4f = UniformMatrix4f;
|
31072 | exports.UnwrappedTileID = UnwrappedTileID;
|
31073 | exports.ValidationError = ValidationError;
|
31074 | exports.ZoomHistory = ZoomHistory;
|
31075 | exports.add = add$4;
|
31076 | exports.addDynamicAttributes = addDynamicAttributes;
|
31077 | exports.assert = assert$1;
|
31078 | exports.asyncAll = asyncAll;
|
31079 | exports.bezier = bezier$1;
|
31080 | exports.bindAll = bindAll;
|
31081 | exports.cacheEntryPossiblyAdded = cacheEntryPossiblyAdded;
|
31082 | exports.clamp = clamp;
|
31083 | exports.clearTileCache = clearTileCache;
|
31084 | exports.clipLine = clipLine;
|
31085 | exports.clone = clone$5;
|
31086 | exports.clone$1 = clone$9;
|
31087 | exports.clone$2 = clone$4;
|
31088 | exports.collisionCircleLayout = collisionCircleLayout;
|
31089 | exports.config = config;
|
31090 | exports.create = create$5;
|
31091 | exports.create$1 = create$6;
|
31092 | exports.create$2 = create$8;
|
31093 | exports.createExpression = createExpression;
|
31094 | exports.createFilter = createFilter;
|
31095 | exports.createLayout = createLayout;
|
31096 | exports.createStyleLayer = createStyleLayer;
|
31097 | exports.cross = cross$2;
|
31098 | exports.deepEqual = deepEqual;
|
31099 | exports.dot = dot$5;
|
31100 | exports.dot$1 = dot$4;
|
31101 | exports.ease = ease;
|
31102 | exports.emitValidationErrors = emitValidationErrors;
|
31103 | exports.enforceCacheSizeLimit = enforceCacheSizeLimit;
|
31104 | exports.evaluateSizeForFeature = evaluateSizeForFeature;
|
31105 | exports.evaluateSizeForZoom = evaluateSizeForZoom;
|
31106 | exports.evaluateVariableOffset = evaluateVariableOffset;
|
31107 | exports.evented = evented;
|
31108 | exports.exported = exported$1;
|
31109 | exports.exported$1 = exported;
|
31110 | exports.extend = extend$1;
|
31111 | exports.filterObject = filterObject;
|
31112 | exports.fromRotation = fromRotation$2;
|
31113 | exports.getAnchorAlignment = getAnchorAlignment;
|
31114 | exports.getAnchorJustification = getAnchorJustification;
|
31115 | exports.getArrayBuffer = getArrayBuffer;
|
31116 | exports.getImage = getImage;
|
31117 | exports.getJSON = getJSON;
|
31118 | exports.getOverlapMode = getOverlapMode;
|
31119 | exports.getRTLTextPluginStatus = getRTLTextPluginStatus;
|
31120 | exports.getReferrer = getReferrer;
|
31121 | exports.getVideo = getVideo;
|
31122 | exports.identity = identity$2;
|
31123 | exports.invert = invert$2;
|
31124 | exports.isImageBitmap = isImageBitmap;
|
31125 | exports.isSafari = isSafari;
|
31126 | exports.keysDifference = keysDifference;
|
31127 | exports.lazyLoadRTLTextPlugin = lazyLoadRTLTextPlugin;
|
31128 | exports.makeRequest = makeRequest;
|
31129 | exports.mapObject = mapObject;
|
31130 | exports.mercatorXfromLng = mercatorXfromLng;
|
31131 | exports.mercatorYfromLat = mercatorYfromLat;
|
31132 | exports.mercatorZfromAltitude = mercatorZfromAltitude;
|
31133 | exports.mul = mul$5;
|
31134 | exports.multiply = multiply$5;
|
31135 | exports.nextPowerOfTwo = nextPowerOfTwo;
|
31136 | exports.normalize = normalize$4;
|
31137 | exports.number = number;
|
31138 | exports.ortho = ortho;
|
31139 | exports.parseCacheControl = parseCacheControl;
|
31140 | exports.parseGlyphPBF = parseGlyphPBF;
|
31141 | exports.pbf = pbf;
|
31142 | exports.performSymbolLayout = performSymbolLayout;
|
31143 | exports.perspective = perspective;
|
31144 | exports.pick = pick;
|
31145 | exports.plugin = plugin;
|
31146 | exports.pointGeometry = pointGeometry;
|
31147 | exports.polygonIntersectsPolygon = polygonIntersectsPolygon;
|
31148 | exports.potpack = potpack;
|
31149 | exports.refProperties = refProperties;
|
31150 | exports.register = register;
|
31151 | exports.registerForPluginStateChange = registerForPluginStateChange;
|
31152 | exports.renderColorRamp = renderColorRamp;
|
31153 | exports.rotate = rotate$4;
|
31154 | exports.rotateX = rotateX$3;
|
31155 | exports.rotateZ = rotateZ$3;
|
31156 | exports.scale = scale$5;
|
31157 | exports.scale$1 = scale$3;
|
31158 | exports.scale$2 = scale$4;
|
31159 | exports.setCacheLimits = setCacheLimits;
|
31160 | exports.setRTLTextPlugin = setRTLTextPlugin;
|
31161 | exports.spec = spec;
|
31162 | exports.sphericalToCartesian = sphericalToCartesian;
|
31163 | exports.sqrLen = sqrLen;
|
31164 | exports.sub = sub$2;
|
31165 | exports.toEvaluationFeature = toEvaluationFeature;
|
31166 | exports.transformMat3 = transformMat3$1;
|
31167 | exports.transformMat4 = transformMat4$1;
|
31168 | exports.translate = translate$1;
|
31169 | exports.triggerPluginCompletionEvent = triggerPluginCompletionEvent;
|
31170 | exports.unicodeBlockLookup = unicodeBlockLookup;
|
31171 | exports.uniqueId = uniqueId;
|
31172 | exports.validateCustomStyleLayer = validateCustomStyleLayer;
|
31173 | exports.validateLight = validateLight;
|
31174 | exports.validateStyle = validateStyle;
|
31175 | exports.vectorTile = vectorTile;
|
31176 | exports.warnOnce = warnOnce;
|
31177 | exports.wrap = wrap;
|
31178 |
|
31179 | }));
|
31180 |
|
31181 | define(['./shared'], (function (performance) { 'use strict';
|
31182 |
|
31183 | function stringify(obj) {
|
31184 | const type = typeof obj;
|
31185 | if (type === 'number' || type === 'boolean' || type === 'string' || obj === undefined || obj === null)
|
31186 | return JSON.stringify(obj);
|
31187 | if (Array.isArray(obj)) {
|
31188 | let str = '[';
|
31189 | for (const val of obj) {
|
31190 | str += `${stringify(val)},`;
|
31191 | }
|
31192 | return `${str}]`;
|
31193 | }
|
31194 | const keys = Object.keys(obj).sort();
|
31195 | let str = '{';
|
31196 | for (let i = 0; i < keys.length; i++) {
|
31197 | str += `${JSON.stringify(keys[i])}:${stringify(obj[keys[i]])},`;
|
31198 | }
|
31199 | return `${str}}`;
|
31200 | }
|
31201 | function getKey(layer) {
|
31202 | let key = '';
|
31203 | for (const k of performance.refProperties) {
|
31204 | key += `/${stringify(layer[k])}`;
|
31205 | }
|
31206 | return key;
|
31207 | }
|
31208 | /**
|
31209 | * Given an array of layers, return an array of arrays of layers where all
|
31210 | * layers in each group have identical layout-affecting properties. These
|
31211 | * are the properties that were formerly used by explicit `ref` mechanism
|
31212 | * for layers: 'type', 'source', 'source-layer', 'minzoom', 'maxzoom',
|
31213 | * 'filter', and 'layout'.
|
31214 | *
|
31215 | * The input is not modified. The output layers are references to the
|
31216 | * input layers.
|
31217 | *
|
31218 | * @private
|
31219 | * @param {Array<Layer>} layers
|
31220 | * @param {Object} [cachedKeys] - an object to keep already calculated keys.
|
31221 | * @returns {Array<Array<Layer>>}
|
31222 | */
|
31223 | function groupByLayout(layers, cachedKeys) {
|
31224 | const groups = {};
|
31225 | for (let i = 0; i < layers.length; i++) {
|
31226 | const k = (cachedKeys && cachedKeys[layers[i].id]) || getKey(layers[i]);
|
31227 | // update the cache if there is one
|
31228 | if (cachedKeys)
|
31229 | cachedKeys[layers[i].id] = k;
|
31230 | let group = groups[k];
|
31231 | if (!group) {
|
31232 | group = groups[k] = [];
|
31233 | }
|
31234 | group.push(layers[i]);
|
31235 | }
|
31236 | const result = [];
|
31237 | for (const k in groups) {
|
31238 | result.push(groups[k]);
|
31239 | }
|
31240 | return result;
|
31241 | }
|
31242 |
|
31243 | class StyleLayerIndex {
|
31244 | constructor(layerConfigs) {
|
31245 | this.keyCache = {};
|
31246 | if (layerConfigs) {
|
31247 | this.replace(layerConfigs);
|
31248 | }
|
31249 | }
|
31250 | replace(layerConfigs) {
|
31251 | this._layerConfigs = {};
|
31252 | this._layers = {};
|
31253 | this.update(layerConfigs, []);
|
31254 | }
|
31255 | update(layerConfigs, removedIds) {
|
31256 | for (const layerConfig of layerConfigs) {
|
31257 | this._layerConfigs[layerConfig.id] = layerConfig;
|
31258 | const layer = this._layers[layerConfig.id] = performance.createStyleLayer(layerConfig);
|
31259 | layer._featureFilter = performance.createFilter(layer.filter);
|
31260 | if (this.keyCache[layerConfig.id])
|
31261 | delete this.keyCache[layerConfig.id];
|
31262 | }
|
31263 | for (const id of removedIds) {
|
31264 | delete this.keyCache[id];
|
31265 | delete this._layerConfigs[id];
|
31266 | delete this._layers[id];
|
31267 | }
|
31268 | this.familiesBySource = {};
|
31269 | const groups = groupByLayout(Object.values(this._layerConfigs), this.keyCache);
|
31270 | for (const layerConfigs of groups) {
|
31271 | const layers = layerConfigs.map((layerConfig) => this._layers[layerConfig.id]);
|
31272 | const layer = layers[0];
|
31273 | if (layer.visibility === 'none') {
|
31274 | continue;
|
31275 | }
|
31276 | const sourceId = layer.source || '';
|
31277 | let sourceGroup = this.familiesBySource[sourceId];
|
31278 | if (!sourceGroup) {
|
31279 | sourceGroup = this.familiesBySource[sourceId] = {};
|
31280 | }
|
31281 | const sourceLayerId = layer.sourceLayer || '_geojsonTileLayer';
|
31282 | let sourceLayerFamilies = sourceGroup[sourceLayerId];
|
31283 | if (!sourceLayerFamilies) {
|
31284 | sourceLayerFamilies = sourceGroup[sourceLayerId] = [];
|
31285 | }
|
31286 | sourceLayerFamilies.push(layers);
|
31287 | }
|
31288 | }
|
31289 | }
|
31290 |
|
31291 | const padding = 1;
|
31292 | class GlyphAtlas {
|
31293 | constructor(stacks) {
|
31294 | const positions = {};
|
31295 | const bins = [];
|
31296 | for (const stack in stacks) {
|
31297 | const glyphs = stacks[stack];
|
31298 | const stackPositions = positions[stack] = {};
|
31299 | for (const id in glyphs) {
|
31300 | const src = glyphs[+id];
|
31301 | if (!src || src.bitmap.width === 0 || src.bitmap.height === 0)
|
31302 | continue;
|
31303 | const bin = {
|
31304 | x: 0,
|
31305 | y: 0,
|
31306 | w: src.bitmap.width + 2 * padding,
|
31307 | h: src.bitmap.height + 2 * padding
|
31308 | };
|
31309 | bins.push(bin);
|
31310 | stackPositions[id] = { rect: bin, metrics: src.metrics };
|
31311 | }
|
31312 | }
|
31313 | const { w, h } = performance.potpack(bins);
|
31314 | const image = new performance.AlphaImage({ width: w || 1, height: h || 1 });
|
31315 | for (const stack in stacks) {
|
31316 | const glyphs = stacks[stack];
|
31317 | for (const id in glyphs) {
|
31318 | const src = glyphs[+id];
|
31319 | if (!src || src.bitmap.width === 0 || src.bitmap.height === 0)
|
31320 | continue;
|
31321 | const bin = positions[stack][id].rect;
|
31322 | performance.AlphaImage.copy(src.bitmap, image, { x: 0, y: 0 }, { x: bin.x + padding, y: bin.y + padding }, src.bitmap);
|
31323 | }
|
31324 | }
|
31325 | this.image = image;
|
31326 | this.positions = positions;
|
31327 | }
|
31328 | }
|
31329 | performance.register('GlyphAtlas', GlyphAtlas);
|
31330 |
|
31331 | class WorkerTile {
|
31332 | constructor(params) {
|
31333 | this.tileID = new performance.OverscaledTileID(params.tileID.overscaledZ, params.tileID.wrap, params.tileID.canonical.z, params.tileID.canonical.x, params.tileID.canonical.y);
|
31334 | this.uid = params.uid;
|
31335 | this.zoom = params.zoom;
|
31336 | this.pixelRatio = params.pixelRatio;
|
31337 | this.tileSize = params.tileSize;
|
31338 | this.source = params.source;
|
31339 | this.overscaling = this.tileID.overscaleFactor();
|
31340 | this.showCollisionBoxes = params.showCollisionBoxes;
|
31341 | this.collectResourceTiming = !!params.collectResourceTiming;
|
31342 | this.returnDependencies = !!params.returnDependencies;
|
31343 | this.promoteId = params.promoteId;
|
31344 | }
|
31345 | parse(data, layerIndex, availableImages, actor, callback) {
|
31346 | this.status = 'parsing';
|
31347 | this.data = data;
|
31348 | this.collisionBoxArray = new performance.CollisionBoxArray();
|
31349 | const sourceLayerCoder = new performance.DictionaryCoder(Object.keys(data.layers).sort());
|
31350 | const featureIndex = new performance.FeatureIndex(this.tileID, this.promoteId);
|
31351 | featureIndex.bucketLayerIDs = [];
|
31352 | const buckets = {};
|
31353 | const options = {
|
31354 | featureIndex,
|
31355 | iconDependencies: {},
|
31356 | patternDependencies: {},
|
31357 | glyphDependencies: {},
|
31358 | availableImages
|
31359 | };
|
31360 | const layerFamilies = layerIndex.familiesBySource[this.source];
|
31361 | for (const sourceLayerId in layerFamilies) {
|
31362 | const sourceLayer = data.layers[sourceLayerId];
|
31363 | if (!sourceLayer) {
|
31364 | continue;
|
31365 | }
|
31366 | if (sourceLayer.version === 1) {
|
31367 | performance.warnOnce(`Vector tile source "${this.source}" layer "${sourceLayerId}" ` +
|
31368 | 'does not use vector tile spec v2 and therefore may have some rendering errors.');
|
31369 | }
|
31370 | const sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId);
|
31371 | const features = [];
|
31372 | for (let index = 0; index < sourceLayer.length; index++) {
|
31373 | const feature = sourceLayer.feature(index);
|
31374 | const id = featureIndex.getId(feature, sourceLayerId);
|
31375 | features.push({ feature, id, index, sourceLayerIndex });
|
31376 | }
|
31377 | for (const family of layerFamilies[sourceLayerId]) {
|
31378 | const layer = family[0];
|
31379 | performance.assert(layer.source === this.source);
|
31380 | if (layer.minzoom && this.zoom < Math.floor(layer.minzoom))
|
31381 | continue;
|
31382 | if (layer.maxzoom && this.zoom >= layer.maxzoom)
|
31383 | continue;
|
31384 | if (layer.visibility === 'none')
|
31385 | continue;
|
31386 | recalculateLayers(family, this.zoom, availableImages);
|
31387 | const bucket = buckets[layer.id] = layer.createBucket({
|
31388 | index: featureIndex.bucketLayerIDs.length,
|
31389 | layers: family,
|
31390 | zoom: this.zoom,
|
31391 | pixelRatio: this.pixelRatio,
|
31392 | overscaling: this.overscaling,
|
31393 | collisionBoxArray: this.collisionBoxArray,
|
31394 | sourceLayerIndex,
|
31395 | sourceID: this.source
|
31396 | });
|
31397 | bucket.populate(features, options, this.tileID.canonical);
|
31398 | featureIndex.bucketLayerIDs.push(family.map((l) => l.id));
|
31399 | }
|
31400 | }
|
31401 | let error;
|
31402 | let glyphMap;
|
31403 | let iconMap;
|
31404 | let patternMap;
|
31405 | const stacks = performance.mapObject(options.glyphDependencies, (glyphs) => Object.keys(glyphs).map(Number));
|
31406 | if (Object.keys(stacks).length) {
|
31407 | actor.send('getGlyphs', { uid: this.uid, stacks }, (err, result) => {
|
31408 | if (!error) {
|
31409 | error = err;
|
31410 | glyphMap = result;
|
31411 | maybePrepare.call(this);
|
31412 | }
|
31413 | });
|
31414 | }
|
31415 | else {
|
31416 | glyphMap = {};
|
31417 | }
|
31418 | const icons = Object.keys(options.iconDependencies);
|
31419 | if (icons.length) {
|
31420 | actor.send('getImages', { icons, source: this.source, tileID: this.tileID, type: 'icons' }, (err, result) => {
|
31421 | if (!error) {
|
31422 | error = err;
|
31423 | iconMap = result;
|
31424 | maybePrepare.call(this);
|
31425 | }
|
31426 | });
|
31427 | }
|
31428 | else {
|
31429 | iconMap = {};
|
31430 | }
|
31431 | const patterns = Object.keys(options.patternDependencies);
|
31432 | if (patterns.length) {
|
31433 | actor.send('getImages', { icons: patterns, source: this.source, tileID: this.tileID, type: 'patterns' }, (err, result) => {
|
31434 | if (!error) {
|
31435 | error = err;
|
31436 | patternMap = result;
|
31437 | maybePrepare.call(this);
|
31438 | }
|
31439 | });
|
31440 | }
|
31441 | else {
|
31442 | patternMap = {};
|
31443 | }
|
31444 | maybePrepare.call(this);
|
31445 | function maybePrepare() {
|
31446 | if (error) {
|
31447 | return callback(error);
|
31448 | }
|
31449 | else if (glyphMap && iconMap && patternMap) {
|
31450 | const glyphAtlas = new GlyphAtlas(glyphMap);
|
31451 | const imageAtlas = new performance.ImageAtlas(iconMap, patternMap);
|
31452 | for (const key in buckets) {
|
31453 | const bucket = buckets[key];
|
31454 | if (bucket instanceof performance.SymbolBucket) {
|
31455 | recalculateLayers(bucket.layers, this.zoom, availableImages);
|
31456 | performance.performSymbolLayout(bucket, glyphMap, glyphAtlas.positions, iconMap, imageAtlas.iconPositions, this.showCollisionBoxes, this.tileID.canonical);
|
31457 | }
|
31458 | else if (bucket.hasPattern &&
|
31459 | (bucket instanceof performance.LineBucket ||
|
31460 | bucket instanceof performance.FillBucket ||
|
31461 | bucket instanceof performance.FillExtrusionBucket)) {
|
31462 | recalculateLayers(bucket.layers, this.zoom, availableImages);
|
31463 | bucket.addFeatures(options, this.tileID.canonical, imageAtlas.patternPositions);
|
31464 | }
|
31465 | }
|
31466 | this.status = 'done';
|
31467 | callback(null, {
|
31468 | buckets: Object.values(buckets).filter(b => !b.isEmpty()),
|
31469 | featureIndex,
|
31470 | collisionBoxArray: this.collisionBoxArray,
|
31471 | glyphAtlasImage: glyphAtlas.image,
|
31472 | imageAtlas,
|
31473 | // Only used for benchmarking:
|
31474 | glyphMap: this.returnDependencies ? glyphMap : null,
|
31475 | iconMap: this.returnDependencies ? iconMap : null,
|
31476 | glyphPositions: this.returnDependencies ? glyphAtlas.positions : null
|
31477 | });
|
31478 | }
|
31479 | }
|
31480 | }
|
31481 | }
|
31482 | function recalculateLayers(layers, zoom, availableImages) {
|
31483 | // Layers are shared and may have been used by a WorkerTile with a different zoom.
|
31484 | const parameters = new performance.EvaluationParameters(zoom);
|
31485 | for (const layer of layers) {
|
31486 | layer.recalculate(parameters, availableImages);
|
31487 | }
|
31488 | }
|
31489 |
|
31490 | /**
|
31491 | * @private
|
31492 | */
|
31493 | function loadVectorTile(params, callback) {
|
31494 | const request = performance.getArrayBuffer(params.request, (err, data, cacheControl, expires) => {
|
31495 | if (err) {
|
31496 | callback(err);
|
31497 | }
|
31498 | else if (data) {
|
31499 | callback(null, {
|
31500 | vectorTile: new performance.vectorTile.VectorTile(new performance.pbf(data)),
|
31501 | rawData: data,
|
31502 | cacheControl,
|
31503 | expires
|
31504 | });
|
31505 | }
|
31506 | });
|
31507 | return () => {
|
31508 | request.cancel();
|
31509 | callback();
|
31510 | };
|
31511 | }
|
31512 | /**
|
31513 | * The {@link WorkerSource} implementation that supports {@link VectorTileSource}.
|
31514 | * This class is designed to be easily reused to support custom source types
|
31515 | * for data formats that can be parsed/converted into an in-memory VectorTile
|
31516 | * representation. To do so, create it with
|
31517 | * `new VectorTileWorkerSource(actor, styleLayers, customLoadVectorDataFunction)`.
|
31518 | *
|
31519 | * @private
|
31520 | */
|
31521 | class VectorTileWorkerSource {
|
31522 | /**
|
31523 | * @param [loadVectorData] Optional method for custom loading of a VectorTile
|
31524 | * object based on parameters passed from the main-thread Source. See
|
31525 | * {@link VectorTileWorkerSource#loadTile}. The default implementation simply
|
31526 | * loads the pbf at `params.url`.
|
31527 | * @private
|
31528 | */
|
31529 | constructor(actor, layerIndex, availableImages, loadVectorData) {
|
31530 | this.actor = actor;
|
31531 | this.layerIndex = layerIndex;
|
31532 | this.availableImages = availableImages;
|
31533 | this.loadVectorData = loadVectorData || loadVectorTile;
|
31534 | this.loading = {};
|
31535 | this.loaded = {};
|
31536 | }
|
31537 | /**
|
31538 | * Implements {@link WorkerSource#loadTile}. Delegates to
|
31539 | * {@link VectorTileWorkerSource#loadVectorData} (which by default expects
|
31540 | * a `params.url` property) for fetching and producing a VectorTile object.
|
31541 | * @private
|
31542 | */
|
31543 | loadTile(params, callback) {
|
31544 | const uid = params.uid;
|
31545 | if (!this.loading)
|
31546 | this.loading = {};
|
31547 | const perf = (params && params.request && params.request.collectResourceTiming) ?
|
31548 | new performance.RequestPerformance(params.request) : false;
|
31549 | const workerTile = this.loading[uid] = new WorkerTile(params);
|
31550 | workerTile.abort = this.loadVectorData(params, (err, response) => {
|
31551 | delete this.loading[uid];
|
31552 | if (err || !response) {
|
31553 | workerTile.status = 'done';
|
31554 | this.loaded[uid] = workerTile;
|
31555 | return callback(err);
|
31556 | }
|
31557 | const rawTileData = response.rawData;
|
31558 | const cacheControl = {};
|
31559 | if (response.expires)
|
31560 | cacheControl.expires = response.expires;
|
31561 | if (response.cacheControl)
|
31562 | cacheControl.cacheControl = response.cacheControl;
|
31563 | const resourceTiming = {};
|
31564 | if (perf) {
|
31565 | const resourceTimingData = perf.finish();
|
31566 | // it's necessary to eval the result of getEntriesByName() here via parse/stringify
|
31567 | // late evaluation in the main thread causes TypeError: illegal invocation
|
31568 | if (resourceTimingData)
|
31569 | resourceTiming.resourceTiming = JSON.parse(JSON.stringify(resourceTimingData));
|
31570 | }
|
31571 | workerTile.vectorTile = response.vectorTile;
|
31572 | workerTile.parse(response.vectorTile, this.layerIndex, this.availableImages, this.actor, (err, result) => {
|
31573 | if (err || !result)
|
31574 | return callback(err);
|
31575 | // Transferring a copy of rawTileData because the worker needs to retain its copy.
|
31576 | callback(null, performance.extend({ rawTileData: rawTileData.slice(0) }, result, cacheControl, resourceTiming));
|
31577 | });
|
31578 | this.loaded = this.loaded || {};
|
31579 | this.loaded[uid] = workerTile;
|
31580 | });
|
31581 | }
|
31582 | /**
|
31583 | * Implements {@link WorkerSource#reloadTile}.
|
31584 | * @private
|
31585 | */
|
31586 | reloadTile(params, callback) {
|
31587 | const loaded = this.loaded, uid = params.uid, vtSource = this;
|
31588 | if (loaded && loaded[uid]) {
|
31589 | const workerTile = loaded[uid];
|
31590 | workerTile.showCollisionBoxes = params.showCollisionBoxes;
|
31591 | const done = (err, data) => {
|
31592 | const reloadCallback = workerTile.reloadCallback;
|
31593 | if (reloadCallback) {
|
31594 | delete workerTile.reloadCallback;
|
31595 | workerTile.parse(workerTile.vectorTile, vtSource.layerIndex, this.availableImages, vtSource.actor, reloadCallback);
|
31596 | }
|
31597 | callback(err, data);
|
31598 | };
|
31599 | if (workerTile.status === 'parsing') {
|
31600 | workerTile.reloadCallback = done;
|
31601 | }
|
31602 | else if (workerTile.status === 'done') {
|
31603 | // if there was no vector tile data on the initial load, don't try and re-parse tile
|
31604 | if (workerTile.vectorTile) {
|
31605 | workerTile.parse(workerTile.vectorTile, this.layerIndex, this.availableImages, this.actor, done);
|
31606 | }
|
31607 | else {
|
31608 | done();
|
31609 | }
|
31610 | }
|
31611 | }
|
31612 | }
|
31613 | /**
|
31614 | * Implements {@link WorkerSource#abortTile}.
|
31615 | *
|
31616 | * @param params
|
31617 | * @param params.uid The UID for this tile.
|
31618 | * @private
|
31619 | */
|
31620 | abortTile(params, callback) {
|
31621 | const loading = this.loading, uid = params.uid;
|
31622 | if (loading && loading[uid] && loading[uid].abort) {
|
31623 | loading[uid].abort();
|
31624 | delete loading[uid];
|
31625 | }
|
31626 | callback();
|
31627 | }
|
31628 | /**
|
31629 | * Implements {@link WorkerSource#removeTile}.
|
31630 | *
|
31631 | * @param params
|
31632 | * @param params.uid The UID for this tile.
|
31633 | * @private
|
31634 | */
|
31635 | removeTile(params, callback) {
|
31636 | const loaded = this.loaded, uid = params.uid;
|
31637 | if (loaded && loaded[uid]) {
|
31638 | delete loaded[uid];
|
31639 | }
|
31640 | callback();
|
31641 | }
|
31642 | }
|
31643 |
|
31644 | class RasterDEMTileWorkerSource {
|
31645 | constructor() {
|
31646 | this.loaded = {};
|
31647 | }
|
31648 | loadTile(params, callback) {
|
31649 | const { uid, encoding, rawImageData } = params;
|
31650 | // Main thread will transfer ImageBitmap if offscreen decode with OffscreenCanvas is supported, else it will transfer an already decoded image.
|
31651 | const imagePixels = performance.isImageBitmap(rawImageData) ? this.getImageData(rawImageData) : rawImageData;
|
31652 | const dem = new performance.DEMData(uid, imagePixels, encoding);
|
31653 | this.loaded = this.loaded || {};
|
31654 | this.loaded[uid] = dem;
|
31655 | callback(null, dem);
|
31656 | }
|
31657 | getImageData(imgBitmap) {
|
31658 | // Lazily initialize OffscreenCanvas
|
31659 | if (!this.offscreenCanvas || !this.offscreenCanvasContext) {
|
31660 | // Dem tiles are typically 256x256
|
31661 | this.offscreenCanvas = new OffscreenCanvas(imgBitmap.width, imgBitmap.height);
|
31662 | this.offscreenCanvasContext = this.offscreenCanvas.getContext('2d');
|
31663 | }
|
31664 | this.offscreenCanvas.width = imgBitmap.width;
|
31665 | this.offscreenCanvas.height = imgBitmap.height;
|
31666 | this.offscreenCanvasContext.drawImage(imgBitmap, 0, 0, imgBitmap.width, imgBitmap.height);
|
31667 | // Insert an additional 1px padding around the image to allow backfilling for neighboring data.
|
31668 | const imgData = this.offscreenCanvasContext.getImageData(-1, -1, imgBitmap.width + 2, imgBitmap.height + 2);
|
31669 | this.offscreenCanvasContext.clearRect(0, 0, this.offscreenCanvas.width, this.offscreenCanvas.height);
|
31670 | return new performance.RGBAImage({ width: imgData.width, height: imgData.height }, imgData.data);
|
31671 | }
|
31672 | removeTile(params) {
|
31673 | const loaded = this.loaded, uid = params.uid;
|
31674 | if (loaded && loaded[uid]) {
|
31675 | delete loaded[uid];
|
31676 | }
|
31677 | }
|
31678 | }
|
31679 |
|
31680 | var geojsonRewind = rewind$1;
|
31681 |
|
31682 | function rewind$1(gj, outer) {
|
31683 | var type = gj && gj.type, i;
|
31684 |
|
31685 | if (type === 'FeatureCollection') {
|
31686 | for (i = 0; i < gj.features.length; i++) rewind$1(gj.features[i], outer);
|
31687 |
|
31688 | } else if (type === 'GeometryCollection') {
|
31689 | for (i = 0; i < gj.geometries.length; i++) rewind$1(gj.geometries[i], outer);
|
31690 |
|
31691 | } else if (type === 'Feature') {
|
31692 | rewind$1(gj.geometry, outer);
|
31693 |
|
31694 | } else if (type === 'Polygon') {
|
31695 | rewindRings(gj.coordinates, outer);
|
31696 |
|
31697 | } else if (type === 'MultiPolygon') {
|
31698 | for (i = 0; i < gj.coordinates.length; i++) rewindRings(gj.coordinates[i], outer);
|
31699 | }
|
31700 |
|
31701 | return gj;
|
31702 | }
|
31703 |
|
31704 | function rewindRings(rings, outer) {
|
31705 | if (rings.length === 0) return;
|
31706 |
|
31707 | rewindRing(rings[0], outer);
|
31708 | for (var i = 1; i < rings.length; i++) {
|
31709 | rewindRing(rings[i], !outer);
|
31710 | }
|
31711 | }
|
31712 |
|
31713 | function rewindRing(ring, dir) {
|
31714 | var area = 0, err = 0;
|
31715 | for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) {
|
31716 | var k = (ring[i][0] - ring[j][0]) * (ring[j][1] + ring[i][1]);
|
31717 | var m = area + k;
|
31718 | err += Math.abs(area) >= Math.abs(k) ? area - m + k : k - m + area;
|
31719 | area = m;
|
31720 | }
|
31721 | if (area + err >= 0 !== !!dir) ring.reverse();
|
31722 | }
|
31723 |
|
31724 | const toGeoJSON = performance.vectorTile.VectorTileFeature.prototype.toGeoJSON;
|
31725 | class FeatureWrapper$1 {
|
31726 | constructor(feature) {
|
31727 | this._feature = feature;
|
31728 | this.extent = performance.EXTENT;
|
31729 | this.type = feature.type;
|
31730 | this.properties = feature.tags;
|
31731 | // If the feature has a top-level `id` property, copy it over, but only
|
31732 | // if it can be coerced to an integer, because this wrapper is used for
|
31733 | // serializing geojson feature data into vector tile PBF data, and the
|
31734 | // vector tile spec only supports integer values for feature ids --
|
31735 | // allowing non-integer values here results in a non-compliant PBF
|
31736 | // that causes an exception when it is parsed with vector-tile-js
|
31737 | if ('id' in feature && !isNaN(feature.id)) {
|
31738 | this.id = parseInt(feature.id, 10);
|
31739 | }
|
31740 | }
|
31741 | loadGeometry() {
|
31742 | if (this._feature.type === 1) {
|
31743 | const geometry = [];
|
31744 | for (const point of this._feature.geometry) {
|
31745 | geometry.push([new performance.pointGeometry(point[0], point[1])]);
|
31746 | }
|
31747 | return geometry;
|
31748 | }
|
31749 | else {
|
31750 | const geometry = [];
|
31751 | for (const ring of this._feature.geometry) {
|
31752 | const newRing = [];
|
31753 | for (const point of ring) {
|
31754 | newRing.push(new performance.pointGeometry(point[0], point[1]));
|
31755 | }
|
31756 | geometry.push(newRing);
|
31757 | }
|
31758 | return geometry;
|
31759 | }
|
31760 | }
|
31761 | toGeoJSON(x, y, z) {
|
31762 | return toGeoJSON.call(this, x, y, z);
|
31763 | }
|
31764 | }
|
31765 | class GeoJSONWrapper$2 {
|
31766 | constructor(features) {
|
31767 | this.layers = { '_geojsonTileLayer': this };
|
31768 | this.name = '_geojsonTileLayer';
|
31769 | this.extent = performance.EXTENT;
|
31770 | this.length = features.length;
|
31771 | this._features = features;
|
31772 | }
|
31773 | feature(i) {
|
31774 | return new FeatureWrapper$1(this._features[i]);
|
31775 | }
|
31776 | }
|
31777 |
|
31778 | var vtPbf = {exports: {}};
|
31779 |
|
31780 | ;
|
31781 |
|
31782 | var Point = performance.pointGeometry;
|
31783 | var VectorTileFeature = performance.vectorTile.VectorTileFeature;
|
31784 |
|
31785 | var geojson_wrapper = GeoJSONWrapper$1;
|
31786 |
|
31787 | // conform to vectortile api
|
31788 | function GeoJSONWrapper$1 (features, options) {
|
31789 | this.options = options || {};
|
31790 | this.features = features;
|
31791 | this.length = features.length;
|
31792 | }
|
31793 |
|
31794 | GeoJSONWrapper$1.prototype.feature = function (i) {
|
31795 | return new FeatureWrapper(this.features[i], this.options.extent)
|
31796 | };
|
31797 |
|
31798 | function FeatureWrapper (feature, extent) {
|
31799 | this.id = typeof feature.id === 'number' ? feature.id : undefined;
|
31800 | this.type = feature.type;
|
31801 | this.rawGeometry = feature.type === 1 ? [feature.geometry] : feature.geometry;
|
31802 | this.properties = feature.tags;
|
31803 | this.extent = extent || 4096;
|
31804 | }
|
31805 |
|
31806 | FeatureWrapper.prototype.loadGeometry = function () {
|
31807 | var rings = this.rawGeometry;
|
31808 | this.geometry = [];
|
31809 |
|
31810 | for (var i = 0; i < rings.length; i++) {
|
31811 | var ring = rings[i];
|
31812 | var newRing = [];
|
31813 | for (var j = 0; j < ring.length; j++) {
|
31814 | newRing.push(new Point(ring[j][0], ring[j][1]));
|
31815 | }
|
31816 | this.geometry.push(newRing);
|
31817 | }
|
31818 | return this.geometry
|
31819 | };
|
31820 |
|
31821 | FeatureWrapper.prototype.bbox = function () {
|
31822 | if (!this.geometry) this.loadGeometry();
|
31823 |
|
31824 | var rings = this.geometry;
|
31825 | var x1 = Infinity;
|
31826 | var x2 = -Infinity;
|
31827 | var y1 = Infinity;
|
31828 | var y2 = -Infinity;
|
31829 |
|
31830 | for (var i = 0; i < rings.length; i++) {
|
31831 | var ring = rings[i];
|
31832 |
|
31833 | for (var j = 0; j < ring.length; j++) {
|
31834 | var coord = ring[j];
|
31835 |
|
31836 | x1 = Math.min(x1, coord.x);
|
31837 | x2 = Math.max(x2, coord.x);
|
31838 | y1 = Math.min(y1, coord.y);
|
31839 | y2 = Math.max(y2, coord.y);
|
31840 | }
|
31841 | }
|
31842 |
|
31843 | return [x1, y1, x2, y2]
|
31844 | };
|
31845 |
|
31846 | FeatureWrapper.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON;
|
31847 |
|
31848 | var Pbf = performance.pbf;
|
31849 | var GeoJSONWrapper = geojson_wrapper;
|
31850 |
|
31851 | vtPbf.exports = fromVectorTileJs;
|
31852 | var fromVectorTileJs_1 = vtPbf.exports.fromVectorTileJs = fromVectorTileJs;
|
31853 | var fromGeojsonVt_1 = vtPbf.exports.fromGeojsonVt = fromGeojsonVt;
|
31854 | var GeoJSONWrapper_1 = vtPbf.exports.GeoJSONWrapper = GeoJSONWrapper;
|
31855 |
|
31856 | /**
|
31857 | * Serialize a vector-tile-js-created tile to pbf
|
31858 | *
|
31859 | * @param {Object} tile
|
31860 | * @return {Buffer} uncompressed, pbf-serialized tile data
|
31861 | */
|
31862 | function fromVectorTileJs (tile) {
|
31863 | var out = new Pbf();
|
31864 | writeTile(tile, out);
|
31865 | return out.finish()
|
31866 | }
|
31867 |
|
31868 | /**
|
31869 | * Serialized a geojson-vt-created tile to pbf.
|
31870 | *
|
31871 | * @param {Object} layers - An object mapping layer names to geojson-vt-created vector tile objects
|
31872 | * @param {Object} [options] - An object specifying the vector-tile specification version and extent that were used to create `layers`.
|
31873 | * @param {Number} [options.version=1] - Version of vector-tile spec used
|
31874 | * @param {Number} [options.extent=4096] - Extent of the vector tile
|
31875 | * @return {Buffer} uncompressed, pbf-serialized tile data
|
31876 | */
|
31877 | function fromGeojsonVt (layers, options) {
|
31878 | options = options || {};
|
31879 | var l = {};
|
31880 | for (var k in layers) {
|
31881 | l[k] = new GeoJSONWrapper(layers[k].features, options);
|
31882 | l[k].name = k;
|
31883 | l[k].version = options.version;
|
31884 | l[k].extent = options.extent;
|
31885 | }
|
31886 | return fromVectorTileJs({ layers: l })
|
31887 | }
|
31888 |
|
31889 | function writeTile (tile, pbf) {
|
31890 | for (var key in tile.layers) {
|
31891 | pbf.writeMessage(3, writeLayer, tile.layers[key]);
|
31892 | }
|
31893 | }
|
31894 |
|
31895 | function writeLayer (layer, pbf) {
|
31896 | pbf.writeVarintField(15, layer.version || 1);
|
31897 | pbf.writeStringField(1, layer.name || '');
|
31898 | pbf.writeVarintField(5, layer.extent || 4096);
|
31899 |
|
31900 | var i;
|
31901 | var context = {
|
31902 | keys: [],
|
31903 | values: [],
|
31904 | keycache: {},
|
31905 | valuecache: {}
|
31906 | };
|
31907 |
|
31908 | for (i = 0; i < layer.length; i++) {
|
31909 | context.feature = layer.feature(i);
|
31910 | pbf.writeMessage(2, writeFeature, context);
|
31911 | }
|
31912 |
|
31913 | var keys = context.keys;
|
31914 | for (i = 0; i < keys.length; i++) {
|
31915 | pbf.writeStringField(3, keys[i]);
|
31916 | }
|
31917 |
|
31918 | var values = context.values;
|
31919 | for (i = 0; i < values.length; i++) {
|
31920 | pbf.writeMessage(4, writeValue, values[i]);
|
31921 | }
|
31922 | }
|
31923 |
|
31924 | function writeFeature (context, pbf) {
|
31925 | var feature = context.feature;
|
31926 |
|
31927 | if (feature.id !== undefined) {
|
31928 | pbf.writeVarintField(1, feature.id);
|
31929 | }
|
31930 |
|
31931 | pbf.writeMessage(2, writeProperties, context);
|
31932 | pbf.writeVarintField(3, feature.type);
|
31933 | pbf.writeMessage(4, writeGeometry, feature);
|
31934 | }
|
31935 |
|
31936 | function writeProperties (context, pbf) {
|
31937 | var feature = context.feature;
|
31938 | var keys = context.keys;
|
31939 | var values = context.values;
|
31940 | var keycache = context.keycache;
|
31941 | var valuecache = context.valuecache;
|
31942 |
|
31943 | for (var key in feature.properties) {
|
31944 | var value = feature.properties[key];
|
31945 |
|
31946 | var keyIndex = keycache[key];
|
31947 | if (value === null) continue // don't encode null value properties
|
31948 |
|
31949 | if (typeof keyIndex === 'undefined') {
|
31950 | keys.push(key);
|
31951 | keyIndex = keys.length - 1;
|
31952 | keycache[key] = keyIndex;
|
31953 | }
|
31954 | pbf.writeVarint(keyIndex);
|
31955 |
|
31956 | var type = typeof value;
|
31957 | if (type !== 'string' && type !== 'boolean' && type !== 'number') {
|
31958 | value = JSON.stringify(value);
|
31959 | }
|
31960 | var valueKey = type + ':' + value;
|
31961 | var valueIndex = valuecache[valueKey];
|
31962 | if (typeof valueIndex === 'undefined') {
|
31963 | values.push(value);
|
31964 | valueIndex = values.length - 1;
|
31965 | valuecache[valueKey] = valueIndex;
|
31966 | }
|
31967 | pbf.writeVarint(valueIndex);
|
31968 | }
|
31969 | }
|
31970 |
|
31971 | function command (cmd, length) {
|
31972 | return (length << 3) + (cmd & 0x7)
|
31973 | }
|
31974 |
|
31975 | function zigzag (num) {
|
31976 | return (num << 1) ^ (num >> 31)
|
31977 | }
|
31978 |
|
31979 | function writeGeometry (feature, pbf) {
|
31980 | var geometry = feature.loadGeometry();
|
31981 | var type = feature.type;
|
31982 | var x = 0;
|
31983 | var y = 0;
|
31984 | var rings = geometry.length;
|
31985 | for (var r = 0; r < rings; r++) {
|
31986 | var ring = geometry[r];
|
31987 | var count = 1;
|
31988 | if (type === 1) {
|
31989 | count = ring.length;
|
31990 | }
|
31991 | pbf.writeVarint(command(1, count)); // moveto
|
31992 | // do not write polygon closing path as lineto
|
31993 | var lineCount = type === 3 ? ring.length - 1 : ring.length;
|
31994 | for (var i = 0; i < lineCount; i++) {
|
31995 | if (i === 1 && type !== 1) {
|
31996 | pbf.writeVarint(command(2, lineCount - 1)); // lineto
|
31997 | }
|
31998 | var dx = ring[i].x - x;
|
31999 | var dy = ring[i].y - y;
|
32000 | pbf.writeVarint(zigzag(dx));
|
32001 | pbf.writeVarint(zigzag(dy));
|
32002 | x += dx;
|
32003 | y += dy;
|
32004 | }
|
32005 | if (type === 3) {
|
32006 | pbf.writeVarint(command(7, 1)); // closepath
|
32007 | }
|
32008 | }
|
32009 | }
|
32010 |
|
32011 | function writeValue (value, pbf) {
|
32012 | var type = typeof value;
|
32013 | if (type === 'string') {
|
32014 | pbf.writeStringField(1, value);
|
32015 | } else if (type === 'boolean') {
|
32016 | pbf.writeBooleanField(7, value);
|
32017 | } else if (type === 'number') {
|
32018 | if (value % 1 !== 0) {
|
32019 | pbf.writeDoubleField(3, value);
|
32020 | } else if (value < 0) {
|
32021 | pbf.writeSVarintField(6, value);
|
32022 | } else {
|
32023 | pbf.writeVarintField(5, value);
|
32024 | }
|
32025 | }
|
32026 | }
|
32027 |
|
32028 | var vtpbf = vtPbf.exports;
|
32029 |
|
32030 | function sortKD(ids, coords, nodeSize, left, right, depth) {
|
32031 | if (right - left <= nodeSize) return;
|
32032 |
|
32033 | const m = (left + right) >> 1;
|
32034 |
|
32035 | select(ids, coords, m, left, right, depth % 2);
|
32036 |
|
32037 | sortKD(ids, coords, nodeSize, left, m - 1, depth + 1);
|
32038 | sortKD(ids, coords, nodeSize, m + 1, right, depth + 1);
|
32039 | }
|
32040 |
|
32041 | function select(ids, coords, k, left, right, inc) {
|
32042 |
|
32043 | while (right > left) {
|
32044 | if (right - left > 600) {
|
32045 | const n = right - left + 1;
|
32046 | const m = k - left + 1;
|
32047 | const z = Math.log(n);
|
32048 | const s = 0.5 * Math.exp(2 * z / 3);
|
32049 | const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
|
32050 | const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
|
32051 | const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
|
32052 | select(ids, coords, k, newLeft, newRight, inc);
|
32053 | }
|
32054 |
|
32055 | const t = coords[2 * k + inc];
|
32056 | let i = left;
|
32057 | let j = right;
|
32058 |
|
32059 | swapItem(ids, coords, left, k);
|
32060 | if (coords[2 * right + inc] > t) swapItem(ids, coords, left, right);
|
32061 |
|
32062 | while (i < j) {
|
32063 | swapItem(ids, coords, i, j);
|
32064 | i++;
|
32065 | j--;
|
32066 | while (coords[2 * i + inc] < t) i++;
|
32067 | while (coords[2 * j + inc] > t) j--;
|
32068 | }
|
32069 |
|
32070 | if (coords[2 * left + inc] === t) swapItem(ids, coords, left, j);
|
32071 | else {
|
32072 | j++;
|
32073 | swapItem(ids, coords, j, right);
|
32074 | }
|
32075 |
|
32076 | if (j <= k) left = j + 1;
|
32077 | if (k <= j) right = j - 1;
|
32078 | }
|
32079 | }
|
32080 |
|
32081 | function swapItem(ids, coords, i, j) {
|
32082 | swap(ids, i, j);
|
32083 | swap(coords, 2 * i, 2 * j);
|
32084 | swap(coords, 2 * i + 1, 2 * j + 1);
|
32085 | }
|
32086 |
|
32087 | function swap(arr, i, j) {
|
32088 | const tmp = arr[i];
|
32089 | arr[i] = arr[j];
|
32090 | arr[j] = tmp;
|
32091 | }
|
32092 |
|
32093 | function range(ids, coords, minX, minY, maxX, maxY, nodeSize) {
|
32094 | const stack = [0, ids.length - 1, 0];
|
32095 | const result = [];
|
32096 | let x, y;
|
32097 |
|
32098 | while (stack.length) {
|
32099 | const axis = stack.pop();
|
32100 | const right = stack.pop();
|
32101 | const left = stack.pop();
|
32102 |
|
32103 | if (right - left <= nodeSize) {
|
32104 | for (let i = left; i <= right; i++) {
|
32105 | x = coords[2 * i];
|
32106 | y = coords[2 * i + 1];
|
32107 | if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[i]);
|
32108 | }
|
32109 | continue;
|
32110 | }
|
32111 |
|
32112 | const m = Math.floor((left + right) / 2);
|
32113 |
|
32114 | x = coords[2 * m];
|
32115 | y = coords[2 * m + 1];
|
32116 |
|
32117 | if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[m]);
|
32118 |
|
32119 | const nextAxis = (axis + 1) % 2;
|
32120 |
|
32121 | if (axis === 0 ? minX <= x : minY <= y) {
|
32122 | stack.push(left);
|
32123 | stack.push(m - 1);
|
32124 | stack.push(nextAxis);
|
32125 | }
|
32126 | if (axis === 0 ? maxX >= x : maxY >= y) {
|
32127 | stack.push(m + 1);
|
32128 | stack.push(right);
|
32129 | stack.push(nextAxis);
|
32130 | }
|
32131 | }
|
32132 |
|
32133 | return result;
|
32134 | }
|
32135 |
|
32136 | function within(ids, coords, qx, qy, r, nodeSize) {
|
32137 | const stack = [0, ids.length - 1, 0];
|
32138 | const result = [];
|
32139 | const r2 = r * r;
|
32140 |
|
32141 | while (stack.length) {
|
32142 | const axis = stack.pop();
|
32143 | const right = stack.pop();
|
32144 | const left = stack.pop();
|
32145 |
|
32146 | if (right - left <= nodeSize) {
|
32147 | for (let i = left; i <= right; i++) {
|
32148 | if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) result.push(ids[i]);
|
32149 | }
|
32150 | continue;
|
32151 | }
|
32152 |
|
32153 | const m = Math.floor((left + right) / 2);
|
32154 |
|
32155 | const x = coords[2 * m];
|
32156 | const y = coords[2 * m + 1];
|
32157 |
|
32158 | if (sqDist(x, y, qx, qy) <= r2) result.push(ids[m]);
|
32159 |
|
32160 | const nextAxis = (axis + 1) % 2;
|
32161 |
|
32162 | if (axis === 0 ? qx - r <= x : qy - r <= y) {
|
32163 | stack.push(left);
|
32164 | stack.push(m - 1);
|
32165 | stack.push(nextAxis);
|
32166 | }
|
32167 | if (axis === 0 ? qx + r >= x : qy + r >= y) {
|
32168 | stack.push(m + 1);
|
32169 | stack.push(right);
|
32170 | stack.push(nextAxis);
|
32171 | }
|
32172 | }
|
32173 |
|
32174 | return result;
|
32175 | }
|
32176 |
|
32177 | function sqDist(ax, ay, bx, by) {
|
32178 | const dx = ax - bx;
|
32179 | const dy = ay - by;
|
32180 | return dx * dx + dy * dy;
|
32181 | }
|
32182 |
|
32183 | const defaultGetX = p => p[0];
|
32184 | const defaultGetY = p => p[1];
|
32185 |
|
32186 | class KDBush {
|
32187 | constructor(points, getX = defaultGetX, getY = defaultGetY, nodeSize = 64, ArrayType = Float64Array) {
|
32188 | this.nodeSize = nodeSize;
|
32189 | this.points = points;
|
32190 |
|
32191 | const IndexArrayType = points.length < 65536 ? Uint16Array : Uint32Array;
|
32192 |
|
32193 | const ids = this.ids = new IndexArrayType(points.length);
|
32194 | const coords = this.coords = new ArrayType(points.length * 2);
|
32195 |
|
32196 | for (let i = 0; i < points.length; i++) {
|
32197 | ids[i] = i;
|
32198 | coords[2 * i] = getX(points[i]);
|
32199 | coords[2 * i + 1] = getY(points[i]);
|
32200 | }
|
32201 |
|
32202 | sortKD(ids, coords, nodeSize, 0, ids.length - 1, 0);
|
32203 | }
|
32204 |
|
32205 | range(minX, minY, maxX, maxY) {
|
32206 | return range(this.ids, this.coords, minX, minY, maxX, maxY, this.nodeSize);
|
32207 | }
|
32208 |
|
32209 | within(x, y, r) {
|
32210 | return within(this.ids, this.coords, x, y, r, this.nodeSize);
|
32211 | }
|
32212 | }
|
32213 |
|
32214 | const defaultOptions = {
|
32215 | minZoom: 0, // min zoom to generate clusters on
|
32216 | maxZoom: 16, // max zoom level to cluster the points on
|
32217 | minPoints: 2, // minimum points to form a cluster
|
32218 | radius: 40, // cluster radius in pixels
|
32219 | extent: 512, // tile extent (radius is calculated relative to it)
|
32220 | nodeSize: 64, // size of the KD-tree leaf node, affects performance
|
32221 | log: false, // whether to log timing info
|
32222 |
|
32223 | // whether to generate numeric ids for input features (in vector tiles)
|
32224 | generateId: false,
|
32225 |
|
32226 | // a reduce function for calculating custom cluster properties
|
32227 | reduce: null, // (accumulated, props) => { accumulated.sum += props.sum; }
|
32228 |
|
32229 | // properties to use for individual points when running the reducer
|
32230 | map: props => props // props => ({sum: props.my_value})
|
32231 | };
|
32232 |
|
32233 | const fround = Math.fround || (tmp => ((x) => { tmp[0] = +x; return tmp[0]; }))(new Float32Array(1));
|
32234 |
|
32235 | class Supercluster {
|
32236 | constructor(options) {
|
32237 | this.options = extend$1(Object.create(defaultOptions), options);
|
32238 | this.trees = new Array(this.options.maxZoom + 1);
|
32239 | }
|
32240 |
|
32241 | load(points) {
|
32242 | const {log, minZoom, maxZoom, nodeSize} = this.options;
|
32243 |
|
32244 | if (log) console.time('total time');
|
32245 |
|
32246 | const timerId = `prepare ${ points.length } points`;
|
32247 | if (log) console.time(timerId);
|
32248 |
|
32249 | this.points = points;
|
32250 |
|
32251 | // generate a cluster object for each point and index input points into a KD-tree
|
32252 | let clusters = [];
|
32253 | for (let i = 0; i < points.length; i++) {
|
32254 | if (!points[i].geometry) continue;
|
32255 | clusters.push(createPointCluster(points[i], i));
|
32256 | }
|
32257 | this.trees[maxZoom + 1] = new KDBush(clusters, getX, getY, nodeSize, Float32Array);
|
32258 |
|
32259 | if (log) console.timeEnd(timerId);
|
32260 |
|
32261 | // cluster points on max zoom, then cluster the results on previous zoom, etc.;
|
32262 | // results in a cluster hierarchy across zoom levels
|
32263 | for (let z = maxZoom; z >= minZoom; z--) {
|
32264 | const now = +Date.now();
|
32265 |
|
32266 | // create a new set of clusters for the zoom and index them with a KD-tree
|
32267 | clusters = this._cluster(clusters, z);
|
32268 | this.trees[z] = new KDBush(clusters, getX, getY, nodeSize, Float32Array);
|
32269 |
|
32270 | if (log) console.log('z%d: %d clusters in %dms', z, clusters.length, +Date.now() - now);
|
32271 | }
|
32272 |
|
32273 | if (log) console.timeEnd('total time');
|
32274 |
|
32275 | return this;
|
32276 | }
|
32277 |
|
32278 | getClusters(bbox, zoom) {
|
32279 | let minLng = ((bbox[0] + 180) % 360 + 360) % 360 - 180;
|
32280 | const minLat = Math.max(-90, Math.min(90, bbox[1]));
|
32281 | let maxLng = bbox[2] === 180 ? 180 : ((bbox[2] + 180) % 360 + 360) % 360 - 180;
|
32282 | const maxLat = Math.max(-90, Math.min(90, bbox[3]));
|
32283 |
|
32284 | if (bbox[2] - bbox[0] >= 360) {
|
32285 | minLng = -180;
|
32286 | maxLng = 180;
|
32287 | } else if (minLng > maxLng) {
|
32288 | const easternHem = this.getClusters([minLng, minLat, 180, maxLat], zoom);
|
32289 | const westernHem = this.getClusters([-180, minLat, maxLng, maxLat], zoom);
|
32290 | return easternHem.concat(westernHem);
|
32291 | }
|
32292 |
|
32293 | const tree = this.trees[this._limitZoom(zoom)];
|
32294 | const ids = tree.range(lngX(minLng), latY(maxLat), lngX(maxLng), latY(minLat));
|
32295 | const clusters = [];
|
32296 | for (const id of ids) {
|
32297 | const c = tree.points[id];
|
32298 | clusters.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]);
|
32299 | }
|
32300 | return clusters;
|
32301 | }
|
32302 |
|
32303 | getChildren(clusterId) {
|
32304 | const originId = this._getOriginId(clusterId);
|
32305 | const originZoom = this._getOriginZoom(clusterId);
|
32306 | const errorMsg = 'No cluster with the specified id.';
|
32307 |
|
32308 | const index = this.trees[originZoom];
|
32309 | if (!index) throw new Error(errorMsg);
|
32310 |
|
32311 | const origin = index.points[originId];
|
32312 | if (!origin) throw new Error(errorMsg);
|
32313 |
|
32314 | const r = this.options.radius / (this.options.extent * Math.pow(2, originZoom - 1));
|
32315 | const ids = index.within(origin.x, origin.y, r);
|
32316 | const children = [];
|
32317 | for (const id of ids) {
|
32318 | const c = index.points[id];
|
32319 | if (c.parentId === clusterId) {
|
32320 | children.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]);
|
32321 | }
|
32322 | }
|
32323 |
|
32324 | if (children.length === 0) throw new Error(errorMsg);
|
32325 |
|
32326 | return children;
|
32327 | }
|
32328 |
|
32329 | getLeaves(clusterId, limit, offset) {
|
32330 | limit = limit || 10;
|
32331 | offset = offset || 0;
|
32332 |
|
32333 | const leaves = [];
|
32334 | this._appendLeaves(leaves, clusterId, limit, offset, 0);
|
32335 |
|
32336 | return leaves;
|
32337 | }
|
32338 |
|
32339 | getTile(z, x, y) {
|
32340 | const tree = this.trees[this._limitZoom(z)];
|
32341 | const z2 = Math.pow(2, z);
|
32342 | const {extent, radius} = this.options;
|
32343 | const p = radius / extent;
|
32344 | const top = (y - p) / z2;
|
32345 | const bottom = (y + 1 + p) / z2;
|
32346 |
|
32347 | const tile = {
|
32348 | features: []
|
32349 | };
|
32350 |
|
32351 | this._addTileFeatures(
|
32352 | tree.range((x - p) / z2, top, (x + 1 + p) / z2, bottom),
|
32353 | tree.points, x, y, z2, tile);
|
32354 |
|
32355 | if (x === 0) {
|
32356 | this._addTileFeatures(
|
32357 | tree.range(1 - p / z2, top, 1, bottom),
|
32358 | tree.points, z2, y, z2, tile);
|
32359 | }
|
32360 | if (x === z2 - 1) {
|
32361 | this._addTileFeatures(
|
32362 | tree.range(0, top, p / z2, bottom),
|
32363 | tree.points, -1, y, z2, tile);
|
32364 | }
|
32365 |
|
32366 | return tile.features.length ? tile : null;
|
32367 | }
|
32368 |
|
32369 | getClusterExpansionZoom(clusterId) {
|
32370 | let expansionZoom = this._getOriginZoom(clusterId) - 1;
|
32371 | while (expansionZoom <= this.options.maxZoom) {
|
32372 | const children = this.getChildren(clusterId);
|
32373 | expansionZoom++;
|
32374 | if (children.length !== 1) break;
|
32375 | clusterId = children[0].properties.cluster_id;
|
32376 | }
|
32377 | return expansionZoom;
|
32378 | }
|
32379 |
|
32380 | _appendLeaves(result, clusterId, limit, offset, skipped) {
|
32381 | const children = this.getChildren(clusterId);
|
32382 |
|
32383 | for (const child of children) {
|
32384 | const props = child.properties;
|
32385 |
|
32386 | if (props && props.cluster) {
|
32387 | if (skipped + props.point_count <= offset) {
|
32388 | // skip the whole cluster
|
32389 | skipped += props.point_count;
|
32390 | } else {
|
32391 | // enter the cluster
|
32392 | skipped = this._appendLeaves(result, props.cluster_id, limit, offset, skipped);
|
32393 | // exit the cluster
|
32394 | }
|
32395 | } else if (skipped < offset) {
|
32396 | // skip a single point
|
32397 | skipped++;
|
32398 | } else {
|
32399 | // add a single point
|
32400 | result.push(child);
|
32401 | }
|
32402 | if (result.length === limit) break;
|
32403 | }
|
32404 |
|
32405 | return skipped;
|
32406 | }
|
32407 |
|
32408 | _addTileFeatures(ids, points, x, y, z2, tile) {
|
32409 | for (const i of ids) {
|
32410 | const c = points[i];
|
32411 | const isCluster = c.numPoints;
|
32412 |
|
32413 | let tags, px, py;
|
32414 | if (isCluster) {
|
32415 | tags = getClusterProperties(c);
|
32416 | px = c.x;
|
32417 | py = c.y;
|
32418 | } else {
|
32419 | const p = this.points[c.index];
|
32420 | tags = p.properties;
|
32421 | px = lngX(p.geometry.coordinates[0]);
|
32422 | py = latY(p.geometry.coordinates[1]);
|
32423 | }
|
32424 |
|
32425 | const f = {
|
32426 | type: 1,
|
32427 | geometry: [[
|
32428 | Math.round(this.options.extent * (px * z2 - x)),
|
32429 | Math.round(this.options.extent * (py * z2 - y))
|
32430 | ]],
|
32431 | tags
|
32432 | };
|
32433 |
|
32434 | // assign id
|
32435 | let id;
|
32436 | if (isCluster) {
|
32437 | id = c.id;
|
32438 | } else if (this.options.generateId) {
|
32439 | // optionally generate id
|
32440 | id = c.index;
|
32441 | } else if (this.points[c.index].id) {
|
32442 | // keep id if already assigned
|
32443 | id = this.points[c.index].id;
|
32444 | }
|
32445 |
|
32446 | if (id !== undefined) f.id = id;
|
32447 |
|
32448 | tile.features.push(f);
|
32449 | }
|
32450 | }
|
32451 |
|
32452 | _limitZoom(z) {
|
32453 | return Math.max(this.options.minZoom, Math.min(+z, this.options.maxZoom + 1));
|
32454 | }
|
32455 |
|
32456 | _cluster(points, zoom) {
|
32457 | const clusters = [];
|
32458 | const {radius, extent, reduce, minPoints} = this.options;
|
32459 | const r = radius / (extent * Math.pow(2, zoom));
|
32460 |
|
32461 | // loop through each point
|
32462 | for (let i = 0; i < points.length; i++) {
|
32463 | const p = points[i];
|
32464 | // if we've already visited the point at this zoom level, skip it
|
32465 | if (p.zoom <= zoom) continue;
|
32466 | p.zoom = zoom;
|
32467 |
|
32468 | // find all nearby points
|
32469 | const tree = this.trees[zoom + 1];
|
32470 | const neighborIds = tree.within(p.x, p.y, r);
|
32471 |
|
32472 | const numPointsOrigin = p.numPoints || 1;
|
32473 | let numPoints = numPointsOrigin;
|
32474 |
|
32475 | // count the number of points in a potential cluster
|
32476 | for (const neighborId of neighborIds) {
|
32477 | const b = tree.points[neighborId];
|
32478 | // filter out neighbors that are already processed
|
32479 | if (b.zoom > zoom) numPoints += b.numPoints || 1;
|
32480 | }
|
32481 |
|
32482 | // if there were neighbors to merge, and there are enough points to form a cluster
|
32483 | if (numPoints > numPointsOrigin && numPoints >= minPoints) {
|
32484 | let wx = p.x * numPointsOrigin;
|
32485 | let wy = p.y * numPointsOrigin;
|
32486 |
|
32487 | let clusterProperties = reduce && numPointsOrigin > 1 ? this._map(p, true) : null;
|
32488 |
|
32489 | // encode both zoom and point index on which the cluster originated -- offset by total length of features
|
32490 | const id = (i << 5) + (zoom + 1) + this.points.length;
|
32491 |
|
32492 | for (const neighborId of neighborIds) {
|
32493 | const b = tree.points[neighborId];
|
32494 |
|
32495 | if (b.zoom <= zoom) continue;
|
32496 | b.zoom = zoom; // save the zoom (so it doesn't get processed twice)
|
32497 |
|
32498 | const numPoints2 = b.numPoints || 1;
|
32499 | wx += b.x * numPoints2; // accumulate coordinates for calculating weighted center
|
32500 | wy += b.y * numPoints2;
|
32501 |
|
32502 | b.parentId = id;
|
32503 |
|
32504 | if (reduce) {
|
32505 | if (!clusterProperties) clusterProperties = this._map(p, true);
|
32506 | reduce(clusterProperties, this._map(b));
|
32507 | }
|
32508 | }
|
32509 |
|
32510 | p.parentId = id;
|
32511 | clusters.push(createCluster(wx / numPoints, wy / numPoints, id, numPoints, clusterProperties));
|
32512 |
|
32513 | } else { // left points as unclustered
|
32514 | clusters.push(p);
|
32515 |
|
32516 | if (numPoints > 1) {
|
32517 | for (const neighborId of neighborIds) {
|
32518 | const b = tree.points[neighborId];
|
32519 | if (b.zoom <= zoom) continue;
|
32520 | b.zoom = zoom;
|
32521 | clusters.push(b);
|
32522 | }
|
32523 | }
|
32524 | }
|
32525 | }
|
32526 |
|
32527 | return clusters;
|
32528 | }
|
32529 |
|
32530 | // get index of the point from which the cluster originated
|
32531 | _getOriginId(clusterId) {
|
32532 | return (clusterId - this.points.length) >> 5;
|
32533 | }
|
32534 |
|
32535 | // get zoom of the point from which the cluster originated
|
32536 | _getOriginZoom(clusterId) {
|
32537 | return (clusterId - this.points.length) % 32;
|
32538 | }
|
32539 |
|
32540 | _map(point, clone) {
|
32541 | if (point.numPoints) {
|
32542 | return clone ? extend$1({}, point.properties) : point.properties;
|
32543 | }
|
32544 | const original = this.points[point.index].properties;
|
32545 | const result = this.options.map(original);
|
32546 | return clone && result === original ? extend$1({}, result) : result;
|
32547 | }
|
32548 | }
|
32549 |
|
32550 | function createCluster(x, y, id, numPoints, properties) {
|
32551 | return {
|
32552 | x: fround(x), // weighted cluster center; round for consistency with Float32Array index
|
32553 | y: fround(y),
|
32554 | zoom: Infinity, // the last zoom the cluster was processed at
|
32555 | id, // encodes index of the first child of the cluster and its zoom level
|
32556 | parentId: -1, // parent cluster id
|
32557 | numPoints,
|
32558 | properties
|
32559 | };
|
32560 | }
|
32561 |
|
32562 | function createPointCluster(p, id) {
|
32563 | const [x, y] = p.geometry.coordinates;
|
32564 | return {
|
32565 | x: fround(lngX(x)), // projected point coordinates
|
32566 | y: fround(latY(y)),
|
32567 | zoom: Infinity, // the last zoom the point was processed at
|
32568 | index: id, // index of the source feature in the original input array,
|
32569 | parentId: -1 // parent cluster id
|
32570 | };
|
32571 | }
|
32572 |
|
32573 | function getClusterJSON(cluster) {
|
32574 | return {
|
32575 | type: 'Feature',
|
32576 | id: cluster.id,
|
32577 | properties: getClusterProperties(cluster),
|
32578 | geometry: {
|
32579 | type: 'Point',
|
32580 | coordinates: [xLng(cluster.x), yLat(cluster.y)]
|
32581 | }
|
32582 | };
|
32583 | }
|
32584 |
|
32585 | function getClusterProperties(cluster) {
|
32586 | const count = cluster.numPoints;
|
32587 | const abbrev =
|
32588 | count >= 10000 ? `${Math.round(count / 1000) }k` :
|
32589 | count >= 1000 ? `${Math.round(count / 100) / 10 }k` : count;
|
32590 | return extend$1(extend$1({}, cluster.properties), {
|
32591 | cluster: true,
|
32592 | cluster_id: cluster.id,
|
32593 | point_count: count,
|
32594 | point_count_abbreviated: abbrev
|
32595 | });
|
32596 | }
|
32597 |
|
32598 | // longitude/latitude to spherical mercator in [0..1] range
|
32599 | function lngX(lng) {
|
32600 | return lng / 360 + 0.5;
|
32601 | }
|
32602 | function latY(lat) {
|
32603 | const sin = Math.sin(lat * Math.PI / 180);
|
32604 | const y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI);
|
32605 | return y < 0 ? 0 : y > 1 ? 1 : y;
|
32606 | }
|
32607 |
|
32608 | // spherical mercator to longitude/latitude
|
32609 | function xLng(x) {
|
32610 | return (x - 0.5) * 360;
|
32611 | }
|
32612 | function yLat(y) {
|
32613 | const y2 = (180 - y * 360) * Math.PI / 180;
|
32614 | return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90;
|
32615 | }
|
32616 |
|
32617 | function extend$1(dest, src) {
|
32618 | for (const id in src) dest[id] = src[id];
|
32619 | return dest;
|
32620 | }
|
32621 |
|
32622 | function getX(p) {
|
32623 | return p.x;
|
32624 | }
|
32625 | function getY(p) {
|
32626 | return p.y;
|
32627 | }
|
32628 |
|
32629 | // calculate simplification data using optimized Douglas-Peucker algorithm
|
32630 |
|
32631 | function simplify(coords, first, last, sqTolerance) {
|
32632 | var maxSqDist = sqTolerance;
|
32633 | var mid = (last - first) >> 1;
|
32634 | var minPosToMid = last - first;
|
32635 | var index;
|
32636 |
|
32637 | var ax = coords[first];
|
32638 | var ay = coords[first + 1];
|
32639 | var bx = coords[last];
|
32640 | var by = coords[last + 1];
|
32641 |
|
32642 | for (var i = first + 3; i < last; i += 3) {
|
32643 | var d = getSqSegDist(coords[i], coords[i + 1], ax, ay, bx, by);
|
32644 |
|
32645 | if (d > maxSqDist) {
|
32646 | index = i;
|
32647 | maxSqDist = d;
|
32648 |
|
32649 | } else if (d === maxSqDist) {
|
32650 | // a workaround to ensure we choose a pivot close to the middle of the list,
|
32651 | // reducing recursion depth, for certain degenerate inputs
|
32652 | // https://github.com/mapbox/geojson-vt/issues/104
|
32653 | var posToMid = Math.abs(i - mid);
|
32654 | if (posToMid < minPosToMid) {
|
32655 | index = i;
|
32656 | minPosToMid = posToMid;
|
32657 | }
|
32658 | }
|
32659 | }
|
32660 |
|
32661 | if (maxSqDist > sqTolerance) {
|
32662 | if (index - first > 3) simplify(coords, first, index, sqTolerance);
|
32663 | coords[index + 2] = maxSqDist;
|
32664 | if (last - index > 3) simplify(coords, index, last, sqTolerance);
|
32665 | }
|
32666 | }
|
32667 |
|
32668 | // square distance from a point to a segment
|
32669 | function getSqSegDist(px, py, x, y, bx, by) {
|
32670 |
|
32671 | var dx = bx - x;
|
32672 | var dy = by - y;
|
32673 |
|
32674 | if (dx !== 0 || dy !== 0) {
|
32675 |
|
32676 | var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy);
|
32677 |
|
32678 | if (t > 1) {
|
32679 | x = bx;
|
32680 | y = by;
|
32681 |
|
32682 | } else if (t > 0) {
|
32683 | x += dx * t;
|
32684 | y += dy * t;
|
32685 | }
|
32686 | }
|
32687 |
|
32688 | dx = px - x;
|
32689 | dy = py - y;
|
32690 |
|
32691 | return dx * dx + dy * dy;
|
32692 | }
|
32693 |
|
32694 | function createFeature(id, type, geom, tags) {
|
32695 | var feature = {
|
32696 | id: typeof id === 'undefined' ? null : id,
|
32697 | type: type,
|
32698 | geometry: geom,
|
32699 | tags: tags,
|
32700 | minX: Infinity,
|
32701 | minY: Infinity,
|
32702 | maxX: -Infinity,
|
32703 | maxY: -Infinity
|
32704 | };
|
32705 | calcBBox(feature);
|
32706 | return feature;
|
32707 | }
|
32708 |
|
32709 | function calcBBox(feature) {
|
32710 | var geom = feature.geometry;
|
32711 | var type = feature.type;
|
32712 |
|
32713 | if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') {
|
32714 | calcLineBBox(feature, geom);
|
32715 |
|
32716 | } else if (type === 'Polygon' || type === 'MultiLineString') {
|
32717 | for (var i = 0; i < geom.length; i++) {
|
32718 | calcLineBBox(feature, geom[i]);
|
32719 | }
|
32720 |
|
32721 | } else if (type === 'MultiPolygon') {
|
32722 | for (i = 0; i < geom.length; i++) {
|
32723 | for (var j = 0; j < geom[i].length; j++) {
|
32724 | calcLineBBox(feature, geom[i][j]);
|
32725 | }
|
32726 | }
|
32727 | }
|
32728 | }
|
32729 |
|
32730 | function calcLineBBox(feature, geom) {
|
32731 | for (var i = 0; i < geom.length; i += 3) {
|
32732 | feature.minX = Math.min(feature.minX, geom[i]);
|
32733 | feature.minY = Math.min(feature.minY, geom[i + 1]);
|
32734 | feature.maxX = Math.max(feature.maxX, geom[i]);
|
32735 | feature.maxY = Math.max(feature.maxY, geom[i + 1]);
|
32736 | }
|
32737 | }
|
32738 |
|
32739 | // converts GeoJSON feature into an intermediate projected JSON vector format with simplification data
|
32740 |
|
32741 | function convert(data, options) {
|
32742 | var features = [];
|
32743 | if (data.type === 'FeatureCollection') {
|
32744 | for (var i = 0; i < data.features.length; i++) {
|
32745 | convertFeature(features, data.features[i], options, i);
|
32746 | }
|
32747 |
|
32748 | } else if (data.type === 'Feature') {
|
32749 | convertFeature(features, data, options);
|
32750 |
|
32751 | } else {
|
32752 | // single geometry or a geometry collection
|
32753 | convertFeature(features, {geometry: data}, options);
|
32754 | }
|
32755 |
|
32756 | return features;
|
32757 | }
|
32758 |
|
32759 | function convertFeature(features, geojson, options, index) {
|
32760 | if (!geojson.geometry) return;
|
32761 |
|
32762 | var coords = geojson.geometry.coordinates;
|
32763 | var type = geojson.geometry.type;
|
32764 | var tolerance = Math.pow(options.tolerance / ((1 << options.maxZoom) * options.extent), 2);
|
32765 | var geometry = [];
|
32766 | var id = geojson.id;
|
32767 | if (options.promoteId) {
|
32768 | id = geojson.properties[options.promoteId];
|
32769 | } else if (options.generateId) {
|
32770 | id = index || 0;
|
32771 | }
|
32772 | if (type === 'Point') {
|
32773 | convertPoint(coords, geometry);
|
32774 |
|
32775 | } else if (type === 'MultiPoint') {
|
32776 | for (var i = 0; i < coords.length; i++) {
|
32777 | convertPoint(coords[i], geometry);
|
32778 | }
|
32779 |
|
32780 | } else if (type === 'LineString') {
|
32781 | convertLine(coords, geometry, tolerance, false);
|
32782 |
|
32783 | } else if (type === 'MultiLineString') {
|
32784 | if (options.lineMetrics) {
|
32785 | // explode into linestrings to be able to track metrics
|
32786 | for (i = 0; i < coords.length; i++) {
|
32787 | geometry = [];
|
32788 | convertLine(coords[i], geometry, tolerance, false);
|
32789 | features.push(createFeature(id, 'LineString', geometry, geojson.properties));
|
32790 | }
|
32791 | return;
|
32792 | } else {
|
32793 | convertLines(coords, geometry, tolerance, false);
|
32794 | }
|
32795 |
|
32796 | } else if (type === 'Polygon') {
|
32797 | convertLines(coords, geometry, tolerance, true);
|
32798 |
|
32799 | } else if (type === 'MultiPolygon') {
|
32800 | for (i = 0; i < coords.length; i++) {
|
32801 | var polygon = [];
|
32802 | convertLines(coords[i], polygon, tolerance, true);
|
32803 | geometry.push(polygon);
|
32804 | }
|
32805 | } else if (type === 'GeometryCollection') {
|
32806 | for (i = 0; i < geojson.geometry.geometries.length; i++) {
|
32807 | convertFeature(features, {
|
32808 | id: id,
|
32809 | geometry: geojson.geometry.geometries[i],
|
32810 | properties: geojson.properties
|
32811 | }, options, index);
|
32812 | }
|
32813 | return;
|
32814 | } else {
|
32815 | throw new Error('Input data is not a valid GeoJSON object.');
|
32816 | }
|
32817 |
|
32818 | features.push(createFeature(id, type, geometry, geojson.properties));
|
32819 | }
|
32820 |
|
32821 | function convertPoint(coords, out) {
|
32822 | out.push(projectX(coords[0]));
|
32823 | out.push(projectY(coords[1]));
|
32824 | out.push(0);
|
32825 | }
|
32826 |
|
32827 | function convertLine(ring, out, tolerance, isPolygon) {
|
32828 | var x0, y0;
|
32829 | var size = 0;
|
32830 |
|
32831 | for (var j = 0; j < ring.length; j++) {
|
32832 | var x = projectX(ring[j][0]);
|
32833 | var y = projectY(ring[j][1]);
|
32834 |
|
32835 | out.push(x);
|
32836 | out.push(y);
|
32837 | out.push(0);
|
32838 |
|
32839 | if (j > 0) {
|
32840 | if (isPolygon) {
|
32841 | size += (x0 * y - x * y0) / 2; // area
|
32842 | } else {
|
32843 | size += Math.sqrt(Math.pow(x - x0, 2) + Math.pow(y - y0, 2)); // length
|
32844 | }
|
32845 | }
|
32846 | x0 = x;
|
32847 | y0 = y;
|
32848 | }
|
32849 |
|
32850 | var last = out.length - 3;
|
32851 | out[2] = 1;
|
32852 | simplify(out, 0, last, tolerance);
|
32853 | out[last + 2] = 1;
|
32854 |
|
32855 | out.size = Math.abs(size);
|
32856 | out.start = 0;
|
32857 | out.end = out.size;
|
32858 | }
|
32859 |
|
32860 | function convertLines(rings, out, tolerance, isPolygon) {
|
32861 | for (var i = 0; i < rings.length; i++) {
|
32862 | var geom = [];
|
32863 | convertLine(rings[i], geom, tolerance, isPolygon);
|
32864 | out.push(geom);
|
32865 | }
|
32866 | }
|
32867 |
|
32868 | function projectX(x) {
|
32869 | return x / 360 + 0.5;
|
32870 | }
|
32871 |
|
32872 | function projectY(y) {
|
32873 | var sin = Math.sin(y * Math.PI / 180);
|
32874 | var y2 = 0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI;
|
32875 | return y2 < 0 ? 0 : y2 > 1 ? 1 : y2;
|
32876 | }
|
32877 |
|
32878 | /* clip features between two axis-parallel lines:
|
32879 | * | |
|
32880 | * ___|___ | /
|
32881 | * / | \____|____/
|
32882 | * | |
|
32883 | */
|
32884 |
|
32885 | function clip(features, scale, k1, k2, axis, minAll, maxAll, options) {
|
32886 |
|
32887 | k1 /= scale;
|
32888 | k2 /= scale;
|
32889 |
|
32890 | if (minAll >= k1 && maxAll < k2) return features; // trivial accept
|
32891 | else if (maxAll < k1 || minAll >= k2) return null; // trivial reject
|
32892 |
|
32893 | var clipped = [];
|
32894 |
|
32895 | for (var i = 0; i < features.length; i++) {
|
32896 |
|
32897 | var feature = features[i];
|
32898 | var geometry = feature.geometry;
|
32899 | var type = feature.type;
|
32900 |
|
32901 | var min = axis === 0 ? feature.minX : feature.minY;
|
32902 | var max = axis === 0 ? feature.maxX : feature.maxY;
|
32903 |
|
32904 | if (min >= k1 && max < k2) { // trivial accept
|
32905 | clipped.push(feature);
|
32906 | continue;
|
32907 | } else if (max < k1 || min >= k2) { // trivial reject
|
32908 | continue;
|
32909 | }
|
32910 |
|
32911 | var newGeometry = [];
|
32912 |
|
32913 | if (type === 'Point' || type === 'MultiPoint') {
|
32914 | clipPoints(geometry, newGeometry, k1, k2, axis);
|
32915 |
|
32916 | } else if (type === 'LineString') {
|
32917 | clipLine(geometry, newGeometry, k1, k2, axis, false, options.lineMetrics);
|
32918 |
|
32919 | } else if (type === 'MultiLineString') {
|
32920 | clipLines(geometry, newGeometry, k1, k2, axis, false);
|
32921 |
|
32922 | } else if (type === 'Polygon') {
|
32923 | clipLines(geometry, newGeometry, k1, k2, axis, true);
|
32924 |
|
32925 | } else if (type === 'MultiPolygon') {
|
32926 | for (var j = 0; j < geometry.length; j++) {
|
32927 | var polygon = [];
|
32928 | clipLines(geometry[j], polygon, k1, k2, axis, true);
|
32929 | if (polygon.length) {
|
32930 | newGeometry.push(polygon);
|
32931 | }
|
32932 | }
|
32933 | }
|
32934 |
|
32935 | if (newGeometry.length) {
|
32936 | if (options.lineMetrics && type === 'LineString') {
|
32937 | for (j = 0; j < newGeometry.length; j++) {
|
32938 | clipped.push(createFeature(feature.id, type, newGeometry[j], feature.tags));
|
32939 | }
|
32940 | continue;
|
32941 | }
|
32942 |
|
32943 | if (type === 'LineString' || type === 'MultiLineString') {
|
32944 | if (newGeometry.length === 1) {
|
32945 | type = 'LineString';
|
32946 | newGeometry = newGeometry[0];
|
32947 | } else {
|
32948 | type = 'MultiLineString';
|
32949 | }
|
32950 | }
|
32951 | if (type === 'Point' || type === 'MultiPoint') {
|
32952 | type = newGeometry.length === 3 ? 'Point' : 'MultiPoint';
|
32953 | }
|
32954 |
|
32955 | clipped.push(createFeature(feature.id, type, newGeometry, feature.tags));
|
32956 | }
|
32957 | }
|
32958 |
|
32959 | return clipped.length ? clipped : null;
|
32960 | }
|
32961 |
|
32962 | function clipPoints(geom, newGeom, k1, k2, axis) {
|
32963 | for (var i = 0; i < geom.length; i += 3) {
|
32964 | var a = geom[i + axis];
|
32965 |
|
32966 | if (a >= k1 && a <= k2) {
|
32967 | newGeom.push(geom[i]);
|
32968 | newGeom.push(geom[i + 1]);
|
32969 | newGeom.push(geom[i + 2]);
|
32970 | }
|
32971 | }
|
32972 | }
|
32973 |
|
32974 | function clipLine(geom, newGeom, k1, k2, axis, isPolygon, trackMetrics) {
|
32975 |
|
32976 | var slice = newSlice(geom);
|
32977 | var intersect = axis === 0 ? intersectX : intersectY;
|
32978 | var len = geom.start;
|
32979 | var segLen, t;
|
32980 |
|
32981 | for (var i = 0; i < geom.length - 3; i += 3) {
|
32982 | var ax = geom[i];
|
32983 | var ay = geom[i + 1];
|
32984 | var az = geom[i + 2];
|
32985 | var bx = geom[i + 3];
|
32986 | var by = geom[i + 4];
|
32987 | var a = axis === 0 ? ax : ay;
|
32988 | var b = axis === 0 ? bx : by;
|
32989 | var exited = false;
|
32990 |
|
32991 | if (trackMetrics) segLen = Math.sqrt(Math.pow(ax - bx, 2) + Math.pow(ay - by, 2));
|
32992 |
|
32993 | if (a < k1) {
|
32994 | // ---|--> | (line enters the clip region from the left)
|
32995 | if (b > k1) {
|
32996 | t = intersect(slice, ax, ay, bx, by, k1);
|
32997 | if (trackMetrics) slice.start = len + segLen * t;
|
32998 | }
|
32999 | } else if (a > k2) {
|
33000 | // | <--|--- (line enters the clip region from the right)
|
33001 | if (b < k2) {
|
33002 | t = intersect(slice, ax, ay, bx, by, k2);
|
33003 | if (trackMetrics) slice.start = len + segLen * t;
|
33004 | }
|
33005 | } else {
|
33006 | addPoint(slice, ax, ay, az);
|
33007 | }
|
33008 | if (b < k1 && a >= k1) {
|
33009 | // <--|--- | or <--|-----|--- (line exits the clip region on the left)
|
33010 | t = intersect(slice, ax, ay, bx, by, k1);
|
33011 | exited = true;
|
33012 | }
|
33013 | if (b > k2 && a <= k2) {
|
33014 | // | ---|--> or ---|-----|--> (line exits the clip region on the right)
|
33015 | t = intersect(slice, ax, ay, bx, by, k2);
|
33016 | exited = true;
|
33017 | }
|
33018 |
|
33019 | if (!isPolygon && exited) {
|
33020 | if (trackMetrics) slice.end = len + segLen * t;
|
33021 | newGeom.push(slice);
|
33022 | slice = newSlice(geom);
|
33023 | }
|
33024 |
|
33025 | if (trackMetrics) len += segLen;
|
33026 | }
|
33027 |
|
33028 | // add the last point
|
33029 | var last = geom.length - 3;
|
33030 | ax = geom[last];
|
33031 | ay = geom[last + 1];
|
33032 | az = geom[last + 2];
|
33033 | a = axis === 0 ? ax : ay;
|
33034 | if (a >= k1 && a <= k2) addPoint(slice, ax, ay, az);
|
33035 |
|
33036 | // close the polygon if its endpoints are not the same after clipping
|
33037 | last = slice.length - 3;
|
33038 | if (isPolygon && last >= 3 && (slice[last] !== slice[0] || slice[last + 1] !== slice[1])) {
|
33039 | addPoint(slice, slice[0], slice[1], slice[2]);
|
33040 | }
|
33041 |
|
33042 | // add the final slice
|
33043 | if (slice.length) {
|
33044 | newGeom.push(slice);
|
33045 | }
|
33046 | }
|
33047 |
|
33048 | function newSlice(line) {
|
33049 | var slice = [];
|
33050 | slice.size = line.size;
|
33051 | slice.start = line.start;
|
33052 | slice.end = line.end;
|
33053 | return slice;
|
33054 | }
|
33055 |
|
33056 | function clipLines(geom, newGeom, k1, k2, axis, isPolygon) {
|
33057 | for (var i = 0; i < geom.length; i++) {
|
33058 | clipLine(geom[i], newGeom, k1, k2, axis, isPolygon, false);
|
33059 | }
|
33060 | }
|
33061 |
|
33062 | function addPoint(out, x, y, z) {
|
33063 | out.push(x);
|
33064 | out.push(y);
|
33065 | out.push(z);
|
33066 | }
|
33067 |
|
33068 | function intersectX(out, ax, ay, bx, by, x) {
|
33069 | var t = (x - ax) / (bx - ax);
|
33070 | out.push(x);
|
33071 | out.push(ay + (by - ay) * t);
|
33072 | out.push(1);
|
33073 | return t;
|
33074 | }
|
33075 |
|
33076 | function intersectY(out, ax, ay, bx, by, y) {
|
33077 | var t = (y - ay) / (by - ay);
|
33078 | out.push(ax + (bx - ax) * t);
|
33079 | out.push(y);
|
33080 | out.push(1);
|
33081 | return t;
|
33082 | }
|
33083 |
|
33084 | function wrap(features, options) {
|
33085 | var buffer = options.buffer / options.extent;
|
33086 | var merged = features;
|
33087 | var left = clip(features, 1, -1 - buffer, buffer, 0, -1, 2, options); // left world copy
|
33088 | var right = clip(features, 1, 1 - buffer, 2 + buffer, 0, -1, 2, options); // right world copy
|
33089 |
|
33090 | if (left || right) {
|
33091 | merged = clip(features, 1, -buffer, 1 + buffer, 0, -1, 2, options) || []; // center world copy
|
33092 |
|
33093 | if (left) merged = shiftFeatureCoords(left, 1).concat(merged); // merge left into center
|
33094 | if (right) merged = merged.concat(shiftFeatureCoords(right, -1)); // merge right into center
|
33095 | }
|
33096 |
|
33097 | return merged;
|
33098 | }
|
33099 |
|
33100 | function shiftFeatureCoords(features, offset) {
|
33101 | var newFeatures = [];
|
33102 |
|
33103 | for (var i = 0; i < features.length; i++) {
|
33104 | var feature = features[i],
|
33105 | type = feature.type;
|
33106 |
|
33107 | var newGeometry;
|
33108 |
|
33109 | if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') {
|
33110 | newGeometry = shiftCoords(feature.geometry, offset);
|
33111 |
|
33112 | } else if (type === 'MultiLineString' || type === 'Polygon') {
|
33113 | newGeometry = [];
|
33114 | for (var j = 0; j < feature.geometry.length; j++) {
|
33115 | newGeometry.push(shiftCoords(feature.geometry[j], offset));
|
33116 | }
|
33117 | } else if (type === 'MultiPolygon') {
|
33118 | newGeometry = [];
|
33119 | for (j = 0; j < feature.geometry.length; j++) {
|
33120 | var newPolygon = [];
|
33121 | for (var k = 0; k < feature.geometry[j].length; k++) {
|
33122 | newPolygon.push(shiftCoords(feature.geometry[j][k], offset));
|
33123 | }
|
33124 | newGeometry.push(newPolygon);
|
33125 | }
|
33126 | }
|
33127 |
|
33128 | newFeatures.push(createFeature(feature.id, type, newGeometry, feature.tags));
|
33129 | }
|
33130 |
|
33131 | return newFeatures;
|
33132 | }
|
33133 |
|
33134 | function shiftCoords(points, offset) {
|
33135 | var newPoints = [];
|
33136 | newPoints.size = points.size;
|
33137 |
|
33138 | if (points.start !== undefined) {
|
33139 | newPoints.start = points.start;
|
33140 | newPoints.end = points.end;
|
33141 | }
|
33142 |
|
33143 | for (var i = 0; i < points.length; i += 3) {
|
33144 | newPoints.push(points[i] + offset, points[i + 1], points[i + 2]);
|
33145 | }
|
33146 | return newPoints;
|
33147 | }
|
33148 |
|
33149 | // Transforms the coordinates of each feature in the given tile from
|
33150 | // mercator-projected space into (extent x extent) tile space.
|
33151 | function transformTile(tile, extent) {
|
33152 | if (tile.transformed) return tile;
|
33153 |
|
33154 | var z2 = 1 << tile.z,
|
33155 | tx = tile.x,
|
33156 | ty = tile.y,
|
33157 | i, j, k;
|
33158 |
|
33159 | for (i = 0; i < tile.features.length; i++) {
|
33160 | var feature = tile.features[i],
|
33161 | geom = feature.geometry,
|
33162 | type = feature.type;
|
33163 |
|
33164 | feature.geometry = [];
|
33165 |
|
33166 | if (type === 1) {
|
33167 | for (j = 0; j < geom.length; j += 2) {
|
33168 | feature.geometry.push(transformPoint(geom[j], geom[j + 1], extent, z2, tx, ty));
|
33169 | }
|
33170 | } else {
|
33171 | for (j = 0; j < geom.length; j++) {
|
33172 | var ring = [];
|
33173 | for (k = 0; k < geom[j].length; k += 2) {
|
33174 | ring.push(transformPoint(geom[j][k], geom[j][k + 1], extent, z2, tx, ty));
|
33175 | }
|
33176 | feature.geometry.push(ring);
|
33177 | }
|
33178 | }
|
33179 | }
|
33180 |
|
33181 | tile.transformed = true;
|
33182 |
|
33183 | return tile;
|
33184 | }
|
33185 |
|
33186 | function transformPoint(x, y, extent, z2, tx, ty) {
|
33187 | return [
|
33188 | Math.round(extent * (x * z2 - tx)),
|
33189 | Math.round(extent * (y * z2 - ty))];
|
33190 | }
|
33191 |
|
33192 | function createTile(features, z, tx, ty, options) {
|
33193 | var tolerance = z === options.maxZoom ? 0 : options.tolerance / ((1 << z) * options.extent);
|
33194 | var tile = {
|
33195 | features: [],
|
33196 | numPoints: 0,
|
33197 | numSimplified: 0,
|
33198 | numFeatures: 0,
|
33199 | source: null,
|
33200 | x: tx,
|
33201 | y: ty,
|
33202 | z: z,
|
33203 | transformed: false,
|
33204 | minX: 2,
|
33205 | minY: 1,
|
33206 | maxX: -1,
|
33207 | maxY: 0
|
33208 | };
|
33209 | for (var i = 0; i < features.length; i++) {
|
33210 | tile.numFeatures++;
|
33211 | addFeature(tile, features[i], tolerance, options);
|
33212 |
|
33213 | var minX = features[i].minX;
|
33214 | var minY = features[i].minY;
|
33215 | var maxX = features[i].maxX;
|
33216 | var maxY = features[i].maxY;
|
33217 |
|
33218 | if (minX < tile.minX) tile.minX = minX;
|
33219 | if (minY < tile.minY) tile.minY = minY;
|
33220 | if (maxX > tile.maxX) tile.maxX = maxX;
|
33221 | if (maxY > tile.maxY) tile.maxY = maxY;
|
33222 | }
|
33223 | return tile;
|
33224 | }
|
33225 |
|
33226 | function addFeature(tile, feature, tolerance, options) {
|
33227 |
|
33228 | var geom = feature.geometry,
|
33229 | type = feature.type,
|
33230 | simplified = [];
|
33231 |
|
33232 | if (type === 'Point' || type === 'MultiPoint') {
|
33233 | for (var i = 0; i < geom.length; i += 3) {
|
33234 | simplified.push(geom[i]);
|
33235 | simplified.push(geom[i + 1]);
|
33236 | tile.numPoints++;
|
33237 | tile.numSimplified++;
|
33238 | }
|
33239 |
|
33240 | } else if (type === 'LineString') {
|
33241 | addLine(simplified, geom, tile, tolerance, false, false);
|
33242 |
|
33243 | } else if (type === 'MultiLineString' || type === 'Polygon') {
|
33244 | for (i = 0; i < geom.length; i++) {
|
33245 | addLine(simplified, geom[i], tile, tolerance, type === 'Polygon', i === 0);
|
33246 | }
|
33247 |
|
33248 | } else if (type === 'MultiPolygon') {
|
33249 |
|
33250 | for (var k = 0; k < geom.length; k++) {
|
33251 | var polygon = geom[k];
|
33252 | for (i = 0; i < polygon.length; i++) {
|
33253 | addLine(simplified, polygon[i], tile, tolerance, true, i === 0);
|
33254 | }
|
33255 | }
|
33256 | }
|
33257 |
|
33258 | if (simplified.length) {
|
33259 | var tags = feature.tags || null;
|
33260 | if (type === 'LineString' && options.lineMetrics) {
|
33261 | tags = {};
|
33262 | for (var key in feature.tags) tags[key] = feature.tags[key];
|
33263 | tags['mapbox_clip_start'] = geom.start / geom.size;
|
33264 | tags['mapbox_clip_end'] = geom.end / geom.size;
|
33265 | }
|
33266 | var tileFeature = {
|
33267 | geometry: simplified,
|
33268 | type: type === 'Polygon' || type === 'MultiPolygon' ? 3 :
|
33269 | type === 'LineString' || type === 'MultiLineString' ? 2 : 1,
|
33270 | tags: tags
|
33271 | };
|
33272 | if (feature.id !== null) {
|
33273 | tileFeature.id = feature.id;
|
33274 | }
|
33275 | tile.features.push(tileFeature);
|
33276 | }
|
33277 | }
|
33278 |
|
33279 | function addLine(result, geom, tile, tolerance, isPolygon, isOuter) {
|
33280 | var sqTolerance = tolerance * tolerance;
|
33281 |
|
33282 | if (tolerance > 0 && (geom.size < (isPolygon ? sqTolerance : tolerance))) {
|
33283 | tile.numPoints += geom.length / 3;
|
33284 | return;
|
33285 | }
|
33286 |
|
33287 | var ring = [];
|
33288 |
|
33289 | for (var i = 0; i < geom.length; i += 3) {
|
33290 | if (tolerance === 0 || geom[i + 2] > sqTolerance) {
|
33291 | tile.numSimplified++;
|
33292 | ring.push(geom[i]);
|
33293 | ring.push(geom[i + 1]);
|
33294 | }
|
33295 | tile.numPoints++;
|
33296 | }
|
33297 |
|
33298 | if (isPolygon) rewind(ring, isOuter);
|
33299 |
|
33300 | result.push(ring);
|
33301 | }
|
33302 |
|
33303 | function rewind(ring, clockwise) {
|
33304 | var area = 0;
|
33305 | for (var i = 0, len = ring.length, j = len - 2; i < len; j = i, i += 2) {
|
33306 | area += (ring[i] - ring[j]) * (ring[i + 1] + ring[j + 1]);
|
33307 | }
|
33308 | if (area > 0 === clockwise) {
|
33309 | for (i = 0, len = ring.length; i < len / 2; i += 2) {
|
33310 | var x = ring[i];
|
33311 | var y = ring[i + 1];
|
33312 | ring[i] = ring[len - 2 - i];
|
33313 | ring[i + 1] = ring[len - 1 - i];
|
33314 | ring[len - 2 - i] = x;
|
33315 | ring[len - 1 - i] = y;
|
33316 | }
|
33317 | }
|
33318 | }
|
33319 |
|
33320 | function geojsonvt(data, options) {
|
33321 | return new GeoJSONVT(data, options);
|
33322 | }
|
33323 |
|
33324 | function GeoJSONVT(data, options) {
|
33325 | options = this.options = extend(Object.create(this.options), options);
|
33326 |
|
33327 | var debug = options.debug;
|
33328 |
|
33329 | if (debug) console.time('preprocess data');
|
33330 |
|
33331 | if (options.maxZoom < 0 || options.maxZoom > 24) throw new Error('maxZoom should be in the 0-24 range');
|
33332 | if (options.promoteId && options.generateId) throw new Error('promoteId and generateId cannot be used together.');
|
33333 |
|
33334 | var features = convert(data, options);
|
33335 |
|
33336 | this.tiles = {};
|
33337 | this.tileCoords = [];
|
33338 |
|
33339 | if (debug) {
|
33340 | console.timeEnd('preprocess data');
|
33341 | console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints);
|
33342 | console.time('generate tiles');
|
33343 | this.stats = {};
|
33344 | this.total = 0;
|
33345 | }
|
33346 |
|
33347 | features = wrap(features, options);
|
33348 |
|
33349 | // start slicing from the top tile down
|
33350 | if (features.length) this.splitTile(features, 0, 0, 0);
|
33351 |
|
33352 | if (debug) {
|
33353 | if (features.length) console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints);
|
33354 | console.timeEnd('generate tiles');
|
33355 | console.log('tiles generated:', this.total, JSON.stringify(this.stats));
|
33356 | }
|
33357 | }
|
33358 |
|
33359 | GeoJSONVT.prototype.options = {
|
33360 | maxZoom: 14, // max zoom to preserve detail on
|
33361 | indexMaxZoom: 5, // max zoom in the tile index
|
33362 | indexMaxPoints: 100000, // max number of points per tile in the tile index
|
33363 | tolerance: 3, // simplification tolerance (higher means simpler)
|
33364 | extent: 4096, // tile extent
|
33365 | buffer: 64, // tile buffer on each side
|
33366 | lineMetrics: false, // whether to calculate line metrics
|
33367 | promoteId: null, // name of a feature property to be promoted to feature.id
|
33368 | generateId: false, // whether to generate feature ids. Cannot be used with promoteId
|
33369 | debug: 0 // logging level (0, 1 or 2)
|
33370 | };
|
33371 |
|
33372 | GeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) {
|
33373 |
|
33374 | var stack = [features, z, x, y],
|
33375 | options = this.options,
|
33376 | debug = options.debug;
|
33377 |
|
33378 | // avoid recursion by using a processing queue
|
33379 | while (stack.length) {
|
33380 | y = stack.pop();
|
33381 | x = stack.pop();
|
33382 | z = stack.pop();
|
33383 | features = stack.pop();
|
33384 |
|
33385 | var z2 = 1 << z,
|
33386 | id = toID(z, x, y),
|
33387 | tile = this.tiles[id];
|
33388 |
|
33389 | if (!tile) {
|
33390 | if (debug > 1) console.time('creation');
|
33391 |
|
33392 | tile = this.tiles[id] = createTile(features, z, x, y, options);
|
33393 | this.tileCoords.push({z: z, x: x, y: y});
|
33394 |
|
33395 | if (debug) {
|
33396 | if (debug > 1) {
|
33397 | console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)',
|
33398 | z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified);
|
33399 | console.timeEnd('creation');
|
33400 | }
|
33401 | var key = 'z' + z;
|
33402 | this.stats[key] = (this.stats[key] || 0) + 1;
|
33403 | this.total++;
|
33404 | }
|
33405 | }
|
33406 |
|
33407 | // save reference to original geometry in tile so that we can drill down later if we stop now
|
33408 | tile.source = features;
|
33409 |
|
33410 | // if it's the first-pass tiling
|
33411 | if (!cz) {
|
33412 | // stop tiling if we reached max zoom, or if the tile is too simple
|
33413 | if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) continue;
|
33414 |
|
33415 | // if a drilldown to a specific tile
|
33416 | } else {
|
33417 | // stop tiling if we reached base zoom or our target tile zoom
|
33418 | if (z === options.maxZoom || z === cz) continue;
|
33419 |
|
33420 | // stop tiling if it's not an ancestor of the target tile
|
33421 | var m = 1 << (cz - z);
|
33422 | if (x !== Math.floor(cx / m) || y !== Math.floor(cy / m)) continue;
|
33423 | }
|
33424 |
|
33425 | // if we slice further down, no need to keep source geometry
|
33426 | tile.source = null;
|
33427 |
|
33428 | if (features.length === 0) continue;
|
33429 |
|
33430 | if (debug > 1) console.time('clipping');
|
33431 |
|
33432 | // values we'll use for clipping
|
33433 | var k1 = 0.5 * options.buffer / options.extent,
|
33434 | k2 = 0.5 - k1,
|
33435 | k3 = 0.5 + k1,
|
33436 | k4 = 1 + k1,
|
33437 | tl, bl, tr, br, left, right;
|
33438 |
|
33439 | tl = bl = tr = br = null;
|
33440 |
|
33441 | left = clip(features, z2, x - k1, x + k3, 0, tile.minX, tile.maxX, options);
|
33442 | right = clip(features, z2, x + k2, x + k4, 0, tile.minX, tile.maxX, options);
|
33443 | features = null;
|
33444 |
|
33445 | if (left) {
|
33446 | tl = clip(left, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options);
|
33447 | bl = clip(left, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options);
|
33448 | left = null;
|
33449 | }
|
33450 |
|
33451 | if (right) {
|
33452 | tr = clip(right, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options);
|
33453 | br = clip(right, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options);
|
33454 | right = null;
|
33455 | }
|
33456 |
|
33457 | if (debug > 1) console.timeEnd('clipping');
|
33458 |
|
33459 | stack.push(tl || [], z + 1, x * 2, y * 2);
|
33460 | stack.push(bl || [], z + 1, x * 2, y * 2 + 1);
|
33461 | stack.push(tr || [], z + 1, x * 2 + 1, y * 2);
|
33462 | stack.push(br || [], z + 1, x * 2 + 1, y * 2 + 1);
|
33463 | }
|
33464 | };
|
33465 |
|
33466 | GeoJSONVT.prototype.getTile = function (z, x, y) {
|
33467 | var options = this.options,
|
33468 | extent = options.extent,
|
33469 | debug = options.debug;
|
33470 |
|
33471 | if (z < 0 || z > 24) return null;
|
33472 |
|
33473 | var z2 = 1 << z;
|
33474 | x = ((x % z2) + z2) % z2; // wrap tile x coordinate
|
33475 |
|
33476 | var id = toID(z, x, y);
|
33477 | if (this.tiles[id]) return transformTile(this.tiles[id], extent);
|
33478 |
|
33479 | if (debug > 1) console.log('drilling down to z%d-%d-%d', z, x, y);
|
33480 |
|
33481 | var z0 = z,
|
33482 | x0 = x,
|
33483 | y0 = y,
|
33484 | parent;
|
33485 |
|
33486 | while (!parent && z0 > 0) {
|
33487 | z0--;
|
33488 | x0 = Math.floor(x0 / 2);
|
33489 | y0 = Math.floor(y0 / 2);
|
33490 | parent = this.tiles[toID(z0, x0, y0)];
|
33491 | }
|
33492 |
|
33493 | if (!parent || !parent.source) return null;
|
33494 |
|
33495 | // if we found a parent tile containing the original geometry, we can drill down from it
|
33496 | if (debug > 1) console.log('found parent tile z%d-%d-%d', z0, x0, y0);
|
33497 |
|
33498 | if (debug > 1) console.time('drilling down');
|
33499 | this.splitTile(parent.source, z0, x0, y0, z, x, y);
|
33500 | if (debug > 1) console.timeEnd('drilling down');
|
33501 |
|
33502 | return this.tiles[id] ? transformTile(this.tiles[id], extent) : null;
|
33503 | };
|
33504 |
|
33505 | function toID(z, x, y) {
|
33506 | return (((1 << z) * y + x) * 32) + z;
|
33507 | }
|
33508 |
|
33509 | function extend(dest, src) {
|
33510 | for (var i in src) dest[i] = src[i];
|
33511 | return dest;
|
33512 | }
|
33513 |
|
33514 | function loadGeoJSONTile(params, callback) {
|
33515 | const canonical = params.tileID.canonical;
|
33516 | if (!this._geoJSONIndex) {
|
33517 | return callback(null, null); // we couldn't load the file
|
33518 | }
|
33519 | const geoJSONTile = this._geoJSONIndex.getTile(canonical.z, canonical.x, canonical.y);
|
33520 | if (!geoJSONTile) {
|
33521 | return callback(null, null); // nothing in the given tile
|
33522 | }
|
33523 | const geojsonWrapper = new GeoJSONWrapper$2(geoJSONTile.features);
|
33524 | // Encode the geojson-vt tile into binary vector tile form. This
|
33525 | // is a convenience that allows `FeatureIndex` to operate the same way
|
33526 | // across `VectorTileSource` and `GeoJSONSource` data.
|
33527 | let pbf = vtpbf(geojsonWrapper);
|
33528 | if (pbf.byteOffset !== 0 || pbf.byteLength !== pbf.buffer.byteLength) {
|
33529 | // Compatibility with node Buffer (https://github.com/mapbox/pbf/issues/35)
|
33530 | pbf = new Uint8Array(pbf);
|
33531 | }
|
33532 | callback(null, {
|
33533 | vectorTile: geojsonWrapper,
|
33534 | rawData: pbf.buffer
|
33535 | });
|
33536 | }
|
33537 | /**
|
33538 | * The {@link WorkerSource} implementation that supports {@link GeoJSONSource}.
|
33539 | * This class is designed to be easily reused to support custom source types
|
33540 | * for data formats that can be parsed/converted into an in-memory GeoJSON
|
33541 | * representation. To do so, create it with
|
33542 | * `new GeoJSONWorkerSource(actor, layerIndex, customLoadGeoJSONFunction)`.
|
33543 | * For a full example, see [mapbox-gl-topojson](https://github.com/developmentseed/mapbox-gl-topojson).
|
33544 | *
|
33545 | * @private
|
33546 | */
|
33547 | class GeoJSONWorkerSource extends VectorTileWorkerSource {
|
33548 | /**
|
33549 | * @param [loadGeoJSON] Optional method for custom loading/parsing of
|
33550 | * GeoJSON based on parameters passed from the main-thread Source.
|
33551 | * See {@link GeoJSONWorkerSource#loadGeoJSON}.
|
33552 | * @private
|
33553 | */
|
33554 | constructor(actor, layerIndex, availableImages, loadGeoJSON) {
|
33555 | super(actor, layerIndex, availableImages, loadGeoJSONTile);
|
33556 | if (loadGeoJSON) {
|
33557 | this.loadGeoJSON = loadGeoJSON;
|
33558 | }
|
33559 | }
|
33560 | /**
|
33561 | * Fetches (if appropriate), parses, and index geojson data into tiles. This
|
33562 | * preparatory method must be called before {@link GeoJSONWorkerSource#loadTile}
|
33563 | * can correctly serve up tiles.
|
33564 | *
|
33565 | * Defers to {@link GeoJSONWorkerSource#loadGeoJSON} for the fetching/parsing,
|
33566 | * expecting `callback(error, data)` to be called with either an error or a
|
33567 | * parsed GeoJSON object.
|
33568 | *
|
33569 | * When `loadData` requests come in faster than they can be processed,
|
33570 | * they are coalesced into a single request using the latest data.
|
33571 | * See {@link GeoJSONWorkerSource#coalesce}
|
33572 | *
|
33573 | * @param params
|
33574 | * @param callback
|
33575 | * @private
|
33576 | */
|
33577 | loadData(params, callback) {
|
33578 | if (this._pendingCallback) {
|
33579 | // Tell the foreground the previous call has been abandoned
|
33580 | this._pendingCallback(null, { abandoned: true });
|
33581 | }
|
33582 | this._pendingCallback = callback;
|
33583 | this._pendingLoadDataParams = params;
|
33584 | if (this._state &&
|
33585 | this._state !== 'Idle') {
|
33586 | this._state = 'NeedsLoadData';
|
33587 | }
|
33588 | else {
|
33589 | this._state = 'Coalescing';
|
33590 | this._loadData();
|
33591 | }
|
33592 | }
|
33593 | /**
|
33594 | * Internal implementation: called directly by `loadData`
|
33595 | * or by `coalesce` using stored parameters.
|
33596 | */
|
33597 | _loadData() {
|
33598 | if (!this._pendingCallback || !this._pendingLoadDataParams) {
|
33599 | performance.assert(false);
|
33600 | return;
|
33601 | }
|
33602 | const callback = this._pendingCallback;
|
33603 | const params = this._pendingLoadDataParams;
|
33604 | delete this._pendingCallback;
|
33605 | delete this._pendingLoadDataParams;
|
33606 | const perf = (params && params.request && params.request.collectResourceTiming) ?
|
33607 | new performance.RequestPerformance(params.request) : false;
|
33608 | this.loadGeoJSON(params, (err, data) => {
|
33609 | if (err || !data) {
|
33610 | return callback(err);
|
33611 | }
|
33612 | else if (typeof data !== 'object') {
|
33613 | return callback(new Error(`Input data given to '${params.source}' is not a valid GeoJSON object.`));
|
33614 | }
|
33615 | else {
|
33616 | geojsonRewind(data, true);
|
33617 | try {
|
33618 | if (params.filter) {
|
33619 | const compiled = performance.createExpression(params.filter, { type: 'boolean', 'property-type': 'data-driven', overridable: false, transition: false });
|
33620 | if (compiled.result === 'error')
|
33621 | throw new Error(compiled.value.map(err => `${err.key}: ${err.message}`).join(', '));
|
33622 | const features = data.features.filter(feature => compiled.value.evaluate({ zoom: 0 }, feature));
|
33623 | data = { type: 'FeatureCollection', features };
|
33624 | }
|
33625 | this._geoJSONIndex = params.cluster ?
|
33626 | new Supercluster(getSuperclusterOptions(params)).load(data.features) :
|
33627 | geojsonvt(data, params.geojsonVtOptions);
|
33628 | }
|
33629 | catch (err) {
|
33630 | return callback(err);
|
33631 | }
|
33632 | this.loaded = {};
|
33633 | const result = {};
|
33634 | if (perf) {
|
33635 | const resourceTimingData = perf.finish();
|
33636 | // it's necessary to eval the result of getEntriesByName() here via parse/stringify
|
33637 | // late evaluation in the main thread causes TypeError: illegal invocation
|
33638 | if (resourceTimingData) {
|
33639 | result.resourceTiming = {};
|
33640 | result.resourceTiming[params.source] = JSON.parse(JSON.stringify(resourceTimingData));
|
33641 | }
|
33642 | }
|
33643 | callback(null, result);
|
33644 | }
|
33645 | });
|
33646 | }
|
33647 | /**
|
33648 | * While processing `loadData`, we coalesce all further
|
33649 | * `loadData` messages into a single call to _loadData
|
33650 | * that will happen once we've finished processing the
|
33651 | * first message. {@link GeoJSONSource#_updateWorkerData}
|
33652 | * is responsible for sending us the `coalesce` message
|
33653 | * at the time it receives a response from `loadData`
|
33654 | *
|
33655 | * State: Idle
|
33656 | * ↑ |
|
33657 | * 'coalesce' 'loadData'
|
33658 | * | (triggers load)
|
33659 | * | ↓
|
33660 | * State: Coalescing
|
33661 | * ↑ |
|
33662 | * (triggers load) |
|
33663 | * 'coalesce' 'loadData'
|
33664 | * | ↓
|
33665 | * State: NeedsLoadData
|
33666 | */
|
33667 | coalesce() {
|
33668 | if (this._state === 'Coalescing') {
|
33669 | this._state = 'Idle';
|
33670 | }
|
33671 | else if (this._state === 'NeedsLoadData') {
|
33672 | this._state = 'Coalescing';
|
33673 | this._loadData();
|
33674 | }
|
33675 | }
|
33676 | /**
|
33677 | * Implements {@link WorkerSource#reloadTile}.
|
33678 | *
|
33679 | * If the tile is loaded, uses the implementation in VectorTileWorkerSource.
|
33680 | * Otherwise, such as after a setData() call, we load the tile fresh.
|
33681 | *
|
33682 | * @param params
|
33683 | * @param params.uid The UID for this tile.
|
33684 | * @private
|
33685 | */
|
33686 | reloadTile(params, callback) {
|
33687 | const loaded = this.loaded, uid = params.uid;
|
33688 | if (loaded && loaded[uid]) {
|
33689 | return super.reloadTile(params, callback);
|
33690 | }
|
33691 | else {
|
33692 | return this.loadTile(params, callback);
|
33693 | }
|
33694 | }
|
33695 | /**
|
33696 | * Fetch and parse GeoJSON according to the given params. Calls `callback`
|
33697 | * with `(err, data)`, where `data` is a parsed GeoJSON object.
|
33698 | *
|
33699 | * GeoJSON is loaded and parsed from `params.url` if it exists, or else
|
33700 | * expected as a literal (string or object) `params.data`.
|
33701 | *
|
33702 | * @param params
|
33703 | * @param [params.url] A URL to the remote GeoJSON data.
|
33704 | * @param [params.data] Literal GeoJSON data. Must be provided if `params.url` is not.
|
33705 | * @private
|
33706 | */
|
33707 | loadGeoJSON(params, callback) {
|
33708 | // Because of same origin issues, urls must either include an explicit
|
33709 | // origin or absolute path.
|
33710 | // ie: /foo/bar.json or http://example.com/bar.json
|
33711 | // but not ../foo/bar.json
|
33712 | if (params.request) {
|
33713 | performance.getJSON(params.request, callback);
|
33714 | }
|
33715 | else if (typeof params.data === 'string') {
|
33716 | try {
|
33717 | return callback(null, JSON.parse(params.data));
|
33718 | }
|
33719 | catch (e) {
|
33720 | return callback(new Error(`Input data given to '${params.source}' is not a valid GeoJSON object.`));
|
33721 | }
|
33722 | }
|
33723 | else {
|
33724 | return callback(new Error(`Input data given to '${params.source}' is not a valid GeoJSON object.`));
|
33725 | }
|
33726 | }
|
33727 | removeSource(params, callback) {
|
33728 | if (this._pendingCallback) {
|
33729 | // Don't leak callbacks
|
33730 | this._pendingCallback(null, { abandoned: true });
|
33731 | }
|
33732 | callback();
|
33733 | }
|
33734 | getClusterExpansionZoom(params, callback) {
|
33735 | try {
|
33736 | callback(null, this._geoJSONIndex.getClusterExpansionZoom(params.clusterId));
|
33737 | }
|
33738 | catch (e) {
|
33739 | callback(e);
|
33740 | }
|
33741 | }
|
33742 | getClusterChildren(params, callback) {
|
33743 | try {
|
33744 | callback(null, this._geoJSONIndex.getChildren(params.clusterId));
|
33745 | }
|
33746 | catch (e) {
|
33747 | callback(e);
|
33748 | }
|
33749 | }
|
33750 | getClusterLeaves(params, callback) {
|
33751 | try {
|
33752 | callback(null, this._geoJSONIndex.getLeaves(params.clusterId, params.limit, params.offset));
|
33753 | }
|
33754 | catch (e) {
|
33755 | callback(e);
|
33756 | }
|
33757 | }
|
33758 | }
|
33759 | function getSuperclusterOptions({ superclusterOptions, clusterProperties }) {
|
33760 | if (!clusterProperties || !superclusterOptions)
|
33761 | return superclusterOptions;
|
33762 | const mapExpressions = {};
|
33763 | const reduceExpressions = {};
|
33764 | const globals = { accumulated: null, zoom: 0 };
|
33765 | const feature = { properties: null };
|
33766 | const propertyNames = Object.keys(clusterProperties);
|
33767 | for (const key of propertyNames) {
|
33768 | const [operator, mapExpression] = clusterProperties[key];
|
33769 | const mapExpressionParsed = performance.createExpression(mapExpression);
|
33770 | const reduceExpressionParsed = performance.createExpression(typeof operator === 'string' ? [operator, ['accumulated'], ['get', key]] : operator);
|
33771 | performance.assert(mapExpressionParsed.result === 'success');
|
33772 | performance.assert(reduceExpressionParsed.result === 'success');
|
33773 | mapExpressions[key] = mapExpressionParsed.value;
|
33774 | reduceExpressions[key] = reduceExpressionParsed.value;
|
33775 | }
|
33776 | superclusterOptions.map = (pointProperties) => {
|
33777 | feature.properties = pointProperties;
|
33778 | const properties = {};
|
33779 | for (const key of propertyNames) {
|
33780 | properties[key] = mapExpressions[key].evaluate(globals, feature);
|
33781 | }
|
33782 | return properties;
|
33783 | };
|
33784 | superclusterOptions.reduce = (accumulated, clusterProperties) => {
|
33785 | feature.properties = clusterProperties;
|
33786 | for (const key of propertyNames) {
|
33787 | globals.accumulated = accumulated[key];
|
33788 | accumulated[key] = reduceExpressions[key].evaluate(globals, feature);
|
33789 | }
|
33790 | };
|
33791 | return superclusterOptions;
|
33792 | }
|
33793 |
|
33794 | /**
|
33795 | * @private
|
33796 | */
|
33797 | class Worker {
|
33798 | constructor(self) {
|
33799 | this.self = self;
|
33800 | this.actor = new performance.Actor(self, this);
|
33801 | this.layerIndexes = {};
|
33802 | this.availableImages = {};
|
33803 | this.workerSourceTypes = {
|
33804 | vector: VectorTileWorkerSource,
|
33805 | geojson: GeoJSONWorkerSource
|
33806 | };
|
33807 | // [mapId][sourceType][sourceName] => worker source instance
|
33808 | this.workerSources = {};
|
33809 | this.demWorkerSources = {};
|
33810 | this.self.registerWorkerSource = (name, WorkerSource) => {
|
33811 | if (this.workerSourceTypes[name]) {
|
33812 | throw new Error(`Worker source with name "${name}" already registered.`);
|
33813 | }
|
33814 | this.workerSourceTypes[name] = WorkerSource;
|
33815 | };
|
33816 | // This is invoked by the RTL text plugin when the download via the `importScripts` call has finished, and the code has been parsed.
|
33817 | this.self.registerRTLTextPlugin = (rtlTextPlugin) => {
|
33818 | if (performance.plugin.isParsed()) {
|
33819 | throw new Error('RTL text plugin already registered.');
|
33820 | }
|
33821 | performance.plugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping;
|
33822 | performance.plugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText;
|
33823 | performance.plugin['processStyledBidirectionalText'] = rtlTextPlugin.processStyledBidirectionalText;
|
33824 | };
|
33825 | }
|
33826 | setReferrer(mapID, referrer) {
|
33827 | this.referrer = referrer;
|
33828 | }
|
33829 | setImages(mapId, images, callback) {
|
33830 | this.availableImages[mapId] = images;
|
33831 | for (const workerSource in this.workerSources[mapId]) {
|
33832 | const ws = this.workerSources[mapId][workerSource];
|
33833 | for (const source in ws) {
|
33834 | ws[source].availableImages = images;
|
33835 | }
|
33836 | }
|
33837 | callback();
|
33838 | }
|
33839 | setLayers(mapId, layers, callback) {
|
33840 | this.getLayerIndex(mapId).replace(layers);
|
33841 | callback();
|
33842 | }
|
33843 | updateLayers(mapId, params, callback) {
|
33844 | this.getLayerIndex(mapId).update(params.layers, params.removedIds);
|
33845 | callback();
|
33846 | }
|
33847 | loadTile(mapId, params, callback) {
|
33848 | performance.assert(params.type);
|
33849 | this.getWorkerSource(mapId, params.type, params.source).loadTile(params, callback);
|
33850 | }
|
33851 | loadDEMTile(mapId, params, callback) {
|
33852 | this.getDEMWorkerSource(mapId, params.source).loadTile(params, callback);
|
33853 | }
|
33854 | reloadTile(mapId, params, callback) {
|
33855 | performance.assert(params.type);
|
33856 | this.getWorkerSource(mapId, params.type, params.source).reloadTile(params, callback);
|
33857 | }
|
33858 | abortTile(mapId, params, callback) {
|
33859 | performance.assert(params.type);
|
33860 | this.getWorkerSource(mapId, params.type, params.source).abortTile(params, callback);
|
33861 | }
|
33862 | removeTile(mapId, params, callback) {
|
33863 | performance.assert(params.type);
|
33864 | this.getWorkerSource(mapId, params.type, params.source).removeTile(params, callback);
|
33865 | }
|
33866 | removeDEMTile(mapId, params) {
|
33867 | this.getDEMWorkerSource(mapId, params.source).removeTile(params);
|
33868 | }
|
33869 | removeSource(mapId, params, callback) {
|
33870 | performance.assert(params.type);
|
33871 | performance.assert(params.source);
|
33872 | if (!this.workerSources[mapId] ||
|
33873 | !this.workerSources[mapId][params.type] ||
|
33874 | !this.workerSources[mapId][params.type][params.source]) {
|
33875 | return;
|
33876 | }
|
33877 | const worker = this.workerSources[mapId][params.type][params.source];
|
33878 | delete this.workerSources[mapId][params.type][params.source];
|
33879 | if (worker.removeSource !== undefined) {
|
33880 | worker.removeSource(params, callback);
|
33881 | }
|
33882 | else {
|
33883 | callback();
|
33884 | }
|
33885 | }
|
33886 | /**
|
33887 | * Load a {@link WorkerSource} script at params.url. The script is run
|
33888 | * (using importScripts) with `registerWorkerSource` in scope, which is a
|
33889 | * function taking `(name, workerSourceObject)`.
|
33890 | * @private
|
33891 | */
|
33892 | loadWorkerSource(map, params, callback) {
|
33893 | try {
|
33894 | this.self.importScripts(params.url);
|
33895 | callback();
|
33896 | }
|
33897 | catch (e) {
|
33898 | callback(e.toString());
|
33899 | }
|
33900 | }
|
33901 | syncRTLPluginState(map, state, callback) {
|
33902 | try {
|
33903 | performance.plugin.setState(state);
|
33904 | const pluginURL = performance.plugin.getPluginURL();
|
33905 | if (performance.plugin.isLoaded() &&
|
33906 | !performance.plugin.isParsed() &&
|
33907 | pluginURL != null // Not possible when `isLoaded` is true, but keeps flow happy
|
33908 | ) {
|
33909 | this.self.importScripts(pluginURL);
|
33910 | const complete = performance.plugin.isParsed();
|
33911 | const error = complete ? undefined : new Error(`RTL Text Plugin failed to import scripts from ${pluginURL}`);
|
33912 | callback(error, complete);
|
33913 | }
|
33914 | }
|
33915 | catch (e) {
|
33916 | callback(e.toString());
|
33917 | }
|
33918 | }
|
33919 | getAvailableImages(mapId) {
|
33920 | let availableImages = this.availableImages[mapId];
|
33921 | if (!availableImages) {
|
33922 | availableImages = [];
|
33923 | }
|
33924 | return availableImages;
|
33925 | }
|
33926 | getLayerIndex(mapId) {
|
33927 | let layerIndexes = this.layerIndexes[mapId];
|
33928 | if (!layerIndexes) {
|
33929 | layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex();
|
33930 | }
|
33931 | return layerIndexes;
|
33932 | }
|
33933 | getWorkerSource(mapId, type, source) {
|
33934 | if (!this.workerSources[mapId])
|
33935 | this.workerSources[mapId] = {};
|
33936 | if (!this.workerSources[mapId][type])
|
33937 | this.workerSources[mapId][type] = {};
|
33938 | if (!this.workerSources[mapId][type][source]) {
|
33939 | // use a wrapped actor so that we can attach a target mapId param
|
33940 | // to any messages invoked by the WorkerSource
|
33941 | const actor = {
|
33942 | send: (type, data, callback) => {
|
33943 | this.actor.send(type, data, callback, mapId);
|
33944 | }
|
33945 | };
|
33946 | this.workerSources[mapId][type][source] = new this.workerSourceTypes[type](actor, this.getLayerIndex(mapId), this.getAvailableImages(mapId));
|
33947 | }
|
33948 | return this.workerSources[mapId][type][source];
|
33949 | }
|
33950 | getDEMWorkerSource(mapId, source) {
|
33951 | if (!this.demWorkerSources[mapId])
|
33952 | this.demWorkerSources[mapId] = {};
|
33953 | if (!this.demWorkerSources[mapId][source]) {
|
33954 | this.demWorkerSources[mapId][source] = new RasterDEMTileWorkerSource();
|
33955 | }
|
33956 | return this.demWorkerSources[mapId][source];
|
33957 | }
|
33958 | enforceCacheSizeLimit(mapId, limit) {
|
33959 | performance.enforceCacheSizeLimit(limit);
|
33960 | }
|
33961 | }
|
33962 | /* global self, WorkerGlobalScope */
|
33963 | if (typeof WorkerGlobalScope !== 'undefined' &&
|
33964 | typeof self !== 'undefined' &&
|
33965 | self instanceof WorkerGlobalScope) {
|
33966 | self.worker = new Worker(self);
|
33967 | }
|
33968 |
|
33969 | return Worker;
|
33970 |
|
33971 | }));
|
33972 |
|
33973 | define(['./shared'], (function (performance) { 'use strict';
|
33974 |
|
33975 | var mapboxGlSupported = {};
|
33976 |
|
33977 | ;
|
33978 |
|
33979 | var supported = mapboxGlSupported.supported = isSupported;
|
33980 | var notSupportedReason_1 = mapboxGlSupported.notSupportedReason = notSupportedReason;
|
33981 |
|
33982 | /**
|
33983 | * Test whether the current browser supports Mapbox GL JS
|
33984 | * @param {Object} options
|
33985 | * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`
|
33986 | * if the performance of Mapbox GL JS would be dramatically worse than
|
33987 | * expected (i.e. a software renderer is would be used)
|
33988 | * @return {boolean}
|
33989 | */
|
33990 | function isSupported(options) {
|
33991 | return !notSupportedReason(options);
|
33992 | }
|
33993 |
|
33994 | function notSupportedReason(options) {
|
33995 | if (!isBrowser()) return 'not a browser';
|
33996 | if (!isArraySupported()) return 'insufficent Array support';
|
33997 | if (!isFunctionSupported()) return 'insufficient Function support';
|
33998 | if (!isObjectSupported()) return 'insufficient Object support';
|
33999 | if (!isJSONSupported()) return 'insufficient JSON support';
|
34000 | if (!isWorkerSupported()) return 'insufficient worker support';
|
34001 | if (!isUint8ClampedArraySupported()) return 'insufficient Uint8ClampedArray support';
|
34002 | if (!isArrayBufferSupported()) return 'insufficient ArrayBuffer support';
|
34003 | if (!isCanvasGetImageDataSupported()) return 'insufficient Canvas/getImageData support';
|
34004 | if (!isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat)) return 'insufficient WebGL support';
|
34005 | if (!isNotIE()) return 'insufficient ECMAScript 6 support';
|
34006 | }
|
34007 |
|
34008 | function isBrowser() {
|
34009 | return typeof window !== 'undefined' && typeof document !== 'undefined';
|
34010 | }
|
34011 |
|
34012 | function isArraySupported() {
|
34013 | return (
|
34014 | Array.prototype &&
|
34015 | Array.prototype.every &&
|
34016 | Array.prototype.filter &&
|
34017 | Array.prototype.forEach &&
|
34018 | Array.prototype.indexOf &&
|
34019 | Array.prototype.lastIndexOf &&
|
34020 | Array.prototype.map &&
|
34021 | Array.prototype.some &&
|
34022 | Array.prototype.reduce &&
|
34023 | Array.prototype.reduceRight &&
|
34024 | Array.isArray
|
34025 | );
|
34026 | }
|
34027 |
|
34028 | function isFunctionSupported() {
|
34029 | return Function.prototype && Function.prototype.bind;
|
34030 | }
|
34031 |
|
34032 | function isObjectSupported() {
|
34033 | return (
|
34034 | Object.keys &&
|
34035 | Object.create &&
|
34036 | Object.getPrototypeOf &&
|
34037 | Object.getOwnPropertyNames &&
|
34038 | Object.isSealed &&
|
34039 | Object.isFrozen &&
|
34040 | Object.isExtensible &&
|
34041 | Object.getOwnPropertyDescriptor &&
|
34042 | Object.defineProperty &&
|
34043 | Object.defineProperties &&
|
34044 | Object.seal &&
|
34045 | Object.freeze &&
|
34046 | Object.preventExtensions
|
34047 | );
|
34048 | }
|
34049 |
|
34050 | function isJSONSupported() {
|
34051 | return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON;
|
34052 | }
|
34053 |
|
34054 | function isWorkerSupported() {
|
34055 | if (!('Worker' in window && 'Blob' in window && 'URL' in window)) {
|
34056 | return false;
|
34057 | }
|
34058 |
|
34059 | var blob = new Blob([''], { type: 'text/javascript' });
|
34060 | var workerURL = URL.createObjectURL(blob);
|
34061 | var supported;
|
34062 | var worker;
|
34063 |
|
34064 | try {
|
34065 | worker = new Worker(workerURL);
|
34066 | supported = true;
|
34067 | } catch (e) {
|
34068 | supported = false;
|
34069 | }
|
34070 |
|
34071 | if (worker) {
|
34072 | worker.terminate();
|
34073 | }
|
34074 | URL.revokeObjectURL(workerURL);
|
34075 |
|
34076 | return supported;
|
34077 | }
|
34078 |
|
34079 | // IE11 only supports `Uint8ClampedArray` as of version
|
34080 | // [KB2929437](https://support.microsoft.com/en-us/kb/2929437)
|
34081 | function isUint8ClampedArraySupported() {
|
34082 | return 'Uint8ClampedArray' in window;
|
34083 | }
|
34084 |
|
34085 | // https://github.com/mapbox/mapbox-gl-supported/issues/19
|
34086 | function isArrayBufferSupported() {
|
34087 | return ArrayBuffer.isView;
|
34088 | }
|
34089 |
|
34090 | // Some browsers or browser extensions block access to canvas data to prevent fingerprinting.
|
34091 | // Mapbox GL uses this API to load sprites and images in general.
|
34092 | function isCanvasGetImageDataSupported() {
|
34093 | var canvas = document.createElement('canvas');
|
34094 | canvas.width = canvas.height = 1;
|
34095 | var context = canvas.getContext('2d');
|
34096 | if (!context) {
|
34097 | return false;
|
34098 | }
|
34099 | var imageData = context.getImageData(0, 0, 1, 1);
|
34100 | return imageData && imageData.width === canvas.width;
|
34101 | }
|
34102 |
|
34103 | var isWebGLSupportedCache = {};
|
34104 | function isWebGLSupportedCached(failIfMajorPerformanceCaveat) {
|
34105 |
|
34106 | if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) {
|
34107 | isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat);
|
34108 | }
|
34109 |
|
34110 | return isWebGLSupportedCache[failIfMajorPerformanceCaveat];
|
34111 | }
|
34112 |
|
34113 | isSupported.webGLContextAttributes = {
|
34114 | antialias: false,
|
34115 | alpha: true,
|
34116 | stencil: true,
|
34117 | depth: true
|
34118 | };
|
34119 |
|
34120 | function getWebGLContext(failIfMajorPerformanceCaveat) {
|
34121 | var canvas = document.createElement('canvas');
|
34122 |
|
34123 | var attributes = Object.create(isSupported.webGLContextAttributes);
|
34124 | attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;
|
34125 |
|
34126 | return (
|
34127 | canvas.getContext('webgl', attributes) ||
|
34128 | canvas.getContext('experimental-webgl', attributes)
|
34129 | );
|
34130 | }
|
34131 |
|
34132 | function isWebGLSupported(failIfMajorPerformanceCaveat) {
|
34133 | var gl = getWebGLContext(failIfMajorPerformanceCaveat);
|
34134 | if (!gl) {
|
34135 | return false;
|
34136 | }
|
34137 |
|
34138 | // Try compiling a shader and get its compile status. Some browsers like Brave block this API
|
34139 | // to prevent fingerprinting. Unfortunately, this also means that Mapbox GL won't work.
|
34140 | var shader;
|
34141 | try {
|
34142 | shader = gl.createShader(gl.VERTEX_SHADER);
|
34143 | } catch (e) {
|
34144 | // some older browsers throw an exception that `createShader` is not defined
|
34145 | // so handle this separately from the case where browsers block `createShader`
|
34146 | // for security reasons
|
34147 | return false;
|
34148 | }
|
34149 |
|
34150 | if (!shader || gl.isContextLost()) {
|
34151 | return false;
|
34152 | }
|
34153 | gl.shaderSource(shader, 'void main() {}');
|
34154 | gl.compileShader(shader);
|
34155 | return gl.getShaderParameter(shader, gl.COMPILE_STATUS) === true;
|
34156 | }
|
34157 |
|
34158 | function isNotIE() {
|
34159 | return !document.documentMode;
|
34160 | }
|
34161 |
|
34162 | class DOM {
|
34163 | static testProp(props) {
|
34164 | if (!DOM.docStyle)
|
34165 | return props[0];
|
34166 | for (let i = 0; i < props.length; i++) {
|
34167 | if (props[i] in DOM.docStyle) {
|
34168 | return props[i];
|
34169 | }
|
34170 | }
|
34171 | return props[0];
|
34172 | }
|
34173 | static create(tagName, className, container) {
|
34174 | const el = window.document.createElement(tagName);
|
34175 | if (className !== undefined)
|
34176 | el.className = className;
|
34177 | if (container)
|
34178 | container.appendChild(el);
|
34179 | return el;
|
34180 | }
|
34181 | static createNS(namespaceURI, tagName) {
|
34182 | const el = window.document.createElementNS(namespaceURI, tagName);
|
34183 | return el;
|
34184 | }
|
34185 | static disableDrag() {
|
34186 | if (DOM.docStyle && DOM.selectProp) {
|
34187 | DOM.userSelect = DOM.docStyle[DOM.selectProp];
|
34188 | DOM.docStyle[DOM.selectProp] = 'none';
|
34189 | }
|
34190 | }
|
34191 | static enableDrag() {
|
34192 | if (DOM.docStyle && DOM.selectProp) {
|
34193 | DOM.docStyle[DOM.selectProp] = DOM.userSelect;
|
34194 | }
|
34195 | }
|
34196 | static setTransform(el, value) {
|
34197 | el.style[DOM.transformProp] = value;
|
34198 | }
|
34199 | static addEventListener(target, type, callback, options = {}) {
|
34200 | if ('passive' in options) {
|
34201 | target.addEventListener(type, callback, options);
|
34202 | }
|
34203 | else {
|
34204 | target.addEventListener(type, callback, options.capture);
|
34205 | }
|
34206 | }
|
34207 | static removeEventListener(target, type, callback, options = {}) {
|
34208 | if ('passive' in options) {
|
34209 | target.removeEventListener(type, callback, options);
|
34210 | }
|
34211 | else {
|
34212 | target.removeEventListener(type, callback, options.capture);
|
34213 | }
|
34214 | }
|
34215 | // Suppress the next click, but only if it's immediate.
|
34216 | static suppressClickInternal(e) {
|
34217 | e.preventDefault();
|
34218 | e.stopPropagation();
|
34219 | window.removeEventListener('click', DOM.suppressClickInternal, true);
|
34220 | }
|
34221 | static suppressClick() {
|
34222 | window.addEventListener('click', DOM.suppressClickInternal, true);
|
34223 | window.setTimeout(() => {
|
34224 | window.removeEventListener('click', DOM.suppressClickInternal, true);
|
34225 | }, 0);
|
34226 | }
|
34227 | static mousePos(el, e) {
|
34228 | const rect = el.getBoundingClientRect();
|
34229 | return new performance.pointGeometry(e.clientX - rect.left - el.clientLeft, e.clientY - rect.top - el.clientTop);
|
34230 | }
|
34231 | static touchPos(el, touches) {
|
34232 | const rect = el.getBoundingClientRect();
|
34233 | const points = [];
|
34234 | for (let i = 0; i < touches.length; i++) {
|
34235 | points.push(new performance.pointGeometry(touches[i].clientX - rect.left - el.clientLeft, touches[i].clientY - rect.top - el.clientTop));
|
34236 | }
|
34237 | return points;
|
34238 | }
|
34239 | static mouseButton(e) {
|
34240 | performance.assert(e.type === 'mousedown' || e.type === 'mouseup');
|
34241 | return e.button;
|
34242 | }
|
34243 | static remove(node) {
|
34244 | if (node.parentNode) {
|
34245 | node.parentNode.removeChild(node);
|
34246 | }
|
34247 | }
|
34248 | }
|
34249 | DOM.docStyle = typeof window !== 'undefined' && window.document && window.document.documentElement.style;
|
34250 | DOM.selectProp = DOM.testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']);
|
34251 | DOM.transformProp = DOM.testProp(['transform', 'WebkitTransform']);
|
34252 |
|
34253 | class RequestManager {
|
34254 | constructor(transformRequestFn) {
|
34255 | this._transformRequestFn = transformRequestFn;
|
34256 | }
|
34257 | transformRequest(url, type) {
|
34258 | if (this._transformRequestFn) {
|
34259 | return this._transformRequestFn(url, type) || { url };
|
34260 | }
|
34261 | return { url };
|
34262 | }
|
34263 | normalizeSpriteURL(url, format, extension) {
|
34264 | const urlObject = parseUrl(url);
|
34265 | urlObject.path += `${format}${extension}`;
|
34266 | return formatUrl(urlObject);
|
34267 | }
|
34268 | setTransformRequest(transformRequest) {
|
34269 | this._transformRequestFn = transformRequest;
|
34270 | }
|
34271 | }
|
34272 | const urlRe = /^(\w+):\/\/([^/?]*)(\/[^?]+)?\??(.+)?/;
|
34273 | function parseUrl(url) {
|
34274 | const parts = url.match(urlRe);
|
34275 | if (!parts) {
|
34276 | throw new Error(`Unable to parse URL "${url}"`);
|
34277 | }
|
34278 | return {
|
34279 | protocol: parts[1],
|
34280 | authority: parts[2],
|
34281 | path: parts[3] || '/',
|
34282 | params: parts[4] ? parts[4].split('&') : []
|
34283 | };
|
34284 | }
|
34285 | function formatUrl(obj) {
|
34286 | const params = obj.params.length ? `?${obj.params.join('&')}` : '';
|
34287 | return `${obj.protocol}://${obj.authority}${obj.path}${params}`;
|
34288 | }
|
34289 |
|
34290 | function loadSprite (baseURL, requestManager, pixelRatio, callback) {
|
34291 | let json, image, error;
|
34292 | const format = pixelRatio > 1 ? '@2x' : '';
|
34293 | let jsonRequest = performance.getJSON(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.json'), performance.ResourceType.SpriteJSON), (err, data) => {
|
34294 | jsonRequest = null;
|
34295 | if (!error) {
|
34296 | error = err;
|
34297 | json = data;
|
34298 | maybeComplete();
|
34299 | }
|
34300 | });
|
34301 | let imageRequest = performance.getImage(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.png'), performance.ResourceType.SpriteImage), (err, img) => {
|
34302 | imageRequest = null;
|
34303 | if (!error) {
|
34304 | error = err;
|
34305 | image = img;
|
34306 | maybeComplete();
|
34307 | }
|
34308 | });
|
34309 | function maybeComplete() {
|
34310 | if (error) {
|
34311 | callback(error);
|
34312 | }
|
34313 | else if (json && image) {
|
34314 | const imageData = performance.exported.getImageData(image);
|
34315 | const result = {};
|
34316 | for (const id in json) {
|
34317 | const { width, height, x, y, sdf, pixelRatio, stretchX, stretchY, content } = json[id];
|
34318 | const data = new performance.RGBAImage({ width, height });
|
34319 | performance.RGBAImage.copy(imageData, data, { x, y }, { x: 0, y: 0 }, { width, height });
|
34320 | result[id] = { data, pixelRatio, sdf, stretchX, stretchY, content };
|
34321 | }
|
34322 | callback(null, result);
|
34323 | }
|
34324 | }
|
34325 | return {
|
34326 | cancel() {
|
34327 | if (jsonRequest) {
|
34328 | jsonRequest.cancel();
|
34329 | jsonRequest = null;
|
34330 | }
|
34331 | if (imageRequest) {
|
34332 | imageRequest.cancel();
|
34333 | imageRequest = null;
|
34334 | }
|
34335 | }
|
34336 | };
|
34337 | }
|
34338 |
|
34339 | class Texture {
|
34340 | constructor(context, image, format, options) {
|
34341 | this.context = context;
|
34342 | this.format = format;
|
34343 | this.texture = context.gl.createTexture();
|
34344 | this.update(image, options);
|
34345 | }
|
34346 | update(image, options, position) {
|
34347 | const { width, height } = image;
|
34348 | const resize = (!this.size || this.size[0] !== width || this.size[1] !== height) && !position;
|
34349 | const { context } = this;
|
34350 | const { gl } = context;
|
34351 | this.useMipmap = Boolean(options && options.useMipmap);
|
34352 | gl.bindTexture(gl.TEXTURE_2D, this.texture);
|
34353 | context.pixelStoreUnpackFlipY.set(false);
|
34354 | context.pixelStoreUnpack.set(1);
|
34355 | context.pixelStoreUnpackPremultiplyAlpha.set(this.format === gl.RGBA && (!options || options.premultiply !== false));
|
34356 | if (resize) {
|
34357 | this.size = [width, height];
|
34358 | if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData || performance.isImageBitmap(image)) {
|
34359 | gl.texImage2D(gl.TEXTURE_2D, 0, this.format, this.format, gl.UNSIGNED_BYTE, image);
|
34360 | }
|
34361 | else {
|
34362 | gl.texImage2D(gl.TEXTURE_2D, 0, this.format, width, height, 0, this.format, gl.UNSIGNED_BYTE, image.data);
|
34363 | }
|
34364 | }
|
34365 | else {
|
34366 | const { x, y } = position || { x: 0, y: 0 };
|
34367 | if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData || performance.isImageBitmap(image)) {
|
34368 | gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, gl.RGBA, gl.UNSIGNED_BYTE, image);
|
34369 | }
|
34370 | else {
|
34371 | gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, image.data);
|
34372 | }
|
34373 | }
|
34374 | if (this.useMipmap && this.isSizePowerOfTwo()) {
|
34375 | gl.generateMipmap(gl.TEXTURE_2D);
|
34376 | }
|
34377 | }
|
34378 | bind(filter, wrap, minFilter) {
|
34379 | const { context } = this;
|
34380 | const { gl } = context;
|
34381 | gl.bindTexture(gl.TEXTURE_2D, this.texture);
|
34382 | if (minFilter === gl.LINEAR_MIPMAP_NEAREST && !this.isSizePowerOfTwo()) {
|
34383 | minFilter = gl.LINEAR;
|
34384 | }
|
34385 | if (filter !== this.filter) {
|
34386 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);
|
34387 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter || filter);
|
34388 | this.filter = filter;
|
34389 | }
|
34390 | if (wrap !== this.wrap) {
|
34391 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap);
|
34392 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);
|
34393 | this.wrap = wrap;
|
34394 | }
|
34395 | }
|
34396 | isSizePowerOfTwo() {
|
34397 | return this.size[0] === this.size[1] && (Math.log(this.size[0]) / Math.LN2) % 1 === 0;
|
34398 | }
|
34399 | destroy() {
|
34400 | const { gl } = this.context;
|
34401 | gl.deleteTexture(this.texture);
|
34402 | this.texture = null;
|
34403 | }
|
34404 | }
|
34405 |
|
34406 | function renderStyleImage(image) {
|
34407 | const { userImage } = image;
|
34408 | if (userImage && userImage.render) {
|
34409 | const updated = userImage.render();
|
34410 | if (updated) {
|
34411 | image.data.replace(new Uint8Array(userImage.data.buffer));
|
34412 | return true;
|
34413 | }
|
34414 | }
|
34415 | return false;
|
34416 | }
|
34417 |
|
34418 | // When copied into the atlas texture, image data is padded by one pixel on each side. Icon
|
34419 | // images are padded with fully transparent pixels, while pattern images are padded with a
|
34420 | // copy of the image data wrapped from the opposite side. In both cases, this ensures the
|
34421 | // correct behavior of GL_LINEAR texture sampling mode.
|
34422 | const padding = 1;
|
34423 | /*
|
34424 | ImageManager does three things:
|
34425 |
|
34426 | 1. Tracks requests for icon images from tile workers and sends responses when the requests are fulfilled.
|
34427 | 2. Builds a texture atlas for pattern images.
|
34428 | 3. Rerenders renderable images once per frame
|
34429 |
|
34430 | These are disparate responsibilities and should eventually be handled by different classes. When we implement
|
34431 | data-driven support for `*-pattern`, we'll likely use per-bucket pattern atlases, and that would be a good time
|
34432 | to refactor this.
|
34433 | */
|
34434 | class ImageManager extends performance.Evented {
|
34435 | constructor() {
|
34436 | super();
|
34437 | this.images = {};
|
34438 | this.updatedImages = {};
|
34439 | this.callbackDispatchedThisFrame = {};
|
34440 | this.loaded = false;
|
34441 | this.requestors = [];
|
34442 | this.patterns = {};
|
34443 | this.atlasImage = new performance.RGBAImage({ width: 1, height: 1 });
|
34444 | this.dirty = true;
|
34445 | }
|
34446 | isLoaded() {
|
34447 | return this.loaded;
|
34448 | }
|
34449 | setLoaded(loaded) {
|
34450 | if (this.loaded === loaded) {
|
34451 | return;
|
34452 | }
|
34453 | this.loaded = loaded;
|
34454 | if (loaded) {
|
34455 | for (const { ids, callback } of this.requestors) {
|
34456 | this._notify(ids, callback);
|
34457 | }
|
34458 | this.requestors = [];
|
34459 | }
|
34460 | }
|
34461 | getImage(id) {
|
34462 | return this.images[id];
|
34463 | }
|
34464 | addImage(id, image) {
|
34465 | performance.assert(!this.images[id]);
|
34466 | if (this._validate(id, image)) {
|
34467 | this.images[id] = image;
|
34468 | }
|
34469 | }
|
34470 | _validate(id, image) {
|
34471 | let valid = true;
|
34472 | if (!this._validateStretch(image.stretchX, image.data && image.data.width)) {
|
34473 | this.fire(new performance.ErrorEvent(new Error(`Image "${id}" has invalid "stretchX" value`)));
|
34474 | valid = false;
|
34475 | }
|
34476 | if (!this._validateStretch(image.stretchY, image.data && image.data.height)) {
|
34477 | this.fire(new performance.ErrorEvent(new Error(`Image "${id}" has invalid "stretchY" value`)));
|
34478 | valid = false;
|
34479 | }
|
34480 | if (!this._validateContent(image.content, image)) {
|
34481 | this.fire(new performance.ErrorEvent(new Error(`Image "${id}" has invalid "content" value`)));
|
34482 | valid = false;
|
34483 | }
|
34484 | return valid;
|
34485 | }
|
34486 | _validateStretch(stretch, size) {
|
34487 | if (!stretch)
|
34488 | return true;
|
34489 | let last = 0;
|
34490 | for (const part of stretch) {
|
34491 | if (part[0] < last || part[1] < part[0] || size < part[1])
|
34492 | return false;
|
34493 | last = part[1];
|
34494 | }
|
34495 | return true;
|
34496 | }
|
34497 | _validateContent(content, image) {
|
34498 | if (!content)
|
34499 | return true;
|
34500 | if (content.length !== 4)
|
34501 | return false;
|
34502 | if (content[0] < 0 || image.data.width < content[0])
|
34503 | return false;
|
34504 | if (content[1] < 0 || image.data.height < content[1])
|
34505 | return false;
|
34506 | if (content[2] < 0 || image.data.width < content[2])
|
34507 | return false;
|
34508 | if (content[3] < 0 || image.data.height < content[3])
|
34509 | return false;
|
34510 | if (content[2] < content[0])
|
34511 | return false;
|
34512 | if (content[3] < content[1])
|
34513 | return false;
|
34514 | return true;
|
34515 | }
|
34516 | updateImage(id, image) {
|
34517 | const oldImage = this.images[id];
|
34518 | performance.assert(oldImage);
|
34519 | performance.assert(oldImage.data.width === image.data.width);
|
34520 | performance.assert(oldImage.data.height === image.data.height);
|
34521 | image.version = oldImage.version + 1;
|
34522 | this.images[id] = image;
|
34523 | this.updatedImages[id] = true;
|
34524 | }
|
34525 | removeImage(id) {
|
34526 | performance.assert(this.images[id]);
|
34527 | const image = this.images[id];
|
34528 | delete this.images[id];
|
34529 | delete this.patterns[id];
|
34530 | if (image.userImage && image.userImage.onRemove) {
|
34531 | image.userImage.onRemove();
|
34532 | }
|
34533 | }
|
34534 | listImages() {
|
34535 | return Object.keys(this.images);
|
34536 | }
|
34537 | getImages(ids, callback) {
|
34538 | // If the sprite has been loaded, or if all the icon dependencies are already present
|
34539 | // (i.e. if they've been added via runtime styling), then notify the requestor immediately.
|
34540 | // Otherwise, delay notification until the sprite is loaded. At that point, if any of the
|
34541 | // dependencies are still unavailable, we'll just assume they are permanently missing.
|
34542 | let hasAllDependencies = true;
|
34543 | if (!this.isLoaded()) {
|
34544 | for (const id of ids) {
|
34545 | if (!this.images[id]) {
|
34546 | hasAllDependencies = false;
|
34547 | }
|
34548 | }
|
34549 | }
|
34550 | if (this.isLoaded() || hasAllDependencies) {
|
34551 | this._notify(ids, callback);
|
34552 | }
|
34553 | else {
|
34554 | this.requestors.push({ ids, callback });
|
34555 | }
|
34556 | }
|
34557 | _notify(ids, callback) {
|
34558 | const response = {};
|
34559 | for (const id of ids) {
|
34560 | if (!this.images[id]) {
|
34561 | this.fire(new performance.Event('styleimagemissing', { id }));
|
34562 | }
|
34563 | const image = this.images[id];
|
34564 | if (image) {
|
34565 | // Clone the image so that our own copy of its ArrayBuffer doesn't get transferred.
|
34566 | response[id] = {
|
34567 | data: image.data.clone(),
|
34568 | pixelRatio: image.pixelRatio,
|
34569 | sdf: image.sdf,
|
34570 | version: image.version,
|
34571 | stretchX: image.stretchX,
|
34572 | stretchY: image.stretchY,
|
34573 | content: image.content,
|
34574 | hasRenderCallback: Boolean(image.userImage && image.userImage.render)
|
34575 | };
|
34576 | }
|
34577 | else {
|
34578 | performance.warnOnce(`Image "${id}" could not be loaded. Please make sure you have added the image with map.addImage() or a "sprite" property in your style. You can provide missing images by listening for the "styleimagemissing" map event.`);
|
34579 | }
|
34580 | }
|
34581 | callback(null, response);
|
34582 | }
|
34583 | // Pattern stuff
|
34584 | getPixelSize() {
|
34585 | const { width, height } = this.atlasImage;
|
34586 | return { width, height };
|
34587 | }
|
34588 | getPattern(id) {
|
34589 | const pattern = this.patterns[id];
|
34590 | const image = this.getImage(id);
|
34591 | if (!image) {
|
34592 | return null;
|
34593 | }
|
34594 | if (pattern && pattern.position.version === image.version) {
|
34595 | return pattern.position;
|
34596 | }
|
34597 | if (!pattern) {
|
34598 | const w = image.data.width + padding * 2;
|
34599 | const h = image.data.height + padding * 2;
|
34600 | const bin = { w, h, x: 0, y: 0 };
|
34601 | const position = new performance.ImagePosition(bin, image);
|
34602 | this.patterns[id] = { bin, position };
|
34603 | }
|
34604 | else {
|
34605 | pattern.position.version = image.version;
|
34606 | }
|
34607 | this._updatePatternAtlas();
|
34608 | return this.patterns[id].position;
|
34609 | }
|
34610 | bind(context) {
|
34611 | const gl = context.gl;
|
34612 | if (!this.atlasTexture) {
|
34613 | this.atlasTexture = new Texture(context, this.atlasImage, gl.RGBA);
|
34614 | }
|
34615 | else if (this.dirty) {
|
34616 | this.atlasTexture.update(this.atlasImage);
|
34617 | this.dirty = false;
|
34618 | }
|
34619 | this.atlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
|
34620 | }
|
34621 | _updatePatternAtlas() {
|
34622 | const bins = [];
|
34623 | for (const id in this.patterns) {
|
34624 | bins.push(this.patterns[id].bin);
|
34625 | }
|
34626 | const { w, h } = performance.potpack(bins);
|
34627 | const dst = this.atlasImage;
|
34628 | dst.resize({ width: w || 1, height: h || 1 });
|
34629 | for (const id in this.patterns) {
|
34630 | const { bin } = this.patterns[id];
|
34631 | const x = bin.x + padding;
|
34632 | const y = bin.y + padding;
|
34633 | const src = this.images[id].data;
|
34634 | const w = src.width;
|
34635 | const h = src.height;
|
34636 | performance.RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x, y }, { width: w, height: h });
|
34637 | // Add 1 pixel wrapped padding on each side of the image.
|
34638 | performance.RGBAImage.copy(src, dst, { x: 0, y: h - 1 }, { x, y: y - 1 }, { width: w, height: 1 }); // T
|
34639 | performance.RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x, y: y + h }, { width: w, height: 1 }); // B
|
34640 | performance.RGBAImage.copy(src, dst, { x: w - 1, y: 0 }, { x: x - 1, y }, { width: 1, height: h }); // L
|
34641 | performance.RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x: x + w, y }, { width: 1, height: h }); // R
|
34642 | }
|
34643 | this.dirty = true;
|
34644 | }
|
34645 | beginFrame() {
|
34646 | this.callbackDispatchedThisFrame = {};
|
34647 | }
|
34648 | dispatchRenderCallbacks(ids) {
|
34649 | for (const id of ids) {
|
34650 | // the callback for the image was already dispatched for a different frame
|
34651 | if (this.callbackDispatchedThisFrame[id])
|
34652 | continue;
|
34653 | this.callbackDispatchedThisFrame[id] = true;
|
34654 | const image = this.images[id];
|
34655 | performance.assert(image);
|
34656 | const updated = renderStyleImage(image);
|
34657 | if (updated) {
|
34658 | this.updateImage(id, image);
|
34659 | }
|
34660 | }
|
34661 | }
|
34662 | }
|
34663 |
|
34664 | function loadGlyphRange(fontstack, range, urlTemplate, requestManager, callback) {
|
34665 | const begin = range * 256;
|
34666 | const end = begin + 255;
|
34667 | const request = requestManager.transformRequest(urlTemplate.replace('{fontstack}', fontstack).replace('{range}', `${begin}-${end}`), performance.ResourceType.Glyphs);
|
34668 | performance.getArrayBuffer(request, (err, data) => {
|
34669 | if (err) {
|
34670 | callback(err);
|
34671 | }
|
34672 | else if (data) {
|
34673 | const glyphs = {};
|
34674 | for (const glyph of performance.parseGlyphPBF(data)) {
|
34675 | glyphs[glyph.id] = glyph;
|
34676 | }
|
34677 | callback(null, glyphs);
|
34678 | }
|
34679 | });
|
34680 | }
|
34681 |
|
34682 | const INF = 1e20;
|
34683 |
|
34684 | class TinySDF {
|
34685 | constructor({
|
34686 | fontSize = 24,
|
34687 | buffer = 3,
|
34688 | radius = 8,
|
34689 | cutoff = 0.25,
|
34690 | fontFamily = 'sans-serif',
|
34691 | fontWeight = 'normal',
|
34692 | fontStyle = 'normal'
|
34693 | } = {}) {
|
34694 | this.buffer = buffer;
|
34695 | this.cutoff = cutoff;
|
34696 | this.radius = radius;
|
34697 |
|
34698 | // make the canvas size big enough to both have the specified buffer around the glyph
|
34699 | // for "halo", and account for some glyphs possibly being larger than their font size
|
34700 | const size = this.size = fontSize + buffer * 4;
|
34701 |
|
34702 | const canvas = this._createCanvas(size);
|
34703 | const ctx = this.ctx = canvas.getContext('2d', {willReadFrequently: true});
|
34704 | ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`;
|
34705 |
|
34706 | ctx.textBaseline = 'alphabetic';
|
34707 | ctx.textAlign = 'left'; // Necessary so that RTL text doesn't have different alignment
|
34708 | ctx.fillStyle = 'black';
|
34709 |
|
34710 | // temporary arrays for the distance transform
|
34711 | this.gridOuter = new Float64Array(size * size);
|
34712 | this.gridInner = new Float64Array(size * size);
|
34713 | this.f = new Float64Array(size);
|
34714 | this.z = new Float64Array(size + 1);
|
34715 | this.v = new Uint16Array(size);
|
34716 | }
|
34717 |
|
34718 | _createCanvas(size) {
|
34719 | const canvas = document.createElement('canvas');
|
34720 | canvas.width = canvas.height = size;
|
34721 | return canvas;
|
34722 | }
|
34723 |
|
34724 | draw(char) {
|
34725 | const {
|
34726 | width: glyphAdvance,
|
34727 | actualBoundingBoxAscent,
|
34728 | actualBoundingBoxDescent,
|
34729 | actualBoundingBoxLeft,
|
34730 | actualBoundingBoxRight
|
34731 | } = this.ctx.measureText(char);
|
34732 |
|
34733 | // The integer/pixel part of the top alignment is encoded in metrics.glyphTop
|
34734 | // The remainder is implicitly encoded in the rasterization
|
34735 | const glyphTop = Math.ceil(actualBoundingBoxAscent);
|
34736 | const glyphLeft = 0;
|
34737 |
|
34738 | // If the glyph overflows the canvas size, it will be clipped at the bottom/right
|
34739 | const glyphWidth = Math.min(this.size - this.buffer, Math.ceil(actualBoundingBoxRight - actualBoundingBoxLeft));
|
34740 | const glyphHeight = Math.min(this.size - this.buffer, glyphTop + Math.ceil(actualBoundingBoxDescent));
|
34741 |
|
34742 | const width = glyphWidth + 2 * this.buffer;
|
34743 | const height = glyphHeight + 2 * this.buffer;
|
34744 |
|
34745 | const len = Math.max(width * height, 0);
|
34746 | const data = new Uint8ClampedArray(len);
|
34747 | const glyph = {data, width, height, glyphWidth, glyphHeight, glyphTop, glyphLeft, glyphAdvance};
|
34748 | if (glyphWidth === 0 || glyphHeight === 0) return glyph;
|
34749 |
|
34750 | const {ctx, buffer, gridInner, gridOuter} = this;
|
34751 | ctx.clearRect(buffer, buffer, glyphWidth, glyphHeight);
|
34752 | ctx.fillText(char, buffer, buffer + glyphTop);
|
34753 | const imgData = ctx.getImageData(buffer, buffer, glyphWidth, glyphHeight);
|
34754 |
|
34755 | // Initialize grids outside the glyph range to alpha 0
|
34756 | gridOuter.fill(INF, 0, len);
|
34757 | gridInner.fill(0, 0, len);
|
34758 |
|
34759 | for (let y = 0; y < glyphHeight; y++) {
|
34760 | for (let x = 0; x < glyphWidth; x++) {
|
34761 | const a = imgData.data[4 * (y * glyphWidth + x) + 3] / 255; // alpha value
|
34762 | if (a === 0) continue; // empty pixels
|
34763 |
|
34764 | const j = (y + buffer) * width + x + buffer;
|
34765 |
|
34766 | if (a === 1) { // fully drawn pixels
|
34767 | gridOuter[j] = 0;
|
34768 | gridInner[j] = INF;
|
34769 |
|
34770 | } else { // aliased pixels
|
34771 | const d = 0.5 - a;
|
34772 | gridOuter[j] = d > 0 ? d * d : 0;
|
34773 | gridInner[j] = d < 0 ? d * d : 0;
|
34774 | }
|
34775 | }
|
34776 | }
|
34777 |
|
34778 | edt(gridOuter, 0, 0, width, height, width, this.f, this.v, this.z);
|
34779 | edt(gridInner, buffer, buffer, glyphWidth, glyphHeight, width, this.f, this.v, this.z);
|
34780 |
|
34781 | for (let i = 0; i < len; i++) {
|
34782 | const d = Math.sqrt(gridOuter[i]) - Math.sqrt(gridInner[i]);
|
34783 | data[i] = Math.round(255 - 255 * (d / this.radius + this.cutoff));
|
34784 | }
|
34785 |
|
34786 | return glyph;
|
34787 | }
|
34788 | }
|
34789 |
|
34790 | // 2D Euclidean squared distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf
|
34791 | function edt(data, x0, y0, width, height, gridSize, f, v, z) {
|
34792 | for (let x = x0; x < x0 + width; x++) edt1d(data, y0 * gridSize + x, gridSize, height, f, v, z);
|
34793 | for (let y = y0; y < y0 + height; y++) edt1d(data, y * gridSize + x0, 1, width, f, v, z);
|
34794 | }
|
34795 |
|
34796 | // 1D squared distance transform
|
34797 | function edt1d(grid, offset, stride, length, f, v, z) {
|
34798 | v[0] = 0;
|
34799 | z[0] = -INF;
|
34800 | z[1] = INF;
|
34801 | f[0] = grid[offset];
|
34802 |
|
34803 | for (let q = 1, k = 0, s = 0; q < length; q++) {
|
34804 | f[q] = grid[offset + q * stride];
|
34805 | const q2 = q * q;
|
34806 | do {
|
34807 | const r = v[k];
|
34808 | s = (f[q] - f[r] + q2 - r * r) / (q - r) / 2;
|
34809 | } while (s <= z[k] && --k > -1);
|
34810 |
|
34811 | k++;
|
34812 | v[k] = q;
|
34813 | z[k] = s;
|
34814 | z[k + 1] = INF;
|
34815 | }
|
34816 |
|
34817 | for (let q = 0, k = 0; q < length; q++) {
|
34818 | while (z[k + 1] < q) k++;
|
34819 | const r = v[k];
|
34820 | const qr = q - r;
|
34821 | grid[offset + q * stride] = f[r] + qr * qr;
|
34822 | }
|
34823 | }
|
34824 |
|
34825 | class GlyphManager {
|
34826 | constructor(requestManager, localIdeographFontFamily) {
|
34827 | this.requestManager = requestManager;
|
34828 | this.localIdeographFontFamily = localIdeographFontFamily;
|
34829 | this.entries = {};
|
34830 | }
|
34831 | setURL(url) {
|
34832 | this.url = url;
|
34833 | }
|
34834 | getGlyphs(glyphs, callback) {
|
34835 | const all = [];
|
34836 | for (const stack in glyphs) {
|
34837 | for (const id of glyphs[stack]) {
|
34838 | all.push({ stack, id });
|
34839 | }
|
34840 | }
|
34841 | performance.asyncAll(all, ({ stack, id }, callback) => {
|
34842 | let entry = this.entries[stack];
|
34843 | if (!entry) {
|
34844 | entry = this.entries[stack] = {
|
34845 | glyphs: {},
|
34846 | requests: {},
|
34847 | ranges: {}
|
34848 | };
|
34849 | }
|
34850 | let glyph = entry.glyphs[id];
|
34851 | if (glyph !== undefined) {
|
34852 | callback(null, { stack, id, glyph });
|
34853 | return;
|
34854 | }
|
34855 | glyph = this._tinySDF(entry, stack, id);
|
34856 | if (glyph) {
|
34857 | entry.glyphs[id] = glyph;
|
34858 | callback(null, { stack, id, glyph });
|
34859 | return;
|
34860 | }
|
34861 | const range = Math.floor(id / 256);
|
34862 | if (range * 256 > 65535) {
|
34863 | callback(new Error('glyphs > 65535 not supported'));
|
34864 | return;
|
34865 | }
|
34866 | if (entry.ranges[range]) {
|
34867 | callback(null, { stack, id, glyph });
|
34868 | return;
|
34869 | }
|
34870 | let requests = entry.requests[range];
|
34871 | if (!requests) {
|
34872 | requests = entry.requests[range] = [];
|
34873 | GlyphManager.loadGlyphRange(stack, range, this.url, this.requestManager, (err, response) => {
|
34874 | if (response) {
|
34875 | for (const id in response) {
|
34876 | if (!this._doesCharSupportLocalGlyph(+id)) {
|
34877 | entry.glyphs[+id] = response[+id];
|
34878 | }
|
34879 | }
|
34880 | entry.ranges[range] = true;
|
34881 | }
|
34882 | for (const cb of requests) {
|
34883 | cb(err, response);
|
34884 | }
|
34885 | delete entry.requests[range];
|
34886 | });
|
34887 | }
|
34888 | requests.push((err, result) => {
|
34889 | if (err) {
|
34890 | callback(err);
|
34891 | }
|
34892 | else if (result) {
|
34893 | callback(null, { stack, id, glyph: result[id] || null });
|
34894 | }
|
34895 | });
|
34896 | }, (err, glyphs) => {
|
34897 | if (err) {
|
34898 | callback(err);
|
34899 | }
|
34900 | else if (glyphs) {
|
34901 | const result = {};
|
34902 | for (const { stack, id, glyph } of glyphs) {
|
34903 | // Clone the glyph so that our own copy of its ArrayBuffer doesn't get transferred.
|
34904 | (result[stack] || (result[stack] = {}))[id] = glyph && {
|
34905 | id: glyph.id,
|
34906 | bitmap: glyph.bitmap.clone(),
|
34907 | metrics: glyph.metrics
|
34908 | };
|
34909 | }
|
34910 | callback(null, result);
|
34911 | }
|
34912 | });
|
34913 | }
|
34914 | _doesCharSupportLocalGlyph(id) {
|
34915 | /* eslint-disable new-cap */
|
34916 | return !!this.localIdeographFontFamily &&
|
34917 | (performance.unicodeBlockLookup['CJK Unified Ideographs'](id) ||
|
34918 | performance.unicodeBlockLookup['Hangul Syllables'](id) ||
|
34919 | performance.unicodeBlockLookup['Hiragana'](id) ||
|
34920 | performance.unicodeBlockLookup['Katakana'](id));
|
34921 | /* eslint-enable new-cap */
|
34922 | }
|
34923 | _tinySDF(entry, stack, id) {
|
34924 | const fontFamily = this.localIdeographFontFamily;
|
34925 | if (!fontFamily) {
|
34926 | return;
|
34927 | }
|
34928 | if (!this._doesCharSupportLocalGlyph(id)) {
|
34929 | return;
|
34930 | }
|
34931 | let tinySDF = entry.tinySDF;
|
34932 | if (!tinySDF) {
|
34933 | let fontWeight = '400';
|
34934 | if (/bold/i.test(stack)) {
|
34935 | fontWeight = '900';
|
34936 | }
|
34937 | else if (/medium/i.test(stack)) {
|
34938 | fontWeight = '500';
|
34939 | }
|
34940 | else if (/light/i.test(stack)) {
|
34941 | fontWeight = '200';
|
34942 | }
|
34943 | tinySDF = entry.tinySDF = new GlyphManager.TinySDF({
|
34944 | fontSize: 24,
|
34945 | buffer: 3,
|
34946 | radius: 8,
|
34947 | cutoff: 0.25,
|
34948 | fontFamily,
|
34949 | fontWeight
|
34950 | });
|
34951 | }
|
34952 | const char = tinySDF.draw(String.fromCharCode(id));
|
34953 | /**
|
34954 | * TinySDF's "top" is the distance from the alphabetic baseline to the top of the glyph.
|
34955 | * Server-generated fonts specify "top" relative to an origin above the em box (the origin
|
34956 | * comes from FreeType, but I'm unclear on exactly how it's derived)
|
34957 | * ref: https://github.com/mapbox/sdf-glyph-foundry
|
34958 | *
|
34959 | * Server fonts don't yet include baseline information, so we can't line up exactly with them
|
34960 | * (and they don't line up with each other)
|
34961 | * ref: https://github.com/mapbox/node-fontnik/pull/160
|
34962 | *
|
34963 | * To approximately align TinySDF glyphs with server-provided glyphs, we use this baseline adjustment
|
34964 | * factor calibrated to be in between DIN Pro and Arial Unicode (but closer to Arial Unicode)
|
34965 | */
|
34966 | const topAdjustment = 27;
|
34967 | return {
|
34968 | id,
|
34969 | bitmap: new performance.AlphaImage({ width: char.width || 30, height: char.height || 30 }, char.data),
|
34970 | metrics: {
|
34971 | width: char.glyphWidth || 24,
|
34972 | height: char.glyphHeight || 24,
|
34973 | left: char.glyphLeft || 0,
|
34974 | top: char.glyphTop - topAdjustment || -8,
|
34975 | advance: char.glyphAdvance || 24
|
34976 | }
|
34977 | };
|
34978 | }
|
34979 | }
|
34980 | // exposed as statics to enable stubbing in unit tests
|
34981 | GlyphManager.loadGlyphRange = loadGlyphRange;
|
34982 | GlyphManager.TinySDF = TinySDF;
|
34983 |
|
34984 | class LightPositionProperty {
|
34985 | constructor() {
|
34986 | this.specification = performance.spec.light.position;
|
34987 | }
|
34988 | possiblyEvaluate(value, parameters) {
|
34989 | return performance.sphericalToCartesian(value.expression.evaluate(parameters));
|
34990 | }
|
34991 | interpolate(a, b, t) {
|
34992 | return {
|
34993 | x: performance.number(a.x, b.x, t),
|
34994 | y: performance.number(a.y, b.y, t),
|
34995 | z: performance.number(a.z, b.z, t),
|
34996 | };
|
34997 | }
|
34998 | }
|
34999 | const properties = new performance.Properties({
|
35000 | 'anchor': new performance.DataConstantProperty(performance.spec.light.anchor),
|
35001 | 'position': new LightPositionProperty(),
|
35002 | 'color': new performance.DataConstantProperty(performance.spec.light.color),
|
35003 | 'intensity': new performance.DataConstantProperty(performance.spec.light.intensity),
|
35004 | });
|
35005 | const TRANSITION_SUFFIX = '-transition';
|
35006 | /*
|
35007 | * Represents the light used to light extruded features.
|
35008 | */
|
35009 | class Light extends performance.Evented {
|
35010 | constructor(lightOptions) {
|
35011 | super();
|
35012 | this._transitionable = new performance.Transitionable(properties);
|
35013 | this.setLight(lightOptions);
|
35014 | this._transitioning = this._transitionable.untransitioned();
|
35015 | }
|
35016 | getLight() {
|
35017 | return this._transitionable.serialize();
|
35018 | }
|
35019 | setLight(light, options = {}) {
|
35020 | if (this._validate(performance.validateLight, light, options)) {
|
35021 | return;
|
35022 | }
|
35023 | for (const name in light) {
|
35024 | const value = light[name];
|
35025 | if (name.endsWith(TRANSITION_SUFFIX)) {
|
35026 | this._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), value);
|
35027 | }
|
35028 | else {
|
35029 | this._transitionable.setValue(name, value);
|
35030 | }
|
35031 | }
|
35032 | }
|
35033 | updateTransitions(parameters) {
|
35034 | this._transitioning = this._transitionable.transitioned(parameters, this._transitioning);
|
35035 | }
|
35036 | hasTransition() {
|
35037 | return this._transitioning.hasTransition();
|
35038 | }
|
35039 | recalculate(parameters) {
|
35040 | this.properties = this._transitioning.possiblyEvaluate(parameters);
|
35041 | }
|
35042 | _validate(validate, value, options) {
|
35043 | if (options && options.validate === false) {
|
35044 | return false;
|
35045 | }
|
35046 | return performance.emitValidationErrors(this, validate.call(performance.validateStyle, performance.extend({
|
35047 | value,
|
35048 | // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407
|
35049 | style: { glyphs: true, sprite: true },
|
35050 | styleSpec: performance.spec
|
35051 | })));
|
35052 | }
|
35053 | }
|
35054 |
|
35055 | /**
|
35056 | * A LineAtlas lets us reuse rendered dashed lines
|
35057 | * by writing many of them to a texture and then fetching their positions
|
35058 | * using .getDash.
|
35059 | *
|
35060 | * @param {number} width
|
35061 | * @param {number} height
|
35062 | * @private
|
35063 | */
|
35064 | class LineAtlas {
|
35065 | constructor(width, height) {
|
35066 | this.width = width;
|
35067 | this.height = height;
|
35068 | this.nextRow = 0;
|
35069 | this.data = new Uint8Array(this.width * this.height);
|
35070 | this.dashEntry = {};
|
35071 | }
|
35072 | /**
|
35073 | * Get or create a dash line pattern.
|
35074 | *
|
35075 | * @param {Array<number>} dasharray
|
35076 | * @param {boolean} round whether to add circle caps in between dash segments
|
35077 | * @returns {Object} position of dash texture in { y, height, width }
|
35078 | * @private
|
35079 | */
|
35080 | getDash(dasharray, round) {
|
35081 | const key = dasharray.join(',') + String(round);
|
35082 | if (!this.dashEntry[key]) {
|
35083 | this.dashEntry[key] = this.addDash(dasharray, round);
|
35084 | }
|
35085 | return this.dashEntry[key];
|
35086 | }
|
35087 | getDashRanges(dasharray, lineAtlasWidth, stretch) {
|
35088 | // If dasharray has an odd length, both the first and last parts
|
35089 | // are dashes and should be joined seamlessly.
|
35090 | const oddDashArray = dasharray.length % 2 === 1;
|
35091 | const ranges = [];
|
35092 | let left = oddDashArray ? -dasharray[dasharray.length - 1] * stretch : 0;
|
35093 | let right = dasharray[0] * stretch;
|
35094 | let isDash = true;
|
35095 | ranges.push({ left, right, isDash, zeroLength: dasharray[0] === 0 });
|
35096 | let currentDashLength = dasharray[0];
|
35097 | for (let i = 1; i < dasharray.length; i++) {
|
35098 | isDash = !isDash;
|
35099 | const dashLength = dasharray[i];
|
35100 | left = currentDashLength * stretch;
|
35101 | currentDashLength += dashLength;
|
35102 | right = currentDashLength * stretch;
|
35103 | ranges.push({ left, right, isDash, zeroLength: dashLength === 0 });
|
35104 | }
|
35105 | return ranges;
|
35106 | }
|
35107 | addRoundDash(ranges, stretch, n) {
|
35108 | const halfStretch = stretch / 2;
|
35109 | for (let y = -n; y <= n; y++) {
|
35110 | const row = this.nextRow + n + y;
|
35111 | const index = this.width * row;
|
35112 | let currIndex = 0;
|
35113 | let range = ranges[currIndex];
|
35114 | for (let x = 0; x < this.width; x++) {
|
35115 | if (x / range.right > 1) {
|
35116 | range = ranges[++currIndex];
|
35117 | }
|
35118 | const distLeft = Math.abs(x - range.left);
|
35119 | const distRight = Math.abs(x - range.right);
|
35120 | const minDist = Math.min(distLeft, distRight);
|
35121 | let signedDistance;
|
35122 | const distMiddle = y / n * (halfStretch + 1);
|
35123 | if (range.isDash) {
|
35124 | const distEdge = halfStretch - Math.abs(distMiddle);
|
35125 | signedDistance = Math.sqrt(minDist * minDist + distEdge * distEdge);
|
35126 | }
|
35127 | else {
|
35128 | signedDistance = halfStretch - Math.sqrt(minDist * minDist + distMiddle * distMiddle);
|
35129 | }
|
35130 | this.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128));
|
35131 | }
|
35132 | }
|
35133 | }
|
35134 | addRegularDash(ranges) {
|
35135 | // Collapse any zero-length range
|
35136 | // Collapse neighbouring same-type parts into a single part
|
35137 | for (let i = ranges.length - 1; i >= 0; --i) {
|
35138 | const part = ranges[i];
|
35139 | const next = ranges[i + 1];
|
35140 | if (part.zeroLength) {
|
35141 | ranges.splice(i, 1);
|
35142 | }
|
35143 | else if (next && next.isDash === part.isDash) {
|
35144 | next.left = part.left;
|
35145 | ranges.splice(i, 1);
|
35146 | }
|
35147 | }
|
35148 | // Combine the first and last parts if possible
|
35149 | const first = ranges[0];
|
35150 | const last = ranges[ranges.length - 1];
|
35151 | if (first.isDash === last.isDash) {
|
35152 | first.left = last.left - this.width;
|
35153 | last.right = first.right + this.width;
|
35154 | }
|
35155 | const index = this.width * this.nextRow;
|
35156 | let currIndex = 0;
|
35157 | let range = ranges[currIndex];
|
35158 | for (let x = 0; x < this.width; x++) {
|
35159 | if (x / range.right > 1) {
|
35160 | range = ranges[++currIndex];
|
35161 | }
|
35162 | const distLeft = Math.abs(x - range.left);
|
35163 | const distRight = Math.abs(x - range.right);
|
35164 | const minDist = Math.min(distLeft, distRight);
|
35165 | const signedDistance = range.isDash ? minDist : -minDist;
|
35166 | this.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128));
|
35167 | }
|
35168 | }
|
35169 | addDash(dasharray, round) {
|
35170 | const n = round ? 7 : 0;
|
35171 | const height = 2 * n + 1;
|
35172 | if (this.nextRow + height > this.height) {
|
35173 | performance.warnOnce('LineAtlas out of space');
|
35174 | return null;
|
35175 | }
|
35176 | let length = 0;
|
35177 | for (let i = 0; i < dasharray.length; i++) {
|
35178 | length += dasharray[i];
|
35179 | }
|
35180 | if (length !== 0) {
|
35181 | const stretch = this.width / length;
|
35182 | const ranges = this.getDashRanges(dasharray, this.width, stretch);
|
35183 | if (round) {
|
35184 | this.addRoundDash(ranges, stretch, n);
|
35185 | }
|
35186 | else {
|
35187 | this.addRegularDash(ranges);
|
35188 | }
|
35189 | }
|
35190 | const dashEntry = {
|
35191 | y: (this.nextRow + n + 0.5) / this.height,
|
35192 | height: 2 * n / this.height,
|
35193 | width: length
|
35194 | };
|
35195 | this.nextRow += height;
|
35196 | this.dirty = true;
|
35197 | return dashEntry;
|
35198 | }
|
35199 | bind(context) {
|
35200 | const gl = context.gl;
|
35201 | if (!this.texture) {
|
35202 | this.texture = gl.createTexture();
|
35203 | gl.bindTexture(gl.TEXTURE_2D, this.texture);
|
35204 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);
|
35205 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);
|
35206 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
35207 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
35208 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, this.width, this.height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, this.data);
|
35209 | }
|
35210 | else {
|
35211 | gl.bindTexture(gl.TEXTURE_2D, this.texture);
|
35212 | if (this.dirty) {
|
35213 | this.dirty = false;
|
35214 | gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.ALPHA, gl.UNSIGNED_BYTE, this.data);
|
35215 | }
|
35216 | }
|
35217 | }
|
35218 | }
|
35219 |
|
35220 | /**
|
35221 | * Responsible for sending messages from a {@link Source} to an associated
|
35222 | * {@link WorkerSource}.
|
35223 | *
|
35224 | * @private
|
35225 | */
|
35226 | class Dispatcher {
|
35227 | constructor(workerPool, parent) {
|
35228 | this.workerPool = workerPool;
|
35229 | this.actors = [];
|
35230 | this.currentActor = 0;
|
35231 | this.id = performance.uniqueId();
|
35232 | const workers = this.workerPool.acquire(this.id);
|
35233 | for (let i = 0; i < workers.length; i++) {
|
35234 | const worker = workers[i];
|
35235 | const actor = new Dispatcher.Actor(worker, parent, this.id);
|
35236 | actor.name = `Worker ${i}`;
|
35237 | this.actors.push(actor);
|
35238 | }
|
35239 | performance.assert(this.actors.length);
|
35240 | }
|
35241 | /**
|
35242 | * Broadcast a message to all Workers.
|
35243 | * @private
|
35244 | */
|
35245 | broadcast(type, data, cb) {
|
35246 | performance.assert(this.actors.length);
|
35247 | cb = cb || function () { };
|
35248 | performance.asyncAll(this.actors, (actor, done) => {
|
35249 | actor.send(type, data, done);
|
35250 | }, cb);
|
35251 | }
|
35252 | /**
|
35253 | * Acquires an actor to dispatch messages to. The actors are distributed in round-robin fashion.
|
35254 | * @returns An actor object backed by a web worker for processing messages.
|
35255 | */
|
35256 | getActor() {
|
35257 | performance.assert(this.actors.length);
|
35258 | this.currentActor = (this.currentActor + 1) % this.actors.length;
|
35259 | return this.actors[this.currentActor];
|
35260 | }
|
35261 | remove() {
|
35262 | this.actors.forEach((actor) => { actor.remove(); });
|
35263 | this.actors = [];
|
35264 | this.workerPool.release(this.id);
|
35265 | }
|
35266 | }
|
35267 | Dispatcher.Actor = performance.Actor;
|
35268 |
|
35269 | function loadTileJSON (options, requestManager, callback) {
|
35270 | const loaded = function (err, tileJSON) {
|
35271 | if (err) {
|
35272 | return callback(err);
|
35273 | }
|
35274 | else if (tileJSON) {
|
35275 | const result = performance.pick(
|
35276 | // explicit source options take precedence over TileJSON
|
35277 | performance.extend(tileJSON, options), ['tiles', 'minzoom', 'maxzoom', 'attribution', 'bounds', 'scheme', 'tileSize', 'encoding']);
|
35278 | if (tileJSON.vector_layers) {
|
35279 | result.vectorLayers = tileJSON.vector_layers;
|
35280 | result.vectorLayerIds = result.vectorLayers.map((layer) => { return layer.id; });
|
35281 | }
|
35282 | callback(null, result);
|
35283 | }
|
35284 | };
|
35285 | if (options.url) {
|
35286 | return performance.getJSON(requestManager.transformRequest(options.url, performance.ResourceType.Source), loaded);
|
35287 | }
|
35288 | else {
|
35289 | return performance.exported.frame(() => loaded(null, options));
|
35290 | }
|
35291 | }
|
35292 |
|
35293 | class TileBounds {
|
35294 | constructor(bounds, minzoom, maxzoom) {
|
35295 | this.bounds = performance.LngLatBounds.convert(this.validateBounds(bounds));
|
35296 | this.minzoom = minzoom || 0;
|
35297 | this.maxzoom = maxzoom || 24;
|
35298 | }
|
35299 | validateBounds(bounds) {
|
35300 | // make sure the bounds property contains valid longitude and latitudes
|
35301 | if (!Array.isArray(bounds) || bounds.length !== 4)
|
35302 | return [-180, -90, 180, 90];
|
35303 | return [Math.max(-180, bounds[0]), Math.max(-90, bounds[1]), Math.min(180, bounds[2]), Math.min(90, bounds[3])];
|
35304 | }
|
35305 | contains(tileID) {
|
35306 | const worldSize = Math.pow(2, tileID.z);
|
35307 | const level = {
|
35308 | minX: Math.floor(performance.mercatorXfromLng(this.bounds.getWest()) * worldSize),
|
35309 | minY: Math.floor(performance.mercatorYfromLat(this.bounds.getNorth()) * worldSize),
|
35310 | maxX: Math.ceil(performance.mercatorXfromLng(this.bounds.getEast()) * worldSize),
|
35311 | maxY: Math.ceil(performance.mercatorYfromLat(this.bounds.getSouth()) * worldSize)
|
35312 | };
|
35313 | const hit = tileID.x >= level.minX && tileID.x < level.maxX && tileID.y >= level.minY && tileID.y < level.maxY;
|
35314 | return hit;
|
35315 | }
|
35316 | }
|
35317 |
|
35318 | /**
|
35319 | * A source containing vector tiles in [Mapbox Vector Tile format](https://docs.mapbox.com/vector-tiles/reference/).
|
35320 | * (See the [Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/) for detailed documentation of options.)
|
35321 | *
|
35322 | * @example
|
35323 | * map.addSource('some id', {
|
35324 | * type: 'vector',
|
35325 | * url: 'https://demotiles.maplibre.org/tiles/tiles.json'
|
35326 | * });
|
35327 | *
|
35328 | * @example
|
35329 | * map.addSource('some id', {
|
35330 | * type: 'vector',
|
35331 | * tiles: ['https://d25uarhxywzl1j.cloudfront.net/v0.1/{z}/{x}/{y}.mvt'],
|
35332 | * minzoom: 6,
|
35333 | * maxzoom: 14
|
35334 | * });
|
35335 | *
|
35336 | * @example
|
35337 | * map.getSource('some id').setUrl("https://demotiles.maplibre.org/tiles/tiles.json");
|
35338 | *
|
35339 | * @example
|
35340 | * map.getSource('some id').setTiles(['https://d25uarhxywzl1j.cloudfront.net/v0.1/{z}/{x}/{y}.mvt']);
|
35341 | * @see [Add a vector tile source](https://maplibre.org/maplibre-gl-js-docs/example/vector-source/)
|
35342 | * @see [Add a third party vector tile source](https://maplibre.org/maplibre-gl-js-docs/example/third-party/)
|
35343 | */
|
35344 | class VectorTileSource extends performance.Evented {
|
35345 | constructor(id, options, dispatcher, eventedParent) {
|
35346 | super();
|
35347 | this.id = id;
|
35348 | this.dispatcher = dispatcher;
|
35349 | this.type = 'vector';
|
35350 | this.minzoom = 0;
|
35351 | this.maxzoom = 22;
|
35352 | this.scheme = 'xyz';
|
35353 | this.tileSize = 512;
|
35354 | this.reparseOverscaled = true;
|
35355 | this.isTileClipped = true;
|
35356 | this._loaded = false;
|
35357 | performance.extend(this, performance.pick(options, ['url', 'scheme', 'tileSize', 'promoteId']));
|
35358 | this._options = performance.extend({ type: 'vector' }, options);
|
35359 | this._collectResourceTiming = options.collectResourceTiming;
|
35360 | if (this.tileSize !== 512) {
|
35361 | throw new Error('vector tile sources must have a tileSize of 512');
|
35362 | }
|
35363 | this.setEventedParent(eventedParent);
|
35364 | }
|
35365 | load() {
|
35366 | this._loaded = false;
|
35367 | this.fire(new performance.Event('dataloading', { dataType: 'source' }));
|
35368 | this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, (err, tileJSON) => {
|
35369 | this._tileJSONRequest = null;
|
35370 | this._loaded = true;
|
35371 | this.map.style.sourceCaches[this.id].clearTiles();
|
35372 | if (err) {
|
35373 | this.fire(new performance.ErrorEvent(err));
|
35374 | }
|
35375 | else if (tileJSON) {
|
35376 | performance.extend(this, tileJSON);
|
35377 | if (tileJSON.bounds)
|
35378 | this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom);
|
35379 | // `content` is included here to prevent a race condition where `Style#_updateSources` is called
|
35380 | // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives
|
35381 | // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088
|
35382 | this.fire(new performance.Event('data', { dataType: 'source', sourceDataType: 'metadata' }));
|
35383 | this.fire(new performance.Event('data', { dataType: 'source', sourceDataType: 'content' }));
|
35384 | }
|
35385 | });
|
35386 | }
|
35387 | loaded() {
|
35388 | return this._loaded;
|
35389 | }
|
35390 | hasTile(tileID) {
|
35391 | return !this.tileBounds || this.tileBounds.contains(tileID.canonical);
|
35392 | }
|
35393 | onAdd(map) {
|
35394 | this.map = map;
|
35395 | this.load();
|
35396 | }
|
35397 | setSourceProperty(callback) {
|
35398 | if (this._tileJSONRequest) {
|
35399 | this._tileJSONRequest.cancel();
|
35400 | }
|
35401 | callback();
|
35402 | this.load();
|
35403 | }
|
35404 | /**
|
35405 | * Sets the source `tiles` property and re-renders the map.
|
35406 | *
|
35407 | * @param {string[]} tiles An array of one or more tile source URLs, as in the TileJSON spec.
|
35408 | * @returns {VectorTileSource} this
|
35409 | */
|
35410 | setTiles(tiles) {
|
35411 | this.setSourceProperty(() => {
|
35412 | this._options.tiles = tiles;
|
35413 | });
|
35414 | return this;
|
35415 | }
|
35416 | /**
|
35417 | * Sets the source `url` property and re-renders the map.
|
35418 | *
|
35419 | * @param {string} url A URL to a TileJSON resource. Supported protocols are `http:` and `https:`.
|
35420 | * @returns {VectorTileSource} this
|
35421 | */
|
35422 | setUrl(url) {
|
35423 | this.setSourceProperty(() => {
|
35424 | this.url = url;
|
35425 | this._options.url = url;
|
35426 | });
|
35427 | return this;
|
35428 | }
|
35429 | onRemove() {
|
35430 | if (this._tileJSONRequest) {
|
35431 | this._tileJSONRequest.cancel();
|
35432 | this._tileJSONRequest = null;
|
35433 | }
|
35434 | }
|
35435 | serialize() {
|
35436 | return performance.extend({}, this._options);
|
35437 | }
|
35438 | loadTile(tile, callback) {
|
35439 | const url = tile.tileID.canonical.url(this.tiles, this.map.getPixelRatio(), this.scheme);
|
35440 | const params = {
|
35441 | request: this.map._requestManager.transformRequest(url, performance.ResourceType.Tile),
|
35442 | uid: tile.uid,
|
35443 | tileID: tile.tileID,
|
35444 | zoom: tile.tileID.overscaledZ,
|
35445 | tileSize: this.tileSize * tile.tileID.overscaleFactor(),
|
35446 | type: this.type,
|
35447 | source: this.id,
|
35448 | pixelRatio: this.map.getPixelRatio(),
|
35449 | showCollisionBoxes: this.map.showCollisionBoxes,
|
35450 | promoteId: this.promoteId
|
35451 | };
|
35452 | params.request.collectResourceTiming = this._collectResourceTiming;
|
35453 | if (!tile.actor || tile.state === 'expired') {
|
35454 | tile.actor = this.dispatcher.getActor();
|
35455 | tile.request = tile.actor.send('loadTile', params, done.bind(this));
|
35456 | }
|
35457 | else if (tile.state === 'loading') {
|
35458 | // schedule tile reloading after it has been loaded
|
35459 | tile.reloadCallback = callback;
|
35460 | }
|
35461 | else {
|
35462 | tile.request = tile.actor.send('reloadTile', params, done.bind(this));
|
35463 | }
|
35464 | function done(err, data) {
|
35465 | delete tile.request;
|
35466 | if (tile.aborted)
|
35467 | return callback(null);
|
35468 | if (err && err.status !== 404) {
|
35469 | return callback(err);
|
35470 | }
|
35471 | if (data && data.resourceTiming)
|
35472 | tile.resourceTiming = data.resourceTiming;
|
35473 | if (this.map._refreshExpiredTiles && data)
|
35474 | tile.setExpiryData(data);
|
35475 | tile.loadVectorData(data, this.map.painter);
|
35476 | performance.cacheEntryPossiblyAdded(this.dispatcher);
|
35477 | callback(null);
|
35478 | if (tile.reloadCallback) {
|
35479 | this.loadTile(tile, tile.reloadCallback);
|
35480 | tile.reloadCallback = null;
|
35481 | }
|
35482 | }
|
35483 | }
|
35484 | abortTile(tile) {
|
35485 | if (tile.request) {
|
35486 | tile.request.cancel();
|
35487 | delete tile.request;
|
35488 | }
|
35489 | if (tile.actor) {
|
35490 | tile.actor.send('abortTile', { uid: tile.uid, type: this.type, source: this.id }, undefined);
|
35491 | }
|
35492 | }
|
35493 | unloadTile(tile) {
|
35494 | tile.unloadVectorData();
|
35495 | if (tile.actor) {
|
35496 | tile.actor.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }, undefined);
|
35497 | }
|
35498 | }
|
35499 | hasTransition() {
|
35500 | return false;
|
35501 | }
|
35502 | }
|
35503 |
|
35504 | class RasterTileSource extends performance.Evented {
|
35505 | constructor(id, options, dispatcher, eventedParent) {
|
35506 | super();
|
35507 | this.id = id;
|
35508 | this.dispatcher = dispatcher;
|
35509 | this.setEventedParent(eventedParent);
|
35510 | this.type = 'raster';
|
35511 | this.minzoom = 0;
|
35512 | this.maxzoom = 22;
|
35513 | this.roundZoom = true;
|
35514 | this.scheme = 'xyz';
|
35515 | this.tileSize = 512;
|
35516 | this._loaded = false;
|
35517 | this._options = performance.extend({ type: 'raster' }, options);
|
35518 | performance.extend(this, performance.pick(options, ['url', 'scheme', 'tileSize']));
|
35519 | }
|
35520 | load() {
|
35521 | this._loaded = false;
|
35522 | this.fire(new performance.Event('dataloading', { dataType: 'source' }));
|
35523 | this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, (err, tileJSON) => {
|
35524 | this._tileJSONRequest = null;
|
35525 | this._loaded = true;
|
35526 | if (err) {
|
35527 | this.fire(new performance.ErrorEvent(err));
|
35528 | }
|
35529 | else if (tileJSON) {
|
35530 | performance.extend(this, tileJSON);
|
35531 | if (tileJSON.bounds)
|
35532 | this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom);
|
35533 | // `content` is included here to prevent a race condition where `Style#_updateSources` is called
|
35534 | // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives
|
35535 | // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088
|
35536 | this.fire(new performance.Event('data', { dataType: 'source', sourceDataType: 'metadata' }));
|
35537 | this.fire(new performance.Event('data', { dataType: 'source', sourceDataType: 'content' }));
|
35538 | }
|
35539 | });
|
35540 | }
|
35541 | loaded() {
|
35542 | return this._loaded;
|
35543 | }
|
35544 | onAdd(map) {
|
35545 | this.map = map;
|
35546 | this.load();
|
35547 | }
|
35548 | onRemove() {
|
35549 | if (this._tileJSONRequest) {
|
35550 | this._tileJSONRequest.cancel();
|
35551 | this._tileJSONRequest = null;
|
35552 | }
|
35553 | }
|
35554 | serialize() {
|
35555 | return performance.extend({}, this._options);
|
35556 | }
|
35557 | hasTile(tileID) {
|
35558 | return !this.tileBounds || this.tileBounds.contains(tileID.canonical);
|
35559 | }
|
35560 | loadTile(tile, callback) {
|
35561 | const url = tile.tileID.canonical.url(this.tiles, this.map.getPixelRatio(), this.scheme);
|
35562 | tile.request = performance.getImage(this.map._requestManager.transformRequest(url, performance.ResourceType.Tile), (err, img, expiry) => {
|
35563 | delete tile.request;
|
35564 | if (tile.aborted) {
|
35565 | tile.state = 'unloaded';
|
35566 | callback(null);
|
35567 | }
|
35568 | else if (err) {
|
35569 | tile.state = 'errored';
|
35570 | callback(err);
|
35571 | }
|
35572 | else if (img) {
|
35573 | if (this.map._refreshExpiredTiles)
|
35574 | tile.setExpiryData(expiry);
|
35575 | const context = this.map.painter.context;
|
35576 | const gl = context.gl;
|
35577 | tile.texture = this.map.painter.getTileTexture(img.width);
|
35578 | if (tile.texture) {
|
35579 | tile.texture.update(img, { useMipmap: true });
|
35580 | }
|
35581 | else {
|
35582 | tile.texture = new Texture(context, img, gl.RGBA, { useMipmap: true });
|
35583 | tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST);
|
35584 | if (context.extTextureFilterAnisotropic) {
|
35585 | gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax);
|
35586 | }
|
35587 | }
|
35588 | tile.state = 'loaded';
|
35589 | performance.cacheEntryPossiblyAdded(this.dispatcher);
|
35590 | callback(null);
|
35591 | }
|
35592 | });
|
35593 | }
|
35594 | abortTile(tile, callback) {
|
35595 | if (tile.request) {
|
35596 | tile.request.cancel();
|
35597 | delete tile.request;
|
35598 | }
|
35599 | callback();
|
35600 | }
|
35601 | unloadTile(tile, callback) {
|
35602 | if (tile.texture)
|
35603 | this.map.painter.saveTileTexture(tile.texture);
|
35604 | callback();
|
35605 | }
|
35606 | hasTransition() {
|
35607 | return false;
|
35608 | }
|
35609 | }
|
35610 |
|
35611 | let supportsOffscreenCanvas;
|
35612 | function offscreenCanvasSupported() {
|
35613 | if (supportsOffscreenCanvas == null) {
|
35614 | supportsOffscreenCanvas = typeof OffscreenCanvas !== 'undefined' &&
|
35615 | new OffscreenCanvas(1, 1).getContext('2d') &&
|
35616 | typeof createImageBitmap === 'function';
|
35617 | }
|
35618 | return supportsOffscreenCanvas;
|
35619 | }
|
35620 |
|
35621 | class RasterDEMTileSource extends RasterTileSource {
|
35622 | constructor(id, options, dispatcher, eventedParent) {
|
35623 | super(id, options, dispatcher, eventedParent);
|
35624 | this.type = 'raster-dem';
|
35625 | this.maxzoom = 22;
|
35626 | this._options = performance.extend({ type: 'raster-dem' }, options);
|
35627 | this.encoding = options.encoding || 'mapbox';
|
35628 | }
|
35629 | serialize() {
|
35630 | return {
|
35631 | type: 'raster-dem',
|
35632 | url: this.url,
|
35633 | tileSize: this.tileSize,
|
35634 | tiles: this.tiles,
|
35635 | bounds: this.bounds,
|
35636 | encoding: this.encoding
|
35637 | };
|
35638 | }
|
35639 | loadTile(tile, callback) {
|
35640 | const url = tile.tileID.canonical.url(this.tiles, this.map.getPixelRatio(), this.scheme);
|
35641 | tile.request = performance.getImage(this.map._requestManager.transformRequest(url, performance.ResourceType.Tile), imageLoaded.bind(this));
|
35642 | tile.neighboringTiles = this._getNeighboringTiles(tile.tileID);
|
35643 | function imageLoaded(err, img) {
|
35644 | delete tile.request;
|
35645 | if (tile.aborted) {
|
35646 | tile.state = 'unloaded';
|
35647 | callback(null);
|
35648 | }
|
35649 | else if (err) {
|
35650 | tile.state = 'errored';
|
35651 | callback(err);
|
35652 | }
|
35653 | else if (img) {
|
35654 | if (this.map._refreshExpiredTiles)
|
35655 | tile.setExpiryData(img);
|
35656 | delete img.cacheControl;
|
35657 | delete img.expires;
|
35658 | const transfer = performance.isImageBitmap(img) && offscreenCanvasSupported();
|
35659 | const rawImageData = transfer ? img : performance.exported.getImageData(img, 1);
|
35660 | const params = {
|
35661 | uid: tile.uid,
|
35662 | coord: tile.tileID,
|
35663 | source: this.id,
|
35664 | rawImageData,
|
35665 | encoding: this.encoding
|
35666 | };
|
35667 | if (!tile.actor || tile.state === 'expired') {
|
35668 | tile.actor = this.dispatcher.getActor();
|
35669 | tile.actor.send('loadDEMTile', params, done.bind(this));
|
35670 | }
|
35671 | }
|
35672 | }
|
35673 | function done(err, dem) {
|
35674 | if (err) {
|
35675 | tile.state = 'errored';
|
35676 | callback(err);
|
35677 | }
|
35678 | if (dem) {
|
35679 | tile.dem = dem;
|
35680 | tile.needsHillshadePrepare = true;
|
35681 | tile.state = 'loaded';
|
35682 | callback(null);
|
35683 | }
|
35684 | }
|
35685 | }
|
35686 | _getNeighboringTiles(tileID) {
|
35687 | const canonical = tileID.canonical;
|
35688 | const dim = Math.pow(2, canonical.z);
|
35689 | const px = (canonical.x - 1 + dim) % dim;
|
35690 | const pxw = canonical.x === 0 ? tileID.wrap - 1 : tileID.wrap;
|
35691 | const nx = (canonical.x + 1 + dim) % dim;
|
35692 | const nxw = canonical.x + 1 === dim ? tileID.wrap + 1 : tileID.wrap;
|
35693 | const neighboringTiles = {};
|
35694 | // add adjacent tiles
|
35695 | neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y).key] = { backfilled: false };
|
35696 | neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y).key] = { backfilled: false };
|
35697 | // Add upper neighboringTiles
|
35698 | if (canonical.y > 0) {
|
35699 | neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y - 1).key] = { backfilled: false };
|
35700 | neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y - 1).key] = { backfilled: false };
|
35701 | neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y - 1).key] = { backfilled: false };
|
35702 | }
|
35703 | // Add lower neighboringTiles
|
35704 | if (canonical.y + 1 < dim) {
|
35705 | neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y + 1).key] = { backfilled: false };
|
35706 | neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y + 1).key] = { backfilled: false };
|
35707 | neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y + 1).key] = { backfilled: false };
|
35708 | }
|
35709 | return neighboringTiles;
|
35710 | }
|
35711 | unloadTile(tile) {
|
35712 | if (tile.demTexture)
|
35713 | this.map.painter.saveTileTexture(tile.demTexture);
|
35714 | if (tile.fbo) {
|
35715 | tile.fbo.destroy();
|
35716 | delete tile.fbo;
|
35717 | }
|
35718 | if (tile.dem)
|
35719 | delete tile.dem;
|
35720 | delete tile.neighboringTiles;
|
35721 | tile.state = 'unloaded';
|
35722 | if (tile.actor) {
|
35723 | tile.actor.send('removeDEMTile', { uid: tile.uid, source: this.id });
|
35724 | }
|
35725 | }
|
35726 | }
|
35727 |
|
35728 | /**
|
35729 | * A source containing GeoJSON.
|
35730 | * (See the [Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/#sources-geojson) for detailed documentation of options.)
|
35731 | *
|
35732 | * @example
|
35733 | * map.addSource('some id', {
|
35734 | * type: 'geojson',
|
35735 | * data: 'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_ports.geojson'
|
35736 | * });
|
35737 | *
|
35738 | * @example
|
35739 | * map.addSource('some id', {
|
35740 | * type: 'geojson',
|
35741 | * data: {
|
35742 | * "type": "FeatureCollection",
|
35743 | * "features": [{
|
35744 | * "type": "Feature",
|
35745 | * "properties": {},
|
35746 | * "geometry": {
|
35747 | * "type": "Point",
|
35748 | * "coordinates": [
|
35749 | * -76.53063297271729,
|
35750 | * 39.18174077994108
|
35751 | * ]
|
35752 | * }
|
35753 | * }]
|
35754 | * }
|
35755 | * });
|
35756 | *
|
35757 | * @example
|
35758 | * map.getSource('some id').setData({
|
35759 | * "type": "FeatureCollection",
|
35760 | * "features": [{
|
35761 | * "type": "Feature",
|
35762 | * "properties": { "name": "Null Island" },
|
35763 | * "geometry": {
|
35764 | * "type": "Point",
|
35765 | * "coordinates": [ 0, 0 ]
|
35766 | * }
|
35767 | * }]
|
35768 | * });
|
35769 | * @see [Draw GeoJSON points](https://maplibre.org/maplibre-gl-js-docs/example/geojson-markers/)
|
35770 | * @see [Add a GeoJSON line](https://maplibre.org/maplibre-gl-js-docs/example/geojson-line/)
|
35771 | * @see [Create a heatmap from points](https://maplibre.org/maplibre-gl-js-docs/example/heatmap/)
|
35772 | * @see [Create and style clusters](https://maplibre.org/maplibre-gl-js-docs/example/cluster/)
|
35773 | */
|
35774 | class GeoJSONSource extends performance.Evented {
|
35775 | /**
|
35776 | * @private
|
35777 | */
|
35778 | constructor(id, options, dispatcher, eventedParent) {
|
35779 | super();
|
35780 | this.id = id;
|
35781 | // `type` is a property rather than a constant to make it easy for 3rd
|
35782 | // parties to use GeoJSONSource to build their own source types.
|
35783 | this.type = 'geojson';
|
35784 | this.minzoom = 0;
|
35785 | this.maxzoom = 18;
|
35786 | this.tileSize = 512;
|
35787 | this.isTileClipped = true;
|
35788 | this.reparseOverscaled = true;
|
35789 | this._removed = false;
|
35790 | this._pendingLoads = 0;
|
35791 | this.actor = dispatcher.getActor();
|
35792 | this.setEventedParent(eventedParent);
|
35793 | this._data = options.data;
|
35794 | this._options = performance.extend({}, options);
|
35795 | this._collectResourceTiming = options.collectResourceTiming;
|
35796 | if (options.maxzoom !== undefined)
|
35797 | this.maxzoom = options.maxzoom;
|
35798 | if (options.type)
|
35799 | this.type = options.type;
|
35800 | if (options.attribution)
|
35801 | this.attribution = options.attribution;
|
35802 | this.promoteId = options.promoteId;
|
35803 | const scale = performance.EXTENT / this.tileSize;
|
35804 | // sent to the worker, along with `url: ...` or `data: literal geojson`,
|
35805 | // so that it can load/parse/index the geojson data
|
35806 | // extending with `options.workerOptions` helps to make it easy for
|
35807 | // third-party sources to hack/reuse GeoJSONSource.
|
35808 | this.workerOptions = performance.extend({
|
35809 | source: this.id,
|
35810 | cluster: options.cluster || false,
|
35811 | geojsonVtOptions: {
|
35812 | buffer: (options.buffer !== undefined ? options.buffer : 128) * scale,
|
35813 | tolerance: (options.tolerance !== undefined ? options.tolerance : 0.375) * scale,
|
35814 | extent: performance.EXTENT,
|
35815 | maxZoom: this.maxzoom,
|
35816 | lineMetrics: options.lineMetrics || false,
|
35817 | generateId: options.generateId || false
|
35818 | },
|
35819 | superclusterOptions: {
|
35820 | maxZoom: options.clusterMaxZoom !== undefined ? options.clusterMaxZoom : this.maxzoom - 1,
|
35821 | minPoints: Math.max(2, options.clusterMinPoints || 2),
|
35822 | extent: performance.EXTENT,
|
35823 | radius: (options.clusterRadius || 50) * scale,
|
35824 | log: false,
|
35825 | generateId: options.generateId || false
|
35826 | },
|
35827 | clusterProperties: options.clusterProperties,
|
35828 | filter: options.filter
|
35829 | }, options.workerOptions);
|
35830 | }
|
35831 | load() {
|
35832 | // although GeoJSON sources contain no metadata, we fire this event to let the SourceCache
|
35833 | // know its ok to start requesting tiles.
|
35834 | this._updateWorkerData('metadata');
|
35835 | }
|
35836 | onAdd(map) {
|
35837 | this.map = map;
|
35838 | this.load();
|
35839 | }
|
35840 | /**
|
35841 | * Sets the GeoJSON data and re-renders the map.
|
35842 | *
|
35843 | * @param {Object|string} data A GeoJSON data object or a URL to one. The latter is preferable in the case of large GeoJSON files.
|
35844 | * @returns {GeoJSONSource} this
|
35845 | */
|
35846 | setData(data) {
|
35847 | this._data = data;
|
35848 | this._updateWorkerData('content');
|
35849 | return this;
|
35850 | }
|
35851 | /**
|
35852 | * For clustered sources, fetches the zoom at which the given cluster expands.
|
35853 | *
|
35854 | * @param clusterId The value of the cluster's `cluster_id` property.
|
35855 | * @param callback A callback to be called when the zoom value is retrieved (`(error, zoom) => { ... }`).
|
35856 | * @returns {GeoJSONSource} this
|
35857 | */
|
35858 | getClusterExpansionZoom(clusterId, callback) {
|
35859 | this.actor.send('geojson.getClusterExpansionZoom', { clusterId, source: this.id }, callback);
|
35860 | return this;
|
35861 | }
|
35862 | /**
|
35863 | * For clustered sources, fetches the children of the given cluster on the next zoom level (as an array of GeoJSON features).
|
35864 | *
|
35865 | * @param clusterId The value of the cluster's `cluster_id` property.
|
35866 | * @param callback A callback to be called when the features are retrieved (`(error, features) => { ... }`).
|
35867 | * @returns {GeoJSONSource} this
|
35868 | */
|
35869 | getClusterChildren(clusterId, callback) {
|
35870 | this.actor.send('geojson.getClusterChildren', { clusterId, source: this.id }, callback);
|
35871 | return this;
|
35872 | }
|
35873 | /**
|
35874 | * For clustered sources, fetches the original points that belong to the cluster (as an array of GeoJSON features).
|
35875 | *
|
35876 | * @param clusterId The value of the cluster's `cluster_id` property.
|
35877 | * @param limit The maximum number of features to return.
|
35878 | * @param offset The number of features to skip (e.g. for pagination).
|
35879 | * @param callback A callback to be called when the features are retrieved (`(error, features) => { ... }`).
|
35880 | * @returns {GeoJSONSource} this
|
35881 | * @example
|
35882 | * // Retrieve cluster leaves on click
|
35883 | * map.on('click', 'clusters', function(e) {
|
35884 | * var features = map.queryRenderedFeatures(e.point, {
|
35885 | * layers: ['clusters']
|
35886 | * });
|
35887 | *
|
35888 | * var clusterId = features[0].properties.cluster_id;
|
35889 | * var pointCount = features[0].properties.point_count;
|
35890 | * var clusterSource = map.getSource('clusters');
|
35891 | *
|
35892 | * clusterSource.getClusterLeaves(clusterId, pointCount, 0, function(error, features) {
|
35893 | * // Print cluster leaves in the console
|
35894 | * console.log('Cluster leaves:', error, features);
|
35895 | * })
|
35896 | * });
|
35897 | */
|
35898 | getClusterLeaves(clusterId, limit, offset, callback) {
|
35899 | this.actor.send('geojson.getClusterLeaves', {
|
35900 | source: this.id,
|
35901 | clusterId,
|
35902 | limit,
|
35903 | offset
|
35904 | }, callback);
|
35905 | return this;
|
35906 | }
|
35907 | /*
|
35908 | * Responsible for invoking WorkerSource's geojson.loadData target, which
|
35909 | * handles loading the geojson data and preparing to serve it up as tiles,
|
35910 | * using geojson-vt or supercluster as appropriate.
|
35911 | */
|
35912 | _updateWorkerData(sourceDataType) {
|
35913 | const options = performance.extend({}, this.workerOptions);
|
35914 | const data = this._data;
|
35915 | if (typeof data === 'string') {
|
35916 | options.request = this.map._requestManager.transformRequest(performance.exported.resolveURL(data), performance.ResourceType.Source);
|
35917 | options.request.collectResourceTiming = this._collectResourceTiming;
|
35918 | }
|
35919 | else {
|
35920 | options.data = JSON.stringify(data);
|
35921 | }
|
35922 | this._pendingLoads++;
|
35923 | this.fire(new performance.Event('dataloading', { dataType: 'source' }));
|
35924 | // target {this.type}.loadData rather than literally geojson.loadData,
|
35925 | // so that other geojson-like source types can easily reuse this
|
35926 | // implementation
|
35927 | this.actor.send(`${this.type}.loadData`, options, (err, result) => {
|
35928 | this._pendingLoads--;
|
35929 | if (this._removed || (result && result.abandoned)) {
|
35930 | return;
|
35931 | }
|
35932 | let resourceTiming = null;
|
35933 | if (result && result.resourceTiming && result.resourceTiming[this.id])
|
35934 | resourceTiming = result.resourceTiming[this.id].slice(0);
|
35935 | // Any `loadData` calls that piled up while we were processing
|
35936 | // this one will get coalesced into a single call when this
|
35937 | // 'coalesce' message is processed.
|
35938 | // We would self-send from the worker if we had access to its
|
35939 | // message queue. Waiting instead for the 'coalesce' to round-trip
|
35940 | // through the foreground just means we're throttling the worker
|
35941 | // to run at a little less than full-throttle.
|
35942 | this.actor.send(`${this.type}.coalesce`, { source: options.source }, null);
|
35943 | if (err) {
|
35944 | this.fire(new performance.ErrorEvent(err));
|
35945 | return;
|
35946 | }
|
35947 | const data = { dataType: 'source', sourceDataType };
|
35948 | if (this._collectResourceTiming && resourceTiming && resourceTiming.length > 0)
|
35949 | performance.extend(data, { resourceTiming });
|
35950 | this.fire(new performance.Event('data', data));
|
35951 | });
|
35952 | }
|
35953 | loaded() {
|
35954 | return this._pendingLoads === 0;
|
35955 | }
|
35956 | loadTile(tile, callback) {
|
35957 | const message = !tile.actor ? 'loadTile' : 'reloadTile';
|
35958 | tile.actor = this.actor;
|
35959 | const params = {
|
35960 | type: this.type,
|
35961 | uid: tile.uid,
|
35962 | tileID: tile.tileID,
|
35963 | zoom: tile.tileID.overscaledZ,
|
35964 | maxZoom: this.maxzoom,
|
35965 | tileSize: this.tileSize,
|
35966 | source: this.id,
|
35967 | pixelRatio: this.map.getPixelRatio(),
|
35968 | showCollisionBoxes: this.map.showCollisionBoxes,
|
35969 | promoteId: this.promoteId
|
35970 | };
|
35971 | tile.request = this.actor.send(message, params, (err, data) => {
|
35972 | delete tile.request;
|
35973 | tile.unloadVectorData();
|
35974 | if (tile.aborted) {
|
35975 | return callback(null);
|
35976 | }
|
35977 | if (err) {
|
35978 | return callback(err);
|
35979 | }
|
35980 | tile.loadVectorData(data, this.map.painter, message === 'reloadTile');
|
35981 | return callback(null);
|
35982 | });
|
35983 | }
|
35984 | abortTile(tile) {
|
35985 | if (tile.request) {
|
35986 | tile.request.cancel();
|
35987 | delete tile.request;
|
35988 | }
|
35989 | tile.aborted = true;
|
35990 | }
|
35991 | unloadTile(tile) {
|
35992 | tile.unloadVectorData();
|
35993 | this.actor.send('removeTile', { uid: tile.uid, type: this.type, source: this.id });
|
35994 | }
|
35995 | onRemove() {
|
35996 | this._removed = true;
|
35997 | this.actor.send('removeSource', { type: this.type, source: this.id });
|
35998 | }
|
35999 | serialize() {
|
36000 | return performance.extend({}, this._options, {
|
36001 | type: this.type,
|
36002 | data: this._data
|
36003 | });
|
36004 | }
|
36005 | hasTransition() {
|
36006 | return false;
|
36007 | }
|
36008 | }
|
36009 |
|
36010 | var rasterBoundsAttributes = performance.createLayout([
|
36011 | { name: 'a_pos', type: 'Int16', components: 2 },
|
36012 | { name: 'a_texture_pos', type: 'Int16', components: 2 }
|
36013 | ]);
|
36014 |
|
36015 | /**
|
36016 | * A data source containing an image.
|
36017 | * (See the [Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/#sources-image) for detailed documentation of options.)
|
36018 | *
|
36019 | * @example
|
36020 | * // add to map
|
36021 | * map.addSource('some id', {
|
36022 | * type: 'image',
|
36023 | * url: 'https://www.maplibre.org/images/foo.png',
|
36024 | * coordinates: [
|
36025 | * [-76.54, 39.18],
|
36026 | * [-76.52, 39.18],
|
36027 | * [-76.52, 39.17],
|
36028 | * [-76.54, 39.17]
|
36029 | * ]
|
36030 | * });
|
36031 | *
|
36032 | * // update coordinates
|
36033 | * var mySource = map.getSource('some id');
|
36034 | * mySource.setCoordinates([
|
36035 | * [-76.54335737228394, 39.18579907229748],
|
36036 | * [-76.52803659439087, 39.1838364847587],
|
36037 | * [-76.5295386314392, 39.17683392507606],
|
36038 | * [-76.54520273208618, 39.17876344106642]
|
36039 | * ]);
|
36040 | *
|
36041 | * // update url and coordinates simultaneously
|
36042 | * mySource.updateImage({
|
36043 | * url: 'https://www.maplibre.org/images/bar.png',
|
36044 | * coordinates: [
|
36045 | * [-76.54335737228394, 39.18579907229748],
|
36046 | * [-76.52803659439087, 39.1838364847587],
|
36047 | * [-76.5295386314392, 39.17683392507606],
|
36048 | * [-76.54520273208618, 39.17876344106642]
|
36049 | * ]
|
36050 | * })
|
36051 | *
|
36052 | * map.removeSource('some id'); // remove
|
36053 | */
|
36054 | class ImageSource extends performance.Evented {
|
36055 | /**
|
36056 | * @private
|
36057 | */
|
36058 | constructor(id, options, dispatcher, eventedParent) {
|
36059 | super();
|
36060 | this.id = id;
|
36061 | this.dispatcher = dispatcher;
|
36062 | this.coordinates = options.coordinates;
|
36063 | this.type = 'image';
|
36064 | this.minzoom = 0;
|
36065 | this.maxzoom = 22;
|
36066 | this.tileSize = 512;
|
36067 | this.tiles = {};
|
36068 | this._loaded = false;
|
36069 | this.setEventedParent(eventedParent);
|
36070 | this.options = options;
|
36071 | }
|
36072 | load(newCoordinates, successCallback) {
|
36073 | this._loaded = false;
|
36074 | this.fire(new performance.Event('dataloading', { dataType: 'source' }));
|
36075 | this.url = this.options.url;
|
36076 | performance.getImage(this.map._requestManager.transformRequest(this.url, performance.ResourceType.Image), (err, image) => {
|
36077 | this._loaded = true;
|
36078 | if (err) {
|
36079 | this.fire(new performance.ErrorEvent(err));
|
36080 | }
|
36081 | else if (image) {
|
36082 | this.image = image;
|
36083 | if (newCoordinates) {
|
36084 | this.coordinates = newCoordinates;
|
36085 | }
|
36086 | if (successCallback) {
|
36087 | successCallback();
|
36088 | }
|
36089 | this._finishLoading();
|
36090 | }
|
36091 | });
|
36092 | }
|
36093 | loaded() {
|
36094 | return this._loaded;
|
36095 | }
|
36096 | /**
|
36097 | * Updates the image URL and, optionally, the coordinates. To avoid having the image flash after changing,
|
36098 | * set the `raster-fade-duration` paint property on the raster layer to 0.
|
36099 | *
|
36100 | * @param {Object} options Options object.
|
36101 | * @param {string} [options.url] Required image URL.
|
36102 | * @param {Array<Array<number>>} [options.coordinates] Four geographical coordinates,
|
36103 | * represented as arrays of longitude and latitude numbers, which define the corners of the image.
|
36104 | * The coordinates start at the top left corner of the image and proceed in clockwise order.
|
36105 | * They do not have to represent a rectangle.
|
36106 | * @returns {ImageSource} this
|
36107 | */
|
36108 | updateImage(options) {
|
36109 | if (!this.image || !options.url) {
|
36110 | return this;
|
36111 | }
|
36112 | this.options.url = options.url;
|
36113 | this.load(options.coordinates, () => { this.texture = null; });
|
36114 | return this;
|
36115 | }
|
36116 | _finishLoading() {
|
36117 | if (this.map) {
|
36118 | this.setCoordinates(this.coordinates);
|
36119 | this.fire(new performance.Event('data', { dataType: 'source', sourceDataType: 'metadata' }));
|
36120 | }
|
36121 | }
|
36122 | onAdd(map) {
|
36123 | this.map = map;
|
36124 | this.load();
|
36125 | }
|
36126 | /**
|
36127 | * Sets the image's coordinates and re-renders the map.
|
36128 | *
|
36129 | * @param {Array<Array<number>>} coordinates Four geographical coordinates,
|
36130 | * represented as arrays of longitude and latitude numbers, which define the corners of the image.
|
36131 | * The coordinates start at the top left corner of the image and proceed in clockwise order.
|
36132 | * They do not have to represent a rectangle.
|
36133 | * @returns {ImageSource} this
|
36134 | */
|
36135 | setCoordinates(coordinates) {
|
36136 | this.coordinates = coordinates;
|
36137 | // Calculate which mercator tile is suitable for rendering the video in
|
36138 | // and create a buffer with the corner coordinates. These coordinates
|
36139 | // may be outside the tile, because raster tiles aren't clipped when rendering.
|
36140 | // transform the geo coordinates into (zoom 0) tile space coordinates
|
36141 | const cornerCoords = coordinates.map(performance.MercatorCoordinate.fromLngLat);
|
36142 | // Compute the coordinates of the tile we'll use to hold this image's
|
36143 | // render data
|
36144 | this.tileID = getCoordinatesCenterTileID(cornerCoords);
|
36145 | // Constrain min/max zoom to our tile's zoom level in order to force
|
36146 | // SourceCache to request this tile (no matter what the map's zoom
|
36147 | // level)
|
36148 | this.minzoom = this.maxzoom = this.tileID.z;
|
36149 | // Transform the corner coordinates into the coordinate space of our
|
36150 | // tile.
|
36151 | const tileCoords = cornerCoords.map((coord) => this.tileID.getTilePoint(coord)._round());
|
36152 | this._boundsArray = new performance.RasterBoundsArray();
|
36153 | this._boundsArray.emplaceBack(tileCoords[0].x, tileCoords[0].y, 0, 0);
|
36154 | this._boundsArray.emplaceBack(tileCoords[1].x, tileCoords[1].y, performance.EXTENT, 0);
|
36155 | this._boundsArray.emplaceBack(tileCoords[3].x, tileCoords[3].y, 0, performance.EXTENT);
|
36156 | this._boundsArray.emplaceBack(tileCoords[2].x, tileCoords[2].y, performance.EXTENT, performance.EXTENT);
|
36157 | if (this.boundsBuffer) {
|
36158 | this.boundsBuffer.destroy();
|
36159 | delete this.boundsBuffer;
|
36160 | }
|
36161 | this.fire(new performance.Event('data', { dataType: 'source', sourceDataType: 'content' }));
|
36162 | return this;
|
36163 | }
|
36164 | prepare() {
|
36165 | if (Object.keys(this.tiles).length === 0 || !this.image) {
|
36166 | return;
|
36167 | }
|
36168 | const context = this.map.painter.context;
|
36169 | const gl = context.gl;
|
36170 | if (!this.boundsBuffer) {
|
36171 | this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members);
|
36172 | }
|
36173 | if (!this.boundsSegments) {
|
36174 | this.boundsSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2);
|
36175 | }
|
36176 | if (!this.texture) {
|
36177 | this.texture = new Texture(context, this.image, gl.RGBA);
|
36178 | this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
|
36179 | }
|
36180 | for (const w in this.tiles) {
|
36181 | const tile = this.tiles[w];
|
36182 | if (tile.state !== 'loaded') {
|
36183 | tile.state = 'loaded';
|
36184 | tile.texture = this.texture;
|
36185 | }
|
36186 | }
|
36187 | }
|
36188 | loadTile(tile, callback) {
|
36189 | // We have a single tile -- whoose coordinates are this.tileID -- that
|
36190 | // covers the image we want to render. If that's the one being
|
36191 | // requested, set it up with the image; otherwise, mark the tile as
|
36192 | // `errored` to indicate that we have no data for it.
|
36193 | // If the world wraps, we may have multiple "wrapped" copies of the
|
36194 | // single tile.
|
36195 | if (this.tileID && this.tileID.equals(tile.tileID.canonical)) {
|
36196 | this.tiles[String(tile.tileID.wrap)] = tile;
|
36197 | tile.buckets = {};
|
36198 | callback(null);
|
36199 | }
|
36200 | else {
|
36201 | tile.state = 'errored';
|
36202 | callback(null);
|
36203 | }
|
36204 | }
|
36205 | serialize() {
|
36206 | return {
|
36207 | type: 'image',
|
36208 | url: this.options.url,
|
36209 | coordinates: this.coordinates
|
36210 | };
|
36211 | }
|
36212 | hasTransition() {
|
36213 | return false;
|
36214 | }
|
36215 | }
|
36216 | /**
|
36217 | * Given a list of coordinates, get their center as a coordinate.
|
36218 | *
|
36219 | * @returns centerpoint
|
36220 | * @private
|
36221 | */
|
36222 | function getCoordinatesCenterTileID(coords) {
|
36223 | let minX = Infinity;
|
36224 | let minY = Infinity;
|
36225 | let maxX = -Infinity;
|
36226 | let maxY = -Infinity;
|
36227 | for (const coord of coords) {
|
36228 | minX = Math.min(minX, coord.x);
|
36229 | minY = Math.min(minY, coord.y);
|
36230 | maxX = Math.max(maxX, coord.x);
|
36231 | maxY = Math.max(maxY, coord.y);
|
36232 | }
|
36233 | const dx = maxX - minX;
|
36234 | const dy = maxY - minY;
|
36235 | const dMax = Math.max(dx, dy);
|
36236 | const zoom = Math.max(0, Math.floor(-Math.log(dMax) / Math.LN2));
|
36237 | const tilesAtZoom = Math.pow(2, zoom);
|
36238 | return new performance.CanonicalTileID(zoom, Math.floor((minX + maxX) / 2 * tilesAtZoom), Math.floor((minY + maxY) / 2 * tilesAtZoom));
|
36239 | }
|
36240 |
|
36241 | /**
|
36242 | * A data source containing video.
|
36243 | * (See the [Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/#sources-video) for detailed documentation of options.)
|
36244 | *
|
36245 | * @example
|
36246 | * // add to map
|
36247 | * map.addSource('some id', {
|
36248 | * type: 'video',
|
36249 | * url: [
|
36250 | * 'https://www.mapbox.com/blog/assets/baltimore-smoke.mp4',
|
36251 | * 'https://www.mapbox.com/blog/assets/baltimore-smoke.webm'
|
36252 | * ],
|
36253 | * coordinates: [
|
36254 | * [-76.54, 39.18],
|
36255 | * [-76.52, 39.18],
|
36256 | * [-76.52, 39.17],
|
36257 | * [-76.54, 39.17]
|
36258 | * ]
|
36259 | * });
|
36260 | *
|
36261 | * // update
|
36262 | * var mySource = map.getSource('some id');
|
36263 | * mySource.setCoordinates([
|
36264 | * [-76.54335737228394, 39.18579907229748],
|
36265 | * [-76.52803659439087, 39.1838364847587],
|
36266 | * [-76.5295386314392, 39.17683392507606],
|
36267 | * [-76.54520273208618, 39.17876344106642]
|
36268 | * ]);
|
36269 | *
|
36270 | * map.removeSource('some id'); // remove
|
36271 | * @see [Add a video](https://maplibre.org/maplibre-gl-js-docs/example/video-on-a-map/)
|
36272 | */
|
36273 | class VideoSource extends ImageSource {
|
36274 | /**
|
36275 | * @private
|
36276 | */
|
36277 | constructor(id, options, dispatcher, eventedParent) {
|
36278 | super(id, options, dispatcher, eventedParent);
|
36279 | this.roundZoom = true;
|
36280 | this.type = 'video';
|
36281 | this.options = options;
|
36282 | }
|
36283 | load() {
|
36284 | this._loaded = false;
|
36285 | const options = this.options;
|
36286 | this.urls = [];
|
36287 | for (const url of options.urls) {
|
36288 | this.urls.push(this.map._requestManager.transformRequest(url, performance.ResourceType.Source).url);
|
36289 | }
|
36290 | performance.getVideo(this.urls, (err, video) => {
|
36291 | this._loaded = true;
|
36292 | if (err) {
|
36293 | this.fire(new performance.ErrorEvent(err));
|
36294 | }
|
36295 | else if (video) {
|
36296 | this.video = video;
|
36297 | this.video.loop = true;
|
36298 | // Start repainting when video starts playing. hasTransition() will then return
|
36299 | // true to trigger additional frames as long as the videos continues playing.
|
36300 | this.video.addEventListener('playing', () => {
|
36301 | this.map.triggerRepaint();
|
36302 | });
|
36303 | if (this.map) {
|
36304 | this.video.play();
|
36305 | }
|
36306 | this._finishLoading();
|
36307 | }
|
36308 | });
|
36309 | }
|
36310 | /**
|
36311 | * Pauses the video.
|
36312 | */
|
36313 | pause() {
|
36314 | if (this.video) {
|
36315 | this.video.pause();
|
36316 | }
|
36317 | }
|
36318 | /**
|
36319 | * Plays the video.
|
36320 | */
|
36321 | play() {
|
36322 | if (this.video) {
|
36323 | this.video.play();
|
36324 | }
|
36325 | }
|
36326 | /**
|
36327 | * Sets playback to a timestamp, in seconds.
|
36328 | * @private
|
36329 | */
|
36330 | seek(seconds) {
|
36331 | if (this.video) {
|
36332 | const seekableRange = this.video.seekable;
|
36333 | if (seconds < seekableRange.start(0) || seconds > seekableRange.end(0)) {
|
36334 | this.fire(new performance.ErrorEvent(new performance.ValidationError(`sources.${this.id}`, null, `Playback for this video can be set only between the ${seekableRange.start(0)} and ${seekableRange.end(0)}-second mark.`)));
|
36335 | }
|
36336 | else
|
36337 | this.video.currentTime = seconds;
|
36338 | }
|
36339 | }
|
36340 | /**
|
36341 | * Returns the HTML `video` element.
|
36342 | *
|
36343 | * @returns {HTMLVideoElement} The HTML `video` element.
|
36344 | */
|
36345 | getVideo() {
|
36346 | return this.video;
|
36347 | }
|
36348 | onAdd(map) {
|
36349 | if (this.map)
|
36350 | return;
|
36351 | this.map = map;
|
36352 | this.load();
|
36353 | if (this.video) {
|
36354 | this.video.play();
|
36355 | this.setCoordinates(this.coordinates);
|
36356 | }
|
36357 | }
|
36358 | /**
|
36359 | * Sets the video's coordinates and re-renders the map.
|
36360 | *
|
36361 | * @method setCoordinates
|
36362 | * @instance
|
36363 | * @memberof VideoSource
|
36364 | * @returns {VideoSource} this
|
36365 | */
|
36366 | // setCoordinates inherited from ImageSource
|
36367 | prepare() {
|
36368 | if (Object.keys(this.tiles).length === 0 || this.video.readyState < 2) {
|
36369 | return; // not enough data for current position
|
36370 | }
|
36371 | const context = this.map.painter.context;
|
36372 | const gl = context.gl;
|
36373 | if (!this.boundsBuffer) {
|
36374 | this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members);
|
36375 | }
|
36376 | if (!this.boundsSegments) {
|
36377 | this.boundsSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2);
|
36378 | }
|
36379 | if (!this.texture) {
|
36380 | this.texture = new Texture(context, this.video, gl.RGBA);
|
36381 | this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
|
36382 | }
|
36383 | else if (!this.video.paused) {
|
36384 | this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
|
36385 | gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video);
|
36386 | }
|
36387 | for (const w in this.tiles) {
|
36388 | const tile = this.tiles[w];
|
36389 | if (tile.state !== 'loaded') {
|
36390 | tile.state = 'loaded';
|
36391 | tile.texture = this.texture;
|
36392 | }
|
36393 | }
|
36394 | }
|
36395 | serialize() {
|
36396 | return {
|
36397 | type: 'video',
|
36398 | urls: this.urls,
|
36399 | coordinates: this.coordinates
|
36400 | };
|
36401 | }
|
36402 | hasTransition() {
|
36403 | return this.video && !this.video.paused;
|
36404 | }
|
36405 | }
|
36406 |
|
36407 | /**
|
36408 | * Options to add a canvas source type to the map.
|
36409 | *
|
36410 | * @typedef {Object} CanvasSourceOptions
|
36411 | * @property {string} type Source type. Must be `"canvas"`.
|
36412 | * @property {string|HTMLCanvasElement} canvas Canvas source from which to read pixels. Can be a string representing the ID of the canvas element, or the `HTMLCanvasElement` itself.
|
36413 | * @property {Array<Array<number>>} coordinates Four geographical coordinates denoting where to place the corners of the canvas, specified in `[longitude, latitude]` pairs.
|
36414 | * @property {boolean} [animate=true] Whether the canvas source is animated. If the canvas is static (i.e. pixels do not need to be re-read on every frame), `animate` should be set to `false` to improve performance.
|
36415 | */
|
36416 | /**
|
36417 | * A data source containing the contents of an HTML canvas. See {@link CanvasSourceOptions} for detailed documentation of options.
|
36418 | *
|
36419 | * @example
|
36420 | * // add to map
|
36421 | * map.addSource('some id', {
|
36422 | * type: 'canvas',
|
36423 | * canvas: 'idOfMyHTMLCanvas',
|
36424 | * animate: true,
|
36425 | * coordinates: [
|
36426 | * [-76.54, 39.18],
|
36427 | * [-76.52, 39.18],
|
36428 | * [-76.52, 39.17],
|
36429 | * [-76.54, 39.17]
|
36430 | * ]
|
36431 | * });
|
36432 | *
|
36433 | * // update
|
36434 | * var mySource = map.getSource('some id');
|
36435 | * mySource.setCoordinates([
|
36436 | * [-76.54335737228394, 39.18579907229748],
|
36437 | * [-76.52803659439087, 39.1838364847587],
|
36438 | * [-76.5295386314392, 39.17683392507606],
|
36439 | * [-76.54520273208618, 39.17876344106642]
|
36440 | * ]);
|
36441 | *
|
36442 | * map.removeSource('some id'); // remove
|
36443 | */
|
36444 | class CanvasSource extends ImageSource {
|
36445 | /**
|
36446 | * @private
|
36447 | */
|
36448 | constructor(id, options, dispatcher, eventedParent) {
|
36449 | super(id, options, dispatcher, eventedParent);
|
36450 | // We build in some validation here, since canvas sources aren't included in the style spec:
|
36451 | if (!options.coordinates) {
|
36452 | this.fire(new performance.ErrorEvent(new performance.ValidationError(`sources.${id}`, null, 'missing required property "coordinates"')));
|
36453 | }
|
36454 | else if (!Array.isArray(options.coordinates) || options.coordinates.length !== 4 ||
|
36455 | options.coordinates.some(c => !Array.isArray(c) || c.length !== 2 || c.some(l => typeof l !== 'number'))) {
|
36456 | this.fire(new performance.ErrorEvent(new performance.ValidationError(`sources.${id}`, null, '"coordinates" property must be an array of 4 longitude/latitude array pairs')));
|
36457 | }
|
36458 | if (options.animate && typeof options.animate !== 'boolean') {
|
36459 | this.fire(new performance.ErrorEvent(new performance.ValidationError(`sources.${id}`, null, 'optional "animate" property must be a boolean value')));
|
36460 | }
|
36461 | if (!options.canvas) {
|
36462 | this.fire(new performance.ErrorEvent(new performance.ValidationError(`sources.${id}`, null, 'missing required property "canvas"')));
|
36463 | }
|
36464 | else if (typeof options.canvas !== 'string' && !(options.canvas instanceof HTMLCanvasElement)) {
|
36465 | this.fire(new performance.ErrorEvent(new performance.ValidationError(`sources.${id}`, null, '"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance')));
|
36466 | }
|
36467 | this.options = options;
|
36468 | this.animate = options.animate !== undefined ? options.animate : true;
|
36469 | }
|
36470 | /**
|
36471 | * Enables animation. The image will be copied from the canvas to the map on each frame.
|
36472 | * @method play
|
36473 | * @instance
|
36474 | * @memberof CanvasSource
|
36475 | */
|
36476 | /**
|
36477 | * Disables animation. The map will display a static copy of the canvas image.
|
36478 | * @method pause
|
36479 | * @instance
|
36480 | * @memberof CanvasSource
|
36481 | */
|
36482 | load() {
|
36483 | this._loaded = true;
|
36484 | if (!this.canvas) {
|
36485 | this.canvas = (this.options.canvas instanceof HTMLCanvasElement) ?
|
36486 | this.options.canvas :
|
36487 | document.getElementById(this.options.canvas);
|
36488 | // cast to HTMLCanvasElement in else of ternary
|
36489 | // should we do a safety check and throw if it's not actually HTMLCanvasElement?
|
36490 | }
|
36491 | this.width = this.canvas.width;
|
36492 | this.height = this.canvas.height;
|
36493 | if (this._hasInvalidDimensions()) {
|
36494 | this.fire(new performance.ErrorEvent(new Error('Canvas dimensions cannot be less than or equal to zero.')));
|
36495 | return;
|
36496 | }
|
36497 | this.play = function () {
|
36498 | this._playing = true;
|
36499 | this.map.triggerRepaint();
|
36500 | };
|
36501 | this.pause = function () {
|
36502 | if (this._playing) {
|
36503 | this.prepare();
|
36504 | this._playing = false;
|
36505 | }
|
36506 | };
|
36507 | this._finishLoading();
|
36508 | }
|
36509 | /**
|
36510 | * Returns the HTML `canvas` element.
|
36511 | *
|
36512 | * @returns {HTMLCanvasElement} The HTML `canvas` element.
|
36513 | */
|
36514 | getCanvas() {
|
36515 | return this.canvas;
|
36516 | }
|
36517 | onAdd(map) {
|
36518 | this.map = map;
|
36519 | this.load();
|
36520 | if (this.canvas) {
|
36521 | if (this.animate)
|
36522 | this.play();
|
36523 | }
|
36524 | }
|
36525 | onRemove() {
|
36526 | this.pause();
|
36527 | }
|
36528 | // /**
|
36529 | // * Sets the canvas's coordinates and re-renders the map.
|
36530 | // *
|
36531 | // * @method setCoordinates
|
36532 | // * @instance
|
36533 | // * @memberof CanvasSource
|
36534 | // * @param {Array<Array<number>>} coordinates Four geographical coordinates,
|
36535 | // * represented as arrays of longitude and latitude numbers, which define the corners of the canvas.
|
36536 | // * The coordinates start at the top left corner of the canvas and proceed in clockwise order.
|
36537 | // * They do not have to represent a rectangle.
|
36538 | // * @returns {CanvasSource} this
|
36539 | // */
|
36540 | // setCoordinates inherited from ImageSource
|
36541 | prepare() {
|
36542 | let resize = false;
|
36543 | if (this.canvas.width !== this.width) {
|
36544 | this.width = this.canvas.width;
|
36545 | resize = true;
|
36546 | }
|
36547 | if (this.canvas.height !== this.height) {
|
36548 | this.height = this.canvas.height;
|
36549 | resize = true;
|
36550 | }
|
36551 | if (this._hasInvalidDimensions())
|
36552 | return;
|
36553 | if (Object.keys(this.tiles).length === 0)
|
36554 | return; // not enough data for current position
|
36555 | const context = this.map.painter.context;
|
36556 | const gl = context.gl;
|
36557 | if (!this.boundsBuffer) {
|
36558 | this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members);
|
36559 | }
|
36560 | if (!this.boundsSegments) {
|
36561 | this.boundsSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2);
|
36562 | }
|
36563 | if (!this.texture) {
|
36564 | this.texture = new Texture(context, this.canvas, gl.RGBA, { premultiply: true });
|
36565 | }
|
36566 | else if (resize || this._playing) {
|
36567 | this.texture.update(this.canvas, { premultiply: true });
|
36568 | }
|
36569 | for (const w in this.tiles) {
|
36570 | const tile = this.tiles[w];
|
36571 | if (tile.state !== 'loaded') {
|
36572 | tile.state = 'loaded';
|
36573 | tile.texture = this.texture;
|
36574 | }
|
36575 | }
|
36576 | }
|
36577 | serialize() {
|
36578 | return {
|
36579 | type: 'canvas',
|
36580 | coordinates: this.coordinates
|
36581 | };
|
36582 | }
|
36583 | hasTransition() {
|
36584 | return this._playing;
|
36585 | }
|
36586 | _hasInvalidDimensions() {
|
36587 | for (const x of [this.canvas.width, this.canvas.height]) {
|
36588 | if (isNaN(x) || x <= 0)
|
36589 | return true;
|
36590 | }
|
36591 | return false;
|
36592 | }
|
36593 | }
|
36594 |
|
36595 | const sourceTypes = {
|
36596 | vector: VectorTileSource,
|
36597 | raster: RasterTileSource,
|
36598 | 'raster-dem': RasterDEMTileSource,
|
36599 | geojson: GeoJSONSource,
|
36600 | video: VideoSource,
|
36601 | image: ImageSource,
|
36602 | canvas: CanvasSource
|
36603 | };
|
36604 | /*
|
36605 | * Creates a tiled data source instance given an options object.
|
36606 | *
|
36607 | * @param id
|
36608 | * @param {Object} source A source definition object compliant with
|
36609 | * [`maplibre-gl-style-spec`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#sources) or, for a third-party source type,
|
36610 | * with that type's requirements.
|
36611 | * @param {Dispatcher} dispatcher
|
36612 | * @returns {Source}
|
36613 | */
|
36614 | const create = function (id, specification, dispatcher, eventedParent) {
|
36615 | const source = new sourceTypes[specification.type](id, specification, dispatcher, eventedParent);
|
36616 | if (source.id !== id) {
|
36617 | throw new Error(`Expected Source id to be ${id} instead of ${source.id}`);
|
36618 | }
|
36619 | performance.bindAll(['load', 'abort', 'unload', 'serialize', 'prepare'], source);
|
36620 | return source;
|
36621 | };
|
36622 | const getSourceType = function (name) {
|
36623 | return sourceTypes[name];
|
36624 | };
|
36625 | const setSourceType = function (name, type) {
|
36626 | sourceTypes[name] = type;
|
36627 | };
|
36628 |
|
36629 | /*
|
36630 | * Returns a matrix that can be used to convert from tile coordinates to viewport pixel coordinates.
|
36631 | */
|
36632 | function getPixelPosMatrix(transform, tileID) {
|
36633 | const t = performance.create();
|
36634 | performance.translate(t, t, [1, 1, 0]);
|
36635 | performance.scale(t, t, [transform.width * 0.5, transform.height * 0.5, 1]);
|
36636 | return performance.multiply(t, t, transform.calculatePosMatrix(tileID.toUnwrapped()));
|
36637 | }
|
36638 | function queryIncludes3DLayer(layers, styleLayers, sourceID) {
|
36639 | if (layers) {
|
36640 | for (const layerID of layers) {
|
36641 | const layer = styleLayers[layerID];
|
36642 | if (layer && layer.source === sourceID && layer.type === 'fill-extrusion') {
|
36643 | return true;
|
36644 | }
|
36645 | }
|
36646 | }
|
36647 | else {
|
36648 | for (const key in styleLayers) {
|
36649 | const layer = styleLayers[key];
|
36650 | if (layer.source === sourceID && layer.type === 'fill-extrusion') {
|
36651 | return true;
|
36652 | }
|
36653 | }
|
36654 | }
|
36655 | return false;
|
36656 | }
|
36657 | function queryRenderedFeatures(sourceCache, styleLayers, serializedLayers, queryGeometry, params, transform) {
|
36658 | const has3DLayer = queryIncludes3DLayer(params && params.layers, styleLayers, sourceCache.id);
|
36659 | const maxPitchScaleFactor = transform.maxPitchScaleFactor();
|
36660 | const tilesIn = sourceCache.tilesIn(queryGeometry, maxPitchScaleFactor, has3DLayer);
|
36661 | tilesIn.sort(sortTilesIn);
|
36662 | const renderedFeatureLayers = [];
|
36663 | for (const tileIn of tilesIn) {
|
36664 | renderedFeatureLayers.push({
|
36665 | wrappedTileID: tileIn.tileID.wrapped().key,
|
36666 | queryResults: tileIn.tile.queryRenderedFeatures(styleLayers, serializedLayers, sourceCache._state, tileIn.queryGeometry, tileIn.cameraQueryGeometry, tileIn.scale, params, transform, maxPitchScaleFactor, getPixelPosMatrix(sourceCache.transform, tileIn.tileID))
|
36667 | });
|
36668 | }
|
36669 | const result = mergeRenderedFeatureLayers(renderedFeatureLayers);
|
36670 | // Merge state from SourceCache into the results
|
36671 | for (const layerID in result) {
|
36672 | result[layerID].forEach((featureWrapper) => {
|
36673 | const feature = featureWrapper.feature;
|
36674 | const state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id);
|
36675 | feature.source = feature.layer.source;
|
36676 | if (feature.layer['source-layer']) {
|
36677 | feature.sourceLayer = feature.layer['source-layer'];
|
36678 | }
|
36679 | feature.state = state;
|
36680 | });
|
36681 | }
|
36682 | return result;
|
36683 | }
|
36684 | function queryRenderedSymbols(styleLayers, serializedLayers, sourceCaches, queryGeometry, params, collisionIndex, retainedQueryData) {
|
36685 | const result = {};
|
36686 | const renderedSymbols = collisionIndex.queryRenderedSymbols(queryGeometry);
|
36687 | const bucketQueryData = [];
|
36688 | for (const bucketInstanceId of Object.keys(renderedSymbols).map(Number)) {
|
36689 | bucketQueryData.push(retainedQueryData[bucketInstanceId]);
|
36690 | }
|
36691 | bucketQueryData.sort(sortTilesIn);
|
36692 | for (const queryData of bucketQueryData) {
|
36693 | const bucketSymbols = queryData.featureIndex.lookupSymbolFeatures(renderedSymbols[queryData.bucketInstanceId], serializedLayers, queryData.bucketIndex, queryData.sourceLayerIndex, params.filter, params.layers, params.availableImages, styleLayers);
|
36694 | for (const layerID in bucketSymbols) {
|
36695 | const resultFeatures = result[layerID] = result[layerID] || [];
|
36696 | const layerSymbols = bucketSymbols[layerID];
|
36697 | layerSymbols.sort((a, b) => {
|
36698 | // Match topDownFeatureComparator from FeatureIndex, but using
|
36699 | // most recent sorting of features from bucket.sortFeatures
|
36700 | const featureSortOrder = queryData.featureSortOrder;
|
36701 | if (featureSortOrder) {
|
36702 | // queryRenderedSymbols documentation says we'll return features in
|
36703 | // "top-to-bottom" rendering order (aka last-to-first).
|
36704 | // Actually there can be multiple symbol instances per feature, so
|
36705 | // we sort each feature based on the first matching symbol instance.
|
36706 | const sortedA = featureSortOrder.indexOf(a.featureIndex);
|
36707 | const sortedB = featureSortOrder.indexOf(b.featureIndex);
|
36708 | performance.assert(sortedA >= 0);
|
36709 | performance.assert(sortedB >= 0);
|
36710 | return sortedB - sortedA;
|
36711 | }
|
36712 | else {
|
36713 | // Bucket hasn't been re-sorted based on angle, so use the
|
36714 | // reverse of the order the features appeared in the data.
|
36715 | return b.featureIndex - a.featureIndex;
|
36716 | }
|
36717 | });
|
36718 | for (const symbolFeature of layerSymbols) {
|
36719 | resultFeatures.push(symbolFeature);
|
36720 | }
|
36721 | }
|
36722 | }
|
36723 | // Merge state from SourceCache into the results
|
36724 | for (const layerName in result) {
|
36725 | result[layerName].forEach((featureWrapper) => {
|
36726 | const feature = featureWrapper.feature;
|
36727 | const layer = styleLayers[layerName];
|
36728 | const sourceCache = sourceCaches[layer.source];
|
36729 | const state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id);
|
36730 | feature.source = feature.layer.source;
|
36731 | if (feature.layer['source-layer']) {
|
36732 | feature.sourceLayer = feature.layer['source-layer'];
|
36733 | }
|
36734 | feature.state = state;
|
36735 | });
|
36736 | }
|
36737 | return result;
|
36738 | }
|
36739 | function querySourceFeatures(sourceCache, params) {
|
36740 | const tiles = sourceCache.getRenderableIds().map((id) => {
|
36741 | return sourceCache.getTileByID(id);
|
36742 | });
|
36743 | const result = [];
|
36744 | const dataTiles = {};
|
36745 | for (let i = 0; i < tiles.length; i++) {
|
36746 | const tile = tiles[i];
|
36747 | const dataID = tile.tileID.canonical.key;
|
36748 | if (!dataTiles[dataID]) {
|
36749 | dataTiles[dataID] = true;
|
36750 | tile.querySourceFeatures(result, params);
|
36751 | }
|
36752 | }
|
36753 | return result;
|
36754 | }
|
36755 | function sortTilesIn(a, b) {
|
36756 | const idA = a.tileID;
|
36757 | const idB = b.tileID;
|
36758 | return (idA.overscaledZ - idB.overscaledZ) || (idA.canonical.y - idB.canonical.y) || (idA.wrap - idB.wrap) || (idA.canonical.x - idB.canonical.x);
|
36759 | }
|
36760 | function mergeRenderedFeatureLayers(tiles) {
|
36761 | // Merge results from all tiles, but if two tiles share the same
|
36762 | // wrapped ID, don't duplicate features between the two tiles
|
36763 | const result = {};
|
36764 | const wrappedIDLayerMap = {};
|
36765 | for (const tile of tiles) {
|
36766 | const queryResults = tile.queryResults;
|
36767 | const wrappedID = tile.wrappedTileID;
|
36768 | const wrappedIDLayers = wrappedIDLayerMap[wrappedID] = wrappedIDLayerMap[wrappedID] || {};
|
36769 | for (const layerID in queryResults) {
|
36770 | const tileFeatures = queryResults[layerID];
|
36771 | const wrappedIDFeatures = wrappedIDLayers[layerID] = wrappedIDLayers[layerID] || {};
|
36772 | const resultFeatures = result[layerID] = result[layerID] || [];
|
36773 | for (const tileFeature of tileFeatures) {
|
36774 | if (!wrappedIDFeatures[tileFeature.featureIndex]) {
|
36775 | wrappedIDFeatures[tileFeature.featureIndex] = true;
|
36776 | resultFeatures.push(tileFeature);
|
36777 | }
|
36778 | }
|
36779 | }
|
36780 | }
|
36781 | return result;
|
36782 | }
|
36783 |
|
36784 | function deserialize(input, style) {
|
36785 | const output = {};
|
36786 | // Guard against the case where the map's style has been set to null while
|
36787 | // this bucket has been parsing.
|
36788 | if (!style)
|
36789 | return output;
|
36790 | for (const bucket of input) {
|
36791 | const layers = bucket.layerIds
|
36792 | .map((id) => style.getLayer(id))
|
36793 | .filter(Boolean);
|
36794 | if (layers.length === 0) {
|
36795 | continue;
|
36796 | }
|
36797 | // look up StyleLayer objects from layer ids (since we don't
|
36798 | // want to waste time serializing/copying them from the worker)
|
36799 | bucket.layers = layers;
|
36800 | if (bucket.stateDependentLayerIds) {
|
36801 | bucket.stateDependentLayers = bucket.stateDependentLayerIds.map((lId) => layers.filter((l) => l.id === lId)[0]);
|
36802 | }
|
36803 | for (const layer of layers) {
|
36804 | output[layer.id] = bucket;
|
36805 | }
|
36806 | }
|
36807 | return output;
|
36808 | }
|
36809 |
|
36810 | const CLOCK_SKEW_RETRY_TIMEOUT = 30000;
|
36811 | /**
|
36812 | * A tile object is the combination of a Coordinate, which defines
|
36813 | * its place, as well as a unique ID and data tracking for its content
|
36814 | *
|
36815 | * @private
|
36816 | */
|
36817 | class Tile {
|
36818 | /**
|
36819 | * @param {OverscaledTileID} tileID
|
36820 | * @param size
|
36821 | * @private
|
36822 | */
|
36823 | constructor(tileID, size) {
|
36824 | this.tileID = tileID;
|
36825 | this.uid = performance.uniqueId();
|
36826 | this.uses = 0;
|
36827 | this.tileSize = size;
|
36828 | this.buckets = {};
|
36829 | this.expirationTime = null;
|
36830 | this.queryPadding = 0;
|
36831 | this.hasSymbolBuckets = false;
|
36832 | this.hasRTLText = false;
|
36833 | this.dependencies = {};
|
36834 | // Counts the number of times a response was already expired when
|
36835 | // received. We're using this to add a delay when making a new request
|
36836 | // so we don't have to keep retrying immediately in case of a server
|
36837 | // serving expired tiles.
|
36838 | this.expiredRequestCount = 0;
|
36839 | this.state = 'loading';
|
36840 | }
|
36841 | registerFadeDuration(duration) {
|
36842 | const fadeEndTime = duration + this.timeAdded;
|
36843 | if (fadeEndTime < performance.exported.now())
|
36844 | return;
|
36845 | if (this.fadeEndTime && fadeEndTime < this.fadeEndTime)
|
36846 | return;
|
36847 | this.fadeEndTime = fadeEndTime;
|
36848 | }
|
36849 | wasRequested() {
|
36850 | return this.state === 'errored' || this.state === 'loaded' || this.state === 'reloading';
|
36851 | }
|
36852 | /**
|
36853 | * Given a data object with a 'buffers' property, load it into
|
36854 | * this tile's elementGroups and buffers properties and set loaded
|
36855 | * to true. If the data is null, like in the case of an empty
|
36856 | * GeoJSON tile, no-op but still set loaded to true.
|
36857 | * @param {Object} data
|
36858 | * @param painter
|
36859 | * @returns {undefined}
|
36860 | * @private
|
36861 | */
|
36862 | loadVectorData(data, painter, justReloaded) {
|
36863 | if (this.hasData()) {
|
36864 | this.unloadVectorData();
|
36865 | }
|
36866 | this.state = 'loaded';
|
36867 | // empty GeoJSON tile
|
36868 | if (!data) {
|
36869 | this.collisionBoxArray = new performance.CollisionBoxArray();
|
36870 | return;
|
36871 | }
|
36872 | if (data.featureIndex) {
|
36873 | this.latestFeatureIndex = data.featureIndex;
|
36874 | if (data.rawTileData) {
|
36875 | // Only vector tiles have rawTileData, and they won't update it for
|
36876 | // 'reloadTile'
|
36877 | this.latestRawTileData = data.rawTileData;
|
36878 | this.latestFeatureIndex.rawTileData = data.rawTileData;
|
36879 | }
|
36880 | else if (this.latestRawTileData) {
|
36881 | // If rawTileData hasn't updated, hold onto a pointer to the last
|
36882 | // one we received
|
36883 | this.latestFeatureIndex.rawTileData = this.latestRawTileData;
|
36884 | }
|
36885 | }
|
36886 | this.collisionBoxArray = data.collisionBoxArray;
|
36887 | this.buckets = deserialize(data.buckets, painter.style);
|
36888 | this.hasSymbolBuckets = false;
|
36889 | for (const id in this.buckets) {
|
36890 | const bucket = this.buckets[id];
|
36891 | if (bucket instanceof performance.SymbolBucket) {
|
36892 | this.hasSymbolBuckets = true;
|
36893 | if (justReloaded) {
|
36894 | bucket.justReloaded = true;
|
36895 | }
|
36896 | else {
|
36897 | break;
|
36898 | }
|
36899 | }
|
36900 | }
|
36901 | this.hasRTLText = false;
|
36902 | if (this.hasSymbolBuckets) {
|
36903 | for (const id in this.buckets) {
|
36904 | const bucket = this.buckets[id];
|
36905 | if (bucket instanceof performance.SymbolBucket) {
|
36906 | if (bucket.hasRTLText) {
|
36907 | this.hasRTLText = true;
|
36908 | performance.lazyLoadRTLTextPlugin();
|
36909 | break;
|
36910 | }
|
36911 | }
|
36912 | }
|
36913 | }
|
36914 | this.queryPadding = 0;
|
36915 | for (const id in this.buckets) {
|
36916 | const bucket = this.buckets[id];
|
36917 | this.queryPadding = Math.max(this.queryPadding, painter.style.getLayer(id).queryRadius(bucket));
|
36918 | }
|
36919 | if (data.imageAtlas) {
|
36920 | this.imageAtlas = data.imageAtlas;
|
36921 | }
|
36922 | if (data.glyphAtlasImage) {
|
36923 | this.glyphAtlasImage = data.glyphAtlasImage;
|
36924 | }
|
36925 | }
|
36926 | /**
|
36927 | * Release any data or WebGL resources referenced by this tile.
|
36928 | * @returns {undefined}
|
36929 | * @private
|
36930 | */
|
36931 | unloadVectorData() {
|
36932 | for (const id in this.buckets) {
|
36933 | this.buckets[id].destroy();
|
36934 | }
|
36935 | this.buckets = {};
|
36936 | if (this.imageAtlasTexture) {
|
36937 | this.imageAtlasTexture.destroy();
|
36938 | }
|
36939 | if (this.imageAtlas) {
|
36940 | this.imageAtlas = null;
|
36941 | }
|
36942 | if (this.glyphAtlasTexture) {
|
36943 | this.glyphAtlasTexture.destroy();
|
36944 | }
|
36945 | this.latestFeatureIndex = null;
|
36946 | this.state = 'unloaded';
|
36947 | }
|
36948 | getBucket(layer) {
|
36949 | return this.buckets[layer.id];
|
36950 | }
|
36951 | upload(context) {
|
36952 | for (const id in this.buckets) {
|
36953 | const bucket = this.buckets[id];
|
36954 | if (bucket.uploadPending()) {
|
36955 | bucket.upload(context);
|
36956 | }
|
36957 | }
|
36958 | const gl = context.gl;
|
36959 | if (this.imageAtlas && !this.imageAtlas.uploaded) {
|
36960 | this.imageAtlasTexture = new Texture(context, this.imageAtlas.image, gl.RGBA);
|
36961 | this.imageAtlas.uploaded = true;
|
36962 | }
|
36963 | if (this.glyphAtlasImage) {
|
36964 | this.glyphAtlasTexture = new Texture(context, this.glyphAtlasImage, gl.ALPHA);
|
36965 | this.glyphAtlasImage = null;
|
36966 | }
|
36967 | }
|
36968 | prepare(imageManager) {
|
36969 | if (this.imageAtlas) {
|
36970 | this.imageAtlas.patchUpdatedImages(imageManager, this.imageAtlasTexture);
|
36971 | }
|
36972 | }
|
36973 | // Queries non-symbol features rendered for this tile.
|
36974 | // Symbol features are queried globally
|
36975 | queryRenderedFeatures(layers, serializedLayers, sourceFeatureState, queryGeometry, cameraQueryGeometry, scale, params, transform, maxPitchScaleFactor, pixelPosMatrix) {
|
36976 | if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData)
|
36977 | return {};
|
36978 | return this.latestFeatureIndex.query({
|
36979 | queryGeometry,
|
36980 | cameraQueryGeometry,
|
36981 | scale,
|
36982 | tileSize: this.tileSize,
|
36983 | pixelPosMatrix,
|
36984 | transform,
|
36985 | params,
|
36986 | queryPadding: this.queryPadding * maxPitchScaleFactor
|
36987 | }, layers, serializedLayers, sourceFeatureState);
|
36988 | }
|
36989 | querySourceFeatures(result, params) {
|
36990 | const featureIndex = this.latestFeatureIndex;
|
36991 | if (!featureIndex || !featureIndex.rawTileData)
|
36992 | return;
|
36993 | const vtLayers = featureIndex.loadVTLayers();
|
36994 | const sourceLayer = params ? params.sourceLayer : '';
|
36995 | const layer = vtLayers._geojsonTileLayer || vtLayers[sourceLayer];
|
36996 | if (!layer)
|
36997 | return;
|
36998 | const filter = performance.createFilter(params && params.filter);
|
36999 | const { z, x, y } = this.tileID.canonical;
|
37000 | const coord = { z, x, y };
|
37001 | for (let i = 0; i < layer.length; i++) {
|
37002 | const feature = layer.feature(i);
|
37003 | if (filter.needGeometry) {
|
37004 | const evaluationFeature = performance.toEvaluationFeature(feature, true);
|
37005 | if (!filter.filter(new performance.EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical))
|
37006 | continue;
|
37007 | }
|
37008 | else if (!filter.filter(new performance.EvaluationParameters(this.tileID.overscaledZ), feature)) {
|
37009 | continue;
|
37010 | }
|
37011 | const id = featureIndex.getId(feature, sourceLayer);
|
37012 | const geojsonFeature = new performance.GeoJSONFeature(feature, z, x, y, id);
|
37013 | geojsonFeature.tile = coord;
|
37014 | result.push(geojsonFeature);
|
37015 | }
|
37016 | }
|
37017 | hasData() {
|
37018 | return this.state === 'loaded' || this.state === 'reloading' || this.state === 'expired';
|
37019 | }
|
37020 | patternsLoaded() {
|
37021 | return this.imageAtlas && !!Object.keys(this.imageAtlas.patternPositions).length;
|
37022 | }
|
37023 | setExpiryData(data) {
|
37024 | const prior = this.expirationTime;
|
37025 | if (data.cacheControl) {
|
37026 | const parsedCC = performance.parseCacheControl(data.cacheControl);
|
37027 | if (parsedCC['max-age'])
|
37028 | this.expirationTime = Date.now() + parsedCC['max-age'] * 1000;
|
37029 | }
|
37030 | else if (data.expires) {
|
37031 | this.expirationTime = new Date(data.expires).getTime();
|
37032 | }
|
37033 | if (this.expirationTime) {
|
37034 | const now = Date.now();
|
37035 | let isExpired = false;
|
37036 | if (this.expirationTime > now) {
|
37037 | isExpired = false;
|
37038 | }
|
37039 | else if (!prior) {
|
37040 | isExpired = true;
|
37041 | }
|
37042 | else if (this.expirationTime < prior) {
|
37043 | // Expiring date is going backwards:
|
37044 | // fall back to exponential backoff
|
37045 | isExpired = true;
|
37046 | }
|
37047 | else {
|
37048 | const delta = this.expirationTime - prior;
|
37049 | if (!delta) {
|
37050 | // Server is serving the same expired resource over and over: fall
|
37051 | // back to exponential backoff.
|
37052 | isExpired = true;
|
37053 | }
|
37054 | else {
|
37055 | // Assume that either the client or the server clock is wrong and
|
37056 | // try to interpolate a valid expiration date (from the client POV)
|
37057 | // observing a minimum timeout.
|
37058 | this.expirationTime = now + Math.max(delta, CLOCK_SKEW_RETRY_TIMEOUT);
|
37059 | }
|
37060 | }
|
37061 | if (isExpired) {
|
37062 | this.expiredRequestCount++;
|
37063 | this.state = 'expired';
|
37064 | }
|
37065 | else {
|
37066 | this.expiredRequestCount = 0;
|
37067 | }
|
37068 | }
|
37069 | }
|
37070 | getExpiryTimeout() {
|
37071 | if (this.expirationTime) {
|
37072 | if (this.expiredRequestCount) {
|
37073 | return 1000 * (1 << Math.min(this.expiredRequestCount - 1, 31));
|
37074 | }
|
37075 | else {
|
37076 | // Max value for `setTimeout` implementations is a 32 bit integer; cap this accordingly
|
37077 | return Math.min(this.expirationTime - new Date().getTime(), Math.pow(2, 31) - 1);
|
37078 | }
|
37079 | }
|
37080 | }
|
37081 | setFeatureState(states, painter) {
|
37082 | if (!this.latestFeatureIndex ||
|
37083 | !this.latestFeatureIndex.rawTileData ||
|
37084 | Object.keys(states).length === 0) {
|
37085 | return;
|
37086 | }
|
37087 | const vtLayers = this.latestFeatureIndex.loadVTLayers();
|
37088 | for (const id in this.buckets) {
|
37089 | if (!painter.style.hasLayer(id))
|
37090 | continue;
|
37091 | const bucket = this.buckets[id];
|
37092 | // Buckets are grouped by common source-layer
|
37093 | const sourceLayerId = bucket.layers[0]['sourceLayer'] || '_geojsonTileLayer';
|
37094 | const sourceLayer = vtLayers[sourceLayerId];
|
37095 | const sourceLayerStates = states[sourceLayerId];
|
37096 | if (!sourceLayer || !sourceLayerStates || Object.keys(sourceLayerStates).length === 0)
|
37097 | continue;
|
37098 | bucket.update(sourceLayerStates, sourceLayer, this.imageAtlas && this.imageAtlas.patternPositions || {});
|
37099 | const layer = painter && painter.style && painter.style.getLayer(id);
|
37100 | if (layer) {
|
37101 | this.queryPadding = Math.max(this.queryPadding, layer.queryRadius(bucket));
|
37102 | }
|
37103 | }
|
37104 | }
|
37105 | holdingForFade() {
|
37106 | return this.symbolFadeHoldUntil !== undefined;
|
37107 | }
|
37108 | symbolFadeFinished() {
|
37109 | return !this.symbolFadeHoldUntil || this.symbolFadeHoldUntil < performance.exported.now();
|
37110 | }
|
37111 | clearFadeHold() {
|
37112 | this.symbolFadeHoldUntil = undefined;
|
37113 | }
|
37114 | setHoldDuration(duration) {
|
37115 | this.symbolFadeHoldUntil = performance.exported.now() + duration;
|
37116 | }
|
37117 | setDependencies(namespace, dependencies) {
|
37118 | const index = {};
|
37119 | for (const dep of dependencies) {
|
37120 | index[dep] = true;
|
37121 | }
|
37122 | this.dependencies[namespace] = index;
|
37123 | }
|
37124 | hasDependency(namespaces, keys) {
|
37125 | for (const namespace of namespaces) {
|
37126 | const dependencies = this.dependencies[namespace];
|
37127 | if (dependencies) {
|
37128 | for (const key of keys) {
|
37129 | if (dependencies[key]) {
|
37130 | return true;
|
37131 | }
|
37132 | }
|
37133 | }
|
37134 | }
|
37135 | return false;
|
37136 | }
|
37137 | }
|
37138 |
|
37139 | /**
|
37140 | * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms)
|
37141 | * with hash lookup made possible by keeping a list of keys in parallel to
|
37142 | * an array of dictionary of values
|
37143 | *
|
37144 | * @private
|
37145 | */
|
37146 | class TileCache {
|
37147 | /**
|
37148 | * @param {number} max number of permitted values
|
37149 | * @param {Function} onRemove callback called with items when they expire
|
37150 | */
|
37151 | constructor(max, onRemove) {
|
37152 | this.max = max;
|
37153 | this.onRemove = onRemove;
|
37154 | this.reset();
|
37155 | }
|
37156 | /**
|
37157 | * Clear the cache
|
37158 | *
|
37159 | * @returns {TileCache} this cache
|
37160 | * @private
|
37161 | */
|
37162 | reset() {
|
37163 | for (const key in this.data) {
|
37164 | for (const removedData of this.data[key]) {
|
37165 | if (removedData.timeout)
|
37166 | clearTimeout(removedData.timeout);
|
37167 | this.onRemove(removedData.value);
|
37168 | }
|
37169 | }
|
37170 | this.data = {};
|
37171 | this.order = [];
|
37172 | return this;
|
37173 | }
|
37174 | /**
|
37175 | * Add a key, value combination to the cache, trimming its size if this pushes
|
37176 | * it over max length.
|
37177 | *
|
37178 | * @param {OverscaledTileID} tileID lookup key for the item
|
37179 | * @param {*} data any value
|
37180 | *
|
37181 | * @returns {TileCache} this cache
|
37182 | * @private
|
37183 | */
|
37184 | add(tileID, data, expiryTimeout) {
|
37185 | const key = tileID.wrapped().key;
|
37186 | if (this.data[key] === undefined) {
|
37187 | this.data[key] = [];
|
37188 | }
|
37189 | const dataWrapper = {
|
37190 | value: data,
|
37191 | timeout: undefined
|
37192 | };
|
37193 | if (expiryTimeout !== undefined) {
|
37194 | dataWrapper.timeout = setTimeout(() => {
|
37195 | this.remove(tileID, dataWrapper);
|
37196 | }, expiryTimeout);
|
37197 | }
|
37198 | this.data[key].push(dataWrapper);
|
37199 | this.order.push(key);
|
37200 | if (this.order.length > this.max) {
|
37201 | const removedData = this._getAndRemoveByKey(this.order[0]);
|
37202 | if (removedData)
|
37203 | this.onRemove(removedData);
|
37204 | }
|
37205 | return this;
|
37206 | }
|
37207 | /**
|
37208 | * Determine whether the value attached to `key` is present
|
37209 | *
|
37210 | * @param {OverscaledTileID} tileID the key to be looked-up
|
37211 | * @returns {boolean} whether the cache has this value
|
37212 | * @private
|
37213 | */
|
37214 | has(tileID) {
|
37215 | return tileID.wrapped().key in this.data;
|
37216 | }
|
37217 | /**
|
37218 | * Get the value attached to a specific key and remove data from cache.
|
37219 | * If the key is not found, returns `null`
|
37220 | *
|
37221 | * @param {OverscaledTileID} tileID the key to look up
|
37222 | * @returns {*} the data, or null if it isn't found
|
37223 | * @private
|
37224 | */
|
37225 | getAndRemove(tileID) {
|
37226 | if (!this.has(tileID)) {
|
37227 | return null;
|
37228 | }
|
37229 | return this._getAndRemoveByKey(tileID.wrapped().key);
|
37230 | }
|
37231 | /*
|
37232 | * Get and remove the value with the specified key.
|
37233 | */
|
37234 | _getAndRemoveByKey(key) {
|
37235 | const data = this.data[key].shift();
|
37236 | if (data.timeout)
|
37237 | clearTimeout(data.timeout);
|
37238 | if (this.data[key].length === 0) {
|
37239 | delete this.data[key];
|
37240 | }
|
37241 | this.order.splice(this.order.indexOf(key), 1);
|
37242 | return data.value;
|
37243 | }
|
37244 | /*
|
37245 | * Get the value with the specified (wrapped tile) key.
|
37246 | */
|
37247 | getByKey(key) {
|
37248 | const data = this.data[key];
|
37249 | return data ? data[0].value : null;
|
37250 | }
|
37251 | /**
|
37252 | * Get the value attached to a specific key without removing data
|
37253 | * from the cache. If the key is not found, returns `null`
|
37254 | *
|
37255 | * @param {OverscaledTileID} tileID the key to look up
|
37256 | * @returns {*} the data, or null if it isn't found
|
37257 | * @private
|
37258 | */
|
37259 | get(tileID) {
|
37260 | if (!this.has(tileID)) {
|
37261 | return null;
|
37262 | }
|
37263 | const data = this.data[tileID.wrapped().key][0];
|
37264 | return data.value;
|
37265 | }
|
37266 | /**
|
37267 | * Remove a key/value combination from the cache.
|
37268 | *
|
37269 | * @param {OverscaledTileID} tileID the key for the pair to delete
|
37270 | * @param {Tile} value If a value is provided, remove that exact version of the value.
|
37271 | * @returns {TileCache} this cache
|
37272 | * @private
|
37273 | */
|
37274 | remove(tileID, value) {
|
37275 | if (!this.has(tileID)) {
|
37276 | return this;
|
37277 | }
|
37278 | const key = tileID.wrapped().key;
|
37279 | const dataIndex = value === undefined ? 0 : this.data[key].indexOf(value);
|
37280 | const data = this.data[key][dataIndex];
|
37281 | this.data[key].splice(dataIndex, 1);
|
37282 | if (data.timeout)
|
37283 | clearTimeout(data.timeout);
|
37284 | if (this.data[key].length === 0) {
|
37285 | delete this.data[key];
|
37286 | }
|
37287 | this.onRemove(data.value);
|
37288 | this.order.splice(this.order.indexOf(key), 1);
|
37289 | return this;
|
37290 | }
|
37291 | /**
|
37292 | * Change the max size of the cache.
|
37293 | *
|
37294 | * @param {number} max the max size of the cache
|
37295 | * @returns {TileCache} this cache
|
37296 | * @private
|
37297 | */
|
37298 | setMaxSize(max) {
|
37299 | this.max = max;
|
37300 | while (this.order.length > this.max) {
|
37301 | const removedData = this._getAndRemoveByKey(this.order[0]);
|
37302 | if (removedData)
|
37303 | this.onRemove(removedData);
|
37304 | }
|
37305 | return this;
|
37306 | }
|
37307 | /**
|
37308 | * Remove entries that do not pass a filter function. Used for removing
|
37309 | * stale tiles from the cache.
|
37310 | *
|
37311 | * @param {function} filterFn Determines whether the tile is filtered. If the supplied function returns false, the tile will be filtered out.
|
37312 | */
|
37313 | filter(filterFn) {
|
37314 | const removed = [];
|
37315 | for (const key in this.data) {
|
37316 | for (const entry of this.data[key]) {
|
37317 | if (!filterFn(entry.value)) {
|
37318 | removed.push(entry);
|
37319 | }
|
37320 | }
|
37321 | }
|
37322 | for (const r of removed) {
|
37323 | this.remove(r.value.tileID, r);
|
37324 | }
|
37325 | }
|
37326 | }
|
37327 |
|
37328 | /**
|
37329 | * SourceFeatureState manages the state and pending changes
|
37330 | * to features in a source, separated by source layer.
|
37331 | * stateChanges and deletedStates batch all changes to the tile (updates and removes, respectively)
|
37332 | * between coalesce() events. addFeatureState() and removeFeatureState() also update their counterpart's
|
37333 | * list of changes, such that coalesce() can apply the proper state changes while agnostic to the order of operations.
|
37334 | * In deletedStates, all null's denote complete removal of state at that scope
|
37335 | * @private
|
37336 | */
|
37337 | class SourceFeatureState {
|
37338 | constructor() {
|
37339 | this.state = {};
|
37340 | this.stateChanges = {};
|
37341 | this.deletedStates = {};
|
37342 | }
|
37343 | updateState(sourceLayer, featureId, newState) {
|
37344 | const feature = String(featureId);
|
37345 | this.stateChanges[sourceLayer] = this.stateChanges[sourceLayer] || {};
|
37346 | this.stateChanges[sourceLayer][feature] = this.stateChanges[sourceLayer][feature] || {};
|
37347 | performance.extend(this.stateChanges[sourceLayer][feature], newState);
|
37348 | if (this.deletedStates[sourceLayer] === null) {
|
37349 | this.deletedStates[sourceLayer] = {};
|
37350 | for (const ft in this.state[sourceLayer]) {
|
37351 | if (ft !== feature)
|
37352 | this.deletedStates[sourceLayer][ft] = null;
|
37353 | }
|
37354 | }
|
37355 | else {
|
37356 | const featureDeletionQueued = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] === null;
|
37357 | if (featureDeletionQueued) {
|
37358 | this.deletedStates[sourceLayer][feature] = {};
|
37359 | for (const prop in this.state[sourceLayer][feature]) {
|
37360 | if (!newState[prop])
|
37361 | this.deletedStates[sourceLayer][feature][prop] = null;
|
37362 | }
|
37363 | }
|
37364 | else {
|
37365 | for (const key in newState) {
|
37366 | const deletionInQueue = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] && this.deletedStates[sourceLayer][feature][key] === null;
|
37367 | if (deletionInQueue)
|
37368 | delete this.deletedStates[sourceLayer][feature][key];
|
37369 | }
|
37370 | }
|
37371 | }
|
37372 | }
|
37373 | removeFeatureState(sourceLayer, featureId, key) {
|
37374 | const sourceLayerDeleted = this.deletedStates[sourceLayer] === null;
|
37375 | if (sourceLayerDeleted)
|
37376 | return;
|
37377 | const feature = String(featureId);
|
37378 | this.deletedStates[sourceLayer] = this.deletedStates[sourceLayer] || {};
|
37379 | if (key && featureId !== undefined) {
|
37380 | if (this.deletedStates[sourceLayer][feature] !== null) {
|
37381 | this.deletedStates[sourceLayer][feature] = this.deletedStates[sourceLayer][feature] || {};
|
37382 | this.deletedStates[sourceLayer][feature][key] = null;
|
37383 | }
|
37384 | }
|
37385 | else if (featureId !== undefined) {
|
37386 | const updateInQueue = this.stateChanges[sourceLayer] && this.stateChanges[sourceLayer][feature];
|
37387 | if (updateInQueue) {
|
37388 | this.deletedStates[sourceLayer][feature] = {};
|
37389 | for (key in this.stateChanges[sourceLayer][feature])
|
37390 | this.deletedStates[sourceLayer][feature][key] = null;
|
37391 | }
|
37392 | else {
|
37393 | this.deletedStates[sourceLayer][feature] = null;
|
37394 | }
|
37395 | }
|
37396 | else {
|
37397 | this.deletedStates[sourceLayer] = null;
|
37398 | }
|
37399 | }
|
37400 | getState(sourceLayer, featureId) {
|
37401 | const feature = String(featureId);
|
37402 | const base = this.state[sourceLayer] || {};
|
37403 | const changes = this.stateChanges[sourceLayer] || {};
|
37404 | const reconciledState = performance.extend({}, base[feature], changes[feature]);
|
37405 | //return empty object if the whole source layer is awaiting deletion
|
37406 | if (this.deletedStates[sourceLayer] === null)
|
37407 | return {};
|
37408 | else if (this.deletedStates[sourceLayer]) {
|
37409 | const featureDeletions = this.deletedStates[sourceLayer][featureId];
|
37410 | if (featureDeletions === null)
|
37411 | return {};
|
37412 | for (const prop in featureDeletions)
|
37413 | delete reconciledState[prop];
|
37414 | }
|
37415 | return reconciledState;
|
37416 | }
|
37417 | initializeTileState(tile, painter) {
|
37418 | tile.setFeatureState(this.state, painter);
|
37419 | }
|
37420 | coalesceChanges(tiles, painter) {
|
37421 | //track changes with full state objects, but only for features that got modified
|
37422 | const featuresChanged = {};
|
37423 | for (const sourceLayer in this.stateChanges) {
|
37424 | this.state[sourceLayer] = this.state[sourceLayer] || {};
|
37425 | const layerStates = {};
|
37426 | for (const feature in this.stateChanges[sourceLayer]) {
|
37427 | if (!this.state[sourceLayer][feature])
|
37428 | this.state[sourceLayer][feature] = {};
|
37429 | performance.extend(this.state[sourceLayer][feature], this.stateChanges[sourceLayer][feature]);
|
37430 | layerStates[feature] = this.state[sourceLayer][feature];
|
37431 | }
|
37432 | featuresChanged[sourceLayer] = layerStates;
|
37433 | }
|
37434 | for (const sourceLayer in this.deletedStates) {
|
37435 | this.state[sourceLayer] = this.state[sourceLayer] || {};
|
37436 | const layerStates = {};
|
37437 | if (this.deletedStates[sourceLayer] === null) {
|
37438 | for (const ft in this.state[sourceLayer]) {
|
37439 | layerStates[ft] = {};
|
37440 | this.state[sourceLayer][ft] = {};
|
37441 | }
|
37442 | }
|
37443 | else {
|
37444 | for (const feature in this.deletedStates[sourceLayer]) {
|
37445 | const deleteWholeFeatureState = this.deletedStates[sourceLayer][feature] === null;
|
37446 | if (deleteWholeFeatureState)
|
37447 | this.state[sourceLayer][feature] = {};
|
37448 | else {
|
37449 | for (const key of Object.keys(this.deletedStates[sourceLayer][feature])) {
|
37450 | delete this.state[sourceLayer][feature][key];
|
37451 | }
|
37452 | }
|
37453 | layerStates[feature] = this.state[sourceLayer][feature];
|
37454 | }
|
37455 | }
|
37456 | featuresChanged[sourceLayer] = featuresChanged[sourceLayer] || {};
|
37457 | performance.extend(featuresChanged[sourceLayer], layerStates);
|
37458 | }
|
37459 | this.stateChanges = {};
|
37460 | this.deletedStates = {};
|
37461 | if (Object.keys(featuresChanged).length === 0)
|
37462 | return;
|
37463 | for (const id in tiles) {
|
37464 | const tile = tiles[id];
|
37465 | tile.setFeatureState(featuresChanged, painter);
|
37466 | }
|
37467 | }
|
37468 | }
|
37469 |
|
37470 | /**
|
37471 | * `SourceCache` is responsible for
|
37472 | *
|
37473 | * - creating an instance of `Source`
|
37474 | * - forwarding events from `Source`
|
37475 | * - caching tiles loaded from an instance of `Source`
|
37476 | * - loading the tiles needed to render a given viewport
|
37477 | * - unloading the cached tiles not needed to render a given viewport
|
37478 | *
|
37479 | * @private
|
37480 | */
|
37481 | class SourceCache extends performance.Evented {
|
37482 | constructor(id, options, dispatcher) {
|
37483 | super();
|
37484 | this.id = id;
|
37485 | this.dispatcher = dispatcher;
|
37486 | this.on('data', (e) => {
|
37487 | // this._sourceLoaded signifies that the TileJSON is loaded if applicable.
|
37488 | // if the source type does not come with a TileJSON, the flag signifies the
|
37489 | // source data has loaded (i.e geojson has been tiled on the worker and is ready)
|
37490 | if (e.dataType === 'source' && e.sourceDataType === 'metadata')
|
37491 | this._sourceLoaded = true;
|
37492 | // for sources with mutable data, this event fires when the underlying data
|
37493 | // to a source is changed. (i.e. GeoJSONSource#setData and ImageSource#serCoordinates)
|
37494 | if (this._sourceLoaded && !this._paused && e.dataType === 'source' && e.sourceDataType === 'content') {
|
37495 | this.reload();
|
37496 | if (this.transform) {
|
37497 | this.update(this.transform);
|
37498 | }
|
37499 | }
|
37500 | });
|
37501 | this.on('dataloading', () => {
|
37502 | this._sourceErrored = false;
|
37503 | });
|
37504 | this.on('error', () => {
|
37505 | // Only set _sourceErrored if the source does not have pending loads.
|
37506 | this._sourceErrored = this._source.loaded();
|
37507 | });
|
37508 | this._source = create(id, options, dispatcher, this);
|
37509 | this._tiles = {};
|
37510 | this._cache = new TileCache(0, this._unloadTile.bind(this));
|
37511 | this._timers = {};
|
37512 | this._cacheTimers = {};
|
37513 | this._maxTileCacheSize = null;
|
37514 | this._loadedParentTiles = {};
|
37515 | this._coveredTiles = {};
|
37516 | this._state = new SourceFeatureState();
|
37517 | }
|
37518 | onAdd(map) {
|
37519 | this.map = map;
|
37520 | this._maxTileCacheSize = map ? map._maxTileCacheSize : null;
|
37521 | if (this._source && this._source.onAdd) {
|
37522 | this._source.onAdd(map);
|
37523 | }
|
37524 | }
|
37525 | onRemove(map) {
|
37526 | this.clearTiles();
|
37527 | if (this._source && this._source.onRemove) {
|
37528 | this._source.onRemove(map);
|
37529 | }
|
37530 | }
|
37531 | /**
|
37532 | * Return true if no tile data is pending, tiles will not change unless
|
37533 | * an additional API call is received.
|
37534 | * @private
|
37535 | */
|
37536 | loaded() {
|
37537 | if (this._sourceErrored) {
|
37538 | return true;
|
37539 | }
|
37540 | if (!this._sourceLoaded) {
|
37541 | return false;
|
37542 | }
|
37543 | if (!this._source.loaded()) {
|
37544 | return false;
|
37545 | }
|
37546 | for (const t in this._tiles) {
|
37547 | const tile = this._tiles[t];
|
37548 | if (tile.state !== 'loaded' && tile.state !== 'errored')
|
37549 | return false;
|
37550 | }
|
37551 | return true;
|
37552 | }
|
37553 | getSource() {
|
37554 | return this._source;
|
37555 | }
|
37556 | pause() {
|
37557 | this._paused = true;
|
37558 | }
|
37559 | resume() {
|
37560 | if (!this._paused)
|
37561 | return;
|
37562 | const shouldReload = this._shouldReloadOnResume;
|
37563 | this._paused = false;
|
37564 | this._shouldReloadOnResume = false;
|
37565 | if (shouldReload)
|
37566 | this.reload();
|
37567 | if (this.transform)
|
37568 | this.update(this.transform);
|
37569 | }
|
37570 | _loadTile(tile, callback) {
|
37571 | return this._source.loadTile(tile, callback);
|
37572 | }
|
37573 | _unloadTile(tile) {
|
37574 | if (this._source.unloadTile)
|
37575 | return this._source.unloadTile(tile, () => { });
|
37576 | }
|
37577 | _abortTile(tile) {
|
37578 | if (this._source.abortTile)
|
37579 | this._source.abortTile(tile, () => { });
|
37580 | this._source.fire(new performance.Event('dataabort', { tile, coord: tile.tileID, dataType: 'source' }));
|
37581 | }
|
37582 | serialize() {
|
37583 | return this._source.serialize();
|
37584 | }
|
37585 | prepare(context) {
|
37586 | if (this._source.prepare) {
|
37587 | this._source.prepare();
|
37588 | }
|
37589 | this._state.coalesceChanges(this._tiles, this.map ? this.map.painter : null);
|
37590 | for (const i in this._tiles) {
|
37591 | const tile = this._tiles[i];
|
37592 | tile.upload(context);
|
37593 | tile.prepare(this.map.style.imageManager);
|
37594 | }
|
37595 | }
|
37596 | /**
|
37597 | * Return all tile ids ordered with z-order, and cast to numbers
|
37598 | * @private
|
37599 | */
|
37600 | getIds() {
|
37601 | return Object.values(this._tiles).map((tile) => tile.tileID).sort(compareTileId).map(id => id.key);
|
37602 | }
|
37603 | getRenderableIds(symbolLayer) {
|
37604 | const renderables = [];
|
37605 | for (const id in this._tiles) {
|
37606 | if (this._isIdRenderable(id, symbolLayer))
|
37607 | renderables.push(this._tiles[id]);
|
37608 | }
|
37609 | if (symbolLayer) {
|
37610 | return renderables.sort((a_, b_) => {
|
37611 | const a = a_.tileID;
|
37612 | const b = b_.tileID;
|
37613 | const rotatedA = (new performance.pointGeometry(a.canonical.x, a.canonical.y))._rotate(this.transform.angle);
|
37614 | const rotatedB = (new performance.pointGeometry(b.canonical.x, b.canonical.y))._rotate(this.transform.angle);
|
37615 | return a.overscaledZ - b.overscaledZ || rotatedB.y - rotatedA.y || rotatedB.x - rotatedA.x;
|
37616 | }).map(tile => tile.tileID.key);
|
37617 | }
|
37618 | return renderables.map(tile => tile.tileID).sort(compareTileId).map(id => id.key);
|
37619 | }
|
37620 | hasRenderableParent(tileID) {
|
37621 | const parentTile = this.findLoadedParent(tileID, 0);
|
37622 | if (parentTile) {
|
37623 | return this._isIdRenderable(parentTile.tileID.key);
|
37624 | }
|
37625 | return false;
|
37626 | }
|
37627 | _isIdRenderable(id, symbolLayer) {
|
37628 | return this._tiles[id] && this._tiles[id].hasData() &&
|
37629 | !this._coveredTiles[id] && (symbolLayer || !this._tiles[id].holdingForFade());
|
37630 | }
|
37631 | reload() {
|
37632 | if (this._paused) {
|
37633 | this._shouldReloadOnResume = true;
|
37634 | return;
|
37635 | }
|
37636 | this._cache.reset();
|
37637 | for (const i in this._tiles) {
|
37638 | if (this._tiles[i].state !== 'errored')
|
37639 | this._reloadTile(i, 'reloading');
|
37640 | }
|
37641 | }
|
37642 | _reloadTile(id, state) {
|
37643 | const tile = this._tiles[id];
|
37644 | // this potentially does not address all underlying
|
37645 | // issues https://github.com/mapbox/mapbox-gl-js/issues/4252
|
37646 | // - hard to tell without repro steps
|
37647 | if (!tile)
|
37648 | return;
|
37649 | // The difference between "loading" tiles and "reloading" or "expired"
|
37650 | // tiles is that "reloading"/"expired" tiles are "renderable".
|
37651 | // Therefore, a "loading" tile cannot become a "reloading" tile without
|
37652 | // first becoming a "loaded" tile.
|
37653 | if (tile.state !== 'loading') {
|
37654 | tile.state = state;
|
37655 | }
|
37656 | this._loadTile(tile, this._tileLoaded.bind(this, tile, id, state));
|
37657 | }
|
37658 | _tileLoaded(tile, id, previousState, err) {
|
37659 | if (err) {
|
37660 | tile.state = 'errored';
|
37661 | if (err.status !== 404)
|
37662 | this._source.fire(new performance.ErrorEvent(err, { tile }));
|
37663 | // continue to try loading parent/children tiles if a tile doesn't exist (404)
|
37664 | else
|
37665 | this.update(this.transform);
|
37666 | return;
|
37667 | }
|
37668 | tile.timeAdded = performance.exported.now();
|
37669 | if (previousState === 'expired')
|
37670 | tile.refreshedUponExpiration = true;
|
37671 | this._setTileReloadTimer(id, tile);
|
37672 | if (this.getSource().type === 'raster-dem' && tile.dem)
|
37673 | this._backfillDEM(tile);
|
37674 | this._state.initializeTileState(tile, this.map ? this.map.painter : null);
|
37675 | if (!tile.aborted) {
|
37676 | this._source.fire(new performance.Event('data', { dataType: 'source', tile, coord: tile.tileID }));
|
37677 | }
|
37678 | }
|
37679 | /**
|
37680 | * For raster terrain source, backfill DEM to eliminate visible tile boundaries
|
37681 | * @private
|
37682 | */
|
37683 | _backfillDEM(tile) {
|
37684 | const renderables = this.getRenderableIds();
|
37685 | for (let i = 0; i < renderables.length; i++) {
|
37686 | const borderId = renderables[i];
|
37687 | if (tile.neighboringTiles && tile.neighboringTiles[borderId]) {
|
37688 | const borderTile = this.getTileByID(borderId);
|
37689 | fillBorder(tile, borderTile);
|
37690 | fillBorder(borderTile, tile);
|
37691 | }
|
37692 | }
|
37693 | function fillBorder(tile, borderTile) {
|
37694 | tile.needsHillshadePrepare = true;
|
37695 | let dx = borderTile.tileID.canonical.x - tile.tileID.canonical.x;
|
37696 | const dy = borderTile.tileID.canonical.y - tile.tileID.canonical.y;
|
37697 | const dim = Math.pow(2, tile.tileID.canonical.z);
|
37698 | const borderId = borderTile.tileID.key;
|
37699 | if (dx === 0 && dy === 0)
|
37700 | return;
|
37701 | if (Math.abs(dy) > 1) {
|
37702 | return;
|
37703 | }
|
37704 | if (Math.abs(dx) > 1) {
|
37705 | // Adjust the delta coordinate for world wraparound.
|
37706 | if (Math.abs(dx + dim) === 1) {
|
37707 | dx += dim;
|
37708 | }
|
37709 | else if (Math.abs(dx - dim) === 1) {
|
37710 | dx -= dim;
|
37711 | }
|
37712 | }
|
37713 | if (!borderTile.dem || !tile.dem)
|
37714 | return;
|
37715 | tile.dem.backfillBorder(borderTile.dem, dx, dy);
|
37716 | if (tile.neighboringTiles && tile.neighboringTiles[borderId])
|
37717 | tile.neighboringTiles[borderId].backfilled = true;
|
37718 | }
|
37719 | }
|
37720 | /**
|
37721 | * Get a specific tile by TileID
|
37722 | * @private
|
37723 | */
|
37724 | getTile(tileID) {
|
37725 | return this.getTileByID(tileID.key);
|
37726 | }
|
37727 | /**
|
37728 | * Get a specific tile by id
|
37729 | * @private
|
37730 | */
|
37731 | getTileByID(id) {
|
37732 | return this._tiles[id];
|
37733 | }
|
37734 | /**
|
37735 | * For a given set of tiles, retain children that are loaded and have a zoom
|
37736 | * between `zoom` (exclusive) and `maxCoveringZoom` (inclusive)
|
37737 | * @private
|
37738 | */
|
37739 | _retainLoadedChildren(idealTiles, zoom, maxCoveringZoom, retain) {
|
37740 | for (const id in this._tiles) {
|
37741 | let tile = this._tiles[id];
|
37742 | // only consider renderable tiles up to maxCoveringZoom
|
37743 | if (retain[id] ||
|
37744 | !tile.hasData() ||
|
37745 | tile.tileID.overscaledZ <= zoom ||
|
37746 | tile.tileID.overscaledZ > maxCoveringZoom)
|
37747 | continue;
|
37748 | // loop through parents and retain the topmost loaded one if found
|
37749 | let topmostLoadedID = tile.tileID;
|
37750 | while (tile && tile.tileID.overscaledZ > zoom + 1) {
|
37751 | const parentID = tile.tileID.scaledTo(tile.tileID.overscaledZ - 1);
|
37752 | tile = this._tiles[parentID.key];
|
37753 | if (tile && tile.hasData()) {
|
37754 | topmostLoadedID = parentID;
|
37755 | }
|
37756 | }
|
37757 | // loop through ancestors of the topmost loaded child to see if there's one that needed it
|
37758 | let tileID = topmostLoadedID;
|
37759 | while (tileID.overscaledZ > zoom) {
|
37760 | tileID = tileID.scaledTo(tileID.overscaledZ - 1);
|
37761 | if (idealTiles[tileID.key]) {
|
37762 | // found a parent that needed a loaded child; retain that child
|
37763 | retain[topmostLoadedID.key] = topmostLoadedID;
|
37764 | break;
|
37765 | }
|
37766 | }
|
37767 | }
|
37768 | }
|
37769 | /**
|
37770 | * Find a loaded parent of the given tile (up to minCoveringZoom)
|
37771 | * @private
|
37772 | */
|
37773 | findLoadedParent(tileID, minCoveringZoom) {
|
37774 | if (tileID.key in this._loadedParentTiles) {
|
37775 | const parent = this._loadedParentTiles[tileID.key];
|
37776 | if (parent && parent.tileID.overscaledZ >= minCoveringZoom) {
|
37777 | return parent;
|
37778 | }
|
37779 | else {
|
37780 | return null;
|
37781 | }
|
37782 | }
|
37783 | for (let z = tileID.overscaledZ - 1; z >= minCoveringZoom; z--) {
|
37784 | const parentTileID = tileID.scaledTo(z);
|
37785 | const tile = this._getLoadedTile(parentTileID);
|
37786 | if (tile) {
|
37787 | return tile;
|
37788 | }
|
37789 | }
|
37790 | }
|
37791 | _getLoadedTile(tileID) {
|
37792 | const tile = this._tiles[tileID.key];
|
37793 | if (tile && tile.hasData()) {
|
37794 | return tile;
|
37795 | }
|
37796 | // TileCache ignores wrap in lookup.
|
37797 | const cachedTile = this._cache.getByKey(tileID.wrapped().key);
|
37798 | return cachedTile;
|
37799 | }
|
37800 | /**
|
37801 | * Resizes the tile cache based on the current viewport's size
|
37802 | * or the maxTileCacheSize option passed during map creation
|
37803 | *
|
37804 | * Larger viewports use more tiles and need larger caches. Larger viewports
|
37805 | * are more likely to be found on devices with more memory and on pages where
|
37806 | * the map is more important.
|
37807 | * @private
|
37808 | */
|
37809 | updateCacheSize(transform) {
|
37810 | const widthInTiles = Math.ceil(transform.width / this._source.tileSize) + 1;
|
37811 | const heightInTiles = Math.ceil(transform.height / this._source.tileSize) + 1;
|
37812 | const approxTilesInView = widthInTiles * heightInTiles;
|
37813 | const commonZoomRange = 5;
|
37814 | const viewDependentMaxSize = Math.floor(approxTilesInView * commonZoomRange);
|
37815 | const maxSize = typeof this._maxTileCacheSize === 'number' ? Math.min(this._maxTileCacheSize, viewDependentMaxSize) : viewDependentMaxSize;
|
37816 | this._cache.setMaxSize(maxSize);
|
37817 | }
|
37818 | handleWrapJump(lng) {
|
37819 | // On top of the regular z/x/y values, TileIDs have a `wrap` value that specify
|
37820 | // which cppy of the world the tile belongs to. For example, at `lng: 10` you
|
37821 | // might render z/x/y/0 while at `lng: 370` you would render z/x/y/1.
|
37822 | //
|
37823 | // When lng values get wrapped (going from `lng: 370` to `long: 10`) you expect
|
37824 | // to see the same thing on the screen (370 degrees and 10 degrees is the same
|
37825 | // place in the world) but all the TileIDs will have different wrap values.
|
37826 | //
|
37827 | // In order to make this transition seamless, we calculate the rounded difference of
|
37828 | // "worlds" between the last frame and the current frame. If the map panned by
|
37829 | // a world, then we can assign all the tiles new TileIDs with updated wrap values.
|
37830 | // For example, assign z/x/y/1 a new id: z/x/y/0. It is the same tile, just rendered
|
37831 | // in a different position.
|
37832 | //
|
37833 | // This enables us to reuse the tiles at more ideal locations and prevent flickering.
|
37834 | const prevLng = this._prevLng === undefined ? lng : this._prevLng;
|
37835 | const lngDifference = lng - prevLng;
|
37836 | const worldDifference = lngDifference / 360;
|
37837 | const wrapDelta = Math.round(worldDifference);
|
37838 | this._prevLng = lng;
|
37839 | if (wrapDelta) {
|
37840 | const tiles = {};
|
37841 | for (const key in this._tiles) {
|
37842 | const tile = this._tiles[key];
|
37843 | tile.tileID = tile.tileID.unwrapTo(tile.tileID.wrap + wrapDelta);
|
37844 | tiles[tile.tileID.key] = tile;
|
37845 | }
|
37846 | this._tiles = tiles;
|
37847 | // Reset tile reload timers
|
37848 | for (const id in this._timers) {
|
37849 | clearTimeout(this._timers[id]);
|
37850 | delete this._timers[id];
|
37851 | }
|
37852 | for (const id in this._tiles) {
|
37853 | const tile = this._tiles[id];
|
37854 | this._setTileReloadTimer(id, tile);
|
37855 | }
|
37856 | }
|
37857 | }
|
37858 | /**
|
37859 | * Removes tiles that are outside the viewport and adds new tiles that
|
37860 | * are inside the viewport.
|
37861 | * @private
|
37862 | */
|
37863 | update(transform) {
|
37864 | this.transform = transform;
|
37865 | if (!this._sourceLoaded || this._paused) {
|
37866 | return;
|
37867 | }
|
37868 | this.updateCacheSize(transform);
|
37869 | this.handleWrapJump(this.transform.center.lng);
|
37870 | // Covered is a list of retained tiles who's areas are fully covered by other,
|
37871 | // better, retained tiles. They are not drawn separately.
|
37872 | this._coveredTiles = {};
|
37873 | let idealTileIDs;
|
37874 | if (!this.used) {
|
37875 | idealTileIDs = [];
|
37876 | }
|
37877 | else if (this._source.tileID) {
|
37878 | idealTileIDs = transform.getVisibleUnwrappedCoordinates(this._source.tileID)
|
37879 | .map((unwrapped) => new performance.OverscaledTileID(unwrapped.canonical.z, unwrapped.wrap, unwrapped.canonical.z, unwrapped.canonical.x, unwrapped.canonical.y));
|
37880 | }
|
37881 | else {
|
37882 | idealTileIDs = transform.coveringTiles({
|
37883 | tileSize: this._source.tileSize,
|
37884 | minzoom: this._source.minzoom,
|
37885 | maxzoom: this._source.maxzoom,
|
37886 | roundZoom: this._source.roundZoom,
|
37887 | reparseOverscaled: this._source.reparseOverscaled
|
37888 | });
|
37889 | if (this._source.hasTile) {
|
37890 | idealTileIDs = idealTileIDs.filter((coord) => this._source.hasTile(coord));
|
37891 | }
|
37892 | }
|
37893 | // Determine the overzooming/underzooming amounts.
|
37894 | const zoom = transform.coveringZoomLevel(this._source);
|
37895 | const minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom);
|
37896 | const maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom);
|
37897 | // Retain is a list of tiles that we shouldn't delete, even if they are not
|
37898 | // the most ideal tile for the current viewport. This may include tiles like
|
37899 | // parent or child tiles that are *already* loaded.
|
37900 | const retain = this._updateRetainedTiles(idealTileIDs, zoom);
|
37901 | if (isRasterType(this._source.type)) {
|
37902 | const parentsForFading = {};
|
37903 | const fadingTiles = {};
|
37904 | const ids = Object.keys(retain);
|
37905 | for (const id of ids) {
|
37906 | const tileID = retain[id];
|
37907 | performance.assert(tileID.key === id);
|
37908 | const tile = this._tiles[id];
|
37909 | if (!tile || tile.fadeEndTime && tile.fadeEndTime <= performance.exported.now())
|
37910 | continue;
|
37911 | // if the tile is loaded but still fading in, find parents to cross-fade with it
|
37912 | const parentTile = this.findLoadedParent(tileID, minCoveringZoom);
|
37913 | if (parentTile) {
|
37914 | this._addTile(parentTile.tileID);
|
37915 | parentsForFading[parentTile.tileID.key] = parentTile.tileID;
|
37916 | }
|
37917 | fadingTiles[id] = tileID;
|
37918 | }
|
37919 | // for tiles that are still fading in, also find children to cross-fade with
|
37920 | this._retainLoadedChildren(fadingTiles, zoom, maxCoveringZoom, retain);
|
37921 | for (const id in parentsForFading) {
|
37922 | if (!retain[id]) {
|
37923 | // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own.
|
37924 | this._coveredTiles[id] = true;
|
37925 | retain[id] = parentsForFading[id];
|
37926 | }
|
37927 | }
|
37928 | }
|
37929 | for (const retainedId in retain) {
|
37930 | // Make sure retained tiles always clear any existing fade holds
|
37931 | // so that if they're removed again their fade timer starts fresh.
|
37932 | this._tiles[retainedId].clearFadeHold();
|
37933 | }
|
37934 | // Remove the tiles we don't need anymore.
|
37935 | const remove = performance.keysDifference(this._tiles, retain);
|
37936 | for (const tileID of remove) {
|
37937 | const tile = this._tiles[tileID];
|
37938 | if (tile.hasSymbolBuckets && !tile.holdingForFade()) {
|
37939 | tile.setHoldDuration(this.map._fadeDuration);
|
37940 | }
|
37941 | else if (!tile.hasSymbolBuckets || tile.symbolFadeFinished()) {
|
37942 | this._removeTile(tileID);
|
37943 | }
|
37944 | }
|
37945 | // Construct a cache of loaded parents
|
37946 | this._updateLoadedParentTileCache();
|
37947 | }
|
37948 | releaseSymbolFadeTiles() {
|
37949 | for (const id in this._tiles) {
|
37950 | if (this._tiles[id].holdingForFade()) {
|
37951 | this._removeTile(id);
|
37952 | }
|
37953 | }
|
37954 | }
|
37955 | _updateRetainedTiles(idealTileIDs, zoom) {
|
37956 | const retain = {};
|
37957 | const checked = {};
|
37958 | const minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom);
|
37959 | const maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom);
|
37960 | const missingTiles = {};
|
37961 | for (const tileID of idealTileIDs) {
|
37962 | const tile = this._addTile(tileID);
|
37963 | // retain the tile even if it's not loaded because it's an ideal tile.
|
37964 | retain[tileID.key] = tileID;
|
37965 | if (tile.hasData())
|
37966 | continue;
|
37967 | if (zoom < this._source.maxzoom) {
|
37968 | // save missing tiles that potentially have loaded children
|
37969 | missingTiles[tileID.key] = tileID;
|
37970 | }
|
37971 | }
|
37972 | // retain any loaded children of ideal tiles up to maxCoveringZoom
|
37973 | this._retainLoadedChildren(missingTiles, zoom, maxCoveringZoom, retain);
|
37974 | for (const tileID of idealTileIDs) {
|
37975 | let tile = this._tiles[tileID.key];
|
37976 | if (tile.hasData())
|
37977 | continue;
|
37978 | // The tile we require is not yet loaded or does not exist;
|
37979 | // Attempt to find children that fully cover it.
|
37980 | if (zoom + 1 > this._source.maxzoom) {
|
37981 | // We're looking for an overzoomed child tile.
|
37982 | const childCoord = tileID.children(this._source.maxzoom)[0];
|
37983 | const childTile = this.getTile(childCoord);
|
37984 | if (!!childTile && childTile.hasData()) {
|
37985 | retain[childCoord.key] = childCoord;
|
37986 | continue; // tile is covered by overzoomed child
|
37987 | }
|
37988 | }
|
37989 | else {
|
37990 | // check if all 4 immediate children are loaded (i.e. the missing ideal tile is covered)
|
37991 | const children = tileID.children(this._source.maxzoom);
|
37992 | if (retain[children[0].key] &&
|
37993 | retain[children[1].key] &&
|
37994 | retain[children[2].key] &&
|
37995 | retain[children[3].key])
|
37996 | continue; // tile is covered by children
|
37997 | }
|
37998 | // We couldn't find child tiles that entirely cover the ideal tile; look for parents now.
|
37999 | // As we ascend up the tile pyramid of the ideal tile, we check whether the parent
|
38000 | // tile has been previously requested (and errored because we only loop over tiles with no data)
|
38001 | // in order to determine if we need to request its parent.
|
38002 | let parentWasRequested = tile.wasRequested();
|
38003 | for (let overscaledZ = tileID.overscaledZ - 1; overscaledZ >= minCoveringZoom; --overscaledZ) {
|
38004 | const parentId = tileID.scaledTo(overscaledZ);
|
38005 | // Break parent tile ascent if this route has been previously checked by another child.
|
38006 | if (checked[parentId.key])
|
38007 | break;
|
38008 | checked[parentId.key] = true;
|
38009 | tile = this.getTile(parentId);
|
38010 | if (!tile && parentWasRequested) {
|
38011 | tile = this._addTile(parentId);
|
38012 | }
|
38013 | if (tile) {
|
38014 | retain[parentId.key] = parentId;
|
38015 | // Save the current values, since they're the parent of the next iteration
|
38016 | // of the parent tile ascent loop.
|
38017 | parentWasRequested = tile.wasRequested();
|
38018 | if (tile.hasData())
|
38019 | break;
|
38020 | }
|
38021 | }
|
38022 | }
|
38023 | return retain;
|
38024 | }
|
38025 | _updateLoadedParentTileCache() {
|
38026 | this._loadedParentTiles = {};
|
38027 | for (const tileKey in this._tiles) {
|
38028 | const path = [];
|
38029 | let parentTile;
|
38030 | let currentId = this._tiles[tileKey].tileID;
|
38031 | // Find the closest loaded ancestor by traversing the tile tree towards the root and
|
38032 | // caching results along the way
|
38033 | while (currentId.overscaledZ > 0) {
|
38034 | // Do we have a cached result from previous traversals?
|
38035 | if (currentId.key in this._loadedParentTiles) {
|
38036 | parentTile = this._loadedParentTiles[currentId.key];
|
38037 | break;
|
38038 | }
|
38039 | path.push(currentId.key);
|
38040 | // Is the parent loaded?
|
38041 | const parentId = currentId.scaledTo(currentId.overscaledZ - 1);
|
38042 | parentTile = this._getLoadedTile(parentId);
|
38043 | if (parentTile) {
|
38044 | break;
|
38045 | }
|
38046 | currentId = parentId;
|
38047 | }
|
38048 | // Cache the result of this traversal to all newly visited tiles
|
38049 | for (const key of path) {
|
38050 | this._loadedParentTiles[key] = parentTile;
|
38051 | }
|
38052 | }
|
38053 | }
|
38054 | /**
|
38055 | * Add a tile, given its coordinate, to the pyramid.
|
38056 | * @private
|
38057 | */
|
38058 | _addTile(tileID) {
|
38059 | let tile = this._tiles[tileID.key];
|
38060 | if (tile)
|
38061 | return tile;
|
38062 | tile = this._cache.getAndRemove(tileID);
|
38063 | if (tile) {
|
38064 | this._setTileReloadTimer(tileID.key, tile);
|
38065 | // set the tileID because the cached tile could have had a different wrap value
|
38066 | tile.tileID = tileID;
|
38067 | this._state.initializeTileState(tile, this.map ? this.map.painter : null);
|
38068 | if (this._cacheTimers[tileID.key]) {
|
38069 | clearTimeout(this._cacheTimers[tileID.key]);
|
38070 | delete this._cacheTimers[tileID.key];
|
38071 | this._setTileReloadTimer(tileID.key, tile);
|
38072 | }
|
38073 | }
|
38074 | const cached = tile;
|
38075 | if (!tile) {
|
38076 | tile = new Tile(tileID, this._source.tileSize * tileID.overscaleFactor());
|
38077 | this._loadTile(tile, this._tileLoaded.bind(this, tile, tileID.key, tile.state));
|
38078 | }
|
38079 | tile.uses++;
|
38080 | this._tiles[tileID.key] = tile;
|
38081 | if (!cached) {
|
38082 | this._source.fire(new performance.Event('dataloading', { tile, coord: tile.tileID, dataType: 'source' }));
|
38083 | }
|
38084 | return tile;
|
38085 | }
|
38086 | _setTileReloadTimer(id, tile) {
|
38087 | if (id in this._timers) {
|
38088 | clearTimeout(this._timers[id]);
|
38089 | delete this._timers[id];
|
38090 | }
|
38091 | const expiryTimeout = tile.getExpiryTimeout();
|
38092 | if (expiryTimeout) {
|
38093 | this._timers[id] = setTimeout(() => {
|
38094 | this._reloadTile(id, 'expired');
|
38095 | delete this._timers[id];
|
38096 | }, expiryTimeout);
|
38097 | }
|
38098 | }
|
38099 | /**
|
38100 | * Remove a tile, given its id, from the pyramid
|
38101 | * @private
|
38102 | */
|
38103 | _removeTile(id) {
|
38104 | const tile = this._tiles[id];
|
38105 | if (!tile)
|
38106 | return;
|
38107 | tile.uses--;
|
38108 | delete this._tiles[id];
|
38109 | if (this._timers[id]) {
|
38110 | clearTimeout(this._timers[id]);
|
38111 | delete this._timers[id];
|
38112 | }
|
38113 | if (tile.uses > 0)
|
38114 | return;
|
38115 | if (tile.hasData() && tile.state !== 'reloading') {
|
38116 | this._cache.add(tile.tileID, tile, tile.getExpiryTimeout());
|
38117 | }
|
38118 | else {
|
38119 | tile.aborted = true;
|
38120 | this._abortTile(tile);
|
38121 | this._unloadTile(tile);
|
38122 | }
|
38123 | }
|
38124 | /**
|
38125 | * Remove all tiles from this pyramid
|
38126 | */
|
38127 | clearTiles() {
|
38128 | this._shouldReloadOnResume = false;
|
38129 | this._paused = false;
|
38130 | for (const id in this._tiles)
|
38131 | this._removeTile(id);
|
38132 | this._cache.reset();
|
38133 | }
|
38134 | /**
|
38135 | * Search through our current tiles and attempt to find the tiles that
|
38136 | * cover the given bounds.
|
38137 | * @param pointQueryGeometry coordinates of the corners of bounding rectangle
|
38138 | * @returns {Array<Object>} result items have {tile, minX, maxX, minY, maxY}, where min/max bounding values are the given bounds transformed in into the coordinate space of this tile.
|
38139 | * @private
|
38140 | */
|
38141 | tilesIn(pointQueryGeometry, maxPitchScaleFactor, has3DLayer) {
|
38142 | const tileResults = [];
|
38143 | const transform = this.transform;
|
38144 | if (!transform)
|
38145 | return tileResults;
|
38146 | const cameraPointQueryGeometry = has3DLayer ?
|
38147 | transform.getCameraQueryGeometry(pointQueryGeometry) :
|
38148 | pointQueryGeometry;
|
38149 | const queryGeometry = pointQueryGeometry.map((p) => transform.pointCoordinate(p));
|
38150 | const cameraQueryGeometry = cameraPointQueryGeometry.map((p) => transform.pointCoordinate(p));
|
38151 | const ids = this.getIds();
|
38152 | let minX = Infinity;
|
38153 | let minY = Infinity;
|
38154 | let maxX = -Infinity;
|
38155 | let maxY = -Infinity;
|
38156 | for (const p of cameraQueryGeometry) {
|
38157 | minX = Math.min(minX, p.x);
|
38158 | minY = Math.min(minY, p.y);
|
38159 | maxX = Math.max(maxX, p.x);
|
38160 | maxY = Math.max(maxY, p.y);
|
38161 | }
|
38162 | for (let i = 0; i < ids.length; i++) {
|
38163 | const tile = this._tiles[ids[i]];
|
38164 | if (tile.holdingForFade()) {
|
38165 | // Tiles held for fading are covered by tiles that are closer to ideal
|
38166 | continue;
|
38167 | }
|
38168 | const tileID = tile.tileID;
|
38169 | const scale = Math.pow(2, transform.zoom - tile.tileID.overscaledZ);
|
38170 | const queryPadding = maxPitchScaleFactor * tile.queryPadding * performance.EXTENT / tile.tileSize / scale;
|
38171 | const tileSpaceBounds = [
|
38172 | tileID.getTilePoint(new performance.MercatorCoordinate(minX, minY)),
|
38173 | tileID.getTilePoint(new performance.MercatorCoordinate(maxX, maxY))
|
38174 | ];
|
38175 | if (tileSpaceBounds[0].x - queryPadding < performance.EXTENT && tileSpaceBounds[0].y - queryPadding < performance.EXTENT &&
|
38176 | tileSpaceBounds[1].x + queryPadding >= 0 && tileSpaceBounds[1].y + queryPadding >= 0) {
|
38177 | const tileSpaceQueryGeometry = queryGeometry.map((c) => tileID.getTilePoint(c));
|
38178 | const tileSpaceCameraQueryGeometry = cameraQueryGeometry.map((c) => tileID.getTilePoint(c));
|
38179 | tileResults.push({
|
38180 | tile,
|
38181 | tileID,
|
38182 | queryGeometry: tileSpaceQueryGeometry,
|
38183 | cameraQueryGeometry: tileSpaceCameraQueryGeometry,
|
38184 | scale
|
38185 | });
|
38186 | }
|
38187 | }
|
38188 | return tileResults;
|
38189 | }
|
38190 | getVisibleCoordinates(symbolLayer) {
|
38191 | const coords = this.getRenderableIds(symbolLayer).map((id) => this._tiles[id].tileID);
|
38192 | for (const coord of coords) {
|
38193 | coord.posMatrix = this.transform.calculatePosMatrix(coord.toUnwrapped());
|
38194 | }
|
38195 | return coords;
|
38196 | }
|
38197 | hasTransition() {
|
38198 | if (this._source.hasTransition()) {
|
38199 | return true;
|
38200 | }
|
38201 | if (isRasterType(this._source.type)) {
|
38202 | for (const id in this._tiles) {
|
38203 | const tile = this._tiles[id];
|
38204 | if (tile.fadeEndTime !== undefined && tile.fadeEndTime >= performance.exported.now()) {
|
38205 | return true;
|
38206 | }
|
38207 | }
|
38208 | }
|
38209 | return false;
|
38210 | }
|
38211 | /**
|
38212 | * Set the value of a particular state for a feature
|
38213 | * @private
|
38214 | */
|
38215 | setFeatureState(sourceLayer, featureId, state) {
|
38216 | sourceLayer = sourceLayer || '_geojsonTileLayer';
|
38217 | this._state.updateState(sourceLayer, featureId, state);
|
38218 | }
|
38219 | /**
|
38220 | * Resets the value of a particular state key for a feature
|
38221 | * @private
|
38222 | */
|
38223 | removeFeatureState(sourceLayer, featureId, key) {
|
38224 | sourceLayer = sourceLayer || '_geojsonTileLayer';
|
38225 | this._state.removeFeatureState(sourceLayer, featureId, key);
|
38226 | }
|
38227 | /**
|
38228 | * Get the entire state object for a feature
|
38229 | * @private
|
38230 | */
|
38231 | getFeatureState(sourceLayer, featureId) {
|
38232 | sourceLayer = sourceLayer || '_geojsonTileLayer';
|
38233 | return this._state.getState(sourceLayer, featureId);
|
38234 | }
|
38235 | /**
|
38236 | * Sets the set of keys that the tile depends on. This allows tiles to
|
38237 | * be reloaded when their dependencies change.
|
38238 | * @private
|
38239 | */
|
38240 | setDependencies(tileKey, namespace, dependencies) {
|
38241 | const tile = this._tiles[tileKey];
|
38242 | if (tile) {
|
38243 | tile.setDependencies(namespace, dependencies);
|
38244 | }
|
38245 | }
|
38246 | /**
|
38247 | * Reloads all tiles that depend on the given keys.
|
38248 | * @private
|
38249 | */
|
38250 | reloadTilesForDependencies(namespaces, keys) {
|
38251 | for (const id in this._tiles) {
|
38252 | const tile = this._tiles[id];
|
38253 | if (tile.hasDependency(namespaces, keys)) {
|
38254 | this._reloadTile(id, 'reloading');
|
38255 | }
|
38256 | }
|
38257 | this._cache.filter(tile => !tile.hasDependency(namespaces, keys));
|
38258 | }
|
38259 | }
|
38260 | SourceCache.maxOverzooming = 10;
|
38261 | SourceCache.maxUnderzooming = 3;
|
38262 | function compareTileId(a, b) {
|
38263 | // Different copies of the world are sorted based on their distance to the center.
|
38264 | // Wrap values are converted to unsigned distances by reserving odd number for copies
|
38265 | // with negative wrap and even numbers for copies with positive wrap.
|
38266 | const aWrap = Math.abs(a.wrap * 2) - +(a.wrap < 0);
|
38267 | const bWrap = Math.abs(b.wrap * 2) - +(b.wrap < 0);
|
38268 | return a.overscaledZ - b.overscaledZ || bWrap - aWrap || b.canonical.y - a.canonical.y || b.canonical.x - a.canonical.x;
|
38269 | }
|
38270 | function isRasterType(type) {
|
38271 | return type === 'raster' || type === 'image' || type === 'video';
|
38272 | }
|
38273 |
|
38274 | function workerFactory() {
|
38275 | return new Worker(maplibregl.workerUrl);
|
38276 | }
|
38277 |
|
38278 | const PRELOAD_POOL_ID = 'mapboxgl_preloaded_worker_pool';
|
38279 | /**
|
38280 | * Constructs a worker pool.
|
38281 | * @private
|
38282 | */
|
38283 | class WorkerPool {
|
38284 | constructor() {
|
38285 | this.active = {};
|
38286 | }
|
38287 | acquire(mapId) {
|
38288 | if (!this.workers) {
|
38289 | // Lazily look up the value of mapboxgl.workerCount so that
|
38290 | // client code has had a chance to set it.
|
38291 | this.workers = [];
|
38292 | while (this.workers.length < WorkerPool.workerCount) {
|
38293 | this.workers.push(workerFactory());
|
38294 | }
|
38295 | }
|
38296 | this.active[mapId] = true;
|
38297 | return this.workers.slice();
|
38298 | }
|
38299 | release(mapId) {
|
38300 | delete this.active[mapId];
|
38301 | if (this.numActive() === 0) {
|
38302 | this.workers.forEach((w) => {
|
38303 | w.terminate();
|
38304 | });
|
38305 | this.workers = null;
|
38306 | }
|
38307 | }
|
38308 | isPreloaded() {
|
38309 | return !!this.active[PRELOAD_POOL_ID];
|
38310 | }
|
38311 | numActive() {
|
38312 | return Object.keys(this.active).length;
|
38313 | }
|
38314 | }
|
38315 | const availableLogicalProcessors = Math.floor(performance.exported.hardwareConcurrency / 2);
|
38316 | WorkerPool.workerCount = Math.max(Math.min(availableLogicalProcessors, 6), 1);
|
38317 |
|
38318 | let globalWorkerPool;
|
38319 | /**
|
38320 | * Creates (if necessary) and returns the single, global WorkerPool instance
|
38321 | * to be shared across each Map
|
38322 | * @private
|
38323 | */
|
38324 | function getGlobalWorkerPool() {
|
38325 | if (!globalWorkerPool) {
|
38326 | globalWorkerPool = new WorkerPool();
|
38327 | }
|
38328 | return globalWorkerPool;
|
38329 | }
|
38330 | function prewarm() {
|
38331 | const workerPool = getGlobalWorkerPool();
|
38332 | workerPool.acquire(PRELOAD_POOL_ID);
|
38333 | }
|
38334 | function clearPrewarmedResources() {
|
38335 | const pool = globalWorkerPool;
|
38336 | if (pool) {
|
38337 | // Remove the pool only if all maps that referenced the preloaded global worker pool have been removed.
|
38338 | if (pool.isPreloaded() && pool.numActive() === 1) {
|
38339 | pool.release(PRELOAD_POOL_ID);
|
38340 | globalWorkerPool = null;
|
38341 | }
|
38342 | else {
|
38343 | console.warn('Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()');
|
38344 | }
|
38345 | }
|
38346 | }
|
38347 |
|
38348 | function deref(layer, parent) {
|
38349 | const result = {};
|
38350 | for (const k in layer) {
|
38351 | if (k !== 'ref') {
|
38352 | result[k] = layer[k];
|
38353 | }
|
38354 | }
|
38355 | performance.refProperties.forEach((k) => {
|
38356 | if (k in parent) {
|
38357 | result[k] = parent[k];
|
38358 | }
|
38359 | });
|
38360 | return result;
|
38361 | }
|
38362 | /**
|
38363 | * Given an array of layers, some of which may contain `ref` properties
|
38364 | * whose value is the `id` of another property, return a new array where
|
38365 | * such layers have been augmented with the 'type', 'source', etc. properties
|
38366 | * from the parent layer, and the `ref` property has been removed.
|
38367 | *
|
38368 | * The input is not modified. The output may contain references to portions
|
38369 | * of the input.
|
38370 | *
|
38371 | * @private
|
38372 | * @param {Array<Layer>} layers
|
38373 | * @returns {Array<Layer>}
|
38374 | */
|
38375 | function derefLayers(layers) {
|
38376 | layers = layers.slice();
|
38377 | const map = Object.create(null);
|
38378 | for (let i = 0; i < layers.length; i++) {
|
38379 | map[layers[i].id] = layers[i];
|
38380 | }
|
38381 | for (let i = 0; i < layers.length; i++) {
|
38382 | if ('ref' in layers[i]) {
|
38383 | layers[i] = deref(layers[i], map[layers[i].ref]);
|
38384 | }
|
38385 | }
|
38386 | return layers;
|
38387 | }
|
38388 |
|
38389 | function emptyStyle() {
|
38390 | const style = {};
|
38391 | const version = performance.spec['$version'];
|
38392 | for (const styleKey in performance.spec['$root']) {
|
38393 | const spec = performance.spec['$root'][styleKey];
|
38394 | if (spec.required) {
|
38395 | let value = null;
|
38396 | if (styleKey === 'version') {
|
38397 | value = version;
|
38398 | }
|
38399 | else {
|
38400 | if (spec.type === 'array') {
|
38401 | value = [];
|
38402 | }
|
38403 | else {
|
38404 | value = {};
|
38405 | }
|
38406 | }
|
38407 | if (value != null) {
|
38408 | style[styleKey] = value;
|
38409 | }
|
38410 | }
|
38411 | }
|
38412 | return style;
|
38413 | }
|
38414 |
|
38415 | const operations = {
|
38416 | /*
|
38417 | * { command: 'setStyle', args: [stylesheet] }
|
38418 | */
|
38419 | setStyle: 'setStyle',
|
38420 | /*
|
38421 | * { command: 'addLayer', args: [layer, 'beforeLayerId'] }
|
38422 | */
|
38423 | addLayer: 'addLayer',
|
38424 | /*
|
38425 | * { command: 'removeLayer', args: ['layerId'] }
|
38426 | */
|
38427 | removeLayer: 'removeLayer',
|
38428 | /*
|
38429 | * { command: 'setPaintProperty', args: ['layerId', 'prop', value] }
|
38430 | */
|
38431 | setPaintProperty: 'setPaintProperty',
|
38432 | /*
|
38433 | * { command: 'setLayoutProperty', args: ['layerId', 'prop', value] }
|
38434 | */
|
38435 | setLayoutProperty: 'setLayoutProperty',
|
38436 | /*
|
38437 | * { command: 'setFilter', args: ['layerId', filter] }
|
38438 | */
|
38439 | setFilter: 'setFilter',
|
38440 | /*
|
38441 | * { command: 'addSource', args: ['sourceId', source] }
|
38442 | */
|
38443 | addSource: 'addSource',
|
38444 | /*
|
38445 | * { command: 'removeSource', args: ['sourceId'] }
|
38446 | */
|
38447 | removeSource: 'removeSource',
|
38448 | /*
|
38449 | * { command: 'setGeoJSONSourceData', args: ['sourceId', data] }
|
38450 | */
|
38451 | setGeoJSONSourceData: 'setGeoJSONSourceData',
|
38452 | /*
|
38453 | * { command: 'setLayerZoomRange', args: ['layerId', 0, 22] }
|
38454 | */
|
38455 | setLayerZoomRange: 'setLayerZoomRange',
|
38456 | /*
|
38457 | * { command: 'setLayerProperty', args: ['layerId', 'prop', value] }
|
38458 | */
|
38459 | setLayerProperty: 'setLayerProperty',
|
38460 | /*
|
38461 | * { command: 'setCenter', args: [[lon, lat]] }
|
38462 | */
|
38463 | setCenter: 'setCenter',
|
38464 | /*
|
38465 | * { command: 'setZoom', args: [zoom] }
|
38466 | */
|
38467 | setZoom: 'setZoom',
|
38468 | /*
|
38469 | * { command: 'setBearing', args: [bearing] }
|
38470 | */
|
38471 | setBearing: 'setBearing',
|
38472 | /*
|
38473 | * { command: 'setPitch', args: [pitch] }
|
38474 | */
|
38475 | setPitch: 'setPitch',
|
38476 | /*
|
38477 | * { command: 'setSprite', args: ['spriteUrl'] }
|
38478 | */
|
38479 | setSprite: 'setSprite',
|
38480 | /*
|
38481 | * { command: 'setGlyphs', args: ['glyphsUrl'] }
|
38482 | */
|
38483 | setGlyphs: 'setGlyphs',
|
38484 | /*
|
38485 | * { command: 'setTransition', args: [transition] }
|
38486 | */
|
38487 | setTransition: 'setTransition',
|
38488 | /*
|
38489 | * { command: 'setLighting', args: [lightProperties] }
|
38490 | */
|
38491 | setLight: 'setLight'
|
38492 | };
|
38493 | function addSource(sourceId, after, commands) {
|
38494 | commands.push({ command: operations.addSource, args: [sourceId, after[sourceId]] });
|
38495 | }
|
38496 | function removeSource(sourceId, commands, sourcesRemoved) {
|
38497 | commands.push({ command: operations.removeSource, args: [sourceId] });
|
38498 | sourcesRemoved[sourceId] = true;
|
38499 | }
|
38500 | function updateSource(sourceId, after, commands, sourcesRemoved) {
|
38501 | removeSource(sourceId, commands, sourcesRemoved);
|
38502 | addSource(sourceId, after, commands);
|
38503 | }
|
38504 | function canUpdateGeoJSON(before, after, sourceId) {
|
38505 | let prop;
|
38506 | for (prop in before[sourceId]) {
|
38507 | if (!Object.prototype.hasOwnProperty.call(before[sourceId], prop))
|
38508 | continue;
|
38509 | if (prop !== 'data' && !performance.deepEqual(before[sourceId][prop], after[sourceId][prop])) {
|
38510 | return false;
|
38511 | }
|
38512 | }
|
38513 | for (prop in after[sourceId]) {
|
38514 | if (!Object.prototype.hasOwnProperty.call(after[sourceId], prop))
|
38515 | continue;
|
38516 | if (prop !== 'data' && !performance.deepEqual(before[sourceId][prop], after[sourceId][prop])) {
|
38517 | return false;
|
38518 | }
|
38519 | }
|
38520 | return true;
|
38521 | }
|
38522 | function diffSources(before, after, commands, sourcesRemoved) {
|
38523 | before = before || {};
|
38524 | after = after || {};
|
38525 | let sourceId;
|
38526 | // look for sources to remove
|
38527 | for (sourceId in before) {
|
38528 | if (!Object.prototype.hasOwnProperty.call(before, sourceId))
|
38529 | continue;
|
38530 | if (!Object.prototype.hasOwnProperty.call(after, sourceId)) {
|
38531 | removeSource(sourceId, commands, sourcesRemoved);
|
38532 | }
|
38533 | }
|
38534 | // look for sources to add/update
|
38535 | for (sourceId in after) {
|
38536 | if (!Object.prototype.hasOwnProperty.call(after, sourceId))
|
38537 | continue;
|
38538 | if (!Object.prototype.hasOwnProperty.call(before, sourceId)) {
|
38539 | addSource(sourceId, after, commands);
|
38540 | }
|
38541 | else if (!performance.deepEqual(before[sourceId], after[sourceId])) {
|
38542 | if (before[sourceId].type === 'geojson' && after[sourceId].type === 'geojson' && canUpdateGeoJSON(before, after, sourceId)) {
|
38543 | commands.push({ command: operations.setGeoJSONSourceData, args: [sourceId, after[sourceId].data] });
|
38544 | }
|
38545 | else {
|
38546 | // no update command, must remove then add
|
38547 | updateSource(sourceId, after, commands, sourcesRemoved);
|
38548 | }
|
38549 | }
|
38550 | }
|
38551 | }
|
38552 | function diffLayerPropertyChanges(before, after, commands, layerId, klass, command) {
|
38553 | before = before || {};
|
38554 | after = after || {};
|
38555 | let prop;
|
38556 | for (prop in before) {
|
38557 | if (!Object.prototype.hasOwnProperty.call(before, prop))
|
38558 | continue;
|
38559 | if (!performance.deepEqual(before[prop], after[prop])) {
|
38560 | commands.push({ command, args: [layerId, prop, after[prop], klass] });
|
38561 | }
|
38562 | }
|
38563 | for (prop in after) {
|
38564 | if (!Object.prototype.hasOwnProperty.call(after, prop) || Object.prototype.hasOwnProperty.call(before, prop))
|
38565 | continue;
|
38566 | if (!performance.deepEqual(before[prop], after[prop])) {
|
38567 | commands.push({ command, args: [layerId, prop, after[prop], klass] });
|
38568 | }
|
38569 | }
|
38570 | }
|
38571 | function pluckId(layer) {
|
38572 | return layer.id;
|
38573 | }
|
38574 | function indexById(group, layer) {
|
38575 | group[layer.id] = layer;
|
38576 | return group;
|
38577 | }
|
38578 | function diffLayers(before, after, commands) {
|
38579 | before = before || [];
|
38580 | after = after || [];
|
38581 | // order of layers by id
|
38582 | const beforeOrder = before.map(pluckId);
|
38583 | const afterOrder = after.map(pluckId);
|
38584 | // index of layer by id
|
38585 | const beforeIndex = before.reduce(indexById, {});
|
38586 | const afterIndex = after.reduce(indexById, {});
|
38587 | // track order of layers as if they have been mutated
|
38588 | const tracker = beforeOrder.slice();
|
38589 | // layers that have been added do not need to be diffed
|
38590 | const clean = Object.create(null);
|
38591 | let i, d, layerId, beforeLayer, afterLayer, insertBeforeLayerId, prop;
|
38592 | // remove layers
|
38593 | for (i = 0, d = 0; i < beforeOrder.length; i++) {
|
38594 | layerId = beforeOrder[i];
|
38595 | if (!Object.prototype.hasOwnProperty.call(afterIndex, layerId)) {
|
38596 | commands.push({ command: operations.removeLayer, args: [layerId] });
|
38597 | tracker.splice(tracker.indexOf(layerId, d), 1);
|
38598 | }
|
38599 | else {
|
38600 | // limit where in tracker we need to look for a match
|
38601 | d++;
|
38602 | }
|
38603 | }
|
38604 | // add/reorder layers
|
38605 | for (i = 0, d = 0; i < afterOrder.length; i++) {
|
38606 | // work backwards as insert is before an existing layer
|
38607 | layerId = afterOrder[afterOrder.length - 1 - i];
|
38608 | if (tracker[tracker.length - 1 - i] === layerId)
|
38609 | continue;
|
38610 | if (Object.prototype.hasOwnProperty.call(beforeIndex, layerId)) {
|
38611 | // remove the layer before we insert at the correct position
|
38612 | commands.push({ command: operations.removeLayer, args: [layerId] });
|
38613 | tracker.splice(tracker.lastIndexOf(layerId, tracker.length - d), 1);
|
38614 | }
|
38615 | else {
|
38616 | // limit where in tracker we need to look for a match
|
38617 | d++;
|
38618 | }
|
38619 | // add layer at correct position
|
38620 | insertBeforeLayerId = tracker[tracker.length - i];
|
38621 | commands.push({ command: operations.addLayer, args: [afterIndex[layerId], insertBeforeLayerId] });
|
38622 | tracker.splice(tracker.length - i, 0, layerId);
|
38623 | clean[layerId] = true;
|
38624 | }
|
38625 | // update layers
|
38626 | for (i = 0; i < afterOrder.length; i++) {
|
38627 | layerId = afterOrder[i];
|
38628 | beforeLayer = beforeIndex[layerId];
|
38629 | afterLayer = afterIndex[layerId];
|
38630 | // no need to update if previously added (new or moved)
|
38631 | if (clean[layerId] || performance.deepEqual(beforeLayer, afterLayer))
|
38632 | continue;
|
38633 | // If source, source-layer, or type have changes, then remove the layer
|
38634 | // and add it back 'from scratch'.
|
38635 | if (!performance.deepEqual(beforeLayer.source, afterLayer.source) || !performance.deepEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !performance.deepEqual(beforeLayer.type, afterLayer.type)) {
|
38636 | commands.push({ command: operations.removeLayer, args: [layerId] });
|
38637 | // we add the layer back at the same position it was already in, so
|
38638 | // there's no need to update the `tracker`
|
38639 | insertBeforeLayerId = tracker[tracker.lastIndexOf(layerId) + 1];
|
38640 | commands.push({ command: operations.addLayer, args: [afterLayer, insertBeforeLayerId] });
|
38641 | continue;
|
38642 | }
|
38643 | // layout, paint, filter, minzoom, maxzoom
|
38644 | diffLayerPropertyChanges(beforeLayer.layout, afterLayer.layout, commands, layerId, null, operations.setLayoutProperty);
|
38645 | diffLayerPropertyChanges(beforeLayer.paint, afterLayer.paint, commands, layerId, null, operations.setPaintProperty);
|
38646 | if (!performance.deepEqual(beforeLayer.filter, afterLayer.filter)) {
|
38647 | commands.push({ command: operations.setFilter, args: [layerId, afterLayer.filter] });
|
38648 | }
|
38649 | if (!performance.deepEqual(beforeLayer.minzoom, afterLayer.minzoom) || !performance.deepEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) {
|
38650 | commands.push({ command: operations.setLayerZoomRange, args: [layerId, afterLayer.minzoom, afterLayer.maxzoom] });
|
38651 | }
|
38652 | // handle all other layer props, including paint.*
|
38653 | for (prop in beforeLayer) {
|
38654 | if (!Object.prototype.hasOwnProperty.call(beforeLayer, prop))
|
38655 | continue;
|
38656 | if (prop === 'layout' || prop === 'paint' || prop === 'filter' ||
|
38657 | prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom')
|
38658 | continue;
|
38659 | if (prop.indexOf('paint.') === 0) {
|
38660 | diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty);
|
38661 | }
|
38662 | else if (!performance.deepEqual(beforeLayer[prop], afterLayer[prop])) {
|
38663 | commands.push({ command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]] });
|
38664 | }
|
38665 | }
|
38666 | for (prop in afterLayer) {
|
38667 | if (!Object.prototype.hasOwnProperty.call(afterLayer, prop) || Object.prototype.hasOwnProperty.call(beforeLayer, prop))
|
38668 | continue;
|
38669 | if (prop === 'layout' || prop === 'paint' || prop === 'filter' ||
|
38670 | prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom')
|
38671 | continue;
|
38672 | if (prop.indexOf('paint.') === 0) {
|
38673 | diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty);
|
38674 | }
|
38675 | else if (!performance.deepEqual(beforeLayer[prop], afterLayer[prop])) {
|
38676 | commands.push({ command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]] });
|
38677 | }
|
38678 | }
|
38679 | }
|
38680 | }
|
38681 | /**
|
38682 | * Diff two stylesheet
|
38683 | *
|
38684 | * Creates semanticly aware diffs that can easily be applied at runtime.
|
38685 | * Operations produced by the diff closely resemble the maplibre-gl-js API. Any
|
38686 | * error creating the diff will fall back to the 'setStyle' operation.
|
38687 | *
|
38688 | * Example diff:
|
38689 | * [
|
38690 | * { command: 'setConstant', args: ['@water', '#0000FF'] },
|
38691 | * { command: 'setPaintProperty', args: ['background', 'background-color', 'black'] }
|
38692 | * ]
|
38693 | *
|
38694 | * @private
|
38695 | * @param {*} [before] stylesheet to compare from
|
38696 | * @param {*} after stylesheet to compare to
|
38697 | * @returns Array list of changes
|
38698 | */
|
38699 | function diffStyles(before, after) {
|
38700 | if (!before)
|
38701 | return [{ command: operations.setStyle, args: [after] }];
|
38702 | let commands = [];
|
38703 | try {
|
38704 | // Handle changes to top-level properties
|
38705 | if (!performance.deepEqual(before.version, after.version)) {
|
38706 | return [{ command: operations.setStyle, args: [after] }];
|
38707 | }
|
38708 | if (!performance.deepEqual(before.center, after.center)) {
|
38709 | commands.push({ command: operations.setCenter, args: [after.center] });
|
38710 | }
|
38711 | if (!performance.deepEqual(before.zoom, after.zoom)) {
|
38712 | commands.push({ command: operations.setZoom, args: [after.zoom] });
|
38713 | }
|
38714 | if (!performance.deepEqual(before.bearing, after.bearing)) {
|
38715 | commands.push({ command: operations.setBearing, args: [after.bearing] });
|
38716 | }
|
38717 | if (!performance.deepEqual(before.pitch, after.pitch)) {
|
38718 | commands.push({ command: operations.setPitch, args: [after.pitch] });
|
38719 | }
|
38720 | if (!performance.deepEqual(before.sprite, after.sprite)) {
|
38721 | commands.push({ command: operations.setSprite, args: [after.sprite] });
|
38722 | }
|
38723 | if (!performance.deepEqual(before.glyphs, after.glyphs)) {
|
38724 | commands.push({ command: operations.setGlyphs, args: [after.glyphs] });
|
38725 | }
|
38726 | if (!performance.deepEqual(before.transition, after.transition)) {
|
38727 | commands.push({ command: operations.setTransition, args: [after.transition] });
|
38728 | }
|
38729 | if (!performance.deepEqual(before.light, after.light)) {
|
38730 | commands.push({ command: operations.setLight, args: [after.light] });
|
38731 | }
|
38732 | // Handle changes to `sources`
|
38733 | // If a source is to be removed, we also--before the removeSource
|
38734 | // command--need to remove all the style layers that depend on it.
|
38735 | const sourcesRemoved = {};
|
38736 | // First collect the {add,remove}Source commands
|
38737 | const removeOrAddSourceCommands = [];
|
38738 | diffSources(before.sources, after.sources, removeOrAddSourceCommands, sourcesRemoved);
|
38739 | // Push a removeLayer command for each style layer that depends on a
|
38740 | // source that's being removed.
|
38741 | // Also, exclude any such layers them from the input to `diffLayers`
|
38742 | // below, so that diffLayers produces the appropriate `addLayers`
|
38743 | // command
|
38744 | const beforeLayers = [];
|
38745 | if (before.layers) {
|
38746 | before.layers.forEach((layer) => {
|
38747 | if (sourcesRemoved[layer.source]) {
|
38748 | commands.push({ command: operations.removeLayer, args: [layer.id] });
|
38749 | }
|
38750 | else {
|
38751 | beforeLayers.push(layer);
|
38752 | }
|
38753 | });
|
38754 | }
|
38755 | commands = commands.concat(removeOrAddSourceCommands);
|
38756 | // Handle changes to `layers`
|
38757 | diffLayers(beforeLayers, after.layers, commands);
|
38758 | }
|
38759 | catch (e) {
|
38760 | // fall back to setStyle
|
38761 | console.warn('Unable to compute style diff:', e);
|
38762 | commands = [{ command: operations.setStyle, args: [after] }];
|
38763 | }
|
38764 | return commands;
|
38765 | }
|
38766 |
|
38767 | class PathInterpolator {
|
38768 | constructor(points_, padding_) {
|
38769 | this.reset(points_, padding_);
|
38770 | }
|
38771 | reset(points_, padding_) {
|
38772 | this.points = points_ || [];
|
38773 | // Compute cumulative distance from first point to every other point in the segment.
|
38774 | // Last entry in the array is total length of the path
|
38775 | this._distances = [0.0];
|
38776 | for (let i = 1; i < this.points.length; i++) {
|
38777 | this._distances[i] = this._distances[i - 1] + this.points[i].dist(this.points[i - 1]);
|
38778 | }
|
38779 | this.length = this._distances[this._distances.length - 1];
|
38780 | this.padding = Math.min(padding_ || 0, this.length * 0.5);
|
38781 | this.paddedLength = this.length - this.padding * 2.0;
|
38782 | }
|
38783 | lerp(t) {
|
38784 | performance.assert(this.points.length > 0);
|
38785 | if (this.points.length === 1) {
|
38786 | return this.points[0];
|
38787 | }
|
38788 | t = performance.clamp(t, 0, 1);
|
38789 | // Find the correct segment [p0, p1] where p0 <= x < p1
|
38790 | let currentIndex = 1;
|
38791 | let distOfCurrentIdx = this._distances[currentIndex];
|
38792 | const distToTarget = t * this.paddedLength + this.padding;
|
38793 | while (distOfCurrentIdx < distToTarget && currentIndex < this._distances.length) {
|
38794 | distOfCurrentIdx = this._distances[++currentIndex];
|
38795 | }
|
38796 | // Interpolate between the two points of the segment
|
38797 | const idxOfPrevPoint = currentIndex - 1;
|
38798 | const distOfPrevIdx = this._distances[idxOfPrevPoint];
|
38799 | const segmentLength = distOfCurrentIdx - distOfPrevIdx;
|
38800 | const segmentT = segmentLength > 0 ? (distToTarget - distOfPrevIdx) / segmentLength : 0;
|
38801 | return this.points[idxOfPrevPoint].mult(1.0 - segmentT).add(this.points[currentIndex].mult(segmentT));
|
38802 | }
|
38803 | }
|
38804 |
|
38805 | function overlapAllowed(overlapA, overlapB) {
|
38806 | let allowed = true;
|
38807 | if (overlapA === 'always') {
|
38808 | // symbol A using 'always' overlap - allowed to overlap anything.
|
38809 | }
|
38810 | else if (overlapA === 'never' || overlapB === 'never') {
|
38811 | // symbol A using 'never' overlap - can't overlap anything
|
38812 | // symbol A using 'cooperative' overlap - can overlap 'always' or 'cooperative' symbol; can't overlap 'never'
|
38813 | allowed = false;
|
38814 | }
|
38815 | return allowed;
|
38816 | }
|
38817 | /**
|
38818 | * GridIndex is a data structure for testing the intersection of
|
38819 | * circles and rectangles in a 2d plane.
|
38820 | * It is optimized for rapid insertion and querying.
|
38821 | * GridIndex splits the plane into a set of "cells" and keeps track
|
38822 | * of which geometries intersect with each cell. At query time,
|
38823 | * full geometry comparisons are only done for items that share
|
38824 | * at least one cell. As long as the geometries are relatively
|
38825 | * uniformly distributed across the plane, this greatly reduces
|
38826 | * the number of comparisons necessary.
|
38827 | *
|
38828 | * @private
|
38829 | */
|
38830 | class GridIndex {
|
38831 | constructor(width, height, cellSize) {
|
38832 | const boxCells = this.boxCells = [];
|
38833 | const circleCells = this.circleCells = [];
|
38834 | // More cells -> fewer geometries to check per cell, but items tend
|
38835 | // to be split across more cells.
|
38836 | // Sweet spot allows most small items to fit in one cell
|
38837 | this.xCellCount = Math.ceil(width / cellSize);
|
38838 | this.yCellCount = Math.ceil(height / cellSize);
|
38839 | for (let i = 0; i < this.xCellCount * this.yCellCount; i++) {
|
38840 | boxCells.push([]);
|
38841 | circleCells.push([]);
|
38842 | }
|
38843 | this.circleKeys = [];
|
38844 | this.boxKeys = [];
|
38845 | this.bboxes = [];
|
38846 | this.circles = [];
|
38847 | this.width = width;
|
38848 | this.height = height;
|
38849 | this.xScale = this.xCellCount / width;
|
38850 | this.yScale = this.yCellCount / height;
|
38851 | this.boxUid = 0;
|
38852 | this.circleUid = 0;
|
38853 | }
|
38854 | keysLength() {
|
38855 | return this.boxKeys.length + this.circleKeys.length;
|
38856 | }
|
38857 | insert(key, x1, y1, x2, y2) {
|
38858 | this._forEachCell(x1, y1, x2, y2, this._insertBoxCell, this.boxUid++);
|
38859 | this.boxKeys.push(key);
|
38860 | this.bboxes.push(x1);
|
38861 | this.bboxes.push(y1);
|
38862 | this.bboxes.push(x2);
|
38863 | this.bboxes.push(y2);
|
38864 | }
|
38865 | insertCircle(key, x, y, radius) {
|
38866 | // Insert circle into grid for all cells in the circumscribing square
|
38867 | // It's more than necessary (by a factor of 4/PI), but fast to insert
|
38868 | this._forEachCell(x - radius, y - radius, x + radius, y + radius, this._insertCircleCell, this.circleUid++);
|
38869 | this.circleKeys.push(key);
|
38870 | this.circles.push(x);
|
38871 | this.circles.push(y);
|
38872 | this.circles.push(radius);
|
38873 | }
|
38874 | _insertBoxCell(x1, y1, x2, y2, cellIndex, uid) {
|
38875 | this.boxCells[cellIndex].push(uid);
|
38876 | }
|
38877 | _insertCircleCell(x1, y1, x2, y2, cellIndex, uid) {
|
38878 | this.circleCells[cellIndex].push(uid);
|
38879 | }
|
38880 | _query(x1, y1, x2, y2, hitTest, overlapMode, predicate) {
|
38881 | if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) {
|
38882 | return [];
|
38883 | }
|
38884 | const result = [];
|
38885 | if (x1 <= 0 && y1 <= 0 && this.width <= x2 && this.height <= y2) {
|
38886 | if (hitTest) {
|
38887 | // Covers the entire grid, so collides with everything
|
38888 | return [{
|
38889 | key: null,
|
38890 | x1,
|
38891 | y1,
|
38892 | x2,
|
38893 | y2
|
38894 | }];
|
38895 | }
|
38896 | for (let boxUid = 0; boxUid < this.boxKeys.length; boxUid++) {
|
38897 | result.push({
|
38898 | key: this.boxKeys[boxUid],
|
38899 | x1: this.bboxes[boxUid * 4],
|
38900 | y1: this.bboxes[boxUid * 4 + 1],
|
38901 | x2: this.bboxes[boxUid * 4 + 2],
|
38902 | y2: this.bboxes[boxUid * 4 + 3]
|
38903 | });
|
38904 | }
|
38905 | for (let circleUid = 0; circleUid < this.circleKeys.length; circleUid++) {
|
38906 | const x = this.circles[circleUid * 3];
|
38907 | const y = this.circles[circleUid * 3 + 1];
|
38908 | const radius = this.circles[circleUid * 3 + 2];
|
38909 | result.push({
|
38910 | key: this.circleKeys[circleUid],
|
38911 | x1: x - radius,
|
38912 | y1: y - radius,
|
38913 | x2: x + radius,
|
38914 | y2: y + radius
|
38915 | });
|
38916 | }
|
38917 | }
|
38918 | else {
|
38919 | const queryArgs = {
|
38920 | hitTest,
|
38921 | overlapMode,
|
38922 | seenUids: { box: {}, circle: {} }
|
38923 | };
|
38924 | this._forEachCell(x1, y1, x2, y2, this._queryCell, result, queryArgs, predicate);
|
38925 | }
|
38926 | return result;
|
38927 | }
|
38928 | query(x1, y1, x2, y2) {
|
38929 | return this._query(x1, y1, x2, y2, false, null);
|
38930 | }
|
38931 | hitTest(x1, y1, x2, y2, overlapMode, predicate) {
|
38932 | return this._query(x1, y1, x2, y2, true, overlapMode, predicate).length > 0;
|
38933 | }
|
38934 | hitTestCircle(x, y, radius, overlapMode, predicate) {
|
38935 | // Insert circle into grid for all cells in the circumscribing square
|
38936 | // It's more than necessary (by a factor of 4/PI), but fast to insert
|
38937 | const x1 = x - radius;
|
38938 | const x2 = x + radius;
|
38939 | const y1 = y - radius;
|
38940 | const y2 = y + radius;
|
38941 | if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) {
|
38942 | return false;
|
38943 | }
|
38944 | // Box query early exits if the bounding box is larger than the grid, but we don't do
|
38945 | // the equivalent calculation for circle queries because early exit is less likely
|
38946 | // and the calculation is more expensive
|
38947 | const result = [];
|
38948 | const queryArgs = {
|
38949 | hitTest: true,
|
38950 | overlapMode,
|
38951 | circle: { x, y, radius },
|
38952 | seenUids: { box: {}, circle: {} }
|
38953 | };
|
38954 | this._forEachCell(x1, y1, x2, y2, this._queryCellCircle, result, queryArgs, predicate);
|
38955 | return result.length > 0;
|
38956 | }
|
38957 | _queryCell(x1, y1, x2, y2, cellIndex, result, queryArgs, predicate) {
|
38958 | const { seenUids, hitTest, overlapMode } = queryArgs;
|
38959 | const boxCell = this.boxCells[cellIndex];
|
38960 | if (boxCell !== null) {
|
38961 | const bboxes = this.bboxes;
|
38962 | for (const boxUid of boxCell) {
|
38963 | if (!seenUids.box[boxUid]) {
|
38964 | seenUids.box[boxUid] = true;
|
38965 | const offset = boxUid * 4;
|
38966 | const key = this.boxKeys[boxUid];
|
38967 | if ((x1 <= bboxes[offset + 2]) &&
|
38968 | (y1 <= bboxes[offset + 3]) &&
|
38969 | (x2 >= bboxes[offset + 0]) &&
|
38970 | (y2 >= bboxes[offset + 1]) &&
|
38971 | (!predicate || predicate(key))) {
|
38972 | if (!hitTest || !overlapAllowed(overlapMode, key.overlapMode)) {
|
38973 | result.push({
|
38974 | key,
|
38975 | x1: bboxes[offset],
|
38976 | y1: bboxes[offset + 1],
|
38977 | x2: bboxes[offset + 2],
|
38978 | y2: bboxes[offset + 3]
|
38979 | });
|
38980 | if (hitTest) {
|
38981 | // true return value stops the query after first match
|
38982 | return true;
|
38983 | }
|
38984 | }
|
38985 | }
|
38986 | }
|
38987 | }
|
38988 | }
|
38989 | const circleCell = this.circleCells[cellIndex];
|
38990 | if (circleCell !== null) {
|
38991 | const circles = this.circles;
|
38992 | for (const circleUid of circleCell) {
|
38993 | if (!seenUids.circle[circleUid]) {
|
38994 | seenUids.circle[circleUid] = true;
|
38995 | const offset = circleUid * 3;
|
38996 | const key = this.circleKeys[circleUid];
|
38997 | if (this._circleAndRectCollide(circles[offset], circles[offset + 1], circles[offset + 2], x1, y1, x2, y2) &&
|
38998 | (!predicate || predicate(key))) {
|
38999 | if (!hitTest || !overlapAllowed(overlapMode, key.overlapMode)) {
|
39000 | const x = circles[offset];
|
39001 | const y = circles[offset + 1];
|
39002 | const radius = circles[offset + 2];
|
39003 | result.push({
|
39004 | key,
|
39005 | x1: x - radius,
|
39006 | y1: y - radius,
|
39007 | x2: x + radius,
|
39008 | y2: y + radius
|
39009 | });
|
39010 | if (hitTest) {
|
39011 | // true return value stops the query after first match
|
39012 | return true;
|
39013 | }
|
39014 | }
|
39015 | }
|
39016 | }
|
39017 | }
|
39018 | }
|
39019 | // false return to continue query
|
39020 | return false;
|
39021 | }
|
39022 | _queryCellCircle(x1, y1, x2, y2, cellIndex, result, queryArgs, predicate) {
|
39023 | const { circle, seenUids, overlapMode } = queryArgs;
|
39024 | const boxCell = this.boxCells[cellIndex];
|
39025 | if (boxCell !== null) {
|
39026 | const bboxes = this.bboxes;
|
39027 | for (const boxUid of boxCell) {
|
39028 | if (!seenUids.box[boxUid]) {
|
39029 | seenUids.box[boxUid] = true;
|
39030 | const offset = boxUid * 4;
|
39031 | const key = this.boxKeys[boxUid];
|
39032 | if (this._circleAndRectCollide(circle.x, circle.y, circle.radius, bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) &&
|
39033 | (!predicate || predicate(key)) &&
|
39034 | !overlapAllowed(overlapMode, key.overlapMode)) {
|
39035 | result.push(true);
|
39036 | return true;
|
39037 | }
|
39038 | }
|
39039 | }
|
39040 | }
|
39041 | const circleCell = this.circleCells[cellIndex];
|
39042 | if (circleCell !== null) {
|
39043 | const circles = this.circles;
|
39044 | for (const circleUid of circleCell) {
|
39045 | if (!seenUids.circle[circleUid]) {
|
39046 | seenUids.circle[circleUid] = true;
|
39047 | const offset = circleUid * 3;
|
39048 | const key = this.circleKeys[circleUid];
|
39049 | if (this._circlesCollide(circles[offset], circles[offset + 1], circles[offset + 2], circle.x, circle.y, circle.radius) &&
|
39050 | (!predicate || predicate(key)) &&
|
39051 | !overlapAllowed(overlapMode, key.overlapMode)) {
|
39052 | result.push(true);
|
39053 | return true;
|
39054 | }
|
39055 | }
|
39056 | }
|
39057 | }
|
39058 | }
|
39059 | _forEachCell(x1, y1, x2, y2, fn, arg1, arg2, predicate) {
|
39060 | const cx1 = this._convertToXCellCoord(x1);
|
39061 | const cy1 = this._convertToYCellCoord(y1);
|
39062 | const cx2 = this._convertToXCellCoord(x2);
|
39063 | const cy2 = this._convertToYCellCoord(y2);
|
39064 | for (let x = cx1; x <= cx2; x++) {
|
39065 | for (let y = cy1; y <= cy2; y++) {
|
39066 | const cellIndex = this.xCellCount * y + x;
|
39067 | if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, predicate))
|
39068 | return;
|
39069 | }
|
39070 | }
|
39071 | }
|
39072 | _convertToXCellCoord(x) {
|
39073 | return Math.max(0, Math.min(this.xCellCount - 1, Math.floor(x * this.xScale)));
|
39074 | }
|
39075 | _convertToYCellCoord(y) {
|
39076 | return Math.max(0, Math.min(this.yCellCount - 1, Math.floor(y * this.yScale)));
|
39077 | }
|
39078 | _circlesCollide(x1, y1, r1, x2, y2, r2) {
|
39079 | const dx = x2 - x1;
|
39080 | const dy = y2 - y1;
|
39081 | const bothRadii = r1 + r2;
|
39082 | return (bothRadii * bothRadii) > (dx * dx + dy * dy);
|
39083 | }
|
39084 | _circleAndRectCollide(circleX, circleY, radius, x1, y1, x2, y2) {
|
39085 | const halfRectWidth = (x2 - x1) / 2;
|
39086 | const distX = Math.abs(circleX - (x1 + halfRectWidth));
|
39087 | if (distX > (halfRectWidth + radius)) {
|
39088 | return false;
|
39089 | }
|
39090 | const halfRectHeight = (y2 - y1) / 2;
|
39091 | const distY = Math.abs(circleY - (y1 + halfRectHeight));
|
39092 | if (distY > (halfRectHeight + radius)) {
|
39093 | return false;
|
39094 | }
|
39095 | if (distX <= halfRectWidth || distY <= halfRectHeight) {
|
39096 | return true;
|
39097 | }
|
39098 | const dx = distX - halfRectWidth;
|
39099 | const dy = distY - halfRectHeight;
|
39100 | return (dx * dx + dy * dy <= (radius * radius));
|
39101 | }
|
39102 | }
|
39103 |
|
39104 | /*
|
39105 | * # Overview of coordinate spaces
|
39106 | *
|
39107 | * ## Tile coordinate spaces
|
39108 | * Each label has an anchor. Some labels have corresponding line geometries.
|
39109 | * The points for both anchors and lines are stored in tile units. Each tile has it's own
|
39110 | * coordinate space going from (0, 0) at the top left to (EXTENT, EXTENT) at the bottom right.
|
39111 | *
|
39112 | * ## GL coordinate space
|
39113 | * At the end of everything, the vertex shader needs to produce a position in GL coordinate space,
|
39114 | * which is (-1, 1) at the top left and (1, -1) in the bottom right.
|
39115 | *
|
39116 | * ## Map pixel coordinate spaces
|
39117 | * Each tile has a pixel coordinate space. It's just the tile units scaled so that one unit is
|
39118 | * whatever counts as 1 pixel at the current zoom.
|
39119 | * This space is used for pitch-alignment=map, rotation-alignment=map
|
39120 | *
|
39121 | * ## Rotated map pixel coordinate spaces
|
39122 | * Like the above, but rotated so axis of the space are aligned with the viewport instead of the tile.
|
39123 | * This space is used for pitch-alignment=map, rotation-alignment=viewport
|
39124 | *
|
39125 | * ## Viewport pixel coordinate space
|
39126 | * (0, 0) is at the top left of the canvas and (pixelWidth, pixelHeight) is at the bottom right corner
|
39127 | * of the canvas. This space is used for pitch-alignment=viewport
|
39128 | *
|
39129 | *
|
39130 | * # Vertex projection
|
39131 | * It goes roughly like this:
|
39132 | * 1. project the anchor and line from tile units into the correct label coordinate space
|
39133 | * - map pixel space pitch-alignment=map rotation-alignment=map
|
39134 | * - rotated map pixel space pitch-alignment=map rotation-alignment=viewport
|
39135 | * - viewport pixel space pitch-alignment=viewport rotation-alignment=*
|
39136 | * 2. if the label follows a line, find the point along the line that is the correct distance from the anchor.
|
39137 | * 3. add the glyph's corner offset to the point from step 3
|
39138 | * 4. convert from the label coordinate space to gl coordinates
|
39139 | *
|
39140 | * For horizontal labels we want to do step 1 in the shader for performance reasons (no cpu work).
|
39141 | * This is what `u_label_plane_matrix` is used for.
|
39142 | * For labels aligned with lines we have to steps 1 and 2 on the cpu since we need access to the line geometry.
|
39143 | * This is what `updateLineLabels(...)` does.
|
39144 | * Since the conversion is handled on the cpu we just set `u_label_plane_matrix` to an identity matrix.
|
39145 | *
|
39146 | * Steps 3 and 4 are done in the shaders for all labels.
|
39147 | */
|
39148 | /*
|
39149 | * Returns a matrix for converting from tile units to the correct label coordinate space.
|
39150 | */
|
39151 | function getLabelPlaneMatrix(posMatrix, pitchWithMap, rotateWithMap, transform, pixelsToTileUnits) {
|
39152 | const m = performance.create();
|
39153 | if (pitchWithMap) {
|
39154 | performance.scale(m, m, [1 / pixelsToTileUnits, 1 / pixelsToTileUnits, 1]);
|
39155 | if (!rotateWithMap) {
|
39156 | performance.rotateZ(m, m, transform.angle);
|
39157 | }
|
39158 | }
|
39159 | else {
|
39160 | performance.multiply(m, transform.labelPlaneMatrix, posMatrix);
|
39161 | }
|
39162 | return m;
|
39163 | }
|
39164 | /*
|
39165 | * Returns a matrix for converting from the correct label coordinate space to gl coords.
|
39166 | */
|
39167 | function getGlCoordMatrix(posMatrix, pitchWithMap, rotateWithMap, transform, pixelsToTileUnits) {
|
39168 | if (pitchWithMap) {
|
39169 | const m = performance.clone(posMatrix);
|
39170 | performance.scale(m, m, [pixelsToTileUnits, pixelsToTileUnits, 1]);
|
39171 | if (!rotateWithMap) {
|
39172 | performance.rotateZ(m, m, -transform.angle);
|
39173 | }
|
39174 | return m;
|
39175 | }
|
39176 | else {
|
39177 | return transform.glCoordMatrix;
|
39178 | }
|
39179 | }
|
39180 | function project(point, matrix) {
|
39181 | const pos = [point.x, point.y, 0, 1];
|
39182 | xyTransformMat4(pos, pos, matrix);
|
39183 | const w = pos[3];
|
39184 | return {
|
39185 | point: new performance.pointGeometry(pos[0] / w, pos[1] / w),
|
39186 | signedDistanceFromCamera: w
|
39187 | };
|
39188 | }
|
39189 | function getPerspectiveRatio(cameraToCenterDistance, signedDistanceFromCamera) {
|
39190 | return 0.5 + 0.5 * (cameraToCenterDistance / signedDistanceFromCamera);
|
39191 | }
|
39192 | function isVisible(anchorPos, clippingBuffer) {
|
39193 | const x = anchorPos[0] / anchorPos[3];
|
39194 | const y = anchorPos[1] / anchorPos[3];
|
39195 | const inPaddedViewport = (x >= -clippingBuffer[0] &&
|
39196 | x <= clippingBuffer[0] &&
|
39197 | y >= -clippingBuffer[1] &&
|
39198 | y <= clippingBuffer[1]);
|
39199 | return inPaddedViewport;
|
39200 | }
|
39201 | /*
|
39202 | * Update the `dynamicLayoutVertexBuffer` for the buffer with the correct glyph positions for the current map view.
|
39203 | * This is only run on labels that are aligned with lines. Horizontal labels are handled entirely in the shader.
|
39204 | */
|
39205 | function updateLineLabels(bucket, posMatrix, painter, isText, labelPlaneMatrix, glCoordMatrix, pitchWithMap, keepUpright, rotateToLine) {
|
39206 | const sizeData = isText ? bucket.textSizeData : bucket.iconSizeData;
|
39207 | const partiallyEvaluatedSize = performance.evaluateSizeForZoom(sizeData, painter.transform.zoom);
|
39208 | const clippingBuffer = [256 / painter.width * 2 + 1, 256 / painter.height * 2 + 1];
|
39209 | const dynamicLayoutVertexArray = isText ?
|
39210 | bucket.text.dynamicLayoutVertexArray :
|
39211 | bucket.icon.dynamicLayoutVertexArray;
|
39212 | dynamicLayoutVertexArray.clear();
|
39213 | const lineVertexArray = bucket.lineVertexArray;
|
39214 | const placedSymbols = isText ? bucket.text.placedSymbolArray : bucket.icon.placedSymbolArray;
|
39215 | const aspectRatio = painter.transform.width / painter.transform.height;
|
39216 | let useVertical = false;
|
39217 | for (let s = 0; s < placedSymbols.length; s++) {
|
39218 | const symbol = placedSymbols.get(s);
|
39219 | // Don't do calculations for vertical glyphs unless the previous symbol was horizontal
|
39220 | // and we determined that vertical glyphs were necessary.
|
39221 | // Also don't do calculations for symbols that are collided and fully faded out
|
39222 | if (symbol.hidden || symbol.writingMode === performance.WritingMode.vertical && !useVertical) {
|
39223 | hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray);
|
39224 | continue;
|
39225 | }
|
39226 | // Awkward... but we're counting on the paired "vertical" symbol coming immediately after its horizontal counterpart
|
39227 | useVertical = false;
|
39228 | const anchorPos = [symbol.anchorX, symbol.anchorY, 0, 1];
|
39229 | performance.transformMat4(anchorPos, anchorPos, posMatrix);
|
39230 | // Don't bother calculating the correct point for invisible labels.
|
39231 | if (!isVisible(anchorPos, clippingBuffer)) {
|
39232 | hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray);
|
39233 | continue;
|
39234 | }
|
39235 | const cameraToAnchorDistance = anchorPos[3];
|
39236 | const perspectiveRatio = getPerspectiveRatio(painter.transform.cameraToCenterDistance, cameraToAnchorDistance);
|
39237 | const fontSize = performance.evaluateSizeForFeature(sizeData, partiallyEvaluatedSize, symbol);
|
39238 | const pitchScaledFontSize = pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio;
|
39239 | const tileAnchorPoint = new performance.pointGeometry(symbol.anchorX, symbol.anchorY);
|
39240 | const anchorPoint = project(tileAnchorPoint, labelPlaneMatrix).point;
|
39241 | const projectionCache = {};
|
39242 | const placeUnflipped = placeGlyphsAlongLine(symbol, pitchScaledFontSize, false /*unflipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio, rotateToLine);
|
39243 | useVertical = placeUnflipped.useVertical;
|
39244 | if (placeUnflipped.notEnoughRoom || useVertical ||
|
39245 | (placeUnflipped.needsFlipping &&
|
39246 | placeGlyphsAlongLine(symbol, pitchScaledFontSize, true /*flipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio, rotateToLine).notEnoughRoom)) {
|
39247 | hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray);
|
39248 | }
|
39249 | }
|
39250 | if (isText) {
|
39251 | bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray);
|
39252 | }
|
39253 | else {
|
39254 | bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray);
|
39255 | }
|
39256 | }
|
39257 | function placeFirstAndLastGlyph(fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine) {
|
39258 | const glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs;
|
39259 | const lineStartIndex = symbol.lineStartIndex;
|
39260 | const lineEndIndex = symbol.lineStartIndex + symbol.lineLength;
|
39261 | const firstGlyphOffset = glyphOffsetArray.getoffsetX(symbol.glyphStartIndex);
|
39262 | const lastGlyphOffset = glyphOffsetArray.getoffsetX(glyphEndIndex - 1);
|
39263 | const firstPlacedGlyph = placeGlyphAlongLine(fontScale * firstGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine);
|
39264 | if (!firstPlacedGlyph)
|
39265 | return null;
|
39266 | const lastPlacedGlyph = placeGlyphAlongLine(fontScale * lastGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine);
|
39267 | if (!lastPlacedGlyph)
|
39268 | return null;
|
39269 | return { first: firstPlacedGlyph, last: lastPlacedGlyph };
|
39270 | }
|
39271 | function requiresOrientationChange(writingMode, firstPoint, lastPoint, aspectRatio) {
|
39272 | if (writingMode === performance.WritingMode.horizontal) {
|
39273 | // On top of choosing whether to flip, choose whether to render this version of the glyphs or the alternate
|
39274 | // vertical glyphs. We can't just filter out vertical glyphs in the horizontal range because the horizontal
|
39275 | // and vertical versions can have slightly different projections which could lead to angles where both or
|
39276 | // neither showed.
|
39277 | const rise = Math.abs(lastPoint.y - firstPoint.y);
|
39278 | const run = Math.abs(lastPoint.x - firstPoint.x) * aspectRatio;
|
39279 | if (rise > run) {
|
39280 | return { useVertical: true };
|
39281 | }
|
39282 | }
|
39283 | if (writingMode === performance.WritingMode.vertical ? firstPoint.y < lastPoint.y : firstPoint.x > lastPoint.x) {
|
39284 | // Includes "horizontalOnly" case for labels without vertical glyphs
|
39285 | return { needsFlipping: true };
|
39286 | }
|
39287 | return null;
|
39288 | }
|
39289 | function placeGlyphsAlongLine(symbol, fontSize, flip, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio, rotateToLine) {
|
39290 | const fontScale = fontSize / 24;
|
39291 | const lineOffsetX = symbol.lineOffsetX * fontScale;
|
39292 | const lineOffsetY = symbol.lineOffsetY * fontScale;
|
39293 | let placedGlyphs;
|
39294 | if (symbol.numGlyphs > 1) {
|
39295 | const glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs;
|
39296 | const lineStartIndex = symbol.lineStartIndex;
|
39297 | const lineEndIndex = symbol.lineStartIndex + symbol.lineLength;
|
39298 | // Place the first and the last glyph in the label first, so we can figure out
|
39299 | // the overall orientation of the label and determine whether it needs to be flipped in keepUpright mode
|
39300 | const firstAndLastGlyph = placeFirstAndLastGlyph(fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine);
|
39301 | if (!firstAndLastGlyph) {
|
39302 | return { notEnoughRoom: true };
|
39303 | }
|
39304 | const firstPoint = project(firstAndLastGlyph.first.point, glCoordMatrix).point;
|
39305 | const lastPoint = project(firstAndLastGlyph.last.point, glCoordMatrix).point;
|
39306 | if (keepUpright && !flip) {
|
39307 | const orientationChange = requiresOrientationChange(symbol.writingMode, firstPoint, lastPoint, aspectRatio);
|
39308 | if (orientationChange) {
|
39309 | return orientationChange;
|
39310 | }
|
39311 | }
|
39312 | placedGlyphs = [firstAndLastGlyph.first];
|
39313 | for (let glyphIndex = symbol.glyphStartIndex + 1; glyphIndex < glyphEndIndex - 1; glyphIndex++) {
|
39314 | // Since first and last glyph fit on the line, we're sure that the rest of the glyphs can be placed
|
39315 | // $FlowFixMe
|
39316 | placedGlyphs.push(placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(glyphIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine));
|
39317 | }
|
39318 | placedGlyphs.push(firstAndLastGlyph.last);
|
39319 | }
|
39320 | else {
|
39321 | // Only a single glyph to place
|
39322 | // So, determine whether to flip based on projected angle of the line segment it's on
|
39323 | if (keepUpright && !flip) {
|
39324 | const a = project(tileAnchorPoint, posMatrix).point;
|
39325 | const tileVertexIndex = (symbol.lineStartIndex + symbol.segment + 1);
|
39326 | // $FlowFixMe
|
39327 | const tileSegmentEnd = new performance.pointGeometry(lineVertexArray.getx(tileVertexIndex), lineVertexArray.gety(tileVertexIndex));
|
39328 | const projectedVertex = project(tileSegmentEnd, posMatrix);
|
39329 | // We know the anchor will be in the viewport, but the end of the line segment may be
|
39330 | // behind the plane of the camera, in which case we can use a point at any arbitrary (closer)
|
39331 | // point on the segment.
|
39332 | const b = (projectedVertex.signedDistanceFromCamera > 0) ?
|
39333 | projectedVertex.point :
|
39334 | projectTruncatedLineSegment(tileAnchorPoint, tileSegmentEnd, a, 1, posMatrix);
|
39335 | const orientationChange = requiresOrientationChange(symbol.writingMode, a, b, aspectRatio);
|
39336 | if (orientationChange) {
|
39337 | return orientationChange;
|
39338 | }
|
39339 | }
|
39340 | // $FlowFixMe
|
39341 | const singleGlyph = placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(symbol.glyphStartIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, symbol.lineStartIndex, symbol.lineStartIndex + symbol.lineLength, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine);
|
39342 | if (!singleGlyph)
|
39343 | return { notEnoughRoom: true };
|
39344 | placedGlyphs = [singleGlyph];
|
39345 | }
|
39346 | for (const glyph of placedGlyphs) {
|
39347 | performance.addDynamicAttributes(dynamicLayoutVertexArray, glyph.point, glyph.angle);
|
39348 | }
|
39349 | return {};
|
39350 | }
|
39351 | function projectTruncatedLineSegment(previousTilePoint, currentTilePoint, previousProjectedPoint, minimumLength, projectionMatrix) {
|
39352 | // We are assuming "previousTilePoint" won't project to a point within one unit of the camera plane
|
39353 | // If it did, that would mean our label extended all the way out from within the viewport to a (very distant)
|
39354 | // point near the plane of the camera. We wouldn't be able to render the label anyway once it crossed the
|
39355 | // plane of the camera.
|
39356 | const projectedUnitVertex = project(previousTilePoint.add(previousTilePoint.sub(currentTilePoint)._unit()), projectionMatrix).point;
|
39357 | const projectedUnitSegment = previousProjectedPoint.sub(projectedUnitVertex);
|
39358 | return previousProjectedPoint.add(projectedUnitSegment._mult(minimumLength / projectedUnitSegment.mag()));
|
39359 | }
|
39360 | function placeGlyphAlongLine(offsetX, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, anchorSegment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, rotateToLine) {
|
39361 | const combinedOffsetX = flip ?
|
39362 | offsetX - lineOffsetX :
|
39363 | offsetX + lineOffsetX;
|
39364 | let dir = combinedOffsetX > 0 ? 1 : -1;
|
39365 | let angle = 0;
|
39366 | if (flip) {
|
39367 | // The label needs to be flipped to keep text upright.
|
39368 | // Iterate in the reverse direction.
|
39369 | dir *= -1;
|
39370 | angle = Math.PI;
|
39371 | }
|
39372 | if (dir < 0)
|
39373 | angle += Math.PI;
|
39374 | let currentIndex = dir > 0 ?
|
39375 | lineStartIndex + anchorSegment :
|
39376 | lineStartIndex + anchorSegment + 1;
|
39377 | let current = anchorPoint;
|
39378 | let prev = anchorPoint;
|
39379 | let distanceToPrev = 0;
|
39380 | let currentSegmentDistance = 0;
|
39381 | const absOffsetX = Math.abs(combinedOffsetX);
|
39382 | const pathVertices = [];
|
39383 | while (distanceToPrev + currentSegmentDistance <= absOffsetX) {
|
39384 | currentIndex += dir;
|
39385 | // offset does not fit on the projected line
|
39386 | if (currentIndex < lineStartIndex || currentIndex >= lineEndIndex)
|
39387 | return null;
|
39388 | prev = current;
|
39389 | pathVertices.push(current);
|
39390 | current = projectionCache[currentIndex];
|
39391 | if (current === undefined) {
|
39392 | const currentVertex = new performance.pointGeometry(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex));
|
39393 | const projection = project(currentVertex, labelPlaneMatrix);
|
39394 | if (projection.signedDistanceFromCamera > 0) {
|
39395 | current = projectionCache[currentIndex] = projection.point;
|
39396 | }
|
39397 | else {
|
39398 | // The vertex is behind the plane of the camera, so we can't project it
|
39399 | // Instead, we'll create a vertex along the line that's far enough to include the glyph
|
39400 | const previousLineVertexIndex = currentIndex - dir;
|
39401 | const previousTilePoint = distanceToPrev === 0 ?
|
39402 | tileAnchorPoint :
|
39403 | new performance.pointGeometry(lineVertexArray.getx(previousLineVertexIndex), lineVertexArray.gety(previousLineVertexIndex));
|
39404 | // Don't cache because the new vertex might not be far enough out for future glyphs on the same segment
|
39405 | current = projectTruncatedLineSegment(previousTilePoint, currentVertex, prev, absOffsetX - distanceToPrev + 1, labelPlaneMatrix);
|
39406 | }
|
39407 | }
|
39408 | distanceToPrev += currentSegmentDistance;
|
39409 | currentSegmentDistance = prev.dist(current);
|
39410 | }
|
39411 | // The point is on the current segment. Interpolate to find it.
|
39412 | const segmentInterpolationT = (absOffsetX - distanceToPrev) / currentSegmentDistance;
|
39413 | const prevToCurrent = current.sub(prev);
|
39414 | const p = prevToCurrent.mult(segmentInterpolationT)._add(prev);
|
39415 | // offset the point from the line to text-offset and icon-offset
|
39416 | p._add(prevToCurrent._unit()._perp()._mult(lineOffsetY * dir));
|
39417 | const segmentAngle = angle + Math.atan2(current.y - prev.y, current.x - prev.x);
|
39418 | pathVertices.push(p);
|
39419 | return {
|
39420 | point: p,
|
39421 | angle: rotateToLine ? segmentAngle : 0.0,
|
39422 | path: pathVertices
|
39423 | };
|
39424 | }
|
39425 | const hiddenGlyphAttributes = new Float32Array([-Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0]);
|
39426 | // Hide them by moving them offscreen. We still need to add them to the buffer
|
39427 | // because the dynamic buffer is paired with a static buffer that doesn't get updated.
|
39428 | function hideGlyphs(num, dynamicLayoutVertexArray) {
|
39429 | for (let i = 0; i < num; i++) {
|
39430 | const offset = dynamicLayoutVertexArray.length;
|
39431 | dynamicLayoutVertexArray.resize(offset + 4);
|
39432 | // Since all hidden glyphs have the same attributes, we can build up the array faster with a single call to Float32Array.set
|
39433 | // for each set of four vertices, instead of calling addDynamicAttributes for each vertex.
|
39434 | dynamicLayoutVertexArray.float32.set(hiddenGlyphAttributes, offset * 3);
|
39435 | }
|
39436 | }
|
39437 | // For line label layout, we're not using z output and our w input is always 1
|
39438 | // This custom matrix transformation ignores those components to make projection faster
|
39439 | function xyTransformMat4(out, a, m) {
|
39440 | const x = a[0], y = a[1];
|
39441 | out[0] = m[0] * x + m[4] * y + m[12];
|
39442 | out[1] = m[1] * x + m[5] * y + m[13];
|
39443 | out[3] = m[3] * x + m[7] * y + m[15];
|
39444 | return out;
|
39445 | }
|
39446 |
|
39447 | // When a symbol crosses the edge that causes it to be included in
|
39448 | // collision detection, it will cause changes in the symbols around
|
39449 | // it. This constant specifies how many pixels to pad the edge of
|
39450 | // the viewport for collision detection so that the bulk of the changes
|
39451 | // occur offscreen. Making this constant greater increases label
|
39452 | // stability, but it's expensive.
|
39453 | const viewportPadding = 100;
|
39454 | /**
|
39455 | * A collision index used to prevent symbols from overlapping. It keep tracks of
|
39456 | * where previous symbols have been placed and is used to check if a new
|
39457 | * symbol overlaps with any previously added symbols.
|
39458 | *
|
39459 | * There are two steps to insertion: first placeCollisionBox/Circles checks if
|
39460 | * there's room for a symbol, then insertCollisionBox/Circles actually puts the
|
39461 | * symbol in the index. The two step process allows paired symbols to be inserted
|
39462 | * together even if they overlap.
|
39463 | *
|
39464 | * @private
|
39465 | */
|
39466 | class CollisionIndex {
|
39467 | constructor(transform, grid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25), ignoredGrid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25)) {
|
39468 | this.transform = transform;
|
39469 | this.grid = grid;
|
39470 | this.ignoredGrid = ignoredGrid;
|
39471 | this.pitchfactor = Math.cos(transform._pitch) * transform.cameraToCenterDistance;
|
39472 | this.screenRightBoundary = transform.width + viewportPadding;
|
39473 | this.screenBottomBoundary = transform.height + viewportPadding;
|
39474 | this.gridRightBoundary = transform.width + 2 * viewportPadding;
|
39475 | this.gridBottomBoundary = transform.height + 2 * viewportPadding;
|
39476 | }
|
39477 | placeCollisionBox(collisionBox, overlapMode, textPixelRatio, posMatrix, collisionGroupPredicate) {
|
39478 | const projectedPoint = this.projectAndGetPerspectiveRatio(posMatrix, collisionBox.anchorPointX, collisionBox.anchorPointY);
|
39479 | const tileToViewport = textPixelRatio * projectedPoint.perspectiveRatio;
|
39480 | const tlX = collisionBox.x1 * tileToViewport + projectedPoint.point.x;
|
39481 | const tlY = collisionBox.y1 * tileToViewport + projectedPoint.point.y;
|
39482 | const brX = collisionBox.x2 * tileToViewport + projectedPoint.point.x;
|
39483 | const brY = collisionBox.y2 * tileToViewport + projectedPoint.point.y;
|
39484 | if (!this.isInsideGrid(tlX, tlY, brX, brY) ||
|
39485 | (overlapMode !== 'always' && this.grid.hitTest(tlX, tlY, brX, brY, overlapMode, collisionGroupPredicate))) {
|
39486 | return {
|
39487 | box: [],
|
39488 | offscreen: false
|
39489 | };
|
39490 | }
|
39491 | return {
|
39492 | box: [tlX, tlY, brX, brY],
|
39493 | offscreen: this.isOffscreen(tlX, tlY, brX, brY)
|
39494 | };
|
39495 | }
|
39496 | placeCollisionCircles(overlapMode, symbol, lineVertexArray, glyphOffsetArray, fontSize, posMatrix, labelPlaneMatrix, labelToScreenMatrix, showCollisionCircles, pitchWithMap, collisionGroupPredicate, circlePixelDiameter, textPixelPadding) {
|
39497 | const placedCollisionCircles = [];
|
39498 | const tileUnitAnchorPoint = new performance.pointGeometry(symbol.anchorX, symbol.anchorY);
|
39499 | const screenAnchorPoint = project(tileUnitAnchorPoint, posMatrix);
|
39500 | const perspectiveRatio = getPerspectiveRatio(this.transform.cameraToCenterDistance, screenAnchorPoint.signedDistanceFromCamera);
|
39501 | const labelPlaneFontSize = pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio;
|
39502 | const labelPlaneFontScale = labelPlaneFontSize / performance.ONE_EM;
|
39503 | const labelPlaneAnchorPoint = project(tileUnitAnchorPoint, labelPlaneMatrix).point;
|
39504 | const projectionCache = {};
|
39505 | const lineOffsetX = symbol.lineOffsetX * labelPlaneFontScale;
|
39506 | const lineOffsetY = symbol.lineOffsetY * labelPlaneFontScale;
|
39507 | const firstAndLastGlyph = placeFirstAndLastGlyph(labelPlaneFontScale, glyphOffsetArray, lineOffsetX, lineOffsetY,
|
39508 | /*flip*/ false, labelPlaneAnchorPoint, tileUnitAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, false);
|
39509 | let collisionDetected = false;
|
39510 | let inGrid = false;
|
39511 | let entirelyOffscreen = true;
|
39512 | if (firstAndLastGlyph) {
|
39513 | const radius = circlePixelDiameter * 0.5 * perspectiveRatio + textPixelPadding;
|
39514 | const screenPlaneMin = new performance.pointGeometry(-viewportPadding, -viewportPadding);
|
39515 | const screenPlaneMax = new performance.pointGeometry(this.screenRightBoundary, this.screenBottomBoundary);
|
39516 | const interpolator = new PathInterpolator();
|
39517 | // Construct a projected path from projected line vertices. Anchor points are ignored and removed
|
39518 | const first = firstAndLastGlyph.first;
|
39519 | const last = firstAndLastGlyph.last;
|
39520 | let projectedPath = [];
|
39521 | for (let i = first.path.length - 1; i >= 1; i--) {
|
39522 | projectedPath.push(first.path[i]);
|
39523 | }
|
39524 | for (let i = 1; i < last.path.length; i++) {
|
39525 | projectedPath.push(last.path[i]);
|
39526 | }
|
39527 | performance.assert(projectedPath.length >= 2);
|
39528 | // Tolerate a slightly longer distance than one diameter between two adjacent circles
|
39529 | const circleDist = radius * 2.5;
|
39530 | // The path might need to be converted into screen space if a pitched map is used as the label space
|
39531 | if (labelToScreenMatrix) {
|
39532 | const screenSpacePath = projectedPath.map(p => project(p, labelToScreenMatrix));
|
39533 | // Do not try to place collision circles if even of the points is behind the camera.
|
39534 | // This is a plausible scenario with big camera pitch angles
|
39535 | if (screenSpacePath.some(point => point.signedDistanceFromCamera <= 0)) {
|
39536 | projectedPath = [];
|
39537 | }
|
39538 | else {
|
39539 | projectedPath = screenSpacePath.map(p => p.point);
|
39540 | }
|
39541 | }
|
39542 | let segments = [];
|
39543 | if (projectedPath.length > 0) {
|
39544 | // Quickly check if the path is fully inside or outside of the padded collision region.
|
39545 | // For overlapping paths we'll only create collision circles for the visible segments
|
39546 | const minPoint = projectedPath[0].clone();
|
39547 | const maxPoint = projectedPath[0].clone();
|
39548 | for (let i = 1; i < projectedPath.length; i++) {
|
39549 | minPoint.x = Math.min(minPoint.x, projectedPath[i].x);
|
39550 | minPoint.y = Math.min(minPoint.y, projectedPath[i].y);
|
39551 | maxPoint.x = Math.max(maxPoint.x, projectedPath[i].x);
|
39552 | maxPoint.y = Math.max(maxPoint.y, projectedPath[i].y);
|
39553 | }
|
39554 | if (minPoint.x >= screenPlaneMin.x && maxPoint.x <= screenPlaneMax.x &&
|
39555 | minPoint.y >= screenPlaneMin.y && maxPoint.y <= screenPlaneMax.y) {
|
39556 | // Quad fully visible
|
39557 | segments = [projectedPath];
|
39558 | }
|
39559 | else if (maxPoint.x < screenPlaneMin.x || minPoint.x > screenPlaneMax.x ||
|
39560 | maxPoint.y < screenPlaneMin.y || minPoint.y > screenPlaneMax.y) {
|
39561 | // Not visible
|
39562 | segments = [];
|
39563 | }
|
39564 | else {
|
39565 | segments = performance.clipLine([projectedPath], screenPlaneMin.x, screenPlaneMin.y, screenPlaneMax.x, screenPlaneMax.y);
|
39566 | }
|
39567 | }
|
39568 | for (const seg of segments) {
|
39569 | // interpolate positions for collision circles. Add a small padding to both ends of the segment
|
39570 | performance.assert(seg.length > 0);
|
39571 | interpolator.reset(seg, radius * 0.25);
|
39572 | let numCircles = 0;
|
39573 | if (interpolator.length <= 0.5 * radius) {
|
39574 | numCircles = 1;
|
39575 | }
|
39576 | else {
|
39577 | numCircles = Math.ceil(interpolator.paddedLength / circleDist) + 1;
|
39578 | }
|
39579 | for (let i = 0; i < numCircles; i++) {
|
39580 | const t = i / Math.max(numCircles - 1, 1);
|
39581 | const circlePosition = interpolator.lerp(t);
|
39582 | // add viewport padding to the position and perform initial collision check
|
39583 | const centerX = circlePosition.x + viewportPadding;
|
39584 | const centerY = circlePosition.y + viewportPadding;
|
39585 | placedCollisionCircles.push(centerX, centerY, radius, 0);
|
39586 | const x1 = centerX - radius;
|
39587 | const y1 = centerY - radius;
|
39588 | const x2 = centerX + radius;
|
39589 | const y2 = centerY + radius;
|
39590 | entirelyOffscreen = entirelyOffscreen && this.isOffscreen(x1, y1, x2, y2);
|
39591 | inGrid = inGrid || this.isInsideGrid(x1, y1, x2, y2);
|
39592 | if (overlapMode !== 'always' && this.grid.hitTestCircle(centerX, centerY, radius, overlapMode, collisionGroupPredicate)) {
|
39593 | // Don't early exit if we're showing the debug circles because we still want to calculate
|
39594 | // which circles are in use
|
39595 | collisionDetected = true;
|
39596 | if (!showCollisionCircles) {
|
39597 | return {
|
39598 | circles: [],
|
39599 | offscreen: false,
|
39600 | collisionDetected
|
39601 | };
|
39602 | }
|
39603 | }
|
39604 | }
|
39605 | }
|
39606 | }
|
39607 | return {
|
39608 | circles: ((!showCollisionCircles && collisionDetected) || !inGrid) ? [] : placedCollisionCircles,
|
39609 | offscreen: entirelyOffscreen,
|
39610 | collisionDetected
|
39611 | };
|
39612 | }
|
39613 | /**
|
39614 | * Because the geometries in the CollisionIndex are an approximation of the shape of
|
39615 | * symbols on the map, we use the CollisionIndex to look up the symbol part of
|
39616 | * `queryRenderedFeatures`.
|
39617 | *
|
39618 | * @private
|
39619 | */
|
39620 | queryRenderedSymbols(viewportQueryGeometry) {
|
39621 | if (viewportQueryGeometry.length === 0 || (this.grid.keysLength() === 0 && this.ignoredGrid.keysLength() === 0)) {
|
39622 | return {};
|
39623 | }
|
39624 | const query = [];
|
39625 | let minX = Infinity;
|
39626 | let minY = Infinity;
|
39627 | let maxX = -Infinity;
|
39628 | let maxY = -Infinity;
|
39629 | for (const point of viewportQueryGeometry) {
|
39630 | const gridPoint = new performance.pointGeometry(point.x + viewportPadding, point.y + viewportPadding);
|
39631 | minX = Math.min(minX, gridPoint.x);
|
39632 | minY = Math.min(minY, gridPoint.y);
|
39633 | maxX = Math.max(maxX, gridPoint.x);
|
39634 | maxY = Math.max(maxY, gridPoint.y);
|
39635 | query.push(gridPoint);
|
39636 | }
|
39637 | const features = this.grid.query(minX, minY, maxX, maxY)
|
39638 | .concat(this.ignoredGrid.query(minX, minY, maxX, maxY));
|
39639 | const seenFeatures = {};
|
39640 | const result = {};
|
39641 | for (const feature of features) {
|
39642 | const featureKey = feature.key;
|
39643 | // Skip already seen features.
|
39644 | if (seenFeatures[featureKey.bucketInstanceId] === undefined) {
|
39645 | seenFeatures[featureKey.bucketInstanceId] = {};
|
39646 | }
|
39647 | if (seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex]) {
|
39648 | continue;
|
39649 | }
|
39650 | // Check if query intersects with the feature box
|
39651 | // "Collision Circles" for line labels are treated as boxes here
|
39652 | // Since there's no actual collision taking place, the circle vs. square
|
39653 | // distinction doesn't matter as much, and box geometry is easier
|
39654 | // to work with.
|
39655 | const bbox = [
|
39656 | new performance.pointGeometry(feature.x1, feature.y1),
|
39657 | new performance.pointGeometry(feature.x2, feature.y1),
|
39658 | new performance.pointGeometry(feature.x2, feature.y2),
|
39659 | new performance.pointGeometry(feature.x1, feature.y2)
|
39660 | ];
|
39661 | if (!performance.polygonIntersectsPolygon(query, bbox)) {
|
39662 | continue;
|
39663 | }
|
39664 | seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex] = true;
|
39665 | if (result[featureKey.bucketInstanceId] === undefined) {
|
39666 | result[featureKey.bucketInstanceId] = [];
|
39667 | }
|
39668 | result[featureKey.bucketInstanceId].push(featureKey.featureIndex);
|
39669 | }
|
39670 | return result;
|
39671 | }
|
39672 | insertCollisionBox(collisionBox, overlapMode, ignorePlacement, bucketInstanceId, featureIndex, collisionGroupID) {
|
39673 | const grid = ignorePlacement ? this.ignoredGrid : this.grid;
|
39674 | const key = { bucketInstanceId, featureIndex, collisionGroupID, overlapMode };
|
39675 | grid.insert(key, collisionBox[0], collisionBox[1], collisionBox[2], collisionBox[3]);
|
39676 | }
|
39677 | insertCollisionCircles(collisionCircles, overlapMode, ignorePlacement, bucketInstanceId, featureIndex, collisionGroupID) {
|
39678 | const grid = ignorePlacement ? this.ignoredGrid : this.grid;
|
39679 | const key = { bucketInstanceId, featureIndex, collisionGroupID, overlapMode };
|
39680 | for (let k = 0; k < collisionCircles.length; k += 4) {
|
39681 | grid.insertCircle(key, collisionCircles[k], collisionCircles[k + 1], collisionCircles[k + 2]);
|
39682 | }
|
39683 | }
|
39684 | projectAndGetPerspectiveRatio(posMatrix, x, y) {
|
39685 | const p = [x, y, 0, 1];
|
39686 | xyTransformMat4(p, p, posMatrix);
|
39687 | const a = new performance.pointGeometry((((p[0] / p[3] + 1) / 2) * this.transform.width) + viewportPadding, (((-p[1] / p[3] + 1) / 2) * this.transform.height) + viewportPadding);
|
39688 | return {
|
39689 | point: a,
|
39690 | // See perspective ratio comment in symbol_sdf.vertex
|
39691 | // We're doing collision detection in viewport space so we need
|
39692 | // to scale down boxes in the distance
|
39693 | perspectiveRatio: 0.5 + 0.5 * (this.transform.cameraToCenterDistance / p[3])
|
39694 | };
|
39695 | }
|
39696 | isOffscreen(x1, y1, x2, y2) {
|
39697 | return x2 < viewportPadding || x1 >= this.screenRightBoundary || y2 < viewportPadding || y1 > this.screenBottomBoundary;
|
39698 | }
|
39699 | isInsideGrid(x1, y1, x2, y2) {
|
39700 | return x2 >= 0 && x1 < this.gridRightBoundary && y2 >= 0 && y1 < this.gridBottomBoundary;
|
39701 | }
|
39702 | /*
|
39703 | * Returns a matrix for transforming collision shapes to viewport coordinate space.
|
39704 | * Use this function to render e.g. collision circles on the screen.
|
39705 | * example transformation: clipPos = glCoordMatrix * viewportMatrix * circle_pos
|
39706 | */
|
39707 | getViewportMatrix() {
|
39708 | const m = performance.identity([]);
|
39709 | performance.translate(m, m, [-viewportPadding, -viewportPadding, 0.0]);
|
39710 | return m;
|
39711 | }
|
39712 | }
|
39713 |
|
39714 | /**
|
39715 | * Converts a pixel value at a the given zoom level to tile units.
|
39716 | *
|
39717 | * The shaders mostly calculate everything in tile units so style
|
39718 | * properties need to be converted from pixels to tile units using this.
|
39719 | *
|
39720 | * For example, a translation by 30 pixels at zoom 6.5 will be a
|
39721 | * translation by pixelsToTileUnits(30, 6.5) tile units.
|
39722 | *
|
39723 | * @returns value in tile units
|
39724 | * @private
|
39725 | */
|
39726 | function pixelsToTileUnits (tile, pixelValue, z) {
|
39727 | return pixelValue * (performance.EXTENT / (tile.tileSize * Math.pow(2, z - tile.tileID.overscaledZ)));
|
39728 | }
|
39729 |
|
39730 | class OpacityState {
|
39731 | constructor(prevState, increment, placed, skipFade) {
|
39732 | if (prevState) {
|
39733 | this.opacity = Math.max(0, Math.min(1, prevState.opacity + (prevState.placed ? increment : -increment)));
|
39734 | }
|
39735 | else {
|
39736 | this.opacity = (skipFade && placed) ? 1 : 0;
|
39737 | }
|
39738 | this.placed = placed;
|
39739 | }
|
39740 | isHidden() {
|
39741 | return this.opacity === 0 && !this.placed;
|
39742 | }
|
39743 | }
|
39744 | class JointOpacityState {
|
39745 | constructor(prevState, increment, placedText, placedIcon, skipFade) {
|
39746 | this.text = new OpacityState(prevState ? prevState.text : null, increment, placedText, skipFade);
|
39747 | this.icon = new OpacityState(prevState ? prevState.icon : null, increment, placedIcon, skipFade);
|
39748 | }
|
39749 | isHidden() {
|
39750 | return this.text.isHidden() && this.icon.isHidden();
|
39751 | }
|
39752 | }
|
39753 | class JointPlacement {
|
39754 | constructor(text, icon, skipFade) {
|
39755 | this.text = text;
|
39756 | this.icon = icon;
|
39757 | this.skipFade = skipFade;
|
39758 | }
|
39759 | }
|
39760 | class CollisionCircleArray {
|
39761 | constructor() {
|
39762 | this.invProjMatrix = performance.create();
|
39763 | this.viewportMatrix = performance.create();
|
39764 | this.circles = [];
|
39765 | }
|
39766 | }
|
39767 | class RetainedQueryData {
|
39768 | constructor(bucketInstanceId, featureIndex, sourceLayerIndex, bucketIndex, tileID) {
|
39769 | this.bucketInstanceId = bucketInstanceId;
|
39770 | this.featureIndex = featureIndex;
|
39771 | this.sourceLayerIndex = sourceLayerIndex;
|
39772 | this.bucketIndex = bucketIndex;
|
39773 | this.tileID = tileID;
|
39774 | }
|
39775 | }
|
39776 | class CollisionGroups {
|
39777 | constructor(crossSourceCollisions) {
|
39778 | this.crossSourceCollisions = crossSourceCollisions;
|
39779 | this.maxGroupID = 0;
|
39780 | this.collisionGroups = {};
|
39781 | }
|
39782 | get(sourceID) {
|
39783 | // The predicate/groupID mechanism allows for arbitrary grouping,
|
39784 | // but the current interface defines one source == one group when
|
39785 | // crossSourceCollisions == true.
|
39786 | if (!this.crossSourceCollisions) {
|
39787 | if (!this.collisionGroups[sourceID]) {
|
39788 | const nextGroupID = ++this.maxGroupID;
|
39789 | this.collisionGroups[sourceID] = {
|
39790 | ID: nextGroupID,
|
39791 | predicate: (key) => {
|
39792 | return key.collisionGroupID === nextGroupID;
|
39793 | }
|
39794 | };
|
39795 | }
|
39796 | return this.collisionGroups[sourceID];
|
39797 | }
|
39798 | else {
|
39799 | return { ID: 0, predicate: null };
|
39800 | }
|
39801 | }
|
39802 | }
|
39803 | function calculateVariableLayoutShift(anchor, width, height, textOffset, textBoxScale) {
|
39804 | const { horizontalAlign, verticalAlign } = performance.getAnchorAlignment(anchor);
|
39805 | const shiftX = -(horizontalAlign - 0.5) * width;
|
39806 | const shiftY = -(verticalAlign - 0.5) * height;
|
39807 | const offset = performance.evaluateVariableOffset(anchor, textOffset);
|
39808 | return new performance.pointGeometry(shiftX + offset[0] * textBoxScale, shiftY + offset[1] * textBoxScale);
|
39809 | }
|
39810 | function shiftVariableCollisionBox(collisionBox, shiftX, shiftY, rotateWithMap, pitchWithMap, angle) {
|
39811 | const { x1, x2, y1, y2, anchorPointX, anchorPointY } = collisionBox;
|
39812 | const rotatedOffset = new performance.pointGeometry(shiftX, shiftY);
|
39813 | if (rotateWithMap) {
|
39814 | rotatedOffset._rotate(pitchWithMap ? angle : -angle);
|
39815 | }
|
39816 | return {
|
39817 | x1: x1 + rotatedOffset.x,
|
39818 | y1: y1 + rotatedOffset.y,
|
39819 | x2: x2 + rotatedOffset.x,
|
39820 | y2: y2 + rotatedOffset.y,
|
39821 | // symbol anchor point stays the same regardless of text-anchor
|
39822 | anchorPointX,
|
39823 | anchorPointY
|
39824 | };
|
39825 | }
|
39826 | class Placement {
|
39827 | constructor(transform, fadeDuration, crossSourceCollisions, prevPlacement) {
|
39828 | this.transform = transform.clone();
|
39829 | this.collisionIndex = new CollisionIndex(this.transform);
|
39830 | this.placements = {};
|
39831 | this.opacities = {};
|
39832 | this.variableOffsets = {};
|
39833 | this.stale = false;
|
39834 | this.commitTime = 0;
|
39835 | this.fadeDuration = fadeDuration;
|
39836 | this.retainedQueryData = {};
|
39837 | this.collisionGroups = new CollisionGroups(crossSourceCollisions);
|
39838 | this.collisionCircleArrays = {};
|
39839 | this.prevPlacement = prevPlacement;
|
39840 | if (prevPlacement) {
|
39841 | prevPlacement.prevPlacement = undefined; // Only hold on to one placement back
|
39842 | }
|
39843 | this.placedOrientations = {};
|
39844 | }
|
39845 | getBucketParts(results, styleLayer, tile, sortAcrossTiles) {
|
39846 | const symbolBucket = tile.getBucket(styleLayer);
|
39847 | const bucketFeatureIndex = tile.latestFeatureIndex;
|
39848 | if (!symbolBucket || !bucketFeatureIndex || styleLayer.id !== symbolBucket.layerIds[0])
|
39849 | return;
|
39850 | const collisionBoxArray = tile.collisionBoxArray;
|
39851 | const layout = symbolBucket.layers[0].layout;
|
39852 | const scale = Math.pow(2, this.transform.zoom - tile.tileID.overscaledZ);
|
39853 | const textPixelRatio = tile.tileSize / performance.EXTENT;
|
39854 | const posMatrix = this.transform.calculatePosMatrix(tile.tileID.toUnwrapped());
|
39855 | const pitchWithMap = layout.get('text-pitch-alignment') === 'map';
|
39856 | const rotateWithMap = layout.get('text-rotation-alignment') === 'map';
|
39857 | const pixelsToTiles = pixelsToTileUnits(tile, 1, this.transform.zoom);
|
39858 | const textLabelPlaneMatrix = getLabelPlaneMatrix(posMatrix, pitchWithMap, rotateWithMap, this.transform, pixelsToTiles);
|
39859 | let labelToScreenMatrix = null;
|
39860 | if (pitchWithMap) {
|
39861 | const glMatrix = getGlCoordMatrix(posMatrix, pitchWithMap, rotateWithMap, this.transform, pixelsToTiles);
|
39862 | labelToScreenMatrix = performance.multiply([], this.transform.labelPlaneMatrix, glMatrix);
|
39863 | }
|
39864 | // As long as this placement lives, we have to hold onto this bucket's
|
39865 | // matching FeatureIndex/data for querying purposes
|
39866 | this.retainedQueryData[symbolBucket.bucketInstanceId] = new RetainedQueryData(symbolBucket.bucketInstanceId, bucketFeatureIndex, symbolBucket.sourceLayerIndex, symbolBucket.index, tile.tileID);
|
39867 | const parameters = {
|
39868 | bucket: symbolBucket,
|
39869 | layout,
|
39870 | posMatrix,
|
39871 | textLabelPlaneMatrix,
|
39872 | labelToScreenMatrix,
|
39873 | scale,
|
39874 | textPixelRatio,
|
39875 | holdingForFade: tile.holdingForFade(),
|
39876 | collisionBoxArray,
|
39877 | partiallyEvaluatedTextSize: performance.evaluateSizeForZoom(symbolBucket.textSizeData, this.transform.zoom),
|
39878 | collisionGroup: this.collisionGroups.get(symbolBucket.sourceID)
|
39879 | };
|
39880 | if (sortAcrossTiles) {
|
39881 | for (const range of symbolBucket.sortKeyRanges) {
|
39882 | const { sortKey, symbolInstanceStart, symbolInstanceEnd } = range;
|
39883 | results.push({ sortKey, symbolInstanceStart, symbolInstanceEnd, parameters });
|
39884 | }
|
39885 | }
|
39886 | else {
|
39887 | results.push({
|
39888 | symbolInstanceStart: 0,
|
39889 | symbolInstanceEnd: symbolBucket.symbolInstances.length,
|
39890 | parameters
|
39891 | });
|
39892 | }
|
39893 | }
|
39894 | attemptAnchorPlacement(anchor, textBox, width, height, textBoxScale, rotateWithMap, pitchWithMap, textPixelRatio, posMatrix, collisionGroup, textOverlapMode, symbolInstance, bucket, orientation, iconBox) {
|
39895 | const textOffset = [symbolInstance.textOffset0, symbolInstance.textOffset1];
|
39896 | const shift = calculateVariableLayoutShift(anchor, width, height, textOffset, textBoxScale);
|
39897 | const placedGlyphBoxes = this.collisionIndex.placeCollisionBox(shiftVariableCollisionBox(textBox, shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), textOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
|
39898 | if (iconBox) {
|
39899 | const placedIconBoxes = this.collisionIndex.placeCollisionBox(shiftVariableCollisionBox(iconBox, shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), textOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
|
39900 | if (placedIconBoxes.box.length === 0)
|
39901 | return;
|
39902 | }
|
39903 | if (placedGlyphBoxes.box.length > 0) {
|
39904 | let prevAnchor;
|
39905 | // If this label was placed in the previous placement, record the anchor position
|
39906 | // to allow us to animate the transition
|
39907 | if (this.prevPlacement &&
|
39908 | this.prevPlacement.variableOffsets[symbolInstance.crossTileID] &&
|
39909 | this.prevPlacement.placements[symbolInstance.crossTileID] &&
|
39910 | this.prevPlacement.placements[symbolInstance.crossTileID].text) {
|
39911 | prevAnchor = this.prevPlacement.variableOffsets[symbolInstance.crossTileID].anchor;
|
39912 | }
|
39913 | performance.assert(symbolInstance.crossTileID !== 0);
|
39914 | this.variableOffsets[symbolInstance.crossTileID] = {
|
39915 | textOffset,
|
39916 | width,
|
39917 | height,
|
39918 | anchor,
|
39919 | textBoxScale,
|
39920 | prevAnchor
|
39921 | };
|
39922 | this.markUsedJustification(bucket, anchor, symbolInstance, orientation);
|
39923 | if (bucket.allowVerticalPlacement) {
|
39924 | this.markUsedOrientation(bucket, orientation, symbolInstance);
|
39925 | this.placedOrientations[symbolInstance.crossTileID] = orientation;
|
39926 | }
|
39927 | return { shift, placedGlyphBoxes };
|
39928 | }
|
39929 | }
|
39930 | placeLayerBucketPart(bucketPart, seenCrossTileIDs, showCollisionBoxes) {
|
39931 | const { bucket, layout, posMatrix, textLabelPlaneMatrix, labelToScreenMatrix, textPixelRatio, holdingForFade, collisionBoxArray, partiallyEvaluatedTextSize, collisionGroup } = bucketPart.parameters;
|
39932 | const textOptional = layout.get('text-optional');
|
39933 | const iconOptional = layout.get('icon-optional');
|
39934 | const textOverlapMode = performance.getOverlapMode(layout, 'text-overlap', 'text-allow-overlap');
|
39935 | const textAlwaysOverlap = textOverlapMode === 'always';
|
39936 | const iconOverlapMode = performance.getOverlapMode(layout, 'icon-overlap', 'icon-allow-overlap');
|
39937 | const iconAlwaysOverlap = iconOverlapMode === 'always';
|
39938 | const rotateWithMap = layout.get('text-rotation-alignment') === 'map';
|
39939 | const pitchWithMap = layout.get('text-pitch-alignment') === 'map';
|
39940 | const hasIconTextFit = layout.get('icon-text-fit') !== 'none';
|
39941 | const zOrderByViewportY = layout.get('symbol-z-order') === 'viewport-y';
|
39942 | // This logic is similar to the "defaultOpacityState" logic below in updateBucketOpacities
|
39943 | // If we know a symbol is always supposed to show, force it to be marked visible even if
|
39944 | // it wasn't placed into the collision index (because some or all of it was outside the range
|
39945 | // of the collision grid).
|
39946 | // There is a subtle edge case here we're accepting:
|
39947 | // Symbol A has text-allow-overlap: true, icon-allow-overlap: true, icon-optional: false
|
39948 | // A's icon is outside the grid, so doesn't get placed
|
39949 | // A's text would be inside grid, but doesn't get placed because of icon-optional: false
|
39950 | // We still show A because of the allow-overlap settings.
|
39951 | // Symbol B has allow-overlap: false, and gets placed where A's text would be
|
39952 | // On panning in, there is a short period when Symbol B and Symbol A will overlap
|
39953 | // This is the reverse of our normal policy of "fade in on pan", but should look like any other
|
39954 | // collision and hopefully not be too noticeable.
|
39955 | // See https://github.com/mapbox/mapbox-gl-js/issues/7172
|
39956 | const alwaysShowText = textAlwaysOverlap && (iconAlwaysOverlap || !bucket.hasIconData() || iconOptional);
|
39957 | const alwaysShowIcon = iconAlwaysOverlap && (textAlwaysOverlap || !bucket.hasTextData() || textOptional);
|
39958 | if (!bucket.collisionArrays && collisionBoxArray) {
|
39959 | bucket.deserializeCollisionBoxes(collisionBoxArray);
|
39960 | }
|
39961 | const placeSymbol = (symbolInstance, collisionArrays) => {
|
39962 | if (seenCrossTileIDs[symbolInstance.crossTileID])
|
39963 | return;
|
39964 | if (holdingForFade) {
|
39965 | // Mark all symbols from this tile as "not placed", but don't add to seenCrossTileIDs, because we don't
|
39966 | // know yet if we have a duplicate in a parent tile that _should_ be placed.
|
39967 | this.placements[symbolInstance.crossTileID] = new JointPlacement(false, false, false);
|
39968 | return;
|
39969 | }
|
39970 | let placeText = false;
|
39971 | let placeIcon = false;
|
39972 | let offscreen = true;
|
39973 | let shift = null;
|
39974 | let placed = { box: null, offscreen: null };
|
39975 | let placedVerticalText = { box: null, offscreen: null };
|
39976 | let placedGlyphBoxes = null;
|
39977 | let placedGlyphCircles = null;
|
39978 | let placedIconBoxes = null;
|
39979 | let textFeatureIndex = 0;
|
39980 | let verticalTextFeatureIndex = 0;
|
39981 | let iconFeatureIndex = 0;
|
39982 | if (collisionArrays.textFeatureIndex) {
|
39983 | textFeatureIndex = collisionArrays.textFeatureIndex;
|
39984 | }
|
39985 | else if (symbolInstance.useRuntimeCollisionCircles) {
|
39986 | textFeatureIndex = symbolInstance.featureIndex;
|
39987 | }
|
39988 | if (collisionArrays.verticalTextFeatureIndex) {
|
39989 | verticalTextFeatureIndex = collisionArrays.verticalTextFeatureIndex;
|
39990 | }
|
39991 | const textBox = collisionArrays.textBox;
|
39992 | if (textBox) {
|
39993 | const updatePreviousOrientationIfNotPlaced = (isPlaced) => {
|
39994 | let previousOrientation = performance.WritingMode.horizontal;
|
39995 | if (bucket.allowVerticalPlacement && !isPlaced && this.prevPlacement) {
|
39996 | const prevPlacedOrientation = this.prevPlacement.placedOrientations[symbolInstance.crossTileID];
|
39997 | if (prevPlacedOrientation) {
|
39998 | this.placedOrientations[symbolInstance.crossTileID] = prevPlacedOrientation;
|
39999 | previousOrientation = prevPlacedOrientation;
|
40000 | this.markUsedOrientation(bucket, previousOrientation, symbolInstance);
|
40001 | }
|
40002 | }
|
40003 | return previousOrientation;
|
40004 | };
|
40005 | const placeTextForPlacementModes = (placeHorizontalFn, placeVerticalFn) => {
|
40006 | if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && collisionArrays.verticalTextBox) {
|
40007 | for (const placementMode of bucket.writingModes) {
|
40008 | if (placementMode === performance.WritingMode.vertical) {
|
40009 | placed = placeVerticalFn();
|
40010 | placedVerticalText = placed;
|
40011 | }
|
40012 | else {
|
40013 | placed = placeHorizontalFn();
|
40014 | }
|
40015 | if (placed && placed.box && placed.box.length)
|
40016 | break;
|
40017 | }
|
40018 | }
|
40019 | else {
|
40020 | placed = placeHorizontalFn();
|
40021 | }
|
40022 | };
|
40023 | if (!layout.get('text-variable-anchor')) {
|
40024 | const placeBox = (collisionTextBox, orientation) => {
|
40025 | const placedFeature = this.collisionIndex.placeCollisionBox(collisionTextBox, textOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
|
40026 | if (placedFeature && placedFeature.box && placedFeature.box.length) {
|
40027 | this.markUsedOrientation(bucket, orientation, symbolInstance);
|
40028 | this.placedOrientations[symbolInstance.crossTileID] = orientation;
|
40029 | }
|
40030 | return placedFeature;
|
40031 | };
|
40032 | const placeHorizontal = () => {
|
40033 | return placeBox(textBox, performance.WritingMode.horizontal);
|
40034 | };
|
40035 | const placeVertical = () => {
|
40036 | const verticalTextBox = collisionArrays.verticalTextBox;
|
40037 | if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) {
|
40038 | return placeBox(verticalTextBox, performance.WritingMode.vertical);
|
40039 | }
|
40040 | return { box: null, offscreen: null };
|
40041 | };
|
40042 | placeTextForPlacementModes(placeHorizontal, placeVertical);
|
40043 | updatePreviousOrientationIfNotPlaced(placed && placed.box && placed.box.length);
|
40044 | }
|
40045 | else {
|
40046 | let anchors = layout.get('text-variable-anchor');
|
40047 | // If this symbol was in the last placement, shift the previously used
|
40048 | // anchor to the front of the anchor list, only if the previous anchor
|
40049 | // is still in the anchor list
|
40050 | if (this.prevPlacement && this.prevPlacement.variableOffsets[symbolInstance.crossTileID]) {
|
40051 | const prevOffsets = this.prevPlacement.variableOffsets[symbolInstance.crossTileID];
|
40052 | if (anchors.indexOf(prevOffsets.anchor) > 0) {
|
40053 | anchors = anchors.filter(anchor => anchor !== prevOffsets.anchor);
|
40054 | anchors.unshift(prevOffsets.anchor);
|
40055 | }
|
40056 | }
|
40057 | const placeBoxForVariableAnchors = (collisionTextBox, collisionIconBox, orientation) => {
|
40058 | const width = collisionTextBox.x2 - collisionTextBox.x1;
|
40059 | const height = collisionTextBox.y2 - collisionTextBox.y1;
|
40060 | const textBoxScale = symbolInstance.textBoxScale;
|
40061 | const variableIconBox = hasIconTextFit && (iconOverlapMode === 'never') ? collisionIconBox : null;
|
40062 | let placedBox = { box: [], offscreen: false };
|
40063 | const placementAttempts = (textOverlapMode !== 'never') ? anchors.length * 2 : anchors.length;
|
40064 | for (let i = 0; i < placementAttempts; ++i) {
|
40065 | const anchor = anchors[i % anchors.length];
|
40066 | const overlapMode = (i >= anchors.length) ? textOverlapMode : 'never';
|
40067 | const result = this.attemptAnchorPlacement(anchor, collisionTextBox, width, height, textBoxScale, rotateWithMap, pitchWithMap, textPixelRatio, posMatrix, collisionGroup, overlapMode, symbolInstance, bucket, orientation, variableIconBox);
|
40068 | if (result) {
|
40069 | placedBox = result.placedGlyphBoxes;
|
40070 | if (placedBox && placedBox.box && placedBox.box.length) {
|
40071 | placeText = true;
|
40072 | shift = result.shift;
|
40073 | break;
|
40074 | }
|
40075 | }
|
40076 | }
|
40077 | return placedBox;
|
40078 | };
|
40079 | const placeHorizontal = () => {
|
40080 | return placeBoxForVariableAnchors(textBox, collisionArrays.iconBox, performance.WritingMode.horizontal);
|
40081 | };
|
40082 | const placeVertical = () => {
|
40083 | const verticalTextBox = collisionArrays.verticalTextBox;
|
40084 | const wasPlaced = placed && placed.box && placed.box.length;
|
40085 | if (bucket.allowVerticalPlacement && !wasPlaced && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) {
|
40086 | return placeBoxForVariableAnchors(verticalTextBox, collisionArrays.verticalIconBox, performance.WritingMode.vertical);
|
40087 | }
|
40088 | return { box: null, offscreen: null };
|
40089 | };
|
40090 | placeTextForPlacementModes(placeHorizontal, placeVertical);
|
40091 | if (placed) {
|
40092 | placeText = placed.box;
|
40093 | offscreen = placed.offscreen;
|
40094 | }
|
40095 | const prevOrientation = updatePreviousOrientationIfNotPlaced(placed && placed.box);
|
40096 | // If we didn't get placed, we still need to copy our position from the last placement for
|
40097 | // fade animations
|
40098 | if (!placeText && this.prevPlacement) {
|
40099 | const prevOffset = this.prevPlacement.variableOffsets[symbolInstance.crossTileID];
|
40100 | if (prevOffset) {
|
40101 | this.variableOffsets[symbolInstance.crossTileID] = prevOffset;
|
40102 | this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, prevOrientation);
|
40103 | }
|
40104 | }
|
40105 | }
|
40106 | }
|
40107 | placedGlyphBoxes = placed;
|
40108 | placeText = placedGlyphBoxes && placedGlyphBoxes.box && placedGlyphBoxes.box.length > 0;
|
40109 | offscreen = placedGlyphBoxes && placedGlyphBoxes.offscreen;
|
40110 | if (symbolInstance.useRuntimeCollisionCircles) {
|
40111 | const placedSymbol = bucket.text.placedSymbolArray.get(symbolInstance.centerJustifiedTextSymbolIndex);
|
40112 | const fontSize = performance.evaluateSizeForFeature(bucket.textSizeData, partiallyEvaluatedTextSize, placedSymbol);
|
40113 | const textPixelPadding = layout.get('text-padding');
|
40114 | const circlePixelDiameter = symbolInstance.collisionCircleDiameter;
|
40115 | placedGlyphCircles = this.collisionIndex.placeCollisionCircles(textOverlapMode, placedSymbol, bucket.lineVertexArray, bucket.glyphOffsetArray, fontSize, posMatrix, textLabelPlaneMatrix, labelToScreenMatrix, showCollisionBoxes, pitchWithMap, collisionGroup.predicate, circlePixelDiameter, textPixelPadding);
|
40116 | performance.assert(!placedGlyphCircles.circles.length || (!placedGlyphCircles.collisionDetected || showCollisionBoxes));
|
40117 | // If text-overlap is set to 'always', force "placedCircles" to true
|
40118 | // In theory there should always be at least one circle placed
|
40119 | // in this case, but for now quirks in text-anchor
|
40120 | // and text-offset may prevent that from being true.
|
40121 | placeText = textAlwaysOverlap || (placedGlyphCircles.circles.length > 0 && !placedGlyphCircles.collisionDetected);
|
40122 | offscreen = offscreen && placedGlyphCircles.offscreen;
|
40123 | }
|
40124 | if (collisionArrays.iconFeatureIndex) {
|
40125 | iconFeatureIndex = collisionArrays.iconFeatureIndex;
|
40126 | }
|
40127 | if (collisionArrays.iconBox) {
|
40128 | const placeIconFeature = iconBox => {
|
40129 | const shiftedIconBox = hasIconTextFit && shift ?
|
40130 | shiftVariableCollisionBox(iconBox, shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle) :
|
40131 | iconBox;
|
40132 | return this.collisionIndex.placeCollisionBox(shiftedIconBox, iconOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
|
40133 | };
|
40134 | if (placedVerticalText && placedVerticalText.box && placedVerticalText.box.length && collisionArrays.verticalIconBox) {
|
40135 | placedIconBoxes = placeIconFeature(collisionArrays.verticalIconBox);
|
40136 | placeIcon = placedIconBoxes.box.length > 0;
|
40137 | }
|
40138 | else {
|
40139 | placedIconBoxes = placeIconFeature(collisionArrays.iconBox);
|
40140 | placeIcon = placedIconBoxes.box.length > 0;
|
40141 | }
|
40142 | offscreen = offscreen && placedIconBoxes.offscreen;
|
40143 | }
|
40144 | const iconWithoutText = textOptional ||
|
40145 | (symbolInstance.numHorizontalGlyphVertices === 0 && symbolInstance.numVerticalGlyphVertices === 0);
|
40146 | const textWithoutIcon = iconOptional || symbolInstance.numIconVertices === 0;
|
40147 | // Combine the scales for icons and text.
|
40148 | if (!iconWithoutText && !textWithoutIcon) {
|
40149 | placeIcon = placeText = placeIcon && placeText;
|
40150 | }
|
40151 | else if (!textWithoutIcon) {
|
40152 | placeText = placeIcon && placeText;
|
40153 | }
|
40154 | else if (!iconWithoutText) {
|
40155 | placeIcon = placeIcon && placeText;
|
40156 | }
|
40157 | if (placeText && placedGlyphBoxes && placedGlyphBoxes.box) {
|
40158 | if (placedVerticalText && placedVerticalText.box && verticalTextFeatureIndex) {
|
40159 | this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, textOverlapMode, layout.get('text-ignore-placement'), bucket.bucketInstanceId, verticalTextFeatureIndex, collisionGroup.ID);
|
40160 | }
|
40161 | else {
|
40162 | this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, textOverlapMode, layout.get('text-ignore-placement'), bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID);
|
40163 | }
|
40164 | }
|
40165 | if (placeIcon && placedIconBoxes) {
|
40166 | this.collisionIndex.insertCollisionBox(placedIconBoxes.box, iconOverlapMode, layout.get('icon-ignore-placement'), bucket.bucketInstanceId, iconFeatureIndex, collisionGroup.ID);
|
40167 | }
|
40168 | if (placedGlyphCircles) {
|
40169 | if (placeText) {
|
40170 | this.collisionIndex.insertCollisionCircles(placedGlyphCircles.circles, textOverlapMode, layout.get('text-ignore-placement'), bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID);
|
40171 | }
|
40172 | if (showCollisionBoxes) {
|
40173 | const id = bucket.bucketInstanceId;
|
40174 | let circleArray = this.collisionCircleArrays[id];
|
40175 | // Group collision circles together by bucket. Circles can't be pushed forward for rendering yet as the symbol placement
|
40176 | // for a bucket is not guaranteed to be complete before the commit-function has been called
|
40177 | if (circleArray === undefined)
|
40178 | circleArray = this.collisionCircleArrays[id] = new CollisionCircleArray();
|
40179 | for (let i = 0; i < placedGlyphCircles.circles.length; i += 4) {
|
40180 | circleArray.circles.push(placedGlyphCircles.circles[i + 0]); // x
|
40181 | circleArray.circles.push(placedGlyphCircles.circles[i + 1]); // y
|
40182 | circleArray.circles.push(placedGlyphCircles.circles[i + 2]); // radius
|
40183 | circleArray.circles.push(placedGlyphCircles.collisionDetected ? 1 : 0); // collisionDetected-flag
|
40184 | }
|
40185 | }
|
40186 | }
|
40187 | performance.assert(symbolInstance.crossTileID !== 0);
|
40188 | performance.assert(bucket.bucketInstanceId !== 0);
|
40189 | this.placements[symbolInstance.crossTileID] = new JointPlacement(placeText || alwaysShowText, placeIcon || alwaysShowIcon, offscreen || bucket.justReloaded);
|
40190 | seenCrossTileIDs[symbolInstance.crossTileID] = true;
|
40191 | };
|
40192 | if (zOrderByViewportY) {
|
40193 | performance.assert(bucketPart.symbolInstanceStart === 0);
|
40194 | const symbolIndexes = bucket.getSortedSymbolIndexes(this.transform.angle);
|
40195 | for (let i = symbolIndexes.length - 1; i >= 0; --i) {
|
40196 | const symbolIndex = symbolIndexes[i];
|
40197 | placeSymbol(bucket.symbolInstances.get(symbolIndex), bucket.collisionArrays[symbolIndex]);
|
40198 | }
|
40199 | }
|
40200 | else {
|
40201 | for (let i = bucketPart.symbolInstanceStart; i < bucketPart.symbolInstanceEnd; i++) {
|
40202 | placeSymbol(bucket.symbolInstances.get(i), bucket.collisionArrays[i]);
|
40203 | }
|
40204 | }
|
40205 | if (showCollisionBoxes && bucket.bucketInstanceId in this.collisionCircleArrays) {
|
40206 | const circleArray = this.collisionCircleArrays[bucket.bucketInstanceId];
|
40207 | // Store viewport and inverse projection matrices per bucket
|
40208 | performance.invert(circleArray.invProjMatrix, posMatrix);
|
40209 | circleArray.viewportMatrix = this.collisionIndex.getViewportMatrix();
|
40210 | }
|
40211 | bucket.justReloaded = false;
|
40212 | }
|
40213 | markUsedJustification(bucket, placedAnchor, symbolInstance, orientation) {
|
40214 | const justifications = {
|
40215 | 'left': symbolInstance.leftJustifiedTextSymbolIndex,
|
40216 | 'center': symbolInstance.centerJustifiedTextSymbolIndex,
|
40217 | 'right': symbolInstance.rightJustifiedTextSymbolIndex
|
40218 | };
|
40219 | let autoIndex;
|
40220 | if (orientation === performance.WritingMode.vertical) {
|
40221 | autoIndex = symbolInstance.verticalPlacedTextSymbolIndex;
|
40222 | }
|
40223 | else {
|
40224 | autoIndex = justifications[performance.getAnchorJustification(placedAnchor)];
|
40225 | }
|
40226 | const indexes = [
|
40227 | symbolInstance.leftJustifiedTextSymbolIndex,
|
40228 | symbolInstance.centerJustifiedTextSymbolIndex,
|
40229 | symbolInstance.rightJustifiedTextSymbolIndex,
|
40230 | symbolInstance.verticalPlacedTextSymbolIndex
|
40231 | ];
|
40232 | for (const index of indexes) {
|
40233 | if (index >= 0) {
|
40234 | if (autoIndex >= 0 && index !== autoIndex) {
|
40235 | // There are multiple justifications and this one isn't it: shift offscreen
|
40236 | bucket.text.placedSymbolArray.get(index).crossTileID = 0;
|
40237 | }
|
40238 | else {
|
40239 | // Either this is the chosen justification or the justification is hardwired: use this one
|
40240 | bucket.text.placedSymbolArray.get(index).crossTileID = symbolInstance.crossTileID;
|
40241 | }
|
40242 | }
|
40243 | }
|
40244 | }
|
40245 | markUsedOrientation(bucket, orientation, symbolInstance) {
|
40246 | const horizontal = (orientation === performance.WritingMode.horizontal || orientation === performance.WritingMode.horizontalOnly) ? orientation : 0;
|
40247 | const vertical = orientation === performance.WritingMode.vertical ? orientation : 0;
|
40248 | const horizontalIndexes = [
|
40249 | symbolInstance.leftJustifiedTextSymbolIndex,
|
40250 | symbolInstance.centerJustifiedTextSymbolIndex,
|
40251 | symbolInstance.rightJustifiedTextSymbolIndex
|
40252 | ];
|
40253 | for (const index of horizontalIndexes) {
|
40254 | bucket.text.placedSymbolArray.get(index).placedOrientation = horizontal;
|
40255 | }
|
40256 | if (symbolInstance.verticalPlacedTextSymbolIndex) {
|
40257 | bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).placedOrientation = vertical;
|
40258 | }
|
40259 | }
|
40260 | commit(now) {
|
40261 | this.commitTime = now;
|
40262 | this.zoomAtLastRecencyCheck = this.transform.zoom;
|
40263 | const prevPlacement = this.prevPlacement;
|
40264 | let placementChanged = false;
|
40265 | this.prevZoomAdjustment = prevPlacement ? prevPlacement.zoomAdjustment(this.transform.zoom) : 0;
|
40266 | const increment = prevPlacement ? prevPlacement.symbolFadeChange(now) : 1;
|
40267 | const prevOpacities = prevPlacement ? prevPlacement.opacities : {};
|
40268 | const prevOffsets = prevPlacement ? prevPlacement.variableOffsets : {};
|
40269 | const prevOrientations = prevPlacement ? prevPlacement.placedOrientations : {};
|
40270 | // add the opacities from the current placement, and copy their current values from the previous placement
|
40271 | for (const crossTileID in this.placements) {
|
40272 | const jointPlacement = this.placements[crossTileID];
|
40273 | const prevOpacity = prevOpacities[crossTileID];
|
40274 | if (prevOpacity) {
|
40275 | this.opacities[crossTileID] = new JointOpacityState(prevOpacity, increment, jointPlacement.text, jointPlacement.icon);
|
40276 | placementChanged = placementChanged ||
|
40277 | jointPlacement.text !== prevOpacity.text.placed ||
|
40278 | jointPlacement.icon !== prevOpacity.icon.placed;
|
40279 | }
|
40280 | else {
|
40281 | this.opacities[crossTileID] = new JointOpacityState(null, increment, jointPlacement.text, jointPlacement.icon, jointPlacement.skipFade);
|
40282 | placementChanged = placementChanged || jointPlacement.text || jointPlacement.icon;
|
40283 | }
|
40284 | }
|
40285 | // copy and update values from the previous placement that aren't in the current placement but haven't finished fading
|
40286 | for (const crossTileID in prevOpacities) {
|
40287 | const prevOpacity = prevOpacities[crossTileID];
|
40288 | if (!this.opacities[crossTileID]) {
|
40289 | const jointOpacity = new JointOpacityState(prevOpacity, increment, false, false);
|
40290 | if (!jointOpacity.isHidden()) {
|
40291 | this.opacities[crossTileID] = jointOpacity;
|
40292 | placementChanged = placementChanged || prevOpacity.text.placed || prevOpacity.icon.placed;
|
40293 | }
|
40294 | }
|
40295 | }
|
40296 | for (const crossTileID in prevOffsets) {
|
40297 | if (!this.variableOffsets[crossTileID] && this.opacities[crossTileID] && !this.opacities[crossTileID].isHidden()) {
|
40298 | this.variableOffsets[crossTileID] = prevOffsets[crossTileID];
|
40299 | }
|
40300 | }
|
40301 | for (const crossTileID in prevOrientations) {
|
40302 | if (!this.placedOrientations[crossTileID] && this.opacities[crossTileID] && !this.opacities[crossTileID].isHidden()) {
|
40303 | this.placedOrientations[crossTileID] = prevOrientations[crossTileID];
|
40304 | }
|
40305 | }
|
40306 | // this.lastPlacementChangeTime is the time of the last commit() that
|
40307 | // resulted in a placement change -- in other words, the start time of
|
40308 | // the last symbol fade animation
|
40309 | performance.assert(!prevPlacement || prevPlacement.lastPlacementChangeTime !== undefined);
|
40310 | if (placementChanged) {
|
40311 | this.lastPlacementChangeTime = now;
|
40312 | }
|
40313 | else if (typeof this.lastPlacementChangeTime !== 'number') {
|
40314 | this.lastPlacementChangeTime = prevPlacement ? prevPlacement.lastPlacementChangeTime : now;
|
40315 | }
|
40316 | }
|
40317 | updateLayerOpacities(styleLayer, tiles) {
|
40318 | const seenCrossTileIDs = {};
|
40319 | for (const tile of tiles) {
|
40320 | const symbolBucket = tile.getBucket(styleLayer);
|
40321 | if (symbolBucket && tile.latestFeatureIndex && styleLayer.id === symbolBucket.layerIds[0]) {
|
40322 | this.updateBucketOpacities(symbolBucket, seenCrossTileIDs, tile.collisionBoxArray);
|
40323 | }
|
40324 | }
|
40325 | }
|
40326 | updateBucketOpacities(bucket, seenCrossTileIDs, collisionBoxArray) {
|
40327 | if (bucket.hasTextData())
|
40328 | bucket.text.opacityVertexArray.clear();
|
40329 | if (bucket.hasIconData())
|
40330 | bucket.icon.opacityVertexArray.clear();
|
40331 | if (bucket.hasIconCollisionBoxData())
|
40332 | bucket.iconCollisionBox.collisionVertexArray.clear();
|
40333 | if (bucket.hasTextCollisionBoxData())
|
40334 | bucket.textCollisionBox.collisionVertexArray.clear();
|
40335 | const layout = bucket.layers[0].layout;
|
40336 | const duplicateOpacityState = new JointOpacityState(null, 0, false, false, true);
|
40337 | const textAllowOverlap = layout.get('text-allow-overlap');
|
40338 | const iconAllowOverlap = layout.get('icon-allow-overlap');
|
40339 | const variablePlacement = layout.get('text-variable-anchor');
|
40340 | const rotateWithMap = layout.get('text-rotation-alignment') === 'map';
|
40341 | const pitchWithMap = layout.get('text-pitch-alignment') === 'map';
|
40342 | const hasIconTextFit = layout.get('icon-text-fit') !== 'none';
|
40343 | // If allow-overlap is true, we can show symbols before placement runs on them
|
40344 | // But we have to wait for placement if we potentially depend on a paired icon/text
|
40345 | // with allow-overlap: false.
|
40346 | // See https://github.com/mapbox/mapbox-gl-js/issues/7032
|
40347 | const defaultOpacityState = new JointOpacityState(null, 0, textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || layout.get('icon-optional')), iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || layout.get('text-optional')), true);
|
40348 | if (!bucket.collisionArrays && collisionBoxArray && ((bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()))) {
|
40349 | bucket.deserializeCollisionBoxes(collisionBoxArray);
|
40350 | }
|
40351 | const addOpacities = (iconOrText, numVertices, opacity) => {
|
40352 | for (let i = 0; i < numVertices / 4; i++) {
|
40353 | iconOrText.opacityVertexArray.emplaceBack(opacity);
|
40354 | }
|
40355 | };
|
40356 | for (let s = 0; s < bucket.symbolInstances.length; s++) {
|
40357 | const symbolInstance = bucket.symbolInstances.get(s);
|
40358 | const { numHorizontalGlyphVertices, numVerticalGlyphVertices, crossTileID } = symbolInstance;
|
40359 | const isDuplicate = seenCrossTileIDs[crossTileID];
|
40360 | let opacityState = this.opacities[crossTileID];
|
40361 | if (isDuplicate) {
|
40362 | opacityState = duplicateOpacityState;
|
40363 | }
|
40364 | else if (!opacityState) {
|
40365 | opacityState = defaultOpacityState;
|
40366 | // store the state so that future placements use it as a starting point
|
40367 | this.opacities[crossTileID] = opacityState;
|
40368 | }
|
40369 | seenCrossTileIDs[crossTileID] = true;
|
40370 | const hasText = numHorizontalGlyphVertices > 0 || numVerticalGlyphVertices > 0;
|
40371 | const hasIcon = symbolInstance.numIconVertices > 0;
|
40372 | const placedOrientation = this.placedOrientations[symbolInstance.crossTileID];
|
40373 | const horizontalHidden = placedOrientation === performance.WritingMode.vertical;
|
40374 | const verticalHidden = placedOrientation === performance.WritingMode.horizontal || placedOrientation === performance.WritingMode.horizontalOnly;
|
40375 | if (hasText) {
|
40376 | const packedOpacity = packOpacity(opacityState.text);
|
40377 | // Vertical text fades in/out on collision the same way as corresponding
|
40378 | // horizontal text. Switch between vertical/horizontal should be instantaneous
|
40379 | const horizontalOpacity = horizontalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity;
|
40380 | addOpacities(bucket.text, numHorizontalGlyphVertices, horizontalOpacity);
|
40381 | const verticalOpacity = verticalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity;
|
40382 | addOpacities(bucket.text, numVerticalGlyphVertices, verticalOpacity);
|
40383 | // If this label is completely faded, mark it so that we don't have to calculate
|
40384 | // its position at render time. If this layer has variable placement, shift the various
|
40385 | // symbol instances appropriately so that symbols from buckets that have yet to be placed
|
40386 | // offset appropriately.
|
40387 | const symbolHidden = opacityState.text.isHidden();
|
40388 | [
|
40389 | symbolInstance.rightJustifiedTextSymbolIndex,
|
40390 | symbolInstance.centerJustifiedTextSymbolIndex,
|
40391 | symbolInstance.leftJustifiedTextSymbolIndex
|
40392 | ].forEach(index => {
|
40393 | if (index >= 0) {
|
40394 | bucket.text.placedSymbolArray.get(index).hidden = symbolHidden || horizontalHidden ? 1 : 0;
|
40395 | }
|
40396 | });
|
40397 | if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) {
|
40398 | bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).hidden = symbolHidden || verticalHidden ? 1 : 0;
|
40399 | }
|
40400 | const prevOffset = this.variableOffsets[symbolInstance.crossTileID];
|
40401 | if (prevOffset) {
|
40402 | this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, placedOrientation);
|
40403 | }
|
40404 | const prevOrientation = this.placedOrientations[symbolInstance.crossTileID];
|
40405 | if (prevOrientation) {
|
40406 | this.markUsedJustification(bucket, 'left', symbolInstance, prevOrientation);
|
40407 | this.markUsedOrientation(bucket, prevOrientation, symbolInstance);
|
40408 | }
|
40409 | }
|
40410 | if (hasIcon) {
|
40411 | const packedOpacity = packOpacity(opacityState.icon);
|
40412 | const useHorizontal = !(hasIconTextFit && symbolInstance.verticalPlacedIconSymbolIndex && horizontalHidden);
|
40413 | if (symbolInstance.placedIconSymbolIndex >= 0) {
|
40414 | const horizontalOpacity = useHorizontal ? packedOpacity : PACKED_HIDDEN_OPACITY;
|
40415 | addOpacities(bucket.icon, symbolInstance.numIconVertices, horizontalOpacity);
|
40416 | bucket.icon.placedSymbolArray.get(symbolInstance.placedIconSymbolIndex).hidden =
|
40417 | opacityState.icon.isHidden();
|
40418 | }
|
40419 | if (symbolInstance.verticalPlacedIconSymbolIndex >= 0) {
|
40420 | const verticalOpacity = !useHorizontal ? packedOpacity : PACKED_HIDDEN_OPACITY;
|
40421 | addOpacities(bucket.icon, symbolInstance.numVerticalIconVertices, verticalOpacity);
|
40422 | bucket.icon.placedSymbolArray.get(symbolInstance.verticalPlacedIconSymbolIndex).hidden =
|
40423 | opacityState.icon.isHidden();
|
40424 | }
|
40425 | }
|
40426 | if (bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()) {
|
40427 | const collisionArrays = bucket.collisionArrays[s];
|
40428 | if (collisionArrays) {
|
40429 | let shift = new performance.pointGeometry(0, 0);
|
40430 | if (collisionArrays.textBox || collisionArrays.verticalTextBox) {
|
40431 | let used = true;
|
40432 | if (variablePlacement) {
|
40433 | const variableOffset = this.variableOffsets[crossTileID];
|
40434 | if (variableOffset) {
|
40435 | // This will show either the currently placed position or the last
|
40436 | // successfully placed position (so you can visualize what collision
|
40437 | // just made the symbol disappear, and the most likely place for the
|
40438 | // symbol to come back)
|
40439 | shift = calculateVariableLayoutShift(variableOffset.anchor, variableOffset.width, variableOffset.height, variableOffset.textOffset, variableOffset.textBoxScale);
|
40440 | if (rotateWithMap) {
|
40441 | shift._rotate(pitchWithMap ? this.transform.angle : -this.transform.angle);
|
40442 | }
|
40443 | }
|
40444 | else {
|
40445 | // No offset -> this symbol hasn't been placed since coming on-screen
|
40446 | // No single box is particularly meaningful and all of them would be too noisy
|
40447 | // Use the center box just to show something's there, but mark it "not used"
|
40448 | used = false;
|
40449 | }
|
40450 | }
|
40451 | if (collisionArrays.textBox) {
|
40452 | updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || horizontalHidden, shift.x, shift.y);
|
40453 | }
|
40454 | if (collisionArrays.verticalTextBox) {
|
40455 | updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || verticalHidden, shift.x, shift.y);
|
40456 | }
|
40457 | }
|
40458 | const verticalIconUsed = Boolean(!verticalHidden && collisionArrays.verticalIconBox);
|
40459 | if (collisionArrays.iconBox) {
|
40460 | updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, verticalIconUsed, hasIconTextFit ? shift.x : 0, hasIconTextFit ? shift.y : 0);
|
40461 | }
|
40462 | if (collisionArrays.verticalIconBox) {
|
40463 | updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, !verticalIconUsed, hasIconTextFit ? shift.x : 0, hasIconTextFit ? shift.y : 0);
|
40464 | }
|
40465 | }
|
40466 | }
|
40467 | }
|
40468 | bucket.sortFeatures(this.transform.angle);
|
40469 | if (this.retainedQueryData[bucket.bucketInstanceId]) {
|
40470 | this.retainedQueryData[bucket.bucketInstanceId].featureSortOrder = bucket.featureSortOrder;
|
40471 | }
|
40472 | if (bucket.hasTextData() && bucket.text.opacityVertexBuffer) {
|
40473 | bucket.text.opacityVertexBuffer.updateData(bucket.text.opacityVertexArray);
|
40474 | }
|
40475 | if (bucket.hasIconData() && bucket.icon.opacityVertexBuffer) {
|
40476 | bucket.icon.opacityVertexBuffer.updateData(bucket.icon.opacityVertexArray);
|
40477 | }
|
40478 | if (bucket.hasIconCollisionBoxData() && bucket.iconCollisionBox.collisionVertexBuffer) {
|
40479 | bucket.iconCollisionBox.collisionVertexBuffer.updateData(bucket.iconCollisionBox.collisionVertexArray);
|
40480 | }
|
40481 | if (bucket.hasTextCollisionBoxData() && bucket.textCollisionBox.collisionVertexBuffer) {
|
40482 | bucket.textCollisionBox.collisionVertexBuffer.updateData(bucket.textCollisionBox.collisionVertexArray);
|
40483 | }
|
40484 | performance.assert(bucket.text.opacityVertexArray.length === bucket.text.layoutVertexArray.length / 4);
|
40485 | performance.assert(bucket.icon.opacityVertexArray.length === bucket.icon.layoutVertexArray.length / 4);
|
40486 | // Push generated collision circles to the bucket for debug rendering
|
40487 | if (bucket.bucketInstanceId in this.collisionCircleArrays) {
|
40488 | const instance = this.collisionCircleArrays[bucket.bucketInstanceId];
|
40489 | bucket.placementInvProjMatrix = instance.invProjMatrix;
|
40490 | bucket.placementViewportMatrix = instance.viewportMatrix;
|
40491 | bucket.collisionCircleArray = instance.circles;
|
40492 | delete this.collisionCircleArrays[bucket.bucketInstanceId];
|
40493 | }
|
40494 | }
|
40495 | symbolFadeChange(now) {
|
40496 | return this.fadeDuration === 0 ?
|
40497 | 1 :
|
40498 | ((now - this.commitTime) / this.fadeDuration + this.prevZoomAdjustment);
|
40499 | }
|
40500 | zoomAdjustment(zoom) {
|
40501 | // When zooming out quickly, labels can overlap each other. This
|
40502 | // adjustment is used to reduce the interval between placement calculations
|
40503 | // and to reduce the fade duration when zooming out quickly. Discovering the
|
40504 | // collisions more quickly and fading them more quickly reduces the unwanted effect.
|
40505 | return Math.max(0, (this.transform.zoom - zoom) / 1.5);
|
40506 | }
|
40507 | hasTransitions(now) {
|
40508 | return this.stale ||
|
40509 | now - this.lastPlacementChangeTime < this.fadeDuration;
|
40510 | }
|
40511 | stillRecent(now, zoom) {
|
40512 | // The adjustment makes placement more frequent when zooming.
|
40513 | // This condition applies the adjustment only after the map has
|
40514 | // stopped zooming. This avoids adding extra jank while zooming.
|
40515 | const durationAdjustment = this.zoomAtLastRecencyCheck === zoom ?
|
40516 | (1 - this.zoomAdjustment(zoom)) :
|
40517 | 1;
|
40518 | this.zoomAtLastRecencyCheck = zoom;
|
40519 | return this.commitTime + this.fadeDuration * durationAdjustment > now;
|
40520 | }
|
40521 | setStale() {
|
40522 | this.stale = true;
|
40523 | }
|
40524 | }
|
40525 | function updateCollisionVertices(collisionVertexArray, placed, notUsed, shiftX, shiftY) {
|
40526 | collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0);
|
40527 | collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0);
|
40528 | collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0);
|
40529 | collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0);
|
40530 | }
|
40531 | // All four vertices for a glyph will have the same opacity state
|
40532 | // So we pack the opacity into a uint8, and then repeat it four times
|
40533 | // to make a single uint32 that we can upload for each glyph in the
|
40534 | // label.
|
40535 | const shift25 = Math.pow(2, 25);
|
40536 | const shift24 = Math.pow(2, 24);
|
40537 | const shift17 = Math.pow(2, 17);
|
40538 | const shift16 = Math.pow(2, 16);
|
40539 | const shift9 = Math.pow(2, 9);
|
40540 | const shift8 = Math.pow(2, 8);
|
40541 | const shift1 = Math.pow(2, 1);
|
40542 | function packOpacity(opacityState) {
|
40543 | if (opacityState.opacity === 0 && !opacityState.placed) {
|
40544 | return 0;
|
40545 | }
|
40546 | else if (opacityState.opacity === 1 && opacityState.placed) {
|
40547 | return 4294967295;
|
40548 | }
|
40549 | const targetBit = opacityState.placed ? 1 : 0;
|
40550 | const opacityBits = Math.floor(opacityState.opacity * 127);
|
40551 | return opacityBits * shift25 + targetBit * shift24 +
|
40552 | opacityBits * shift17 + targetBit * shift16 +
|
40553 | opacityBits * shift9 + targetBit * shift8 +
|
40554 | opacityBits * shift1 + targetBit;
|
40555 | }
|
40556 | const PACKED_HIDDEN_OPACITY = 0;
|
40557 |
|
40558 | class LayerPlacement {
|
40559 | constructor(styleLayer) {
|
40560 | this._sortAcrossTiles = styleLayer.layout.get('symbol-z-order') !== 'viewport-y' &&
|
40561 | !styleLayer.layout.get('symbol-sort-key').isConstant();
|
40562 | this._currentTileIndex = 0;
|
40563 | this._currentPartIndex = 0;
|
40564 | this._seenCrossTileIDs = {};
|
40565 | this._bucketParts = [];
|
40566 | }
|
40567 | continuePlacement(tiles, placement, showCollisionBoxes, styleLayer, shouldPausePlacement) {
|
40568 | const bucketParts = this._bucketParts;
|
40569 | while (this._currentTileIndex < tiles.length) {
|
40570 | const tile = tiles[this._currentTileIndex];
|
40571 | placement.getBucketParts(bucketParts, styleLayer, tile, this._sortAcrossTiles);
|
40572 | this._currentTileIndex++;
|
40573 | if (shouldPausePlacement()) {
|
40574 | return true;
|
40575 | }
|
40576 | }
|
40577 | if (this._sortAcrossTiles) {
|
40578 | this._sortAcrossTiles = false;
|
40579 | bucketParts.sort((a, b) => a.sortKey - b.sortKey);
|
40580 | }
|
40581 | while (this._currentPartIndex < bucketParts.length) {
|
40582 | const bucketPart = bucketParts[this._currentPartIndex];
|
40583 | placement.placeLayerBucketPart(bucketPart, this._seenCrossTileIDs, showCollisionBoxes);
|
40584 | this._currentPartIndex++;
|
40585 | if (shouldPausePlacement()) {
|
40586 | return true;
|
40587 | }
|
40588 | }
|
40589 | return false;
|
40590 | }
|
40591 | }
|
40592 | class PauseablePlacement {
|
40593 | constructor(transform, order, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions, prevPlacement) {
|
40594 | this.placement = new Placement(transform, fadeDuration, crossSourceCollisions, prevPlacement);
|
40595 | this._currentPlacementIndex = order.length - 1;
|
40596 | this._forceFullPlacement = forceFullPlacement;
|
40597 | this._showCollisionBoxes = showCollisionBoxes;
|
40598 | this._done = false;
|
40599 | }
|
40600 | isDone() {
|
40601 | return this._done;
|
40602 | }
|
40603 | continuePlacement(order, layers, layerTiles) {
|
40604 | const startTime = performance.exported.now();
|
40605 | const shouldPausePlacement = () => {
|
40606 | const elapsedTime = performance.exported.now() - startTime;
|
40607 | return this._forceFullPlacement ? false : elapsedTime > 2;
|
40608 | };
|
40609 | while (this._currentPlacementIndex >= 0) {
|
40610 | const layerId = order[this._currentPlacementIndex];
|
40611 | const layer = layers[layerId];
|
40612 | const placementZoom = this.placement.collisionIndex.transform.zoom;
|
40613 | if (layer.type === 'symbol' &&
|
40614 | (!layer.minzoom || layer.minzoom <= placementZoom) &&
|
40615 | (!layer.maxzoom || layer.maxzoom > placementZoom)) {
|
40616 | if (!this._inProgressLayer) {
|
40617 | this._inProgressLayer = new LayerPlacement(layer);
|
40618 | }
|
40619 | const pausePlacement = this._inProgressLayer.continuePlacement(layerTiles[layer.source], this.placement, this._showCollisionBoxes, layer, shouldPausePlacement);
|
40620 | if (pausePlacement) {
|
40621 | // We didn't finish placing all layers within 2ms,
|
40622 | // but we can keep rendering with a partial placement
|
40623 | // We'll resume here on the next frame
|
40624 | return;
|
40625 | }
|
40626 | delete this._inProgressLayer;
|
40627 | }
|
40628 | this._currentPlacementIndex--;
|
40629 | }
|
40630 | this._done = true;
|
40631 | }
|
40632 | commit(now) {
|
40633 | this.placement.commit(now);
|
40634 | return this.placement;
|
40635 | }
|
40636 | }
|
40637 |
|
40638 | /*
|
40639 | The CrossTileSymbolIndex generally works on the assumption that
|
40640 | a conceptual "unique symbol" can be identified by the text of
|
40641 | the label combined with the anchor point. The goal is to assign
|
40642 | these conceptual "unique symbols" a shared crossTileID that can be
|
40643 | used by Placement to keep fading opacity states consistent and to
|
40644 | deduplicate labels.
|
40645 |
|
40646 | The CrossTileSymbolIndex indexes all the current symbol instances and
|
40647 | their crossTileIDs. When a symbol bucket gets added or updated, the
|
40648 | index assigns a crossTileID to each of it's symbol instances by either
|
40649 | matching it with an existing id or assigning a new one.
|
40650 | */
|
40651 | // Round anchor positions to roughly 4 pixel grid
|
40652 | const roundingFactor = 512 / performance.EXTENT / 2;
|
40653 | class TileLayerIndex {
|
40654 | constructor(tileID, symbolInstances, bucketInstanceId) {
|
40655 | this.tileID = tileID;
|
40656 | this.indexedSymbolInstances = {};
|
40657 | this.bucketInstanceId = bucketInstanceId;
|
40658 | for (let i = 0; i < symbolInstances.length; i++) {
|
40659 | const symbolInstance = symbolInstances.get(i);
|
40660 | const key = symbolInstance.key;
|
40661 | if (!this.indexedSymbolInstances[key]) {
|
40662 | this.indexedSymbolInstances[key] = [];
|
40663 | }
|
40664 | // This tile may have multiple symbol instances with the same key
|
40665 | // Store each one along with its coordinates
|
40666 | this.indexedSymbolInstances[key].push({
|
40667 | crossTileID: symbolInstance.crossTileID,
|
40668 | coord: this.getScaledCoordinates(symbolInstance, tileID)
|
40669 | });
|
40670 | }
|
40671 | }
|
40672 | // Converts the coordinates of the input symbol instance into coordinates that be can compared
|
40673 | // against other symbols in this index. Coordinates are:
|
40674 | // (1) world-based (so after conversion the source tile is irrelevant)
|
40675 | // (2) converted to the z-scale of this TileLayerIndex
|
40676 | // (3) down-sampled by "roundingFactor" from tile coordinate precision in order to be
|
40677 | // more tolerant of small differences between tiles.
|
40678 | getScaledCoordinates(symbolInstance, childTileID) {
|
40679 | const zDifference = childTileID.canonical.z - this.tileID.canonical.z;
|
40680 | const scale = roundingFactor / Math.pow(2, zDifference);
|
40681 | return {
|
40682 | x: Math.floor((childTileID.canonical.x * performance.EXTENT + symbolInstance.anchorX) * scale),
|
40683 | y: Math.floor((childTileID.canonical.y * performance.EXTENT + symbolInstance.anchorY) * scale)
|
40684 | };
|
40685 | }
|
40686 | findMatches(symbolInstances, newTileID, zoomCrossTileIDs) {
|
40687 | const tolerance = this.tileID.canonical.z < newTileID.canonical.z ? 1 : Math.pow(2, this.tileID.canonical.z - newTileID.canonical.z);
|
40688 | for (let i = 0; i < symbolInstances.length; i++) {
|
40689 | const symbolInstance = symbolInstances.get(i);
|
40690 | if (symbolInstance.crossTileID) {
|
40691 | // already has a match, skip
|
40692 | continue;
|
40693 | }
|
40694 | const indexedInstances = this.indexedSymbolInstances[symbolInstance.key];
|
40695 | if (!indexedInstances) {
|
40696 | // No symbol with this key in this bucket
|
40697 | continue;
|
40698 | }
|
40699 | const scaledSymbolCoord = this.getScaledCoordinates(symbolInstance, newTileID);
|
40700 | for (const thisTileSymbol of indexedInstances) {
|
40701 | // Return any symbol with the same keys whose coordinates are within 1
|
40702 | // grid unit. (with a 4px grid, this covers a 12px by 12px area)
|
40703 | if (Math.abs(thisTileSymbol.coord.x - scaledSymbolCoord.x) <= tolerance &&
|
40704 | Math.abs(thisTileSymbol.coord.y - scaledSymbolCoord.y) <= tolerance &&
|
40705 | !zoomCrossTileIDs[thisTileSymbol.crossTileID]) {
|
40706 | // Once we've marked ourselves duplicate against this parent symbol,
|
40707 | // don't let any other symbols at the same zoom level duplicate against
|
40708 | // the same parent (see issue #5993)
|
40709 | zoomCrossTileIDs[thisTileSymbol.crossTileID] = true;
|
40710 | symbolInstance.crossTileID = thisTileSymbol.crossTileID;
|
40711 | break;
|
40712 | }
|
40713 | }
|
40714 | }
|
40715 | }
|
40716 | }
|
40717 | class CrossTileIDs {
|
40718 | constructor() {
|
40719 | this.maxCrossTileID = 0;
|
40720 | }
|
40721 | generate() {
|
40722 | return ++this.maxCrossTileID;
|
40723 | }
|
40724 | }
|
40725 | class CrossTileSymbolLayerIndex {
|
40726 | constructor() {
|
40727 | this.indexes = {};
|
40728 | this.usedCrossTileIDs = {};
|
40729 | this.lng = 0;
|
40730 | }
|
40731 | /*
|
40732 | * Sometimes when a user pans across the antimeridian the longitude value gets wrapped.
|
40733 | * To prevent labels from flashing out and in we adjust the tileID values in the indexes
|
40734 | * so that they match the new wrapped version of the map.
|
40735 | */
|
40736 | handleWrapJump(lng) {
|
40737 | const wrapDelta = Math.round((lng - this.lng) / 360);
|
40738 | if (wrapDelta !== 0) {
|
40739 | for (const zoom in this.indexes) {
|
40740 | const zoomIndexes = this.indexes[zoom];
|
40741 | const newZoomIndex = {};
|
40742 | for (const key in zoomIndexes) {
|
40743 | // change the tileID's wrap and add it to a new index
|
40744 | const index = zoomIndexes[key];
|
40745 | index.tileID = index.tileID.unwrapTo(index.tileID.wrap + wrapDelta);
|
40746 | newZoomIndex[index.tileID.key] = index;
|
40747 | }
|
40748 | this.indexes[zoom] = newZoomIndex;
|
40749 | }
|
40750 | }
|
40751 | this.lng = lng;
|
40752 | }
|
40753 | addBucket(tileID, bucket, crossTileIDs) {
|
40754 | if (this.indexes[tileID.overscaledZ] &&
|
40755 | this.indexes[tileID.overscaledZ][tileID.key]) {
|
40756 | if (this.indexes[tileID.overscaledZ][tileID.key].bucketInstanceId ===
|
40757 | bucket.bucketInstanceId) {
|
40758 | return false;
|
40759 | }
|
40760 | else {
|
40761 | // We're replacing this bucket with an updated version
|
40762 | // Remove the old bucket's "used crossTileIDs" now so that
|
40763 | // the new bucket can claim them.
|
40764 | // The old index entries themselves stick around until
|
40765 | // 'removeStaleBuckets' is called.
|
40766 | this.removeBucketCrossTileIDs(tileID.overscaledZ, this.indexes[tileID.overscaledZ][tileID.key]);
|
40767 | }
|
40768 | }
|
40769 | for (let i = 0; i < bucket.symbolInstances.length; i++) {
|
40770 | const symbolInstance = bucket.symbolInstances.get(i);
|
40771 | symbolInstance.crossTileID = 0;
|
40772 | }
|
40773 | if (!this.usedCrossTileIDs[tileID.overscaledZ]) {
|
40774 | this.usedCrossTileIDs[tileID.overscaledZ] = {};
|
40775 | }
|
40776 | const zoomCrossTileIDs = this.usedCrossTileIDs[tileID.overscaledZ];
|
40777 | for (const zoom in this.indexes) {
|
40778 | const zoomIndexes = this.indexes[zoom];
|
40779 | if (Number(zoom) > tileID.overscaledZ) {
|
40780 | for (const id in zoomIndexes) {
|
40781 | const childIndex = zoomIndexes[id];
|
40782 | if (childIndex.tileID.isChildOf(tileID)) {
|
40783 | childIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs);
|
40784 | }
|
40785 | }
|
40786 | }
|
40787 | else {
|
40788 | const parentCoord = tileID.scaledTo(Number(zoom));
|
40789 | const parentIndex = zoomIndexes[parentCoord.key];
|
40790 | if (parentIndex) {
|
40791 | parentIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs);
|
40792 | }
|
40793 | }
|
40794 | }
|
40795 | for (let i = 0; i < bucket.symbolInstances.length; i++) {
|
40796 | const symbolInstance = bucket.symbolInstances.get(i);
|
40797 | if (!symbolInstance.crossTileID) {
|
40798 | // symbol did not match any known symbol, assign a new id
|
40799 | symbolInstance.crossTileID = crossTileIDs.generate();
|
40800 | zoomCrossTileIDs[symbolInstance.crossTileID] = true;
|
40801 | }
|
40802 | }
|
40803 | if (this.indexes[tileID.overscaledZ] === undefined) {
|
40804 | this.indexes[tileID.overscaledZ] = {};
|
40805 | }
|
40806 | this.indexes[tileID.overscaledZ][tileID.key] = new TileLayerIndex(tileID, bucket.symbolInstances, bucket.bucketInstanceId);
|
40807 | return true;
|
40808 | }
|
40809 | removeBucketCrossTileIDs(zoom, removedBucket) {
|
40810 | for (const key in removedBucket.indexedSymbolInstances) {
|
40811 | for (const symbolInstance of removedBucket.indexedSymbolInstances[key]) {
|
40812 | delete this.usedCrossTileIDs[zoom][symbolInstance.crossTileID];
|
40813 | }
|
40814 | }
|
40815 | }
|
40816 | removeStaleBuckets(currentIDs) {
|
40817 | let tilesChanged = false;
|
40818 | for (const z in this.indexes) {
|
40819 | const zoomIndexes = this.indexes[z];
|
40820 | for (const tileKey in zoomIndexes) {
|
40821 | if (!currentIDs[zoomIndexes[tileKey].bucketInstanceId]) {
|
40822 | this.removeBucketCrossTileIDs(z, zoomIndexes[tileKey]);
|
40823 | delete zoomIndexes[tileKey];
|
40824 | tilesChanged = true;
|
40825 | }
|
40826 | }
|
40827 | }
|
40828 | return tilesChanged;
|
40829 | }
|
40830 | }
|
40831 | class CrossTileSymbolIndex {
|
40832 | constructor() {
|
40833 | this.layerIndexes = {};
|
40834 | this.crossTileIDs = new CrossTileIDs();
|
40835 | this.maxBucketInstanceId = 0;
|
40836 | this.bucketsInCurrentPlacement = {};
|
40837 | }
|
40838 | addLayer(styleLayer, tiles, lng) {
|
40839 | let layerIndex = this.layerIndexes[styleLayer.id];
|
40840 | if (layerIndex === undefined) {
|
40841 | layerIndex = this.layerIndexes[styleLayer.id] = new CrossTileSymbolLayerIndex();
|
40842 | }
|
40843 | let symbolBucketsChanged = false;
|
40844 | const currentBucketIDs = {};
|
40845 | layerIndex.handleWrapJump(lng);
|
40846 | for (const tile of tiles) {
|
40847 | const symbolBucket = tile.getBucket(styleLayer);
|
40848 | if (!symbolBucket || styleLayer.id !== symbolBucket.layerIds[0])
|
40849 | continue;
|
40850 | if (!symbolBucket.bucketInstanceId) {
|
40851 | symbolBucket.bucketInstanceId = ++this.maxBucketInstanceId;
|
40852 | }
|
40853 | if (layerIndex.addBucket(tile.tileID, symbolBucket, this.crossTileIDs)) {
|
40854 | symbolBucketsChanged = true;
|
40855 | }
|
40856 | currentBucketIDs[symbolBucket.bucketInstanceId] = true;
|
40857 | }
|
40858 | if (layerIndex.removeStaleBuckets(currentBucketIDs)) {
|
40859 | symbolBucketsChanged = true;
|
40860 | }
|
40861 | return symbolBucketsChanged;
|
40862 | }
|
40863 | pruneUnusedLayers(usedLayers) {
|
40864 | const usedLayerMap = {};
|
40865 | usedLayers.forEach((usedLayer) => {
|
40866 | usedLayerMap[usedLayer] = true;
|
40867 | });
|
40868 | for (const layerId in this.layerIndexes) {
|
40869 | if (!usedLayerMap[layerId]) {
|
40870 | delete this.layerIndexes[layerId];
|
40871 | }
|
40872 | }
|
40873 | }
|
40874 | }
|
40875 |
|
40876 | // We're skipping validation errors with the `source.canvas` identifier in order
|
40877 | // to continue to allow canvas sources to be added at runtime/updated in
|
40878 | // smart setStyle (see https://github.com/mapbox/mapbox-gl-js/pull/6424):
|
40879 | const emitValidationErrors = (evented, errors) => performance.emitValidationErrors(evented, errors && errors.filter(error => error.identifier !== 'source.canvas'));
|
40880 | const supportedDiffOperations = performance.pick(operations, [
|
40881 | 'addLayer',
|
40882 | 'removeLayer',
|
40883 | 'setPaintProperty',
|
40884 | 'setLayoutProperty',
|
40885 | 'setFilter',
|
40886 | 'addSource',
|
40887 | 'removeSource',
|
40888 | 'setLayerZoomRange',
|
40889 | 'setLight',
|
40890 | 'setTransition',
|
40891 | 'setGeoJSONSourceData'
|
40892 | // 'setGlyphs',
|
40893 | // 'setSprite',
|
40894 | ]);
|
40895 | const ignoredDiffOperations = performance.pick(operations, [
|
40896 | 'setCenter',
|
40897 | 'setZoom',
|
40898 | 'setBearing',
|
40899 | 'setPitch'
|
40900 | ]);
|
40901 | const empty = emptyStyle();
|
40902 | /**
|
40903 | * @private
|
40904 | */
|
40905 | class Style extends performance.Evented {
|
40906 | constructor(map, options = {}) {
|
40907 | super();
|
40908 | this.map = map;
|
40909 | this.dispatcher = new Dispatcher(getGlobalWorkerPool(), this);
|
40910 | this.imageManager = new ImageManager();
|
40911 | this.imageManager.setEventedParent(this);
|
40912 | this.glyphManager = new GlyphManager(map._requestManager, options.localIdeographFontFamily);
|
40913 | this.lineAtlas = new LineAtlas(256, 512);
|
40914 | this.crossTileSymbolIndex = new CrossTileSymbolIndex();
|
40915 | this._layers = {};
|
40916 | this._serializedLayers = {};
|
40917 | this._order = [];
|
40918 | this.sourceCaches = {};
|
40919 | this.zoomHistory = new performance.ZoomHistory();
|
40920 | this._loaded = false;
|
40921 | this._availableImages = [];
|
40922 | this._resetUpdates();
|
40923 | this.dispatcher.broadcast('setReferrer', performance.getReferrer());
|
40924 | const self = this;
|
40925 | this._rtlTextPluginCallback = Style.registerForPluginStateChange((event) => {
|
40926 | const state = {
|
40927 | pluginStatus: event.pluginStatus,
|
40928 | pluginURL: event.pluginURL
|
40929 | };
|
40930 | self.dispatcher.broadcast('syncRTLPluginState', state, (err, results) => {
|
40931 | performance.triggerPluginCompletionEvent(err);
|
40932 | if (results) {
|
40933 | const allComplete = results.every((elem) => elem);
|
40934 | if (allComplete) {
|
40935 | for (const id in self.sourceCaches) {
|
40936 | self.sourceCaches[id].reload(); // Should be a no-op if the plugin loads before any tiles load
|
40937 | }
|
40938 | }
|
40939 | }
|
40940 | });
|
40941 | });
|
40942 | this.on('data', (event) => {
|
40943 | if (event.dataType !== 'source' || event.sourceDataType !== 'metadata') {
|
40944 | return;
|
40945 | }
|
40946 | const sourceCache = this.sourceCaches[event.sourceId];
|
40947 | if (!sourceCache) {
|
40948 | return;
|
40949 | }
|
40950 | const source = sourceCache.getSource();
|
40951 | if (!source || !source.vectorLayerIds) {
|
40952 | return;
|
40953 | }
|
40954 | for (const layerId in this._layers) {
|
40955 | const layer = this._layers[layerId];
|
40956 | if (layer.source === source.id) {
|
40957 | this._validateLayer(layer);
|
40958 | }
|
40959 | }
|
40960 | });
|
40961 | }
|
40962 | loadURL(url, options = {}) {
|
40963 | this.fire(new performance.Event('dataloading', { dataType: 'style' }));
|
40964 | const validate = typeof options.validate === 'boolean' ?
|
40965 | options.validate : true;
|
40966 | const request = this.map._requestManager.transformRequest(url, performance.ResourceType.Style);
|
40967 | this._request = performance.getJSON(request, (error, json) => {
|
40968 | this._request = null;
|
40969 | if (error) {
|
40970 | this.fire(new performance.ErrorEvent(error));
|
40971 | }
|
40972 | else if (json) {
|
40973 | this._load(json, validate);
|
40974 | }
|
40975 | });
|
40976 | }
|
40977 | loadJSON(json, options = {}) {
|
40978 | this.fire(new performance.Event('dataloading', { dataType: 'style' }));
|
40979 | this._request = performance.exported.frame(() => {
|
40980 | this._request = null;
|
40981 | this._load(json, options.validate !== false);
|
40982 | });
|
40983 | }
|
40984 | loadEmpty() {
|
40985 | this.fire(new performance.Event('dataloading', { dataType: 'style' }));
|
40986 | this._load(empty, false);
|
40987 | }
|
40988 | _load(json, validate) {
|
40989 | if (validate && emitValidationErrors(this, performance.validateStyle(json))) {
|
40990 | return;
|
40991 | }
|
40992 | this._loaded = true;
|
40993 | this.stylesheet = json;
|
40994 | for (const id in json.sources) {
|
40995 | this.addSource(id, json.sources[id], { validate: false });
|
40996 | }
|
40997 | if (json.sprite) {
|
40998 | this._loadSprite(json.sprite);
|
40999 | }
|
41000 | else {
|
41001 | this.imageManager.setLoaded(true);
|
41002 | }
|
41003 | this.glyphManager.setURL(json.glyphs);
|
41004 | const layers = derefLayers(this.stylesheet.layers);
|
41005 | this._order = layers.map((layer) => layer.id);
|
41006 | this._layers = {};
|
41007 | this._serializedLayers = {};
|
41008 | for (let layer of layers) {
|
41009 | layer = performance.createStyleLayer(layer);
|
41010 | layer.setEventedParent(this, { layer: { id: layer.id } });
|
41011 | this._layers[layer.id] = layer;
|
41012 | this._serializedLayers[layer.id] = layer.serialize();
|
41013 | }
|
41014 | this.dispatcher.broadcast('setLayers', this._serializeLayers(this._order));
|
41015 | this.light = new Light(this.stylesheet.light);
|
41016 | this.fire(new performance.Event('data', { dataType: 'style' }));
|
41017 | this.fire(new performance.Event('style.load'));
|
41018 | }
|
41019 | _loadSprite(url) {
|
41020 | this._spriteRequest = loadSprite(url, this.map._requestManager, this.map.getPixelRatio(), (err, images) => {
|
41021 | this._spriteRequest = null;
|
41022 | if (err) {
|
41023 | this.fire(new performance.ErrorEvent(err));
|
41024 | }
|
41025 | else if (images) {
|
41026 | for (const id in images) {
|
41027 | this.imageManager.addImage(id, images[id]);
|
41028 | }
|
41029 | }
|
41030 | this.imageManager.setLoaded(true);
|
41031 | this._availableImages = this.imageManager.listImages();
|
41032 | this.dispatcher.broadcast('setImages', this._availableImages);
|
41033 | this.fire(new performance.Event('data', { dataType: 'style' }));
|
41034 | });
|
41035 | }
|
41036 | _validateLayer(layer) {
|
41037 | const sourceCache = this.sourceCaches[layer.source];
|
41038 | if (!sourceCache) {
|
41039 | return;
|
41040 | }
|
41041 | const sourceLayer = layer.sourceLayer;
|
41042 | if (!sourceLayer) {
|
41043 | return;
|
41044 | }
|
41045 | const source = sourceCache.getSource();
|
41046 | if (source.type === 'geojson' || (source.vectorLayerIds && source.vectorLayerIds.indexOf(sourceLayer) === -1)) {
|
41047 | this.fire(new performance.ErrorEvent(new Error(`Source layer "${sourceLayer}" ` +
|
41048 | `does not exist on source "${source.id}" ` +
|
41049 | `as specified by style layer "${layer.id}".`)));
|
41050 | }
|
41051 | }
|
41052 | loaded() {
|
41053 | if (!this._loaded)
|
41054 | return false;
|
41055 | if (Object.keys(this._updatedSources).length)
|
41056 | return false;
|
41057 | for (const id in this.sourceCaches)
|
41058 | if (!this.sourceCaches[id].loaded())
|
41059 | return false;
|
41060 | if (!this.imageManager.isLoaded())
|
41061 | return false;
|
41062 | return true;
|
41063 | }
|
41064 | _serializeLayers(ids) {
|
41065 | const serializedLayers = [];
|
41066 | for (const id of ids) {
|
41067 | const layer = this._layers[id];
|
41068 | if (layer.type !== 'custom') {
|
41069 | serializedLayers.push(layer.serialize());
|
41070 | }
|
41071 | }
|
41072 | return serializedLayers;
|
41073 | }
|
41074 | hasTransitions() {
|
41075 | if (this.light && this.light.hasTransition()) {
|
41076 | return true;
|
41077 | }
|
41078 | for (const id in this.sourceCaches) {
|
41079 | if (this.sourceCaches[id].hasTransition()) {
|
41080 | return true;
|
41081 | }
|
41082 | }
|
41083 | for (const id in this._layers) {
|
41084 | if (this._layers[id].hasTransition()) {
|
41085 | return true;
|
41086 | }
|
41087 | }
|
41088 | return false;
|
41089 | }
|
41090 | _checkLoaded() {
|
41091 | if (!this._loaded) {
|
41092 | throw new Error('Style is not done loading.');
|
41093 | }
|
41094 | }
|
41095 | /**
|
41096 | * Apply queued style updates in a batch and recalculate zoom-dependent paint properties.
|
41097 | * @private
|
41098 | */
|
41099 | update(parameters) {
|
41100 | if (!this._loaded) {
|
41101 | return;
|
41102 | }
|
41103 | const changed = this._changed;
|
41104 | if (this._changed) {
|
41105 | const updatedIds = Object.keys(this._updatedLayers);
|
41106 | const removedIds = Object.keys(this._removedLayers);
|
41107 | if (updatedIds.length || removedIds.length) {
|
41108 | this._updateWorkerLayers(updatedIds, removedIds);
|
41109 | }
|
41110 | for (const id in this._updatedSources) {
|
41111 | const action = this._updatedSources[id];
|
41112 | performance.assert(action === 'reload' || action === 'clear');
|
41113 | if (action === 'reload') {
|
41114 | this._reloadSource(id);
|
41115 | }
|
41116 | else if (action === 'clear') {
|
41117 | this._clearSource(id);
|
41118 | }
|
41119 | }
|
41120 | this._updateTilesForChangedImages();
|
41121 | for (const id in this._updatedPaintProps) {
|
41122 | this._layers[id].updateTransitions(parameters);
|
41123 | }
|
41124 | this.light.updateTransitions(parameters);
|
41125 | this._resetUpdates();
|
41126 | }
|
41127 | const sourcesUsedBefore = {};
|
41128 | for (const sourceId in this.sourceCaches) {
|
41129 | const sourceCache = this.sourceCaches[sourceId];
|
41130 | sourcesUsedBefore[sourceId] = sourceCache.used;
|
41131 | sourceCache.used = false;
|
41132 | }
|
41133 | for (const layerId of this._order) {
|
41134 | const layer = this._layers[layerId];
|
41135 | layer.recalculate(parameters, this._availableImages);
|
41136 | if (!layer.isHidden(parameters.zoom) && layer.source) {
|
41137 | this.sourceCaches[layer.source].used = true;
|
41138 | }
|
41139 | }
|
41140 | for (const sourceId in sourcesUsedBefore) {
|
41141 | const sourceCache = this.sourceCaches[sourceId];
|
41142 | if (sourcesUsedBefore[sourceId] !== sourceCache.used) {
|
41143 | sourceCache.fire(new performance.Event('data', { sourceDataType: 'visibility', dataType: 'source', sourceId }));
|
41144 | }
|
41145 | }
|
41146 | this.light.recalculate(parameters);
|
41147 | this.z = parameters.zoom;
|
41148 | if (changed) {
|
41149 | this.fire(new performance.Event('data', { dataType: 'style' }));
|
41150 | }
|
41151 | }
|
41152 | /*
|
41153 | * Apply any queued image changes.
|
41154 | */
|
41155 | _updateTilesForChangedImages() {
|
41156 | const changedImages = Object.keys(this._changedImages);
|
41157 | if (changedImages.length) {
|
41158 | for (const name in this.sourceCaches) {
|
41159 | this.sourceCaches[name].reloadTilesForDependencies(['icons', 'patterns'], changedImages);
|
41160 | }
|
41161 | this._changedImages = {};
|
41162 | }
|
41163 | }
|
41164 | _updateWorkerLayers(updatedIds, removedIds) {
|
41165 | this.dispatcher.broadcast('updateLayers', {
|
41166 | layers: this._serializeLayers(updatedIds),
|
41167 | removedIds
|
41168 | });
|
41169 | }
|
41170 | _resetUpdates() {
|
41171 | this._changed = false;
|
41172 | this._updatedLayers = {};
|
41173 | this._removedLayers = {};
|
41174 | this._updatedSources = {};
|
41175 | this._updatedPaintProps = {};
|
41176 | this._changedImages = {};
|
41177 | }
|
41178 | /**
|
41179 | * Update this style's state to match the given style JSON, performing only
|
41180 | * the necessary mutations.
|
41181 | *
|
41182 | * May throw an Error ('Unimplemented: METHOD') if the mapbox-gl-style-spec
|
41183 | * diff algorithm produces an operation that is not supported.
|
41184 | *
|
41185 | * @returns {boolean} true if any changes were made; false otherwise
|
41186 | * @private
|
41187 | */
|
41188 | setState(nextState) {
|
41189 | this._checkLoaded();
|
41190 | if (emitValidationErrors(this, performance.validateStyle(nextState)))
|
41191 | return false;
|
41192 | nextState = performance.clone$1(nextState);
|
41193 | nextState.layers = derefLayers(nextState.layers);
|
41194 | const changes = diffStyles(this.serialize(), nextState)
|
41195 | .filter(op => !(op.command in ignoredDiffOperations));
|
41196 | if (changes.length === 0) {
|
41197 | return false;
|
41198 | }
|
41199 | const unimplementedOps = changes.filter(op => !(op.command in supportedDiffOperations));
|
41200 | if (unimplementedOps.length > 0) {
|
41201 | throw new Error(`Unimplemented: ${unimplementedOps.map(op => op.command).join(', ')}.`);
|
41202 | }
|
41203 | changes.forEach((op) => {
|
41204 | if (op.command === 'setTransition') {
|
41205 | // `transition` is always read directly off of
|
41206 | // `this.stylesheet`, which we update below
|
41207 | return;
|
41208 | }
|
41209 | this[op.command].apply(this, op.args);
|
41210 | });
|
41211 | this.stylesheet = nextState;
|
41212 | return true;
|
41213 | }
|
41214 | addImage(id, image) {
|
41215 | if (this.getImage(id)) {
|
41216 | return this.fire(new performance.ErrorEvent(new Error(`An image named "${id}" already exists.`)));
|
41217 | }
|
41218 | this.imageManager.addImage(id, image);
|
41219 | this._afterImageUpdated(id);
|
41220 | }
|
41221 | updateImage(id, image) {
|
41222 | this.imageManager.updateImage(id, image);
|
41223 | }
|
41224 | getImage(id) {
|
41225 | return this.imageManager.getImage(id);
|
41226 | }
|
41227 | removeImage(id) {
|
41228 | if (!this.getImage(id)) {
|
41229 | return this.fire(new performance.ErrorEvent(new Error(`An image named "${id}" does not exist.`)));
|
41230 | }
|
41231 | this.imageManager.removeImage(id);
|
41232 | this._afterImageUpdated(id);
|
41233 | }
|
41234 | _afterImageUpdated(id) {
|
41235 | this._availableImages = this.imageManager.listImages();
|
41236 | this._changedImages[id] = true;
|
41237 | this._changed = true;
|
41238 | this.dispatcher.broadcast('setImages', this._availableImages);
|
41239 | this.fire(new performance.Event('data', { dataType: 'style' }));
|
41240 | }
|
41241 | listImages() {
|
41242 | this._checkLoaded();
|
41243 | return this.imageManager.listImages();
|
41244 | }
|
41245 | addSource(id, source, options = {}) {
|
41246 | this._checkLoaded();
|
41247 | if (this.sourceCaches[id] !== undefined) {
|
41248 | throw new Error(`Source "${id}" already exists.`);
|
41249 | }
|
41250 | if (!source.type) {
|
41251 | throw new Error(`The type property must be defined, but only the following properties were given: ${Object.keys(source).join(', ')}.`);
|
41252 | }
|
41253 | const builtIns = ['vector', 'raster', 'geojson', 'video', 'image'];
|
41254 | const shouldValidate = builtIns.indexOf(source.type) >= 0;
|
41255 | if (shouldValidate && this._validate(performance.validateStyle.source, `sources.${id}`, source, null, options))
|
41256 | return;
|
41257 | if (this.map && this.map._collectResourceTiming)
|
41258 | source.collectResourceTiming = true;
|
41259 | const sourceCache = this.sourceCaches[id] = new SourceCache(id, source, this.dispatcher);
|
41260 | sourceCache.style = this;
|
41261 | sourceCache.setEventedParent(this, () => ({
|
41262 | isSourceLoaded: this.loaded(),
|
41263 | source: sourceCache.serialize(),
|
41264 | sourceId: id
|
41265 | }));
|
41266 | sourceCache.onAdd(this.map);
|
41267 | this._changed = true;
|
41268 | }
|
41269 | /**
|
41270 | * Remove a source from this stylesheet, given its id.
|
41271 | * @param {string} id id of the source to remove
|
41272 | * @throws {Error} if no source is found with the given ID
|
41273 | * @returns {Map} The {@link Map} object.
|
41274 | */
|
41275 | removeSource(id) {
|
41276 | this._checkLoaded();
|
41277 | if (this.sourceCaches[id] === undefined) {
|
41278 | throw new Error('There is no source with this ID');
|
41279 | }
|
41280 | for (const layerId in this._layers) {
|
41281 | if (this._layers[layerId].source === id) {
|
41282 | return this.fire(new performance.ErrorEvent(new Error(`Source "${id}" cannot be removed while layer "${layerId}" is using it.`)));
|
41283 | }
|
41284 | }
|
41285 | const sourceCache = this.sourceCaches[id];
|
41286 | delete this.sourceCaches[id];
|
41287 | delete this._updatedSources[id];
|
41288 | sourceCache.fire(new performance.Event('data', { sourceDataType: 'metadata', dataType: 'source', sourceId: id }));
|
41289 | sourceCache.setEventedParent(null);
|
41290 | sourceCache.onRemove(this.map);
|
41291 | this._changed = true;
|
41292 | }
|
41293 | /**
|
41294 | * Set the data of a GeoJSON source, given its id.
|
41295 | * @param {string} id id of the source
|
41296 | * @param {GeoJSON|string} data GeoJSON source
|
41297 | */
|
41298 | setGeoJSONSourceData(id, data) {
|
41299 | this._checkLoaded();
|
41300 | performance.assert(this.sourceCaches[id] !== undefined, 'There is no source with this ID');
|
41301 | const geojsonSource = this.sourceCaches[id].getSource();
|
41302 | performance.assert(geojsonSource.type === 'geojson');
|
41303 | geojsonSource.setData(data);
|
41304 | this._changed = true;
|
41305 | }
|
41306 | /**
|
41307 | * Get a source by id.
|
41308 | * @param {string} id id of the desired source
|
41309 | * @returns {Source | undefined} source
|
41310 | */
|
41311 | getSource(id) {
|
41312 | return this.sourceCaches[id] && this.sourceCaches[id].getSource();
|
41313 | }
|
41314 | /**
|
41315 | * Add a layer to the map style. The layer will be inserted before the layer with
|
41316 | * ID `before`, or appended if `before` is omitted.
|
41317 | * @param {Object | CustomLayerInterface} layerObject The style layer to add.
|
41318 | * @param {string} [before] ID of an existing layer to insert before
|
41319 | * @param {Object} options Style setter options.
|
41320 | * @returns {Map} The {@link Map} object.
|
41321 | */
|
41322 | addLayer(layerObject, before, options = {}) {
|
41323 | this._checkLoaded();
|
41324 | const id = layerObject.id;
|
41325 | if (this.getLayer(id)) {
|
41326 | this.fire(new performance.ErrorEvent(new Error(`Layer "${id}" already exists on this map.`)));
|
41327 | return;
|
41328 | }
|
41329 | let layer;
|
41330 | if (layerObject.type === 'custom') {
|
41331 | if (emitValidationErrors(this, performance.validateCustomStyleLayer(layerObject)))
|
41332 | return;
|
41333 | layer = performance.createStyleLayer(layerObject);
|
41334 | }
|
41335 | else {
|
41336 | if (typeof layerObject.source === 'object') {
|
41337 | this.addSource(id, layerObject.source);
|
41338 | layerObject = performance.clone$1(layerObject);
|
41339 | layerObject = performance.extend(layerObject, { source: id });
|
41340 | }
|
41341 | // this layer is not in the style.layers array, so we pass an impossible array index
|
41342 | if (this._validate(performance.validateStyle.layer, `layers.${id}`, layerObject, { arrayIndex: -1 }, options))
|
41343 | return;
|
41344 | layer = performance.createStyleLayer(layerObject);
|
41345 | this._validateLayer(layer);
|
41346 | layer.setEventedParent(this, { layer: { id } });
|
41347 | this._serializedLayers[layer.id] = layer.serialize();
|
41348 | }
|
41349 | const index = before ? this._order.indexOf(before) : this._order.length;
|
41350 | if (before && index === -1) {
|
41351 | this.fire(new performance.ErrorEvent(new Error(`Cannot add layer "${id}" before non-existing layer "${before}".`)));
|
41352 | return;
|
41353 | }
|
41354 | this._order.splice(index, 0, id);
|
41355 | this._layerOrderChanged = true;
|
41356 | this._layers[id] = layer;
|
41357 | if (this._removedLayers[id] && layer.source && layer.type !== 'custom') {
|
41358 | // If, in the current batch, we have already removed this layer
|
41359 | // and we are now re-adding it with a different `type`, then we
|
41360 | // need to clear (rather than just reload) the underyling source's
|
41361 | // tiles. Otherwise, tiles marked 'reloading' will have buckets /
|
41362 | // buffers that are set up for the _previous_ version of this
|
41363 | // layer, causing, e.g.:
|
41364 | // https://github.com/mapbox/mapbox-gl-js/issues/3633
|
41365 | const removed = this._removedLayers[id];
|
41366 | delete this._removedLayers[id];
|
41367 | if (removed.type !== layer.type) {
|
41368 | this._updatedSources[layer.source] = 'clear';
|
41369 | }
|
41370 | else {
|
41371 | this._updatedSources[layer.source] = 'reload';
|
41372 | this.sourceCaches[layer.source].pause();
|
41373 | }
|
41374 | }
|
41375 | this._updateLayer(layer);
|
41376 | if (layer.onAdd) {
|
41377 | layer.onAdd(this.map);
|
41378 | }
|
41379 | }
|
41380 | /**
|
41381 | * Moves a layer to a different z-position. The layer will be inserted before the layer with
|
41382 | * ID `before`, or appended if `before` is omitted.
|
41383 | * @param {string} id ID of the layer to move
|
41384 | * @param {string} [before] ID of an existing layer to insert before
|
41385 | */
|
41386 | moveLayer(id, before) {
|
41387 | this._checkLoaded();
|
41388 | this._changed = true;
|
41389 | const layer = this._layers[id];
|
41390 | if (!layer) {
|
41391 | this.fire(new performance.ErrorEvent(new Error(`The layer '${id}' does not exist in the map's style and cannot be moved.`)));
|
41392 | return;
|
41393 | }
|
41394 | if (id === before) {
|
41395 | return;
|
41396 | }
|
41397 | const index = this._order.indexOf(id);
|
41398 | this._order.splice(index, 1);
|
41399 | const newIndex = before ? this._order.indexOf(before) : this._order.length;
|
41400 | if (before && newIndex === -1) {
|
41401 | this.fire(new performance.ErrorEvent(new Error(`Cannot move layer "${id}" before non-existing layer "${before}".`)));
|
41402 | return;
|
41403 | }
|
41404 | this._order.splice(newIndex, 0, id);
|
41405 | this._layerOrderChanged = true;
|
41406 | }
|
41407 | /**
|
41408 | * Remove the layer with the given id from the style.
|
41409 | *
|
41410 | * If no such layer exists, an `error` event is fired.
|
41411 | *
|
41412 | * @param {string} id id of the layer to remove
|
41413 | * @fires error
|
41414 | */
|
41415 | removeLayer(id) {
|
41416 | this._checkLoaded();
|
41417 | const layer = this._layers[id];
|
41418 | if (!layer) {
|
41419 | this.fire(new performance.ErrorEvent(new Error(`Cannot remove non-existing layer "${id}".`)));
|
41420 | return;
|
41421 | }
|
41422 | layer.setEventedParent(null);
|
41423 | const index = this._order.indexOf(id);
|
41424 | this._order.splice(index, 1);
|
41425 | this._layerOrderChanged = true;
|
41426 | this._changed = true;
|
41427 | this._removedLayers[id] = layer;
|
41428 | delete this._layers[id];
|
41429 | delete this._serializedLayers[id];
|
41430 | delete this._updatedLayers[id];
|
41431 | delete this._updatedPaintProps[id];
|
41432 | if (layer.onRemove) {
|
41433 | layer.onRemove(this.map);
|
41434 | }
|
41435 | }
|
41436 | /**
|
41437 | * Return the style layer object with the given `id`.
|
41438 | *
|
41439 | * @param {string} id - id of the desired layer
|
41440 | * @returns {?Object} a layer, if one with the given `id` exists
|
41441 | */
|
41442 | getLayer(id) {
|
41443 | return this._layers[id];
|
41444 | }
|
41445 | /**
|
41446 | * checks if a specific layer is present within the style.
|
41447 | *
|
41448 | * @param {string} id - id of the desired layer
|
41449 | * @returns {boolean} a boolean specifying if the given layer is present
|
41450 | */
|
41451 | hasLayer(id) {
|
41452 | return id in this._layers;
|
41453 | }
|
41454 | setLayerZoomRange(layerId, minzoom, maxzoom) {
|
41455 | this._checkLoaded();
|
41456 | const layer = this.getLayer(layerId);
|
41457 | if (!layer) {
|
41458 | this.fire(new performance.ErrorEvent(new Error(`Cannot set the zoom range of non-existing layer "${layerId}".`)));
|
41459 | return;
|
41460 | }
|
41461 | if (layer.minzoom === minzoom && layer.maxzoom === maxzoom)
|
41462 | return;
|
41463 | if (minzoom != null) {
|
41464 | layer.minzoom = minzoom;
|
41465 | }
|
41466 | if (maxzoom != null) {
|
41467 | layer.maxzoom = maxzoom;
|
41468 | }
|
41469 | this._updateLayer(layer);
|
41470 | }
|
41471 | setFilter(layerId, filter, options = {}) {
|
41472 | this._checkLoaded();
|
41473 | const layer = this.getLayer(layerId);
|
41474 | if (!layer) {
|
41475 | this.fire(new performance.ErrorEvent(new Error(`Cannot filter non-existing layer "${layerId}".`)));
|
41476 | return;
|
41477 | }
|
41478 | if (performance.deepEqual(layer.filter, filter)) {
|
41479 | return;
|
41480 | }
|
41481 | if (filter === null || filter === undefined) {
|
41482 | layer.filter = undefined;
|
41483 | this._updateLayer(layer);
|
41484 | return;
|
41485 | }
|
41486 | if (this._validate(performance.validateStyle.filter, `layers.${layer.id}.filter`, filter, null, options)) {
|
41487 | return;
|
41488 | }
|
41489 | layer.filter = performance.clone$1(filter);
|
41490 | this._updateLayer(layer);
|
41491 | }
|
41492 | /**
|
41493 | * Get a layer's filter object
|
41494 | * @param {string} layer the layer to inspect
|
41495 | * @returns {*} the layer's filter, if any
|
41496 | */
|
41497 | getFilter(layer) {
|
41498 | return performance.clone$1(this.getLayer(layer).filter);
|
41499 | }
|
41500 | setLayoutProperty(layerId, name, value, options = {}) {
|
41501 | this._checkLoaded();
|
41502 | const layer = this.getLayer(layerId);
|
41503 | if (!layer) {
|
41504 | this.fire(new performance.ErrorEvent(new Error(`Cannot style non-existing layer "${layerId}".`)));
|
41505 | return;
|
41506 | }
|
41507 | if (performance.deepEqual(layer.getLayoutProperty(name), value))
|
41508 | return;
|
41509 | layer.setLayoutProperty(name, value, options);
|
41510 | this._updateLayer(layer);
|
41511 | }
|
41512 | /**
|
41513 | * Get a layout property's value from a given layer
|
41514 | * @param {string} layerId the layer to inspect
|
41515 | * @param {string} name the name of the layout property
|
41516 | * @returns {*} the property value
|
41517 | */
|
41518 | getLayoutProperty(layerId, name) {
|
41519 | const layer = this.getLayer(layerId);
|
41520 | if (!layer) {
|
41521 | this.fire(new performance.ErrorEvent(new Error(`Cannot get style of non-existing layer "${layerId}".`)));
|
41522 | return;
|
41523 | }
|
41524 | return layer.getLayoutProperty(name);
|
41525 | }
|
41526 | setPaintProperty(layerId, name, value, options = {}) {
|
41527 | this._checkLoaded();
|
41528 | const layer = this.getLayer(layerId);
|
41529 | if (!layer) {
|
41530 | this.fire(new performance.ErrorEvent(new Error(`Cannot style non-existing layer "${layerId}".`)));
|
41531 | return;
|
41532 | }
|
41533 | if (performance.deepEqual(layer.getPaintProperty(name), value))
|
41534 | return;
|
41535 | const requiresRelayout = layer.setPaintProperty(name, value, options);
|
41536 | if (requiresRelayout) {
|
41537 | this._updateLayer(layer);
|
41538 | }
|
41539 | this._changed = true;
|
41540 | this._updatedPaintProps[layerId] = true;
|
41541 | }
|
41542 | getPaintProperty(layer, name) {
|
41543 | return this.getLayer(layer).getPaintProperty(name);
|
41544 | }
|
41545 | setFeatureState(target, state) {
|
41546 | this._checkLoaded();
|
41547 | const sourceId = target.source;
|
41548 | const sourceLayer = target.sourceLayer;
|
41549 | const sourceCache = this.sourceCaches[sourceId];
|
41550 | if (sourceCache === undefined) {
|
41551 | this.fire(new performance.ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`)));
|
41552 | return;
|
41553 | }
|
41554 | const sourceType = sourceCache.getSource().type;
|
41555 | if (sourceType === 'geojson' && sourceLayer) {
|
41556 | this.fire(new performance.ErrorEvent(new Error('GeoJSON sources cannot have a sourceLayer parameter.')));
|
41557 | return;
|
41558 | }
|
41559 | if (sourceType === 'vector' && !sourceLayer) {
|
41560 | this.fire(new performance.ErrorEvent(new Error('The sourceLayer parameter must be provided for vector source types.')));
|
41561 | return;
|
41562 | }
|
41563 | if (target.id === undefined) {
|
41564 | this.fire(new performance.ErrorEvent(new Error('The feature id parameter must be provided.')));
|
41565 | }
|
41566 | sourceCache.setFeatureState(sourceLayer, target.id, state);
|
41567 | }
|
41568 | removeFeatureState(target, key) {
|
41569 | this._checkLoaded();
|
41570 | const sourceId = target.source;
|
41571 | const sourceCache = this.sourceCaches[sourceId];
|
41572 | if (sourceCache === undefined) {
|
41573 | this.fire(new performance.ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`)));
|
41574 | return;
|
41575 | }
|
41576 | const sourceType = sourceCache.getSource().type;
|
41577 | const sourceLayer = sourceType === 'vector' ? target.sourceLayer : undefined;
|
41578 | if (sourceType === 'vector' && !sourceLayer) {
|
41579 | this.fire(new performance.ErrorEvent(new Error('The sourceLayer parameter must be provided for vector source types.')));
|
41580 | return;
|
41581 | }
|
41582 | if (key && (typeof target.id !== 'string' && typeof target.id !== 'number')) {
|
41583 | this.fire(new performance.ErrorEvent(new Error('A feature id is required to remove its specific state property.')));
|
41584 | return;
|
41585 | }
|
41586 | sourceCache.removeFeatureState(sourceLayer, target.id, key);
|
41587 | }
|
41588 | getFeatureState(target) {
|
41589 | this._checkLoaded();
|
41590 | const sourceId = target.source;
|
41591 | const sourceLayer = target.sourceLayer;
|
41592 | const sourceCache = this.sourceCaches[sourceId];
|
41593 | if (sourceCache === undefined) {
|
41594 | this.fire(new performance.ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`)));
|
41595 | return;
|
41596 | }
|
41597 | const sourceType = sourceCache.getSource().type;
|
41598 | if (sourceType === 'vector' && !sourceLayer) {
|
41599 | this.fire(new performance.ErrorEvent(new Error('The sourceLayer parameter must be provided for vector source types.')));
|
41600 | return;
|
41601 | }
|
41602 | if (target.id === undefined) {
|
41603 | this.fire(new performance.ErrorEvent(new Error('The feature id parameter must be provided.')));
|
41604 | }
|
41605 | return sourceCache.getFeatureState(sourceLayer, target.id);
|
41606 | }
|
41607 | getTransition() {
|
41608 | return performance.extend({ duration: 300, delay: 0 }, this.stylesheet && this.stylesheet.transition);
|
41609 | }
|
41610 | serialize() {
|
41611 | return performance.filterObject({
|
41612 | version: this.stylesheet.version,
|
41613 | name: this.stylesheet.name,
|
41614 | metadata: this.stylesheet.metadata,
|
41615 | light: this.stylesheet.light,
|
41616 | center: this.stylesheet.center,
|
41617 | zoom: this.stylesheet.zoom,
|
41618 | bearing: this.stylesheet.bearing,
|
41619 | pitch: this.stylesheet.pitch,
|
41620 | sprite: this.stylesheet.sprite,
|
41621 | glyphs: this.stylesheet.glyphs,
|
41622 | transition: this.stylesheet.transition,
|
41623 | sources: performance.mapObject(this.sourceCaches, (source) => source.serialize()),
|
41624 | layers: this._serializeLayers(this._order)
|
41625 | }, (value) => { return value !== undefined; });
|
41626 | }
|
41627 | _updateLayer(layer) {
|
41628 | this._updatedLayers[layer.id] = true;
|
41629 | if (layer.source && !this._updatedSources[layer.source] &&
|
41630 | //Skip for raster layers (https://github.com/mapbox/mapbox-gl-js/issues/7865)
|
41631 | this.sourceCaches[layer.source].getSource().type !== 'raster') {
|
41632 | this._updatedSources[layer.source] = 'reload';
|
41633 | this.sourceCaches[layer.source].pause();
|
41634 | }
|
41635 | this._changed = true;
|
41636 | }
|
41637 | _flattenAndSortRenderedFeatures(sourceResults) {
|
41638 | // Feature order is complicated.
|
41639 | // The order between features in two 2D layers is always determined by layer order.
|
41640 | // The order between features in two 3D layers is always determined by depth.
|
41641 | // The order between a feature in a 2D layer and a 3D layer is tricky:
|
41642 | // Most often layer order determines the feature order in this case. If
|
41643 | // a line layer is above a extrusion layer the line feature will be rendered
|
41644 | // above the extrusion. If the line layer is below the extrusion layer,
|
41645 | // it will be rendered below it.
|
41646 | //
|
41647 | // There is a weird case though.
|
41648 | // You have layers in this order: extrusion_layer_a, line_layer, extrusion_layer_b
|
41649 | // Each layer has a feature that overlaps the other features.
|
41650 | // The feature in extrusion_layer_a is closer than the feature in extrusion_layer_b so it is rendered above.
|
41651 | // The feature in line_layer is rendered above extrusion_layer_a.
|
41652 | // This means that that the line_layer feature is above the extrusion_layer_b feature despite
|
41653 | // it being in an earlier layer.
|
41654 | const isLayer3D = layerId => this._layers[layerId].type === 'fill-extrusion';
|
41655 | const layerIndex = {};
|
41656 | const features3D = [];
|
41657 | for (let l = this._order.length - 1; l >= 0; l--) {
|
41658 | const layerId = this._order[l];
|
41659 | if (isLayer3D(layerId)) {
|
41660 | layerIndex[layerId] = l;
|
41661 | for (const sourceResult of sourceResults) {
|
41662 | const layerFeatures = sourceResult[layerId];
|
41663 | if (layerFeatures) {
|
41664 | for (const featureWrapper of layerFeatures) {
|
41665 | features3D.push(featureWrapper);
|
41666 | }
|
41667 | }
|
41668 | }
|
41669 | }
|
41670 | }
|
41671 | features3D.sort((a, b) => {
|
41672 | return b.intersectionZ - a.intersectionZ;
|
41673 | });
|
41674 | const features = [];
|
41675 | for (let l = this._order.length - 1; l >= 0; l--) {
|
41676 | const layerId = this._order[l];
|
41677 | if (isLayer3D(layerId)) {
|
41678 | // add all 3D features that are in or above the current layer
|
41679 | for (let i = features3D.length - 1; i >= 0; i--) {
|
41680 | const topmost3D = features3D[i].feature;
|
41681 | if (layerIndex[topmost3D.layer.id] < l)
|
41682 | break;
|
41683 | features.push(topmost3D);
|
41684 | features3D.pop();
|
41685 | }
|
41686 | }
|
41687 | else {
|
41688 | for (const sourceResult of sourceResults) {
|
41689 | const layerFeatures = sourceResult[layerId];
|
41690 | if (layerFeatures) {
|
41691 | for (const featureWrapper of layerFeatures) {
|
41692 | features.push(featureWrapper.feature);
|
41693 | }
|
41694 | }
|
41695 | }
|
41696 | }
|
41697 | }
|
41698 | return features;
|
41699 | }
|
41700 | queryRenderedFeatures(queryGeometry, params, transform) {
|
41701 | if (params && params.filter) {
|
41702 | this._validate(performance.validateStyle.filter, 'queryRenderedFeatures.filter', params.filter, null, params);
|
41703 | }
|
41704 | const includedSources = {};
|
41705 | if (params && params.layers) {
|
41706 | if (!Array.isArray(params.layers)) {
|
41707 | this.fire(new performance.ErrorEvent(new Error('parameters.layers must be an Array.')));
|
41708 | return [];
|
41709 | }
|
41710 | for (const layerId of params.layers) {
|
41711 | const layer = this._layers[layerId];
|
41712 | if (!layer) {
|
41713 | // this layer is not in the style.layers array
|
41714 | this.fire(new performance.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be queried for features.`)));
|
41715 | return [];
|
41716 | }
|
41717 | includedSources[layer.source] = true;
|
41718 | }
|
41719 | }
|
41720 | const sourceResults = [];
|
41721 | params.availableImages = this._availableImages;
|
41722 | for (const id in this.sourceCaches) {
|
41723 | if (params.layers && !includedSources[id])
|
41724 | continue;
|
41725 | sourceResults.push(queryRenderedFeatures(this.sourceCaches[id], this._layers, this._serializedLayers, queryGeometry, params, transform));
|
41726 | }
|
41727 | if (this.placement) {
|
41728 | // If a placement has run, query against its CollisionIndex
|
41729 | // for symbol results, and treat it as an extra source to merge
|
41730 | sourceResults.push(queryRenderedSymbols(this._layers, this._serializedLayers, this.sourceCaches, queryGeometry, params, this.placement.collisionIndex, this.placement.retainedQueryData));
|
41731 | }
|
41732 | return this._flattenAndSortRenderedFeatures(sourceResults);
|
41733 | }
|
41734 | querySourceFeatures(sourceID, params) {
|
41735 | if (params && params.filter) {
|
41736 | this._validate(performance.validateStyle.filter, 'querySourceFeatures.filter', params.filter, null, params);
|
41737 | }
|
41738 | const sourceCache = this.sourceCaches[sourceID];
|
41739 | return sourceCache ? querySourceFeatures(sourceCache, params) : [];
|
41740 | }
|
41741 | addSourceType(name, SourceType, callback) {
|
41742 | if (Style.getSourceType(name)) {
|
41743 | return callback(new Error(`A source type called "${name}" already exists.`));
|
41744 | }
|
41745 | Style.setSourceType(name, SourceType);
|
41746 | if (!SourceType.workerSourceURL) {
|
41747 | return callback(null, null);
|
41748 | }
|
41749 | this.dispatcher.broadcast('loadWorkerSource', {
|
41750 | name,
|
41751 | url: SourceType.workerSourceURL
|
41752 | }, callback);
|
41753 | }
|
41754 | getLight() {
|
41755 | return this.light.getLight();
|
41756 | }
|
41757 | setLight(lightOptions, options = {}) {
|
41758 | this._checkLoaded();
|
41759 | const light = this.light.getLight();
|
41760 | let _update = false;
|
41761 | for (const key in lightOptions) {
|
41762 | if (!performance.deepEqual(lightOptions[key], light[key])) {
|
41763 | _update = true;
|
41764 | break;
|
41765 | }
|
41766 | }
|
41767 | if (!_update)
|
41768 | return;
|
41769 | const parameters = {
|
41770 | now: performance.exported.now(),
|
41771 | transition: performance.extend({
|
41772 | duration: 300,
|
41773 | delay: 0
|
41774 | }, this.stylesheet.transition)
|
41775 | };
|
41776 | this.light.setLight(lightOptions, options);
|
41777 | this.light.updateTransitions(parameters);
|
41778 | }
|
41779 | _validate(validate, key, value, props, options = {}) {
|
41780 | if (options && options.validate === false) {
|
41781 | return false;
|
41782 | }
|
41783 | return emitValidationErrors(this, validate.call(performance.validateStyle, performance.extend({
|
41784 | key,
|
41785 | style: this.serialize(),
|
41786 | value,
|
41787 | styleSpec: performance.spec
|
41788 | }, props)));
|
41789 | }
|
41790 | _remove() {
|
41791 | if (this._request) {
|
41792 | this._request.cancel();
|
41793 | this._request = null;
|
41794 | }
|
41795 | if (this._spriteRequest) {
|
41796 | this._spriteRequest.cancel();
|
41797 | this._spriteRequest = null;
|
41798 | }
|
41799 | performance.evented.off('pluginStateChange', this._rtlTextPluginCallback);
|
41800 | for (const layerId in this._layers) {
|
41801 | const layer = this._layers[layerId];
|
41802 | layer.setEventedParent(null);
|
41803 | }
|
41804 | for (const id in this.sourceCaches) {
|
41805 | const sourceCache = this.sourceCaches[id];
|
41806 | sourceCache.setEventedParent(null);
|
41807 | sourceCache.onRemove(this.map);
|
41808 | }
|
41809 | this.imageManager.setEventedParent(null);
|
41810 | this.setEventedParent(null);
|
41811 | this.dispatcher.remove();
|
41812 | }
|
41813 | _clearSource(id) {
|
41814 | this.sourceCaches[id].clearTiles();
|
41815 | }
|
41816 | _reloadSource(id) {
|
41817 | this.sourceCaches[id].resume();
|
41818 | this.sourceCaches[id].reload();
|
41819 | }
|
41820 | _updateSources(transform) {
|
41821 | for (const id in this.sourceCaches) {
|
41822 | this.sourceCaches[id].update(transform);
|
41823 | }
|
41824 | }
|
41825 | _generateCollisionBoxes() {
|
41826 | for (const id in this.sourceCaches) {
|
41827 | this._reloadSource(id);
|
41828 | }
|
41829 | }
|
41830 | _updatePlacement(transform, showCollisionBoxes, fadeDuration, crossSourceCollisions, forceFullPlacement = false) {
|
41831 | let symbolBucketsChanged = false;
|
41832 | let placementCommitted = false;
|
41833 | const layerTiles = {};
|
41834 | for (const layerID of this._order) {
|
41835 | const styleLayer = this._layers[layerID];
|
41836 | if (styleLayer.type !== 'symbol')
|
41837 | continue;
|
41838 | if (!layerTiles[styleLayer.source]) {
|
41839 | const sourceCache = this.sourceCaches[styleLayer.source];
|
41840 | layerTiles[styleLayer.source] = sourceCache.getRenderableIds(true)
|
41841 | .map((id) => sourceCache.getTileByID(id))
|
41842 | .sort((a, b) => (b.tileID.overscaledZ - a.tileID.overscaledZ) || (a.tileID.isLessThan(b.tileID) ? -1 : 1));
|
41843 | }
|
41844 | const layerBucketsChanged = this.crossTileSymbolIndex.addLayer(styleLayer, layerTiles[styleLayer.source], transform.center.lng);
|
41845 | symbolBucketsChanged = symbolBucketsChanged || layerBucketsChanged;
|
41846 | }
|
41847 | this.crossTileSymbolIndex.pruneUnusedLayers(this._order);
|
41848 | // Anything that changes our "in progress" layer and tile indices requires us
|
41849 | // to start over. When we start over, we do a full placement instead of incremental
|
41850 | // to prevent starvation.
|
41851 | // We need to restart placement to keep layer indices in sync.
|
41852 | // Also force full placement when fadeDuration === 0 to ensure that newly loaded
|
41853 | // tiles will fully display symbols in their first frame
|
41854 | forceFullPlacement = forceFullPlacement || this._layerOrderChanged || fadeDuration === 0;
|
41855 | if (forceFullPlacement || !this.pauseablePlacement || (this.pauseablePlacement.isDone() && !this.placement.stillRecent(performance.exported.now(), transform.zoom))) {
|
41856 | this.pauseablePlacement = new PauseablePlacement(transform, this._order, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions, this.placement);
|
41857 | this._layerOrderChanged = false;
|
41858 | }
|
41859 | if (this.pauseablePlacement.isDone()) {
|
41860 | // the last placement finished running, but the next one hasn’t
|
41861 | // started yet because of the `stillRecent` check immediately
|
41862 | // above, so mark it stale to ensure that we request another
|
41863 | // render frame
|
41864 | this.placement.setStale();
|
41865 | }
|
41866 | else {
|
41867 | this.pauseablePlacement.continuePlacement(this._order, this._layers, layerTiles);
|
41868 | if (this.pauseablePlacement.isDone()) {
|
41869 | this.placement = this.pauseablePlacement.commit(performance.exported.now());
|
41870 | placementCommitted = true;
|
41871 | }
|
41872 | if (symbolBucketsChanged) {
|
41873 | // since the placement gets split over multiple frames it is possible
|
41874 | // these buckets were processed before they were changed and so the
|
41875 | // placement is already stale while it is in progress
|
41876 | this.pauseablePlacement.placement.setStale();
|
41877 | }
|
41878 | }
|
41879 | if (placementCommitted || symbolBucketsChanged) {
|
41880 | for (const layerID of this._order) {
|
41881 | const styleLayer = this._layers[layerID];
|
41882 | if (styleLayer.type !== 'symbol')
|
41883 | continue;
|
41884 | this.placement.updateLayerOpacities(styleLayer, layerTiles[styleLayer.source]);
|
41885 | }
|
41886 | }
|
41887 | // needsRender is false when we have just finished a placement that didn't change the visibility of any symbols
|
41888 | const needsRerender = !this.pauseablePlacement.isDone() || this.placement.hasTransitions(performance.exported.now());
|
41889 | return needsRerender;
|
41890 | }
|
41891 | _releaseSymbolFadeTiles() {
|
41892 | for (const id in this.sourceCaches) {
|
41893 | this.sourceCaches[id].releaseSymbolFadeTiles();
|
41894 | }
|
41895 | }
|
41896 | // Callbacks from web workers
|
41897 | getImages(mapId, params, callback) {
|
41898 | this.imageManager.getImages(params.icons, callback);
|
41899 | // Apply queued image changes before setting the tile's dependencies so that the tile
|
41900 | // is not reloaded unecessarily. Without this forced update the reload could happen in cases
|
41901 | // like this one:
|
41902 | // - icons contains "my-image"
|
41903 | // - imageManager.getImages(...) triggers `onstyleimagemissing`
|
41904 | // - the user adds "my-image" within the callback
|
41905 | // - addImage adds "my-image" to this._changedImages
|
41906 | // - the next frame triggers a reload of this tile even though it already has the latest version
|
41907 | this._updateTilesForChangedImages();
|
41908 | const sourceCache = this.sourceCaches[params.source];
|
41909 | if (sourceCache) {
|
41910 | sourceCache.setDependencies(params.tileID.key, params.type, params.icons);
|
41911 | }
|
41912 | }
|
41913 | getGlyphs(mapId, params, callback) {
|
41914 | this.glyphManager.getGlyphs(params.stacks, callback);
|
41915 | }
|
41916 | getResource(mapId, params, callback) {
|
41917 | return performance.makeRequest(params, callback);
|
41918 | }
|
41919 | }
|
41920 | Style.getSourceType = getSourceType;
|
41921 | Style.setSourceType = setSourceType;
|
41922 | Style.registerForPluginStateChange = performance.registerForPluginStateChange;
|
41923 |
|
41924 | var posAttributes = performance.createLayout([
|
41925 | { name: 'a_pos', type: 'Int16', components: 2 }
|
41926 | ]);
|
41927 |
|
41928 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41929 | var preludeFrag = '#ifdef GL_ES\nprecision mediump float;\n#else\n#if !defined(lowp)\n#define lowp\n#endif\n#if !defined(mediump)\n#define mediump\n#endif\n#if !defined(highp)\n#define highp\n#endif\n#endif';
|
41930 |
|
41931 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41932 | var preludeVert = '#ifdef GL_ES\nprecision highp float;\n#else\n#if !defined(lowp)\n#define lowp\n#endif\n#if !defined(mediump)\n#define mediump\n#endif\n#if !defined(highp)\n#define highp\n#endif\n#endif\nvec2 unpack_float(const float packedValue) {int packedIntValue=int(packedValue);int v0=packedIntValue/256;return vec2(v0,packedIntValue-v0*256);}vec2 unpack_opacity(const float packedOpacity) {int intOpacity=int(packedOpacity)/2;return vec2(float(intOpacity)/127.0,mod(packedOpacity,2.0));}vec4 decode_color(const vec2 encodedColor) {return vec4(unpack_float(encodedColor[0])/255.0,unpack_float(encodedColor[1])/255.0\n);}float unpack_mix_vec2(const vec2 packedValue,const float t) {return mix(packedValue[0],packedValue[1],t);}vec4 unpack_mix_color(const vec4 packedColors,const float t) {vec4 minColor=decode_color(vec2(packedColors[0],packedColors[1]));vec4 maxColor=decode_color(vec2(packedColors[2],packedColors[3]));return mix(minColor,maxColor,t);}vec2 get_pattern_pos(const vec2 pixel_coord_upper,const vec2 pixel_coord_lower,const vec2 pattern_size,const float tile_units_to_pixels,const vec2 pos) {vec2 offset=mod(mod(mod(pixel_coord_upper,pattern_size)*256.0,pattern_size)*256.0+pixel_coord_lower,pattern_size);return (tile_units_to_pixels*pos+offset)/pattern_size;}';
|
41933 |
|
41934 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41935 | var backgroundFrag = 'uniform vec4 u_color;uniform float u_opacity;void main() {gl_FragColor=u_color*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
41936 |
|
41937 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41938 | var backgroundVert = 'attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}';
|
41939 |
|
41940 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41941 | var backgroundPatternFrag = 'uniform vec2 u_pattern_tl_a;uniform vec2 u_pattern_br_a;uniform vec2 u_pattern_tl_b;uniform vec2 u_pattern_br_b;uniform vec2 u_texsize;uniform float u_mix;uniform float u_opacity;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(u_pattern_tl_a/u_texsize,u_pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(u_pattern_tl_b/u_texsize,u_pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_mix)*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
41942 |
|
41943 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41944 | var backgroundPatternVert = 'uniform mat4 u_matrix;uniform vec2 u_pattern_size_a;uniform vec2 u_pattern_size_b;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_scale_a;uniform float u_scale_b;uniform float u_tile_units_to_pixels;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_a*u_pattern_size_a,u_tile_units_to_pixels,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_b*u_pattern_size_b,u_tile_units_to_pixels,a_pos);}';
|
41945 |
|
41946 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41947 | var circleFrag = 'varying vec3 v_data;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize mediump float radius\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize highp vec4 stroke_color\n#pragma mapbox: initialize mediump float stroke_width\n#pragma mapbox: initialize lowp float stroke_opacity\nvec2 extrude=v_data.xy;float extrude_length=length(extrude);lowp float antialiasblur=v_data.z;float antialiased_blur=-max(blur,antialiasblur);float opacity_t=smoothstep(0.0,antialiased_blur,extrude_length-1.0);float color_t=stroke_width < 0.01 ? 0.0 : smoothstep(antialiased_blur,0.0,extrude_length-radius/(radius+stroke_width));gl_FragColor=opacity_t*mix(color*opacity,stroke_color*stroke_opacity,color_t);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
41948 |
|
41949 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41950 | var circleVert = 'uniform mat4 u_matrix;uniform bool u_scale_with_map;uniform bool u_pitch_with_map;uniform vec2 u_extrude_scale;uniform lowp float u_device_pixel_ratio;uniform highp float u_camera_to_center_distance;attribute vec2 a_pos;varying vec3 v_data;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\nvoid main(void) {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize mediump float radius\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize highp vec4 stroke_color\n#pragma mapbox: initialize mediump float stroke_width\n#pragma mapbox: initialize lowp float stroke_opacity\nvec2 extrude=vec2(mod(a_pos,2.0)*2.0-1.0);vec2 circle_center=floor(a_pos*0.5);if (u_pitch_with_map) {vec2 corner_position=circle_center;if (u_scale_with_map) {corner_position+=extrude*(radius+stroke_width)*u_extrude_scale;} else {vec4 projected_center=u_matrix*vec4(circle_center,0,1);corner_position+=extrude*(radius+stroke_width)*u_extrude_scale*(projected_center.w/u_camera_to_center_distance);}gl_Position=u_matrix*vec4(corner_position,0,1);} else {gl_Position=u_matrix*vec4(circle_center,0,1);if (u_scale_with_map) {gl_Position.xy+=extrude*(radius+stroke_width)*u_extrude_scale*u_camera_to_center_distance;} else {gl_Position.xy+=extrude*(radius+stroke_width)*u_extrude_scale*gl_Position.w;}}lowp float antialiasblur=1.0/u_device_pixel_ratio/(radius+stroke_width);v_data=vec3(extrude.x,extrude.y,antialiasblur);}';
|
41951 |
|
41952 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41953 | var clippingMaskFrag = 'void main() {gl_FragColor=vec4(1.0);}';
|
41954 |
|
41955 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41956 | var clippingMaskVert = 'attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}';
|
41957 |
|
41958 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41959 | var heatmapFrag = 'uniform highp float u_intensity;varying vec2 v_extrude;\n#pragma mapbox: define highp float weight\n#define GAUSS_COEF 0.3989422804014327\nvoid main() {\n#pragma mapbox: initialize highp float weight\nfloat d=-0.5*3.0*3.0*dot(v_extrude,v_extrude);float val=weight*u_intensity*GAUSS_COEF*exp(d);gl_FragColor=vec4(val,1.0,1.0,1.0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
41960 |
|
41961 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41962 | var heatmapVert = 'uniform mat4 u_matrix;uniform float u_extrude_scale;uniform float u_opacity;uniform float u_intensity;attribute vec2 a_pos;varying vec2 v_extrude;\n#pragma mapbox: define highp float weight\n#pragma mapbox: define mediump float radius\nconst highp float ZERO=1.0/255.0/16.0;\n#define GAUSS_COEF 0.3989422804014327\nvoid main(void) {\n#pragma mapbox: initialize highp float weight\n#pragma mapbox: initialize mediump float radius\nvec2 unscaled_extrude=vec2(mod(a_pos,2.0)*2.0-1.0);float S=sqrt(-2.0*log(ZERO/weight/u_intensity/GAUSS_COEF))/3.0;v_extrude=S*unscaled_extrude;vec2 extrude=v_extrude*radius*u_extrude_scale;vec4 pos=vec4(floor(a_pos*0.5)+extrude,0,1);gl_Position=u_matrix*pos;}';
|
41963 |
|
41964 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41965 | var heatmapTextureFrag = 'uniform sampler2D u_image;uniform sampler2D u_color_ramp;uniform float u_opacity;varying vec2 v_pos;void main() {float t=texture2D(u_image,v_pos).r;vec4 color=texture2D(u_color_ramp,vec2(t,0.5));gl_FragColor=color*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(0.0);\n#endif\n}';
|
41966 |
|
41967 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41968 | var heatmapTextureVert = 'uniform mat4 u_matrix;uniform vec2 u_world;attribute vec2 a_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos*u_world,0,1);v_pos.x=a_pos.x;v_pos.y=1.0-a_pos.y;}';
|
41969 |
|
41970 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41971 | var collisionBoxFrag = 'varying float v_placed;varying float v_notUsed;void main() {float alpha=0.5;gl_FragColor=vec4(1.0,0.0,0.0,1.0)*alpha;if (v_placed > 0.5) {gl_FragColor=vec4(0.0,0.0,1.0,0.5)*alpha;}if (v_notUsed > 0.5) {gl_FragColor*=.1;}}';
|
41972 |
|
41973 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41974 | var collisionBoxVert = 'attribute vec2 a_pos;attribute vec2 a_anchor_pos;attribute vec2 a_extrude;attribute vec2 a_placed;attribute vec2 a_shift;uniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform float u_camera_to_center_distance;varying float v_placed;varying float v_notUsed;void main() {vec4 projectedPoint=u_matrix*vec4(a_anchor_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);gl_Position=u_matrix*vec4(a_pos,0.0,1.0);gl_Position.xy+=(a_extrude+a_shift)*u_extrude_scale*gl_Position.w*collision_perspective_ratio;v_placed=a_placed.x;v_notUsed=a_placed.y;}';
|
41975 |
|
41976 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41977 | var collisionCircleFrag = 'varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;void main() {float alpha=0.5*min(v_perspective_ratio,1.0);float stroke_radius=0.9*max(v_perspective_ratio,1.0);float distance_to_center=length(v_extrude);float distance_to_edge=abs(distance_to_center-v_radius);float opacity_t=smoothstep(-stroke_radius,0.0,-distance_to_edge);vec4 color=mix(vec4(0.0,0.0,1.0,0.5),vec4(1.0,0.0,0.0,1.0),v_collision);gl_FragColor=color*alpha*opacity_t;}';
|
41978 |
|
41979 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41980 | var collisionCircleVert = 'attribute vec2 a_pos;attribute float a_radius;attribute vec2 a_flags;uniform mat4 u_matrix;uniform mat4 u_inv_matrix;uniform vec2 u_viewport_size;uniform float u_camera_to_center_distance;varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;vec3 toTilePosition(vec2 screenPos) {vec4 rayStart=u_inv_matrix*vec4(screenPos,-1.0,1.0);vec4 rayEnd =u_inv_matrix*vec4(screenPos, 1.0,1.0);rayStart.xyz/=rayStart.w;rayEnd.xyz /=rayEnd.w;highp float t=(0.0-rayStart.z)/(rayEnd.z-rayStart.z);return mix(rayStart.xyz,rayEnd.xyz,t);}void main() {vec2 quadCenterPos=a_pos;float radius=a_radius;float collision=a_flags.x;float vertexIdx=a_flags.y;vec2 quadVertexOffset=vec2(mix(-1.0,1.0,float(vertexIdx >=2.0)),mix(-1.0,1.0,float(vertexIdx >=1.0 && vertexIdx <=2.0)));vec2 quadVertexExtent=quadVertexOffset*radius;vec3 tilePos=toTilePosition(quadCenterPos);vec4 clipPos=u_matrix*vec4(tilePos,1.0);highp float camera_to_anchor_distance=clipPos.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);float padding_factor=1.2;v_radius=radius;v_extrude=quadVertexExtent*padding_factor;v_perspective_ratio=collision_perspective_ratio;v_collision=collision;gl_Position=vec4(clipPos.xyz/clipPos.w,1.0)+vec4(quadVertexExtent*padding_factor/u_viewport_size*2.0,0.0,0.0);}';
|
41981 |
|
41982 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41983 | var debugFrag = 'uniform highp vec4 u_color;uniform sampler2D u_overlay;varying vec2 v_uv;void main() {vec4 overlay_color=texture2D(u_overlay,v_uv);gl_FragColor=mix(u_color,overlay_color,overlay_color.a);}';
|
41984 |
|
41985 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41986 | var debugVert = 'attribute vec2 a_pos;varying vec2 v_uv;uniform mat4 u_matrix;uniform float u_overlay_scale;void main() {v_uv=a_pos/8192.0;gl_Position=u_matrix*vec4(a_pos*u_overlay_scale,0,1);}';
|
41987 |
|
41988 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41989 | var fillFrag = '#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_FragColor=color*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
41990 |
|
41991 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41992 | var fillVert = 'attribute vec2 a_pos;uniform mat4 u_matrix;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);}';
|
41993 |
|
41994 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41995 | var fillOutlineFrag = 'varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=outline_color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
41996 |
|
41997 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
41998 | var fillOutlineVert = 'attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_world;varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}';
|
41999 |
|
42000 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42001 | var fillOutlinePatternFrag = 'uniform vec2 u_texsize;uniform sampler2D u_image;uniform float u_fade;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);float dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=mix(color1,color2,u_fade)*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42002 |
|
42003 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42004 | var fillOutlinePatternVert = 'uniform mat4 u_matrix;uniform vec2 u_world;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;gl_Position=u_matrix*vec4(a_pos,0,1);vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,a_pos);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}';
|
42005 |
|
42006 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42007 | var fillPatternFrag = '#ifdef GL_ES\nprecision highp float;\n#endif\nuniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_fade)*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42008 |
|
42009 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42010 | var fillPatternVert = 'uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileZoomRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileZoomRatio,a_pos);}';
|
42011 |
|
42012 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42013 | var fillExtrusionFrag = 'varying vec4 v_color;void main() {gl_FragColor=v_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42014 |
|
42015 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42016 | var fillExtrusionVert = 'uniform mat4 u_matrix;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;uniform float u_vertical_gradient;uniform lowp float u_opacity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec4 v_color;\n#pragma mapbox: define highp float base\n#pragma mapbox: define highp float height\n#pragma mapbox: define highp vec4 color\nvoid main() {\n#pragma mapbox: initialize highp float base\n#pragma mapbox: initialize highp float height\n#pragma mapbox: initialize highp vec4 color\nvec3 normal=a_normal_ed.xyz;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);gl_Position=u_matrix*vec4(a_pos,t > 0.0 ? height : base,1);float colorvalue=color.r*0.2126+color.g*0.7152+color.b*0.0722;v_color=vec4(0.0,0.0,0.0,1.0);vec4 ambientlight=vec4(0.03,0.03,0.03,1.0);color+=ambientlight;float directional=clamp(dot(normal/16384.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_color.r+=clamp(color.r*directional*u_lightcolor.r,mix(0.0,0.3,1.0-u_lightcolor.r),1.0);v_color.g+=clamp(color.g*directional*u_lightcolor.g,mix(0.0,0.3,1.0-u_lightcolor.g),1.0);v_color.b+=clamp(color.b*directional*u_lightcolor.b,mix(0.0,0.3,1.0-u_lightcolor.b),1.0);v_color*=u_opacity;}';
|
42017 |
|
42018 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42019 | var fillExtrusionPatternFrag = 'uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);vec4 mixedColor=mix(color1,color2,u_fade);gl_FragColor=mixedColor*v_lighting;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42020 |
|
42021 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42022 | var fillExtrusionPatternVert = 'uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_height_factor;uniform vec3 u_scale;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec3 normal=a_normal_ed.xyz;float edgedistance=a_normal_ed.w;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);float z=t > 0.0 ? height : base;gl_Position=u_matrix*vec4(a_pos,z,1);vec2 pos=normal.x==1.0 && normal.y==0.0 && normal.z==16384.0\n? a_pos\n: vec2(edgedistance,z*u_height_factor);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,pos);v_lighting=vec4(0.0,0.0,0.0,1.0);float directional=clamp(dot(normal/16383.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((0.5+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_lighting.rgb+=clamp(directional*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));v_lighting*=u_opacity;}';
|
42023 |
|
42024 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42025 | var hillshadePrepareFrag = '#ifdef GL_ES\nprecision highp float;\n#endif\nuniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_dimension;uniform float u_zoom;uniform vec4 u_unpack;float getElevation(vec2 coord,float bias) {vec4 data=texture2D(u_image,coord)*255.0;data.a=-1.0;return dot(data,u_unpack)/4.0;}void main() {vec2 epsilon=1.0/u_dimension;float a=getElevation(v_pos+vec2(-epsilon.x,-epsilon.y),0.0);float b=getElevation(v_pos+vec2(0,-epsilon.y),0.0);float c=getElevation(v_pos+vec2(epsilon.x,-epsilon.y),0.0);float d=getElevation(v_pos+vec2(-epsilon.x,0),0.0);float e=getElevation(v_pos,0.0);float f=getElevation(v_pos+vec2(epsilon.x,0),0.0);float g=getElevation(v_pos+vec2(-epsilon.x,epsilon.y),0.0);float h=getElevation(v_pos+vec2(0,epsilon.y),0.0);float i=getElevation(v_pos+vec2(epsilon.x,epsilon.y),0.0);float exaggerationFactor=u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;float exaggeration=u_zoom < 15.0 ? (u_zoom-15.0)*exaggerationFactor : 0.0;vec2 deriv=vec2((c+f+f+i)-(a+d+d+g),(g+h+h+i)-(a+b+b+c))/pow(2.0,exaggeration+(19.2562-u_zoom));gl_FragColor=clamp(vec4(deriv.x/2.0+0.5,deriv.y/2.0+0.5,1.0,1.0),0.0,1.0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42026 |
|
42027 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42028 | var hillshadePrepareVert = 'uniform mat4 u_matrix;uniform vec2 u_dimension;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);highp vec2 epsilon=1.0/u_dimension;float scale=(u_dimension.x-2.0)/u_dimension.x;v_pos=(a_texture_pos/8192.0)*scale+epsilon;}';
|
42029 |
|
42030 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42031 | var hillshadeFrag = 'uniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_latrange;uniform vec2 u_light;uniform vec4 u_shadow;uniform vec4 u_highlight;uniform vec4 u_accent;\n#define PI 3.141592653589793\nvoid main() {vec4 pixel=texture2D(u_image,v_pos);vec2 deriv=((pixel.rg*2.0)-1.0);float scaleFactor=cos(radians((u_latrange[0]-u_latrange[1])*(1.0-v_pos.y)+u_latrange[1]));float slope=atan(1.25*length(deriv)/scaleFactor);float aspect=deriv.x !=0.0 ? atan(deriv.y,-deriv.x) : PI/2.0*(deriv.y > 0.0 ? 1.0 :-1.0);float intensity=u_light.x;float azimuth=u_light.y+PI;float base=1.875-intensity*1.75;float maxValue=0.5*PI;float scaledSlope=intensity !=0.5 ? ((pow(base,slope)-1.0)/(pow(base,maxValue)-1.0))*maxValue : slope;float accent=cos(scaledSlope);vec4 accent_color=(1.0-accent)*u_accent*clamp(intensity*2.0,0.0,1.0);float shade=abs(mod((aspect+azimuth)/PI+0.5,2.0)-1.0);vec4 shade_color=mix(u_shadow,u_highlight,shade)*sin(scaledSlope)*clamp(intensity*2.0,0.0,1.0);gl_FragColor=accent_color*(1.0-shade_color.a)+shade_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42032 |
|
42033 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42034 | var hillshadeVert = 'uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=a_texture_pos/8192.0;}';
|
42035 |
|
42036 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42037 | var lineFrag = 'uniform lowp float u_device_pixel_ratio;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42038 |
|
42039 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42040 | var lineVert = '\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform vec2 u_units_to_pixels;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp float v_linesofar;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;v_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*2.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}';
|
42041 |
|
42042 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42043 | var lineGradientFrag = 'uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;varying highp vec2 v_uv;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);vec4 color=texture2D(u_image,v_uv);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42044 |
|
42045 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42046 | var lineGradientVert = '\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_uv_x;attribute float a_split_index;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_units_to_pixels;uniform float u_image_height;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp vec2 v_uv;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;highp float texel_height=1.0/u_image_height;highp float half_texel_height=0.5*texel_height;v_uv=vec2(a_uv_x,a_split_index*texel_height-half_texel_height);vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}';
|
42047 |
|
42048 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42049 | var linePatternFrag = '#ifdef GL_ES\nprecision highp float;\n#endif\nuniform lowp float u_device_pixel_ratio;uniform vec2 u_texsize;uniform float u_fade;uniform mediump vec3 u_scale;uniform sampler2D u_image;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;vec2 pattern_size_a=vec2(display_size_a.x*fromScale/tileZoomRatio,display_size_a.y);vec2 pattern_size_b=vec2(display_size_b.x*toScale/tileZoomRatio,display_size_b.y);float aspect_a=display_size_a.y/v_width;float aspect_b=display_size_b.y/v_width;float dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float x_a=mod(v_linesofar/pattern_size_a.x*aspect_a,1.0);float x_b=mod(v_linesofar/pattern_size_b.x*aspect_b,1.0);float y=0.5*v_normal.y+0.5;vec2 texel_size=1.0/u_texsize;vec2 pos_a=mix(pattern_tl_a*texel_size-texel_size,pattern_br_a*texel_size+texel_size,vec2(x_a,y));vec2 pos_b=mix(pattern_tl_b*texel_size-texel_size,pattern_br_b*texel_size+texel_size,vec2(x_b,y));vec4 color=mix(texture2D(u_image,pos_a),texture2D(u_image,pos_b),u_fade);gl_FragColor=color*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42050 |
|
42051 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42052 | var linePatternVert = '\n#define scale 0.015873016\n#define LINE_DISTANCE_SCALE 2.0\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform vec2 u_units_to_pixels;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_linesofar=a_linesofar;v_width2=vec2(outset,inset);v_width=floorwidth;}';
|
42053 |
|
42054 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42055 | var lineSDFFrag = 'uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;uniform float u_sdfgamma;uniform float u_mix;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float sdfdist_a=texture2D(u_image,v_tex_a).a;float sdfdist_b=texture2D(u_image,v_tex_b).a;float sdfdist=mix(sdfdist_a,sdfdist_b,u_mix);alpha*=smoothstep(0.5-u_sdfgamma/floorwidth,0.5+u_sdfgamma/floorwidth,sdfdist);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42056 |
|
42057 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42058 | var lineSDFVert = '\n#define scale 0.015873016\n#define LINE_DISTANCE_SCALE 2.0\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_patternscale_a;uniform float u_tex_y_a;uniform vec2 u_patternscale_b;uniform float u_tex_y_b;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_tex_a=vec2(a_linesofar*u_patternscale_a.x/floorwidth,normal.y*u_patternscale_a.y+u_tex_y_a);v_tex_b=vec2(a_linesofar*u_patternscale_b.x/floorwidth,normal.y*u_patternscale_b.y+u_tex_y_b);v_width2=vec2(outset,inset);}';
|
42059 |
|
42060 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42061 | var rasterFrag = 'uniform float u_fade_t;uniform float u_opacity;uniform sampler2D u_image0;uniform sampler2D u_image1;varying vec2 v_pos0;varying vec2 v_pos1;uniform float u_brightness_low;uniform float u_brightness_high;uniform float u_saturation_factor;uniform float u_contrast_factor;uniform vec3 u_spin_weights;void main() {vec4 color0=texture2D(u_image0,v_pos0);vec4 color1=texture2D(u_image1,v_pos1);if (color0.a > 0.0) {color0.rgb=color0.rgb/color0.a;}if (color1.a > 0.0) {color1.rgb=color1.rgb/color1.a;}vec4 color=mix(color0,color1,u_fade_t);color.a*=u_opacity;vec3 rgb=color.rgb;rgb=vec3(dot(rgb,u_spin_weights.xyz),dot(rgb,u_spin_weights.zxy),dot(rgb,u_spin_weights.yzx));float average=(color.r+color.g+color.b)/3.0;rgb+=(average-rgb)*u_saturation_factor;rgb=(rgb-0.5)*u_contrast_factor+0.5;vec3 u_high_vec=vec3(u_brightness_low,u_brightness_low,u_brightness_low);vec3 u_low_vec=vec3(u_brightness_high,u_brightness_high,u_brightness_high);gl_FragColor=vec4(mix(u_high_vec,u_low_vec,rgb)*color.a,color.a);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42062 |
|
42063 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42064 | var rasterVert = 'uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent;uniform float u_buffer_scale;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;varying vec2 v_pos1;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos0=(((a_texture_pos/8192.0)-0.5)/u_buffer_scale )+0.5;v_pos1=(v_pos0*u_scale_parent)+u_tl_parent;}';
|
42065 |
|
42066 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42067 | var symbolIconFrag = 'uniform sampler2D u_texture;varying vec2 v_tex;varying float v_fade_opacity;\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nlowp float alpha=opacity*v_fade_opacity;gl_FragColor=texture2D(u_texture,v_tex)*alpha;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42068 |
|
42069 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42070 | var symbolIconVert = 'const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform highp float u_camera_to_center_distance;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform float u_fade_change;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform vec2 u_texsize;varying vec2 v_tex;varying float v_fade_opacity;\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;vec2 a_minFontScale=a_pixeloffset.zw/256.0;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*max(a_minFontScale,fontScale)+a_pxoffset/16.0),0.0,1.0);v_tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;v_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));}';
|
42071 |
|
42072 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42073 | var symbolSDFFrag = '#define SDF_PX 8.0\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;uniform bool u_is_text;varying vec2 v_data0;varying vec3 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nfloat EDGE_GAMMA=0.105/u_device_pixel_ratio;vec2 tex=v_data0.xy;float gamma_scale=v_data1.x;float size=v_data1.y;float fade_opacity=v_data1[2];float fontScale=u_is_text ? size/24.0 : size;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42074 |
|
42075 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42076 | var symbolSDFVert = 'const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;varying vec2 v_data0;varying vec3 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale+a_pxoffset),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0=a_tex/u_texsize;v_data1=vec3(gamma_scale,size,interpolated_fade_opacity);}';
|
42077 |
|
42078 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42079 | var symbolTextAndIconFrag = '#define SDF_PX 8.0\n#define SDF 1.0\n#define ICON 0.0\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform sampler2D u_texture_icon;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;varying vec4 v_data0;varying vec4 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nfloat fade_opacity=v_data1[2];if (v_data1.w==ICON) {vec2 tex_icon=v_data0.zw;lowp float alpha=opacity*fade_opacity;gl_FragColor=texture2D(u_texture_icon,tex_icon)*alpha;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\nreturn;}vec2 tex=v_data0.xy;float EDGE_GAMMA=0.105/u_device_pixel_ratio;float gamma_scale=v_data1.x;float size=v_data1.y;float fontScale=size/24.0;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}';
|
42080 |
|
42081 | // This file is generated. Edit build/generate-shaders.ts, then run `npm run codegen`.
|
42082 | var symbolTextAndIconVert = 'const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec2 u_texsize_icon;varying vec4 v_data0;varying vec4 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);float is_sdf=a_size[0]-2.0*a_size_min;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=size/24.0;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0.xy=a_tex/u_texsize;v_data0.zw=a_tex/u_texsize_icon;v_data1=vec4(gamma_scale,size,interpolated_fade_opacity,is_sdf);}';
|
42083 |
|
42084 | var shaders = {
|
42085 | prelude: compile(preludeFrag, preludeVert),
|
42086 | background: compile(backgroundFrag, backgroundVert),
|
42087 | backgroundPattern: compile(backgroundPatternFrag, backgroundPatternVert),
|
42088 | circle: compile(circleFrag, circleVert),
|
42089 | clippingMask: compile(clippingMaskFrag, clippingMaskVert),
|
42090 | heatmap: compile(heatmapFrag, heatmapVert),
|
42091 | heatmapTexture: compile(heatmapTextureFrag, heatmapTextureVert),
|
42092 | collisionBox: compile(collisionBoxFrag, collisionBoxVert),
|
42093 | collisionCircle: compile(collisionCircleFrag, collisionCircleVert),
|
42094 | debug: compile(debugFrag, debugVert),
|
42095 | fill: compile(fillFrag, fillVert),
|
42096 | fillOutline: compile(fillOutlineFrag, fillOutlineVert),
|
42097 | fillOutlinePattern: compile(fillOutlinePatternFrag, fillOutlinePatternVert),
|
42098 | fillPattern: compile(fillPatternFrag, fillPatternVert),
|
42099 | fillExtrusion: compile(fillExtrusionFrag, fillExtrusionVert),
|
42100 | fillExtrusionPattern: compile(fillExtrusionPatternFrag, fillExtrusionPatternVert),
|
42101 | hillshadePrepare: compile(hillshadePrepareFrag, hillshadePrepareVert),
|
42102 | hillshade: compile(hillshadeFrag, hillshadeVert),
|
42103 | line: compile(lineFrag, lineVert),
|
42104 | lineGradient: compile(lineGradientFrag, lineGradientVert),
|
42105 | linePattern: compile(linePatternFrag, linePatternVert),
|
42106 | lineSDF: compile(lineSDFFrag, lineSDFVert),
|
42107 | raster: compile(rasterFrag, rasterVert),
|
42108 | symbolIcon: compile(symbolIconFrag, symbolIconVert),
|
42109 | symbolSDF: compile(symbolSDFFrag, symbolSDFVert),
|
42110 | symbolTextAndIcon: compile(symbolTextAndIconFrag, symbolTextAndIconVert)
|
42111 | };
|
42112 | // Expand #pragmas to #ifdefs.
|
42113 | function compile(fragmentSource, vertexSource) {
|
42114 | const re = /#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g;
|
42115 | const staticAttributes = vertexSource.match(/attribute ([\w]+) ([\w]+)/g);
|
42116 | const fragmentUniforms = fragmentSource.match(/uniform ([\w]+) ([\w]+)([\s]*)([\w]*)/g);
|
42117 | const vertexUniforms = vertexSource.match(/uniform ([\w]+) ([\w]+)([\s]*)([\w]*)/g);
|
42118 | const staticUniforms = vertexUniforms ? vertexUniforms.concat(fragmentUniforms) : fragmentUniforms;
|
42119 | const fragmentPragmas = {};
|
42120 | fragmentSource = fragmentSource.replace(re, (match, operation, precision, type, name) => {
|
42121 | fragmentPragmas[name] = true;
|
42122 | if (operation === 'define') {
|
42123 | return `
|
42124 | #ifndef HAS_UNIFORM_u_${name}
|
42125 | varying ${precision} ${type} ${name};
|
42126 | #else
|
42127 | uniform ${precision} ${type} u_${name};
|
42128 | #endif
|
42129 | `;
|
42130 | }
|
42131 | else /* if (operation === 'initialize') */ {
|
42132 | return `
|
42133 | #ifdef HAS_UNIFORM_u_${name}
|
42134 | ${precision} ${type} ${name} = u_${name};
|
42135 | #endif
|
42136 | `;
|
42137 | }
|
42138 | });
|
42139 | vertexSource = vertexSource.replace(re, (match, operation, precision, type, name) => {
|
42140 | const attrType = type === 'float' ? 'vec2' : 'vec4';
|
42141 | const unpackType = name.match(/color/) ? 'color' : attrType;
|
42142 | if (fragmentPragmas[name]) {
|
42143 | if (operation === 'define') {
|
42144 | return `
|
42145 | #ifndef HAS_UNIFORM_u_${name}
|
42146 | uniform lowp float u_${name}_t;
|
42147 | attribute ${precision} ${attrType} a_${name};
|
42148 | varying ${precision} ${type} ${name};
|
42149 | #else
|
42150 | uniform ${precision} ${type} u_${name};
|
42151 | #endif
|
42152 | `;
|
42153 | }
|
42154 | else /* if (operation === 'initialize') */ {
|
42155 | if (unpackType === 'vec4') {
|
42156 | // vec4 attributes are only used for cross-faded properties, and are not packed
|
42157 | return `
|
42158 | #ifndef HAS_UNIFORM_u_${name}
|
42159 | ${name} = a_${name};
|
42160 | #else
|
42161 | ${precision} ${type} ${name} = u_${name};
|
42162 | #endif
|
42163 | `;
|
42164 | }
|
42165 | else {
|
42166 | return `
|
42167 | #ifndef HAS_UNIFORM_u_${name}
|
42168 | ${name} = unpack_mix_${unpackType}(a_${name}, u_${name}_t);
|
42169 | #else
|
42170 | ${precision} ${type} ${name} = u_${name};
|
42171 | #endif
|
42172 | `;
|
42173 | }
|
42174 | }
|
42175 | }
|
42176 | else {
|
42177 | if (operation === 'define') {
|
42178 | return `
|
42179 | #ifndef HAS_UNIFORM_u_${name}
|
42180 | uniform lowp float u_${name}_t;
|
42181 | attribute ${precision} ${attrType} a_${name};
|
42182 | #else
|
42183 | uniform ${precision} ${type} u_${name};
|
42184 | #endif
|
42185 | `;
|
42186 | }
|
42187 | else /* if (operation === 'initialize') */ {
|
42188 | if (unpackType === 'vec4') {
|
42189 | // vec4 attributes are only used for cross-faded properties, and are not packed
|
42190 | return `
|
42191 | #ifndef HAS_UNIFORM_u_${name}
|
42192 | ${precision} ${type} ${name} = a_${name};
|
42193 | #else
|
42194 | ${precision} ${type} ${name} = u_${name};
|
42195 | #endif
|
42196 | `;
|
42197 | }
|
42198 | else /* */ {
|
42199 | return `
|
42200 | #ifndef HAS_UNIFORM_u_${name}
|
42201 | ${precision} ${type} ${name} = unpack_mix_${unpackType}(a_${name}, u_${name}_t);
|
42202 | #else
|
42203 | ${precision} ${type} ${name} = u_${name};
|
42204 | #endif
|
42205 | `;
|
42206 | }
|
42207 | }
|
42208 | }
|
42209 | });
|
42210 | return { fragmentSource, vertexSource, staticAttributes, staticUniforms };
|
42211 | }
|
42212 |
|
42213 | class VertexArrayObject {
|
42214 | constructor() {
|
42215 | this.boundProgram = null;
|
42216 | this.boundLayoutVertexBuffer = null;
|
42217 | this.boundPaintVertexBuffers = [];
|
42218 | this.boundIndexBuffer = null;
|
42219 | this.boundVertexOffset = null;
|
42220 | this.boundDynamicVertexBuffer = null;
|
42221 | this.vao = null;
|
42222 | }
|
42223 | bind(context, program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2) {
|
42224 | this.context = context;
|
42225 | let paintBuffersDiffer = this.boundPaintVertexBuffers.length !== paintVertexBuffers.length;
|
42226 | for (let i = 0; !paintBuffersDiffer && i < paintVertexBuffers.length; i++) {
|
42227 | if (this.boundPaintVertexBuffers[i] !== paintVertexBuffers[i]) {
|
42228 | paintBuffersDiffer = true;
|
42229 | }
|
42230 | }
|
42231 | const isFreshBindRequired = (!this.vao ||
|
42232 | this.boundProgram !== program ||
|
42233 | this.boundLayoutVertexBuffer !== layoutVertexBuffer ||
|
42234 | paintBuffersDiffer ||
|
42235 | this.boundIndexBuffer !== indexBuffer ||
|
42236 | this.boundVertexOffset !== vertexOffset ||
|
42237 | this.boundDynamicVertexBuffer !== dynamicVertexBuffer ||
|
42238 | this.boundDynamicVertexBuffer2 !== dynamicVertexBuffer2);
|
42239 | if (!context.extVertexArrayObject || isFreshBindRequired) {
|
42240 | this.freshBind(program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2);
|
42241 | }
|
42242 | else {
|
42243 | context.bindVertexArrayOES.set(this.vao);
|
42244 | if (dynamicVertexBuffer) {
|
42245 | // The buffer may have been updated. Rebind to upload data.
|
42246 | dynamicVertexBuffer.bind();
|
42247 | }
|
42248 | if (indexBuffer && indexBuffer.dynamicDraw) {
|
42249 | indexBuffer.bind();
|
42250 | }
|
42251 | if (dynamicVertexBuffer2) {
|
42252 | dynamicVertexBuffer2.bind();
|
42253 | }
|
42254 | }
|
42255 | }
|
42256 | freshBind(program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2) {
|
42257 | let numPrevAttributes;
|
42258 | const numNextAttributes = program.numAttributes;
|
42259 | const context = this.context;
|
42260 | const gl = context.gl;
|
42261 | if (context.extVertexArrayObject) {
|
42262 | if (this.vao)
|
42263 | this.destroy();
|
42264 | this.vao = context.extVertexArrayObject.createVertexArrayOES();
|
42265 | context.bindVertexArrayOES.set(this.vao);
|
42266 | numPrevAttributes = 0;
|
42267 | // store the arguments so that we can verify them when the vao is bound again
|
42268 | this.boundProgram = program;
|
42269 | this.boundLayoutVertexBuffer = layoutVertexBuffer;
|
42270 | this.boundPaintVertexBuffers = paintVertexBuffers;
|
42271 | this.boundIndexBuffer = indexBuffer;
|
42272 | this.boundVertexOffset = vertexOffset;
|
42273 | this.boundDynamicVertexBuffer = dynamicVertexBuffer;
|
42274 | this.boundDynamicVertexBuffer2 = dynamicVertexBuffer2;
|
42275 | }
|
42276 | else {
|
42277 | numPrevAttributes = context.currentNumAttributes || 0;
|
42278 | // Disable all attributes from the previous program that aren't used in
|
42279 | // the new program. Note: attribute indices are *not* program specific!
|
42280 | for (let i = numNextAttributes; i < numPrevAttributes; i++) {
|
42281 | // WebGL breaks if you disable attribute 0.
|
42282 | // http://stackoverflow.com/questions/20305231
|
42283 | performance.assert(i !== 0);
|
42284 | gl.disableVertexAttribArray(i);
|
42285 | }
|
42286 | }
|
42287 | layoutVertexBuffer.enableAttributes(gl, program);
|
42288 | for (const vertexBuffer of paintVertexBuffers) {
|
42289 | vertexBuffer.enableAttributes(gl, program);
|
42290 | }
|
42291 | if (dynamicVertexBuffer) {
|
42292 | dynamicVertexBuffer.enableAttributes(gl, program);
|
42293 | }
|
42294 | if (dynamicVertexBuffer2) {
|
42295 | dynamicVertexBuffer2.enableAttributes(gl, program);
|
42296 | }
|
42297 | layoutVertexBuffer.bind();
|
42298 | layoutVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset);
|
42299 | for (const vertexBuffer of paintVertexBuffers) {
|
42300 | vertexBuffer.bind();
|
42301 | vertexBuffer.setVertexAttribPointers(gl, program, vertexOffset);
|
42302 | }
|
42303 | if (dynamicVertexBuffer) {
|
42304 | dynamicVertexBuffer.bind();
|
42305 | dynamicVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset);
|
42306 | }
|
42307 | if (indexBuffer) {
|
42308 | indexBuffer.bind();
|
42309 | }
|
42310 | if (dynamicVertexBuffer2) {
|
42311 | dynamicVertexBuffer2.bind();
|
42312 | dynamicVertexBuffer2.setVertexAttribPointers(gl, program, vertexOffset);
|
42313 | }
|
42314 | context.currentNumAttributes = numNextAttributes;
|
42315 | }
|
42316 | destroy() {
|
42317 | if (this.vao) {
|
42318 | this.context.extVertexArrayObject.deleteVertexArrayOES(this.vao);
|
42319 | this.vao = null;
|
42320 | }
|
42321 | }
|
42322 | }
|
42323 |
|
42324 | function getTokenizedAttributesAndUniforms(array) {
|
42325 | const result = [];
|
42326 | for (let i = 0; i < array.length; i++) {
|
42327 | if (array[i] === null)
|
42328 | continue;
|
42329 | const token = array[i].split(' ');
|
42330 | result.push(token.pop());
|
42331 | }
|
42332 | return result;
|
42333 | }
|
42334 | class Program {
|
42335 | constructor(context, name, source, configuration, fixedUniforms, showOverdrawInspector) {
|
42336 | const gl = context.gl;
|
42337 | this.program = gl.createProgram();
|
42338 | const staticAttrInfo = getTokenizedAttributesAndUniforms(source.staticAttributes);
|
42339 | const dynamicAttrInfo = configuration ? configuration.getBinderAttributes() : [];
|
42340 | const allAttrInfo = staticAttrInfo.concat(dynamicAttrInfo);
|
42341 | const staticUniformsInfo = source.staticUniforms ? getTokenizedAttributesAndUniforms(source.staticUniforms) : [];
|
42342 | const dynamicUniformsInfo = configuration ? configuration.getBinderUniforms() : [];
|
42343 | // remove duplicate uniforms
|
42344 | const uniformList = staticUniformsInfo.concat(dynamicUniformsInfo);
|
42345 | const allUniformsInfo = [];
|
42346 | for (const uniform of uniformList) {
|
42347 | if (allUniformsInfo.indexOf(uniform) < 0)
|
42348 | allUniformsInfo.push(uniform);
|
42349 | }
|
42350 | const defines = configuration ? configuration.defines() : [];
|
42351 | if (showOverdrawInspector) {
|
42352 | defines.push('#define OVERDRAW_INSPECTOR;');
|
42353 | }
|
42354 | const fragmentSource = defines.concat(shaders.prelude.fragmentSource, source.fragmentSource).join('\n');
|
42355 | const vertexSource = defines.concat(shaders.prelude.vertexSource, source.vertexSource).join('\n');
|
42356 | const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
|
42357 | if (gl.isContextLost()) {
|
42358 | this.failedToCreate = true;
|
42359 | return;
|
42360 | }
|
42361 | gl.shaderSource(fragmentShader, fragmentSource);
|
42362 | gl.compileShader(fragmentShader);
|
42363 | performance.assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(fragmentShader));
|
42364 | gl.attachShader(this.program, fragmentShader);
|
42365 | const vertexShader = gl.createShader(gl.VERTEX_SHADER);
|
42366 | if (gl.isContextLost()) {
|
42367 | this.failedToCreate = true;
|
42368 | return;
|
42369 | }
|
42370 | gl.shaderSource(vertexShader, vertexSource);
|
42371 | gl.compileShader(vertexShader);
|
42372 | performance.assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(vertexShader));
|
42373 | gl.attachShader(this.program, vertexShader);
|
42374 | this.attributes = {};
|
42375 | const uniformLocations = {};
|
42376 | this.numAttributes = allAttrInfo.length;
|
42377 | for (let i = 0; i < this.numAttributes; i++) {
|
42378 | if (allAttrInfo[i]) {
|
42379 | gl.bindAttribLocation(this.program, i, allAttrInfo[i]);
|
42380 | this.attributes[allAttrInfo[i]] = i;
|
42381 | }
|
42382 | }
|
42383 | gl.linkProgram(this.program);
|
42384 | performance.assert(gl.getProgramParameter(this.program, gl.LINK_STATUS), gl.getProgramInfoLog(this.program));
|
42385 | gl.deleteShader(vertexShader);
|
42386 | gl.deleteShader(fragmentShader);
|
42387 | for (let it = 0; it < allUniformsInfo.length; it++) {
|
42388 | const uniform = allUniformsInfo[it];
|
42389 | if (uniform && !uniformLocations[uniform]) {
|
42390 | const uniformLocation = gl.getUniformLocation(this.program, uniform);
|
42391 | if (uniformLocation) {
|
42392 | uniformLocations[uniform] = uniformLocation;
|
42393 | }
|
42394 | }
|
42395 | }
|
42396 | this.fixedUniforms = fixedUniforms(context, uniformLocations);
|
42397 | this.binderUniforms = configuration ? configuration.getUniforms(context, uniformLocations) : [];
|
42398 | }
|
42399 | draw(context, drawMode, depthMode, stencilMode, colorMode, cullFaceMode, uniformValues, layerID, layoutVertexBuffer, indexBuffer, segments, currentProperties, zoom, configuration, dynamicLayoutBuffer, dynamicLayoutBuffer2) {
|
42400 | const gl = context.gl;
|
42401 | if (this.failedToCreate)
|
42402 | return;
|
42403 | context.program.set(this.program);
|
42404 | context.setDepthMode(depthMode);
|
42405 | context.setStencilMode(stencilMode);
|
42406 | context.setColorMode(colorMode);
|
42407 | context.setCullFace(cullFaceMode);
|
42408 | for (const name in this.fixedUniforms) {
|
42409 | this.fixedUniforms[name].set(uniformValues[name]);
|
42410 | }
|
42411 | if (configuration) {
|
42412 | configuration.setUniforms(context, this.binderUniforms, currentProperties, { zoom: zoom });
|
42413 | }
|
42414 | const primitiveSize = {
|
42415 | [gl.LINES]: 2,
|
42416 | [gl.TRIANGLES]: 3,
|
42417 | [gl.LINE_STRIP]: 1
|
42418 | }[drawMode];
|
42419 | for (const segment of segments.get()) {
|
42420 | const vaos = segment.vaos || (segment.vaos = {});
|
42421 | const vao = vaos[layerID] || (vaos[layerID] = new VertexArrayObject());
|
42422 | vao.bind(context, this, layoutVertexBuffer, configuration ? configuration.getPaintVertexBuffers() : [], indexBuffer, segment.vertexOffset, dynamicLayoutBuffer, dynamicLayoutBuffer2);
|
42423 | gl.drawElements(drawMode, segment.primitiveLength * primitiveSize, gl.UNSIGNED_SHORT, segment.primitiveOffset * primitiveSize * 2);
|
42424 | }
|
42425 | }
|
42426 | }
|
42427 |
|
42428 | function patternUniformValues(crossfade, painter, tile) {
|
42429 | const tileRatio = 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom);
|
42430 | const numTiles = Math.pow(2, tile.tileID.overscaledZ);
|
42431 | const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles;
|
42432 | const pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles);
|
42433 | const pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y;
|
42434 | return {
|
42435 | 'u_image': 0,
|
42436 | 'u_texsize': tile.imageAtlasTexture.size,
|
42437 | 'u_scale': [tileRatio, crossfade.fromScale, crossfade.toScale],
|
42438 | 'u_fade': crossfade.t,
|
42439 | // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.
|
42440 | 'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16],
|
42441 | 'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF]
|
42442 | };
|
42443 | }
|
42444 | function bgPatternUniformValues(image, crossfade, painter, tile) {
|
42445 | const imagePosA = painter.imageManager.getPattern(image.from.toString());
|
42446 | const imagePosB = painter.imageManager.getPattern(image.to.toString());
|
42447 | performance.assert(imagePosA && imagePosB);
|
42448 | const { width, height } = painter.imageManager.getPixelSize();
|
42449 | const numTiles = Math.pow(2, tile.tileID.overscaledZ);
|
42450 | const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles;
|
42451 | const pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles);
|
42452 | const pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y;
|
42453 | return {
|
42454 | 'u_image': 0,
|
42455 | 'u_pattern_tl_a': imagePosA.tl,
|
42456 | 'u_pattern_br_a': imagePosA.br,
|
42457 | 'u_pattern_tl_b': imagePosB.tl,
|
42458 | 'u_pattern_br_b': imagePosB.br,
|
42459 | 'u_texsize': [width, height],
|
42460 | 'u_mix': crossfade.t,
|
42461 | 'u_pattern_size_a': imagePosA.displaySize,
|
42462 | 'u_pattern_size_b': imagePosB.displaySize,
|
42463 | 'u_scale_a': crossfade.fromScale,
|
42464 | 'u_scale_b': crossfade.toScale,
|
42465 | 'u_tile_units_to_pixels': 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom),
|
42466 | // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.
|
42467 | 'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16],
|
42468 | 'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF]
|
42469 | };
|
42470 | }
|
42471 |
|
42472 | const fillExtrusionUniforms = (context, locations) => ({
|
42473 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42474 | 'u_lightpos': new performance.Uniform3f(context, locations.u_lightpos),
|
42475 | 'u_lightintensity': new performance.Uniform1f(context, locations.u_lightintensity),
|
42476 | 'u_lightcolor': new performance.Uniform3f(context, locations.u_lightcolor),
|
42477 | 'u_vertical_gradient': new performance.Uniform1f(context, locations.u_vertical_gradient),
|
42478 | 'u_opacity': new performance.Uniform1f(context, locations.u_opacity)
|
42479 | });
|
42480 | const fillExtrusionPatternUniforms = (context, locations) => ({
|
42481 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42482 | 'u_lightpos': new performance.Uniform3f(context, locations.u_lightpos),
|
42483 | 'u_lightintensity': new performance.Uniform1f(context, locations.u_lightintensity),
|
42484 | 'u_lightcolor': new performance.Uniform3f(context, locations.u_lightcolor),
|
42485 | 'u_vertical_gradient': new performance.Uniform1f(context, locations.u_vertical_gradient),
|
42486 | 'u_height_factor': new performance.Uniform1f(context, locations.u_height_factor),
|
42487 | // pattern uniforms
|
42488 | 'u_image': new performance.Uniform1i(context, locations.u_image),
|
42489 | 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
|
42490 | 'u_pixel_coord_upper': new performance.Uniform2f(context, locations.u_pixel_coord_upper),
|
42491 | 'u_pixel_coord_lower': new performance.Uniform2f(context, locations.u_pixel_coord_lower),
|
42492 | 'u_scale': new performance.Uniform3f(context, locations.u_scale),
|
42493 | 'u_fade': new performance.Uniform1f(context, locations.u_fade),
|
42494 | 'u_opacity': new performance.Uniform1f(context, locations.u_opacity)
|
42495 | });
|
42496 | const fillExtrusionUniformValues = (matrix, painter, shouldUseVerticalGradient, opacity) => {
|
42497 | const light = painter.style.light;
|
42498 | const _lp = light.properties.get('position');
|
42499 | const lightPos = [_lp.x, _lp.y, _lp.z];
|
42500 | const lightMat = performance.create$1();
|
42501 | if (light.properties.get('anchor') === 'viewport') {
|
42502 | performance.fromRotation(lightMat, -painter.transform.angle);
|
42503 | }
|
42504 | performance.transformMat3(lightPos, lightPos, lightMat);
|
42505 | const lightColor = light.properties.get('color');
|
42506 | return {
|
42507 | 'u_matrix': matrix,
|
42508 | 'u_lightpos': lightPos,
|
42509 | 'u_lightintensity': light.properties.get('intensity'),
|
42510 | 'u_lightcolor': [lightColor.r, lightColor.g, lightColor.b],
|
42511 | 'u_vertical_gradient': +shouldUseVerticalGradient,
|
42512 | 'u_opacity': opacity
|
42513 | };
|
42514 | };
|
42515 | const fillExtrusionPatternUniformValues = (matrix, painter, shouldUseVerticalGradient, opacity, coord, crossfade, tile) => {
|
42516 | return performance.extend(fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity), patternUniformValues(crossfade, painter, tile), {
|
42517 | 'u_height_factor': -Math.pow(2, coord.overscaledZ) / tile.tileSize / 8
|
42518 | });
|
42519 | };
|
42520 |
|
42521 | const fillUniforms = (context, locations) => ({
|
42522 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix)
|
42523 | });
|
42524 | const fillPatternUniforms = (context, locations) => ({
|
42525 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42526 | 'u_image': new performance.Uniform1i(context, locations.u_image),
|
42527 | 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
|
42528 | 'u_pixel_coord_upper': new performance.Uniform2f(context, locations.u_pixel_coord_upper),
|
42529 | 'u_pixel_coord_lower': new performance.Uniform2f(context, locations.u_pixel_coord_lower),
|
42530 | 'u_scale': new performance.Uniform3f(context, locations.u_scale),
|
42531 | 'u_fade': new performance.Uniform1f(context, locations.u_fade)
|
42532 | });
|
42533 | const fillOutlineUniforms = (context, locations) => ({
|
42534 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42535 | 'u_world': new performance.Uniform2f(context, locations.u_world)
|
42536 | });
|
42537 | const fillOutlinePatternUniforms = (context, locations) => ({
|
42538 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42539 | 'u_world': new performance.Uniform2f(context, locations.u_world),
|
42540 | 'u_image': new performance.Uniform1i(context, locations.u_image),
|
42541 | 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
|
42542 | 'u_pixel_coord_upper': new performance.Uniform2f(context, locations.u_pixel_coord_upper),
|
42543 | 'u_pixel_coord_lower': new performance.Uniform2f(context, locations.u_pixel_coord_lower),
|
42544 | 'u_scale': new performance.Uniform3f(context, locations.u_scale),
|
42545 | 'u_fade': new performance.Uniform1f(context, locations.u_fade)
|
42546 | });
|
42547 | const fillUniformValues = (matrix) => ({
|
42548 | 'u_matrix': matrix
|
42549 | });
|
42550 | const fillPatternUniformValues = (matrix, painter, crossfade, tile) => performance.extend(fillUniformValues(matrix), patternUniformValues(crossfade, painter, tile));
|
42551 | const fillOutlineUniformValues = (matrix, drawingBufferSize) => ({
|
42552 | 'u_matrix': matrix,
|
42553 | 'u_world': drawingBufferSize
|
42554 | });
|
42555 | const fillOutlinePatternUniformValues = (matrix, painter, crossfade, tile, drawingBufferSize) => performance.extend(fillPatternUniformValues(matrix, painter, crossfade, tile), {
|
42556 | 'u_world': drawingBufferSize
|
42557 | });
|
42558 |
|
42559 | const circleUniforms = (context, locations) => ({
|
42560 | 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance),
|
42561 | 'u_scale_with_map': new performance.Uniform1i(context, locations.u_scale_with_map),
|
42562 | 'u_pitch_with_map': new performance.Uniform1i(context, locations.u_pitch_with_map),
|
42563 | 'u_extrude_scale': new performance.Uniform2f(context, locations.u_extrude_scale),
|
42564 | 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
|
42565 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix)
|
42566 | });
|
42567 | const circleUniformValues = (painter, coord, tile, layer) => {
|
42568 | const transform = painter.transform;
|
42569 | let pitchWithMap, extrudeScale;
|
42570 | if (layer.paint.get('circle-pitch-alignment') === 'map') {
|
42571 | const pixelRatio = pixelsToTileUnits(tile, 1, transform.zoom);
|
42572 | pitchWithMap = true;
|
42573 | extrudeScale = [pixelRatio, pixelRatio];
|
42574 | }
|
42575 | else {
|
42576 | pitchWithMap = false;
|
42577 | extrudeScale = transform.pixelsToGLUnits;
|
42578 | }
|
42579 | return {
|
42580 | 'u_camera_to_center_distance': transform.cameraToCenterDistance,
|
42581 | 'u_scale_with_map': +(layer.paint.get('circle-pitch-scale') === 'map'),
|
42582 | 'u_matrix': painter.translatePosMatrix(coord.posMatrix, tile, layer.paint.get('circle-translate'), layer.paint.get('circle-translate-anchor')),
|
42583 | 'u_pitch_with_map': +(pitchWithMap),
|
42584 | 'u_device_pixel_ratio': painter.pixelRatio,
|
42585 | 'u_extrude_scale': extrudeScale
|
42586 | };
|
42587 | };
|
42588 |
|
42589 | const collisionUniforms = (context, locations) => ({
|
42590 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42591 | 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance),
|
42592 | 'u_pixels_to_tile_units': new performance.Uniform1f(context, locations.u_pixels_to_tile_units),
|
42593 | 'u_extrude_scale': new performance.Uniform2f(context, locations.u_extrude_scale),
|
42594 | 'u_overscale_factor': new performance.Uniform1f(context, locations.u_overscale_factor)
|
42595 | });
|
42596 | const collisionCircleUniforms = (context, locations) => ({
|
42597 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42598 | 'u_inv_matrix': new performance.UniformMatrix4f(context, locations.u_inv_matrix),
|
42599 | 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance),
|
42600 | 'u_viewport_size': new performance.Uniform2f(context, locations.u_viewport_size)
|
42601 | });
|
42602 | const collisionUniformValues = (matrix, transform, tile) => {
|
42603 | const pixelRatio = pixelsToTileUnits(tile, 1, transform.zoom);
|
42604 | const scale = Math.pow(2, transform.zoom - tile.tileID.overscaledZ);
|
42605 | const overscaleFactor = tile.tileID.overscaleFactor();
|
42606 | return {
|
42607 | 'u_matrix': matrix,
|
42608 | 'u_camera_to_center_distance': transform.cameraToCenterDistance,
|
42609 | 'u_pixels_to_tile_units': pixelRatio,
|
42610 | 'u_extrude_scale': [transform.pixelsToGLUnits[0] / (pixelRatio * scale),
|
42611 | transform.pixelsToGLUnits[1] / (pixelRatio * scale)],
|
42612 | 'u_overscale_factor': overscaleFactor
|
42613 | };
|
42614 | };
|
42615 | const collisionCircleUniformValues = (matrix, invMatrix, transform) => {
|
42616 | return {
|
42617 | 'u_matrix': matrix,
|
42618 | 'u_inv_matrix': invMatrix,
|
42619 | 'u_camera_to_center_distance': transform.cameraToCenterDistance,
|
42620 | 'u_viewport_size': [transform.width, transform.height]
|
42621 | };
|
42622 | };
|
42623 |
|
42624 | const debugUniforms = (context, locations) => ({
|
42625 | 'u_color': new performance.UniformColor(context, locations.u_color),
|
42626 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42627 | 'u_overlay': new performance.Uniform1i(context, locations.u_overlay),
|
42628 | 'u_overlay_scale': new performance.Uniform1f(context, locations.u_overlay_scale)
|
42629 | });
|
42630 | const debugUniformValues = (matrix, color, scaleRatio = 1) => ({
|
42631 | 'u_matrix': matrix,
|
42632 | 'u_color': color,
|
42633 | 'u_overlay': 0,
|
42634 | 'u_overlay_scale': scaleRatio
|
42635 | });
|
42636 |
|
42637 | const clippingMaskUniforms = (context, locations) => ({
|
42638 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix)
|
42639 | });
|
42640 | const clippingMaskUniformValues = (matrix) => ({
|
42641 | 'u_matrix': matrix
|
42642 | });
|
42643 |
|
42644 | const heatmapUniforms = (context, locations) => ({
|
42645 | 'u_extrude_scale': new performance.Uniform1f(context, locations.u_extrude_scale),
|
42646 | 'u_intensity': new performance.Uniform1f(context, locations.u_intensity),
|
42647 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix)
|
42648 | });
|
42649 | const heatmapTextureUniforms = (context, locations) => ({
|
42650 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42651 | 'u_world': new performance.Uniform2f(context, locations.u_world),
|
42652 | 'u_image': new performance.Uniform1i(context, locations.u_image),
|
42653 | 'u_color_ramp': new performance.Uniform1i(context, locations.u_color_ramp),
|
42654 | 'u_opacity': new performance.Uniform1f(context, locations.u_opacity)
|
42655 | });
|
42656 | const heatmapUniformValues = (matrix, tile, zoom, intensity) => ({
|
42657 | 'u_matrix': matrix,
|
42658 | 'u_extrude_scale': pixelsToTileUnits(tile, 1, zoom),
|
42659 | 'u_intensity': intensity
|
42660 | });
|
42661 | const heatmapTextureUniformValues = (painter, layer, textureUnit, colorRampUnit) => {
|
42662 | const matrix = performance.create();
|
42663 | performance.ortho(matrix, 0, painter.width, painter.height, 0, 0, 1);
|
42664 | const gl = painter.context.gl;
|
42665 | return {
|
42666 | 'u_matrix': matrix,
|
42667 | 'u_world': [gl.drawingBufferWidth, gl.drawingBufferHeight],
|
42668 | 'u_image': textureUnit,
|
42669 | 'u_color_ramp': colorRampUnit,
|
42670 | 'u_opacity': layer.paint.get('heatmap-opacity')
|
42671 | };
|
42672 | };
|
42673 |
|
42674 | const hillshadeUniforms = (context, locations) => ({
|
42675 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42676 | 'u_image': new performance.Uniform1i(context, locations.u_image),
|
42677 | 'u_latrange': new performance.Uniform2f(context, locations.u_latrange),
|
42678 | 'u_light': new performance.Uniform2f(context, locations.u_light),
|
42679 | 'u_shadow': new performance.UniformColor(context, locations.u_shadow),
|
42680 | 'u_highlight': new performance.UniformColor(context, locations.u_highlight),
|
42681 | 'u_accent': new performance.UniformColor(context, locations.u_accent)
|
42682 | });
|
42683 | const hillshadePrepareUniforms = (context, locations) => ({
|
42684 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42685 | 'u_image': new performance.Uniform1i(context, locations.u_image),
|
42686 | 'u_dimension': new performance.Uniform2f(context, locations.u_dimension),
|
42687 | 'u_zoom': new performance.Uniform1f(context, locations.u_zoom),
|
42688 | 'u_unpack': new performance.Uniform4f(context, locations.u_unpack)
|
42689 | });
|
42690 | const hillshadeUniformValues = (painter, tile, layer) => {
|
42691 | const shadow = layer.paint.get('hillshade-shadow-color');
|
42692 | const highlight = layer.paint.get('hillshade-highlight-color');
|
42693 | const accent = layer.paint.get('hillshade-accent-color');
|
42694 | let azimuthal = layer.paint.get('hillshade-illumination-direction') * (Math.PI / 180);
|
42695 | // modify azimuthal angle by map rotation if light is anchored at the viewport
|
42696 | if (layer.paint.get('hillshade-illumination-anchor') === 'viewport') {
|
42697 | azimuthal -= painter.transform.angle;
|
42698 | }
|
42699 | const align = !painter.options.moving;
|
42700 | return {
|
42701 | 'u_matrix': painter.transform.calculatePosMatrix(tile.tileID.toUnwrapped(), align),
|
42702 | 'u_image': 0,
|
42703 | 'u_latrange': getTileLatRange(painter, tile.tileID),
|
42704 | 'u_light': [layer.paint.get('hillshade-exaggeration'), azimuthal],
|
42705 | 'u_shadow': shadow,
|
42706 | 'u_highlight': highlight,
|
42707 | 'u_accent': accent
|
42708 | };
|
42709 | };
|
42710 | const hillshadeUniformPrepareValues = (tileID, dem) => {
|
42711 | const stride = dem.stride;
|
42712 | const matrix = performance.create();
|
42713 | // Flip rendering at y axis.
|
42714 | performance.ortho(matrix, 0, performance.EXTENT, -performance.EXTENT, 0, 0, 1);
|
42715 | performance.translate(matrix, matrix, [0, -performance.EXTENT, 0]);
|
42716 | return {
|
42717 | 'u_matrix': matrix,
|
42718 | 'u_image': 1,
|
42719 | 'u_dimension': [stride, stride],
|
42720 | 'u_zoom': tileID.overscaledZ,
|
42721 | 'u_unpack': dem.getUnpackVector()
|
42722 | };
|
42723 | };
|
42724 | function getTileLatRange(painter, tileID) {
|
42725 | // for scaling the magnitude of a points slope by its latitude
|
42726 | const tilesAtZoom = Math.pow(2, tileID.canonical.z);
|
42727 | const y = tileID.canonical.y;
|
42728 | return [
|
42729 | new performance.MercatorCoordinate(0, y / tilesAtZoom).toLngLat().lat,
|
42730 | new performance.MercatorCoordinate(0, (y + 1) / tilesAtZoom).toLngLat().lat
|
42731 | ];
|
42732 | }
|
42733 |
|
42734 | const lineUniforms = (context, locations) => ({
|
42735 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42736 | 'u_ratio': new performance.Uniform1f(context, locations.u_ratio),
|
42737 | 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
|
42738 | 'u_units_to_pixels': new performance.Uniform2f(context, locations.u_units_to_pixels)
|
42739 | });
|
42740 | const lineGradientUniforms = (context, locations) => ({
|
42741 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42742 | 'u_ratio': new performance.Uniform1f(context, locations.u_ratio),
|
42743 | 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
|
42744 | 'u_units_to_pixels': new performance.Uniform2f(context, locations.u_units_to_pixels),
|
42745 | 'u_image': new performance.Uniform1i(context, locations.u_image),
|
42746 | 'u_image_height': new performance.Uniform1f(context, locations.u_image_height)
|
42747 | });
|
42748 | const linePatternUniforms = (context, locations) => ({
|
42749 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42750 | 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
|
42751 | 'u_ratio': new performance.Uniform1f(context, locations.u_ratio),
|
42752 | 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
|
42753 | 'u_image': new performance.Uniform1i(context, locations.u_image),
|
42754 | 'u_units_to_pixels': new performance.Uniform2f(context, locations.u_units_to_pixels),
|
42755 | 'u_scale': new performance.Uniform3f(context, locations.u_scale),
|
42756 | 'u_fade': new performance.Uniform1f(context, locations.u_fade)
|
42757 | });
|
42758 | const lineSDFUniforms = (context, locations) => ({
|
42759 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42760 | 'u_ratio': new performance.Uniform1f(context, locations.u_ratio),
|
42761 | 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
|
42762 | 'u_units_to_pixels': new performance.Uniform2f(context, locations.u_units_to_pixels),
|
42763 | 'u_patternscale_a': new performance.Uniform2f(context, locations.u_patternscale_a),
|
42764 | 'u_patternscale_b': new performance.Uniform2f(context, locations.u_patternscale_b),
|
42765 | 'u_sdfgamma': new performance.Uniform1f(context, locations.u_sdfgamma),
|
42766 | 'u_image': new performance.Uniform1i(context, locations.u_image),
|
42767 | 'u_tex_y_a': new performance.Uniform1f(context, locations.u_tex_y_a),
|
42768 | 'u_tex_y_b': new performance.Uniform1f(context, locations.u_tex_y_b),
|
42769 | 'u_mix': new performance.Uniform1f(context, locations.u_mix)
|
42770 | });
|
42771 | const lineUniformValues = (painter, tile, layer) => {
|
42772 | const transform = painter.transform;
|
42773 | return {
|
42774 | 'u_matrix': calculateMatrix(painter, tile, layer),
|
42775 | 'u_ratio': 1 / pixelsToTileUnits(tile, 1, transform.zoom),
|
42776 | 'u_device_pixel_ratio': painter.pixelRatio,
|
42777 | 'u_units_to_pixels': [
|
42778 | 1 / transform.pixelsToGLUnits[0],
|
42779 | 1 / transform.pixelsToGLUnits[1]
|
42780 | ]
|
42781 | };
|
42782 | };
|
42783 | const lineGradientUniformValues = (painter, tile, layer, imageHeight) => {
|
42784 | return performance.extend(lineUniformValues(painter, tile, layer), {
|
42785 | 'u_image': 0,
|
42786 | 'u_image_height': imageHeight,
|
42787 | });
|
42788 | };
|
42789 | const linePatternUniformValues = (painter, tile, layer, crossfade) => {
|
42790 | const transform = painter.transform;
|
42791 | const tileZoomRatio = calculateTileRatio(tile, transform);
|
42792 | return {
|
42793 | 'u_matrix': calculateMatrix(painter, tile, layer),
|
42794 | 'u_texsize': tile.imageAtlasTexture.size,
|
42795 | // camera zoom ratio
|
42796 | 'u_ratio': 1 / pixelsToTileUnits(tile, 1, transform.zoom),
|
42797 | 'u_device_pixel_ratio': painter.pixelRatio,
|
42798 | 'u_image': 0,
|
42799 | 'u_scale': [tileZoomRatio, crossfade.fromScale, crossfade.toScale],
|
42800 | 'u_fade': crossfade.t,
|
42801 | 'u_units_to_pixels': [
|
42802 | 1 / transform.pixelsToGLUnits[0],
|
42803 | 1 / transform.pixelsToGLUnits[1]
|
42804 | ]
|
42805 | };
|
42806 | };
|
42807 | const lineSDFUniformValues = (painter, tile, layer, dasharray, crossfade) => {
|
42808 | const transform = painter.transform;
|
42809 | const lineAtlas = painter.lineAtlas;
|
42810 | const tileRatio = calculateTileRatio(tile, transform);
|
42811 | const round = layer.layout.get('line-cap') === 'round';
|
42812 | const posA = lineAtlas.getDash(dasharray.from, round);
|
42813 | const posB = lineAtlas.getDash(dasharray.to, round);
|
42814 | const widthA = posA.width * crossfade.fromScale;
|
42815 | const widthB = posB.width * crossfade.toScale;
|
42816 | return performance.extend(lineUniformValues(painter, tile, layer), {
|
42817 | 'u_patternscale_a': [tileRatio / widthA, -posA.height / 2],
|
42818 | 'u_patternscale_b': [tileRatio / widthB, -posB.height / 2],
|
42819 | 'u_sdfgamma': lineAtlas.width / (Math.min(widthA, widthB) * 256 * painter.pixelRatio) / 2,
|
42820 | 'u_image': 0,
|
42821 | 'u_tex_y_a': posA.y,
|
42822 | 'u_tex_y_b': posB.y,
|
42823 | 'u_mix': crossfade.t
|
42824 | });
|
42825 | };
|
42826 | function calculateTileRatio(tile, transform) {
|
42827 | return 1 / pixelsToTileUnits(tile, 1, transform.tileZoom);
|
42828 | }
|
42829 | function calculateMatrix(painter, tile, layer) {
|
42830 | return painter.translatePosMatrix(tile.tileID.posMatrix, tile, layer.paint.get('line-translate'), layer.paint.get('line-translate-anchor'));
|
42831 | }
|
42832 |
|
42833 | const rasterUniforms = (context, locations) => ({
|
42834 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42835 | 'u_tl_parent': new performance.Uniform2f(context, locations.u_tl_parent),
|
42836 | 'u_scale_parent': new performance.Uniform1f(context, locations.u_scale_parent),
|
42837 | 'u_buffer_scale': new performance.Uniform1f(context, locations.u_buffer_scale),
|
42838 | 'u_fade_t': new performance.Uniform1f(context, locations.u_fade_t),
|
42839 | 'u_opacity': new performance.Uniform1f(context, locations.u_opacity),
|
42840 | 'u_image0': new performance.Uniform1i(context, locations.u_image0),
|
42841 | 'u_image1': new performance.Uniform1i(context, locations.u_image1),
|
42842 | 'u_brightness_low': new performance.Uniform1f(context, locations.u_brightness_low),
|
42843 | 'u_brightness_high': new performance.Uniform1f(context, locations.u_brightness_high),
|
42844 | 'u_saturation_factor': new performance.Uniform1f(context, locations.u_saturation_factor),
|
42845 | 'u_contrast_factor': new performance.Uniform1f(context, locations.u_contrast_factor),
|
42846 | 'u_spin_weights': new performance.Uniform3f(context, locations.u_spin_weights)
|
42847 | });
|
42848 | const rasterUniformValues = (matrix, parentTL, parentScaleBy, fade, layer) => ({
|
42849 | 'u_matrix': matrix,
|
42850 | 'u_tl_parent': parentTL,
|
42851 | 'u_scale_parent': parentScaleBy,
|
42852 | 'u_buffer_scale': 1,
|
42853 | 'u_fade_t': fade.mix,
|
42854 | 'u_opacity': fade.opacity * layer.paint.get('raster-opacity'),
|
42855 | 'u_image0': 0,
|
42856 | 'u_image1': 1,
|
42857 | 'u_brightness_low': layer.paint.get('raster-brightness-min'),
|
42858 | 'u_brightness_high': layer.paint.get('raster-brightness-max'),
|
42859 | 'u_saturation_factor': saturationFactor(layer.paint.get('raster-saturation')),
|
42860 | 'u_contrast_factor': contrastFactor(layer.paint.get('raster-contrast')),
|
42861 | 'u_spin_weights': spinWeights(layer.paint.get('raster-hue-rotate'))
|
42862 | });
|
42863 | function spinWeights(angle) {
|
42864 | angle *= Math.PI / 180;
|
42865 | const s = Math.sin(angle);
|
42866 | const c = Math.cos(angle);
|
42867 | return [
|
42868 | (2 * c + 1) / 3,
|
42869 | (-Math.sqrt(3) * s - c + 1) / 3,
|
42870 | (Math.sqrt(3) * s - c + 1) / 3
|
42871 | ];
|
42872 | }
|
42873 | function contrastFactor(contrast) {
|
42874 | return contrast > 0 ?
|
42875 | 1 / (1 - contrast) :
|
42876 | 1 + contrast;
|
42877 | }
|
42878 | function saturationFactor(saturation) {
|
42879 | return saturation > 0 ?
|
42880 | 1 - 1 / (1.001 - saturation) :
|
42881 | -saturation;
|
42882 | }
|
42883 |
|
42884 | const symbolIconUniforms = (context, locations) => ({
|
42885 | 'u_is_size_zoom_constant': new performance.Uniform1i(context, locations.u_is_size_zoom_constant),
|
42886 | 'u_is_size_feature_constant': new performance.Uniform1i(context, locations.u_is_size_feature_constant),
|
42887 | 'u_size_t': new performance.Uniform1f(context, locations.u_size_t),
|
42888 | 'u_size': new performance.Uniform1f(context, locations.u_size),
|
42889 | 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance),
|
42890 | 'u_pitch': new performance.Uniform1f(context, locations.u_pitch),
|
42891 | 'u_rotate_symbol': new performance.Uniform1i(context, locations.u_rotate_symbol),
|
42892 | 'u_aspect_ratio': new performance.Uniform1f(context, locations.u_aspect_ratio),
|
42893 | 'u_fade_change': new performance.Uniform1f(context, locations.u_fade_change),
|
42894 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42895 | 'u_label_plane_matrix': new performance.UniformMatrix4f(context, locations.u_label_plane_matrix),
|
42896 | 'u_coord_matrix': new performance.UniformMatrix4f(context, locations.u_coord_matrix),
|
42897 | 'u_is_text': new performance.Uniform1i(context, locations.u_is_text),
|
42898 | 'u_pitch_with_map': new performance.Uniform1i(context, locations.u_pitch_with_map),
|
42899 | 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
|
42900 | 'u_texture': new performance.Uniform1i(context, locations.u_texture)
|
42901 | });
|
42902 | const symbolSDFUniforms = (context, locations) => ({
|
42903 | 'u_is_size_zoom_constant': new performance.Uniform1i(context, locations.u_is_size_zoom_constant),
|
42904 | 'u_is_size_feature_constant': new performance.Uniform1i(context, locations.u_is_size_feature_constant),
|
42905 | 'u_size_t': new performance.Uniform1f(context, locations.u_size_t),
|
42906 | 'u_size': new performance.Uniform1f(context, locations.u_size),
|
42907 | 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance),
|
42908 | 'u_pitch': new performance.Uniform1f(context, locations.u_pitch),
|
42909 | 'u_rotate_symbol': new performance.Uniform1i(context, locations.u_rotate_symbol),
|
42910 | 'u_aspect_ratio': new performance.Uniform1f(context, locations.u_aspect_ratio),
|
42911 | 'u_fade_change': new performance.Uniform1f(context, locations.u_fade_change),
|
42912 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42913 | 'u_label_plane_matrix': new performance.UniformMatrix4f(context, locations.u_label_plane_matrix),
|
42914 | 'u_coord_matrix': new performance.UniformMatrix4f(context, locations.u_coord_matrix),
|
42915 | 'u_is_text': new performance.Uniform1i(context, locations.u_is_text),
|
42916 | 'u_pitch_with_map': new performance.Uniform1i(context, locations.u_pitch_with_map),
|
42917 | 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
|
42918 | 'u_texture': new performance.Uniform1i(context, locations.u_texture),
|
42919 | 'u_gamma_scale': new performance.Uniform1f(context, locations.u_gamma_scale),
|
42920 | 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
|
42921 | 'u_is_halo': new performance.Uniform1i(context, locations.u_is_halo)
|
42922 | });
|
42923 | const symbolTextAndIconUniforms = (context, locations) => ({
|
42924 | 'u_is_size_zoom_constant': new performance.Uniform1i(context, locations.u_is_size_zoom_constant),
|
42925 | 'u_is_size_feature_constant': new performance.Uniform1i(context, locations.u_is_size_feature_constant),
|
42926 | 'u_size_t': new performance.Uniform1f(context, locations.u_size_t),
|
42927 | 'u_size': new performance.Uniform1f(context, locations.u_size),
|
42928 | 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance),
|
42929 | 'u_pitch': new performance.Uniform1f(context, locations.u_pitch),
|
42930 | 'u_rotate_symbol': new performance.Uniform1i(context, locations.u_rotate_symbol),
|
42931 | 'u_aspect_ratio': new performance.Uniform1f(context, locations.u_aspect_ratio),
|
42932 | 'u_fade_change': new performance.Uniform1f(context, locations.u_fade_change),
|
42933 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42934 | 'u_label_plane_matrix': new performance.UniformMatrix4f(context, locations.u_label_plane_matrix),
|
42935 | 'u_coord_matrix': new performance.UniformMatrix4f(context, locations.u_coord_matrix),
|
42936 | 'u_is_text': new performance.Uniform1i(context, locations.u_is_text),
|
42937 | 'u_pitch_with_map': new performance.Uniform1i(context, locations.u_pitch_with_map),
|
42938 | 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
|
42939 | 'u_texsize_icon': new performance.Uniform2f(context, locations.u_texsize_icon),
|
42940 | 'u_texture': new performance.Uniform1i(context, locations.u_texture),
|
42941 | 'u_texture_icon': new performance.Uniform1i(context, locations.u_texture_icon),
|
42942 | 'u_gamma_scale': new performance.Uniform1f(context, locations.u_gamma_scale),
|
42943 | 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio),
|
42944 | 'u_is_halo': new performance.Uniform1i(context, locations.u_is_halo)
|
42945 | });
|
42946 | const symbolIconUniformValues = (functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, texSize) => {
|
42947 | const transform = painter.transform;
|
42948 | return {
|
42949 | 'u_is_size_zoom_constant': +(functionType === 'constant' || functionType === 'source'),
|
42950 | 'u_is_size_feature_constant': +(functionType === 'constant' || functionType === 'camera'),
|
42951 | 'u_size_t': size ? size.uSizeT : 0,
|
42952 | 'u_size': size ? size.uSize : 0,
|
42953 | 'u_camera_to_center_distance': transform.cameraToCenterDistance,
|
42954 | 'u_pitch': transform.pitch / 360 * 2 * Math.PI,
|
42955 | 'u_rotate_symbol': +rotateInShader,
|
42956 | 'u_aspect_ratio': transform.width / transform.height,
|
42957 | 'u_fade_change': painter.options.fadeDuration ? painter.symbolFadeChange : 1,
|
42958 | 'u_matrix': matrix,
|
42959 | 'u_label_plane_matrix': labelPlaneMatrix,
|
42960 | 'u_coord_matrix': glCoordMatrix,
|
42961 | 'u_is_text': +isText,
|
42962 | 'u_pitch_with_map': +pitchWithMap,
|
42963 | 'u_texsize': texSize,
|
42964 | 'u_texture': 0
|
42965 | };
|
42966 | };
|
42967 | const symbolSDFUniformValues = (functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, texSize, isHalo) => {
|
42968 | const transform = painter.transform;
|
42969 | return performance.extend(symbolIconUniformValues(functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, texSize), {
|
42970 | 'u_gamma_scale': (pitchWithMap ? Math.cos(transform._pitch) * transform.cameraToCenterDistance : 1),
|
42971 | 'u_device_pixel_ratio': painter.pixelRatio,
|
42972 | 'u_is_halo': +isHalo
|
42973 | });
|
42974 | };
|
42975 | const symbolTextAndIconUniformValues = (functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, texSizeSDF, texSizeIcon) => {
|
42976 | return performance.extend(symbolSDFUniformValues(functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, true, texSizeSDF, true), {
|
42977 | 'u_texsize_icon': texSizeIcon,
|
42978 | 'u_texture_icon': 1
|
42979 | });
|
42980 | };
|
42981 |
|
42982 | const backgroundUniforms = (context, locations) => ({
|
42983 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42984 | 'u_opacity': new performance.Uniform1f(context, locations.u_opacity),
|
42985 | 'u_color': new performance.UniformColor(context, locations.u_color)
|
42986 | });
|
42987 | const backgroundPatternUniforms = (context, locations) => ({
|
42988 | 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix),
|
42989 | 'u_opacity': new performance.Uniform1f(context, locations.u_opacity),
|
42990 | 'u_image': new performance.Uniform1i(context, locations.u_image),
|
42991 | 'u_pattern_tl_a': new performance.Uniform2f(context, locations.u_pattern_tl_a),
|
42992 | 'u_pattern_br_a': new performance.Uniform2f(context, locations.u_pattern_br_a),
|
42993 | 'u_pattern_tl_b': new performance.Uniform2f(context, locations.u_pattern_tl_b),
|
42994 | 'u_pattern_br_b': new performance.Uniform2f(context, locations.u_pattern_br_b),
|
42995 | 'u_texsize': new performance.Uniform2f(context, locations.u_texsize),
|
42996 | 'u_mix': new performance.Uniform1f(context, locations.u_mix),
|
42997 | 'u_pattern_size_a': new performance.Uniform2f(context, locations.u_pattern_size_a),
|
42998 | 'u_pattern_size_b': new performance.Uniform2f(context, locations.u_pattern_size_b),
|
42999 | 'u_scale_a': new performance.Uniform1f(context, locations.u_scale_a),
|
43000 | 'u_scale_b': new performance.Uniform1f(context, locations.u_scale_b),
|
43001 | 'u_pixel_coord_upper': new performance.Uniform2f(context, locations.u_pixel_coord_upper),
|
43002 | 'u_pixel_coord_lower': new performance.Uniform2f(context, locations.u_pixel_coord_lower),
|
43003 | 'u_tile_units_to_pixels': new performance.Uniform1f(context, locations.u_tile_units_to_pixels)
|
43004 | });
|
43005 | const backgroundUniformValues = (matrix, opacity, color) => ({
|
43006 | 'u_matrix': matrix,
|
43007 | 'u_opacity': opacity,
|
43008 | 'u_color': color
|
43009 | });
|
43010 | const backgroundPatternUniformValues = (matrix, opacity, painter, image, tile, crossfade) => performance.extend(bgPatternUniformValues(image, crossfade, painter, tile), {
|
43011 | 'u_matrix': matrix,
|
43012 | 'u_opacity': opacity
|
43013 | });
|
43014 |
|
43015 | const programUniforms = {
|
43016 | fillExtrusion: fillExtrusionUniforms,
|
43017 | fillExtrusionPattern: fillExtrusionPatternUniforms,
|
43018 | fill: fillUniforms,
|
43019 | fillPattern: fillPatternUniforms,
|
43020 | fillOutline: fillOutlineUniforms,
|
43021 | fillOutlinePattern: fillOutlinePatternUniforms,
|
43022 | circle: circleUniforms,
|
43023 | collisionBox: collisionUniforms,
|
43024 | collisionCircle: collisionCircleUniforms,
|
43025 | debug: debugUniforms,
|
43026 | clippingMask: clippingMaskUniforms,
|
43027 | heatmap: heatmapUniforms,
|
43028 | heatmapTexture: heatmapTextureUniforms,
|
43029 | hillshade: hillshadeUniforms,
|
43030 | hillshadePrepare: hillshadePrepareUniforms,
|
43031 | line: lineUniforms,
|
43032 | lineGradient: lineGradientUniforms,
|
43033 | linePattern: linePatternUniforms,
|
43034 | lineSDF: lineSDFUniforms,
|
43035 | raster: rasterUniforms,
|
43036 | symbolIcon: symbolIconUniforms,
|
43037 | symbolSDF: symbolSDFUniforms,
|
43038 | symbolTextAndIcon: symbolTextAndIconUniforms,
|
43039 | background: backgroundUniforms,
|
43040 | backgroundPattern: backgroundPatternUniforms
|
43041 | };
|
43042 |
|
43043 | class IndexBuffer {
|
43044 | constructor(context, array, dynamicDraw) {
|
43045 | this.context = context;
|
43046 | const gl = context.gl;
|
43047 | this.buffer = gl.createBuffer();
|
43048 | this.dynamicDraw = Boolean(dynamicDraw);
|
43049 | // The bound index buffer is part of vertex array object state. We don't want to
|
43050 | // modify whatever VAO happens to be currently bound, so make sure the default
|
43051 | // vertex array provided by the context is bound instead.
|
43052 | this.context.unbindVAO();
|
43053 | context.bindElementBuffer.set(this.buffer);
|
43054 | gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW);
|
43055 | if (!this.dynamicDraw) {
|
43056 | delete array.arrayBuffer;
|
43057 | }
|
43058 | }
|
43059 | bind() {
|
43060 | this.context.bindElementBuffer.set(this.buffer);
|
43061 | }
|
43062 | updateData(array) {
|
43063 | const gl = this.context.gl;
|
43064 | performance.assert(this.dynamicDraw);
|
43065 | // The right VAO will get this buffer re-bound later in VertexArrayObject#bind
|
43066 | // See https://github.com/mapbox/mapbox-gl-js/issues/5620
|
43067 | this.context.unbindVAO();
|
43068 | this.bind();
|
43069 | gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, array.arrayBuffer);
|
43070 | }
|
43071 | destroy() {
|
43072 | const gl = this.context.gl;
|
43073 | if (this.buffer) {
|
43074 | gl.deleteBuffer(this.buffer);
|
43075 | delete this.buffer;
|
43076 | }
|
43077 | }
|
43078 | }
|
43079 |
|
43080 | /**
|
43081 | * @enum {string} AttributeType
|
43082 | * @private
|
43083 | * @readonly
|
43084 | */
|
43085 | const AttributeType = {
|
43086 | Int8: 'BYTE',
|
43087 | Uint8: 'UNSIGNED_BYTE',
|
43088 | Int16: 'SHORT',
|
43089 | Uint16: 'UNSIGNED_SHORT',
|
43090 | Int32: 'INT',
|
43091 | Uint32: 'UNSIGNED_INT',
|
43092 | Float32: 'FLOAT'
|
43093 | };
|
43094 | /**
|
43095 | * The `VertexBuffer` class turns a `StructArray` into a WebGL buffer. Each member of the StructArray's
|
43096 | * Struct type is converted to a WebGL atribute.
|
43097 | * @private
|
43098 | */
|
43099 | class VertexBuffer {
|
43100 | /**
|
43101 | * @param dynamicDraw Whether this buffer will be repeatedly updated.
|
43102 | * @private
|
43103 | */
|
43104 | constructor(context, array, attributes, dynamicDraw) {
|
43105 | this.length = array.length;
|
43106 | this.attributes = attributes;
|
43107 | this.itemSize = array.bytesPerElement;
|
43108 | this.dynamicDraw = dynamicDraw;
|
43109 | this.context = context;
|
43110 | const gl = context.gl;
|
43111 | this.buffer = gl.createBuffer();
|
43112 | context.bindVertexBuffer.set(this.buffer);
|
43113 | gl.bufferData(gl.ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW);
|
43114 | if (!this.dynamicDraw) {
|
43115 | delete array.arrayBuffer;
|
43116 | }
|
43117 | }
|
43118 | bind() {
|
43119 | this.context.bindVertexBuffer.set(this.buffer);
|
43120 | }
|
43121 | updateData(array) {
|
43122 | performance.assert(array.length === this.length);
|
43123 | const gl = this.context.gl;
|
43124 | this.bind();
|
43125 | gl.bufferSubData(gl.ARRAY_BUFFER, 0, array.arrayBuffer);
|
43126 | }
|
43127 | enableAttributes(gl, program) {
|
43128 | for (let j = 0; j < this.attributes.length; j++) {
|
43129 | const member = this.attributes[j];
|
43130 | const attribIndex = program.attributes[member.name];
|
43131 | if (attribIndex !== undefined) {
|
43132 | gl.enableVertexAttribArray(attribIndex);
|
43133 | }
|
43134 | }
|
43135 | }
|
43136 | /**
|
43137 | * Set the attribute pointers in a WebGL context
|
43138 | * @param gl The WebGL context
|
43139 | * @param program The active WebGL program
|
43140 | * @param vertexOffset Index of the starting vertex of the segment
|
43141 | */
|
43142 | setVertexAttribPointers(gl, program, vertexOffset) {
|
43143 | for (let j = 0; j < this.attributes.length; j++) {
|
43144 | const member = this.attributes[j];
|
43145 | const attribIndex = program.attributes[member.name];
|
43146 | if (attribIndex !== undefined) {
|
43147 | gl.vertexAttribPointer(attribIndex, member.components, gl[AttributeType[member.type]], false, this.itemSize, member.offset + (this.itemSize * (vertexOffset || 0)));
|
43148 | }
|
43149 | }
|
43150 | }
|
43151 | /**
|
43152 | * Destroy the GL buffer bound to the given WebGL context
|
43153 | */
|
43154 | destroy() {
|
43155 | const gl = this.context.gl;
|
43156 | if (this.buffer) {
|
43157 | gl.deleteBuffer(this.buffer);
|
43158 | delete this.buffer;
|
43159 | }
|
43160 | }
|
43161 | }
|
43162 |
|
43163 | class BaseValue {
|
43164 | constructor(context) {
|
43165 | this.gl = context.gl;
|
43166 | this.default = this.getDefault();
|
43167 | this.current = this.default;
|
43168 | this.dirty = false;
|
43169 | }
|
43170 | get() {
|
43171 | return this.current;
|
43172 | }
|
43173 | set(value) {
|
43174 | // overridden in child classes;
|
43175 | }
|
43176 | getDefault() {
|
43177 | return this.default; // overriden in child classes
|
43178 | }
|
43179 | setDefault() {
|
43180 | this.set(this.default);
|
43181 | }
|
43182 | }
|
43183 | class ClearColor extends BaseValue {
|
43184 | getDefault() {
|
43185 | return performance.Color.transparent;
|
43186 | }
|
43187 | set(v) {
|
43188 | const c = this.current;
|
43189 | if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty)
|
43190 | return;
|
43191 | this.gl.clearColor(v.r, v.g, v.b, v.a);
|
43192 | this.current = v;
|
43193 | this.dirty = false;
|
43194 | }
|
43195 | }
|
43196 | class ClearDepth extends BaseValue {
|
43197 | getDefault() {
|
43198 | return 1;
|
43199 | }
|
43200 | set(v) {
|
43201 | if (v === this.current && !this.dirty)
|
43202 | return;
|
43203 | this.gl.clearDepth(v);
|
43204 | this.current = v;
|
43205 | this.dirty = false;
|
43206 | }
|
43207 | }
|
43208 | class ClearStencil extends BaseValue {
|
43209 | getDefault() {
|
43210 | return 0;
|
43211 | }
|
43212 | set(v) {
|
43213 | if (v === this.current && !this.dirty)
|
43214 | return;
|
43215 | this.gl.clearStencil(v);
|
43216 | this.current = v;
|
43217 | this.dirty = false;
|
43218 | }
|
43219 | }
|
43220 | class ColorMask extends BaseValue {
|
43221 | getDefault() {
|
43222 | return [true, true, true, true];
|
43223 | }
|
43224 | set(v) {
|
43225 | const c = this.current;
|
43226 | if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty)
|
43227 | return;
|
43228 | this.gl.colorMask(v[0], v[1], v[2], v[3]);
|
43229 | this.current = v;
|
43230 | this.dirty = false;
|
43231 | }
|
43232 | }
|
43233 | class DepthMask extends BaseValue {
|
43234 | getDefault() {
|
43235 | return true;
|
43236 | }
|
43237 | set(v) {
|
43238 | if (v === this.current && !this.dirty)
|
43239 | return;
|
43240 | this.gl.depthMask(v);
|
43241 | this.current = v;
|
43242 | this.dirty = false;
|
43243 | }
|
43244 | }
|
43245 | class StencilMask extends BaseValue {
|
43246 | getDefault() {
|
43247 | return 0xFF;
|
43248 | }
|
43249 | set(v) {
|
43250 | if (v === this.current && !this.dirty)
|
43251 | return;
|
43252 | this.gl.stencilMask(v);
|
43253 | this.current = v;
|
43254 | this.dirty = false;
|
43255 | }
|
43256 | }
|
43257 | class StencilFunc extends BaseValue {
|
43258 | getDefault() {
|
43259 | return {
|
43260 | func: this.gl.ALWAYS,
|
43261 | ref: 0,
|
43262 | mask: 0xFF
|
43263 | };
|
43264 | }
|
43265 | set(v) {
|
43266 | const c = this.current;
|
43267 | if (v.func === c.func && v.ref === c.ref && v.mask === c.mask && !this.dirty)
|
43268 | return;
|
43269 | this.gl.stencilFunc(v.func, v.ref, v.mask);
|
43270 | this.current = v;
|
43271 | this.dirty = false;
|
43272 | }
|
43273 | }
|
43274 | class StencilOp extends BaseValue {
|
43275 | getDefault() {
|
43276 | const gl = this.gl;
|
43277 | return [gl.KEEP, gl.KEEP, gl.KEEP];
|
43278 | }
|
43279 | set(v) {
|
43280 | const c = this.current;
|
43281 | if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && !this.dirty)
|
43282 | return;
|
43283 | this.gl.stencilOp(v[0], v[1], v[2]);
|
43284 | this.current = v;
|
43285 | this.dirty = false;
|
43286 | }
|
43287 | }
|
43288 | class StencilTest extends BaseValue {
|
43289 | getDefault() {
|
43290 | return false;
|
43291 | }
|
43292 | set(v) {
|
43293 | if (v === this.current && !this.dirty)
|
43294 | return;
|
43295 | const gl = this.gl;
|
43296 | if (v) {
|
43297 | gl.enable(gl.STENCIL_TEST);
|
43298 | }
|
43299 | else {
|
43300 | gl.disable(gl.STENCIL_TEST);
|
43301 | }
|
43302 | this.current = v;
|
43303 | this.dirty = false;
|
43304 | }
|
43305 | }
|
43306 | class DepthRange extends BaseValue {
|
43307 | getDefault() {
|
43308 | return [0, 1];
|
43309 | }
|
43310 | set(v) {
|
43311 | const c = this.current;
|
43312 | if (v[0] === c[0] && v[1] === c[1] && !this.dirty)
|
43313 | return;
|
43314 | this.gl.depthRange(v[0], v[1]);
|
43315 | this.current = v;
|
43316 | this.dirty = false;
|
43317 | }
|
43318 | }
|
43319 | class DepthTest extends BaseValue {
|
43320 | getDefault() {
|
43321 | return false;
|
43322 | }
|
43323 | set(v) {
|
43324 | if (v === this.current && !this.dirty)
|
43325 | return;
|
43326 | const gl = this.gl;
|
43327 | if (v) {
|
43328 | gl.enable(gl.DEPTH_TEST);
|
43329 | }
|
43330 | else {
|
43331 | gl.disable(gl.DEPTH_TEST);
|
43332 | }
|
43333 | this.current = v;
|
43334 | this.dirty = false;
|
43335 | }
|
43336 | }
|
43337 | class DepthFunc extends BaseValue {
|
43338 | getDefault() {
|
43339 | return this.gl.LESS;
|
43340 | }
|
43341 | set(v) {
|
43342 | if (v === this.current && !this.dirty)
|
43343 | return;
|
43344 | this.gl.depthFunc(v);
|
43345 | this.current = v;
|
43346 | this.dirty = false;
|
43347 | }
|
43348 | }
|
43349 | class Blend extends BaseValue {
|
43350 | getDefault() {
|
43351 | return false;
|
43352 | }
|
43353 | set(v) {
|
43354 | if (v === this.current && !this.dirty)
|
43355 | return;
|
43356 | const gl = this.gl;
|
43357 | if (v) {
|
43358 | gl.enable(gl.BLEND);
|
43359 | }
|
43360 | else {
|
43361 | gl.disable(gl.BLEND);
|
43362 | }
|
43363 | this.current = v;
|
43364 | this.dirty = false;
|
43365 | }
|
43366 | }
|
43367 | class BlendFunc extends BaseValue {
|
43368 | getDefault() {
|
43369 | const gl = this.gl;
|
43370 | return [gl.ONE, gl.ZERO];
|
43371 | }
|
43372 | set(v) {
|
43373 | const c = this.current;
|
43374 | if (v[0] === c[0] && v[1] === c[1] && !this.dirty)
|
43375 | return;
|
43376 | this.gl.blendFunc(v[0], v[1]);
|
43377 | this.current = v;
|
43378 | this.dirty = false;
|
43379 | }
|
43380 | }
|
43381 | class BlendColor extends BaseValue {
|
43382 | getDefault() {
|
43383 | return performance.Color.transparent;
|
43384 | }
|
43385 | set(v) {
|
43386 | const c = this.current;
|
43387 | if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty)
|
43388 | return;
|
43389 | this.gl.blendColor(v.r, v.g, v.b, v.a);
|
43390 | this.current = v;
|
43391 | this.dirty = false;
|
43392 | }
|
43393 | }
|
43394 | class BlendEquation extends BaseValue {
|
43395 | getDefault() {
|
43396 | return this.gl.FUNC_ADD;
|
43397 | }
|
43398 | set(v) {
|
43399 | if (v === this.current && !this.dirty)
|
43400 | return;
|
43401 | this.gl.blendEquation(v);
|
43402 | this.current = v;
|
43403 | this.dirty = false;
|
43404 | }
|
43405 | }
|
43406 | class CullFace extends BaseValue {
|
43407 | getDefault() {
|
43408 | return false;
|
43409 | }
|
43410 | set(v) {
|
43411 | if (v === this.current && !this.dirty)
|
43412 | return;
|
43413 | const gl = this.gl;
|
43414 | if (v) {
|
43415 | gl.enable(gl.CULL_FACE);
|
43416 | }
|
43417 | else {
|
43418 | gl.disable(gl.CULL_FACE);
|
43419 | }
|
43420 | this.current = v;
|
43421 | this.dirty = false;
|
43422 | }
|
43423 | }
|
43424 | class CullFaceSide extends BaseValue {
|
43425 | getDefault() {
|
43426 | return this.gl.BACK;
|
43427 | }
|
43428 | set(v) {
|
43429 | if (v === this.current && !this.dirty)
|
43430 | return;
|
43431 | this.gl.cullFace(v);
|
43432 | this.current = v;
|
43433 | this.dirty = false;
|
43434 | }
|
43435 | }
|
43436 | class FrontFace extends BaseValue {
|
43437 | getDefault() {
|
43438 | return this.gl.CCW;
|
43439 | }
|
43440 | set(v) {
|
43441 | if (v === this.current && !this.dirty)
|
43442 | return;
|
43443 | this.gl.frontFace(v);
|
43444 | this.current = v;
|
43445 | this.dirty = false;
|
43446 | }
|
43447 | }
|
43448 | class ProgramValue extends BaseValue {
|
43449 | getDefault() {
|
43450 | return null;
|
43451 | }
|
43452 | set(v) {
|
43453 | if (v === this.current && !this.dirty)
|
43454 | return;
|
43455 | this.gl.useProgram(v);
|
43456 | this.current = v;
|
43457 | this.dirty = false;
|
43458 | }
|
43459 | }
|
43460 | class ActiveTextureUnit extends BaseValue {
|
43461 | getDefault() {
|
43462 | return this.gl.TEXTURE0;
|
43463 | }
|
43464 | set(v) {
|
43465 | if (v === this.current && !this.dirty)
|
43466 | return;
|
43467 | this.gl.activeTexture(v);
|
43468 | this.current = v;
|
43469 | this.dirty = false;
|
43470 | }
|
43471 | }
|
43472 | class Viewport extends BaseValue {
|
43473 | getDefault() {
|
43474 | const gl = this.gl;
|
43475 | return [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight];
|
43476 | }
|
43477 | set(v) {
|
43478 | const c = this.current;
|
43479 | if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty)
|
43480 | return;
|
43481 | this.gl.viewport(v[0], v[1], v[2], v[3]);
|
43482 | this.current = v;
|
43483 | this.dirty = false;
|
43484 | }
|
43485 | }
|
43486 | class BindFramebuffer extends BaseValue {
|
43487 | getDefault() {
|
43488 | return null;
|
43489 | }
|
43490 | set(v) {
|
43491 | if (v === this.current && !this.dirty)
|
43492 | return;
|
43493 | const gl = this.gl;
|
43494 | gl.bindFramebuffer(gl.FRAMEBUFFER, v);
|
43495 | this.current = v;
|
43496 | this.dirty = false;
|
43497 | }
|
43498 | }
|
43499 | class BindRenderbuffer extends BaseValue {
|
43500 | getDefault() {
|
43501 | return null;
|
43502 | }
|
43503 | set(v) {
|
43504 | if (v === this.current && !this.dirty)
|
43505 | return;
|
43506 | const gl = this.gl;
|
43507 | gl.bindRenderbuffer(gl.RENDERBUFFER, v);
|
43508 | this.current = v;
|
43509 | this.dirty = false;
|
43510 | }
|
43511 | }
|
43512 | class BindTexture extends BaseValue {
|
43513 | getDefault() {
|
43514 | return null;
|
43515 | }
|
43516 | set(v) {
|
43517 | if (v === this.current && !this.dirty)
|
43518 | return;
|
43519 | const gl = this.gl;
|
43520 | gl.bindTexture(gl.TEXTURE_2D, v);
|
43521 | this.current = v;
|
43522 | this.dirty = false;
|
43523 | }
|
43524 | }
|
43525 | class BindVertexBuffer extends BaseValue {
|
43526 | getDefault() {
|
43527 | return null;
|
43528 | }
|
43529 | set(v) {
|
43530 | if (v === this.current && !this.dirty)
|
43531 | return;
|
43532 | const gl = this.gl;
|
43533 | gl.bindBuffer(gl.ARRAY_BUFFER, v);
|
43534 | this.current = v;
|
43535 | this.dirty = false;
|
43536 | }
|
43537 | }
|
43538 | class BindElementBuffer extends BaseValue {
|
43539 | getDefault() {
|
43540 | return null;
|
43541 | }
|
43542 | set(v) {
|
43543 | // Always rebind
|
43544 | const gl = this.gl;
|
43545 | gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, v);
|
43546 | this.current = v;
|
43547 | this.dirty = false;
|
43548 | }
|
43549 | }
|
43550 | class BindVertexArrayOES extends BaseValue {
|
43551 | constructor(context) {
|
43552 | super(context);
|
43553 | this.vao = context.extVertexArrayObject;
|
43554 | }
|
43555 | getDefault() {
|
43556 | return null;
|
43557 | }
|
43558 | set(v) {
|
43559 | if (!this.vao || v === this.current && !this.dirty)
|
43560 | return;
|
43561 | this.vao.bindVertexArrayOES(v);
|
43562 | this.current = v;
|
43563 | this.dirty = false;
|
43564 | }
|
43565 | }
|
43566 | class PixelStoreUnpack extends BaseValue {
|
43567 | getDefault() {
|
43568 | return 4;
|
43569 | }
|
43570 | set(v) {
|
43571 | if (v === this.current && !this.dirty)
|
43572 | return;
|
43573 | const gl = this.gl;
|
43574 | gl.pixelStorei(gl.UNPACK_ALIGNMENT, v);
|
43575 | this.current = v;
|
43576 | this.dirty = false;
|
43577 | }
|
43578 | }
|
43579 | class PixelStoreUnpackPremultiplyAlpha extends BaseValue {
|
43580 | getDefault() {
|
43581 | return false;
|
43582 | }
|
43583 | set(v) {
|
43584 | if (v === this.current && !this.dirty)
|
43585 | return;
|
43586 | const gl = this.gl;
|
43587 | gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, v);
|
43588 | this.current = v;
|
43589 | this.dirty = false;
|
43590 | }
|
43591 | }
|
43592 | class PixelStoreUnpackFlipY extends BaseValue {
|
43593 | getDefault() {
|
43594 | return false;
|
43595 | }
|
43596 | set(v) {
|
43597 | if (v === this.current && !this.dirty)
|
43598 | return;
|
43599 | const gl = this.gl;
|
43600 | gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, v);
|
43601 | this.current = v;
|
43602 | this.dirty = false;
|
43603 | }
|
43604 | }
|
43605 | class FramebufferAttachment extends BaseValue {
|
43606 | constructor(context, parent) {
|
43607 | super(context);
|
43608 | this.context = context;
|
43609 | this.parent = parent;
|
43610 | }
|
43611 | getDefault() {
|
43612 | return null;
|
43613 | }
|
43614 | }
|
43615 | class ColorAttachment extends FramebufferAttachment {
|
43616 | setDirty() {
|
43617 | this.dirty = true;
|
43618 | }
|
43619 | set(v) {
|
43620 | if (v === this.current && !this.dirty)
|
43621 | return;
|
43622 | this.context.bindFramebuffer.set(this.parent);
|
43623 | // note: it's possible to attach a renderbuffer to the color
|
43624 | // attachment point, but thus far MBGL only uses textures for color
|
43625 | const gl = this.gl;
|
43626 | gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, v, 0);
|
43627 | this.current = v;
|
43628 | this.dirty = false;
|
43629 | }
|
43630 | }
|
43631 | class DepthAttachment extends FramebufferAttachment {
|
43632 | set(v) {
|
43633 | if (v === this.current && !this.dirty)
|
43634 | return;
|
43635 | this.context.bindFramebuffer.set(this.parent);
|
43636 | // note: it's possible to attach a texture to the depth attachment
|
43637 | // point, but thus far MBGL only uses renderbuffers for depth
|
43638 | const gl = this.gl;
|
43639 | gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, v);
|
43640 | this.current = v;
|
43641 | this.dirty = false;
|
43642 | }
|
43643 | }
|
43644 |
|
43645 | class Framebuffer {
|
43646 | constructor(context, width, height, hasDepth) {
|
43647 | this.context = context;
|
43648 | this.width = width;
|
43649 | this.height = height;
|
43650 | const gl = context.gl;
|
43651 | const fbo = this.framebuffer = gl.createFramebuffer();
|
43652 | this.colorAttachment = new ColorAttachment(context, fbo);
|
43653 | if (hasDepth) {
|
43654 | this.depthAttachment = new DepthAttachment(context, fbo);
|
43655 | }
|
43656 | performance.assert(gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE);
|
43657 | }
|
43658 | destroy() {
|
43659 | const gl = this.context.gl;
|
43660 | const texture = this.colorAttachment.get();
|
43661 | if (texture)
|
43662 | gl.deleteTexture(texture);
|
43663 | if (this.depthAttachment) {
|
43664 | const renderbuffer = this.depthAttachment.get();
|
43665 | if (renderbuffer)
|
43666 | gl.deleteRenderbuffer(renderbuffer);
|
43667 | }
|
43668 | gl.deleteFramebuffer(this.framebuffer);
|
43669 | }
|
43670 | }
|
43671 |
|
43672 | const ZERO = 0x0000;
|
43673 | const ONE = 0x0001;
|
43674 | const ONE_MINUS_SRC_ALPHA = 0x0303;
|
43675 | class ColorMode {
|
43676 | constructor(blendFunction, blendColor, mask) {
|
43677 | this.blendFunction = blendFunction;
|
43678 | this.blendColor = blendColor;
|
43679 | this.mask = mask;
|
43680 | }
|
43681 | }
|
43682 | ColorMode.Replace = [ONE, ZERO];
|
43683 | ColorMode.disabled = new ColorMode(ColorMode.Replace, performance.Color.transparent, [false, false, false, false]);
|
43684 | ColorMode.unblended = new ColorMode(ColorMode.Replace, performance.Color.transparent, [true, true, true, true]);
|
43685 | ColorMode.alphaBlended = new ColorMode([ONE, ONE_MINUS_SRC_ALPHA], performance.Color.transparent, [true, true, true, true]);
|
43686 |
|
43687 | class Context {
|
43688 | constructor(gl) {
|
43689 | this.gl = gl;
|
43690 | this.extVertexArrayObject = this.gl.getExtension('OES_vertex_array_object');
|
43691 | this.clearColor = new ClearColor(this);
|
43692 | this.clearDepth = new ClearDepth(this);
|
43693 | this.clearStencil = new ClearStencil(this);
|
43694 | this.colorMask = new ColorMask(this);
|
43695 | this.depthMask = new DepthMask(this);
|
43696 | this.stencilMask = new StencilMask(this);
|
43697 | this.stencilFunc = new StencilFunc(this);
|
43698 | this.stencilOp = new StencilOp(this);
|
43699 | this.stencilTest = new StencilTest(this);
|
43700 | this.depthRange = new DepthRange(this);
|
43701 | this.depthTest = new DepthTest(this);
|
43702 | this.depthFunc = new DepthFunc(this);
|
43703 | this.blend = new Blend(this);
|
43704 | this.blendFunc = new BlendFunc(this);
|
43705 | this.blendColor = new BlendColor(this);
|
43706 | this.blendEquation = new BlendEquation(this);
|
43707 | this.cullFace = new CullFace(this);
|
43708 | this.cullFaceSide = new CullFaceSide(this);
|
43709 | this.frontFace = new FrontFace(this);
|
43710 | this.program = new ProgramValue(this);
|
43711 | this.activeTexture = new ActiveTextureUnit(this);
|
43712 | this.viewport = new Viewport(this);
|
43713 | this.bindFramebuffer = new BindFramebuffer(this);
|
43714 | this.bindRenderbuffer = new BindRenderbuffer(this);
|
43715 | this.bindTexture = new BindTexture(this);
|
43716 | this.bindVertexBuffer = new BindVertexBuffer(this);
|
43717 | this.bindElementBuffer = new BindElementBuffer(this);
|
43718 | this.bindVertexArrayOES = this.extVertexArrayObject && new BindVertexArrayOES(this);
|
43719 | this.pixelStoreUnpack = new PixelStoreUnpack(this);
|
43720 | this.pixelStoreUnpackPremultiplyAlpha = new PixelStoreUnpackPremultiplyAlpha(this);
|
43721 | this.pixelStoreUnpackFlipY = new PixelStoreUnpackFlipY(this);
|
43722 | this.extTextureFilterAnisotropic = (gl.getExtension('EXT_texture_filter_anisotropic') ||
|
43723 | gl.getExtension('MOZ_EXT_texture_filter_anisotropic') ||
|
43724 | gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic'));
|
43725 | if (this.extTextureFilterAnisotropic) {
|
43726 | this.extTextureFilterAnisotropicMax = gl.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT);
|
43727 | }
|
43728 | this.extTextureHalfFloat = gl.getExtension('OES_texture_half_float');
|
43729 | if (this.extTextureHalfFloat) {
|
43730 | gl.getExtension('OES_texture_half_float_linear');
|
43731 | this.extRenderToTextureHalfFloat = gl.getExtension('EXT_color_buffer_half_float');
|
43732 | }
|
43733 | this.extTimerQuery = gl.getExtension('EXT_disjoint_timer_query');
|
43734 | this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
|
43735 | }
|
43736 | setDefault() {
|
43737 | this.unbindVAO();
|
43738 | this.clearColor.setDefault();
|
43739 | this.clearDepth.setDefault();
|
43740 | this.clearStencil.setDefault();
|
43741 | this.colorMask.setDefault();
|
43742 | this.depthMask.setDefault();
|
43743 | this.stencilMask.setDefault();
|
43744 | this.stencilFunc.setDefault();
|
43745 | this.stencilOp.setDefault();
|
43746 | this.stencilTest.setDefault();
|
43747 | this.depthRange.setDefault();
|
43748 | this.depthTest.setDefault();
|
43749 | this.depthFunc.setDefault();
|
43750 | this.blend.setDefault();
|
43751 | this.blendFunc.setDefault();
|
43752 | this.blendColor.setDefault();
|
43753 | this.blendEquation.setDefault();
|
43754 | this.cullFace.setDefault();
|
43755 | this.cullFaceSide.setDefault();
|
43756 | this.frontFace.setDefault();
|
43757 | this.program.setDefault();
|
43758 | this.activeTexture.setDefault();
|
43759 | this.bindFramebuffer.setDefault();
|
43760 | this.pixelStoreUnpack.setDefault();
|
43761 | this.pixelStoreUnpackPremultiplyAlpha.setDefault();
|
43762 | this.pixelStoreUnpackFlipY.setDefault();
|
43763 | }
|
43764 | setDirty() {
|
43765 | this.clearColor.dirty = true;
|
43766 | this.clearDepth.dirty = true;
|
43767 | this.clearStencil.dirty = true;
|
43768 | this.colorMask.dirty = true;
|
43769 | this.depthMask.dirty = true;
|
43770 | this.stencilMask.dirty = true;
|
43771 | this.stencilFunc.dirty = true;
|
43772 | this.stencilOp.dirty = true;
|
43773 | this.stencilTest.dirty = true;
|
43774 | this.depthRange.dirty = true;
|
43775 | this.depthTest.dirty = true;
|
43776 | this.depthFunc.dirty = true;
|
43777 | this.blend.dirty = true;
|
43778 | this.blendFunc.dirty = true;
|
43779 | this.blendColor.dirty = true;
|
43780 | this.blendEquation.dirty = true;
|
43781 | this.cullFace.dirty = true;
|
43782 | this.cullFaceSide.dirty = true;
|
43783 | this.frontFace.dirty = true;
|
43784 | this.program.dirty = true;
|
43785 | this.activeTexture.dirty = true;
|
43786 | this.viewport.dirty = true;
|
43787 | this.bindFramebuffer.dirty = true;
|
43788 | this.bindRenderbuffer.dirty = true;
|
43789 | this.bindTexture.dirty = true;
|
43790 | this.bindVertexBuffer.dirty = true;
|
43791 | this.bindElementBuffer.dirty = true;
|
43792 | if (this.extVertexArrayObject) {
|
43793 | this.bindVertexArrayOES.dirty = true;
|
43794 | }
|
43795 | this.pixelStoreUnpack.dirty = true;
|
43796 | this.pixelStoreUnpackPremultiplyAlpha.dirty = true;
|
43797 | this.pixelStoreUnpackFlipY.dirty = true;
|
43798 | }
|
43799 | createIndexBuffer(array, dynamicDraw) {
|
43800 | return new IndexBuffer(this, array, dynamicDraw);
|
43801 | }
|
43802 | createVertexBuffer(array, attributes, dynamicDraw) {
|
43803 | return new VertexBuffer(this, array, attributes, dynamicDraw);
|
43804 | }
|
43805 | createRenderbuffer(storageFormat, width, height) {
|
43806 | const gl = this.gl;
|
43807 | const rbo = gl.createRenderbuffer();
|
43808 | this.bindRenderbuffer.set(rbo);
|
43809 | gl.renderbufferStorage(gl.RENDERBUFFER, storageFormat, width, height);
|
43810 | this.bindRenderbuffer.set(null);
|
43811 | return rbo;
|
43812 | }
|
43813 | createFramebuffer(width, height, hasDepth) {
|
43814 | return new Framebuffer(this, width, height, hasDepth);
|
43815 | }
|
43816 | clear({ color, depth }) {
|
43817 | const gl = this.gl;
|
43818 | let mask = 0;
|
43819 | if (color) {
|
43820 | mask |= gl.COLOR_BUFFER_BIT;
|
43821 | this.clearColor.set(color);
|
43822 | this.colorMask.set([true, true, true, true]);
|
43823 | }
|
43824 | if (typeof depth !== 'undefined') {
|
43825 | mask |= gl.DEPTH_BUFFER_BIT;
|
43826 | // Workaround for platforms where clearDepth doesn't seem to work
|
43827 | // without reseting the depthRange. See https://github.com/mapbox/mapbox-gl-js/issues/3437
|
43828 | this.depthRange.set([0, 1]);
|
43829 | this.clearDepth.set(depth);
|
43830 | this.depthMask.set(true);
|
43831 | }
|
43832 | // See note in Painter#clearStencil: implement this the easy way once GPU bug/workaround is fixed upstream
|
43833 | // if (typeof stencil !== 'undefined') {
|
43834 | // mask |= gl.STENCIL_BUFFER_BIT;
|
43835 | // this.clearStencil.set(stencil);
|
43836 | // this.stencilMask.set(0xFF);
|
43837 | // }
|
43838 | gl.clear(mask);
|
43839 | }
|
43840 | setCullFace(cullFaceMode) {
|
43841 | if (cullFaceMode.enable === false) {
|
43842 | this.cullFace.set(false);
|
43843 | }
|
43844 | else {
|
43845 | this.cullFace.set(true);
|
43846 | this.cullFaceSide.set(cullFaceMode.mode);
|
43847 | this.frontFace.set(cullFaceMode.frontFace);
|
43848 | }
|
43849 | }
|
43850 | setDepthMode(depthMode) {
|
43851 | if (depthMode.func === this.gl.ALWAYS && !depthMode.mask) {
|
43852 | this.depthTest.set(false);
|
43853 | }
|
43854 | else {
|
43855 | this.depthTest.set(true);
|
43856 | this.depthFunc.set(depthMode.func);
|
43857 | this.depthMask.set(depthMode.mask);
|
43858 | this.depthRange.set(depthMode.range);
|
43859 | }
|
43860 | }
|
43861 | setStencilMode(stencilMode) {
|
43862 | if (stencilMode.test.func === this.gl.ALWAYS && !stencilMode.mask) {
|
43863 | this.stencilTest.set(false);
|
43864 | }
|
43865 | else {
|
43866 | this.stencilTest.set(true);
|
43867 | this.stencilMask.set(stencilMode.mask);
|
43868 | this.stencilOp.set([stencilMode.fail, stencilMode.depthFail, stencilMode.pass]);
|
43869 | this.stencilFunc.set({
|
43870 | func: stencilMode.test.func,
|
43871 | ref: stencilMode.ref,
|
43872 | mask: stencilMode.test.mask
|
43873 | });
|
43874 | }
|
43875 | }
|
43876 | setColorMode(colorMode) {
|
43877 | if (performance.deepEqual(colorMode.blendFunction, ColorMode.Replace)) {
|
43878 | this.blend.set(false);
|
43879 | }
|
43880 | else {
|
43881 | this.blend.set(true);
|
43882 | this.blendFunc.set(colorMode.blendFunction);
|
43883 | this.blendColor.set(colorMode.blendColor);
|
43884 | }
|
43885 | this.colorMask.set(colorMode.mask);
|
43886 | }
|
43887 | unbindVAO() {
|
43888 | // Unbinding the VAO prevents other things (custom layers, new buffer creation) from
|
43889 | // unintentionally changing the state of the last VAO used.
|
43890 | if (this.extVertexArrayObject) {
|
43891 | this.bindVertexArrayOES.set(null);
|
43892 | }
|
43893 | }
|
43894 | }
|
43895 |
|
43896 | const ALWAYS$1 = 0x0207;
|
43897 | class DepthMode {
|
43898 | constructor(depthFunc, depthMask, depthRange) {
|
43899 | this.func = depthFunc;
|
43900 | this.mask = depthMask;
|
43901 | this.range = depthRange;
|
43902 | }
|
43903 | }
|
43904 | DepthMode.ReadOnly = false;
|
43905 | DepthMode.ReadWrite = true;
|
43906 | DepthMode.disabled = new DepthMode(ALWAYS$1, DepthMode.ReadOnly, [0, 1]);
|
43907 |
|
43908 | const ALWAYS = 0x0207;
|
43909 | const KEEP = 0x1E00;
|
43910 | class StencilMode {
|
43911 | constructor(test, ref, mask, fail, depthFail, pass) {
|
43912 | this.test = test;
|
43913 | this.ref = ref;
|
43914 | this.mask = mask;
|
43915 | this.fail = fail;
|
43916 | this.depthFail = depthFail;
|
43917 | this.pass = pass;
|
43918 | }
|
43919 | }
|
43920 | StencilMode.disabled = new StencilMode({ func: ALWAYS, mask: 0 }, 0, 0, KEEP, KEEP, KEEP);
|
43921 |
|
43922 | const BACK = 0x0405;
|
43923 | const CCW = 0x0901;
|
43924 | class CullFaceMode {
|
43925 | constructor(enable, mode, frontFace) {
|
43926 | this.enable = enable;
|
43927 | this.mode = mode;
|
43928 | this.frontFace = frontFace;
|
43929 | }
|
43930 | }
|
43931 | CullFaceMode.disabled = new CullFaceMode(false, BACK, CCW);
|
43932 | CullFaceMode.backCCW = new CullFaceMode(true, BACK, CCW);
|
43933 |
|
43934 | let quadTriangles;
|
43935 | function drawCollisionDebug(painter, sourceCache, layer, coords, translate, translateAnchor, isText) {
|
43936 | const context = painter.context;
|
43937 | const gl = context.gl;
|
43938 | const program = painter.useProgram('collisionBox');
|
43939 | const tileBatches = [];
|
43940 | let circleCount = 0;
|
43941 | let circleOffset = 0;
|
43942 | for (let i = 0; i < coords.length; i++) {
|
43943 | const coord = coords[i];
|
43944 | const tile = sourceCache.getTile(coord);
|
43945 | const bucket = tile.getBucket(layer);
|
43946 | if (!bucket)
|
43947 | continue;
|
43948 | let posMatrix = coord.posMatrix;
|
43949 | if (translate[0] !== 0 || translate[1] !== 0) {
|
43950 | posMatrix = painter.translatePosMatrix(coord.posMatrix, tile, translate, translateAnchor);
|
43951 | }
|
43952 | const buffers = isText ? bucket.textCollisionBox : bucket.iconCollisionBox;
|
43953 | // Get collision circle data of this bucket
|
43954 | const circleArray = bucket.collisionCircleArray;
|
43955 | if (circleArray.length > 0) {
|
43956 | // We need to know the projection matrix that was used for projecting collision circles to the screen.
|
43957 | // This might vary between buckets as the symbol placement is a continous process. This matrix is
|
43958 | // required for transforming points from previous screen space to the current one
|
43959 | const invTransform = performance.create();
|
43960 | const transform = posMatrix;
|
43961 | performance.mul(invTransform, bucket.placementInvProjMatrix, painter.transform.glCoordMatrix);
|
43962 | performance.mul(invTransform, invTransform, bucket.placementViewportMatrix);
|
43963 | tileBatches.push({
|
43964 | circleArray,
|
43965 | circleOffset,
|
43966 | transform,
|
43967 | invTransform
|
43968 | });
|
43969 | circleCount += circleArray.length / 4; // 4 values per circle
|
43970 | circleOffset = circleCount;
|
43971 | }
|
43972 | if (!buffers)
|
43973 | continue;
|
43974 | program.draw(context, gl.LINES, DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled, collisionUniformValues(posMatrix, painter.transform, tile), layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, buffers.segments, null, painter.transform.zoom, null, null, buffers.collisionVertexBuffer);
|
43975 | }
|
43976 | if (!isText || !tileBatches.length) {
|
43977 | return;
|
43978 | }
|
43979 | // Render collision circles
|
43980 | const circleProgram = painter.useProgram('collisionCircle');
|
43981 | // Construct vertex data
|
43982 | const vertexData = new performance.CollisionCircleLayoutArray();
|
43983 | vertexData.resize(circleCount * 4);
|
43984 | vertexData._trim();
|
43985 | let vertexOffset = 0;
|
43986 | for (const batch of tileBatches) {
|
43987 | for (let i = 0; i < batch.circleArray.length / 4; i++) {
|
43988 | const circleIdx = i * 4;
|
43989 | const x = batch.circleArray[circleIdx + 0];
|
43990 | const y = batch.circleArray[circleIdx + 1];
|
43991 | const radius = batch.circleArray[circleIdx + 2];
|
43992 | const collision = batch.circleArray[circleIdx + 3];
|
43993 | // 4 floats per vertex, 4 vertices per quad
|
43994 | vertexData.emplace(vertexOffset++, x, y, radius, collision, 0);
|
43995 | vertexData.emplace(vertexOffset++, x, y, radius, collision, 1);
|
43996 | vertexData.emplace(vertexOffset++, x, y, radius, collision, 2);
|
43997 | vertexData.emplace(vertexOffset++, x, y, radius, collision, 3);
|
43998 | }
|
43999 | }
|
44000 | if (!quadTriangles || quadTriangles.length < circleCount * 2) {
|
44001 | quadTriangles = createQuadTriangles(circleCount);
|
44002 | }
|
44003 | const indexBuffer = context.createIndexBuffer(quadTriangles, true);
|
44004 | const vertexBuffer = context.createVertexBuffer(vertexData, performance.collisionCircleLayout.members, true);
|
44005 | // Render batches
|
44006 | for (const batch of tileBatches) {
|
44007 | const uniforms = collisionCircleUniformValues(batch.transform, batch.invTransform, painter.transform);
|
44008 | circleProgram.draw(context, gl.TRIANGLES, DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled, uniforms, layer.id, vertexBuffer, indexBuffer, performance.SegmentVector.simpleSegment(0, batch.circleOffset * 2, batch.circleArray.length, batch.circleArray.length / 2), null, painter.transform.zoom, null, null, null);
|
44009 | }
|
44010 | vertexBuffer.destroy();
|
44011 | indexBuffer.destroy();
|
44012 | }
|
44013 | function createQuadTriangles(quadCount) {
|
44014 | const triCount = quadCount * 2;
|
44015 | const array = new performance.QuadTriangleArray();
|
44016 | array.resize(triCount);
|
44017 | array._trim();
|
44018 | // Two triangles and 4 vertices per quad.
|
44019 | for (let i = 0; i < triCount; i++) {
|
44020 | const idx = i * 6;
|
44021 | array.uint16[idx + 0] = i * 4 + 0;
|
44022 | array.uint16[idx + 1] = i * 4 + 1;
|
44023 | array.uint16[idx + 2] = i * 4 + 2;
|
44024 | array.uint16[idx + 3] = i * 4 + 2;
|
44025 | array.uint16[idx + 4] = i * 4 + 3;
|
44026 | array.uint16[idx + 5] = i * 4 + 0;
|
44027 | }
|
44028 | return array;
|
44029 | }
|
44030 |
|
44031 | const identityMat4 = performance.identity(new Float32Array(16));
|
44032 | function drawSymbols(painter, sourceCache, layer, coords, variableOffsets) {
|
44033 | if (painter.renderPass !== 'translucent')
|
44034 | return;
|
44035 | // Disable the stencil test so that labels aren't clipped to tile boundaries.
|
44036 | const stencilMode = StencilMode.disabled;
|
44037 | const colorMode = painter.colorModeForRenderPass();
|
44038 | const variablePlacement = layer.layout.get('text-variable-anchor');
|
44039 | //Compute variable-offsets before painting since icons and text data positioning
|
44040 | //depend on each other in this case.
|
44041 | if (variablePlacement) {
|
44042 | updateVariableAnchors(coords, painter, layer, sourceCache, layer.layout.get('text-rotation-alignment'), layer.layout.get('text-pitch-alignment'), variableOffsets);
|
44043 | }
|
44044 | if (layer.paint.get('icon-opacity').constantOr(1) !== 0) {
|
44045 | drawLayerSymbols(painter, sourceCache, layer, coords, false, layer.paint.get('icon-translate'), layer.paint.get('icon-translate-anchor'), layer.layout.get('icon-rotation-alignment'), layer.layout.get('icon-pitch-alignment'), layer.layout.get('icon-keep-upright'), stencilMode, colorMode);
|
44046 | }
|
44047 | if (layer.paint.get('text-opacity').constantOr(1) !== 0) {
|
44048 | drawLayerSymbols(painter, sourceCache, layer, coords, true, layer.paint.get('text-translate'), layer.paint.get('text-translate-anchor'), layer.layout.get('text-rotation-alignment'), layer.layout.get('text-pitch-alignment'), layer.layout.get('text-keep-upright'), stencilMode, colorMode);
|
44049 | }
|
44050 | if (sourceCache.map.showCollisionBoxes) {
|
44051 | drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('text-translate'), layer.paint.get('text-translate-anchor'), true);
|
44052 | drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('icon-translate'), layer.paint.get('icon-translate-anchor'), false);
|
44053 | }
|
44054 | }
|
44055 | function calculateVariableRenderShift(anchor, width, height, textOffset, textBoxScale, renderTextSize) {
|
44056 | const { horizontalAlign, verticalAlign } = performance.getAnchorAlignment(anchor);
|
44057 | const shiftX = -(horizontalAlign - 0.5) * width;
|
44058 | const shiftY = -(verticalAlign - 0.5) * height;
|
44059 | const variableOffset = performance.evaluateVariableOffset(anchor, textOffset);
|
44060 | return new performance.pointGeometry((shiftX / textBoxScale + variableOffset[0]) * renderTextSize, (shiftY / textBoxScale + variableOffset[1]) * renderTextSize);
|
44061 | }
|
44062 | function updateVariableAnchors(coords, painter, layer, sourceCache, rotationAlignment, pitchAlignment, variableOffsets) {
|
44063 | const tr = painter.transform;
|
44064 | const rotateWithMap = rotationAlignment === 'map';
|
44065 | const pitchWithMap = pitchAlignment === 'map';
|
44066 | for (const coord of coords) {
|
44067 | const tile = sourceCache.getTile(coord);
|
44068 | const bucket = tile.getBucket(layer);
|
44069 | if (!bucket || !bucket.text || !bucket.text.segments.get().length)
|
44070 | continue;
|
44071 | const sizeData = bucket.textSizeData;
|
44072 | const size = performance.evaluateSizeForZoom(sizeData, tr.zoom);
|
44073 | const pixelToTileScale = pixelsToTileUnits(tile, 1, painter.transform.zoom);
|
44074 | const labelPlaneMatrix = getLabelPlaneMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, pixelToTileScale);
|
44075 | const updateTextFitIcon = layer.layout.get('icon-text-fit') !== 'none' && bucket.hasIconData();
|
44076 | if (size) {
|
44077 | const tileScale = Math.pow(2, tr.zoom - tile.tileID.overscaledZ);
|
44078 | updateVariableAnchorsForBucket(bucket, rotateWithMap, pitchWithMap, variableOffsets, tr, labelPlaneMatrix, coord.posMatrix, tileScale, size, updateTextFitIcon);
|
44079 | }
|
44080 | }
|
44081 | }
|
44082 | function updateVariableAnchorsForBucket(bucket, rotateWithMap, pitchWithMap, variableOffsets, transform, labelPlaneMatrix, posMatrix, tileScale, size, updateTextFitIcon) {
|
44083 | const placedSymbols = bucket.text.placedSymbolArray;
|
44084 | const dynamicTextLayoutVertexArray = bucket.text.dynamicLayoutVertexArray;
|
44085 | const dynamicIconLayoutVertexArray = bucket.icon.dynamicLayoutVertexArray;
|
44086 | const placedTextShifts = {};
|
44087 | dynamicTextLayoutVertexArray.clear();
|
44088 | for (let s = 0; s < placedSymbols.length; s++) {
|
44089 | const symbol = placedSymbols.get(s);
|
44090 | const skipOrientation = bucket.allowVerticalPlacement && !symbol.placedOrientation;
|
44091 | const variableOffset = (!symbol.hidden && symbol.crossTileID && !skipOrientation) ? variableOffsets[symbol.crossTileID] : null;
|
44092 | if (!variableOffset) {
|
44093 | // These symbols are from a justification that is not being used, or a label that wasn't placed
|
44094 | // so we don't need to do the extra math to figure out what incremental shift to apply.
|
44095 | hideGlyphs(symbol.numGlyphs, dynamicTextLayoutVertexArray);
|
44096 | }
|
44097 | else {
|
44098 | const tileAnchor = new performance.pointGeometry(symbol.anchorX, symbol.anchorY);
|
44099 | const projectedAnchor = project(tileAnchor, pitchWithMap ? posMatrix : labelPlaneMatrix);
|
44100 | const perspectiveRatio = getPerspectiveRatio(transform.cameraToCenterDistance, projectedAnchor.signedDistanceFromCamera);
|
44101 | let renderTextSize = performance.evaluateSizeForFeature(bucket.textSizeData, size, symbol) * perspectiveRatio / performance.ONE_EM;
|
44102 | if (pitchWithMap) {
|
44103 | // Go from size in pixels to equivalent size in tile units
|
44104 | renderTextSize *= bucket.tilePixelRatio / tileScale;
|
44105 | }
|
44106 | const { width, height, anchor, textOffset, textBoxScale } = variableOffset;
|
44107 | const shift = calculateVariableRenderShift(anchor, width, height, textOffset, textBoxScale, renderTextSize);
|
44108 | // Usual case is that we take the projected anchor and add the pixel-based shift
|
44109 | // calculated above. In the (somewhat weird) case of pitch-aligned text, we add an equivalent
|
44110 | // tile-unit based shift to the anchor before projecting to the label plane.
|
44111 | const shiftedAnchor = pitchWithMap ?
|
44112 | project(tileAnchor.add(shift), labelPlaneMatrix).point :
|
44113 | projectedAnchor.point.add(rotateWithMap ?
|
44114 | shift.rotate(-transform.angle) :
|
44115 | shift);
|
44116 | const angle = (bucket.allowVerticalPlacement && symbol.placedOrientation === performance.WritingMode.vertical) ? Math.PI / 2 : 0;
|
44117 | for (let g = 0; g < symbol.numGlyphs; g++) {
|
44118 | performance.addDynamicAttributes(dynamicTextLayoutVertexArray, shiftedAnchor, angle);
|
44119 | }
|
44120 | //Only offset horizontal text icons
|
44121 | if (updateTextFitIcon && symbol.associatedIconIndex >= 0) {
|
44122 | placedTextShifts[symbol.associatedIconIndex] = { shiftedAnchor, angle };
|
44123 | }
|
44124 | }
|
44125 | }
|
44126 | if (updateTextFitIcon) {
|
44127 | dynamicIconLayoutVertexArray.clear();
|
44128 | const placedIcons = bucket.icon.placedSymbolArray;
|
44129 | for (let i = 0; i < placedIcons.length; i++) {
|
44130 | const placedIcon = placedIcons.get(i);
|
44131 | if (placedIcon.hidden) {
|
44132 | hideGlyphs(placedIcon.numGlyphs, dynamicIconLayoutVertexArray);
|
44133 | }
|
44134 | else {
|
44135 | const shift = placedTextShifts[i];
|
44136 | if (!shift) {
|
44137 | hideGlyphs(placedIcon.numGlyphs, dynamicIconLayoutVertexArray);
|
44138 | }
|
44139 | else {
|
44140 | for (let g = 0; g < placedIcon.numGlyphs; g++) {
|
44141 | performance.addDynamicAttributes(dynamicIconLayoutVertexArray, shift.shiftedAnchor, shift.angle);
|
44142 | }
|
44143 | }
|
44144 | }
|
44145 | }
|
44146 | bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicIconLayoutVertexArray);
|
44147 | }
|
44148 | bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicTextLayoutVertexArray);
|
44149 | }
|
44150 | function getSymbolProgramName(isSDF, isText, bucket) {
|
44151 | if (bucket.iconsInText && isText) {
|
44152 | return 'symbolTextAndIcon';
|
44153 | }
|
44154 | else if (isSDF) {
|
44155 | return 'symbolSDF';
|
44156 | }
|
44157 | else {
|
44158 | return 'symbolIcon';
|
44159 | }
|
44160 | }
|
44161 | function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate, translateAnchor, rotationAlignment, pitchAlignment, keepUpright, stencilMode, colorMode) {
|
44162 | const context = painter.context;
|
44163 | const gl = context.gl;
|
44164 | const tr = painter.transform;
|
44165 | const rotateWithMap = rotationAlignment === 'map';
|
44166 | const pitchWithMap = pitchAlignment === 'map';
|
44167 | const alongLine = rotationAlignment !== 'viewport' && layer.layout.get('symbol-placement') !== 'point';
|
44168 | // Line label rotation happens in `updateLineLabels`
|
44169 | // Pitched point labels are automatically rotated by the labelPlaneMatrix projection
|
44170 | // Unpitched point labels need to have their rotation applied after projection
|
44171 | const rotateInShader = rotateWithMap && !pitchWithMap && !alongLine;
|
44172 | const hasSortKey = !layer.layout.get('symbol-sort-key').isConstant();
|
44173 | let sortFeaturesByKey = false;
|
44174 | const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);
|
44175 | const variablePlacement = layer.layout.get('text-variable-anchor');
|
44176 | const tileRenderState = [];
|
44177 | for (const coord of coords) {
|
44178 | const tile = sourceCache.getTile(coord);
|
44179 | const bucket = tile.getBucket(layer);
|
44180 | if (!bucket)
|
44181 | continue;
|
44182 | const buffers = isText ? bucket.text : bucket.icon;
|
44183 | if (!buffers || !buffers.segments.get().length)
|
44184 | continue;
|
44185 | const programConfiguration = buffers.programConfigurations.get(layer.id);
|
44186 | const isSDF = isText || bucket.sdfIcons;
|
44187 | const sizeData = isText ? bucket.textSizeData : bucket.iconSizeData;
|
44188 | const transformed = pitchWithMap || tr.pitch !== 0;
|
44189 | const program = painter.useProgram(getSymbolProgramName(isSDF, isText, bucket), programConfiguration);
|
44190 | const size = performance.evaluateSizeForZoom(sizeData, tr.zoom);
|
44191 | let texSize;
|
44192 | let texSizeIcon = [0, 0];
|
44193 | let atlasTexture;
|
44194 | let atlasInterpolation;
|
44195 | let atlasTextureIcon = null;
|
44196 | let atlasInterpolationIcon;
|
44197 | if (isText) {
|
44198 | atlasTexture = tile.glyphAtlasTexture;
|
44199 | atlasInterpolation = gl.LINEAR;
|
44200 | texSize = tile.glyphAtlasTexture.size;
|
44201 | if (bucket.iconsInText) {
|
44202 | texSizeIcon = tile.imageAtlasTexture.size;
|
44203 | atlasTextureIcon = tile.imageAtlasTexture;
|
44204 | const zoomDependentSize = sizeData.kind === 'composite' || sizeData.kind === 'camera';
|
44205 | atlasInterpolationIcon = transformed || painter.options.rotating || painter.options.zooming || zoomDependentSize ? gl.LINEAR : gl.NEAREST;
|
44206 | }
|
44207 | }
|
44208 | else {
|
44209 | const iconScaled = layer.layout.get('icon-size').constantOr(0) !== 1 || bucket.iconsNeedLinear;
|
44210 | atlasTexture = tile.imageAtlasTexture;
|
44211 | atlasInterpolation = isSDF || painter.options.rotating || painter.options.zooming || iconScaled || transformed ?
|
44212 | gl.LINEAR :
|
44213 | gl.NEAREST;
|
44214 | texSize = tile.imageAtlasTexture.size;
|
44215 | }
|
44216 | const s = pixelsToTileUnits(tile, 1, painter.transform.zoom);
|
44217 | const labelPlaneMatrix = getLabelPlaneMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s);
|
44218 | const glCoordMatrix = getGlCoordMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s);
|
44219 | const hasVariableAnchors = variablePlacement && bucket.hasTextData();
|
44220 | const updateTextFitIcon = layer.layout.get('icon-text-fit') !== 'none' &&
|
44221 | hasVariableAnchors &&
|
44222 | bucket.hasIconData();
|
44223 | if (alongLine) {
|
44224 | const rotateToLine = layer.layout.get('text-rotation-alignment') === 'map';
|
44225 | updateLineLabels(bucket, coord.posMatrix, painter, isText, labelPlaneMatrix, glCoordMatrix, pitchWithMap, keepUpright, rotateToLine);
|
44226 | }
|
44227 | const matrix = painter.translatePosMatrix(coord.posMatrix, tile, translate, translateAnchor), uLabelPlaneMatrix = (alongLine || (isText && variablePlacement) || updateTextFitIcon) ? identityMat4 : labelPlaneMatrix, uglCoordMatrix = painter.translatePosMatrix(glCoordMatrix, tile, translate, translateAnchor, true);
|
44228 | const hasHalo = isSDF && layer.paint.get(isText ? 'text-halo-width' : 'icon-halo-width').constantOr(1) !== 0;
|
44229 | let uniformValues;
|
44230 | if (isSDF) {
|
44231 | if (!bucket.iconsInText) {
|
44232 | uniformValues = symbolSDFUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, isText, texSize, true);
|
44233 | }
|
44234 | else {
|
44235 | uniformValues = symbolTextAndIconUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, texSize, texSizeIcon);
|
44236 | }
|
44237 | }
|
44238 | else {
|
44239 | uniformValues = symbolIconUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, isText, texSize);
|
44240 | }
|
44241 | const state = {
|
44242 | program,
|
44243 | buffers,
|
44244 | uniformValues,
|
44245 | atlasTexture,
|
44246 | atlasTextureIcon,
|
44247 | atlasInterpolation,
|
44248 | atlasInterpolationIcon,
|
44249 | isSDF,
|
44250 | hasHalo
|
44251 | };
|
44252 | if (hasSortKey && bucket.canOverlap) {
|
44253 | sortFeaturesByKey = true;
|
44254 | const oldSegments = buffers.segments.get();
|
44255 | for (const segment of oldSegments) {
|
44256 | tileRenderState.push({
|
44257 | segments: new performance.SegmentVector([segment]),
|
44258 | sortKey: segment.sortKey,
|
44259 | state
|
44260 | });
|
44261 | }
|
44262 | }
|
44263 | else {
|
44264 | tileRenderState.push({
|
44265 | segments: buffers.segments,
|
44266 | sortKey: 0,
|
44267 | state
|
44268 | });
|
44269 | }
|
44270 | }
|
44271 | if (sortFeaturesByKey) {
|
44272 | tileRenderState.sort((a, b) => a.sortKey - b.sortKey);
|
44273 | }
|
44274 | for (const segmentState of tileRenderState) {
|
44275 | const state = segmentState.state;
|
44276 | context.activeTexture.set(gl.TEXTURE0);
|
44277 | state.atlasTexture.bind(state.atlasInterpolation, gl.CLAMP_TO_EDGE);
|
44278 | if (state.atlasTextureIcon) {
|
44279 | context.activeTexture.set(gl.TEXTURE1);
|
44280 | if (state.atlasTextureIcon) {
|
44281 | state.atlasTextureIcon.bind(state.atlasInterpolationIcon, gl.CLAMP_TO_EDGE);
|
44282 | }
|
44283 | }
|
44284 | if (state.isSDF) {
|
44285 | const uniformValues = state.uniformValues;
|
44286 | if (state.hasHalo) {
|
44287 | uniformValues['u_is_halo'] = 1;
|
44288 | drawSymbolElements(state.buffers, segmentState.segments, layer, painter, state.program, depthMode, stencilMode, colorMode, uniformValues);
|
44289 | }
|
44290 | uniformValues['u_is_halo'] = 0;
|
44291 | }
|
44292 | drawSymbolElements(state.buffers, segmentState.segments, layer, painter, state.program, depthMode, stencilMode, colorMode, state.uniformValues);
|
44293 | }
|
44294 | }
|
44295 | function drawSymbolElements(buffers, segments, layer, painter, program, depthMode, stencilMode, colorMode, uniformValues) {
|
44296 | const context = painter.context;
|
44297 | const gl = context.gl;
|
44298 | program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, segments, layer.paint, painter.transform.zoom, buffers.programConfigurations.get(layer.id), buffers.dynamicLayoutVertexBuffer, buffers.opacityVertexBuffer);
|
44299 | }
|
44300 |
|
44301 | function drawCircles(painter, sourceCache, layer, coords) {
|
44302 | if (painter.renderPass !== 'translucent')
|
44303 | return;
|
44304 | const opacity = layer.paint.get('circle-opacity');
|
44305 | const strokeWidth = layer.paint.get('circle-stroke-width');
|
44306 | const strokeOpacity = layer.paint.get('circle-stroke-opacity');
|
44307 | const sortFeaturesByKey = !layer.layout.get('circle-sort-key').isConstant();
|
44308 | if (opacity.constantOr(1) === 0 && (strokeWidth.constantOr(1) === 0 || strokeOpacity.constantOr(1) === 0)) {
|
44309 | return;
|
44310 | }
|
44311 | const context = painter.context;
|
44312 | const gl = context.gl;
|
44313 | const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);
|
44314 | // Turn off stencil testing to allow circles to be drawn across boundaries,
|
44315 | // so that large circles are not clipped to tiles
|
44316 | const stencilMode = StencilMode.disabled;
|
44317 | const colorMode = painter.colorModeForRenderPass();
|
44318 | const segmentsRenderStates = [];
|
44319 | for (let i = 0; i < coords.length; i++) {
|
44320 | const coord = coords[i];
|
44321 | const tile = sourceCache.getTile(coord);
|
44322 | const bucket = tile.getBucket(layer);
|
44323 | if (!bucket)
|
44324 | continue;
|
44325 | const programConfiguration = bucket.programConfigurations.get(layer.id);
|
44326 | const program = painter.useProgram('circle', programConfiguration);
|
44327 | const layoutVertexBuffer = bucket.layoutVertexBuffer;
|
44328 | const indexBuffer = bucket.indexBuffer;
|
44329 | const uniformValues = circleUniformValues(painter, coord, tile, layer);
|
44330 | const state = {
|
44331 | programConfiguration,
|
44332 | program,
|
44333 | layoutVertexBuffer,
|
44334 | indexBuffer,
|
44335 | uniformValues,
|
44336 | };
|
44337 | if (sortFeaturesByKey) {
|
44338 | const oldSegments = bucket.segments.get();
|
44339 | for (const segment of oldSegments) {
|
44340 | segmentsRenderStates.push({
|
44341 | segments: new performance.SegmentVector([segment]),
|
44342 | sortKey: segment.sortKey,
|
44343 | state
|
44344 | });
|
44345 | }
|
44346 | }
|
44347 | else {
|
44348 | segmentsRenderStates.push({
|
44349 | segments: bucket.segments,
|
44350 | sortKey: 0,
|
44351 | state
|
44352 | });
|
44353 | }
|
44354 | }
|
44355 | if (sortFeaturesByKey) {
|
44356 | segmentsRenderStates.sort((a, b) => a.sortKey - b.sortKey);
|
44357 | }
|
44358 | for (const segmentsState of segmentsRenderStates) {
|
44359 | const { programConfiguration, program, layoutVertexBuffer, indexBuffer, uniformValues } = segmentsState.state;
|
44360 | const segments = segmentsState.segments;
|
44361 | program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, layoutVertexBuffer, indexBuffer, segments, layer.paint, painter.transform.zoom, programConfiguration);
|
44362 | }
|
44363 | }
|
44364 |
|
44365 | function drawHeatmap(painter, sourceCache, layer, coords) {
|
44366 | if (layer.paint.get('heatmap-opacity') === 0) {
|
44367 | return;
|
44368 | }
|
44369 | if (painter.renderPass === 'offscreen') {
|
44370 | const context = painter.context;
|
44371 | const gl = context.gl;
|
44372 | // Allow kernels to be drawn across boundaries, so that
|
44373 | // large kernels are not clipped to tiles
|
44374 | const stencilMode = StencilMode.disabled;
|
44375 | // Turn on additive blending for kernels, which is a key aspect of kernel density estimation formula
|
44376 | const colorMode = new ColorMode([gl.ONE, gl.ONE], performance.Color.transparent, [true, true, true, true]);
|
44377 | bindFramebuffer(context, painter, layer);
|
44378 | context.clear({ color: performance.Color.transparent });
|
44379 | for (let i = 0; i < coords.length; i++) {
|
44380 | const coord = coords[i];
|
44381 | // Skip tiles that have uncovered parents to avoid flickering; we don't need
|
44382 | // to use complex tile masking here because the change between zoom levels is subtle,
|
44383 | // so it's fine to simply render the parent until all its 4 children are loaded
|
44384 | if (sourceCache.hasRenderableParent(coord))
|
44385 | continue;
|
44386 | const tile = sourceCache.getTile(coord);
|
44387 | const bucket = tile.getBucket(layer);
|
44388 | if (!bucket)
|
44389 | continue;
|
44390 | const programConfiguration = bucket.programConfigurations.get(layer.id);
|
44391 | const program = painter.useProgram('heatmap', programConfiguration);
|
44392 | const { zoom } = painter.transform;
|
44393 | program.draw(context, gl.TRIANGLES, DepthMode.disabled, stencilMode, colorMode, CullFaceMode.disabled, heatmapUniformValues(coord.posMatrix, tile, zoom, layer.paint.get('heatmap-intensity')), layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration);
|
44394 | }
|
44395 | context.viewport.set([0, 0, painter.width, painter.height]);
|
44396 | }
|
44397 | else if (painter.renderPass === 'translucent') {
|
44398 | painter.context.setColorMode(painter.colorModeForRenderPass());
|
44399 | renderTextureToMap(painter, layer);
|
44400 | }
|
44401 | }
|
44402 | function bindFramebuffer(context, painter, layer) {
|
44403 | const gl = context.gl;
|
44404 | context.activeTexture.set(gl.TEXTURE1);
|
44405 | // Use a 4x downscaled screen texture for better performance
|
44406 | context.viewport.set([0, 0, painter.width / 4, painter.height / 4]);
|
44407 | let fbo = layer.heatmapFbo;
|
44408 | if (!fbo) {
|
44409 | const texture = gl.createTexture();
|
44410 | gl.bindTexture(gl.TEXTURE_2D, texture);
|
44411 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
44412 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
44413 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
44414 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
44415 | fbo = layer.heatmapFbo = context.createFramebuffer(painter.width / 4, painter.height / 4, false);
|
44416 | bindTextureToFramebuffer(context, painter, texture, fbo);
|
44417 | }
|
44418 | else {
|
44419 | gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get());
|
44420 | context.bindFramebuffer.set(fbo.framebuffer);
|
44421 | }
|
44422 | }
|
44423 | function bindTextureToFramebuffer(context, painter, texture, fbo) {
|
44424 | const gl = context.gl;
|
44425 | // Use the higher precision half-float texture where available (producing much smoother looking heatmaps);
|
44426 | // Otherwise, fall back to a low precision texture
|
44427 | const internalFormat = context.extRenderToTextureHalfFloat ? context.extTextureHalfFloat.HALF_FLOAT_OES : gl.UNSIGNED_BYTE;
|
44428 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, painter.width / 4, painter.height / 4, 0, gl.RGBA, internalFormat, null);
|
44429 | fbo.colorAttachment.set(texture);
|
44430 | }
|
44431 | function renderTextureToMap(painter, layer) {
|
44432 | const context = painter.context;
|
44433 | const gl = context.gl;
|
44434 | // Here we bind two different textures from which we'll sample in drawing
|
44435 | // heatmaps: the kernel texture, prepared in the offscreen pass, and a
|
44436 | // color ramp texture.
|
44437 | const fbo = layer.heatmapFbo;
|
44438 | if (!fbo)
|
44439 | return;
|
44440 | context.activeTexture.set(gl.TEXTURE0);
|
44441 | gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get());
|
44442 | context.activeTexture.set(gl.TEXTURE1);
|
44443 | let colorRampTexture = layer.colorRampTexture;
|
44444 | if (!colorRampTexture) {
|
44445 | colorRampTexture = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA);
|
44446 | }
|
44447 | colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
|
44448 | painter.useProgram('heatmapTexture').draw(context, gl.TRIANGLES, DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled, heatmapTextureUniformValues(painter, layer, 0, 1), layer.id, painter.viewportBuffer, painter.quadTriangleIndexBuffer, painter.viewportSegments, layer.paint, painter.transform.zoom);
|
44449 | }
|
44450 |
|
44451 | function drawLine(painter, sourceCache, layer, coords) {
|
44452 | if (painter.renderPass !== 'translucent')
|
44453 | return;
|
44454 | const opacity = layer.paint.get('line-opacity');
|
44455 | const width = layer.paint.get('line-width');
|
44456 | if (opacity.constantOr(1) === 0 || width.constantOr(1) === 0)
|
44457 | return;
|
44458 | const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);
|
44459 | const colorMode = painter.colorModeForRenderPass();
|
44460 | const dasharray = layer.paint.get('line-dasharray');
|
44461 | const patternProperty = layer.paint.get('line-pattern');
|
44462 | const image = patternProperty.constantOr(1);
|
44463 | const gradient = layer.paint.get('line-gradient');
|
44464 | const crossfade = layer.getCrossfadeParameters();
|
44465 | const programId = image ? 'linePattern' :
|
44466 | dasharray ? 'lineSDF' :
|
44467 | gradient ? 'lineGradient' : 'line';
|
44468 | const context = painter.context;
|
44469 | const gl = context.gl;
|
44470 | let firstTile = true;
|
44471 | for (const coord of coords) {
|
44472 | const tile = sourceCache.getTile(coord);
|
44473 | if (image && !tile.patternsLoaded())
|
44474 | continue;
|
44475 | const bucket = tile.getBucket(layer);
|
44476 | if (!bucket)
|
44477 | continue;
|
44478 | const programConfiguration = bucket.programConfigurations.get(layer.id);
|
44479 | const prevProgram = painter.context.program.get();
|
44480 | const program = painter.useProgram(programId, programConfiguration);
|
44481 | const programChanged = firstTile || program.program !== prevProgram;
|
44482 | const constantPattern = patternProperty.constantOr(null);
|
44483 | if (constantPattern && tile.imageAtlas) {
|
44484 | const atlas = tile.imageAtlas;
|
44485 | const posTo = atlas.patternPositions[constantPattern.to.toString()];
|
44486 | const posFrom = atlas.patternPositions[constantPattern.from.toString()];
|
44487 | if (posTo && posFrom)
|
44488 | programConfiguration.setConstantPatternPositions(posTo, posFrom);
|
44489 | }
|
44490 | const uniformValues = image ? linePatternUniformValues(painter, tile, layer, crossfade) :
|
44491 | dasharray ? lineSDFUniformValues(painter, tile, layer, dasharray, crossfade) :
|
44492 | gradient ? lineGradientUniformValues(painter, tile, layer, bucket.lineClipsArray.length) :
|
44493 | lineUniformValues(painter, tile, layer);
|
44494 | if (image) {
|
44495 | context.activeTexture.set(gl.TEXTURE0);
|
44496 | tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
|
44497 | programConfiguration.updatePaintBuffers(crossfade);
|
44498 | }
|
44499 | else if (dasharray && (programChanged || painter.lineAtlas.dirty)) {
|
44500 | context.activeTexture.set(gl.TEXTURE0);
|
44501 | painter.lineAtlas.bind(context);
|
44502 | }
|
44503 | else if (gradient) {
|
44504 | const layerGradient = bucket.gradients[layer.id];
|
44505 | let gradientTexture = layerGradient.texture;
|
44506 | if (layer.gradientVersion !== layerGradient.version) {
|
44507 | let textureResolution = 256;
|
44508 | if (layer.stepInterpolant) {
|
44509 | const sourceMaxZoom = sourceCache.getSource().maxzoom;
|
44510 | const potentialOverzoom = coord.canonical.z === sourceMaxZoom ?
|
44511 | Math.ceil(1 << (painter.transform.maxZoom - coord.canonical.z)) : 1;
|
44512 | const lineLength = bucket.maxLineLength / performance.EXTENT;
|
44513 | // Logical pixel tile size is 512px, and 1024px right before current zoom + 1
|
44514 | const maxTilePixelSize = 1024;
|
44515 | // Maximum possible texture coverage heuristic, bound by hardware max texture size
|
44516 | const maxTextureCoverage = lineLength * maxTilePixelSize * potentialOverzoom;
|
44517 | textureResolution = performance.clamp(performance.nextPowerOfTwo(maxTextureCoverage), 256, context.maxTextureSize);
|
44518 | }
|
44519 | layerGradient.gradient = performance.renderColorRamp({
|
44520 | expression: layer.gradientExpression(),
|
44521 | evaluationKey: 'lineProgress',
|
44522 | resolution: textureResolution,
|
44523 | image: layerGradient.gradient || undefined,
|
44524 | clips: bucket.lineClipsArray
|
44525 | });
|
44526 | if (layerGradient.texture) {
|
44527 | layerGradient.texture.update(layerGradient.gradient);
|
44528 | }
|
44529 | else {
|
44530 | layerGradient.texture = new Texture(context, layerGradient.gradient, gl.RGBA);
|
44531 | }
|
44532 | layerGradient.version = layer.gradientVersion;
|
44533 | gradientTexture = layerGradient.texture;
|
44534 | }
|
44535 | context.activeTexture.set(gl.TEXTURE0);
|
44536 | gradientTexture.bind(layer.stepInterpolant ? gl.NEAREST : gl.LINEAR, gl.CLAMP_TO_EDGE);
|
44537 | }
|
44538 | program.draw(context, gl.TRIANGLES, depthMode, painter.stencilModeForClipping(coord), colorMode, CullFaceMode.disabled, uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration, bucket.layoutVertexBuffer2);
|
44539 | firstTile = false;
|
44540 | // once refactored so that bound texture state is managed, we'll also be able to remove this firstTile/programChanged logic
|
44541 | }
|
44542 | }
|
44543 |
|
44544 | function drawFill(painter, sourceCache, layer, coords) {
|
44545 | const color = layer.paint.get('fill-color');
|
44546 | const opacity = layer.paint.get('fill-opacity');
|
44547 | if (opacity.constantOr(1) === 0) {
|
44548 | return;
|
44549 | }
|
44550 | const colorMode = painter.colorModeForRenderPass();
|
44551 | const pattern = layer.paint.get('fill-pattern');
|
44552 | const pass = painter.opaquePassEnabledForLayer() &&
|
44553 | (!pattern.constantOr(1) &&
|
44554 | color.constantOr(performance.Color.transparent).a === 1 &&
|
44555 | opacity.constantOr(0) === 1) ? 'opaque' : 'translucent';
|
44556 | // Draw fill
|
44557 | if (painter.renderPass === pass) {
|
44558 | const depthMode = painter.depthModeForSublayer(1, painter.renderPass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly);
|
44559 | drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, false);
|
44560 | }
|
44561 | // Draw stroke
|
44562 | if (painter.renderPass === 'translucent' && layer.paint.get('fill-antialias')) {
|
44563 | // If we defined a different color for the fill outline, we are
|
44564 | // going to ignore the bits in 0x07 and just care about the global
|
44565 | // clipping mask.
|
44566 | // Otherwise, we only want to drawFill the antialiased parts that are
|
44567 | // *outside* the current shape. This is important in case the fill
|
44568 | // or stroke color is translucent. If we wouldn't clip to outside
|
44569 | // the current shape, some pixels from the outline stroke overlapped
|
44570 | // the (non-antialiased) fill.
|
44571 | const depthMode = painter.depthModeForSublayer(layer.getPaintProperty('fill-outline-color') ? 2 : 0, DepthMode.ReadOnly);
|
44572 | drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, true);
|
44573 | }
|
44574 | }
|
44575 | function drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, isOutline) {
|
44576 | const gl = painter.context.gl;
|
44577 | const patternProperty = layer.paint.get('fill-pattern');
|
44578 | const image = patternProperty && patternProperty.constantOr(1);
|
44579 | const crossfade = layer.getCrossfadeParameters();
|
44580 | let drawMode, programName, uniformValues, indexBuffer, segments;
|
44581 | if (!isOutline) {
|
44582 | programName = image ? 'fillPattern' : 'fill';
|
44583 | drawMode = gl.TRIANGLES;
|
44584 | }
|
44585 | else {
|
44586 | programName = image && !layer.getPaintProperty('fill-outline-color') ? 'fillOutlinePattern' : 'fillOutline';
|
44587 | drawMode = gl.LINES;
|
44588 | }
|
44589 | for (const coord of coords) {
|
44590 | const tile = sourceCache.getTile(coord);
|
44591 | if (image && !tile.patternsLoaded())
|
44592 | continue;
|
44593 | const bucket = tile.getBucket(layer);
|
44594 | if (!bucket)
|
44595 | continue;
|
44596 | const programConfiguration = bucket.programConfigurations.get(layer.id);
|
44597 | const program = painter.useProgram(programName, programConfiguration);
|
44598 | if (image) {
|
44599 | painter.context.activeTexture.set(gl.TEXTURE0);
|
44600 | tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
|
44601 | programConfiguration.updatePaintBuffers(crossfade);
|
44602 | }
|
44603 | const constantPattern = patternProperty.constantOr(null);
|
44604 | if (constantPattern && tile.imageAtlas) {
|
44605 | const atlas = tile.imageAtlas;
|
44606 | const posTo = atlas.patternPositions[constantPattern.to.toString()];
|
44607 | const posFrom = atlas.patternPositions[constantPattern.from.toString()];
|
44608 | if (posTo && posFrom)
|
44609 | programConfiguration.setConstantPatternPositions(posTo, posFrom);
|
44610 | }
|
44611 | const tileMatrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint.get('fill-translate'), layer.paint.get('fill-translate-anchor'));
|
44612 | if (!isOutline) {
|
44613 | indexBuffer = bucket.indexBuffer;
|
44614 | segments = bucket.segments;
|
44615 | uniformValues = image ?
|
44616 | fillPatternUniformValues(tileMatrix, painter, crossfade, tile) :
|
44617 | fillUniformValues(tileMatrix);
|
44618 | }
|
44619 | else {
|
44620 | indexBuffer = bucket.indexBuffer2;
|
44621 | segments = bucket.segments2;
|
44622 | const drawingBufferSize = [gl.drawingBufferWidth, gl.drawingBufferHeight];
|
44623 | uniformValues = (programName === 'fillOutlinePattern' && image) ?
|
44624 | fillOutlinePatternUniformValues(tileMatrix, painter, crossfade, tile, drawingBufferSize) :
|
44625 | fillOutlineUniformValues(tileMatrix, drawingBufferSize);
|
44626 | }
|
44627 | program.draw(painter.context, drawMode, depthMode, painter.stencilModeForClipping(coord), colorMode, CullFaceMode.disabled, uniformValues, layer.id, bucket.layoutVertexBuffer, indexBuffer, segments, layer.paint, painter.transform.zoom, programConfiguration);
|
44628 | }
|
44629 | }
|
44630 |
|
44631 | function draw$1(painter, source, layer, coords) {
|
44632 | const opacity = layer.paint.get('fill-extrusion-opacity');
|
44633 | if (opacity === 0) {
|
44634 | return;
|
44635 | }
|
44636 | if (painter.renderPass === 'translucent') {
|
44637 | const depthMode = new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);
|
44638 | if (opacity === 1 && !layer.paint.get('fill-extrusion-pattern').constantOr(1)) {
|
44639 | const colorMode = painter.colorModeForRenderPass();
|
44640 | drawExtrusionTiles(painter, source, layer, coords, depthMode, StencilMode.disabled, colorMode);
|
44641 | }
|
44642 | else {
|
44643 | // Draw transparent buildings in two passes so that only the closest surface is drawn.
|
44644 | // First draw all the extrusions into only the depth buffer. No colors are drawn.
|
44645 | drawExtrusionTiles(painter, source, layer, coords, depthMode, StencilMode.disabled, ColorMode.disabled);
|
44646 | // Then draw all the extrusions a second type, only coloring fragments if they have the
|
44647 | // same depth value as the closest fragment in the previous pass. Use the stencil buffer
|
44648 | // to prevent the second draw in cases where we have coincident polygons.
|
44649 | drawExtrusionTiles(painter, source, layer, coords, depthMode, painter.stencilModeFor3D(), painter.colorModeForRenderPass());
|
44650 | }
|
44651 | }
|
44652 | }
|
44653 | function drawExtrusionTiles(painter, source, layer, coords, depthMode, stencilMode, colorMode) {
|
44654 | const context = painter.context;
|
44655 | const gl = context.gl;
|
44656 | const patternProperty = layer.paint.get('fill-extrusion-pattern');
|
44657 | const image = patternProperty.constantOr(1);
|
44658 | const crossfade = layer.getCrossfadeParameters();
|
44659 | const opacity = layer.paint.get('fill-extrusion-opacity');
|
44660 | for (const coord of coords) {
|
44661 | const tile = source.getTile(coord);
|
44662 | const bucket = tile.getBucket(layer);
|
44663 | if (!bucket)
|
44664 | continue;
|
44665 | const programConfiguration = bucket.programConfigurations.get(layer.id);
|
44666 | const program = painter.useProgram(image ? 'fillExtrusionPattern' : 'fillExtrusion', programConfiguration);
|
44667 | if (image) {
|
44668 | painter.context.activeTexture.set(gl.TEXTURE0);
|
44669 | tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
|
44670 | programConfiguration.updatePaintBuffers(crossfade);
|
44671 | }
|
44672 | const constantPattern = patternProperty.constantOr(null);
|
44673 | if (constantPattern && tile.imageAtlas) {
|
44674 | const atlas = tile.imageAtlas;
|
44675 | const posTo = atlas.patternPositions[constantPattern.to.toString()];
|
44676 | const posFrom = atlas.patternPositions[constantPattern.from.toString()];
|
44677 | if (posTo && posFrom)
|
44678 | programConfiguration.setConstantPatternPositions(posTo, posFrom);
|
44679 | }
|
44680 | const matrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint.get('fill-extrusion-translate'), layer.paint.get('fill-extrusion-translate-anchor'));
|
44681 | const shouldUseVerticalGradient = layer.paint.get('fill-extrusion-vertical-gradient');
|
44682 | const uniformValues = image ?
|
44683 | fillExtrusionPatternUniformValues(matrix, painter, shouldUseVerticalGradient, opacity, coord, crossfade, tile) :
|
44684 | fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity);
|
44685 | program.draw(context, context.gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.backCCW, uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration);
|
44686 | }
|
44687 | }
|
44688 |
|
44689 | function drawHillshade(painter, sourceCache, layer, tileIDs) {
|
44690 | if (painter.renderPass !== 'offscreen' && painter.renderPass !== 'translucent')
|
44691 | return;
|
44692 | const context = painter.context;
|
44693 | const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);
|
44694 | const colorMode = painter.colorModeForRenderPass();
|
44695 | const [stencilModes, coords] = painter.renderPass === 'translucent' ?
|
44696 | painter.stencilConfigForOverlap(tileIDs) : [{}, tileIDs];
|
44697 | for (const coord of coords) {
|
44698 | const tile = sourceCache.getTile(coord);
|
44699 | if (tile.needsHillshadePrepare && painter.renderPass === 'offscreen') {
|
44700 | prepareHillshade(painter, tile, layer, depthMode, StencilMode.disabled, colorMode);
|
44701 | }
|
44702 | else if (painter.renderPass === 'translucent') {
|
44703 | renderHillshade(painter, tile, layer, depthMode, stencilModes[coord.overscaledZ], colorMode);
|
44704 | }
|
44705 | }
|
44706 | context.viewport.set([0, 0, painter.width, painter.height]);
|
44707 | }
|
44708 | function renderHillshade(painter, tile, layer, depthMode, stencilMode, colorMode) {
|
44709 | const context = painter.context;
|
44710 | const gl = context.gl;
|
44711 | const fbo = tile.fbo;
|
44712 | if (!fbo)
|
44713 | return;
|
44714 | const program = painter.useProgram('hillshade');
|
44715 | context.activeTexture.set(gl.TEXTURE0);
|
44716 | gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get());
|
44717 | const uniformValues = hillshadeUniformValues(painter, tile, layer);
|
44718 | program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments);
|
44719 | }
|
44720 | // hillshade rendering is done in two steps. the prepare step first calculates the slope of the terrain in the x and y
|
44721 | // directions for each pixel, and saves those values to a framebuffer texture in the r and g channels.
|
44722 | function prepareHillshade(painter, tile, layer, depthMode, stencilMode, colorMode) {
|
44723 | const context = painter.context;
|
44724 | const gl = context.gl;
|
44725 | const dem = tile.dem;
|
44726 | if (dem && dem.data) {
|
44727 | const tileSize = dem.dim;
|
44728 | const textureStride = dem.stride;
|
44729 | const pixelData = dem.getPixels();
|
44730 | context.activeTexture.set(gl.TEXTURE1);
|
44731 | context.pixelStoreUnpackPremultiplyAlpha.set(false);
|
44732 | tile.demTexture = tile.demTexture || painter.getTileTexture(textureStride);
|
44733 | if (tile.demTexture) {
|
44734 | const demTexture = tile.demTexture;
|
44735 | demTexture.update(pixelData, { premultiply: false });
|
44736 | demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE);
|
44737 | }
|
44738 | else {
|
44739 | tile.demTexture = new Texture(context, pixelData, gl.RGBA, { premultiply: false });
|
44740 | tile.demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE);
|
44741 | }
|
44742 | context.activeTexture.set(gl.TEXTURE0);
|
44743 | let fbo = tile.fbo;
|
44744 | if (!fbo) {
|
44745 | const renderTexture = new Texture(context, { width: tileSize, height: tileSize, data: null }, gl.RGBA);
|
44746 | renderTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
|
44747 | fbo = tile.fbo = context.createFramebuffer(tileSize, tileSize, true);
|
44748 | fbo.colorAttachment.set(renderTexture.texture);
|
44749 | }
|
44750 | context.bindFramebuffer.set(fbo.framebuffer);
|
44751 | context.viewport.set([0, 0, tileSize, tileSize]);
|
44752 | painter.useProgram('hillshadePrepare').draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, hillshadeUniformPrepareValues(tile.tileID, dem), layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments);
|
44753 | tile.needsHillshadePrepare = false;
|
44754 | }
|
44755 | }
|
44756 |
|
44757 | function drawRaster(painter, sourceCache, layer, tileIDs) {
|
44758 | if (painter.renderPass !== 'translucent')
|
44759 | return;
|
44760 | if (layer.paint.get('raster-opacity') === 0)
|
44761 | return;
|
44762 | if (!tileIDs.length)
|
44763 | return;
|
44764 | const context = painter.context;
|
44765 | const gl = context.gl;
|
44766 | const source = sourceCache.getSource();
|
44767 | const program = painter.useProgram('raster');
|
44768 | const colorMode = painter.colorModeForRenderPass();
|
44769 | const [stencilModes, coords] = source instanceof ImageSource ? [{}, tileIDs] :
|
44770 | painter.stencilConfigForOverlap(tileIDs);
|
44771 | const minTileZ = coords[coords.length - 1].overscaledZ;
|
44772 | const align = !painter.options.moving;
|
44773 | for (const coord of coords) {
|
44774 | // Set the lower zoom level to sublayer 0, and higher zoom levels to higher sublayers
|
44775 | // Use gl.LESS to prevent double drawing in areas where tiles overlap.
|
44776 | const depthMode = painter.depthModeForSublayer(coord.overscaledZ - minTileZ, layer.paint.get('raster-opacity') === 1 ? DepthMode.ReadWrite : DepthMode.ReadOnly, gl.LESS);
|
44777 | const tile = sourceCache.getTile(coord);
|
44778 | const posMatrix = painter.transform.calculatePosMatrix(coord.toUnwrapped(), align);
|
44779 | tile.registerFadeDuration(layer.paint.get('raster-fade-duration'));
|
44780 | const parentTile = sourceCache.findLoadedParent(coord, 0), fade = getFadeValues(tile, parentTile, sourceCache, layer, painter.transform);
|
44781 | let parentScaleBy, parentTL;
|
44782 | const textureFilter = layer.paint.get('raster-resampling') === 'nearest' ? gl.NEAREST : gl.LINEAR;
|
44783 | context.activeTexture.set(gl.TEXTURE0);
|
44784 | tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST);
|
44785 | context.activeTexture.set(gl.TEXTURE1);
|
44786 | if (parentTile) {
|
44787 | parentTile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST);
|
44788 | parentScaleBy = Math.pow(2, parentTile.tileID.overscaledZ - tile.tileID.overscaledZ);
|
44789 | parentTL = [tile.tileID.canonical.x * parentScaleBy % 1, tile.tileID.canonical.y * parentScaleBy % 1];
|
44790 | }
|
44791 | else {
|
44792 | tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST);
|
44793 | }
|
44794 | const uniformValues = rasterUniformValues(posMatrix, parentTL || [0, 0], parentScaleBy || 1, fade, layer);
|
44795 | if (source instanceof ImageSource) {
|
44796 | program.draw(context, gl.TRIANGLES, depthMode, StencilMode.disabled, colorMode, CullFaceMode.disabled, uniformValues, layer.id, source.boundsBuffer, painter.quadTriangleIndexBuffer, source.boundsSegments);
|
44797 | }
|
44798 | else {
|
44799 | program.draw(context, gl.TRIANGLES, depthMode, stencilModes[coord.overscaledZ], colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments);
|
44800 | }
|
44801 | }
|
44802 | }
|
44803 | function getFadeValues(tile, parentTile, sourceCache, layer, transform) {
|
44804 | const fadeDuration = layer.paint.get('raster-fade-duration');
|
44805 | if (fadeDuration > 0) {
|
44806 | const now = performance.exported.now();
|
44807 | const sinceTile = (now - tile.timeAdded) / fadeDuration;
|
44808 | const sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1;
|
44809 | const source = sourceCache.getSource();
|
44810 | const idealZ = transform.coveringZoomLevel({
|
44811 | tileSize: source.tileSize,
|
44812 | roundZoom: source.roundZoom
|
44813 | });
|
44814 | // if no parent or parent is older, fade in; if parent is younger, fade out
|
44815 | const fadeIn = !parentTile || Math.abs(parentTile.tileID.overscaledZ - idealZ) > Math.abs(tile.tileID.overscaledZ - idealZ);
|
44816 | const childOpacity = (fadeIn && tile.refreshedUponExpiration) ? 1 : performance.clamp(fadeIn ? sinceTile : 1 - sinceParent, 0, 1);
|
44817 | // we don't crossfade tiles that were just refreshed upon expiring:
|
44818 | // once they're old enough to pass the crossfading threshold
|
44819 | // (fadeDuration), unset the `refreshedUponExpiration` flag so we don't
|
44820 | // incorrectly fail to crossfade them when zooming
|
44821 | if (tile.refreshedUponExpiration && sinceTile >= 1)
|
44822 | tile.refreshedUponExpiration = false;
|
44823 | if (parentTile) {
|
44824 | return {
|
44825 | opacity: 1,
|
44826 | mix: 1 - childOpacity
|
44827 | };
|
44828 | }
|
44829 | else {
|
44830 | return {
|
44831 | opacity: childOpacity,
|
44832 | mix: 0
|
44833 | };
|
44834 | }
|
44835 | }
|
44836 | else {
|
44837 | return {
|
44838 | opacity: 1,
|
44839 | mix: 0
|
44840 | };
|
44841 | }
|
44842 | }
|
44843 |
|
44844 | function drawBackground(painter, sourceCache, layer) {
|
44845 | const color = layer.paint.get('background-color');
|
44846 | const opacity = layer.paint.get('background-opacity');
|
44847 | if (opacity === 0)
|
44848 | return;
|
44849 | const context = painter.context;
|
44850 | const gl = context.gl;
|
44851 | const transform = painter.transform;
|
44852 | const tileSize = transform.tileSize;
|
44853 | const image = layer.paint.get('background-pattern');
|
44854 | if (painter.isPatternMissing(image))
|
44855 | return;
|
44856 | const pass = (!image && color.a === 1 && opacity === 1 && painter.opaquePassEnabledForLayer()) ? 'opaque' : 'translucent';
|
44857 | if (painter.renderPass !== pass)
|
44858 | return;
|
44859 | const stencilMode = StencilMode.disabled;
|
44860 | const depthMode = painter.depthModeForSublayer(0, pass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly);
|
44861 | const colorMode = painter.colorModeForRenderPass();
|
44862 | const program = painter.useProgram(image ? 'backgroundPattern' : 'background');
|
44863 | const tileIDs = transform.coveringTiles({ tileSize });
|
44864 | if (image) {
|
44865 | context.activeTexture.set(gl.TEXTURE0);
|
44866 | painter.imageManager.bind(painter.context);
|
44867 | }
|
44868 | const crossfade = layer.getCrossfadeParameters();
|
44869 | for (const tileID of tileIDs) {
|
44870 | const matrix = painter.transform.calculatePosMatrix(tileID.toUnwrapped());
|
44871 | const uniformValues = image ?
|
44872 | backgroundPatternUniformValues(matrix, opacity, painter, image, { tileID, tileSize }, crossfade) :
|
44873 | backgroundUniformValues(matrix, opacity, color);
|
44874 | program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.tileExtentBuffer, painter.quadTriangleIndexBuffer, painter.tileExtentSegments);
|
44875 | }
|
44876 | }
|
44877 |
|
44878 | const topColor = new performance.Color(1, 0, 0, 1);
|
44879 | const btmColor = new performance.Color(0, 1, 0, 1);
|
44880 | const leftColor = new performance.Color(0, 0, 1, 1);
|
44881 | const rightColor = new performance.Color(1, 0, 1, 1);
|
44882 | const centerColor = new performance.Color(0, 1, 1, 1);
|
44883 | function drawDebugPadding(painter) {
|
44884 | const padding = painter.transform.padding;
|
44885 | const lineWidth = 3;
|
44886 | // Top
|
44887 | drawHorizontalLine(painter, painter.transform.height - (padding.top || 0), lineWidth, topColor);
|
44888 | // Bottom
|
44889 | drawHorizontalLine(painter, padding.bottom || 0, lineWidth, btmColor);
|
44890 | // Left
|
44891 | drawVerticalLine(painter, padding.left || 0, lineWidth, leftColor);
|
44892 | // Right
|
44893 | drawVerticalLine(painter, painter.transform.width - (padding.right || 0), lineWidth, rightColor);
|
44894 | // Center
|
44895 | const center = painter.transform.centerPoint;
|
44896 | drawCrosshair(painter, center.x, painter.transform.height - center.y, centerColor);
|
44897 | }
|
44898 | function drawCrosshair(painter, x, y, color) {
|
44899 | const size = 20;
|
44900 | const lineWidth = 2;
|
44901 | //Vertical line
|
44902 | drawDebugSSRect(painter, x - lineWidth / 2, y - size / 2, lineWidth, size, color);
|
44903 | //Horizontal line
|
44904 | drawDebugSSRect(painter, x - size / 2, y - lineWidth / 2, size, lineWidth, color);
|
44905 | }
|
44906 | function drawHorizontalLine(painter, y, lineWidth, color) {
|
44907 | drawDebugSSRect(painter, 0, y + lineWidth / 2, painter.transform.width, lineWidth, color);
|
44908 | }
|
44909 | function drawVerticalLine(painter, x, lineWidth, color) {
|
44910 | drawDebugSSRect(painter, x - lineWidth / 2, 0, lineWidth, painter.transform.height, color);
|
44911 | }
|
44912 | function drawDebugSSRect(painter, x, y, width, height, color) {
|
44913 | const context = painter.context;
|
44914 | const gl = context.gl;
|
44915 | gl.enable(gl.SCISSOR_TEST);
|
44916 | gl.scissor(x * painter.pixelRatio, y * painter.pixelRatio, width * painter.pixelRatio, height * painter.pixelRatio);
|
44917 | context.clear({ color });
|
44918 | gl.disable(gl.SCISSOR_TEST);
|
44919 | }
|
44920 | function drawDebug(painter, sourceCache, coords) {
|
44921 | for (let i = 0; i < coords.length; i++) {
|
44922 | drawDebugTile(painter, sourceCache, coords[i]);
|
44923 | }
|
44924 | }
|
44925 | function drawDebugTile(painter, sourceCache, coord) {
|
44926 | const context = painter.context;
|
44927 | const gl = context.gl;
|
44928 | const posMatrix = coord.posMatrix;
|
44929 | const program = painter.useProgram('debug');
|
44930 | const depthMode = DepthMode.disabled;
|
44931 | const stencilMode = StencilMode.disabled;
|
44932 | const colorMode = painter.colorModeForRenderPass();
|
44933 | const id = '$debug';
|
44934 | context.activeTexture.set(gl.TEXTURE0);
|
44935 | // Bind the empty texture for drawing outlines
|
44936 | painter.emptyTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
|
44937 | program.draw(context, gl.LINE_STRIP, depthMode, stencilMode, colorMode, CullFaceMode.disabled, debugUniformValues(posMatrix, performance.Color.red), id, painter.debugBuffer, painter.tileBorderIndexBuffer, painter.debugSegments);
|
44938 | const tileRawData = sourceCache.getTileByID(coord.key).latestRawTileData;
|
44939 | const tileByteLength = (tileRawData && tileRawData.byteLength) || 0;
|
44940 | const tileSizeKb = Math.floor(tileByteLength / 1024);
|
44941 | const tileSize = sourceCache.getTile(coord).tileSize;
|
44942 | const scaleRatio = (512 / Math.min(tileSize, 512) * (coord.overscaledZ / painter.transform.zoom)) * 0.5;
|
44943 | let tileIdText = coord.canonical.toString();
|
44944 | if (coord.overscaledZ !== coord.canonical.z) {
|
44945 | tileIdText += ` => ${coord.overscaledZ}`;
|
44946 | }
|
44947 | const tileLabel = `${tileIdText} ${tileSizeKb}kb`;
|
44948 | drawTextToOverlay(painter, tileLabel);
|
44949 | program.draw(context, gl.TRIANGLES, depthMode, stencilMode, ColorMode.alphaBlended, CullFaceMode.disabled, debugUniformValues(posMatrix, performance.Color.transparent, scaleRatio), id, painter.debugBuffer, painter.quadTriangleIndexBuffer, painter.debugSegments);
|
44950 | }
|
44951 | function drawTextToOverlay(painter, text) {
|
44952 | painter.initDebugOverlayCanvas();
|
44953 | const canvas = painter.debugOverlayCanvas;
|
44954 | const gl = painter.context.gl;
|
44955 | const ctx2d = painter.debugOverlayCanvas.getContext('2d');
|
44956 | ctx2d.clearRect(0, 0, canvas.width, canvas.height);
|
44957 | ctx2d.shadowColor = 'white';
|
44958 | ctx2d.shadowBlur = 2;
|
44959 | ctx2d.lineWidth = 1.5;
|
44960 | ctx2d.strokeStyle = 'white';
|
44961 | ctx2d.textBaseline = 'top';
|
44962 | ctx2d.font = `bold ${36}px Open Sans, sans-serif`;
|
44963 | ctx2d.fillText(text, 5, 5);
|
44964 | ctx2d.strokeText(text, 5, 5);
|
44965 | painter.debugOverlayTexture.update(canvas);
|
44966 | painter.debugOverlayTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
|
44967 | }
|
44968 |
|
44969 | function drawCustom(painter, sourceCache, layer) {
|
44970 | const context = painter.context;
|
44971 | const implementation = layer.implementation;
|
44972 | if (painter.renderPass === 'offscreen') {
|
44973 | const prerender = implementation.prerender;
|
44974 | if (prerender) {
|
44975 | painter.setCustomLayerDefaults();
|
44976 | context.setColorMode(painter.colorModeForRenderPass());
|
44977 | prerender.call(implementation, context.gl, painter.transform.customLayerMatrix());
|
44978 | context.setDirty();
|
44979 | painter.setBaseState();
|
44980 | }
|
44981 | }
|
44982 | else if (painter.renderPass === 'translucent') {
|
44983 | painter.setCustomLayerDefaults();
|
44984 | context.setColorMode(painter.colorModeForRenderPass());
|
44985 | context.setStencilMode(StencilMode.disabled);
|
44986 | const depthMode = implementation.renderingMode === '3d' ?
|
44987 | new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D) :
|
44988 | painter.depthModeForSublayer(0, DepthMode.ReadOnly);
|
44989 | context.setDepthMode(depthMode);
|
44990 | implementation.render(context.gl, painter.transform.customLayerMatrix());
|
44991 | context.setDirty();
|
44992 | painter.setBaseState();
|
44993 | context.bindFramebuffer.set(null);
|
44994 | }
|
44995 | }
|
44996 |
|
44997 | const draw = {
|
44998 | symbol: drawSymbols,
|
44999 | circle: drawCircles,
|
45000 | heatmap: drawHeatmap,
|
45001 | line: drawLine,
|
45002 | fill: drawFill,
|
45003 | 'fill-extrusion': draw$1,
|
45004 | hillshade: drawHillshade,
|
45005 | raster: drawRaster,
|
45006 | background: drawBackground,
|
45007 | debug: drawDebug,
|
45008 | custom: drawCustom
|
45009 | };
|
45010 | /**
|
45011 | * Initialize a new painter object.
|
45012 | *
|
45013 | * @param {Canvas} gl an experimental-webgl drawing context
|
45014 | * @private
|
45015 | */
|
45016 | class Painter {
|
45017 | constructor(gl, transform) {
|
45018 | this.context = new Context(gl);
|
45019 | this.transform = transform;
|
45020 | this._tileTextures = {};
|
45021 | this.setup();
|
45022 | // Within each layer there are multiple distinct z-planes that can be drawn to.
|
45023 | // This is implemented using the WebGL depth buffer.
|
45024 | this.numSublayers = SourceCache.maxUnderzooming + SourceCache.maxOverzooming + 1;
|
45025 | this.depthEpsilon = 1 / Math.pow(2, 16);
|
45026 | this.crossTileSymbolIndex = new CrossTileSymbolIndex();
|
45027 | this.gpuTimers = {};
|
45028 | }
|
45029 | /*
|
45030 | * Update the GL viewport, projection matrix, and transforms to compensate
|
45031 | * for a new width and height value.
|
45032 | */
|
45033 | resize(width, height, pixelRatio) {
|
45034 | this.width = width * pixelRatio;
|
45035 | this.height = height * pixelRatio;
|
45036 | this.pixelRatio = pixelRatio;
|
45037 | this.context.viewport.set([0, 0, this.width, this.height]);
|
45038 | if (this.style) {
|
45039 | for (const layerId of this.style._order) {
|
45040 | this.style._layers[layerId].resize();
|
45041 | }
|
45042 | }
|
45043 | }
|
45044 | setup() {
|
45045 | const context = this.context;
|
45046 | const tileExtentArray = new performance.PosArray();
|
45047 | tileExtentArray.emplaceBack(0, 0);
|
45048 | tileExtentArray.emplaceBack(performance.EXTENT, 0);
|
45049 | tileExtentArray.emplaceBack(0, performance.EXTENT);
|
45050 | tileExtentArray.emplaceBack(performance.EXTENT, performance.EXTENT);
|
45051 | this.tileExtentBuffer = context.createVertexBuffer(tileExtentArray, posAttributes.members);
|
45052 | this.tileExtentSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2);
|
45053 | const debugArray = new performance.PosArray();
|
45054 | debugArray.emplaceBack(0, 0);
|
45055 | debugArray.emplaceBack(performance.EXTENT, 0);
|
45056 | debugArray.emplaceBack(0, performance.EXTENT);
|
45057 | debugArray.emplaceBack(performance.EXTENT, performance.EXTENT);
|
45058 | this.debugBuffer = context.createVertexBuffer(debugArray, posAttributes.members);
|
45059 | this.debugSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 5);
|
45060 | const rasterBoundsArray = new performance.RasterBoundsArray();
|
45061 | rasterBoundsArray.emplaceBack(0, 0, 0, 0);
|
45062 | rasterBoundsArray.emplaceBack(performance.EXTENT, 0, performance.EXTENT, 0);
|
45063 | rasterBoundsArray.emplaceBack(0, performance.EXTENT, 0, performance.EXTENT);
|
45064 | rasterBoundsArray.emplaceBack(performance.EXTENT, performance.EXTENT, performance.EXTENT, performance.EXTENT);
|
45065 | this.rasterBoundsBuffer = context.createVertexBuffer(rasterBoundsArray, rasterBoundsAttributes.members);
|
45066 | this.rasterBoundsSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2);
|
45067 | const viewportArray = new performance.PosArray();
|
45068 | viewportArray.emplaceBack(0, 0);
|
45069 | viewportArray.emplaceBack(1, 0);
|
45070 | viewportArray.emplaceBack(0, 1);
|
45071 | viewportArray.emplaceBack(1, 1);
|
45072 | this.viewportBuffer = context.createVertexBuffer(viewportArray, posAttributes.members);
|
45073 | this.viewportSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2);
|
45074 | const tileLineStripIndices = new performance.LineStripIndexArray();
|
45075 | tileLineStripIndices.emplaceBack(0);
|
45076 | tileLineStripIndices.emplaceBack(1);
|
45077 | tileLineStripIndices.emplaceBack(3);
|
45078 | tileLineStripIndices.emplaceBack(2);
|
45079 | tileLineStripIndices.emplaceBack(0);
|
45080 | this.tileBorderIndexBuffer = context.createIndexBuffer(tileLineStripIndices);
|
45081 | const quadTriangleIndices = new performance.TriangleIndexArray();
|
45082 | quadTriangleIndices.emplaceBack(0, 1, 2);
|
45083 | quadTriangleIndices.emplaceBack(2, 1, 3);
|
45084 | this.quadTriangleIndexBuffer = context.createIndexBuffer(quadTriangleIndices);
|
45085 | this.emptyTexture = new Texture(context, {
|
45086 | width: 1,
|
45087 | height: 1,
|
45088 | data: new Uint8Array([0, 0, 0, 0])
|
45089 | }, context.gl.RGBA);
|
45090 | const gl = this.context.gl;
|
45091 | this.stencilClearMode = new StencilMode({ func: gl.ALWAYS, mask: 0 }, 0x0, 0xFF, gl.ZERO, gl.ZERO, gl.ZERO);
|
45092 | }
|
45093 | /*
|
45094 | * Reset the drawing canvas by clearing the stencil buffer so that we can draw
|
45095 | * new tiles at the same location, while retaining previously drawn pixels.
|
45096 | */
|
45097 | clearStencil() {
|
45098 | const context = this.context;
|
45099 | const gl = context.gl;
|
45100 | this.nextStencilID = 1;
|
45101 | this.currentStencilSource = undefined;
|
45102 | // As a temporary workaround for https://github.com/mapbox/mapbox-gl-js/issues/5490,
|
45103 | // pending an upstream fix, we draw a fullscreen stencil=0 clipping mask here,
|
45104 | // effectively clearing the stencil buffer: once an upstream patch lands, remove
|
45105 | // this function in favor of context.clear({ stencil: 0x0 })
|
45106 | const matrix = performance.create();
|
45107 | performance.ortho(matrix, 0, this.width, this.height, 0, 0, 1);
|
45108 | performance.scale(matrix, matrix, [gl.drawingBufferWidth, gl.drawingBufferHeight, 0]);
|
45109 | this.useProgram('clippingMask').draw(context, gl.TRIANGLES, DepthMode.disabled, this.stencilClearMode, ColorMode.disabled, CullFaceMode.disabled, clippingMaskUniformValues(matrix), '$clipping', this.viewportBuffer, this.quadTriangleIndexBuffer, this.viewportSegments);
|
45110 | }
|
45111 | _renderTileClippingMasks(layer, tileIDs) {
|
45112 | if (this.currentStencilSource === layer.source || !layer.isTileClipped() || !tileIDs || !tileIDs.length)
|
45113 | return;
|
45114 | this.currentStencilSource = layer.source;
|
45115 | const context = this.context;
|
45116 | const gl = context.gl;
|
45117 | if (this.nextStencilID + tileIDs.length > 256) {
|
45118 | // we'll run out of fresh IDs so we need to clear and start from scratch
|
45119 | this.clearStencil();
|
45120 | }
|
45121 | context.setColorMode(ColorMode.disabled);
|
45122 | context.setDepthMode(DepthMode.disabled);
|
45123 | const program = this.useProgram('clippingMask');
|
45124 | this._tileClippingMaskIDs = {};
|
45125 | for (const tileID of tileIDs) {
|
45126 | const id = this._tileClippingMaskIDs[tileID.key] = this.nextStencilID++;
|
45127 | program.draw(context, gl.TRIANGLES, DepthMode.disabled,
|
45128 | // Tests will always pass, and ref value will be written to stencil buffer.
|
45129 | new StencilMode({ func: gl.ALWAYS, mask: 0 }, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE), ColorMode.disabled, CullFaceMode.disabled, clippingMaskUniformValues(tileID.posMatrix), '$clipping', this.tileExtentBuffer, this.quadTriangleIndexBuffer, this.tileExtentSegments);
|
45130 | }
|
45131 | }
|
45132 | stencilModeFor3D() {
|
45133 | this.currentStencilSource = undefined;
|
45134 | if (this.nextStencilID + 1 > 256) {
|
45135 | this.clearStencil();
|
45136 | }
|
45137 | const id = this.nextStencilID++;
|
45138 | const gl = this.context.gl;
|
45139 | return new StencilMode({ func: gl.NOTEQUAL, mask: 0xFF }, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE);
|
45140 | }
|
45141 | stencilModeForClipping(tileID) {
|
45142 | const gl = this.context.gl;
|
45143 | return new StencilMode({ func: gl.EQUAL, mask: 0xFF }, this._tileClippingMaskIDs[tileID.key], 0x00, gl.KEEP, gl.KEEP, gl.REPLACE);
|
45144 | }
|
45145 | /*
|
45146 | * Sort coordinates by Z as drawing tiles is done in Z-descending order.
|
45147 | * All children with the same Z write the same stencil value. Children
|
45148 | * stencil values are greater than parent's. This is used only for raster
|
45149 | * and raster-dem tiles, which are already clipped to tile boundaries, to
|
45150 | * mask area of tile overlapped by children tiles.
|
45151 | * Stencil ref values continue range used in _tileClippingMaskIDs.
|
45152 | *
|
45153 | * Returns [StencilMode for tile overscaleZ map, sortedCoords].
|
45154 | */
|
45155 | stencilConfigForOverlap(tileIDs) {
|
45156 | const gl = this.context.gl;
|
45157 | const coords = tileIDs.sort((a, b) => b.overscaledZ - a.overscaledZ);
|
45158 | const minTileZ = coords[coords.length - 1].overscaledZ;
|
45159 | const stencilValues = coords[0].overscaledZ - minTileZ + 1;
|
45160 | if (stencilValues > 1) {
|
45161 | this.currentStencilSource = undefined;
|
45162 | if (this.nextStencilID + stencilValues > 256) {
|
45163 | this.clearStencil();
|
45164 | }
|
45165 | const zToStencilMode = {};
|
45166 | for (let i = 0; i < stencilValues; i++) {
|
45167 | zToStencilMode[i + minTileZ] = new StencilMode({ func: gl.GEQUAL, mask: 0xFF }, i + this.nextStencilID, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE);
|
45168 | }
|
45169 | this.nextStencilID += stencilValues;
|
45170 | return [zToStencilMode, coords];
|
45171 | }
|
45172 | return [{ [minTileZ]: StencilMode.disabled }, coords];
|
45173 | }
|
45174 | colorModeForRenderPass() {
|
45175 | const gl = this.context.gl;
|
45176 | if (this._showOverdrawInspector) {
|
45177 | const numOverdrawSteps = 8;
|
45178 | const a = 1 / numOverdrawSteps;
|
45179 | return new ColorMode([gl.CONSTANT_COLOR, gl.ONE], new performance.Color(a, a, a, 0), [true, true, true, true]);
|
45180 | }
|
45181 | else if (this.renderPass === 'opaque') {
|
45182 | return ColorMode.unblended;
|
45183 | }
|
45184 | else {
|
45185 | return ColorMode.alphaBlended;
|
45186 | }
|
45187 | }
|
45188 | depthModeForSublayer(n, mask, func) {
|
45189 | if (!this.opaquePassEnabledForLayer())
|
45190 | return DepthMode.disabled;
|
45191 | const depth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon;
|
45192 | return new DepthMode(func || this.context.gl.LEQUAL, mask, [depth, depth]);
|
45193 | }
|
45194 | /*
|
45195 | * The opaque pass and 3D layers both use the depth buffer.
|
45196 | * Layers drawn above 3D layers need to be drawn using the
|
45197 | * painter's algorithm so that they appear above 3D features.
|
45198 | * This returns true for layers that can be drawn using the
|
45199 | * opaque pass.
|
45200 | */
|
45201 | opaquePassEnabledForLayer() {
|
45202 | return this.currentLayer < this.opaquePassCutoff;
|
45203 | }
|
45204 | render(style, options) {
|
45205 | this.style = style;
|
45206 | this.options = options;
|
45207 | this.lineAtlas = style.lineAtlas;
|
45208 | this.imageManager = style.imageManager;
|
45209 | this.glyphManager = style.glyphManager;
|
45210 | this.symbolFadeChange = style.placement.symbolFadeChange(performance.exported.now());
|
45211 | this.imageManager.beginFrame();
|
45212 | const layerIds = this.style._order;
|
45213 | const sourceCaches = this.style.sourceCaches;
|
45214 | for (const id in sourceCaches) {
|
45215 | const sourceCache = sourceCaches[id];
|
45216 | if (sourceCache.used) {
|
45217 | sourceCache.prepare(this.context);
|
45218 | }
|
45219 | }
|
45220 | const coordsAscending = {};
|
45221 | const coordsDescending = {};
|
45222 | const coordsDescendingSymbol = {};
|
45223 | for (const id in sourceCaches) {
|
45224 | const sourceCache = sourceCaches[id];
|
45225 | coordsAscending[id] = sourceCache.getVisibleCoordinates();
|
45226 | coordsDescending[id] = coordsAscending[id].slice().reverse();
|
45227 | coordsDescendingSymbol[id] = sourceCache.getVisibleCoordinates(true).reverse();
|
45228 | }
|
45229 | this.opaquePassCutoff = Infinity;
|
45230 | for (let i = 0; i < layerIds.length; i++) {
|
45231 | const layerId = layerIds[i];
|
45232 | if (this.style._layers[layerId].is3D()) {
|
45233 | this.opaquePassCutoff = i;
|
45234 | break;
|
45235 | }
|
45236 | }
|
45237 | // Offscreen pass ===============================================
|
45238 | // We first do all rendering that requires rendering to a separate
|
45239 | // framebuffer, and then save those for rendering back to the map
|
45240 | // later: in doing this we avoid doing expensive framebuffer restores.
|
45241 | this.renderPass = 'offscreen';
|
45242 | for (const layerId of layerIds) {
|
45243 | const layer = this.style._layers[layerId];
|
45244 | if (!layer.hasOffscreenPass() || layer.isHidden(this.transform.zoom))
|
45245 | continue;
|
45246 | const coords = coordsDescending[layer.source];
|
45247 | if (layer.type !== 'custom' && !coords.length)
|
45248 | continue;
|
45249 | this.renderLayer(this, sourceCaches[layer.source], layer, coords);
|
45250 | }
|
45251 | // Rebind the main framebuffer now that all offscreen layers have been rendered:
|
45252 | this.context.bindFramebuffer.set(null);
|
45253 | // Clear buffers in preparation for drawing to the main framebuffer
|
45254 | this.context.clear({ color: options.showOverdrawInspector ? performance.Color.black : performance.Color.transparent, depth: 1 });
|
45255 | this.clearStencil();
|
45256 | this._showOverdrawInspector = options.showOverdrawInspector;
|
45257 | this.depthRangeFor3D = [0, 1 - ((style._order.length + 2) * this.numSublayers * this.depthEpsilon)];
|
45258 | // Opaque pass ===============================================
|
45259 | // Draw opaque layers top-to-bottom first.
|
45260 | this.renderPass = 'opaque';
|
45261 | for (this.currentLayer = layerIds.length - 1; this.currentLayer >= 0; this.currentLayer--) {
|
45262 | const layer = this.style._layers[layerIds[this.currentLayer]];
|
45263 | const sourceCache = sourceCaches[layer.source];
|
45264 | const coords = coordsAscending[layer.source];
|
45265 | this._renderTileClippingMasks(layer, coords);
|
45266 | this.renderLayer(this, sourceCache, layer, coords);
|
45267 | }
|
45268 | // Translucent pass ===============================================
|
45269 | // Draw all other layers bottom-to-top.
|
45270 | this.renderPass = 'translucent';
|
45271 | for (this.currentLayer = 0; this.currentLayer < layerIds.length; this.currentLayer++) {
|
45272 | const layer = this.style._layers[layerIds[this.currentLayer]];
|
45273 | const sourceCache = sourceCaches[layer.source];
|
45274 | // For symbol layers in the translucent pass, we add extra tiles to the renderable set
|
45275 | // for cross-tile symbol fading. Symbol layers don't use tile clipping, so no need to render
|
45276 | // separate clipping masks
|
45277 | const coords = (layer.type === 'symbol' ? coordsDescendingSymbol : coordsDescending)[layer.source];
|
45278 | this._renderTileClippingMasks(layer, coordsAscending[layer.source]);
|
45279 | this.renderLayer(this, sourceCache, layer, coords);
|
45280 | }
|
45281 | if (this.options.showTileBoundaries) {
|
45282 | //Use source with highest maxzoom
|
45283 | let selectedSource;
|
45284 | let sourceCache;
|
45285 | const layers = Object.values(this.style._layers);
|
45286 | layers.forEach((layer) => {
|
45287 | if (layer.source && !layer.isHidden(this.transform.zoom)) {
|
45288 | if (layer.source !== (sourceCache && sourceCache.id)) {
|
45289 | sourceCache = this.style.sourceCaches[layer.source];
|
45290 | }
|
45291 | if (!selectedSource || (selectedSource.getSource().maxzoom < sourceCache.getSource().maxzoom)) {
|
45292 | selectedSource = sourceCache;
|
45293 | }
|
45294 | }
|
45295 | });
|
45296 | if (selectedSource) {
|
45297 | draw.debug(this, selectedSource, selectedSource.getVisibleCoordinates());
|
45298 | }
|
45299 | }
|
45300 | if (this.options.showPadding) {
|
45301 | drawDebugPadding(this);
|
45302 | }
|
45303 | // Set defaults for most GL values so that anyone using the state after the render
|
45304 | // encounters more expected values.
|
45305 | this.context.setDefault();
|
45306 | }
|
45307 | renderLayer(painter, sourceCache, layer, coords) {
|
45308 | if (layer.isHidden(this.transform.zoom))
|
45309 | return;
|
45310 | if (layer.type !== 'background' && layer.type !== 'custom' && !coords.length)
|
45311 | return;
|
45312 | this.id = layer.id;
|
45313 | this.gpuTimingStart(layer);
|
45314 | draw[layer.type](painter, sourceCache, layer, coords, this.style.placement.variableOffsets);
|
45315 | this.gpuTimingEnd();
|
45316 | }
|
45317 | gpuTimingStart(layer) {
|
45318 | if (!this.options.gpuTiming)
|
45319 | return;
|
45320 | const ext = this.context.extTimerQuery;
|
45321 | // This tries to time the draw call itself, but note that the cost for drawing a layer
|
45322 | // may be dominated by the cost of uploading vertices to the GPU.
|
45323 | // To instrument that, we'd need to pass the layerTimers object down into the bucket
|
45324 | // uploading logic.
|
45325 | let layerTimer = this.gpuTimers[layer.id];
|
45326 | if (!layerTimer) {
|
45327 | layerTimer = this.gpuTimers[layer.id] = {
|
45328 | calls: 0,
|
45329 | cpuTime: 0,
|
45330 | query: ext.createQueryEXT()
|
45331 | };
|
45332 | }
|
45333 | layerTimer.calls++;
|
45334 | ext.beginQueryEXT(ext.TIME_ELAPSED_EXT, layerTimer.query);
|
45335 | }
|
45336 | gpuTimingEnd() {
|
45337 | if (!this.options.gpuTiming)
|
45338 | return;
|
45339 | const ext = this.context.extTimerQuery;
|
45340 | ext.endQueryEXT(ext.TIME_ELAPSED_EXT);
|
45341 | }
|
45342 | collectGpuTimers() {
|
45343 | const currentLayerTimers = this.gpuTimers;
|
45344 | this.gpuTimers = {};
|
45345 | return currentLayerTimers;
|
45346 | }
|
45347 | queryGpuTimers(gpuTimers) {
|
45348 | const layers = {};
|
45349 | for (const layerId in gpuTimers) {
|
45350 | const gpuTimer = gpuTimers[layerId];
|
45351 | const ext = this.context.extTimerQuery;
|
45352 | const gpuTime = ext.getQueryObjectEXT(gpuTimer.query, ext.QUERY_RESULT_EXT) / (1000 * 1000);
|
45353 | ext.deleteQueryEXT(gpuTimer.query);
|
45354 | layers[layerId] = gpuTime;
|
45355 | }
|
45356 | return layers;
|
45357 | }
|
45358 | /**
|
45359 | * Transform a matrix to incorporate the *-translate and *-translate-anchor properties into it.
|
45360 | * @param inViewportPixelUnitsUnits True when the units accepted by the matrix are in viewport pixels instead of tile units.
|
45361 | * @returns {mat4} matrix
|
45362 | * @private
|
45363 | */
|
45364 | translatePosMatrix(matrix, tile, translate, translateAnchor, inViewportPixelUnitsUnits) {
|
45365 | if (!translate[0] && !translate[1])
|
45366 | return matrix;
|
45367 | const angle = inViewportPixelUnitsUnits ?
|
45368 | (translateAnchor === 'map' ? this.transform.angle : 0) :
|
45369 | (translateAnchor === 'viewport' ? -this.transform.angle : 0);
|
45370 | if (angle) {
|
45371 | const sinA = Math.sin(angle);
|
45372 | const cosA = Math.cos(angle);
|
45373 | translate = [
|
45374 | translate[0] * cosA - translate[1] * sinA,
|
45375 | translate[0] * sinA + translate[1] * cosA
|
45376 | ];
|
45377 | }
|
45378 | const translation = [
|
45379 | inViewportPixelUnitsUnits ? translate[0] : pixelsToTileUnits(tile, translate[0], this.transform.zoom),
|
45380 | inViewportPixelUnitsUnits ? translate[1] : pixelsToTileUnits(tile, translate[1], this.transform.zoom),
|
45381 | 0
|
45382 | ];
|
45383 | const translatedMatrix = new Float32Array(16);
|
45384 | performance.translate(translatedMatrix, matrix, translation);
|
45385 | return translatedMatrix;
|
45386 | }
|
45387 | saveTileTexture(texture) {
|
45388 | const textures = this._tileTextures[texture.size[0]];
|
45389 | if (!textures) {
|
45390 | this._tileTextures[texture.size[0]] = [texture];
|
45391 | }
|
45392 | else {
|
45393 | textures.push(texture);
|
45394 | }
|
45395 | }
|
45396 | getTileTexture(size) {
|
45397 | const textures = this._tileTextures[size];
|
45398 | return textures && textures.length > 0 ? textures.pop() : null;
|
45399 | }
|
45400 | /**
|
45401 | * Checks whether a pattern image is needed, and if it is, whether it is not loaded.
|
45402 | *
|
45403 | * @returns true if a needed image is missing and rendering needs to be skipped.
|
45404 | * @private
|
45405 | */
|
45406 | isPatternMissing(image) {
|
45407 | if (!image)
|
45408 | return false;
|
45409 | if (!image.from || !image.to)
|
45410 | return true;
|
45411 | const imagePosA = this.imageManager.getPattern(image.from.toString());
|
45412 | const imagePosB = this.imageManager.getPattern(image.to.toString());
|
45413 | return !imagePosA || !imagePosB;
|
45414 | }
|
45415 | useProgram(name, programConfiguration) {
|
45416 | this.cache = this.cache || {};
|
45417 | const key = `${name}${programConfiguration ? programConfiguration.cacheKey : ''}${this._showOverdrawInspector ? '/overdraw' : ''}`;
|
45418 | if (!this.cache[key]) {
|
45419 | this.cache[key] = new Program(this.context, name, shaders[name], programConfiguration, programUniforms[name], this._showOverdrawInspector);
|
45420 | }
|
45421 | return this.cache[key];
|
45422 | }
|
45423 | /*
|
45424 | * Reset some GL state to default values to avoid hard-to-debug bugs
|
45425 | * in custom layers.
|
45426 | */
|
45427 | setCustomLayerDefaults() {
|
45428 | // Prevent custom layers from unintentionally modify the last VAO used.
|
45429 | // All other state is state is restored on it's own, but for VAOs it's
|
45430 | // simpler to unbind so that we don't have to track the state of VAOs.
|
45431 | this.context.unbindVAO();
|
45432 | // The default values for this state is meaningful and often expected.
|
45433 | // Leaving this state dirty could cause a lot of confusion for users.
|
45434 | this.context.cullFace.setDefault();
|
45435 | this.context.activeTexture.setDefault();
|
45436 | this.context.pixelStoreUnpack.setDefault();
|
45437 | this.context.pixelStoreUnpackPremultiplyAlpha.setDefault();
|
45438 | this.context.pixelStoreUnpackFlipY.setDefault();
|
45439 | }
|
45440 | /*
|
45441 | * Set GL state that is shared by all layers.
|
45442 | */
|
45443 | setBaseState() {
|
45444 | const gl = this.context.gl;
|
45445 | this.context.cullFace.set(false);
|
45446 | this.context.viewport.set([0, 0, this.width, this.height]);
|
45447 | this.context.blendEquation.set(gl.FUNC_ADD);
|
45448 | }
|
45449 | initDebugOverlayCanvas() {
|
45450 | if (this.debugOverlayCanvas == null) {
|
45451 | this.debugOverlayCanvas = document.createElement('canvas');
|
45452 | this.debugOverlayCanvas.width = 512;
|
45453 | this.debugOverlayCanvas.height = 512;
|
45454 | const gl = this.context.gl;
|
45455 | this.debugOverlayTexture = new Texture(this.context, this.debugOverlayCanvas, gl.RGBA);
|
45456 | }
|
45457 | }
|
45458 | destroy() {
|
45459 | this.emptyTexture.destroy();
|
45460 | if (this.debugOverlayTexture) {
|
45461 | this.debugOverlayTexture.destroy();
|
45462 | }
|
45463 | }
|
45464 | }
|
45465 |
|
45466 | class Frustum {
|
45467 | constructor(points, planes) {
|
45468 | this.points = points;
|
45469 | this.planes = planes;
|
45470 | } // eslint-disable-line
|
45471 | static fromInvProjectionMatrix(invProj, worldSize, zoom) {
|
45472 | const clipSpaceCorners = [
|
45473 | [-1, 1, -1, 1],
|
45474 | [1, 1, -1, 1],
|
45475 | [1, -1, -1, 1],
|
45476 | [-1, -1, -1, 1],
|
45477 | [-1, 1, 1, 1],
|
45478 | [1, 1, 1, 1],
|
45479 | [1, -1, 1, 1],
|
45480 | [-1, -1, 1, 1]
|
45481 | ];
|
45482 | const scale = Math.pow(2, zoom);
|
45483 | // Transform frustum corner points from clip space to tile space
|
45484 | const frustumCoords = clipSpaceCorners
|
45485 | .map(v => performance.transformMat4([], v, invProj))
|
45486 | .map(v => performance.scale$1([], v, 1.0 / v[3] / worldSize * scale));
|
45487 | const frustumPlanePointIndices = [
|
45488 | [0, 1, 2],
|
45489 | [6, 5, 4],
|
45490 | [0, 3, 7],
|
45491 | [2, 1, 5],
|
45492 | [3, 2, 6],
|
45493 | [0, 4, 5] // top
|
45494 | ];
|
45495 | const frustumPlanes = frustumPlanePointIndices.map((p) => {
|
45496 | const a = performance.sub([], frustumCoords[p[0]], frustumCoords[p[1]]);
|
45497 | const b = performance.sub([], frustumCoords[p[2]], frustumCoords[p[1]]);
|
45498 | const n = performance.normalize([], performance.cross([], a, b));
|
45499 | const d = -performance.dot(n, frustumCoords[p[1]]);
|
45500 | return n.concat(d);
|
45501 | });
|
45502 | return new Frustum(frustumCoords, frustumPlanes);
|
45503 | }
|
45504 | }
|
45505 | class Aabb {
|
45506 | constructor(min_, max_) {
|
45507 | this.min = min_;
|
45508 | this.max = max_;
|
45509 | this.center = performance.scale$2([], performance.add([], this.min, this.max), 0.5);
|
45510 | }
|
45511 | quadrant(index) {
|
45512 | const split = [(index % 2) === 0, index < 2];
|
45513 | const qMin = performance.clone$2(this.min);
|
45514 | const qMax = performance.clone$2(this.max);
|
45515 | for (let axis = 0; axis < split.length; axis++) {
|
45516 | qMin[axis] = split[axis] ? this.min[axis] : this.center[axis];
|
45517 | qMax[axis] = split[axis] ? this.center[axis] : this.max[axis];
|
45518 | }
|
45519 | // Elevation is always constant, hence quadrant.max.z = this.max.z
|
45520 | qMax[2] = this.max[2];
|
45521 | return new Aabb(qMin, qMax);
|
45522 | }
|
45523 | distanceX(point) {
|
45524 | const pointOnAabb = Math.max(Math.min(this.max[0], point[0]), this.min[0]);
|
45525 | return pointOnAabb - point[0];
|
45526 | }
|
45527 | distanceY(point) {
|
45528 | const pointOnAabb = Math.max(Math.min(this.max[1], point[1]), this.min[1]);
|
45529 | return pointOnAabb - point[1];
|
45530 | }
|
45531 | // Performs a frustum-aabb intersection test. Returns 0 if there's no intersection,
|
45532 | // 1 if shapes are intersecting and 2 if the aabb if fully inside the frustum.
|
45533 | intersects(frustum) {
|
45534 | // Execute separating axis test between two convex objects to find intersections
|
45535 | // Each frustum plane together with 3 major axes define the separating axes
|
45536 | // Note: test only 4 points as both min and max points have equal elevation
|
45537 | performance.assert(this.min[2] === 0 && this.max[2] === 0);
|
45538 | const aabbPoints = [
|
45539 | [this.min[0], this.min[1], 0.0, 1],
|
45540 | [this.max[0], this.min[1], 0.0, 1],
|
45541 | [this.max[0], this.max[1], 0.0, 1],
|
45542 | [this.min[0], this.max[1], 0.0, 1]
|
45543 | ];
|
45544 | let fullyInside = true;
|
45545 | for (let p = 0; p < frustum.planes.length; p++) {
|
45546 | const plane = frustum.planes[p];
|
45547 | let pointsInside = 0;
|
45548 | for (let i = 0; i < aabbPoints.length; i++) {
|
45549 | if (performance.dot$1(plane, aabbPoints[i]) >= 0) {
|
45550 | pointsInside++;
|
45551 | }
|
45552 | }
|
45553 | if (pointsInside === 0)
|
45554 | return 0;
|
45555 | if (pointsInside !== aabbPoints.length)
|
45556 | fullyInside = false;
|
45557 | }
|
45558 | if (fullyInside)
|
45559 | return 2;
|
45560 | for (let axis = 0; axis < 3; axis++) {
|
45561 | let projMin = Number.MAX_VALUE;
|
45562 | let projMax = -Number.MAX_VALUE;
|
45563 | for (let p = 0; p < frustum.points.length; p++) {
|
45564 | const projectedPoint = frustum.points[p][axis] - this.min[axis];
|
45565 | projMin = Math.min(projMin, projectedPoint);
|
45566 | projMax = Math.max(projMax, projectedPoint);
|
45567 | }
|
45568 | if (projMax < 0 || projMin > this.max[axis] - this.min[axis])
|
45569 | return 0;
|
45570 | }
|
45571 | return 1;
|
45572 | }
|
45573 | }
|
45574 |
|
45575 | /**
|
45576 | * An `EdgeInset` object represents screen space padding applied to the edges of the viewport.
|
45577 | * This shifts the apprent center or the vanishing point of the map. This is useful for adding floating UI elements
|
45578 | * on top of the map and having the vanishing point shift as UI elements resize.
|
45579 | *
|
45580 | * @param {number} [top=0]
|
45581 | * @param {number} [bottom=0]
|
45582 | * @param {number} [left=0]
|
45583 | * @param {number} [right=0]
|
45584 | */
|
45585 | class EdgeInsets {
|
45586 | constructor(top = 0, bottom = 0, left = 0, right = 0) {
|
45587 | if (isNaN(top) || top < 0 ||
|
45588 | isNaN(bottom) || bottom < 0 ||
|
45589 | isNaN(left) || left < 0 ||
|
45590 | isNaN(right) || right < 0) {
|
45591 | throw new Error('Invalid value for edge-insets, top, bottom, left and right must all be numbers');
|
45592 | }
|
45593 | this.top = top;
|
45594 | this.bottom = bottom;
|
45595 | this.left = left;
|
45596 | this.right = right;
|
45597 | }
|
45598 | /**
|
45599 | * Interpolates the inset in-place.
|
45600 | * This maintains the current inset value for any inset not present in `target`.
|
45601 | * @param {PaddingOptions | EdgeInsets} start interpolation start
|
45602 | * @param {PaddingOptions} target interpolation target
|
45603 | * @param {number} t interpolation step/weight
|
45604 | * @returns {EdgeInsets} the insets
|
45605 | * @memberof EdgeInsets
|
45606 | */
|
45607 | interpolate(start, target, t) {
|
45608 | if (target.top != null && start.top != null)
|
45609 | this.top = performance.number(start.top, target.top, t);
|
45610 | if (target.bottom != null && start.bottom != null)
|
45611 | this.bottom = performance.number(start.bottom, target.bottom, t);
|
45612 | if (target.left != null && start.left != null)
|
45613 | this.left = performance.number(start.left, target.left, t);
|
45614 | if (target.right != null && start.right != null)
|
45615 | this.right = performance.number(start.right, target.right, t);
|
45616 | return this;
|
45617 | }
|
45618 | /**
|
45619 | * Utility method that computes the new apprent center or vanishing point after applying insets.
|
45620 | * This is in pixels and with the top left being (0.0) and +y being downwards.
|
45621 | *
|
45622 | * @param {number} width the width
|
45623 | * @param {number} height the height
|
45624 | * @returns {Point} the point
|
45625 | * @memberof EdgeInsets
|
45626 | */
|
45627 | getCenter(width, height) {
|
45628 | // Clamp insets so they never overflow width/height and always calculate a valid center
|
45629 | const x = performance.clamp((this.left + width - this.right) / 2, 0, width);
|
45630 | const y = performance.clamp((this.top + height - this.bottom) / 2, 0, height);
|
45631 | return new performance.pointGeometry(x, y);
|
45632 | }
|
45633 | equals(other) {
|
45634 | return this.top === other.top &&
|
45635 | this.bottom === other.bottom &&
|
45636 | this.left === other.left &&
|
45637 | this.right === other.right;
|
45638 | }
|
45639 | clone() {
|
45640 | return new EdgeInsets(this.top, this.bottom, this.left, this.right);
|
45641 | }
|
45642 | /**
|
45643 | * Returns the current state as json, useful when you want to have a
|
45644 | * read-only representation of the inset.
|
45645 | *
|
45646 | * @returns {PaddingOptions} state as json
|
45647 | * @memberof EdgeInsets
|
45648 | */
|
45649 | toJSON() {
|
45650 | return {
|
45651 | top: this.top,
|
45652 | bottom: this.bottom,
|
45653 | left: this.left,
|
45654 | right: this.right
|
45655 | };
|
45656 | }
|
45657 | }
|
45658 |
|
45659 | /**
|
45660 | * A single transform, generally used for a single tile to be
|
45661 | * scaled, rotated, and zoomed.
|
45662 | * @private
|
45663 | */
|
45664 | class Transform {
|
45665 | constructor(minZoom, maxZoom, minPitch, maxPitch, renderWorldCopies) {
|
45666 | this.tileSize = 512; // constant
|
45667 | this.maxValidLatitude = 85.051129; // constant
|
45668 | this._renderWorldCopies = renderWorldCopies === undefined ? true : !!renderWorldCopies;
|
45669 | this._minZoom = minZoom || 0;
|
45670 | this._maxZoom = maxZoom || 22;
|
45671 | this._minPitch = (minPitch === undefined || minPitch === null) ? 0 : minPitch;
|
45672 | this._maxPitch = (maxPitch === undefined || maxPitch === null) ? 60 : maxPitch;
|
45673 | this.setMaxBounds();
|
45674 | this.width = 0;
|
45675 | this.height = 0;
|
45676 | this._center = new performance.LngLat(0, 0);
|
45677 | this.zoom = 0;
|
45678 | this.angle = 0;
|
45679 | this._fov = 0.6435011087932844;
|
45680 | this._pitch = 0;
|
45681 | this._unmodified = true;
|
45682 | this._edgeInsets = new EdgeInsets();
|
45683 | this._posMatrixCache = {};
|
45684 | this._alignedPosMatrixCache = {};
|
45685 | }
|
45686 | clone() {
|
45687 | const clone = new Transform(this._minZoom, this._maxZoom, this._minPitch, this.maxPitch, this._renderWorldCopies);
|
45688 | clone.tileSize = this.tileSize;
|
45689 | clone.latRange = this.latRange;
|
45690 | clone.width = this.width;
|
45691 | clone.height = this.height;
|
45692 | clone._center = this._center;
|
45693 | clone.zoom = this.zoom;
|
45694 | clone.angle = this.angle;
|
45695 | clone._fov = this._fov;
|
45696 | clone._pitch = this._pitch;
|
45697 | clone._unmodified = this._unmodified;
|
45698 | clone._edgeInsets = this._edgeInsets.clone();
|
45699 | clone._calcMatrices();
|
45700 | return clone;
|
45701 | }
|
45702 | get minZoom() { return this._minZoom; }
|
45703 | set minZoom(zoom) {
|
45704 | if (this._minZoom === zoom)
|
45705 | return;
|
45706 | this._minZoom = zoom;
|
45707 | this.zoom = Math.max(this.zoom, zoom);
|
45708 | }
|
45709 | get maxZoom() { return this._maxZoom; }
|
45710 | set maxZoom(zoom) {
|
45711 | if (this._maxZoom === zoom)
|
45712 | return;
|
45713 | this._maxZoom = zoom;
|
45714 | this.zoom = Math.min(this.zoom, zoom);
|
45715 | }
|
45716 | get minPitch() { return this._minPitch; }
|
45717 | set minPitch(pitch) {
|
45718 | if (this._minPitch === pitch)
|
45719 | return;
|
45720 | this._minPitch = pitch;
|
45721 | this.pitch = Math.max(this.pitch, pitch);
|
45722 | }
|
45723 | get maxPitch() { return this._maxPitch; }
|
45724 | set maxPitch(pitch) {
|
45725 | if (this._maxPitch === pitch)
|
45726 | return;
|
45727 | this._maxPitch = pitch;
|
45728 | this.pitch = Math.min(this.pitch, pitch);
|
45729 | }
|
45730 | get renderWorldCopies() { return this._renderWorldCopies; }
|
45731 | set renderWorldCopies(renderWorldCopies) {
|
45732 | if (renderWorldCopies === undefined) {
|
45733 | renderWorldCopies = true;
|
45734 | }
|
45735 | else if (renderWorldCopies === null) {
|
45736 | renderWorldCopies = false;
|
45737 | }
|
45738 | this._renderWorldCopies = renderWorldCopies;
|
45739 | }
|
45740 | get worldSize() {
|
45741 | return this.tileSize * this.scale;
|
45742 | }
|
45743 | get centerOffset() {
|
45744 | return this.centerPoint._sub(this.size._div(2));
|
45745 | }
|
45746 | get size() {
|
45747 | return new performance.pointGeometry(this.width, this.height);
|
45748 | }
|
45749 | get bearing() {
|
45750 | return -this.angle / Math.PI * 180;
|
45751 | }
|
45752 | set bearing(bearing) {
|
45753 | const b = -performance.wrap(bearing, -180, 180) * Math.PI / 180;
|
45754 | if (this.angle === b)
|
45755 | return;
|
45756 | this._unmodified = false;
|
45757 | this.angle = b;
|
45758 | this._calcMatrices();
|
45759 | // 2x2 matrix for rotating points
|
45760 | this.rotationMatrix = performance.create$2();
|
45761 | performance.rotate(this.rotationMatrix, this.rotationMatrix, this.angle);
|
45762 | }
|
45763 | get pitch() {
|
45764 | return this._pitch / Math.PI * 180;
|
45765 | }
|
45766 | set pitch(pitch) {
|
45767 | const p = performance.clamp(pitch, this.minPitch, this.maxPitch) / 180 * Math.PI;
|
45768 | if (this._pitch === p)
|
45769 | return;
|
45770 | this._unmodified = false;
|
45771 | this._pitch = p;
|
45772 | this._calcMatrices();
|
45773 | }
|
45774 | get fov() {
|
45775 | return this._fov / Math.PI * 180;
|
45776 | }
|
45777 | set fov(fov) {
|
45778 | fov = Math.max(0.01, Math.min(60, fov));
|
45779 | if (this._fov === fov)
|
45780 | return;
|
45781 | this._unmodified = false;
|
45782 | this._fov = fov / 180 * Math.PI;
|
45783 | this._calcMatrices();
|
45784 | }
|
45785 | get zoom() { return this._zoom; }
|
45786 | set zoom(zoom) {
|
45787 | const z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom);
|
45788 | if (this._zoom === z)
|
45789 | return;
|
45790 | this._unmodified = false;
|
45791 | this._zoom = z;
|
45792 | this.scale = this.zoomScale(z);
|
45793 | this.tileZoom = Math.floor(z);
|
45794 | this.zoomFraction = z - this.tileZoom;
|
45795 | this._constrain();
|
45796 | this._calcMatrices();
|
45797 | }
|
45798 | get center() { return this._center; }
|
45799 | set center(center) {
|
45800 | if (center.lat === this._center.lat && center.lng === this._center.lng)
|
45801 | return;
|
45802 | this._unmodified = false;
|
45803 | this._center = center;
|
45804 | this._constrain();
|
45805 | this._calcMatrices();
|
45806 | }
|
45807 | get padding() { return this._edgeInsets.toJSON(); }
|
45808 | set padding(padding) {
|
45809 | if (this._edgeInsets.equals(padding))
|
45810 | return;
|
45811 | this._unmodified = false;
|
45812 | //Update edge-insets inplace
|
45813 | this._edgeInsets.interpolate(this._edgeInsets, padding, 1);
|
45814 | this._calcMatrices();
|
45815 | }
|
45816 | /**
|
45817 | * The center of the screen in pixels with the top-left corner being (0,0)
|
45818 | * and +y axis pointing downwards. This accounts for padding.
|
45819 | *
|
45820 | * @readonly
|
45821 | * @type {Point}
|
45822 | * @memberof Transform
|
45823 | */
|
45824 | get centerPoint() {
|
45825 | return this._edgeInsets.getCenter(this.width, this.height);
|
45826 | }
|
45827 | /**
|
45828 | * Returns if the padding params match
|
45829 | *
|
45830 | * @param {PaddingOptions} padding the padding to check against
|
45831 | * @returns {boolean} true if they are equal, false otherwise
|
45832 | * @memberof Transform
|
45833 | */
|
45834 | isPaddingEqual(padding) {
|
45835 | return this._edgeInsets.equals(padding);
|
45836 | }
|
45837 | /**
|
45838 | * Helper method to upadte edge-insets inplace
|
45839 | *
|
45840 | * @param {PaddingOptions} start the starting padding
|
45841 | * @param {PaddingOptions} target the target padding
|
45842 | * @param {number} t the step/weight
|
45843 | * @memberof Transform
|
45844 | */
|
45845 | interpolatePadding(start, target, t) {
|
45846 | this._unmodified = false;
|
45847 | this._edgeInsets.interpolate(start, target, t);
|
45848 | this._constrain();
|
45849 | this._calcMatrices();
|
45850 | }
|
45851 | /**
|
45852 | * Return a zoom level that will cover all tiles the transform
|
45853 | * @param {Object} options options
|
45854 | * @param {number} options.tileSize Tile size, expressed in screen pixels.
|
45855 | * @param {boolean} options.roundZoom Target zoom level. If true, the value will be rounded to the closest integer. Otherwise the value will be floored.
|
45856 | * @returns {number} zoom level An integer zoom level at which all tiles will be visible.
|
45857 | */
|
45858 | coveringZoomLevel(options) {
|
45859 | const z = (options.roundZoom ? Math.round : Math.floor)(this.zoom + this.scaleZoom(this.tileSize / options.tileSize));
|
45860 | // At negative zoom levels load tiles from z0 because negative tile zoom levels don't exist.
|
45861 | return Math.max(0, z);
|
45862 | }
|
45863 | /**
|
45864 | * Return any "wrapped" copies of a given tile coordinate that are visible
|
45865 | * in the current view.
|
45866 | *
|
45867 | * @private
|
45868 | */
|
45869 | getVisibleUnwrappedCoordinates(tileID) {
|
45870 | const result = [new performance.UnwrappedTileID(0, tileID)];
|
45871 | if (this._renderWorldCopies) {
|
45872 | const utl = this.pointCoordinate(new performance.pointGeometry(0, 0));
|
45873 | const utr = this.pointCoordinate(new performance.pointGeometry(this.width, 0));
|
45874 | const ubl = this.pointCoordinate(new performance.pointGeometry(this.width, this.height));
|
45875 | const ubr = this.pointCoordinate(new performance.pointGeometry(0, this.height));
|
45876 | const w0 = Math.floor(Math.min(utl.x, utr.x, ubl.x, ubr.x));
|
45877 | const w1 = Math.floor(Math.max(utl.x, utr.x, ubl.x, ubr.x));
|
45878 | // Add an extra copy of the world on each side to properly render ImageSources and CanvasSources.
|
45879 | // Both sources draw outside the tile boundaries of the tile that "contains them" so we need
|
45880 | // to add extra copies on both sides in case offscreen tiles need to draw into on-screen ones.
|
45881 | const extraWorldCopy = 1;
|
45882 | for (let w = w0 - extraWorldCopy; w <= w1 + extraWorldCopy; w++) {
|
45883 | if (w === 0)
|
45884 | continue;
|
45885 | result.push(new performance.UnwrappedTileID(w, tileID));
|
45886 | }
|
45887 | }
|
45888 | return result;
|
45889 | }
|
45890 | /**
|
45891 | * Return all coordinates that could cover this transform for a covering
|
45892 | * zoom level.
|
45893 | * @param {Object} options
|
45894 | * @param {number} options.tileSize
|
45895 | * @param {number} options.minzoom
|
45896 | * @param {number} options.maxzoom
|
45897 | * @param {boolean} options.roundZoom
|
45898 | * @param {boolean} options.reparseOverscaled
|
45899 | * @param {boolean} options.renderWorldCopies
|
45900 | * @returns {Array<OverscaledTileID>} OverscaledTileIDs
|
45901 | * @private
|
45902 | */
|
45903 | coveringTiles(options) {
|
45904 | let z = this.coveringZoomLevel(options);
|
45905 | const actualZ = z;
|
45906 | if (options.minzoom !== undefined && z < options.minzoom)
|
45907 | return [];
|
45908 | if (options.maxzoom !== undefined && z > options.maxzoom)
|
45909 | z = options.maxzoom;
|
45910 | const centerCoord = performance.MercatorCoordinate.fromLngLat(this.center);
|
45911 | const numTiles = Math.pow(2, z);
|
45912 | const centerPoint = [numTiles * centerCoord.x, numTiles * centerCoord.y, 0];
|
45913 | const cameraFrustum = Frustum.fromInvProjectionMatrix(this.invProjMatrix, this.worldSize, z);
|
45914 | // No change of LOD behavior for pitch lower than 60 and when there is no top padding: return only tile ids from the requested zoom level
|
45915 | let minZoom = options.minzoom || 0;
|
45916 | // Use 0.1 as an epsilon to avoid for explicit == 0.0 floating point checks
|
45917 | if (this.pitch <= 60.0 && this._edgeInsets.top < 0.1)
|
45918 | minZoom = z;
|
45919 | // There should always be a certain number of maximum zoom level tiles surrounding the center location
|
45920 | const radiusOfMaxLvlLodInTiles = 3;
|
45921 | const newRootTile = (wrap) => {
|
45922 | return {
|
45923 | // All tiles are on zero elevation plane => z difference is zero
|
45924 | aabb: new Aabb([wrap * numTiles, 0, 0], [(wrap + 1) * numTiles, numTiles, 0]),
|
45925 | zoom: 0,
|
45926 | x: 0,
|
45927 | y: 0,
|
45928 | wrap,
|
45929 | fullyVisible: false
|
45930 | };
|
45931 | };
|
45932 | // Do a depth-first traversal to find visible tiles and proper levels of detail
|
45933 | const stack = [];
|
45934 | const result = [];
|
45935 | const maxZoom = z;
|
45936 | const overscaledZ = options.reparseOverscaled ? actualZ : z;
|
45937 | if (this._renderWorldCopies) {
|
45938 | // Render copy of the globe thrice on both sides
|
45939 | for (let i = 1; i <= 3; i++) {
|
45940 | stack.push(newRootTile(-i));
|
45941 | stack.push(newRootTile(i));
|
45942 | }
|
45943 | }
|
45944 | stack.push(newRootTile(0));
|
45945 | while (stack.length > 0) {
|
45946 | const it = stack.pop();
|
45947 | const x = it.x;
|
45948 | const y = it.y;
|
45949 | let fullyVisible = it.fullyVisible;
|
45950 | // Visibility of a tile is not required if any of its ancestor if fully inside the frustum
|
45951 | if (!fullyVisible) {
|
45952 | const intersectResult = it.aabb.intersects(cameraFrustum);
|
45953 | if (intersectResult === 0)
|
45954 | continue;
|
45955 | fullyVisible = intersectResult === 2;
|
45956 | }
|
45957 | const distanceX = it.aabb.distanceX(centerPoint);
|
45958 | const distanceY = it.aabb.distanceY(centerPoint);
|
45959 | const longestDim = Math.max(Math.abs(distanceX), Math.abs(distanceY));
|
45960 | // We're using distance based heuristics to determine if a tile should be split into quadrants or not.
|
45961 | // radiusOfMaxLvlLodInTiles defines that there's always a certain number of maxLevel tiles next to the map center.
|
45962 | // Using the fact that a parent node in quadtree is twice the size of its children (per dimension)
|
45963 | // we can define distance thresholds for each relative level:
|
45964 | // f(k) = offset + 2 + 4 + 8 + 16 + ... + 2^k. This is the same as "offset+2^(k+1)-2"
|
45965 | const distToSplit = radiusOfMaxLvlLodInTiles + (1 << (maxZoom - it.zoom)) - 2;
|
45966 | // Have we reached the target depth or is the tile too far away to be any split further?
|
45967 | if (it.zoom === maxZoom || (longestDim > distToSplit && it.zoom >= minZoom)) {
|
45968 | result.push({
|
45969 | tileID: new performance.OverscaledTileID(it.zoom === maxZoom ? overscaledZ : it.zoom, it.wrap, it.zoom, x, y),
|
45970 | distanceSq: performance.sqrLen([centerPoint[0] - 0.5 - x, centerPoint[1] - 0.5 - y])
|
45971 | });
|
45972 | continue;
|
45973 | }
|
45974 | for (let i = 0; i < 4; i++) {
|
45975 | const childX = (x << 1) + (i % 2);
|
45976 | const childY = (y << 1) + (i >> 1);
|
45977 | stack.push({ aabb: it.aabb.quadrant(i), zoom: it.zoom + 1, x: childX, y: childY, wrap: it.wrap, fullyVisible });
|
45978 | }
|
45979 | }
|
45980 | return result.sort((a, b) => a.distanceSq - b.distanceSq).map(a => a.tileID);
|
45981 | }
|
45982 | resize(width, height) {
|
45983 | this.width = width;
|
45984 | this.height = height;
|
45985 | this.pixelsToGLUnits = [2 / width, -2 / height];
|
45986 | this._constrain();
|
45987 | this._calcMatrices();
|
45988 | }
|
45989 | get unmodified() { return this._unmodified; }
|
45990 | zoomScale(zoom) { return Math.pow(2, zoom); }
|
45991 | scaleZoom(scale) { return Math.log(scale) / Math.LN2; }
|
45992 | project(lnglat) {
|
45993 | const lat = performance.clamp(lnglat.lat, -this.maxValidLatitude, this.maxValidLatitude);
|
45994 | return new performance.pointGeometry(performance.mercatorXfromLng(lnglat.lng) * this.worldSize, performance.mercatorYfromLat(lat) * this.worldSize);
|
45995 | }
|
45996 | unproject(point) {
|
45997 | return new performance.MercatorCoordinate(point.x / this.worldSize, point.y / this.worldSize).toLngLat();
|
45998 | }
|
45999 | get point() { return this.project(this.center); }
|
46000 | setLocationAtPoint(lnglat, point) {
|
46001 | const a = this.pointCoordinate(point);
|
46002 | const b = this.pointCoordinate(this.centerPoint);
|
46003 | const loc = this.locationCoordinate(lnglat);
|
46004 | const newCenter = new performance.MercatorCoordinate(loc.x - (a.x - b.x), loc.y - (a.y - b.y));
|
46005 | this.center = this.coordinateLocation(newCenter);
|
46006 | if (this._renderWorldCopies) {
|
46007 | this.center = this.center.wrap();
|
46008 | }
|
46009 | }
|
46010 | /**
|
46011 | * Given a location, return the screen point that corresponds to it
|
46012 | * @param {LngLat} lnglat location
|
46013 | * @returns {Point} screen point
|
46014 | * @private
|
46015 | */
|
46016 | locationPoint(lnglat) {
|
46017 | return this.coordinatePoint(this.locationCoordinate(lnglat));
|
46018 | }
|
46019 | /**
|
46020 | * Given a point on screen, return its lnglat
|
46021 | * @param {Point} p screen point
|
46022 | * @returns {LngLat} lnglat location
|
46023 | * @private
|
46024 | */
|
46025 | pointLocation(p) {
|
46026 | return this.coordinateLocation(this.pointCoordinate(p));
|
46027 | }
|
46028 | /**
|
46029 | * Given a geographical lnglat, return an unrounded
|
46030 | * coordinate that represents it at this transform's zoom level.
|
46031 | * @param {LngLat} lnglat
|
46032 | * @returns {Coordinate}
|
46033 | * @private
|
46034 | */
|
46035 | locationCoordinate(lnglat) {
|
46036 | return performance.MercatorCoordinate.fromLngLat(lnglat);
|
46037 | }
|
46038 | /**
|
46039 | * Given a Coordinate, return its geographical position.
|
46040 | * @param {Coordinate} coord
|
46041 | * @returns {LngLat} lnglat
|
46042 | * @private
|
46043 | */
|
46044 | coordinateLocation(coord) {
|
46045 | return coord.toLngLat();
|
46046 | }
|
46047 | pointCoordinate(p) {
|
46048 | const targetZ = 0;
|
46049 | // since we don't know the correct projected z value for the point,
|
46050 | // unproject two points to get a line and then find the point on that
|
46051 | // line with z=0
|
46052 | const coord0 = [p.x, p.y, 0, 1];
|
46053 | const coord1 = [p.x, p.y, 1, 1];
|
46054 | performance.transformMat4(coord0, coord0, this.pixelMatrixInverse);
|
46055 | performance.transformMat4(coord1, coord1, this.pixelMatrixInverse);
|
46056 | const w0 = coord0[3];
|
46057 | const w1 = coord1[3];
|
46058 | const x0 = coord0[0] / w0;
|
46059 | const x1 = coord1[0] / w1;
|
46060 | const y0 = coord0[1] / w0;
|
46061 | const y1 = coord1[1] / w1;
|
46062 | const z0 = coord0[2] / w0;
|
46063 | const z1 = coord1[2] / w1;
|
46064 | const t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0);
|
46065 | return new performance.MercatorCoordinate(performance.number(x0, x1, t) / this.worldSize, performance.number(y0, y1, t) / this.worldSize);
|
46066 | }
|
46067 | /**
|
46068 | * Given a coordinate, return the screen point that corresponds to it
|
46069 | * @param {Coordinate} coord
|
46070 | * @returns {Point} screen point
|
46071 | * @private
|
46072 | */
|
46073 | coordinatePoint(coord) {
|
46074 | const p = [coord.x * this.worldSize, coord.y * this.worldSize, 0, 1];
|
46075 | performance.transformMat4(p, p, this.pixelMatrix);
|
46076 | return new performance.pointGeometry(p[0] / p[3], p[1] / p[3]);
|
46077 | }
|
46078 | /**
|
46079 | * Returns the map's geographical bounds. When the bearing or pitch is non-zero, the visible region is not
|
46080 | * an axis-aligned rectangle, and the result is the smallest bounds that encompasses the visible region.
|
46081 | * @returns {LngLatBounds} Returns a {@link LngLatBounds} object describing the map's geographical bounds.
|
46082 | */
|
46083 | getBounds() {
|
46084 | return new performance.LngLatBounds()
|
46085 | .extend(this.pointLocation(new performance.pointGeometry(0, 0)))
|
46086 | .extend(this.pointLocation(new performance.pointGeometry(this.width, 0)))
|
46087 | .extend(this.pointLocation(new performance.pointGeometry(this.width, this.height)))
|
46088 | .extend(this.pointLocation(new performance.pointGeometry(0, this.height)));
|
46089 | }
|
46090 | /**
|
46091 | * Returns the maximum geographical bounds the map is constrained to, or `null` if none set.
|
46092 | * @returns {LngLatBounds} {@link LngLatBounds}
|
46093 | */
|
46094 | getMaxBounds() {
|
46095 | if (!this.latRange || this.latRange.length !== 2 ||
|
46096 | !this.lngRange || this.lngRange.length !== 2)
|
46097 | return null;
|
46098 | return new performance.LngLatBounds([this.lngRange[0], this.latRange[0]], [this.lngRange[1], this.latRange[1]]);
|
46099 | }
|
46100 | /**
|
46101 | * Sets or clears the map's geographical constraints.
|
46102 | * @param {LngLatBounds} bounds A {@link LngLatBounds} object describing the new geographic boundaries of the map.
|
46103 | */
|
46104 | setMaxBounds(bounds) {
|
46105 | if (bounds) {
|
46106 | this.lngRange = [bounds.getWest(), bounds.getEast()];
|
46107 | this.latRange = [bounds.getSouth(), bounds.getNorth()];
|
46108 | this._constrain();
|
46109 | }
|
46110 | else {
|
46111 | this.lngRange = null;
|
46112 | this.latRange = [-this.maxValidLatitude, this.maxValidLatitude];
|
46113 | }
|
46114 | }
|
46115 | /**
|
46116 | * Calculate the posMatrix that, given a tile coordinate, would be used to display the tile on a map.
|
46117 | * @param {UnwrappedTileID} unwrappedTileID;
|
46118 | * @private
|
46119 | */
|
46120 | calculatePosMatrix(unwrappedTileID, aligned = false) {
|
46121 | const posMatrixKey = unwrappedTileID.key;
|
46122 | const cache = aligned ? this._alignedPosMatrixCache : this._posMatrixCache;
|
46123 | if (cache[posMatrixKey]) {
|
46124 | return cache[posMatrixKey];
|
46125 | }
|
46126 | const canonical = unwrappedTileID.canonical;
|
46127 | const scale = this.worldSize / this.zoomScale(canonical.z);
|
46128 | const unwrappedX = canonical.x + Math.pow(2, canonical.z) * unwrappedTileID.wrap;
|
46129 | const posMatrix = performance.identity(new Float64Array(16));
|
46130 | performance.translate(posMatrix, posMatrix, [unwrappedX * scale, canonical.y * scale, 0]);
|
46131 | performance.scale(posMatrix, posMatrix, [scale / performance.EXTENT, scale / performance.EXTENT, 1]);
|
46132 | performance.multiply(posMatrix, aligned ? this.alignedProjMatrix : this.projMatrix, posMatrix);
|
46133 | cache[posMatrixKey] = new Float32Array(posMatrix);
|
46134 | return cache[posMatrixKey];
|
46135 | }
|
46136 | customLayerMatrix() {
|
46137 | return this.mercatorMatrix.slice();
|
46138 | }
|
46139 | _constrain() {
|
46140 | if (!this.center || !this.width || !this.height || this._constraining)
|
46141 | return;
|
46142 | this._constraining = true;
|
46143 | let minY = -90;
|
46144 | let maxY = 90;
|
46145 | let minX = -180;
|
46146 | let maxX = 180;
|
46147 | let sy, sx, x2, y2;
|
46148 | const size = this.size, unmodified = this._unmodified;
|
46149 | if (this.latRange) {
|
46150 | const latRange = this.latRange;
|
46151 | minY = performance.mercatorYfromLat(latRange[1]) * this.worldSize;
|
46152 | maxY = performance.mercatorYfromLat(latRange[0]) * this.worldSize;
|
46153 | sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0;
|
46154 | }
|
46155 | if (this.lngRange) {
|
46156 | const lngRange = this.lngRange;
|
46157 | minX = performance.mercatorXfromLng(lngRange[0]) * this.worldSize;
|
46158 | maxX = performance.mercatorXfromLng(lngRange[1]) * this.worldSize;
|
46159 | sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0;
|
46160 | }
|
46161 | const point = this.point;
|
46162 | // how much the map should scale to fit the screen into given latitude/longitude ranges
|
46163 | const s = Math.max(sx || 0, sy || 0);
|
46164 | if (s) {
|
46165 | this.center = this.unproject(new performance.pointGeometry(sx ? (maxX + minX) / 2 : point.x, sy ? (maxY + minY) / 2 : point.y));
|
46166 | this.zoom += this.scaleZoom(s);
|
46167 | this._unmodified = unmodified;
|
46168 | this._constraining = false;
|
46169 | return;
|
46170 | }
|
46171 | if (this.latRange) {
|
46172 | const y = point.y, h2 = size.y / 2;
|
46173 | if (y - h2 < minY)
|
46174 | y2 = minY + h2;
|
46175 | if (y + h2 > maxY)
|
46176 | y2 = maxY - h2;
|
46177 | }
|
46178 | if (this.lngRange) {
|
46179 | const x = point.x, w2 = size.x / 2;
|
46180 | if (x - w2 < minX)
|
46181 | x2 = minX + w2;
|
46182 | if (x + w2 > maxX)
|
46183 | x2 = maxX - w2;
|
46184 | }
|
46185 | // pan the map if the screen goes off the range
|
46186 | if (x2 !== undefined || y2 !== undefined) {
|
46187 | this.center = this.unproject(new performance.pointGeometry(x2 !== undefined ? x2 : point.x, y2 !== undefined ? y2 : point.y));
|
46188 | }
|
46189 | this._unmodified = unmodified;
|
46190 | this._constraining = false;
|
46191 | }
|
46192 | _calcMatrices() {
|
46193 | if (!this.height)
|
46194 | return;
|
46195 | const halfFov = this._fov / 2;
|
46196 | const offset = this.centerOffset;
|
46197 | this.cameraToCenterDistance = 0.5 / Math.tan(halfFov) * this.height;
|
46198 | // Find the distance from the center point [width/2 + offset.x, height/2 + offset.y] to the
|
46199 | // center top point [width/2 + offset.x, 0] in Z units, using the law of sines.
|
46200 | // 1 Z unit is equivalent to 1 horizontal px at the center of the map
|
46201 | // (the distance between[width/2, height/2] and [width/2 + 1, height/2])
|
46202 | const groundAngle = Math.PI / 2 + this._pitch;
|
46203 | const fovAboveCenter = this._fov * (0.5 + offset.y / this.height);
|
46204 | const topHalfSurfaceDistance = Math.sin(fovAboveCenter) * this.cameraToCenterDistance / Math.sin(performance.clamp(Math.PI - groundAngle - fovAboveCenter, 0.01, Math.PI - 0.01));
|
46205 | const point = this.point;
|
46206 | const x = point.x, y = point.y;
|
46207 | // Calculate z distance of the farthest fragment that should be rendered.
|
46208 | const furthestDistance = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.cameraToCenterDistance;
|
46209 | // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance`
|
46210 | const farZ = furthestDistance * 1.01;
|
46211 | // The larger the value of nearZ is
|
46212 | // - the more depth precision is available for features (good)
|
46213 | // - clipping starts appearing sooner when the camera is close to 3d features (bad)
|
46214 | //
|
46215 | // Smaller values worked well for mapbox-gl-js but deckgl was encountering precision issues
|
46216 | // when rendering it's layers using custom layers. This value was experimentally chosen and
|
46217 | // seems to solve z-fighting issues in deckgl while not clipping buildings too close to the camera.
|
46218 | const nearZ = this.height / 50;
|
46219 | // matrix for conversion from location to GL coordinates (-1 .. 1)
|
46220 | let m = new Float64Array(16);
|
46221 | performance.perspective(m, this._fov, this.width / this.height, nearZ, farZ);
|
46222 | //Apply center of perspective offset
|
46223 | m[8] = -offset.x * 2 / this.width;
|
46224 | m[9] = offset.y * 2 / this.height;
|
46225 | performance.scale(m, m, [1, -1, 1]);
|
46226 | performance.translate(m, m, [0, 0, -this.cameraToCenterDistance]);
|
46227 | performance.rotateX(m, m, this._pitch);
|
46228 | performance.rotateZ(m, m, this.angle);
|
46229 | performance.translate(m, m, [-x, -y, 0]);
|
46230 | // The mercatorMatrix can be used to transform points from mercator coordinates
|
46231 | // ([0, 0] nw, [1, 1] se) to GL coordinates.
|
46232 | this.mercatorMatrix = performance.scale([], m, [this.worldSize, this.worldSize, this.worldSize]);
|
46233 | // scale vertically to meters per pixel (inverse of ground resolution):
|
46234 | performance.scale(m, m, [1, 1, performance.mercatorZfromAltitude(1, this.center.lat) * this.worldSize]);
|
46235 | this.projMatrix = m;
|
46236 | this.invProjMatrix = performance.invert([], this.projMatrix);
|
46237 | // Make a second projection matrix that is aligned to a pixel grid for rendering raster tiles.
|
46238 | // We're rounding the (floating point) x/y values to achieve to avoid rendering raster images to fractional
|
46239 | // coordinates. Additionally, we adjust by half a pixel in either direction in case that viewport dimension
|
46240 | // is an odd integer to preserve rendering to the pixel grid. We're rotating this shift based on the angle
|
46241 | // of the transformation so that 0°, 90°, 180°, and 270° rasters are crisp, and adjust the shift so that
|
46242 | // it is always <= 0.5 pixels.
|
46243 | const xShift = (this.width % 2) / 2, yShift = (this.height % 2) / 2, angleCos = Math.cos(this.angle), angleSin = Math.sin(this.angle), dx = x - Math.round(x) + angleCos * xShift + angleSin * yShift, dy = y - Math.round(y) + angleCos * yShift + angleSin * xShift;
|
46244 | const alignedM = new Float64Array(m);
|
46245 | performance.translate(alignedM, alignedM, [dx > 0.5 ? dx - 1 : dx, dy > 0.5 ? dy - 1 : dy, 0]);
|
46246 | this.alignedProjMatrix = alignedM;
|
46247 | m = performance.create();
|
46248 | performance.scale(m, m, [this.width / 2, -this.height / 2, 1]);
|
46249 | performance.translate(m, m, [1, -1, 0]);
|
46250 | this.labelPlaneMatrix = m;
|
46251 | m = performance.create();
|
46252 | performance.scale(m, m, [1, -1, 1]);
|
46253 | performance.translate(m, m, [-1, -1, 0]);
|
46254 | performance.scale(m, m, [2 / this.width, 2 / this.height, 1]);
|
46255 | this.glCoordMatrix = m;
|
46256 | // matrix for conversion from location to screen coordinates
|
46257 | this.pixelMatrix = performance.multiply(new Float64Array(16), this.labelPlaneMatrix, this.projMatrix);
|
46258 | // inverse matrix for conversion from screen coordinaes to location
|
46259 | m = performance.invert(new Float64Array(16), this.pixelMatrix);
|
46260 | if (!m)
|
46261 | throw new Error('failed to invert matrix');
|
46262 | this.pixelMatrixInverse = m;
|
46263 | this._posMatrixCache = {};
|
46264 | this._alignedPosMatrixCache = {};
|
46265 | }
|
46266 | maxPitchScaleFactor() {
|
46267 | // calcMatrices hasn't run yet
|
46268 | if (!this.pixelMatrixInverse)
|
46269 | return 1;
|
46270 | const coord = this.pointCoordinate(new performance.pointGeometry(0, 0));
|
46271 | const p = [coord.x * this.worldSize, coord.y * this.worldSize, 0, 1];
|
46272 | const topPoint = performance.transformMat4(p, p, this.pixelMatrix);
|
46273 | return topPoint[3] / this.cameraToCenterDistance;
|
46274 | }
|
46275 | /*
|
46276 | * The camera looks at the map from a 3D (lng, lat, altitude) location. Let's use `cameraLocation`
|
46277 | * as the name for the location under the camera and on the surface of the earth (lng, lat, 0).
|
46278 | * `cameraPoint` is the projected position of the `cameraLocation`.
|
46279 | *
|
46280 | * This point is useful to us because only fill-extrusions that are between `cameraPoint` and
|
46281 | * the query point on the surface of the earth can extend and intersect the query.
|
46282 | *
|
46283 | * When the map is not pitched the `cameraPoint` is equivalent to the center of the map because
|
46284 | * the camera is right above the center of the map.
|
46285 | */
|
46286 | getCameraPoint() {
|
46287 | const pitch = this._pitch;
|
46288 | const yOffset = Math.tan(pitch) * (this.cameraToCenterDistance || 1);
|
46289 | return this.centerPoint.add(new performance.pointGeometry(0, yOffset));
|
46290 | }
|
46291 | /*
|
46292 | * When the map is pitched, some of the 3D features that intersect a query will not intersect
|
46293 | * the query at the surface of the earth. Instead the feature may be closer and only intersect
|
46294 | * the query because it extrudes into the air.
|
46295 | *
|
46296 | * This returns a geometry that includes all of the original query as well as all possible ares of the
|
46297 | * screen where the *base* of a visible extrusion could be.
|
46298 | * - For point queries, the line from the query point to the "camera point"
|
46299 | * - For other geometries, the envelope of the query geometry and the "camera point"
|
46300 | */
|
46301 | getCameraQueryGeometry(queryGeometry) {
|
46302 | const c = this.getCameraPoint();
|
46303 | if (queryGeometry.length === 1) {
|
46304 | return [queryGeometry[0], c];
|
46305 | }
|
46306 | else {
|
46307 | let minX = c.x;
|
46308 | let minY = c.y;
|
46309 | let maxX = c.x;
|
46310 | let maxY = c.y;
|
46311 | for (const p of queryGeometry) {
|
46312 | minX = Math.min(minX, p.x);
|
46313 | minY = Math.min(minY, p.y);
|
46314 | maxX = Math.max(maxX, p.x);
|
46315 | maxY = Math.max(maxY, p.y);
|
46316 | }
|
46317 | return [
|
46318 | new performance.pointGeometry(minX, minY),
|
46319 | new performance.pointGeometry(maxX, minY),
|
46320 | new performance.pointGeometry(maxX, maxY),
|
46321 | new performance.pointGeometry(minX, maxY),
|
46322 | new performance.pointGeometry(minX, minY)
|
46323 | ];
|
46324 | }
|
46325 | }
|
46326 | }
|
46327 |
|
46328 | /**
|
46329 | * Throttle the given function to run at most every `period` milliseconds.
|
46330 | * @private
|
46331 | */
|
46332 | function throttle(fn, time) {
|
46333 | let pending = false;
|
46334 | let timerId = null;
|
46335 | const later = () => {
|
46336 | timerId = null;
|
46337 | if (pending) {
|
46338 | fn();
|
46339 | timerId = setTimeout(later, time);
|
46340 | pending = false;
|
46341 | }
|
46342 | };
|
46343 | return () => {
|
46344 | pending = true;
|
46345 | if (!timerId) {
|
46346 | later();
|
46347 | }
|
46348 | return timerId;
|
46349 | };
|
46350 | }
|
46351 |
|
46352 | /*
|
46353 | * Adds the map's position to its page's location hash.
|
46354 | * Passed as an option to the map object.
|
46355 | *
|
46356 | * @returns {Hash} `this`
|
46357 | */
|
46358 | class Hash {
|
46359 | constructor(hashName) {
|
46360 | this._hashName = hashName && encodeURIComponent(hashName);
|
46361 | performance.bindAll([
|
46362 | '_getCurrentHash',
|
46363 | '_onHashChange',
|
46364 | '_updateHash'
|
46365 | ], this);
|
46366 | // Mobile Safari doesn't allow updating the hash more than 100 times per 30 seconds.
|
46367 | this._updateHash = throttle(this._updateHashUnthrottled.bind(this), 30 * 1000 / 100);
|
46368 | }
|
46369 | /*
|
46370 | * Map element to listen for coordinate changes
|
46371 | *
|
46372 | * @param {Object} map
|
46373 | * @returns {Hash} `this`
|
46374 | */
|
46375 | addTo(map) {
|
46376 | this._map = map;
|
46377 | addEventListener('hashchange', this._onHashChange, false);
|
46378 | this._map.on('moveend', this._updateHash);
|
46379 | return this;
|
46380 | }
|
46381 | /*
|
46382 | * Removes hash
|
46383 | *
|
46384 | * @returns {Popup} `this`
|
46385 | */
|
46386 | remove() {
|
46387 | removeEventListener('hashchange', this._onHashChange, false);
|
46388 | this._map.off('moveend', this._updateHash);
|
46389 | clearTimeout(this._updateHash());
|
46390 | delete this._map;
|
46391 | return this;
|
46392 | }
|
46393 | getHashString(mapFeedback) {
|
46394 | const center = this._map.getCenter(), zoom = Math.round(this._map.getZoom() * 100) / 100,
|
46395 | // derived from equation: 512px * 2^z / 360 / 10^d < 0.5px
|
46396 | precision = Math.ceil((zoom * Math.LN2 + Math.log(512 / 360 / 0.5)) / Math.LN10), m = Math.pow(10, precision), lng = Math.round(center.lng * m) / m, lat = Math.round(center.lat * m) / m, bearing = this._map.getBearing(), pitch = this._map.getPitch();
|
46397 | let hash = '';
|
46398 | if (mapFeedback) {
|
46399 | // new map feedback site has some constraints that don't allow
|
46400 | // us to use the same hash format as we do for the Map hash option.
|
46401 | hash += `/${lng}/${lat}/${zoom}`;
|
46402 | }
|
46403 | else {
|
46404 | hash += `${zoom}/${lat}/${lng}`;
|
46405 | }
|
46406 | if (bearing || pitch)
|
46407 | hash += (`/${Math.round(bearing * 10) / 10}`);
|
46408 | if (pitch)
|
46409 | hash += (`/${Math.round(pitch)}`);
|
46410 | if (this._hashName) {
|
46411 | const hashName = this._hashName;
|
46412 | let found = false;
|
46413 | const parts = window.location.hash.slice(1).split('&').map(part => {
|
46414 | const key = part.split('=')[0];
|
46415 | if (key === hashName) {
|
46416 | found = true;
|
46417 | return `${key}=${hash}`;
|
46418 | }
|
46419 | return part;
|
46420 | }).filter(a => a);
|
46421 | if (!found) {
|
46422 | parts.push(`${hashName}=${hash}`);
|
46423 | }
|
46424 | return `#${parts.join('&')}`;
|
46425 | }
|
46426 | return `#${hash}`;
|
46427 | }
|
46428 | _getCurrentHash() {
|
46429 | // Get the current hash from location, stripped from its number sign
|
46430 | const hash = window.location.hash.replace('#', '');
|
46431 | if (this._hashName) {
|
46432 | // Split the parameter-styled hash into parts and find the value we need
|
46433 | let keyval;
|
46434 | hash.split('&').map(part => part.split('=')).forEach(part => {
|
46435 | if (part[0] === this._hashName) {
|
46436 | keyval = part;
|
46437 | }
|
46438 | });
|
46439 | return (keyval ? keyval[1] || '' : '').split('/');
|
46440 | }
|
46441 | return hash.split('/');
|
46442 | }
|
46443 | _onHashChange() {
|
46444 | const loc = this._getCurrentHash();
|
46445 | if (loc.length >= 3 && !loc.some(v => isNaN(v))) {
|
46446 | const bearing = this._map.dragRotate.isEnabled() && this._map.touchZoomRotate.isEnabled() ? +(loc[3] || 0) : this._map.getBearing();
|
46447 | this._map.jumpTo({
|
46448 | center: [+loc[2], +loc[1]],
|
46449 | zoom: +loc[0],
|
46450 | bearing,
|
46451 | pitch: +(loc[4] || 0)
|
46452 | });
|
46453 | return true;
|
46454 | }
|
46455 | return false;
|
46456 | }
|
46457 | _updateHashUnthrottled() {
|
46458 | // Replace if already present, else append the updated hash string
|
46459 | const location = window.location.href.replace(/(#.+)?$/, this.getHashString());
|
46460 | try {
|
46461 | window.history.replaceState(window.history.state, null, location);
|
46462 | }
|
46463 | catch (SecurityError) {
|
46464 | // IE11 does not allow this if the page is within an iframe created
|
46465 | // with iframe.contentWindow.document.write(...).
|
46466 | // https://github.com/mapbox/mapbox-gl-js/issues/7410
|
46467 | }
|
46468 | }
|
46469 | }
|
46470 |
|
46471 | const defaultInertiaOptions = {
|
46472 | linearity: 0.3,
|
46473 | easing: performance.bezier(0, 0, 0.3, 1),
|
46474 | };
|
46475 | const defaultPanInertiaOptions = performance.extend({
|
46476 | deceleration: 2500,
|
46477 | maxSpeed: 1400
|
46478 | }, defaultInertiaOptions);
|
46479 | const defaultZoomInertiaOptions = performance.extend({
|
46480 | deceleration: 20,
|
46481 | maxSpeed: 1400
|
46482 | }, defaultInertiaOptions);
|
46483 | const defaultBearingInertiaOptions = performance.extend({
|
46484 | deceleration: 1000,
|
46485 | maxSpeed: 360
|
46486 | }, defaultInertiaOptions);
|
46487 | const defaultPitchInertiaOptions = performance.extend({
|
46488 | deceleration: 1000,
|
46489 | maxSpeed: 90
|
46490 | }, defaultInertiaOptions);
|
46491 | class HandlerInertia {
|
46492 | constructor(map) {
|
46493 | this._map = map;
|
46494 | this.clear();
|
46495 | }
|
46496 | clear() {
|
46497 | this._inertiaBuffer = [];
|
46498 | }
|
46499 | record(settings) {
|
46500 | this._drainInertiaBuffer();
|
46501 | this._inertiaBuffer.push({ time: performance.exported.now(), settings });
|
46502 | }
|
46503 | _drainInertiaBuffer() {
|
46504 | const inertia = this._inertiaBuffer, now = performance.exported.now(), cutoff = 160; //msec
|
46505 | while (inertia.length > 0 && now - inertia[0].time > cutoff)
|
46506 | inertia.shift();
|
46507 | }
|
46508 | _onMoveEnd(panInertiaOptions) {
|
46509 | this._drainInertiaBuffer();
|
46510 | if (this._inertiaBuffer.length < 2) {
|
46511 | return;
|
46512 | }
|
46513 | const deltas = {
|
46514 | zoom: 0,
|
46515 | bearing: 0,
|
46516 | pitch: 0,
|
46517 | pan: new performance.pointGeometry(0, 0),
|
46518 | pinchAround: undefined,
|
46519 | around: undefined
|
46520 | };
|
46521 | for (const { settings } of this._inertiaBuffer) {
|
46522 | deltas.zoom += settings.zoomDelta || 0;
|
46523 | deltas.bearing += settings.bearingDelta || 0;
|
46524 | deltas.pitch += settings.pitchDelta || 0;
|
46525 | if (settings.panDelta)
|
46526 | deltas.pan._add(settings.panDelta);
|
46527 | if (settings.around)
|
46528 | deltas.around = settings.around;
|
46529 | if (settings.pinchAround)
|
46530 | deltas.pinchAround = settings.pinchAround;
|
46531 | }
|
46532 | const lastEntry = this._inertiaBuffer[this._inertiaBuffer.length - 1];
|
46533 | const duration = (lastEntry.time - this._inertiaBuffer[0].time);
|
46534 | const easeOptions = {};
|
46535 | if (deltas.pan.mag()) {
|
46536 | const result = calculateEasing(deltas.pan.mag(), duration, performance.extend({}, defaultPanInertiaOptions, panInertiaOptions || {}));
|
46537 | easeOptions.offset = deltas.pan.mult(result.amount / deltas.pan.mag());
|
46538 | easeOptions.center = this._map.transform.center;
|
46539 | extendDuration(easeOptions, result);
|
46540 | }
|
46541 | if (deltas.zoom) {
|
46542 | const result = calculateEasing(deltas.zoom, duration, defaultZoomInertiaOptions);
|
46543 | easeOptions.zoom = this._map.transform.zoom + result.amount;
|
46544 | extendDuration(easeOptions, result);
|
46545 | }
|
46546 | if (deltas.bearing) {
|
46547 | const result = calculateEasing(deltas.bearing, duration, defaultBearingInertiaOptions);
|
46548 | easeOptions.bearing = this._map.transform.bearing + performance.clamp(result.amount, -179, 179);
|
46549 | extendDuration(easeOptions, result);
|
46550 | }
|
46551 | if (deltas.pitch) {
|
46552 | const result = calculateEasing(deltas.pitch, duration, defaultPitchInertiaOptions);
|
46553 | easeOptions.pitch = this._map.transform.pitch + result.amount;
|
46554 | extendDuration(easeOptions, result);
|
46555 | }
|
46556 | if (easeOptions.zoom || easeOptions.bearing) {
|
46557 | const last = deltas.pinchAround === undefined ? deltas.around : deltas.pinchAround;
|
46558 | easeOptions.around = last ? this._map.unproject(last) : this._map.getCenter();
|
46559 | }
|
46560 | this.clear();
|
46561 | return performance.extend(easeOptions, {
|
46562 | noMoveStart: true
|
46563 | });
|
46564 | }
|
46565 | }
|
46566 | // Unfortunately zoom, bearing, etc can't have different durations and easings so
|
46567 | // we need to choose one. We use the longest duration and it's corresponding easing.
|
46568 | function extendDuration(easeOptions, result) {
|
46569 | if (!easeOptions.duration || easeOptions.duration < result.duration) {
|
46570 | easeOptions.duration = result.duration;
|
46571 | easeOptions.easing = result.easing;
|
46572 | }
|
46573 | }
|
46574 | function calculateEasing(amount, inertiaDuration, inertiaOptions) {
|
46575 | const { maxSpeed, linearity, deceleration } = inertiaOptions;
|
46576 | const speed = performance.clamp(amount * linearity / (inertiaDuration / 1000), -maxSpeed, maxSpeed);
|
46577 | const duration = Math.abs(speed) / (deceleration * linearity);
|
46578 | return {
|
46579 | easing: inertiaOptions.easing,
|
46580 | duration: duration * 1000,
|
46581 | amount: speed * (duration / 2)
|
46582 | };
|
46583 | }
|
46584 |
|
46585 | /**
|
46586 | * `MapMouseEvent` is the event type for mouse-related map events.
|
46587 | * @extends {Event}
|
46588 | * @example
|
46589 | * // The `click` event is an example of a `MapMouseEvent`.
|
46590 | * // Set up an event listener on the map.
|
46591 | * map.on('click', function(e) {
|
46592 | * // The event object (e) contains information like the
|
46593 | * // coordinates of the point on the map that was clicked.
|
46594 | * console.log('A click event has occurred at ' + e.lngLat);
|
46595 | * });
|
46596 | */
|
46597 | class MapMouseEvent extends performance.Event {
|
46598 | /**
|
46599 | * @private
|
46600 | */
|
46601 | constructor(type, map, originalEvent, data = {}) {
|
46602 | const point = DOM.mousePos(map.getCanvasContainer(), originalEvent);
|
46603 | const lngLat = map.unproject(point);
|
46604 | super(type, performance.extend({ point, lngLat, originalEvent }, data));
|
46605 | this._defaultPrevented = false;
|
46606 | this.target = map;
|
46607 | }
|
46608 | /**
|
46609 | * Prevents subsequent default processing of the event by the map.
|
46610 | *
|
46611 | * Calling this method will prevent the following default map behaviors:
|
46612 | *
|
46613 | * * On `mousedown` events, the behavior of {@link DragPanHandler}
|
46614 | * * On `mousedown` events, the behavior of {@link DragRotateHandler}
|
46615 | * * On `mousedown` events, the behavior of {@link BoxZoomHandler}
|
46616 | * * On `dblclick` events, the behavior of {@link DoubleClickZoomHandler}
|
46617 | *
|
46618 | */
|
46619 | preventDefault() {
|
46620 | this._defaultPrevented = true;
|
46621 | }
|
46622 | /**
|
46623 | * `true` if `preventDefault` has been called.
|
46624 | * @private
|
46625 | */
|
46626 | get defaultPrevented() {
|
46627 | return this._defaultPrevented;
|
46628 | }
|
46629 | }
|
46630 | /**
|
46631 | * `MapTouchEvent` is the event type for touch-related map events.
|
46632 | * @extends {Event}
|
46633 | */
|
46634 | class MapTouchEvent extends performance.Event {
|
46635 | /**
|
46636 | * @private
|
46637 | */
|
46638 | constructor(type, map, originalEvent) {
|
46639 | const touches = type === 'touchend' ? originalEvent.changedTouches : originalEvent.touches;
|
46640 | const points = DOM.touchPos(map.getCanvasContainer(), touches);
|
46641 | const lngLats = points.map((t) => map.unproject(t));
|
46642 | const point = points.reduce((prev, curr, i, arr) => {
|
46643 | return prev.add(curr.div(arr.length));
|
46644 | }, new performance.pointGeometry(0, 0));
|
46645 | const lngLat = map.unproject(point);
|
46646 | super(type, { points, point, lngLats, lngLat, originalEvent });
|
46647 | this._defaultPrevented = false;
|
46648 | }
|
46649 | /**
|
46650 | * Prevents subsequent default processing of the event by the map.
|
46651 | *
|
46652 | * Calling this method will prevent the following default map behaviors:
|
46653 | *
|
46654 | * * On `touchstart` events, the behavior of {@link DragPanHandler}
|
46655 | * * On `touchstart` events, the behavior of {@link TouchZoomRotateHandler}
|
46656 | *
|
46657 | */
|
46658 | preventDefault() {
|
46659 | this._defaultPrevented = true;
|
46660 | }
|
46661 | /**
|
46662 | * `true` if `preventDefault` has been called.
|
46663 | * @private
|
46664 | */
|
46665 | get defaultPrevented() {
|
46666 | return this._defaultPrevented;
|
46667 | }
|
46668 | }
|
46669 | /**
|
46670 | * `MapWheelEvent` is the event type for the `wheel` map event.
|
46671 | * @extends {Object}
|
46672 | */
|
46673 | class MapWheelEvent extends performance.Event {
|
46674 | /**
|
46675 | * @private
|
46676 | */
|
46677 | constructor(type, map, originalEvent) {
|
46678 | super(type, { originalEvent });
|
46679 | this._defaultPrevented = false;
|
46680 | }
|
46681 | /**
|
46682 | * Prevents subsequent default processing of the event by the map.
|
46683 | *
|
46684 | * Calling this method will prevent the the behavior of {@link ScrollZoomHandler}.
|
46685 | */
|
46686 | preventDefault() {
|
46687 | this._defaultPrevented = true;
|
46688 | }
|
46689 | /**
|
46690 | * `true` if `preventDefault` has been called.
|
46691 | * @private
|
46692 | */
|
46693 | get defaultPrevented() {
|
46694 | return this._defaultPrevented;
|
46695 | }
|
46696 | }
|
46697 |
|
46698 | class MapEventHandler {
|
46699 | constructor(map, options) {
|
46700 | this._map = map;
|
46701 | this._clickTolerance = options.clickTolerance;
|
46702 | }
|
46703 | reset() {
|
46704 | delete this._mousedownPos;
|
46705 | }
|
46706 | wheel(e) {
|
46707 | // If mapEvent.preventDefault() is called by the user, prevent handlers such as:
|
46708 | // - ScrollZoom
|
46709 | return this._firePreventable(new MapWheelEvent(e.type, this._map, e));
|
46710 | }
|
46711 | mousedown(e, point) {
|
46712 | this._mousedownPos = point;
|
46713 | // If mapEvent.preventDefault() is called by the user, prevent handlers such as:
|
46714 | // - MousePan
|
46715 | // - MouseRotate
|
46716 | // - MousePitch
|
46717 | // - DblclickHandler
|
46718 | return this._firePreventable(new MapMouseEvent(e.type, this._map, e));
|
46719 | }
|
46720 | mouseup(e) {
|
46721 | this._map.fire(new MapMouseEvent(e.type, this._map, e));
|
46722 | }
|
46723 | click(e, point) {
|
46724 | if (this._mousedownPos && this._mousedownPos.dist(point) >= this._clickTolerance)
|
46725 | return;
|
46726 | this._map.fire(new MapMouseEvent(e.type, this._map, e));
|
46727 | }
|
46728 | dblclick(e) {
|
46729 | // If mapEvent.preventDefault() is called by the user, prevent handlers such as:
|
46730 | // - DblClickZoom
|
46731 | return this._firePreventable(new MapMouseEvent(e.type, this._map, e));
|
46732 | }
|
46733 | mouseover(e) {
|
46734 | this._map.fire(new MapMouseEvent(e.type, this._map, e));
|
46735 | }
|
46736 | mouseout(e) {
|
46737 | this._map.fire(new MapMouseEvent(e.type, this._map, e));
|
46738 | }
|
46739 | touchstart(e) {
|
46740 | // If mapEvent.preventDefault() is called by the user, prevent handlers such as:
|
46741 | // - TouchPan
|
46742 | // - TouchZoom
|
46743 | // - TouchRotate
|
46744 | // - TouchPitch
|
46745 | // - TapZoom
|
46746 | // - SwipeZoom
|
46747 | return this._firePreventable(new MapTouchEvent(e.type, this._map, e));
|
46748 | }
|
46749 | touchmove(e) {
|
46750 | this._map.fire(new MapTouchEvent(e.type, this._map, e));
|
46751 | }
|
46752 | touchend(e) {
|
46753 | this._map.fire(new MapTouchEvent(e.type, this._map, e));
|
46754 | }
|
46755 | touchcancel(e) {
|
46756 | this._map.fire(new MapTouchEvent(e.type, this._map, e));
|
46757 | }
|
46758 | _firePreventable(mapEvent) {
|
46759 | this._map.fire(mapEvent);
|
46760 | if (mapEvent.defaultPrevented) {
|
46761 | // returning an object marks the handler as active and resets other handlers
|
46762 | return {};
|
46763 | }
|
46764 | }
|
46765 | isEnabled() {
|
46766 | return true;
|
46767 | }
|
46768 | isActive() {
|
46769 | return false;
|
46770 | }
|
46771 | enable() { }
|
46772 | disable() { }
|
46773 | }
|
46774 | class BlockableMapEventHandler {
|
46775 | constructor(map) {
|
46776 | this._map = map;
|
46777 | }
|
46778 | reset() {
|
46779 | this._delayContextMenu = false;
|
46780 | delete this._contextMenuEvent;
|
46781 | }
|
46782 | mousemove(e) {
|
46783 | // mousemove map events should not be fired when interaction handlers (pan, rotate, etc) are active
|
46784 | this._map.fire(new MapMouseEvent(e.type, this._map, e));
|
46785 | }
|
46786 | mousedown() {
|
46787 | this._delayContextMenu = true;
|
46788 | }
|
46789 | mouseup() {
|
46790 | this._delayContextMenu = false;
|
46791 | if (this._contextMenuEvent) {
|
46792 | this._map.fire(new MapMouseEvent('contextmenu', this._map, this._contextMenuEvent));
|
46793 | delete this._contextMenuEvent;
|
46794 | }
|
46795 | }
|
46796 | contextmenu(e) {
|
46797 | if (this._delayContextMenu) {
|
46798 | // Mac: contextmenu fired on mousedown; we save it until mouseup for consistency's sake
|
46799 | this._contextMenuEvent = e;
|
46800 | }
|
46801 | else {
|
46802 | // Windows: contextmenu fired on mouseup, so fire event now
|
46803 | this._map.fire(new MapMouseEvent(e.type, this._map, e));
|
46804 | }
|
46805 | // prevent browser context menu when necessary
|
46806 | if (this._map.listens('contextmenu')) {
|
46807 | e.preventDefault();
|
46808 | }
|
46809 | }
|
46810 | isEnabled() {
|
46811 | return true;
|
46812 | }
|
46813 | isActive() {
|
46814 | return false;
|
46815 | }
|
46816 | enable() { }
|
46817 | disable() { }
|
46818 | }
|
46819 |
|
46820 | /**
|
46821 | * The `BoxZoomHandler` allows the user to zoom the map to fit within a bounding box.
|
46822 | * The bounding box is defined by clicking and holding `shift` while dragging the cursor.
|
46823 | */
|
46824 | class BoxZoomHandler {
|
46825 | /**
|
46826 | * @private
|
46827 | */
|
46828 | constructor(map, options) {
|
46829 | this._map = map;
|
46830 | this._el = map.getCanvasContainer();
|
46831 | this._container = map.getContainer();
|
46832 | this._clickTolerance = options.clickTolerance || 1;
|
46833 | }
|
46834 | /**
|
46835 | * Returns a Boolean indicating whether the "box zoom" interaction is enabled.
|
46836 | *
|
46837 | * @returns {boolean} `true` if the "box zoom" interaction is enabled.
|
46838 | */
|
46839 | isEnabled() {
|
46840 | return !!this._enabled;
|
46841 | }
|
46842 | /**
|
46843 | * Returns a Boolean indicating whether the "box zoom" interaction is active, i.e. currently being used.
|
46844 | *
|
46845 | * @returns {boolean} `true` if the "box zoom" interaction is active.
|
46846 | */
|
46847 | isActive() {
|
46848 | return !!this._active;
|
46849 | }
|
46850 | /**
|
46851 | * Enables the "box zoom" interaction.
|
46852 | *
|
46853 | * @example
|
46854 | * map.boxZoom.enable();
|
46855 | */
|
46856 | enable() {
|
46857 | if (this.isEnabled())
|
46858 | return;
|
46859 | this._enabled = true;
|
46860 | }
|
46861 | /**
|
46862 | * Disables the "box zoom" interaction.
|
46863 | *
|
46864 | * @example
|
46865 | * map.boxZoom.disable();
|
46866 | */
|
46867 | disable() {
|
46868 | if (!this.isEnabled())
|
46869 | return;
|
46870 | this._enabled = false;
|
46871 | }
|
46872 | mousedown(e, point) {
|
46873 | if (!this.isEnabled())
|
46874 | return;
|
46875 | if (!(e.shiftKey && e.button === 0))
|
46876 | return;
|
46877 | DOM.disableDrag();
|
46878 | this._startPos = this._lastPos = point;
|
46879 | this._active = true;
|
46880 | }
|
46881 | mousemoveWindow(e, point) {
|
46882 | if (!this._active)
|
46883 | return;
|
46884 | const pos = point;
|
46885 | if (this._lastPos.equals(pos) || (!this._box && pos.dist(this._startPos) < this._clickTolerance)) {
|
46886 | return;
|
46887 | }
|
46888 | const p0 = this._startPos;
|
46889 | this._lastPos = pos;
|
46890 | if (!this._box) {
|
46891 | this._box = DOM.create('div', 'maplibregl-boxzoom mapboxgl-boxzoom', this._container);
|
46892 | this._container.classList.add('maplibregl-crosshair', 'mapboxgl-crosshair');
|
46893 | this._fireEvent('boxzoomstart', e);
|
46894 | }
|
46895 | const minX = Math.min(p0.x, pos.x), maxX = Math.max(p0.x, pos.x), minY = Math.min(p0.y, pos.y), maxY = Math.max(p0.y, pos.y);
|
46896 | DOM.setTransform(this._box, `translate(${minX}px,${minY}px)`);
|
46897 | this._box.style.width = `${maxX - minX}px`;
|
46898 | this._box.style.height = `${maxY - minY}px`;
|
46899 | }
|
46900 | mouseupWindow(e, point) {
|
46901 | if (!this._active)
|
46902 | return;
|
46903 | if (e.button !== 0)
|
46904 | return;
|
46905 | const p0 = this._startPos, p1 = point;
|
46906 | this.reset();
|
46907 | DOM.suppressClick();
|
46908 | if (p0.x === p1.x && p0.y === p1.y) {
|
46909 | this._fireEvent('boxzoomcancel', e);
|
46910 | }
|
46911 | else {
|
46912 | this._map.fire(new performance.Event('boxzoomend', { originalEvent: e }));
|
46913 | return {
|
46914 | cameraAnimation: map => map.fitScreenCoordinates(p0, p1, this._map.getBearing(), { linear: true })
|
46915 | };
|
46916 | }
|
46917 | }
|
46918 | keydown(e) {
|
46919 | if (!this._active)
|
46920 | return;
|
46921 | if (e.keyCode === 27) {
|
46922 | this.reset();
|
46923 | this._fireEvent('boxzoomcancel', e);
|
46924 | }
|
46925 | }
|
46926 | reset() {
|
46927 | this._active = false;
|
46928 | this._container.classList.remove('maplibregl-crosshair', 'mapboxgl-crosshair');
|
46929 | if (this._box) {
|
46930 | DOM.remove(this._box);
|
46931 | this._box = null;
|
46932 | }
|
46933 | DOM.enableDrag();
|
46934 | delete this._startPos;
|
46935 | delete this._lastPos;
|
46936 | }
|
46937 | _fireEvent(type, e) {
|
46938 | return this._map.fire(new performance.Event(type, { originalEvent: e }));
|
46939 | }
|
46940 | }
|
46941 |
|
46942 | function indexTouches(touches, points) {
|
46943 | performance.assert(touches.length === points.length);
|
46944 | const obj = {};
|
46945 | for (let i = 0; i < touches.length; i++) {
|
46946 | obj[touches[i].identifier] = points[i];
|
46947 | }
|
46948 | return obj;
|
46949 | }
|
46950 |
|
46951 | function getCentroid(points) {
|
46952 | const sum = new performance.pointGeometry(0, 0);
|
46953 | for (const point of points) {
|
46954 | sum._add(point);
|
46955 | }
|
46956 | return sum.div(points.length);
|
46957 | }
|
46958 | const MAX_TAP_INTERVAL = 500;
|
46959 | const MAX_TOUCH_TIME = 500;
|
46960 | const MAX_DIST = 30;
|
46961 | class SingleTapRecognizer {
|
46962 | constructor(options) {
|
46963 | this.reset();
|
46964 | this.numTouches = options.numTouches;
|
46965 | }
|
46966 | reset() {
|
46967 | delete this.centroid;
|
46968 | delete this.startTime;
|
46969 | delete this.touches;
|
46970 | this.aborted = false;
|
46971 | }
|
46972 | touchstart(e, points, mapTouches) {
|
46973 | if (this.centroid || mapTouches.length > this.numTouches) {
|
46974 | this.aborted = true;
|
46975 | }
|
46976 | if (this.aborted) {
|
46977 | return;
|
46978 | }
|
46979 | if (this.startTime === undefined) {
|
46980 | this.startTime = e.timeStamp;
|
46981 | }
|
46982 | if (mapTouches.length === this.numTouches) {
|
46983 | this.centroid = getCentroid(points);
|
46984 | this.touches = indexTouches(mapTouches, points);
|
46985 | }
|
46986 | }
|
46987 | touchmove(e, points, mapTouches) {
|
46988 | if (this.aborted || !this.centroid)
|
46989 | return;
|
46990 | const newTouches = indexTouches(mapTouches, points);
|
46991 | for (const id in this.touches) {
|
46992 | const prevPos = this.touches[id];
|
46993 | const pos = newTouches[id];
|
46994 | if (!pos || pos.dist(prevPos) > MAX_DIST) {
|
46995 | this.aborted = true;
|
46996 | }
|
46997 | }
|
46998 | }
|
46999 | touchend(e, points, mapTouches) {
|
47000 | if (!this.centroid || e.timeStamp - this.startTime > MAX_TOUCH_TIME) {
|
47001 | this.aborted = true;
|
47002 | }
|
47003 | if (mapTouches.length === 0) {
|
47004 | const centroid = !this.aborted && this.centroid;
|
47005 | this.reset();
|
47006 | if (centroid)
|
47007 | return centroid;
|
47008 | }
|
47009 | }
|
47010 | }
|
47011 | class TapRecognizer {
|
47012 | constructor(options) {
|
47013 | this.singleTap = new SingleTapRecognizer(options);
|
47014 | this.numTaps = options.numTaps;
|
47015 | this.reset();
|
47016 | }
|
47017 | reset() {
|
47018 | this.lastTime = Infinity;
|
47019 | delete this.lastTap;
|
47020 | this.count = 0;
|
47021 | this.singleTap.reset();
|
47022 | }
|
47023 | touchstart(e, points, mapTouches) {
|
47024 | this.singleTap.touchstart(e, points, mapTouches);
|
47025 | }
|
47026 | touchmove(e, points, mapTouches) {
|
47027 | this.singleTap.touchmove(e, points, mapTouches);
|
47028 | }
|
47029 | touchend(e, points, mapTouches) {
|
47030 | const tap = this.singleTap.touchend(e, points, mapTouches);
|
47031 | if (tap) {
|
47032 | const soonEnough = e.timeStamp - this.lastTime < MAX_TAP_INTERVAL;
|
47033 | const closeEnough = !this.lastTap || this.lastTap.dist(tap) < MAX_DIST;
|
47034 | if (!soonEnough || !closeEnough) {
|
47035 | this.reset();
|
47036 | }
|
47037 | this.count++;
|
47038 | this.lastTime = e.timeStamp;
|
47039 | this.lastTap = tap;
|
47040 | if (this.count === this.numTaps) {
|
47041 | this.reset();
|
47042 | return tap;
|
47043 | }
|
47044 | }
|
47045 | }
|
47046 | }
|
47047 |
|
47048 | class TapZoomHandler {
|
47049 | constructor() {
|
47050 | this._zoomIn = new TapRecognizer({
|
47051 | numTouches: 1,
|
47052 | numTaps: 2
|
47053 | });
|
47054 | this._zoomOut = new TapRecognizer({
|
47055 | numTouches: 2,
|
47056 | numTaps: 1
|
47057 | });
|
47058 | this.reset();
|
47059 | }
|
47060 | reset() {
|
47061 | this._active = false;
|
47062 | this._zoomIn.reset();
|
47063 | this._zoomOut.reset();
|
47064 | }
|
47065 | touchstart(e, points, mapTouches) {
|
47066 | this._zoomIn.touchstart(e, points, mapTouches);
|
47067 | this._zoomOut.touchstart(e, points, mapTouches);
|
47068 | }
|
47069 | touchmove(e, points, mapTouches) {
|
47070 | this._zoomIn.touchmove(e, points, mapTouches);
|
47071 | this._zoomOut.touchmove(e, points, mapTouches);
|
47072 | }
|
47073 | touchend(e, points, mapTouches) {
|
47074 | const zoomInPoint = this._zoomIn.touchend(e, points, mapTouches);
|
47075 | const zoomOutPoint = this._zoomOut.touchend(e, points, mapTouches);
|
47076 | if (zoomInPoint) {
|
47077 | this._active = true;
|
47078 | e.preventDefault();
|
47079 | setTimeout(() => this.reset(), 0);
|
47080 | return {
|
47081 | cameraAnimation: (map) => map.easeTo({
|
47082 | duration: 300,
|
47083 | zoom: map.getZoom() + 1,
|
47084 | around: map.unproject(zoomInPoint)
|
47085 | }, { originalEvent: e })
|
47086 | };
|
47087 | }
|
47088 | else if (zoomOutPoint) {
|
47089 | this._active = true;
|
47090 | e.preventDefault();
|
47091 | setTimeout(() => this.reset(), 0);
|
47092 | return {
|
47093 | cameraAnimation: (map) => map.easeTo({
|
47094 | duration: 300,
|
47095 | zoom: map.getZoom() - 1,
|
47096 | around: map.unproject(zoomOutPoint)
|
47097 | }, { originalEvent: e })
|
47098 | };
|
47099 | }
|
47100 | }
|
47101 | touchcancel() {
|
47102 | this.reset();
|
47103 | }
|
47104 | enable() {
|
47105 | this._enabled = true;
|
47106 | }
|
47107 | disable() {
|
47108 | this._enabled = false;
|
47109 | this.reset();
|
47110 | }
|
47111 | isEnabled() {
|
47112 | return this._enabled;
|
47113 | }
|
47114 | isActive() {
|
47115 | return this._active;
|
47116 | }
|
47117 | }
|
47118 |
|
47119 | const LEFT_BUTTON = 0;
|
47120 | const RIGHT_BUTTON = 2;
|
47121 | // the values for each button in MouseEvent.buttons
|
47122 | const BUTTONS_FLAGS = {
|
47123 | [LEFT_BUTTON]: 1,
|
47124 | [RIGHT_BUTTON]: 2
|
47125 | };
|
47126 | function buttonStillPressed(e, button) {
|
47127 | const flag = BUTTONS_FLAGS[button];
|
47128 | return e.buttons === undefined || (e.buttons & flag) !== flag;
|
47129 | }
|
47130 | class MouseHandler {
|
47131 | constructor(options) {
|
47132 | this.reset();
|
47133 | this._clickTolerance = options.clickTolerance || 1;
|
47134 | }
|
47135 | reset() {
|
47136 | this._active = false;
|
47137 | this._moved = false;
|
47138 | delete this._lastPoint;
|
47139 | delete this._eventButton;
|
47140 | }
|
47141 | _correctButton(e, button) {
|
47142 | return false; // implemented by child
|
47143 | }
|
47144 | _move(lastPoint, point) {
|
47145 | return {}; // implemented by child
|
47146 | }
|
47147 | mousedown(e, point) {
|
47148 | if (this._lastPoint)
|
47149 | return;
|
47150 | const eventButton = DOM.mouseButton(e);
|
47151 | if (!this._correctButton(e, eventButton))
|
47152 | return;
|
47153 | this._lastPoint = point;
|
47154 | this._eventButton = eventButton;
|
47155 | }
|
47156 | mousemoveWindow(e, point) {
|
47157 | const lastPoint = this._lastPoint;
|
47158 | if (!lastPoint)
|
47159 | return;
|
47160 | e.preventDefault();
|
47161 | if (buttonStillPressed(e, this._eventButton)) {
|
47162 | // Some browsers don't fire a `mouseup` when the mouseup occurs outside
|
47163 | // the window or iframe:
|
47164 | // https://github.com/mapbox/mapbox-gl-js/issues/4622
|
47165 | //
|
47166 | // If the button is no longer pressed during this `mousemove` it may have
|
47167 | // been released outside of the window or iframe.
|
47168 | this.reset();
|
47169 | return;
|
47170 | }
|
47171 | if (!this._moved && point.dist(lastPoint) < this._clickTolerance)
|
47172 | return;
|
47173 | this._moved = true;
|
47174 | this._lastPoint = point;
|
47175 | // implemented by child class
|
47176 | return this._move(lastPoint, point);
|
47177 | }
|
47178 | mouseupWindow(e) {
|
47179 | if (!this._lastPoint)
|
47180 | return;
|
47181 | const eventButton = DOM.mouseButton(e);
|
47182 | if (eventButton !== this._eventButton)
|
47183 | return;
|
47184 | if (this._moved)
|
47185 | DOM.suppressClick();
|
47186 | this.reset();
|
47187 | }
|
47188 | enable() {
|
47189 | this._enabled = true;
|
47190 | }
|
47191 | disable() {
|
47192 | this._enabled = false;
|
47193 | this.reset();
|
47194 | }
|
47195 | isEnabled() {
|
47196 | return this._enabled;
|
47197 | }
|
47198 | isActive() {
|
47199 | return this._active;
|
47200 | }
|
47201 | }
|
47202 | class MousePanHandler extends MouseHandler {
|
47203 | mousedown(e, point) {
|
47204 | super.mousedown(e, point);
|
47205 | if (this._lastPoint)
|
47206 | this._active = true;
|
47207 | }
|
47208 | _correctButton(e, button) {
|
47209 | return button === LEFT_BUTTON && !e.ctrlKey;
|
47210 | }
|
47211 | _move(lastPoint, point) {
|
47212 | return {
|
47213 | around: point,
|
47214 | panDelta: point.sub(lastPoint)
|
47215 | };
|
47216 | }
|
47217 | }
|
47218 | class MouseRotateHandler extends MouseHandler {
|
47219 | _correctButton(e, button) {
|
47220 | return (button === LEFT_BUTTON && e.ctrlKey) || (button === RIGHT_BUTTON);
|
47221 | }
|
47222 | _move(lastPoint, point) {
|
47223 | const degreesPerPixelMoved = 0.8;
|
47224 | const bearingDelta = (point.x - lastPoint.x) * degreesPerPixelMoved;
|
47225 | if (bearingDelta) {
|
47226 | this._active = true;
|
47227 | return { bearingDelta };
|
47228 | }
|
47229 | }
|
47230 | contextmenu(e) {
|
47231 | // prevent browser context menu when necessary; we don't allow it with rotation
|
47232 | // because we can't discern rotation gesture start from contextmenu on Mac
|
47233 | e.preventDefault();
|
47234 | }
|
47235 | }
|
47236 | class MousePitchHandler extends MouseHandler {
|
47237 | _correctButton(e, button) {
|
47238 | return (button === LEFT_BUTTON && e.ctrlKey) || (button === RIGHT_BUTTON);
|
47239 | }
|
47240 | _move(lastPoint, point) {
|
47241 | const degreesPerPixelMoved = -0.5;
|
47242 | const pitchDelta = (point.y - lastPoint.y) * degreesPerPixelMoved;
|
47243 | if (pitchDelta) {
|
47244 | this._active = true;
|
47245 | return { pitchDelta };
|
47246 | }
|
47247 | }
|
47248 | contextmenu(e) {
|
47249 | // prevent browser context menu when necessary; we don't allow it with rotation
|
47250 | // because we can't discern rotation gesture start from contextmenu on Mac
|
47251 | e.preventDefault();
|
47252 | }
|
47253 | }
|
47254 |
|
47255 | class TouchPanHandler {
|
47256 | constructor(options) {
|
47257 | this._minTouches = 1;
|
47258 | this._clickTolerance = options.clickTolerance || 1;
|
47259 | this.reset();
|
47260 | }
|
47261 | reset() {
|
47262 | this._active = false;
|
47263 | this._touches = {};
|
47264 | this._sum = new performance.pointGeometry(0, 0);
|
47265 | }
|
47266 | touchstart(e, points, mapTouches) {
|
47267 | return this._calculateTransform(e, points, mapTouches);
|
47268 | }
|
47269 | touchmove(e, points, mapTouches) {
|
47270 | if (!this._active || mapTouches.length < this._minTouches)
|
47271 | return;
|
47272 | e.preventDefault();
|
47273 | return this._calculateTransform(e, points, mapTouches);
|
47274 | }
|
47275 | touchend(e, points, mapTouches) {
|
47276 | this._calculateTransform(e, points, mapTouches);
|
47277 | if (this._active && mapTouches.length < this._minTouches) {
|
47278 | this.reset();
|
47279 | }
|
47280 | }
|
47281 | touchcancel() {
|
47282 | this.reset();
|
47283 | }
|
47284 | _calculateTransform(e, points, mapTouches) {
|
47285 | if (mapTouches.length > 0)
|
47286 | this._active = true;
|
47287 | const touches = indexTouches(mapTouches, points);
|
47288 | const touchPointSum = new performance.pointGeometry(0, 0);
|
47289 | const touchDeltaSum = new performance.pointGeometry(0, 0);
|
47290 | let touchDeltaCount = 0;
|
47291 | for (const identifier in touches) {
|
47292 | const point = touches[identifier];
|
47293 | const prevPoint = this._touches[identifier];
|
47294 | if (prevPoint) {
|
47295 | touchPointSum._add(point);
|
47296 | touchDeltaSum._add(point.sub(prevPoint));
|
47297 | touchDeltaCount++;
|
47298 | touches[identifier] = point;
|
47299 | }
|
47300 | }
|
47301 | this._touches = touches;
|
47302 | if (touchDeltaCount < this._minTouches || !touchDeltaSum.mag())
|
47303 | return;
|
47304 | const panDelta = touchDeltaSum.div(touchDeltaCount);
|
47305 | this._sum._add(panDelta);
|
47306 | if (this._sum.mag() < this._clickTolerance)
|
47307 | return;
|
47308 | const around = touchPointSum.div(touchDeltaCount);
|
47309 | return {
|
47310 | around,
|
47311 | panDelta
|
47312 | };
|
47313 | }
|
47314 | enable() {
|
47315 | this._enabled = true;
|
47316 | }
|
47317 | disable() {
|
47318 | this._enabled = false;
|
47319 | this.reset();
|
47320 | }
|
47321 | isEnabled() {
|
47322 | return this._enabled;
|
47323 | }
|
47324 | isActive() {
|
47325 | return this._active;
|
47326 | }
|
47327 | }
|
47328 |
|
47329 | class TwoTouchHandler {
|
47330 | constructor() {
|
47331 | this.reset();
|
47332 | }
|
47333 | reset() {
|
47334 | this._active = false;
|
47335 | delete this._firstTwoTouches;
|
47336 | }
|
47337 | _start(points) { } //eslint-disable-line
|
47338 | _move(points, pinchAround, e) { return {}; } //eslint-disable-line
|
47339 | touchstart(e, points, mapTouches) {
|
47340 | //console.log(e.target, e.targetTouches.length ? e.targetTouches[0].target : null);
|
47341 | //log('touchstart', points, e.target.innerHTML, e.targetTouches.length ? e.targetTouches[0].target.innerHTML: undefined);
|
47342 | if (this._firstTwoTouches || mapTouches.length < 2)
|
47343 | return;
|
47344 | this._firstTwoTouches = [
|
47345 | mapTouches[0].identifier,
|
47346 | mapTouches[1].identifier
|
47347 | ];
|
47348 | // implemented by child classes
|
47349 | this._start([points[0], points[1]]);
|
47350 | }
|
47351 | touchmove(e, points, mapTouches) {
|
47352 | if (!this._firstTwoTouches)
|
47353 | return;
|
47354 | e.preventDefault();
|
47355 | const [idA, idB] = this._firstTwoTouches;
|
47356 | const a = getTouchById(mapTouches, points, idA);
|
47357 | const b = getTouchById(mapTouches, points, idB);
|
47358 | if (!a || !b)
|
47359 | return;
|
47360 | const pinchAround = this._aroundCenter ? null : a.add(b).div(2);
|
47361 | // implemented by child classes
|
47362 | return this._move([a, b], pinchAround, e);
|
47363 | }
|
47364 | touchend(e, points, mapTouches) {
|
47365 | if (!this._firstTwoTouches)
|
47366 | return;
|
47367 | const [idA, idB] = this._firstTwoTouches;
|
47368 | const a = getTouchById(mapTouches, points, idA);
|
47369 | const b = getTouchById(mapTouches, points, idB);
|
47370 | if (a && b)
|
47371 | return;
|
47372 | if (this._active)
|
47373 | DOM.suppressClick();
|
47374 | this.reset();
|
47375 | }
|
47376 | touchcancel() {
|
47377 | this.reset();
|
47378 | }
|
47379 | enable(options) {
|
47380 | this._enabled = true;
|
47381 | this._aroundCenter = !!options && options.around === 'center';
|
47382 | }
|
47383 | disable() {
|
47384 | this._enabled = false;
|
47385 | this.reset();
|
47386 | }
|
47387 | isEnabled() {
|
47388 | return this._enabled;
|
47389 | }
|
47390 | isActive() {
|
47391 | return this._active;
|
47392 | }
|
47393 | }
|
47394 | function getTouchById(mapTouches, points, identifier) {
|
47395 | for (let i = 0; i < mapTouches.length; i++) {
|
47396 | if (mapTouches[i].identifier === identifier)
|
47397 | return points[i];
|
47398 | }
|
47399 | }
|
47400 | /* ZOOM */
|
47401 | const ZOOM_THRESHOLD = 0.1;
|
47402 | function getZoomDelta(distance, lastDistance) {
|
47403 | return Math.log(distance / lastDistance) / Math.LN2;
|
47404 | }
|
47405 | class TouchZoomHandler extends TwoTouchHandler {
|
47406 | reset() {
|
47407 | super.reset();
|
47408 | delete this._distance;
|
47409 | delete this._startDistance;
|
47410 | }
|
47411 | _start(points) {
|
47412 | this._startDistance = this._distance = points[0].dist(points[1]);
|
47413 | }
|
47414 | _move(points, pinchAround) {
|
47415 | const lastDistance = this._distance;
|
47416 | this._distance = points[0].dist(points[1]);
|
47417 | if (!this._active && Math.abs(getZoomDelta(this._distance, this._startDistance)) < ZOOM_THRESHOLD)
|
47418 | return;
|
47419 | this._active = true;
|
47420 | return {
|
47421 | zoomDelta: getZoomDelta(this._distance, lastDistance),
|
47422 | pinchAround
|
47423 | };
|
47424 | }
|
47425 | }
|
47426 | /* ROTATE */
|
47427 | const ROTATION_THRESHOLD = 25; // pixels along circumference of touch circle
|
47428 | function getBearingDelta(a, b) {
|
47429 | return a.angleWith(b) * 180 / Math.PI;
|
47430 | }
|
47431 | class TouchRotateHandler extends TwoTouchHandler {
|
47432 | reset() {
|
47433 | super.reset();
|
47434 | delete this._minDiameter;
|
47435 | delete this._startVector;
|
47436 | delete this._vector;
|
47437 | }
|
47438 | _start(points) {
|
47439 | this._startVector = this._vector = points[0].sub(points[1]);
|
47440 | this._minDiameter = points[0].dist(points[1]);
|
47441 | }
|
47442 | _move(points, pinchAround) {
|
47443 | const lastVector = this._vector;
|
47444 | this._vector = points[0].sub(points[1]);
|
47445 | if (!this._active && this._isBelowThreshold(this._vector))
|
47446 | return;
|
47447 | this._active = true;
|
47448 | return {
|
47449 | bearingDelta: getBearingDelta(this._vector, lastVector),
|
47450 | pinchAround
|
47451 | };
|
47452 | }
|
47453 | _isBelowThreshold(vector) {
|
47454 | /*
|
47455 | * The threshold before a rotation actually happens is configured in
|
47456 | * pixels alongth circumference of the circle formed by the two fingers.
|
47457 | * This makes the threshold in degrees larger when the fingers are close
|
47458 | * together and smaller when the fingers are far apart.
|
47459 | *
|
47460 | * Use the smallest diameter from the whole gesture to reduce sensitivity
|
47461 | * when pinching in and out.
|
47462 | */
|
47463 | this._minDiameter = Math.min(this._minDiameter, vector.mag());
|
47464 | const circumference = Math.PI * this._minDiameter;
|
47465 | const threshold = ROTATION_THRESHOLD / circumference * 360;
|
47466 | const bearingDeltaSinceStart = getBearingDelta(vector, this._startVector);
|
47467 | return Math.abs(bearingDeltaSinceStart) < threshold;
|
47468 | }
|
47469 | }
|
47470 | /* PITCH */
|
47471 | function isVertical(vector) {
|
47472 | return Math.abs(vector.y) > Math.abs(vector.x);
|
47473 | }
|
47474 | const ALLOWED_SINGLE_TOUCH_TIME = 100;
|
47475 | /**
|
47476 | * The `TouchPitchHandler` allows the user to pitch the map by dragging up and down with two fingers.
|
47477 | */
|
47478 | class TouchPitchHandler extends TwoTouchHandler {
|
47479 | reset() {
|
47480 | super.reset();
|
47481 | this._valid = undefined;
|
47482 | delete this._firstMove;
|
47483 | delete this._lastPoints;
|
47484 | }
|
47485 | _start(points) {
|
47486 | this._lastPoints = points;
|
47487 | if (isVertical(points[0].sub(points[1]))) {
|
47488 | // fingers are more horizontal than vertical
|
47489 | this._valid = false;
|
47490 | }
|
47491 | }
|
47492 | _move(points, center, e) {
|
47493 | const vectorA = points[0].sub(this._lastPoints[0]);
|
47494 | const vectorB = points[1].sub(this._lastPoints[1]);
|
47495 | this._valid = this.gestureBeginsVertically(vectorA, vectorB, e.timeStamp);
|
47496 | if (!this._valid)
|
47497 | return;
|
47498 | this._lastPoints = points;
|
47499 | this._active = true;
|
47500 | const yDeltaAverage = (vectorA.y + vectorB.y) / 2;
|
47501 | const degreesPerPixelMoved = -0.5;
|
47502 | return {
|
47503 | pitchDelta: yDeltaAverage * degreesPerPixelMoved
|
47504 | };
|
47505 | }
|
47506 | gestureBeginsVertically(vectorA, vectorB, timeStamp) {
|
47507 | if (this._valid !== undefined)
|
47508 | return this._valid;
|
47509 | const threshold = 2;
|
47510 | const movedA = vectorA.mag() >= threshold;
|
47511 | const movedB = vectorB.mag() >= threshold;
|
47512 | // neither finger has moved a meaningful amount, wait
|
47513 | if (!movedA && !movedB)
|
47514 | return;
|
47515 | // One finger has moved and the other has not.
|
47516 | // If enough time has passed, decide it is not a pitch.
|
47517 | if (!movedA || !movedB) {
|
47518 | if (this._firstMove === undefined) {
|
47519 | this._firstMove = timeStamp;
|
47520 | }
|
47521 | if (timeStamp - this._firstMove < ALLOWED_SINGLE_TOUCH_TIME) {
|
47522 | // still waiting for a movement from the second finger
|
47523 | return undefined;
|
47524 | }
|
47525 | else {
|
47526 | return false;
|
47527 | }
|
47528 | }
|
47529 | const isSameDirection = vectorA.y > 0 === vectorB.y > 0;
|
47530 | return isVertical(vectorA) && isVertical(vectorB) && isSameDirection;
|
47531 | }
|
47532 | }
|
47533 |
|
47534 | const defaultOptions$5 = {
|
47535 | panStep: 100,
|
47536 | bearingStep: 15,
|
47537 | pitchStep: 10
|
47538 | };
|
47539 | /**
|
47540 | * The `KeyboardHandler` allows the user to zoom, rotate, and pan the map using
|
47541 | * the following keyboard shortcuts:
|
47542 | *
|
47543 | * - `=` / `+`: Increase the zoom level by 1.
|
47544 | * - `Shift-=` / `Shift-+`: Increase the zoom level by 2.
|
47545 | * - `-`: Decrease the zoom level by 1.
|
47546 | * - `Shift--`: Decrease the zoom level by 2.
|
47547 | * - Arrow keys: Pan by 100 pixels.
|
47548 | * - `Shift+⇢`: Increase the rotation by 15 degrees.
|
47549 | * - `Shift+⇠`: Decrease the rotation by 15 degrees.
|
47550 | * - `Shift+⇡`: Increase the pitch by 10 degrees.
|
47551 | * - `Shift+⇣`: Decrease the pitch by 10 degrees.
|
47552 | */
|
47553 | class KeyboardHandler {
|
47554 | /**
|
47555 | * @private
|
47556 | */
|
47557 | constructor() {
|
47558 | const stepOptions = defaultOptions$5;
|
47559 | this._panStep = stepOptions.panStep;
|
47560 | this._bearingStep = stepOptions.bearingStep;
|
47561 | this._pitchStep = stepOptions.pitchStep;
|
47562 | this._rotationDisabled = false;
|
47563 | }
|
47564 | reset() {
|
47565 | this._active = false;
|
47566 | }
|
47567 | keydown(e) {
|
47568 | if (e.altKey || e.ctrlKey || e.metaKey)
|
47569 | return;
|
47570 | let zoomDir = 0;
|
47571 | let bearingDir = 0;
|
47572 | let pitchDir = 0;
|
47573 | let xDir = 0;
|
47574 | let yDir = 0;
|
47575 | switch (e.keyCode) {
|
47576 | case 61:
|
47577 | case 107:
|
47578 | case 171:
|
47579 | case 187:
|
47580 | zoomDir = 1;
|
47581 | break;
|
47582 | case 189:
|
47583 | case 109:
|
47584 | case 173:
|
47585 | zoomDir = -1;
|
47586 | break;
|
47587 | case 37:
|
47588 | if (e.shiftKey) {
|
47589 | bearingDir = -1;
|
47590 | }
|
47591 | else {
|
47592 | e.preventDefault();
|
47593 | xDir = -1;
|
47594 | }
|
47595 | break;
|
47596 | case 39:
|
47597 | if (e.shiftKey) {
|
47598 | bearingDir = 1;
|
47599 | }
|
47600 | else {
|
47601 | e.preventDefault();
|
47602 | xDir = 1;
|
47603 | }
|
47604 | break;
|
47605 | case 38:
|
47606 | if (e.shiftKey) {
|
47607 | pitchDir = 1;
|
47608 | }
|
47609 | else {
|
47610 | e.preventDefault();
|
47611 | yDir = -1;
|
47612 | }
|
47613 | break;
|
47614 | case 40:
|
47615 | if (e.shiftKey) {
|
47616 | pitchDir = -1;
|
47617 | }
|
47618 | else {
|
47619 | e.preventDefault();
|
47620 | yDir = 1;
|
47621 | }
|
47622 | break;
|
47623 | default:
|
47624 | return;
|
47625 | }
|
47626 | if (this._rotationDisabled) {
|
47627 | bearingDir = 0;
|
47628 | pitchDir = 0;
|
47629 | }
|
47630 | return {
|
47631 | cameraAnimation: (map) => {
|
47632 | const zoom = map.getZoom();
|
47633 | map.easeTo({
|
47634 | duration: 300,
|
47635 | easeId: 'keyboardHandler',
|
47636 | easing: easeOut,
|
47637 | zoom: zoomDir ? Math.round(zoom) + zoomDir * (e.shiftKey ? 2 : 1) : zoom,
|
47638 | bearing: map.getBearing() + bearingDir * this._bearingStep,
|
47639 | pitch: map.getPitch() + pitchDir * this._pitchStep,
|
47640 | offset: [-xDir * this._panStep, -yDir * this._panStep],
|
47641 | center: map.getCenter()
|
47642 | }, { originalEvent: e });
|
47643 | }
|
47644 | };
|
47645 | }
|
47646 | /**
|
47647 | * Enables the "keyboard rotate and zoom" interaction.
|
47648 | *
|
47649 | * @example
|
47650 | * map.keyboard.enable();
|
47651 | */
|
47652 | enable() {
|
47653 | this._enabled = true;
|
47654 | }
|
47655 | /**
|
47656 | * Disables the "keyboard rotate and zoom" interaction.
|
47657 | *
|
47658 | * @example
|
47659 | * map.keyboard.disable();
|
47660 | */
|
47661 | disable() {
|
47662 | this._enabled = false;
|
47663 | this.reset();
|
47664 | }
|
47665 | /**
|
47666 | * Returns a Boolean indicating whether the "keyboard rotate and zoom"
|
47667 | * interaction is enabled.
|
47668 | *
|
47669 | * @returns {boolean} `true` if the "keyboard rotate and zoom"
|
47670 | * interaction is enabled.
|
47671 | */
|
47672 | isEnabled() {
|
47673 | return this._enabled;
|
47674 | }
|
47675 | /**
|
47676 | * Returns true if the handler is enabled and has detected the start of a
|
47677 | * zoom/rotate gesture.
|
47678 | *
|
47679 | * @returns {boolean} `true` if the handler is enabled and has detected the
|
47680 | * start of a zoom/rotate gesture.
|
47681 | */
|
47682 | isActive() {
|
47683 | return this._active;
|
47684 | }
|
47685 | /**
|
47686 | * Disables the "keyboard pan/rotate" interaction, leaving the
|
47687 | * "keyboard zoom" interaction enabled.
|
47688 | *
|
47689 | * @example
|
47690 | * map.keyboard.disableRotation();
|
47691 | */
|
47692 | disableRotation() {
|
47693 | this._rotationDisabled = true;
|
47694 | }
|
47695 | /**
|
47696 | * Enables the "keyboard pan/rotate" interaction.
|
47697 | *
|
47698 | * @example
|
47699 | * map.keyboard.enable();
|
47700 | * map.keyboard.enableRotation();
|
47701 | */
|
47702 | enableRotation() {
|
47703 | this._rotationDisabled = false;
|
47704 | }
|
47705 | }
|
47706 | function easeOut(t) {
|
47707 | return t * (2 - t);
|
47708 | }
|
47709 |
|
47710 | // deltaY value for mouse scroll wheel identification
|
47711 | const wheelZoomDelta = 4.000244140625;
|
47712 | // These magic numbers control the rate of zoom. Trackpad events fire at a greater
|
47713 | // frequency than mouse scroll wheel, so reduce the zoom rate per wheel tick
|
47714 | const defaultZoomRate = 1 / 100;
|
47715 | const wheelZoomRate = 1 / 450;
|
47716 | // upper bound on how much we scale the map in any single render frame; this
|
47717 | // is used to limit zoom rate in the case of very fast scrolling
|
47718 | const maxScalePerFrame = 2;
|
47719 | /**
|
47720 | * The `ScrollZoomHandler` allows the user to zoom the map by scrolling.
|
47721 | */
|
47722 | class ScrollZoomHandler {
|
47723 | /**
|
47724 | * @private
|
47725 | */
|
47726 | constructor(map, handler) {
|
47727 | this._map = map;
|
47728 | this._el = map.getCanvasContainer();
|
47729 | this._handler = handler;
|
47730 | this._delta = 0;
|
47731 | this._defaultZoomRate = defaultZoomRate;
|
47732 | this._wheelZoomRate = wheelZoomRate;
|
47733 | performance.bindAll(['_onTimeout'], this);
|
47734 | }
|
47735 | /**
|
47736 | * Set the zoom rate of a trackpad
|
47737 | * @param {number} [zoomRate=1/100] The rate used to scale trackpad movement to a zoom value.
|
47738 | * @example
|
47739 | * // Speed up trackpad zoom
|
47740 | * map.scrollZoom.setZoomRate(1/25);
|
47741 | */
|
47742 | setZoomRate(zoomRate) {
|
47743 | this._defaultZoomRate = zoomRate;
|
47744 | }
|
47745 | /**
|
47746 | * Set the zoom rate of a mouse wheel
|
47747 | * @param {number} [wheelZoomRate=1/450] The rate used to scale mouse wheel movement to a zoom value.
|
47748 | * @example
|
47749 | * // Slow down zoom of mouse wheel
|
47750 | * map.scrollZoom.setWheelZoomRate(1/600);
|
47751 | */
|
47752 | setWheelZoomRate(wheelZoomRate) {
|
47753 | this._wheelZoomRate = wheelZoomRate;
|
47754 | }
|
47755 | /**
|
47756 | * Returns a Boolean indicating whether the "scroll to zoom" interaction is enabled.
|
47757 | *
|
47758 | * @returns {boolean} `true` if the "scroll to zoom" interaction is enabled.
|
47759 | */
|
47760 | isEnabled() {
|
47761 | return !!this._enabled;
|
47762 | }
|
47763 | /*
|
47764 | * Active state is turned on and off with every scroll wheel event and is set back to false before the map
|
47765 | * render is called, so _active is not a good candidate for determining if a scroll zoom animation is in
|
47766 | * progress.
|
47767 | */
|
47768 | isActive() {
|
47769 | return !!this._active || this._finishTimeout !== undefined;
|
47770 | }
|
47771 | isZooming() {
|
47772 | return !!this._zooming;
|
47773 | }
|
47774 | /**
|
47775 | * Enables the "scroll to zoom" interaction.
|
47776 | *
|
47777 | * @param {Object} [options] Options object.
|
47778 | * @param {string} [options.around] If "center" is passed, map will zoom around center of map
|
47779 | *
|
47780 | * @example
|
47781 | * map.scrollZoom.enable();
|
47782 | * @example
|
47783 | * map.scrollZoom.enable({ around: 'center' })
|
47784 | */
|
47785 | enable(options) {
|
47786 | if (this.isEnabled())
|
47787 | return;
|
47788 | this._enabled = true;
|
47789 | this._aroundCenter = options && options.around === 'center';
|
47790 | }
|
47791 | /**
|
47792 | * Disables the "scroll to zoom" interaction.
|
47793 | *
|
47794 | * @example
|
47795 | * map.scrollZoom.disable();
|
47796 | */
|
47797 | disable() {
|
47798 | if (!this.isEnabled())
|
47799 | return;
|
47800 | this._enabled = false;
|
47801 | }
|
47802 | wheel(e) {
|
47803 | if (!this.isEnabled())
|
47804 | return;
|
47805 | let value = e.deltaMode === WheelEvent.DOM_DELTA_LINE ? e.deltaY * 40 : e.deltaY;
|
47806 | const now = performance.exported.now(), timeDelta = now - (this._lastWheelEventTime || 0);
|
47807 | this._lastWheelEventTime = now;
|
47808 | if (value !== 0 && (value % wheelZoomDelta) === 0) {
|
47809 | // This one is definitely a mouse wheel event.
|
47810 | this._type = 'wheel';
|
47811 | }
|
47812 | else if (value !== 0 && Math.abs(value) < 4) {
|
47813 | // This one is definitely a trackpad event because it is so small.
|
47814 | this._type = 'trackpad';
|
47815 | }
|
47816 | else if (timeDelta > 400) {
|
47817 | // This is likely a new scroll action.
|
47818 | this._type = null;
|
47819 | this._lastValue = value;
|
47820 | // Start a timeout in case this was a singular event, and dely it by up to 40ms.
|
47821 | this._timeout = setTimeout(this._onTimeout, 40, e);
|
47822 | }
|
47823 | else if (!this._type) {
|
47824 | // This is a repeating event, but we don't know the type of event just yet.
|
47825 | // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode.
|
47826 | this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel';
|
47827 | // Make sure our delayed event isn't fired again, because we accumulate
|
47828 | // the previous event (which was less than 40ms ago) into this event.
|
47829 | if (this._timeout) {
|
47830 | clearTimeout(this._timeout);
|
47831 | this._timeout = null;
|
47832 | value += this._lastValue;
|
47833 | }
|
47834 | }
|
47835 | // Slow down zoom if shift key is held for more precise zooming
|
47836 | if (e.shiftKey && value)
|
47837 | value = value / 4;
|
47838 | // Only fire the callback if we actually know what type of scrolling device the user uses.
|
47839 | if (this._type) {
|
47840 | this._lastWheelEvent = e;
|
47841 | this._delta -= value;
|
47842 | if (!this._active) {
|
47843 | this._start(e);
|
47844 | }
|
47845 | }
|
47846 | e.preventDefault();
|
47847 | }
|
47848 | _onTimeout(initialEvent) {
|
47849 | this._type = 'wheel';
|
47850 | this._delta -= this._lastValue;
|
47851 | if (!this._active) {
|
47852 | this._start(initialEvent);
|
47853 | }
|
47854 | }
|
47855 | _start(e) {
|
47856 | if (!this._delta)
|
47857 | return;
|
47858 | if (this._frameId) {
|
47859 | this._frameId = null;
|
47860 | }
|
47861 | this._active = true;
|
47862 | if (!this.isZooming()) {
|
47863 | this._zooming = true;
|
47864 | }
|
47865 | if (this._finishTimeout) {
|
47866 | clearTimeout(this._finishTimeout);
|
47867 | delete this._finishTimeout;
|
47868 | }
|
47869 | const pos = DOM.mousePos(this._el, e);
|
47870 | this._around = performance.LngLat.convert(this._aroundCenter ? this._map.getCenter() : this._map.unproject(pos));
|
47871 | this._aroundPoint = this._map.transform.locationPoint(this._around);
|
47872 | if (!this._frameId) {
|
47873 | this._frameId = true;
|
47874 | this._handler._triggerRenderFrame();
|
47875 | }
|
47876 | }
|
47877 | renderFrame() {
|
47878 | if (!this._frameId)
|
47879 | return;
|
47880 | this._frameId = null;
|
47881 | if (!this.isActive())
|
47882 | return;
|
47883 | const tr = this._map.transform;
|
47884 | // if we've had scroll events since the last render frame, consume the
|
47885 | // accumulated delta, and update the target zoom level accordingly
|
47886 | if (this._delta !== 0) {
|
47887 | // For trackpad events and single mouse wheel ticks, use the default zoom rate
|
47888 | const zoomRate = (this._type === 'wheel' && Math.abs(this._delta) > wheelZoomDelta) ? this._wheelZoomRate : this._defaultZoomRate;
|
47889 | // Scale by sigmoid of scroll wheel delta.
|
47890 | let scale = maxScalePerFrame / (1 + Math.exp(-Math.abs(this._delta * zoomRate)));
|
47891 | if (this._delta < 0 && scale !== 0) {
|
47892 | scale = 1 / scale;
|
47893 | }
|
47894 | const fromScale = typeof this._targetZoom === 'number' ? tr.zoomScale(this._targetZoom) : tr.scale;
|
47895 | this._targetZoom = Math.min(tr.maxZoom, Math.max(tr.minZoom, tr.scaleZoom(fromScale * scale)));
|
47896 | // if this is a mouse wheel, refresh the starting zoom and easing
|
47897 | // function we're using to smooth out the zooming between wheel
|
47898 | // events
|
47899 | if (this._type === 'wheel') {
|
47900 | this._startZoom = tr.zoom;
|
47901 | this._easing = this._smoothOutEasing(200);
|
47902 | }
|
47903 | this._delta = 0;
|
47904 | }
|
47905 | const targetZoom = typeof this._targetZoom === 'number' ?
|
47906 | this._targetZoom : tr.zoom;
|
47907 | const startZoom = this._startZoom;
|
47908 | const easing = this._easing;
|
47909 | let finished = false;
|
47910 | let zoom;
|
47911 | if (this._type === 'wheel' && startZoom && easing) {
|
47912 | performance.assert(easing && typeof startZoom === 'number');
|
47913 | const t = Math.min((performance.exported.now() - this._lastWheelEventTime) / 200, 1);
|
47914 | const k = easing(t);
|
47915 | zoom = performance.number(startZoom, targetZoom, k);
|
47916 | if (t < 1) {
|
47917 | if (!this._frameId) {
|
47918 | this._frameId = true;
|
47919 | }
|
47920 | }
|
47921 | else {
|
47922 | finished = true;
|
47923 | }
|
47924 | }
|
47925 | else {
|
47926 | zoom = targetZoom;
|
47927 | finished = true;
|
47928 | }
|
47929 | this._active = true;
|
47930 | if (finished) {
|
47931 | this._active = false;
|
47932 | this._finishTimeout = setTimeout(() => {
|
47933 | this._zooming = false;
|
47934 | this._handler._triggerRenderFrame();
|
47935 | delete this._targetZoom;
|
47936 | delete this._finishTimeout;
|
47937 | }, 200);
|
47938 | }
|
47939 | return {
|
47940 | noInertia: true,
|
47941 | needsRenderFrame: !finished,
|
47942 | zoomDelta: zoom - tr.zoom,
|
47943 | around: this._aroundPoint,
|
47944 | originalEvent: this._lastWheelEvent
|
47945 | };
|
47946 | }
|
47947 | _smoothOutEasing(duration) {
|
47948 | let easing = performance.ease;
|
47949 | if (this._prevEase) {
|
47950 | const ease = this._prevEase, t = (performance.exported.now() - ease.start) / ease.duration, speed = ease.easing(t + 0.01) - ease.easing(t),
|
47951 | // Quick hack to make new bezier that is continuous with last
|
47952 | x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01, y = Math.sqrt(0.27 * 0.27 - x * x);
|
47953 | easing = performance.bezier(x, y, 0.25, 1);
|
47954 | }
|
47955 | this._prevEase = {
|
47956 | start: performance.exported.now(),
|
47957 | duration,
|
47958 | easing
|
47959 | };
|
47960 | return easing;
|
47961 | }
|
47962 | reset() {
|
47963 | this._active = false;
|
47964 | }
|
47965 | }
|
47966 |
|
47967 | /**
|
47968 | * The `DoubleClickZoomHandler` allows the user to zoom the map at a point by
|
47969 | * double clicking or double tapping.
|
47970 | */
|
47971 | class DoubleClickZoomHandler {
|
47972 | /**
|
47973 | * @private
|
47974 | */
|
47975 | constructor(clickZoom, TapZoom) {
|
47976 | this._clickZoom = clickZoom;
|
47977 | this._tapZoom = TapZoom;
|
47978 | }
|
47979 | /**
|
47980 | * Enables the "double click to zoom" interaction.
|
47981 | *
|
47982 | * @example
|
47983 | * map.doubleClickZoom.enable();
|
47984 | */
|
47985 | enable() {
|
47986 | this._clickZoom.enable();
|
47987 | this._tapZoom.enable();
|
47988 | }
|
47989 | /**
|
47990 | * Disables the "double click to zoom" interaction.
|
47991 | *
|
47992 | * @example
|
47993 | * map.doubleClickZoom.disable();
|
47994 | */
|
47995 | disable() {
|
47996 | this._clickZoom.disable();
|
47997 | this._tapZoom.disable();
|
47998 | }
|
47999 | /**
|
48000 | * Returns a Boolean indicating whether the "double click to zoom" interaction is enabled.
|
48001 | *
|
48002 | * @returns {boolean} `true` if the "double click to zoom" interaction is enabled.
|
48003 | */
|
48004 | isEnabled() {
|
48005 | return this._clickZoom.isEnabled() && this._tapZoom.isEnabled();
|
48006 | }
|
48007 | /**
|
48008 | * Returns a Boolean indicating whether the "double click to zoom" interaction is active, i.e. currently being used.
|
48009 | *
|
48010 | * @returns {boolean} `true` if the "double click to zoom" interaction is active.
|
48011 | */
|
48012 | isActive() {
|
48013 | return this._clickZoom.isActive() || this._tapZoom.isActive();
|
48014 | }
|
48015 | }
|
48016 |
|
48017 | class ClickZoomHandler {
|
48018 | constructor() {
|
48019 | this.reset();
|
48020 | }
|
48021 | reset() {
|
48022 | this._active = false;
|
48023 | }
|
48024 | dblclick(e, point) {
|
48025 | e.preventDefault();
|
48026 | return {
|
48027 | cameraAnimation: (map) => {
|
48028 | map.easeTo({
|
48029 | duration: 300,
|
48030 | zoom: map.getZoom() + (e.shiftKey ? -1 : 1),
|
48031 | around: map.unproject(point)
|
48032 | }, { originalEvent: e });
|
48033 | }
|
48034 | };
|
48035 | }
|
48036 | enable() {
|
48037 | this._enabled = true;
|
48038 | }
|
48039 | disable() {
|
48040 | this._enabled = false;
|
48041 | this.reset();
|
48042 | }
|
48043 | isEnabled() {
|
48044 | return this._enabled;
|
48045 | }
|
48046 | isActive() {
|
48047 | return this._active;
|
48048 | }
|
48049 | }
|
48050 |
|
48051 | class TapDragZoomHandler {
|
48052 | constructor() {
|
48053 | this._tap = new TapRecognizer({
|
48054 | numTouches: 1,
|
48055 | numTaps: 1
|
48056 | });
|
48057 | this.reset();
|
48058 | }
|
48059 | reset() {
|
48060 | this._active = false;
|
48061 | delete this._swipePoint;
|
48062 | delete this._swipeTouch;
|
48063 | delete this._tapTime;
|
48064 | this._tap.reset();
|
48065 | }
|
48066 | touchstart(e, points, mapTouches) {
|
48067 | if (this._swipePoint)
|
48068 | return;
|
48069 | if (this._tapTime && e.timeStamp - this._tapTime > MAX_TAP_INTERVAL) {
|
48070 | this.reset();
|
48071 | }
|
48072 | if (!this._tapTime) {
|
48073 | this._tap.touchstart(e, points, mapTouches);
|
48074 | }
|
48075 | else if (mapTouches.length > 0) {
|
48076 | this._swipePoint = points[0];
|
48077 | this._swipeTouch = mapTouches[0].identifier;
|
48078 | }
|
48079 | }
|
48080 | touchmove(e, points, mapTouches) {
|
48081 | if (!this._tapTime) {
|
48082 | this._tap.touchmove(e, points, mapTouches);
|
48083 | }
|
48084 | else if (this._swipePoint) {
|
48085 | if (mapTouches[0].identifier !== this._swipeTouch) {
|
48086 | return;
|
48087 | }
|
48088 | const newSwipePoint = points[0];
|
48089 | const dist = newSwipePoint.y - this._swipePoint.y;
|
48090 | this._swipePoint = newSwipePoint;
|
48091 | e.preventDefault();
|
48092 | this._active = true;
|
48093 | return {
|
48094 | zoomDelta: dist / 128
|
48095 | };
|
48096 | }
|
48097 | }
|
48098 | touchend(e, points, mapTouches) {
|
48099 | if (!this._tapTime) {
|
48100 | const point = this._tap.touchend(e, points, mapTouches);
|
48101 | if (point) {
|
48102 | this._tapTime = e.timeStamp;
|
48103 | }
|
48104 | }
|
48105 | else if (this._swipePoint) {
|
48106 | if (mapTouches.length === 0) {
|
48107 | this.reset();
|
48108 | }
|
48109 | }
|
48110 | }
|
48111 | touchcancel() {
|
48112 | this.reset();
|
48113 | }
|
48114 | enable() {
|
48115 | this._enabled = true;
|
48116 | }
|
48117 | disable() {
|
48118 | this._enabled = false;
|
48119 | this.reset();
|
48120 | }
|
48121 | isEnabled() {
|
48122 | return this._enabled;
|
48123 | }
|
48124 | isActive() {
|
48125 | return this._active;
|
48126 | }
|
48127 | }
|
48128 |
|
48129 | /**
|
48130 | * The `DragPanHandler` allows the user to pan the map by clicking and dragging
|
48131 | * the cursor.
|
48132 | */
|
48133 | class DragPanHandler {
|
48134 | /**
|
48135 | * @private
|
48136 | */
|
48137 | constructor(el, mousePan, touchPan) {
|
48138 | this._el = el;
|
48139 | this._mousePan = mousePan;
|
48140 | this._touchPan = touchPan;
|
48141 | }
|
48142 | /**
|
48143 | * Enables the "drag to pan" interaction.
|
48144 | *
|
48145 | * @param {Object} [options] Options object
|
48146 | * @param {number} [options.linearity=0] factor used to scale the drag velocity
|
48147 | * @param {Function} [options.easing=bezier(0, 0, 0.3, 1)] easing function applled to `map.panTo` when applying the drag.
|
48148 | * @param {number} [options.maxSpeed=1400] the maximum value of the drag velocity.
|
48149 | * @param {number} [options.deceleration=2500] the rate at which the speed reduces after the pan ends.
|
48150 | *
|
48151 | * @example
|
48152 | * map.dragPan.enable();
|
48153 | * @example
|
48154 | * map.dragPan.enable({
|
48155 | * linearity: 0.3,
|
48156 | * easing: bezier(0, 0, 0.3, 1),
|
48157 | * maxSpeed: 1400,
|
48158 | * deceleration: 2500,
|
48159 | * });
|
48160 | */
|
48161 | enable(options) {
|
48162 | this._inertiaOptions = options || {};
|
48163 | this._mousePan.enable();
|
48164 | this._touchPan.enable();
|
48165 | this._el.classList.add('maplibregl-touch-drag-pan', 'mapboxgl-touch-drag-pan');
|
48166 | }
|
48167 | /**
|
48168 | * Disables the "drag to pan" interaction.
|
48169 | *
|
48170 | * @example
|
48171 | * map.dragPan.disable();
|
48172 | */
|
48173 | disable() {
|
48174 | this._mousePan.disable();
|
48175 | this._touchPan.disable();
|
48176 | this._el.classList.remove('maplibregl-touch-drag-pan', 'mapboxgl-touch-drag-pan');
|
48177 | }
|
48178 | /**
|
48179 | * Returns a Boolean indicating whether the "drag to pan" interaction is enabled.
|
48180 | *
|
48181 | * @returns {boolean} `true` if the "drag to pan" interaction is enabled.
|
48182 | */
|
48183 | isEnabled() {
|
48184 | return this._mousePan.isEnabled() && this._touchPan.isEnabled();
|
48185 | }
|
48186 | /**
|
48187 | * Returns a Boolean indicating whether the "drag to pan" interaction is active, i.e. currently being used.
|
48188 | *
|
48189 | * @returns {boolean} `true` if the "drag to pan" interaction is active.
|
48190 | */
|
48191 | isActive() {
|
48192 | return this._mousePan.isActive() || this._touchPan.isActive();
|
48193 | }
|
48194 | }
|
48195 |
|
48196 | /**
|
48197 | * The `DragRotateHandler` allows the user to rotate the map by clicking and
|
48198 | * dragging the cursor while holding the right mouse button or `ctrl` key.
|
48199 | */
|
48200 | class DragRotateHandler {
|
48201 | /**
|
48202 | * @param {Object} [options]
|
48203 | * @param {number} [options.bearingSnap] The threshold, measured in degrees, that determines when the map's
|
48204 | * bearing will snap to north.
|
48205 | * @param {bool} [options.pitchWithRotate=true] Control the map pitch in addition to the bearing
|
48206 | * @private
|
48207 | */
|
48208 | constructor(options, mouseRotate, mousePitch) {
|
48209 | this._pitchWithRotate = options.pitchWithRotate;
|
48210 | this._mouseRotate = mouseRotate;
|
48211 | this._mousePitch = mousePitch;
|
48212 | }
|
48213 | /**
|
48214 | * Enables the "drag to rotate" interaction.
|
48215 | *
|
48216 | * @example
|
48217 | * map.dragRotate.enable();
|
48218 | */
|
48219 | enable() {
|
48220 | this._mouseRotate.enable();
|
48221 | if (this._pitchWithRotate)
|
48222 | this._mousePitch.enable();
|
48223 | }
|
48224 | /**
|
48225 | * Disables the "drag to rotate" interaction.
|
48226 | *
|
48227 | * @example
|
48228 | * map.dragRotate.disable();
|
48229 | */
|
48230 | disable() {
|
48231 | this._mouseRotate.disable();
|
48232 | this._mousePitch.disable();
|
48233 | }
|
48234 | /**
|
48235 | * Returns a Boolean indicating whether the "drag to rotate" interaction is enabled.
|
48236 | *
|
48237 | * @returns {boolean} `true` if the "drag to rotate" interaction is enabled.
|
48238 | */
|
48239 | isEnabled() {
|
48240 | return this._mouseRotate.isEnabled() && (!this._pitchWithRotate || this._mousePitch.isEnabled());
|
48241 | }
|
48242 | /**
|
48243 | * Returns a Boolean indicating whether the "drag to rotate" interaction is active, i.e. currently being used.
|
48244 | *
|
48245 | * @returns {boolean} `true` if the "drag to rotate" interaction is active.
|
48246 | */
|
48247 | isActive() {
|
48248 | return this._mouseRotate.isActive() || this._mousePitch.isActive();
|
48249 | }
|
48250 | }
|
48251 |
|
48252 | /**
|
48253 | * The `TouchZoomRotateHandler` allows the user to zoom and rotate the map by
|
48254 | * pinching on a touchscreen.
|
48255 | *
|
48256 | * They can zoom with one finger by double tapping and dragging. On the second tap,
|
48257 | * hold the finger down and drag up or down to zoom in or out.
|
48258 | */
|
48259 | class TouchZoomRotateHandler {
|
48260 | /**
|
48261 | * @private
|
48262 | */
|
48263 | constructor(el, touchZoom, touchRotate, tapDragZoom) {
|
48264 | this._el = el;
|
48265 | this._touchZoom = touchZoom;
|
48266 | this._touchRotate = touchRotate;
|
48267 | this._tapDragZoom = tapDragZoom;
|
48268 | this._rotationDisabled = false;
|
48269 | this._enabled = true;
|
48270 | }
|
48271 | /**
|
48272 | * Enables the "pinch to rotate and zoom" interaction.
|
48273 | *
|
48274 | * @param {Object} [options] Options object.
|
48275 | * @param {string} [options.around] If "center" is passed, map will zoom around the center
|
48276 | *
|
48277 | * @example
|
48278 | * map.touchZoomRotate.enable();
|
48279 | * @example
|
48280 | * map.touchZoomRotate.enable({ around: 'center' });
|
48281 | */
|
48282 | enable(options) {
|
48283 | this._touchZoom.enable(options);
|
48284 | if (!this._rotationDisabled)
|
48285 | this._touchRotate.enable(options);
|
48286 | this._tapDragZoom.enable();
|
48287 | this._el.classList.add('maplibregl-touch-zoom-rotate', 'mapboxgl-touch-zoom-rotate');
|
48288 | }
|
48289 | /**
|
48290 | * Disables the "pinch to rotate and zoom" interaction.
|
48291 | *
|
48292 | * @example
|
48293 | * map.touchZoomRotate.disable();
|
48294 | */
|
48295 | disable() {
|
48296 | this._touchZoom.disable();
|
48297 | this._touchRotate.disable();
|
48298 | this._tapDragZoom.disable();
|
48299 | this._el.classList.remove('maplibregl-touch-zoom-rotate', 'mapboxgl-touch-zoom-rotate');
|
48300 | }
|
48301 | /**
|
48302 | * Returns a Boolean indicating whether the "pinch to rotate and zoom" interaction is enabled.
|
48303 | *
|
48304 | * @returns {boolean} `true` if the "pinch to rotate and zoom" interaction is enabled.
|
48305 | */
|
48306 | isEnabled() {
|
48307 | return this._touchZoom.isEnabled() &&
|
48308 | (this._rotationDisabled || this._touchRotate.isEnabled()) &&
|
48309 | this._tapDragZoom.isEnabled();
|
48310 | }
|
48311 | /**
|
48312 | * Returns true if the handler is enabled and has detected the start of a zoom/rotate gesture.
|
48313 | *
|
48314 | * @returns {boolean} //eslint-disable-line
|
48315 | */
|
48316 | isActive() {
|
48317 | return this._touchZoom.isActive() || this._touchRotate.isActive() || this._tapDragZoom.isActive();
|
48318 | }
|
48319 | /**
|
48320 | * Disables the "pinch to rotate" interaction, leaving the "pinch to zoom"
|
48321 | * interaction enabled.
|
48322 | *
|
48323 | * @example
|
48324 | * map.touchZoomRotate.disableRotation();
|
48325 | */
|
48326 | disableRotation() {
|
48327 | this._rotationDisabled = true;
|
48328 | this._touchRotate.disable();
|
48329 | }
|
48330 | /**
|
48331 | * Enables the "pinch to rotate" interaction.
|
48332 | *
|
48333 | * @example
|
48334 | * map.touchZoomRotate.enable();
|
48335 | * map.touchZoomRotate.enableRotation();
|
48336 | */
|
48337 | enableRotation() {
|
48338 | this._rotationDisabled = false;
|
48339 | if (this._touchZoom.isEnabled())
|
48340 | this._touchRotate.enable();
|
48341 | }
|
48342 | }
|
48343 |
|
48344 | const isMoving = p => p.zoom || p.drag || p.pitch || p.rotate;
|
48345 | class RenderFrameEvent extends performance.Event {
|
48346 | }
|
48347 | function hasChange(result) {
|
48348 | return (result.panDelta && result.panDelta.mag()) || result.zoomDelta || result.bearingDelta || result.pitchDelta;
|
48349 | }
|
48350 | class HandlerManager {
|
48351 | constructor(map, options) {
|
48352 | this._map = map;
|
48353 | this._el = this._map.getCanvasContainer();
|
48354 | this._handlers = [];
|
48355 | this._handlersById = {};
|
48356 | this._changes = [];
|
48357 | this._inertia = new HandlerInertia(map);
|
48358 | this._bearingSnap = options.bearingSnap;
|
48359 | this._previousActiveHandlers = {};
|
48360 | // Track whether map is currently moving, to compute start/move/end events
|
48361 | this._eventsInProgress = {};
|
48362 | this._addDefaultHandlers(options);
|
48363 | performance.bindAll(['handleEvent', 'handleWindowEvent'], this);
|
48364 | const el = this._el;
|
48365 | this._listeners = [
|
48366 | // This needs to be `passive: true` so that a double tap fires two
|
48367 | // pairs of touchstart/end events in iOS Safari 13. If this is set to
|
48368 | // `passive: false` then the second pair of events is only fired if
|
48369 | // preventDefault() is called on the first touchstart. Calling preventDefault()
|
48370 | // undesirably prevents click events.
|
48371 | [el, 'touchstart', { passive: true }],
|
48372 | // This needs to be `passive: false` so that scrolls and pinches can be
|
48373 | // prevented in browsers that don't support `touch-actions: none`, for example iOS Safari 12.
|
48374 | [el, 'touchmove', { passive: false }],
|
48375 | [el, 'touchend', undefined],
|
48376 | [el, 'touchcancel', undefined],
|
48377 | [el, 'mousedown', undefined],
|
48378 | [el, 'mousemove', undefined],
|
48379 | [el, 'mouseup', undefined],
|
48380 | // Bind window-level event listeners for move and up/end events. In the absence of
|
48381 | // the pointer capture API, which is not supported by all necessary platforms,
|
48382 | // window-level event listeners give us the best shot at capturing events that
|
48383 | // fall outside the map canvas element. Use `{capture: true}` for the move event
|
48384 | // to prevent map move events from being fired during a drag.
|
48385 | [document, 'mousemove', { capture: true }],
|
48386 | [document, 'mouseup', undefined],
|
48387 | [el, 'mouseover', undefined],
|
48388 | [el, 'mouseout', undefined],
|
48389 | [el, 'dblclick', undefined],
|
48390 | [el, 'click', undefined],
|
48391 | [el, 'keydown', { capture: false }],
|
48392 | [el, 'keyup', undefined],
|
48393 | [el, 'wheel', { passive: false }],
|
48394 | [el, 'contextmenu', undefined],
|
48395 | [window, 'blur', undefined]
|
48396 | ];
|
48397 | for (const [target, type, listenerOptions] of this._listeners) {
|
48398 | DOM.addEventListener(target, type, target === document ? this.handleWindowEvent : this.handleEvent, listenerOptions);
|
48399 | }
|
48400 | }
|
48401 | destroy() {
|
48402 | for (const [target, type, listenerOptions] of this._listeners) {
|
48403 | DOM.removeEventListener(target, type, target === document ? this.handleWindowEvent : this.handleEvent, listenerOptions);
|
48404 | }
|
48405 | }
|
48406 | _addDefaultHandlers(options) {
|
48407 | const map = this._map;
|
48408 | const el = map.getCanvasContainer();
|
48409 | this._add('mapEvent', new MapEventHandler(map, options));
|
48410 | const boxZoom = map.boxZoom = new BoxZoomHandler(map, options);
|
48411 | this._add('boxZoom', boxZoom);
|
48412 | const tapZoom = new TapZoomHandler();
|
48413 | const clickZoom = new ClickZoomHandler();
|
48414 | map.doubleClickZoom = new DoubleClickZoomHandler(clickZoom, tapZoom);
|
48415 | this._add('tapZoom', tapZoom);
|
48416 | this._add('clickZoom', clickZoom);
|
48417 | const tapDragZoom = new TapDragZoomHandler();
|
48418 | this._add('tapDragZoom', tapDragZoom);
|
48419 | const touchPitch = map.touchPitch = new TouchPitchHandler();
|
48420 | this._add('touchPitch', touchPitch);
|
48421 | const mouseRotate = new MouseRotateHandler(options);
|
48422 | const mousePitch = new MousePitchHandler(options);
|
48423 | map.dragRotate = new DragRotateHandler(options, mouseRotate, mousePitch);
|
48424 | this._add('mouseRotate', mouseRotate, ['mousePitch']);
|
48425 | this._add('mousePitch', mousePitch, ['mouseRotate']);
|
48426 | const mousePan = new MousePanHandler(options);
|
48427 | const touchPan = new TouchPanHandler(options);
|
48428 | map.dragPan = new DragPanHandler(el, mousePan, touchPan);
|
48429 | this._add('mousePan', mousePan);
|
48430 | this._add('touchPan', touchPan, ['touchZoom', 'touchRotate']);
|
48431 | const touchRotate = new TouchRotateHandler();
|
48432 | const touchZoom = new TouchZoomHandler();
|
48433 | map.touchZoomRotate = new TouchZoomRotateHandler(el, touchZoom, touchRotate, tapDragZoom);
|
48434 | this._add('touchRotate', touchRotate, ['touchPan', 'touchZoom']);
|
48435 | this._add('touchZoom', touchZoom, ['touchPan', 'touchRotate']);
|
48436 | const scrollZoom = map.scrollZoom = new ScrollZoomHandler(map, this);
|
48437 | this._add('scrollZoom', scrollZoom, ['mousePan']);
|
48438 | const keyboard = map.keyboard = new KeyboardHandler();
|
48439 | this._add('keyboard', keyboard);
|
48440 | this._add('blockableMapEvent', new BlockableMapEventHandler(map));
|
48441 | for (const name of ['boxZoom', 'doubleClickZoom', 'tapDragZoom', 'touchPitch', 'dragRotate', 'dragPan', 'touchZoomRotate', 'scrollZoom', 'keyboard']) {
|
48442 | if (options.interactive && options[name]) {
|
48443 | map[name].enable(options[name]);
|
48444 | }
|
48445 | }
|
48446 | }
|
48447 | _add(handlerName, handler, allowed) {
|
48448 | this._handlers.push({ handlerName, handler, allowed });
|
48449 | this._handlersById[handlerName] = handler;
|
48450 | }
|
48451 | stop(allowEndAnimation) {
|
48452 | // do nothing if this method was triggered by a gesture update
|
48453 | if (this._updatingCamera)
|
48454 | return;
|
48455 | for (const { handler } of this._handlers) {
|
48456 | handler.reset();
|
48457 | }
|
48458 | this._inertia.clear();
|
48459 | this._fireEvents({}, {}, allowEndAnimation);
|
48460 | this._changes = [];
|
48461 | }
|
48462 | isActive() {
|
48463 | for (const { handler } of this._handlers) {
|
48464 | if (handler.isActive())
|
48465 | return true;
|
48466 | }
|
48467 | return false;
|
48468 | }
|
48469 | isZooming() {
|
48470 | return !!this._eventsInProgress.zoom || this._map.scrollZoom.isZooming();
|
48471 | }
|
48472 | isRotating() {
|
48473 | return !!this._eventsInProgress.rotate;
|
48474 | }
|
48475 | isMoving() {
|
48476 | return Boolean(isMoving(this._eventsInProgress)) || this.isZooming();
|
48477 | }
|
48478 | _blockedByActive(activeHandlers, allowed, myName) {
|
48479 | for (const name in activeHandlers) {
|
48480 | if (name === myName)
|
48481 | continue;
|
48482 | if (!allowed || allowed.indexOf(name) < 0) {
|
48483 | return true;
|
48484 | }
|
48485 | }
|
48486 | return false;
|
48487 | }
|
48488 | handleWindowEvent(e) {
|
48489 | this.handleEvent(e, `${e.type}Window`);
|
48490 | }
|
48491 | _getMapTouches(touches) {
|
48492 | const mapTouches = [];
|
48493 | for (const t of touches) {
|
48494 | const target = t.target;
|
48495 | if (this._el.contains(target)) {
|
48496 | mapTouches.push(t);
|
48497 | }
|
48498 | }
|
48499 | return mapTouches;
|
48500 | }
|
48501 | handleEvent(e, eventName) {
|
48502 | if (e.type === 'blur') {
|
48503 | this.stop(true);
|
48504 | return;
|
48505 | }
|
48506 | this._updatingCamera = true;
|
48507 | performance.assert(e.timeStamp !== undefined);
|
48508 | const inputEvent = e.type === 'renderFrame' ? undefined : e;
|
48509 | /*
|
48510 | * We don't call e.preventDefault() for any events by default.
|
48511 | * Handlers are responsible for calling it where necessary.
|
48512 | */
|
48513 | const mergedHandlerResult = { needsRenderFrame: false };
|
48514 | const eventsInProgress = {};
|
48515 | const activeHandlers = {};
|
48516 | const eventTouches = e.touches;
|
48517 | const mapTouches = eventTouches ? this._getMapTouches(eventTouches) : undefined;
|
48518 | const points = mapTouches ? DOM.touchPos(this._el, mapTouches) : DOM.mousePos(this._el, e);
|
48519 | for (const { handlerName, handler, allowed } of this._handlers) {
|
48520 | if (!handler.isEnabled())
|
48521 | continue;
|
48522 | let data;
|
48523 | if (this._blockedByActive(activeHandlers, allowed, handlerName)) {
|
48524 | handler.reset();
|
48525 | }
|
48526 | else {
|
48527 | if (handler[eventName || e.type]) {
|
48528 | data = handler[eventName || e.type](e, points, mapTouches);
|
48529 | this.mergeHandlerResult(mergedHandlerResult, eventsInProgress, data, handlerName, inputEvent);
|
48530 | if (data && data.needsRenderFrame) {
|
48531 | this._triggerRenderFrame();
|
48532 | }
|
48533 | }
|
48534 | }
|
48535 | if (data || handler.isActive()) {
|
48536 | activeHandlers[handlerName] = handler;
|
48537 | }
|
48538 | }
|
48539 | const deactivatedHandlers = {};
|
48540 | for (const name in this._previousActiveHandlers) {
|
48541 | if (!activeHandlers[name]) {
|
48542 | deactivatedHandlers[name] = inputEvent;
|
48543 | }
|
48544 | }
|
48545 | this._previousActiveHandlers = activeHandlers;
|
48546 | if (Object.keys(deactivatedHandlers).length || hasChange(mergedHandlerResult)) {
|
48547 | this._changes.push([mergedHandlerResult, eventsInProgress, deactivatedHandlers]);
|
48548 | this._triggerRenderFrame();
|
48549 | }
|
48550 | if (Object.keys(activeHandlers).length || hasChange(mergedHandlerResult)) {
|
48551 | this._map._stop(true);
|
48552 | }
|
48553 | this._updatingCamera = false;
|
48554 | const { cameraAnimation } = mergedHandlerResult;
|
48555 | if (cameraAnimation) {
|
48556 | this._inertia.clear();
|
48557 | this._fireEvents({}, {}, true);
|
48558 | this._changes = [];
|
48559 | cameraAnimation(this._map);
|
48560 | }
|
48561 | }
|
48562 | mergeHandlerResult(mergedHandlerResult, eventsInProgress, handlerResult, name, e) {
|
48563 | if (!handlerResult)
|
48564 | return;
|
48565 | performance.extend(mergedHandlerResult, handlerResult);
|
48566 | const eventData = { handlerName: name, originalEvent: handlerResult.originalEvent || e };
|
48567 | // track which handler changed which camera property
|
48568 | if (handlerResult.zoomDelta !== undefined) {
|
48569 | eventsInProgress.zoom = eventData;
|
48570 | }
|
48571 | if (handlerResult.panDelta !== undefined) {
|
48572 | eventsInProgress.drag = eventData;
|
48573 | }
|
48574 | if (handlerResult.pitchDelta !== undefined) {
|
48575 | eventsInProgress.pitch = eventData;
|
48576 | }
|
48577 | if (handlerResult.bearingDelta !== undefined) {
|
48578 | eventsInProgress.rotate = eventData;
|
48579 | }
|
48580 | }
|
48581 | _applyChanges() {
|
48582 | const combined = {};
|
48583 | const combinedEventsInProgress = {};
|
48584 | const combinedDeactivatedHandlers = {};
|
48585 | for (const [change, eventsInProgress, deactivatedHandlers] of this._changes) {
|
48586 | if (change.panDelta)
|
48587 | combined.panDelta = (combined.panDelta || new performance.pointGeometry(0, 0))._add(change.panDelta);
|
48588 | if (change.zoomDelta)
|
48589 | combined.zoomDelta = (combined.zoomDelta || 0) + change.zoomDelta;
|
48590 | if (change.bearingDelta)
|
48591 | combined.bearingDelta = (combined.bearingDelta || 0) + change.bearingDelta;
|
48592 | if (change.pitchDelta)
|
48593 | combined.pitchDelta = (combined.pitchDelta || 0) + change.pitchDelta;
|
48594 | if (change.around !== undefined)
|
48595 | combined.around = change.around;
|
48596 | if (change.pinchAround !== undefined)
|
48597 | combined.pinchAround = change.pinchAround;
|
48598 | if (change.noInertia)
|
48599 | combined.noInertia = change.noInertia;
|
48600 | performance.extend(combinedEventsInProgress, eventsInProgress);
|
48601 | performance.extend(combinedDeactivatedHandlers, deactivatedHandlers);
|
48602 | }
|
48603 | this._updateMapTransform(combined, combinedEventsInProgress, combinedDeactivatedHandlers);
|
48604 | this._changes = [];
|
48605 | }
|
48606 | _updateMapTransform(combinedResult, combinedEventsInProgress, deactivatedHandlers) {
|
48607 | const map = this._map;
|
48608 | const tr = map.transform;
|
48609 | if (!hasChange(combinedResult)) {
|
48610 | return this._fireEvents(combinedEventsInProgress, deactivatedHandlers, true);
|
48611 | }
|
48612 | let { panDelta, zoomDelta, bearingDelta, pitchDelta, around, pinchAround } = combinedResult;
|
48613 | if (pinchAround !== undefined) {
|
48614 | around = pinchAround;
|
48615 | }
|
48616 | // stop any ongoing camera animations (easeTo, flyTo)
|
48617 | map._stop(true);
|
48618 | around = around || map.transform.centerPoint;
|
48619 | const loc = tr.pointLocation(panDelta ? around.sub(panDelta) : around);
|
48620 | if (bearingDelta)
|
48621 | tr.bearing += bearingDelta;
|
48622 | if (pitchDelta)
|
48623 | tr.pitch += pitchDelta;
|
48624 | if (zoomDelta)
|
48625 | tr.zoom += zoomDelta;
|
48626 | tr.setLocationAtPoint(loc, around);
|
48627 | this._map._update();
|
48628 | if (!combinedResult.noInertia)
|
48629 | this._inertia.record(combinedResult);
|
48630 | this._fireEvents(combinedEventsInProgress, deactivatedHandlers, true);
|
48631 | }
|
48632 | _fireEvents(newEventsInProgress, deactivatedHandlers, allowEndAnimation) {
|
48633 | const wasMoving = isMoving(this._eventsInProgress);
|
48634 | const nowMoving = isMoving(newEventsInProgress);
|
48635 | const startEvents = {};
|
48636 | for (const eventName in newEventsInProgress) {
|
48637 | const { originalEvent } = newEventsInProgress[eventName];
|
48638 | if (!this._eventsInProgress[eventName]) {
|
48639 | startEvents[`${eventName}start`] = originalEvent;
|
48640 | }
|
48641 | this._eventsInProgress[eventName] = newEventsInProgress[eventName];
|
48642 | }
|
48643 | // fire start events only after this._eventsInProgress has been updated
|
48644 | if (!wasMoving && nowMoving) {
|
48645 | this._fireEvent('movestart', nowMoving.originalEvent);
|
48646 | }
|
48647 | for (const name in startEvents) {
|
48648 | this._fireEvent(name, startEvents[name]);
|
48649 | }
|
48650 | if (nowMoving) {
|
48651 | this._fireEvent('move', nowMoving.originalEvent);
|
48652 | }
|
48653 | for (const eventName in newEventsInProgress) {
|
48654 | const { originalEvent } = newEventsInProgress[eventName];
|
48655 | this._fireEvent(eventName, originalEvent);
|
48656 | }
|
48657 | const endEvents = {};
|
48658 | let originalEndEvent;
|
48659 | for (const eventName in this._eventsInProgress) {
|
48660 | const { handlerName, originalEvent } = this._eventsInProgress[eventName];
|
48661 | if (!this._handlersById[handlerName].isActive()) {
|
48662 | delete this._eventsInProgress[eventName];
|
48663 | originalEndEvent = deactivatedHandlers[handlerName] || originalEvent;
|
48664 | endEvents[`${eventName}end`] = originalEndEvent;
|
48665 | }
|
48666 | }
|
48667 | for (const name in endEvents) {
|
48668 | this._fireEvent(name, endEvents[name]);
|
48669 | }
|
48670 | const stillMoving = isMoving(this._eventsInProgress);
|
48671 | if (allowEndAnimation && (wasMoving || nowMoving) && !stillMoving) {
|
48672 | this._updatingCamera = true;
|
48673 | const inertialEase = this._inertia._onMoveEnd(this._map.dragPan._inertiaOptions);
|
48674 | const shouldSnapToNorth = bearing => bearing !== 0 && -this._bearingSnap < bearing && bearing < this._bearingSnap;
|
48675 | if (inertialEase) {
|
48676 | if (shouldSnapToNorth(inertialEase.bearing || this._map.getBearing())) {
|
48677 | inertialEase.bearing = 0;
|
48678 | }
|
48679 | this._map.easeTo(inertialEase, { originalEvent: originalEndEvent });
|
48680 | }
|
48681 | else {
|
48682 | this._map.fire(new performance.Event('moveend', { originalEvent: originalEndEvent }));
|
48683 | if (shouldSnapToNorth(this._map.getBearing())) {
|
48684 | this._map.resetNorth();
|
48685 | }
|
48686 | }
|
48687 | this._updatingCamera = false;
|
48688 | }
|
48689 | }
|
48690 | _fireEvent(type, e) {
|
48691 | this._map.fire(new performance.Event(type, e ? { originalEvent: e } : {}));
|
48692 | }
|
48693 | _requestFrame() {
|
48694 | this._map.triggerRepaint();
|
48695 | return this._map._renderTaskQueue.add(timeStamp => {
|
48696 | delete this._frameId;
|
48697 | this.handleEvent(new RenderFrameEvent('renderFrame', { timeStamp }));
|
48698 | this._applyChanges();
|
48699 | });
|
48700 | }
|
48701 | _triggerRenderFrame() {
|
48702 | if (this._frameId === undefined) {
|
48703 | this._frameId = this._requestFrame();
|
48704 | }
|
48705 | }
|
48706 | }
|
48707 |
|
48708 | /**
|
48709 | * This is a private namespace for utility functions that will get automatically stripped
|
48710 | * out in production builds.
|
48711 | *
|
48712 | * @private
|
48713 | */
|
48714 | const Debug = {
|
48715 | extend(dest, ...sources) {
|
48716 | return performance.extend(dest, ...sources);
|
48717 | },
|
48718 | run(fn) {
|
48719 | fn();
|
48720 | },
|
48721 | logToElement(message, overwrite = false, id = 'log') {
|
48722 | const el = window.document.getElementById(id);
|
48723 | if (el) {
|
48724 | if (overwrite)
|
48725 | el.innerHTML = '';
|
48726 | el.innerHTML += `<br>${message}`;
|
48727 | }
|
48728 | }
|
48729 | };
|
48730 |
|
48731 | class Camera extends performance.Evented {
|
48732 | constructor(transform, options) {
|
48733 | super();
|
48734 | this._moving = false;
|
48735 | this._zooming = false;
|
48736 | this.transform = transform;
|
48737 | this._bearingSnap = options.bearingSnap;
|
48738 | performance.bindAll(['_renderFrameCallback'], this);
|
48739 | //addAssertions(this);
|
48740 | }
|
48741 | /**
|
48742 | * Returns the map's geographical centerpoint.
|
48743 | *
|
48744 | * @memberof Map#
|
48745 | * @returns The map's geographical centerpoint.
|
48746 | * @example
|
48747 | * // return a LngLat object such as {lng: 0, lat: 0}
|
48748 | * var center = map.getCenter();
|
48749 | * // access longitude and latitude values directly
|
48750 | * var {lng, lat} = map.getCenter();
|
48751 | */
|
48752 | getCenter() { return new performance.LngLat(this.transform.center.lng, this.transform.center.lat); }
|
48753 | /**
|
48754 | * Sets the map's geographical centerpoint. Equivalent to `jumpTo({center: center})`.
|
48755 | *
|
48756 | * @memberof Map#
|
48757 | * @param center The centerpoint to set.
|
48758 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
48759 | * @fires movestart
|
48760 | * @fires moveend
|
48761 | * @returns {Map} `this`
|
48762 | * @example
|
48763 | * map.setCenter([-74, 38]);
|
48764 | */
|
48765 | setCenter(center, eventData) {
|
48766 | return this.jumpTo({ center }, eventData);
|
48767 | }
|
48768 | /**
|
48769 | * Pans the map by the specified offset.
|
48770 | *
|
48771 | * @memberof Map#
|
48772 | * @param offset `x` and `y` coordinates by which to pan the map.
|
48773 | * @param options Options object
|
48774 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
48775 | * @fires movestart
|
48776 | * @fires moveend
|
48777 | * @returns {Map} `this`
|
48778 | * @see [Navigate the map with game-like controls](https://maplibre.org/maplibre-gl-js-docs/example/game-controls/)
|
48779 | */
|
48780 | panBy(offset, options, eventData) {
|
48781 | offset = performance.pointGeometry.convert(offset).mult(-1);
|
48782 | return this.panTo(this.transform.center, performance.extend({ offset }, options), eventData);
|
48783 | }
|
48784 | /**
|
48785 | * Pans the map to the specified location with an animated transition.
|
48786 | *
|
48787 | * @memberof Map#
|
48788 | * @param lnglat The location to pan the map to.
|
48789 | * @param options Options describing the destination and animation of the transition.
|
48790 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
48791 | * @fires movestart
|
48792 | * @fires moveend
|
48793 | * @returns {Map} `this`
|
48794 | * @example
|
48795 | * map.panTo([-74, 38]);
|
48796 | * @example
|
48797 | * // Specify that the panTo animation should last 5000 milliseconds.
|
48798 | * map.panTo([-74, 38], {duration: 5000});
|
48799 | * @see [Update a feature in realtime](https://maplibre.org/maplibre-gl-js-docs/example/live-update-feature/)
|
48800 | */
|
48801 | panTo(lnglat, options, eventData) {
|
48802 | return this.easeTo(performance.extend({
|
48803 | center: lnglat
|
48804 | }, options), eventData);
|
48805 | }
|
48806 | /**
|
48807 | * Returns the map's current zoom level.
|
48808 | *
|
48809 | * @memberof Map#
|
48810 | * @returns The map's current zoom level.
|
48811 | * @example
|
48812 | * map.getZoom();
|
48813 | */
|
48814 | getZoom() { return this.transform.zoom; }
|
48815 | /**
|
48816 | * Sets the map's zoom level. Equivalent to `jumpTo({zoom: zoom})`.
|
48817 | *
|
48818 | * @memberof Map#
|
48819 | * @param zoom The zoom level to set (0-20).
|
48820 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
48821 | * @fires movestart
|
48822 | * @fires zoomstart
|
48823 | * @fires move
|
48824 | * @fires zoom
|
48825 | * @fires moveend
|
48826 | * @fires zoomend
|
48827 | * @returns {Map} `this`
|
48828 | * @example
|
48829 | * // Zoom to the zoom level 5 without an animated transition
|
48830 | * map.setZoom(5);
|
48831 | */
|
48832 | setZoom(zoom, eventData) {
|
48833 | this.jumpTo({ zoom }, eventData);
|
48834 | return this;
|
48835 | }
|
48836 | /**
|
48837 | * Zooms the map to the specified zoom level, with an animated transition.
|
48838 | *
|
48839 | * @memberof Map#
|
48840 | * @param zoom The zoom level to transition to.
|
48841 | * @param options Options object
|
48842 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
48843 | * @fires movestart
|
48844 | * @fires zoomstart
|
48845 | * @fires move
|
48846 | * @fires zoom
|
48847 | * @fires moveend
|
48848 | * @fires zoomend
|
48849 | * @returns {Map} `this`
|
48850 | * @example
|
48851 | * // Zoom to the zoom level 5 without an animated transition
|
48852 | * map.zoomTo(5);
|
48853 | * // Zoom to the zoom level 8 with an animated transition
|
48854 | * map.zoomTo(8, {
|
48855 | * duration: 2000,
|
48856 | * offset: [100, 50]
|
48857 | * });
|
48858 | */
|
48859 | zoomTo(zoom, options, eventData) {
|
48860 | return this.easeTo(performance.extend({
|
48861 | zoom
|
48862 | }, options), eventData);
|
48863 | }
|
48864 | /**
|
48865 | * Increases the map's zoom level by 1.
|
48866 | *
|
48867 | * @memberof Map#
|
48868 | * @param options Options object
|
48869 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
48870 | * @fires movestart
|
48871 | * @fires zoomstart
|
48872 | * @fires move
|
48873 | * @fires zoom
|
48874 | * @fires moveend
|
48875 | * @fires zoomend
|
48876 | * @returns {Map} `this`
|
48877 | * @example
|
48878 | * // zoom the map in one level with a custom animation duration
|
48879 | * map.zoomIn({duration: 1000});
|
48880 | */
|
48881 | zoomIn(options, eventData) {
|
48882 | this.zoomTo(this.getZoom() + 1, options, eventData);
|
48883 | return this;
|
48884 | }
|
48885 | /**
|
48886 | * Decreases the map's zoom level by 1.
|
48887 | *
|
48888 | * @memberof Map#
|
48889 | * @param options Options object
|
48890 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
48891 | * @fires movestart
|
48892 | * @fires zoomstart
|
48893 | * @fires move
|
48894 | * @fires zoom
|
48895 | * @fires moveend
|
48896 | * @fires zoomend
|
48897 | * @returns {Map} `this`
|
48898 | * @example
|
48899 | * // zoom the map out one level with a custom animation offset
|
48900 | * map.zoomOut({offset: [80, 60]});
|
48901 | */
|
48902 | zoomOut(options, eventData) {
|
48903 | this.zoomTo(this.getZoom() - 1, options, eventData);
|
48904 | return this;
|
48905 | }
|
48906 | /**
|
48907 | * Returns the map's current bearing. The bearing is the compass direction that is "up"; for example, a bearing
|
48908 | * of 90° orients the map so that east is up.
|
48909 | *
|
48910 | * @memberof Map#
|
48911 | * @returns The map's current bearing.
|
48912 | * @see [Navigate the map with game-like controls](https://maplibre.org/maplibre-gl-js-docs/example/game-controls/)
|
48913 | */
|
48914 | getBearing() { return this.transform.bearing; }
|
48915 | /**
|
48916 | * Sets the map's bearing (rotation). The bearing is the compass direction that is "up"; for example, a bearing
|
48917 | * of 90° orients the map so that east is up.
|
48918 | *
|
48919 | * Equivalent to `jumpTo({bearing: bearing})`.
|
48920 | *
|
48921 | * @memberof Map#
|
48922 | * @param bearing The desired bearing.
|
48923 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
48924 | * @fires movestart
|
48925 | * @fires moveend
|
48926 | * @returns {Map} `this`
|
48927 | * @example
|
48928 | * // rotate the map to 90 degrees
|
48929 | * map.setBearing(90);
|
48930 | */
|
48931 | setBearing(bearing, eventData) {
|
48932 | this.jumpTo({ bearing }, eventData);
|
48933 | return this;
|
48934 | }
|
48935 | /**
|
48936 | * Returns the current padding applied around the map viewport.
|
48937 | *
|
48938 | * @memberof Map#
|
48939 | * @returns The current padding around the map viewport.
|
48940 | */
|
48941 | getPadding() { return this.transform.padding; }
|
48942 | /**
|
48943 | * Sets the padding in pixels around the viewport.
|
48944 | *
|
48945 | * Equivalent to `jumpTo({padding: padding})`.
|
48946 | *
|
48947 | * @memberof Map#
|
48948 | * @param padding The desired padding. Format: { left: number, right: number, top: number, bottom: number }
|
48949 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
48950 | * @fires movestart
|
48951 | * @fires moveend
|
48952 | * @returns {Map} `this`
|
48953 | * @example
|
48954 | * // Sets a left padding of 300px, and a top padding of 50px
|
48955 | * map.setPadding({ left: 300, top: 50 });
|
48956 | */
|
48957 | setPadding(padding, eventData) {
|
48958 | this.jumpTo({ padding }, eventData);
|
48959 | return this;
|
48960 | }
|
48961 | /**
|
48962 | * Rotates the map to the specified bearing, with an animated transition. The bearing is the compass direction
|
48963 | * that is \"up\"; for example, a bearing of 90° orients the map so that east is up.
|
48964 | *
|
48965 | * @memberof Map#
|
48966 | * @param bearing The desired bearing.
|
48967 | * @param options Options object
|
48968 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
48969 | * @fires movestart
|
48970 | * @fires moveend
|
48971 | * @returns {Map} `this`
|
48972 | */
|
48973 | rotateTo(bearing, options, eventData) {
|
48974 | return this.easeTo(performance.extend({
|
48975 | bearing
|
48976 | }, options), eventData);
|
48977 | }
|
48978 | /**
|
48979 | * Rotates the map so that north is up (0° bearing), with an animated transition.
|
48980 | *
|
48981 | * @memberof Map#
|
48982 | * @param options Options object
|
48983 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
48984 | * @fires movestart
|
48985 | * @fires moveend
|
48986 | * @returns {Map} `this`
|
48987 | */
|
48988 | resetNorth(options, eventData) {
|
48989 | this.rotateTo(0, performance.extend({ duration: 1000 }, options), eventData);
|
48990 | return this;
|
48991 | }
|
48992 | /**
|
48993 | * Rotates and pitches the map so that north is up (0° bearing) and pitch is 0°, with an animated transition.
|
48994 | *
|
48995 | * @memberof Map#
|
48996 | * @param options Options object
|
48997 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
48998 | * @fires movestart
|
48999 | * @fires moveend
|
49000 | * @returns {Map} `this`
|
49001 | */
|
49002 | resetNorthPitch(options, eventData) {
|
49003 | this.easeTo(performance.extend({
|
49004 | bearing: 0,
|
49005 | pitch: 0,
|
49006 | duration: 1000
|
49007 | }, options), eventData);
|
49008 | return this;
|
49009 | }
|
49010 | /**
|
49011 | * Snaps the map so that north is up (0° bearing), if the current bearing is close enough to it (i.e. within the
|
49012 | * `bearingSnap` threshold).
|
49013 | *
|
49014 | * @memberof Map#
|
49015 | * @param options Options object
|
49016 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
49017 | * @fires movestart
|
49018 | * @fires moveend
|
49019 | * @returns {Map} `this`
|
49020 | */
|
49021 | snapToNorth(options, eventData) {
|
49022 | if (Math.abs(this.getBearing()) < this._bearingSnap) {
|
49023 | return this.resetNorth(options, eventData);
|
49024 | }
|
49025 | return this;
|
49026 | }
|
49027 | /**
|
49028 | * Returns the map's current pitch (tilt).
|
49029 | *
|
49030 | * @memberof Map#
|
49031 | * @returns The map's current pitch, measured in degrees away from the plane of the screen.
|
49032 | */
|
49033 | getPitch() { return this.transform.pitch; }
|
49034 | /**
|
49035 | * Sets the map's pitch (tilt). Equivalent to `jumpTo({pitch: pitch})`.
|
49036 | *
|
49037 | * @memberof Map#
|
49038 | * @param pitch The pitch to set, measured in degrees away from the plane of the screen (0-60).
|
49039 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
49040 | * @fires pitchstart
|
49041 | * @fires movestart
|
49042 | * @fires moveend
|
49043 | * @returns {Map} `this`
|
49044 | */
|
49045 | setPitch(pitch, eventData) {
|
49046 | this.jumpTo({ pitch }, eventData);
|
49047 | return this;
|
49048 | }
|
49049 | /**
|
49050 | * @memberof Map#
|
49051 | * @param {LngLatBoundsLike} bounds Calculate the center for these bounds in the viewport and use
|
49052 | * the highest zoom level up to and including `Map#getMaxZoom()` that fits
|
49053 | * in the viewport. LngLatBounds represent a box that is always axis-aligned with bearing 0.
|
49054 | * @param options Options object
|
49055 | * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds.
|
49056 | * @param {number} [options.bearing=0] Desired map bearing at end of animation, in degrees.
|
49057 | * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.
|
49058 | * @param {number} [options.maxZoom] The maximum zoom level to allow when the camera would transition to the specified bounds.
|
49059 | * @returns {CenterZoomBearing} If map is able to fit to provided bounds, returns `center`, `zoom`, and `bearing`.
|
49060 | * If map is unable to fit, method will warn and return undefined.
|
49061 | * @example
|
49062 | * var bbox = [[-79, 43], [-73, 45]];
|
49063 | * var newCameraTransform = map.cameraForBounds(bbox, {
|
49064 | * padding: {top: 10, bottom:25, left: 15, right: 5}
|
49065 | * });
|
49066 | */
|
49067 | cameraForBounds(bounds, options) {
|
49068 | bounds = performance.LngLatBounds.convert(bounds);
|
49069 | const bearing = options && options.bearing || 0;
|
49070 | return this._cameraForBoxAndBearing(bounds.getNorthWest(), bounds.getSouthEast(), bearing, options);
|
49071 | }
|
49072 | /**
|
49073 | * Calculate the center of these two points in the viewport and use
|
49074 | * the highest zoom level up to and including `Map#getMaxZoom()` that fits
|
49075 | * the points in the viewport at the specified bearing.
|
49076 | * @memberof Map#
|
49077 | * @param {LngLatLike} p0 First point
|
49078 | * @param {LngLatLike} p1 Second point
|
49079 | * @param bearing Desired map bearing at end of animation, in degrees
|
49080 | * @param options
|
49081 | * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds.
|
49082 | * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.
|
49083 | * @param {number} [options.maxZoom] The maximum zoom level to allow when the camera would transition to the specified bounds.
|
49084 | * @returns {CenterZoomBearing} If map is able to fit to provided bounds, returns `center`, `zoom`, and `bearing`.
|
49085 | * If map is unable to fit, method will warn and return undefined.
|
49086 | * @private
|
49087 | * @example
|
49088 | * var p0 = [-79, 43];
|
49089 | * var p1 = [-73, 45];
|
49090 | * var bearing = 90;
|
49091 | * var newCameraTransform = map._cameraForBoxAndBearing(p0, p1, bearing, {
|
49092 | * padding: {top: 10, bottom:25, left: 15, right: 5}
|
49093 | * });
|
49094 | */
|
49095 | _cameraForBoxAndBearing(p0, p1, bearing, options) {
|
49096 | const defaultPadding = {
|
49097 | top: 0,
|
49098 | bottom: 0,
|
49099 | right: 0,
|
49100 | left: 0
|
49101 | };
|
49102 | options = performance.extend({
|
49103 | padding: defaultPadding,
|
49104 | offset: [0, 0],
|
49105 | maxZoom: this.transform.maxZoom
|
49106 | }, options);
|
49107 | if (typeof options.padding === 'number') {
|
49108 | const p = options.padding;
|
49109 | options.padding = {
|
49110 | top: p,
|
49111 | bottom: p,
|
49112 | right: p,
|
49113 | left: p
|
49114 | };
|
49115 | }
|
49116 | options.padding = performance.extend(defaultPadding, options.padding);
|
49117 | const tr = this.transform;
|
49118 | const edgePadding = tr.padding;
|
49119 | // We want to calculate the upper right and lower left of the box defined by p0 and p1
|
49120 | // in a coordinate system rotate to match the destination bearing.
|
49121 | const p0world = tr.project(performance.LngLat.convert(p0));
|
49122 | const p1world = tr.project(performance.LngLat.convert(p1));
|
49123 | const p0rotated = p0world.rotate(-bearing * Math.PI / 180);
|
49124 | const p1rotated = p1world.rotate(-bearing * Math.PI / 180);
|
49125 | const upperRight = new performance.pointGeometry(Math.max(p0rotated.x, p1rotated.x), Math.max(p0rotated.y, p1rotated.y));
|
49126 | const lowerLeft = new performance.pointGeometry(Math.min(p0rotated.x, p1rotated.x), Math.min(p0rotated.y, p1rotated.y));
|
49127 | // Calculate zoom: consider the original bbox and padding.
|
49128 | const size = upperRight.sub(lowerLeft);
|
49129 | const scaleX = (tr.width - (edgePadding.left + edgePadding.right + options.padding.left + options.padding.right)) / size.x;
|
49130 | const scaleY = (tr.height - (edgePadding.top + edgePadding.bottom + options.padding.top + options.padding.bottom)) / size.y;
|
49131 | if (scaleY < 0 || scaleX < 0) {
|
49132 | performance.warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.');
|
49133 | return undefined;
|
49134 | }
|
49135 | const zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom);
|
49136 | // Calculate center: apply the zoom, the configured offset, as well as offset that exists as a result of padding.
|
49137 | const offset = performance.pointGeometry.convert(options.offset);
|
49138 | const paddingOffsetX = (options.padding.left - options.padding.right) / 2;
|
49139 | const paddingOffsetY = (options.padding.top - options.padding.bottom) / 2;
|
49140 | const paddingOffset = new performance.pointGeometry(paddingOffsetX, paddingOffsetY);
|
49141 | const rotatedPaddingOffset = paddingOffset.rotate(bearing * Math.PI / 180);
|
49142 | const offsetAtInitialZoom = offset.add(rotatedPaddingOffset);
|
49143 | const offsetAtFinalZoom = offsetAtInitialZoom.mult(tr.scale / tr.zoomScale(zoom));
|
49144 | const center = tr.unproject(p0world.add(p1world).div(2).sub(offsetAtFinalZoom));
|
49145 | return {
|
49146 | center,
|
49147 | zoom,
|
49148 | bearing
|
49149 | };
|
49150 | }
|
49151 | /**
|
49152 | * Pans and zooms the map to contain its visible area within the specified geographical bounds.
|
49153 | * This function will also reset the map's bearing to 0 if bearing is nonzero.
|
49154 | *
|
49155 | * @memberof Map#
|
49156 | * @param bounds Center these bounds in the viewport and use the highest
|
49157 | * zoom level up to and including `Map#getMaxZoom()` that fits them in the viewport.
|
49158 | * @param {FitBoundsOptions} [options] Options supports all properties from {@link AnimationOptions} and {@link CameraOptions} in addition to the fields below.
|
49159 | * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds.
|
49160 | * @param {boolean} [options.linear=false] If `true`, the map transitions using
|
49161 | * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See
|
49162 | * those functions and {@link AnimationOptions} for information about options available.
|
49163 | * @param {Function} [options.easing] An easing function for the animated transition. See {@link AnimationOptions}.
|
49164 | * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.
|
49165 | * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds.
|
49166 | * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.
|
49167 | * @fires movestart
|
49168 | * @fires moveend
|
49169 | * @returns {Map} `this`
|
49170 | * @example
|
49171 | * var bbox = [[-79, 43], [-73, 45]];
|
49172 | * map.fitBounds(bbox, {
|
49173 | * padding: {top: 10, bottom:25, left: 15, right: 5}
|
49174 | * });
|
49175 | * @see [Fit a map to a bounding box](https://maplibre.org/maplibre-gl-js-docs/example/fitbounds/)
|
49176 | */
|
49177 | fitBounds(bounds, options, eventData) {
|
49178 | return this._fitInternal(this.cameraForBounds(bounds, options), options, eventData);
|
49179 | }
|
49180 | /**
|
49181 | * Pans, rotates and zooms the map to to fit the box made by points p0 and p1
|
49182 | * once the map is rotated to the specified bearing. To zoom without rotating,
|
49183 | * pass in the current map bearing.
|
49184 | *
|
49185 | * @memberof Map#
|
49186 | * @param p0 First point on screen, in pixel coordinates
|
49187 | * @param p1 Second point on screen, in pixel coordinates
|
49188 | * @param bearing Desired map bearing at end of animation, in degrees
|
49189 | * @param options Options object
|
49190 | * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds.
|
49191 | * @param {boolean} [options.linear=false] If `true`, the map transitions using
|
49192 | * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See
|
49193 | * those functions and {@link AnimationOptions} for information about options available.
|
49194 | * @param {Function} [options.easing] An easing function for the animated transition. See {@link AnimationOptions}.
|
49195 | * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.
|
49196 | * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds.
|
49197 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
49198 | * @fires movestart
|
49199 | * @fires moveend
|
49200 | * @returns {Map} `this`
|
49201 | * @example
|
49202 | * var p0 = [220, 400];
|
49203 | * var p1 = [500, 900];
|
49204 | * map.fitScreenCoordinates(p0, p1, map.getBearing(), {
|
49205 | * padding: {top: 10, bottom:25, left: 15, right: 5}
|
49206 | * });
|
49207 | * @see Used by {@link BoxZoomHandler}
|
49208 | */
|
49209 | fitScreenCoordinates(p0, p1, bearing, options, eventData) {
|
49210 | return this._fitInternal(this._cameraForBoxAndBearing(this.transform.pointLocation(performance.pointGeometry.convert(p0)), this.transform.pointLocation(performance.pointGeometry.convert(p1)), bearing, options), options, eventData);
|
49211 | }
|
49212 | _fitInternal(calculatedOptions, options, eventData) {
|
49213 | // cameraForBounds warns + returns undefined if unable to fit:
|
49214 | if (!calculatedOptions)
|
49215 | return this;
|
49216 | options = performance.extend(calculatedOptions, options);
|
49217 | // Explictly remove the padding field because, calculatedOptions already accounts for padding by setting zoom and center accordingly.
|
49218 | delete options.padding;
|
49219 | return options.linear ?
|
49220 | this.easeTo(options, eventData) :
|
49221 | this.flyTo(options, eventData);
|
49222 | }
|
49223 | /**
|
49224 | * Changes any combination of center, zoom, bearing, and pitch, without
|
49225 | * an animated transition. The map will retain its current values for any
|
49226 | * details not specified in `options`.
|
49227 | *
|
49228 | * @memberof Map#
|
49229 | * @param options Options object
|
49230 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
49231 | * @fires movestart
|
49232 | * @fires zoomstart
|
49233 | * @fires pitchstart
|
49234 | * @fires rotate
|
49235 | * @fires move
|
49236 | * @fires zoom
|
49237 | * @fires pitch
|
49238 | * @fires moveend
|
49239 | * @fires zoomend
|
49240 | * @fires pitchend
|
49241 | * @returns {Map} `this`
|
49242 | * @example
|
49243 | * // jump to coordinates at current zoom
|
49244 | * map.jumpTo({center: [0, 0]});
|
49245 | * // jump with zoom, pitch, and bearing options
|
49246 | * map.jumpTo({
|
49247 | * center: [0, 0],
|
49248 | * zoom: 8,
|
49249 | * pitch: 45,
|
49250 | * bearing: 90
|
49251 | * });
|
49252 | * @see [Jump to a series of locations](https://maplibre.org/maplibre-gl-js-docs/example/jump-to/)
|
49253 | * @see [Update a feature in realtime](https://maplibre.org/maplibre-gl-js-docs/example/live-update-feature/)
|
49254 | */
|
49255 | jumpTo(options, eventData) {
|
49256 | this.stop();
|
49257 | const tr = this.transform;
|
49258 | let zoomChanged = false, bearingChanged = false, pitchChanged = false;
|
49259 | if ('zoom' in options && tr.zoom !== +options.zoom) {
|
49260 | zoomChanged = true;
|
49261 | tr.zoom = +options.zoom;
|
49262 | }
|
49263 | if (options.center !== undefined) {
|
49264 | tr.center = performance.LngLat.convert(options.center);
|
49265 | }
|
49266 | if ('bearing' in options && tr.bearing !== +options.bearing) {
|
49267 | bearingChanged = true;
|
49268 | tr.bearing = +options.bearing;
|
49269 | }
|
49270 | if ('pitch' in options && tr.pitch !== +options.pitch) {
|
49271 | pitchChanged = true;
|
49272 | tr.pitch = +options.pitch;
|
49273 | }
|
49274 | if (options.padding != null && !tr.isPaddingEqual(options.padding)) {
|
49275 | tr.padding = options.padding;
|
49276 | }
|
49277 | this.fire(new performance.Event('movestart', eventData))
|
49278 | .fire(new performance.Event('move', eventData));
|
49279 | if (zoomChanged) {
|
49280 | this.fire(new performance.Event('zoomstart', eventData))
|
49281 | .fire(new performance.Event('zoom', eventData))
|
49282 | .fire(new performance.Event('zoomend', eventData));
|
49283 | }
|
49284 | if (bearingChanged) {
|
49285 | this.fire(new performance.Event('rotatestart', eventData))
|
49286 | .fire(new performance.Event('rotate', eventData))
|
49287 | .fire(new performance.Event('rotateend', eventData));
|
49288 | }
|
49289 | if (pitchChanged) {
|
49290 | this.fire(new performance.Event('pitchstart', eventData))
|
49291 | .fire(new performance.Event('pitch', eventData))
|
49292 | .fire(new performance.Event('pitchend', eventData));
|
49293 | }
|
49294 | return this.fire(new performance.Event('moveend', eventData));
|
49295 | }
|
49296 | /**
|
49297 | * Changes any combination of `center`, `zoom`, `bearing`, `pitch`, and `padding` with an animated transition
|
49298 | * between old and new values. The map will retain its current values for any
|
49299 | * details not specified in `options`.
|
49300 | *
|
49301 | * Note: The transition will happen instantly if the user has enabled
|
49302 | * the `reduced motion` accesibility feature enabled in their operating system,
|
49303 | * unless `options` includes `essential: true`.
|
49304 | *
|
49305 | * @memberof Map#
|
49306 | * @param options Options describing the destination and animation of the transition.
|
49307 | * Accepts {@link CameraOptions} and {@link AnimationOptions}.
|
49308 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
49309 | * @fires movestart
|
49310 | * @fires zoomstart
|
49311 | * @fires pitchstart
|
49312 | * @fires rotate
|
49313 | * @fires move
|
49314 | * @fires zoom
|
49315 | * @fires pitch
|
49316 | * @fires moveend
|
49317 | * @fires zoomend
|
49318 | * @fires pitchend
|
49319 | * @returns {Map} `this`
|
49320 | * @see [Navigate the map with game-like controls](https://maplibre.org/maplibre-gl-js-docs/example/game-controls/)
|
49321 | */
|
49322 | easeTo(options, eventData) {
|
49323 | this._stop(false, options.easeId);
|
49324 | options = performance.extend({
|
49325 | offset: [0, 0],
|
49326 | duration: 500,
|
49327 | easing: performance.ease
|
49328 | }, options);
|
49329 | if (options.animate === false || (!options.essential && performance.exported.prefersReducedMotion))
|
49330 | options.duration = 0;
|
49331 | const tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(), startPadding = this.getPadding(), zoom = 'zoom' in options ? +options.zoom : startZoom, bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing, pitch = 'pitch' in options ? +options.pitch : startPitch, padding = 'padding' in options ? options.padding : tr.padding;
|
49332 | const offsetAsPoint = performance.pointGeometry.convert(options.offset);
|
49333 | let pointAtOffset = tr.centerPoint.add(offsetAsPoint);
|
49334 | const locationAtOffset = tr.pointLocation(pointAtOffset);
|
49335 | const center = performance.LngLat.convert(options.center || locationAtOffset);
|
49336 | this._normalizeCenter(center);
|
49337 | const from = tr.project(locationAtOffset);
|
49338 | const delta = tr.project(center).sub(from);
|
49339 | const finalScale = tr.zoomScale(zoom - startZoom);
|
49340 | let around, aroundPoint;
|
49341 | if (options.around) {
|
49342 | around = performance.LngLat.convert(options.around);
|
49343 | aroundPoint = tr.locationPoint(around);
|
49344 | }
|
49345 | const currently = {
|
49346 | moving: this._moving,
|
49347 | zooming: this._zooming,
|
49348 | rotating: this._rotating,
|
49349 | pitching: this._pitching
|
49350 | };
|
49351 | this._zooming = this._zooming || (zoom !== startZoom);
|
49352 | this._rotating = this._rotating || (startBearing !== bearing);
|
49353 | this._pitching = this._pitching || (pitch !== startPitch);
|
49354 | this._padding = !tr.isPaddingEqual(padding);
|
49355 | this._easeId = options.easeId;
|
49356 | this._prepareEase(eventData, options.noMoveStart, currently);
|
49357 | this._ease((k) => {
|
49358 | if (this._zooming) {
|
49359 | tr.zoom = performance.number(startZoom, zoom, k);
|
49360 | }
|
49361 | if (this._rotating) {
|
49362 | tr.bearing = performance.number(startBearing, bearing, k);
|
49363 | }
|
49364 | if (this._pitching) {
|
49365 | tr.pitch = performance.number(startPitch, pitch, k);
|
49366 | }
|
49367 | if (this._padding) {
|
49368 | tr.interpolatePadding(startPadding, padding, k);
|
49369 | // When padding is being applied, Transform#centerPoint is changing continously,
|
49370 | // thus we need to recalculate offsetPoint every frame
|
49371 | pointAtOffset = tr.centerPoint.add(offsetAsPoint);
|
49372 | }
|
49373 | if (around) {
|
49374 | tr.setLocationAtPoint(around, aroundPoint);
|
49375 | }
|
49376 | else {
|
49377 | const scale = tr.zoomScale(tr.zoom - startZoom);
|
49378 | const base = zoom > startZoom ?
|
49379 | Math.min(2, finalScale) :
|
49380 | Math.max(0.5, finalScale);
|
49381 | const speedup = Math.pow(base, 1 - k);
|
49382 | const newCenter = tr.unproject(from.add(delta.mult(k * speedup)).mult(scale));
|
49383 | tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset);
|
49384 | }
|
49385 | this._fireMoveEvents(eventData);
|
49386 | }, (interruptingEaseId) => {
|
49387 | this._afterEase(eventData, interruptingEaseId);
|
49388 | }, options);
|
49389 | return this;
|
49390 | }
|
49391 | _prepareEase(eventData, noMoveStart, currently = {}) {
|
49392 | this._moving = true;
|
49393 | if (!noMoveStart && !currently.moving) {
|
49394 | this.fire(new performance.Event('movestart', eventData));
|
49395 | }
|
49396 | if (this._zooming && !currently.zooming) {
|
49397 | this.fire(new performance.Event('zoomstart', eventData));
|
49398 | }
|
49399 | if (this._rotating && !currently.rotating) {
|
49400 | this.fire(new performance.Event('rotatestart', eventData));
|
49401 | }
|
49402 | if (this._pitching && !currently.pitching) {
|
49403 | this.fire(new performance.Event('pitchstart', eventData));
|
49404 | }
|
49405 | }
|
49406 | _fireMoveEvents(eventData) {
|
49407 | this.fire(new performance.Event('move', eventData));
|
49408 | if (this._zooming) {
|
49409 | this.fire(new performance.Event('zoom', eventData));
|
49410 | }
|
49411 | if (this._rotating) {
|
49412 | this.fire(new performance.Event('rotate', eventData));
|
49413 | }
|
49414 | if (this._pitching) {
|
49415 | this.fire(new performance.Event('pitch', eventData));
|
49416 | }
|
49417 | }
|
49418 | _afterEase(eventData, easeId) {
|
49419 | // if this easing is being stopped to start another easing with
|
49420 | // the same id then don't fire any events to avoid extra start/stop events
|
49421 | if (this._easeId && easeId && this._easeId === easeId) {
|
49422 | return;
|
49423 | }
|
49424 | delete this._easeId;
|
49425 | const wasZooming = this._zooming;
|
49426 | const wasRotating = this._rotating;
|
49427 | const wasPitching = this._pitching;
|
49428 | this._moving = false;
|
49429 | this._zooming = false;
|
49430 | this._rotating = false;
|
49431 | this._pitching = false;
|
49432 | this._padding = false;
|
49433 | if (wasZooming) {
|
49434 | this.fire(new performance.Event('zoomend', eventData));
|
49435 | }
|
49436 | if (wasRotating) {
|
49437 | this.fire(new performance.Event('rotateend', eventData));
|
49438 | }
|
49439 | if (wasPitching) {
|
49440 | this.fire(new performance.Event('pitchend', eventData));
|
49441 | }
|
49442 | this.fire(new performance.Event('moveend', eventData));
|
49443 | }
|
49444 | /**
|
49445 | * Changes any combination of center, zoom, bearing, and pitch, animating the transition along a curve that
|
49446 | * evokes flight. The animation seamlessly incorporates zooming and panning to help
|
49447 | * the user maintain her bearings even after traversing a great distance.
|
49448 | *
|
49449 | * Note: The animation will be skipped, and this will behave equivalently to `jumpTo`
|
49450 | * if the user has the `reduced motion` accesibility feature enabled in their operating system,
|
49451 | * unless 'options' includes `essential: true`.
|
49452 | *
|
49453 | * @memberof Map#
|
49454 | * @param {FlyToOptions} options Options describing the destination and animation of the transition.
|
49455 | * Accepts {@link CameraOptions}, {@link AnimationOptions},
|
49456 | * and the following additional options.
|
49457 | * @param {number} [options.curve=1.42] The zooming "curve" that will occur along the
|
49458 | * flight path. A high value maximizes zooming for an exaggerated animation, while a low
|
49459 | * value minimizes zooming for an effect closer to {@link Map#easeTo}. 1.42 is the average
|
49460 | * value selected by participants in the user study discussed in
|
49461 | * [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of
|
49462 | * `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A
|
49463 | * value of 1 would produce a circular motion.
|
49464 | * @param {number} [options.minZoom] The zero-based zoom level at the peak of the flight path. If
|
49465 | * `options.curve` is specified, this option is ignored.
|
49466 | * @param {number} [options.speed=1.2] The average speed of the animation defined in relation to
|
49467 | * `options.curve`. A speed of 1.2 means that the map appears to move along the flight path
|
49468 | * by 1.2 times `options.curve` screenfuls every second. A _screenful_ is the map's visible span.
|
49469 | * It does not correspond to a fixed physical distance, but varies by zoom level.
|
49470 | * @param {number} [options.screenSpeed] The average speed of the animation measured in screenfuls
|
49471 | * per second, assuming a linear timing curve. If `options.speed` is specified, this option is ignored.
|
49472 | * @param {number} [options.maxDuration] The animation's maximum duration, measured in milliseconds.
|
49473 | * If duration exceeds maximum duration, it resets to 0.
|
49474 | * @param eventData Additional properties to be added to event objects of events triggered by this method.
|
49475 | * @fires movestart
|
49476 | * @fires zoomstart
|
49477 | * @fires pitchstart
|
49478 | * @fires move
|
49479 | * @fires zoom
|
49480 | * @fires rotate
|
49481 | * @fires pitch
|
49482 | * @fires moveend
|
49483 | * @fires zoomend
|
49484 | * @fires pitchend
|
49485 | * @returns {Map} `this`
|
49486 | * @example
|
49487 | * // fly with default options to null island
|
49488 | * map.flyTo({center: [0, 0], zoom: 9});
|
49489 | * // using flyTo options
|
49490 | * map.flyTo({
|
49491 | * center: [0, 0],
|
49492 | * zoom: 9,
|
49493 | * speed: 0.2,
|
49494 | * curve: 1,
|
49495 | * easing(t) {
|
49496 | * return t;
|
49497 | * }
|
49498 | * });
|
49499 | * @see [Fly to a location](https://maplibre.org/maplibre-gl-js-docs/example/flyto/)
|
49500 | * @see [Slowly fly to a location](https://maplibre.org/maplibre-gl-js-docs/example/flyto-options/)
|
49501 | * @see [Fly to a location based on scroll position](https://maplibre.org/maplibre-gl-js-docs/example/scroll-fly-to/)
|
49502 | */
|
49503 | flyTo(options, eventData) {
|
49504 | // Fall through to jumpTo if user has set prefers-reduced-motion
|
49505 | if (!options.essential && performance.exported.prefersReducedMotion) {
|
49506 | const coercedOptions = performance.pick(options, ['center', 'zoom', 'bearing', 'pitch', 'around']);
|
49507 | return this.jumpTo(coercedOptions, eventData);
|
49508 | }
|
49509 | // This method implements an “optimal path” animation, as detailed in:
|
49510 | //
|
49511 | // Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and panning.” INFOVIS
|
49512 | // ’03. pp. 15–22. <https://www.win.tue.nl/~vanwijk/zoompan.pdf#page=5>.
|
49513 | //
|
49514 | // Where applicable, local variable documentation begins with the associated variable or
|
49515 | // function in van Wijk (2003).
|
49516 | this.stop();
|
49517 | options = performance.extend({
|
49518 | offset: [0, 0],
|
49519 | speed: 1.2,
|
49520 | curve: 1.42,
|
49521 | easing: performance.ease
|
49522 | }, options);
|
49523 | const tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(), startPadding = this.getPadding();
|
49524 | const zoom = 'zoom' in options ? performance.clamp(+options.zoom, tr.minZoom, tr.maxZoom) : startZoom;
|
49525 | const bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing;
|
49526 | const pitch = 'pitch' in options ? +options.pitch : startPitch;
|
49527 | const padding = 'padding' in options ? options.padding : tr.padding;
|
49528 | const scale = tr.zoomScale(zoom - startZoom);
|
49529 | const offsetAsPoint = performance.pointGeometry.convert(options.offset);
|
49530 | let pointAtOffset = tr.centerPoint.add(offsetAsPoint);
|
49531 | const locationAtOffset = tr.pointLocation(pointAtOffset);
|
49532 | const center = performance.LngLat.convert(options.center || locationAtOffset);
|
49533 | this._normalizeCenter(center);
|
49534 | const from = tr.project(locationAtOffset);
|
49535 | const delta = tr.project(center).sub(from);
|
49536 | let rho = options.curve;
|
49537 | // w₀: Initial visible span, measured in pixels at the initial scale.
|
49538 | const w0 = Math.max(tr.width, tr.height),
|
49539 | // w₁: Final visible span, measured in pixels with respect to the initial scale.
|
49540 | w1 = w0 / scale,
|
49541 | // Length of the flight path as projected onto the ground plane, measured in pixels from
|
49542 | // the world image origin at the initial scale.
|
49543 | u1 = delta.mag();
|
49544 | if ('minZoom' in options) {
|
49545 | const minZoom = performance.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom);
|
49546 | // w<sub>m</sub>: Maximum visible span, measured in pixels with respect to the initial
|
49547 | // scale.
|
49548 | const wMax = w0 / tr.zoomScale(minZoom - startZoom);
|
49549 | rho = Math.sqrt(wMax / u1 * 2);
|
49550 | }
|
49551 | // ρ²
|
49552 | const rho2 = rho * rho;
|
49553 | /**
|
49554 | * rᵢ: Returns the zoom-out factor at one end of the animation.
|
49555 | *
|
49556 | * @param i 0 for the ascent or 1 for the descent.
|
49557 | * @private
|
49558 | */
|
49559 | function r(i) {
|
49560 | const b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1);
|
49561 | return Math.log(Math.sqrt(b * b + 1) - b);
|
49562 | }
|
49563 | function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }
|
49564 | function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }
|
49565 | function tanh(n) { return sinh(n) / cosh(n); }
|
49566 | // r₀: Zoom-out factor during ascent.
|
49567 | const r0 = r(0);
|
49568 | // w(s): Returns the visible span on the ground, measured in pixels with respect to the
|
49569 | // initial scale. Assumes an angular field of view of 2 arctan ½ ≈ 53°.
|
49570 | let w = function (s) {
|
49571 | return (cosh(r0) / cosh(r0 + rho * s));
|
49572 | };
|
49573 | // u(s): Returns the distance along the flight path as projected onto the ground plane,
|
49574 | // measured in pixels from the world image origin at the initial scale.
|
49575 | let u = function (s) {
|
49576 | return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1;
|
49577 | };
|
49578 | // S: Total length of the flight path, measured in ρ-screenfuls.
|
49579 | let S = (r(1) - r0) / rho;
|
49580 | // When u₀ = u₁, the optimal path doesn’t require both ascent and descent.
|
49581 | if (Math.abs(u1) < 0.000001 || !isFinite(S)) {
|
49582 | // Perform a more or less instantaneous transition if the path is too short.
|
49583 | if (Math.abs(w0 - w1) < 0.000001)
|
49584 | return this.easeTo(options, eventData);
|
49585 | const k = w1 < w0 ? -1 : 1;
|
49586 | S = Math.abs(Math.log(w1 / w0)) / rho;
|
49587 | u = function () { return 0; };
|
49588 | w = function (s) { return Math.exp(k * rho * s); };
|
49589 | }
|
49590 | if ('duration' in options) {
|
49591 | options.duration = +options.duration;
|
49592 | }
|
49593 | else {
|
49594 | const V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed;
|
49595 | options.duration = 1000 * S / V;
|
49596 | }
|
49597 | if (options.maxDuration && options.duration > options.maxDuration) {
|
49598 | options.duration = 0;
|
49599 | }
|
49600 | this._zooming = true;
|
49601 | this._rotating = (startBearing !== bearing);
|
49602 | this._pitching = (pitch !== startPitch);
|
49603 | this._padding = !tr.isPaddingEqual(padding);
|
49604 | this._prepareEase(eventData, false);
|
49605 | this._ease((k) => {
|
49606 | // s: The distance traveled along the flight path, measured in ρ-screenfuls.
|
49607 | const s = k * S;
|
49608 | const scale = 1 / w(s);
|
49609 | tr.zoom = k === 1 ? zoom : startZoom + tr.scaleZoom(scale);
|
49610 | if (this._rotating) {
|
49611 | tr.bearing = performance.number(startBearing, bearing, k);
|
49612 | }
|
49613 | if (this._pitching) {
|
49614 | tr.pitch = performance.number(startPitch, pitch, k);
|
49615 | }
|
49616 | if (this._padding) {
|
49617 | tr.interpolatePadding(startPadding, padding, k);
|
49618 | // When padding is being applied, Transform#centerPoint is changing continously,
|
49619 | // thus we need to recalculate offsetPoint every frame
|
49620 | pointAtOffset = tr.centerPoint.add(offsetAsPoint);
|
49621 | }
|
49622 | const newCenter = k === 1 ? center : tr.unproject(from.add(delta.mult(u(s))).mult(scale));
|
49623 | tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset);
|
49624 | this._fireMoveEvents(eventData);
|
49625 | }, () => this._afterEase(eventData), options);
|
49626 | return this;
|
49627 | }
|
49628 | isEasing() {
|
49629 | return !!this._easeFrameId;
|
49630 | }
|
49631 | /**
|
49632 | * Stops any animated transition underway.
|
49633 | *
|
49634 | * @memberof Map#
|
49635 | * @returns {Map} `this`
|
49636 | */
|
49637 | stop() {
|
49638 | return this._stop();
|
49639 | }
|
49640 | _stop(allowGestures, easeId) {
|
49641 | if (this._easeFrameId) {
|
49642 | this._cancelRenderFrame(this._easeFrameId);
|
49643 | delete this._easeFrameId;
|
49644 | delete this._onEaseFrame;
|
49645 | }
|
49646 | if (this._onEaseEnd) {
|
49647 | // The _onEaseEnd function might emit events which trigger new
|
49648 | // animation, which sets a new _onEaseEnd. Ensure we don't delete
|
49649 | // it unintentionally.
|
49650 | const onEaseEnd = this._onEaseEnd;
|
49651 | delete this._onEaseEnd;
|
49652 | onEaseEnd.call(this, easeId);
|
49653 | }
|
49654 | if (!allowGestures) {
|
49655 | const handlers = this.handlers;
|
49656 | if (handlers)
|
49657 | handlers.stop(false);
|
49658 | }
|
49659 | return this;
|
49660 | }
|
49661 | _ease(frame, finish, options) {
|
49662 | if (options.animate === false || options.duration === 0) {
|
49663 | frame(1);
|
49664 | finish();
|
49665 | }
|
49666 | else {
|
49667 | this._easeStart = performance.exported.now();
|
49668 | this._easeOptions = options;
|
49669 | this._onEaseFrame = frame;
|
49670 | this._onEaseEnd = finish;
|
49671 | this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback);
|
49672 | }
|
49673 | }
|
49674 | // Callback for map._requestRenderFrame
|
49675 | _renderFrameCallback() {
|
49676 | const t = Math.min((performance.exported.now() - this._easeStart) / this._easeOptions.duration, 1);
|
49677 | this._onEaseFrame(this._easeOptions.easing(t));
|
49678 | if (t < 1) {
|
49679 | this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback);
|
49680 | }
|
49681 | else {
|
49682 | this.stop();
|
49683 | }
|
49684 | }
|
49685 | // convert bearing so that it's numerically close to the current one so that it interpolates properly
|
49686 | _normalizeBearing(bearing, currentBearing) {
|
49687 | bearing = performance.wrap(bearing, -180, 180);
|
49688 | const diff = Math.abs(bearing - currentBearing);
|
49689 | if (Math.abs(bearing - 360 - currentBearing) < diff)
|
49690 | bearing -= 360;
|
49691 | if (Math.abs(bearing + 360 - currentBearing) < diff)
|
49692 | bearing += 360;
|
49693 | return bearing;
|
49694 | }
|
49695 | // If a path crossing the antimeridian would be shorter, extend the final coordinate so that
|
49696 | // interpolating between the two endpoints will cross it.
|
49697 | _normalizeCenter(center) {
|
49698 | const tr = this.transform;
|
49699 | if (!tr.renderWorldCopies || tr.lngRange)
|
49700 | return;
|
49701 | const delta = center.lng - tr.center.lng;
|
49702 | center.lng +=
|
49703 | delta > 180 ? -360 :
|
49704 | delta < -180 ? 360 : 0;
|
49705 | }
|
49706 | }
|
49707 | // In debug builds, check that camera change events are fired in the correct order.
|
49708 | // - ___start events needs to be fired before ___ and ___end events
|
49709 | // - another ___start event can't be fired before a ___end event has been fired for the previous one
|
49710 | function addAssertions(camera) {
|
49711 | Debug.run(() => {
|
49712 | const inProgress = {};
|
49713 | ['drag', 'zoom', 'rotate', 'pitch', 'move'].forEach(name => {
|
49714 | inProgress[name] = false;
|
49715 | camera.on(`${name}start`, () => {
|
49716 | performance.assert(!inProgress[name], `"${name}start" fired twice without a "${name}end"`);
|
49717 | inProgress[name] = true;
|
49718 | performance.assert(inProgress.move);
|
49719 | });
|
49720 | camera.on(name, () => {
|
49721 | performance.assert(inProgress[name]);
|
49722 | performance.assert(inProgress.move);
|
49723 | });
|
49724 | camera.on(`${name}end`, () => {
|
49725 | performance.assert(inProgress.move);
|
49726 | performance.assert(inProgress[name]);
|
49727 | inProgress[name] = false;
|
49728 | });
|
49729 | });
|
49730 | // Canary used to test whether this function is stripped in prod build
|
49731 | canary = 'canary debug run'; // eslint-disable-line
|
49732 | });
|
49733 | }
|
49734 | let canary; // eslint-disable-line
|
49735 |
|
49736 | /**
|
49737 | * An `AttributionControl` control presents the map's attribution information.
|
49738 | *
|
49739 | * @implements {IControl}
|
49740 | * @param {Object} [options]
|
49741 | * @param {boolean} [options.compact] If `true`, force a compact attribution that shows the full attribution on mouse hover. If `false`, force the full attribution control. The default is a responsive attribution that collapses when the map is less than 640 pixels wide. **Attribution should not be collapsed if it can comfortably fit on the map. `compact` should only be used to modify default attribution when map size makes it impossible to fit default attribution and when the automatic compact resizing for default settings are not sufficient.**
|
49742 | * @param {string | Array<string>} [options.customAttribution] String or strings to show in addition to any other attributions.
|
49743 | * @example
|
49744 | * var map = new maplibregl.Map({attributionControl: false})
|
49745 | * .addControl(new maplibregl.AttributionControl({
|
49746 | * compact: true
|
49747 | * }));
|
49748 | */
|
49749 | class AttributionControl {
|
49750 | constructor(options = {}) {
|
49751 | this.options = options;
|
49752 | performance.bindAll([
|
49753 | '_toggleAttribution',
|
49754 | '_updateData',
|
49755 | '_updateCompact',
|
49756 | '_updateCompactMinimize'
|
49757 | ], this);
|
49758 | }
|
49759 | getDefaultPosition() {
|
49760 | return 'bottom-right';
|
49761 | }
|
49762 | onAdd(map) {
|
49763 | this._map = map;
|
49764 | this._compact = this.options && this.options.compact;
|
49765 | this._container = DOM.create('details', 'maplibregl-ctrl maplibregl-ctrl-attrib mapboxgl-ctrl mapboxgl-ctrl-attrib');
|
49766 | this._compactButton = DOM.create('summary', 'maplibregl-ctrl-attrib-button mapboxgl-ctrl-attrib-button', this._container);
|
49767 | this._compactButton.addEventListener('click', this._toggleAttribution);
|
49768 | this._setElementTitle(this._compactButton, 'ToggleAttribution');
|
49769 | this._innerContainer = DOM.create('div', 'maplibregl-ctrl-attrib-inner mapboxgl-ctrl-attrib-inner', this._container);
|
49770 | this._updateAttributions();
|
49771 | this._updateCompact();
|
49772 | this._map.on('styledata', this._updateData);
|
49773 | this._map.on('sourcedata', this._updateData);
|
49774 | this._map.on('resize', this._updateCompact);
|
49775 | this._map.on('drag', this._updateCompactMinimize);
|
49776 | return this._container;
|
49777 | }
|
49778 | onRemove() {
|
49779 | DOM.remove(this._container);
|
49780 | this._map.off('styledata', this._updateData);
|
49781 | this._map.off('sourcedata', this._updateData);
|
49782 | this._map.off('resize', this._updateCompact);
|
49783 | this._map.off('drag', this._updateCompactMinimize);
|
49784 | this._map = undefined;
|
49785 | this._compact = undefined;
|
49786 | this._attribHTML = undefined;
|
49787 | }
|
49788 | _setElementTitle(element, title) {
|
49789 | const str = this._map._getUIString(`AttributionControl.${title}`);
|
49790 | element.title = str;
|
49791 | element.setAttribute('aria-label', str);
|
49792 | }
|
49793 | _toggleAttribution() {
|
49794 | if (this._container.classList.contains('maplibregl-compact')) {
|
49795 | if (this._container.classList.contains('maplibregl-compact-show')) {
|
49796 | this._container.setAttribute('open', '');
|
49797 | this._container.classList.remove('maplibregl-compact-show', 'mapboxgl-compact-show');
|
49798 | }
|
49799 | else {
|
49800 | this._container.classList.add('maplibregl-compact-show', 'mapboxgl-compact-show');
|
49801 | this._container.removeAttribute('open');
|
49802 | }
|
49803 | }
|
49804 | }
|
49805 | _updateData(e) {
|
49806 | if (e && (e.sourceDataType === 'metadata' || e.sourceDataType === 'visibility' || e.dataType === 'style')) {
|
49807 | this._updateAttributions();
|
49808 | }
|
49809 | }
|
49810 | _updateAttributions() {
|
49811 | if (!this._map.style)
|
49812 | return;
|
49813 | let attributions = [];
|
49814 | if (this.options.customAttribution) {
|
49815 | if (Array.isArray(this.options.customAttribution)) {
|
49816 | attributions = attributions.concat(this.options.customAttribution.map(attribution => {
|
49817 | if (typeof attribution !== 'string')
|
49818 | return '';
|
49819 | return attribution;
|
49820 | }));
|
49821 | }
|
49822 | else if (typeof this.options.customAttribution === 'string') {
|
49823 | attributions.push(this.options.customAttribution);
|
49824 | }
|
49825 | }
|
49826 | if (this._map.style.stylesheet) {
|
49827 | const stylesheet = this._map.style.stylesheet;
|
49828 | this.styleOwner = stylesheet.owner;
|
49829 | this.styleId = stylesheet.id;
|
49830 | }
|
49831 | const sourceCaches = this._map.style.sourceCaches;
|
49832 | for (const id in sourceCaches) {
|
49833 | const sourceCache = sourceCaches[id];
|
49834 | if (sourceCache.used) {
|
49835 | const source = sourceCache.getSource();
|
49836 | if (source.attribution && attributions.indexOf(source.attribution) < 0) {
|
49837 | attributions.push(source.attribution);
|
49838 | }
|
49839 | }
|
49840 | }
|
49841 | // remove any entries that are whitespace
|
49842 | attributions = attributions.filter(e => String(e).trim());
|
49843 | // remove any entries that are substrings of another entry.
|
49844 | // first sort by length so that substrings come first
|
49845 | attributions.sort((a, b) => a.length - b.length);
|
49846 | attributions = attributions.filter((attrib, i) => {
|
49847 | for (let j = i + 1; j < attributions.length; j++) {
|
49848 | if (attributions[j].indexOf(attrib) >= 0) {
|
49849 | return false;
|
49850 | }
|
49851 | }
|
49852 | return true;
|
49853 | });
|
49854 | // check if attribution string is different to minimize DOM changes
|
49855 | const attribHTML = attributions.join(' | ');
|
49856 | if (attribHTML === this._attribHTML)
|
49857 | return;
|
49858 | this._attribHTML = attribHTML;
|
49859 | if (attributions.length) {
|
49860 | this._innerContainer.innerHTML = attribHTML;
|
49861 | this._container.classList.remove('maplibregl-attrib-empty', 'mapboxgl-attrib-empty');
|
49862 | }
|
49863 | else {
|
49864 | this._container.classList.add('maplibregl-attrib-empty', 'mapboxgl-attrib-empty');
|
49865 | }
|
49866 | this._updateCompact();
|
49867 | // remove old DOM node from _editLink
|
49868 | this._editLink = null;
|
49869 | }
|
49870 | _updateCompact() {
|
49871 | if (this._map.getCanvasContainer().offsetWidth <= 640 || this._compact) {
|
49872 | if (this._compact === false) {
|
49873 | this._container.setAttribute('open', '');
|
49874 | }
|
49875 | else if (!this._container.classList.contains('maplibregl-compact') && !this._container.classList.contains('maplibregl-attrib-empty')) {
|
49876 | this._container.setAttribute('open', '');
|
49877 | this._container.classList.add('maplibregl-compact', 'mapboxgl-compact', 'maplibregl-compact-show', 'mapboxgl-compact-show');
|
49878 | }
|
49879 | }
|
49880 | else {
|
49881 | this._container.setAttribute('open', '');
|
49882 | if (this._container.classList.contains('maplibregl-compact')) {
|
49883 | this._container.classList.remove('maplibregl-compact', 'maplibregl-compact-show', 'mapboxgl-compact', 'mapboxgl-compact-show');
|
49884 | }
|
49885 | }
|
49886 | }
|
49887 | _updateCompactMinimize() {
|
49888 | if (this._container.classList.contains('maplibregl-compact')) {
|
49889 | if (this._container.classList.contains('maplibregl-compact-show')) {
|
49890 | this._container.classList.remove('maplibregl-compact-show', 'mapboxgl-compact-show');
|
49891 | }
|
49892 | }
|
49893 | }
|
49894 | }
|
49895 |
|
49896 | /**
|
49897 | * A `LogoControl` is a control that adds the watermark.
|
49898 | *
|
49899 | * @implements {IControl}
|
49900 | * @param {Object} [options]
|
49901 | * @param {boolean} [options.compact] If `true`, force a compact logo. If `false`, force the full logo. The default is a responsive logo that collapses when the map is less than 640 pixels wide.
|
49902 | **/
|
49903 | class LogoControl {
|
49904 | constructor(options = {}) {
|
49905 | this.options = options;
|
49906 | performance.bindAll([
|
49907 | '_updateCompact'
|
49908 | ], this);
|
49909 | }
|
49910 | getDefaultPosition() {
|
49911 | return 'bottom-left';
|
49912 | }
|
49913 | onAdd(map) {
|
49914 | this._map = map;
|
49915 | this._compact = this.options && this.options.compact;
|
49916 | this._container = DOM.create('div', 'maplibregl-ctrl mapboxgl-ctrl');
|
49917 | const anchor = DOM.create('a', 'maplibregl-ctrl-logo mapboxgl-ctrl-logo');
|
49918 | anchor.target = '_blank';
|
49919 | anchor.rel = 'noopener nofollow';
|
49920 | anchor.href = 'https://maplibre.org/';
|
49921 | anchor.setAttribute('aria-label', this._map._getUIString('LogoControl.Title'));
|
49922 | anchor.setAttribute('rel', 'noopener nofollow');
|
49923 | this._container.appendChild(anchor);
|
49924 | this._container.style.display = 'block';
|
49925 | this._map.on('resize', this._updateCompact);
|
49926 | this._updateCompact();
|
49927 | return this._container;
|
49928 | }
|
49929 | onRemove() {
|
49930 | DOM.remove(this._container);
|
49931 | this._map.off('resize', this._updateCompact);
|
49932 | this._map = undefined;
|
49933 | this._compact = undefined;
|
49934 | }
|
49935 | _updateCompact() {
|
49936 | const containerChildren = this._container.children;
|
49937 | if (containerChildren.length) {
|
49938 | const anchor = containerChildren[0];
|
49939 | if (this._map.getCanvasContainer().offsetWidth <= 640 || this._compact) {
|
49940 | if (this._compact !== false) {
|
49941 | anchor.classList.add('maplibregl-compact', 'mapboxgl-compact');
|
49942 | }
|
49943 | }
|
49944 | else {
|
49945 | anchor.classList.remove('maplibregl-compact', 'mapboxgl-compact');
|
49946 | }
|
49947 | }
|
49948 | }
|
49949 | }
|
49950 |
|
49951 | class TaskQueue {
|
49952 | constructor() {
|
49953 | this._queue = [];
|
49954 | this._id = 0;
|
49955 | this._cleared = false;
|
49956 | this._currentlyRunning = false;
|
49957 | }
|
49958 | add(callback) {
|
49959 | const id = ++this._id;
|
49960 | const queue = this._queue;
|
49961 | queue.push({ callback, id, cancelled: false });
|
49962 | return id;
|
49963 | }
|
49964 | remove(id) {
|
49965 | const running = this._currentlyRunning;
|
49966 | const queue = running ? this._queue.concat(running) : this._queue;
|
49967 | for (const task of queue) {
|
49968 | if (task.id === id) {
|
49969 | task.cancelled = true;
|
49970 | return;
|
49971 | }
|
49972 | }
|
49973 | }
|
49974 | run(timeStamp = 0) {
|
49975 | performance.assert(!this._currentlyRunning);
|
49976 | const queue = this._currentlyRunning = this._queue;
|
49977 | // Tasks queued by callbacks in the current queue should be executed
|
49978 | // on the next run, not the current run.
|
49979 | this._queue = [];
|
49980 | for (const task of queue) {
|
49981 | if (task.cancelled)
|
49982 | continue;
|
49983 | task.callback(timeStamp);
|
49984 | if (this._cleared)
|
49985 | break;
|
49986 | }
|
49987 | this._cleared = false;
|
49988 | this._currentlyRunning = false;
|
49989 | }
|
49990 | clear() {
|
49991 | if (this._currentlyRunning) {
|
49992 | this._cleared = true;
|
49993 | }
|
49994 | this._queue = [];
|
49995 | }
|
49996 | }
|
49997 |
|
49998 | const defaultLocale = {
|
49999 | 'AttributionControl.ToggleAttribution': 'Toggle attribution',
|
50000 | 'AttributionControl.MapFeedback': 'Map feedback',
|
50001 | 'FullscreenControl.Enter': 'Enter fullscreen',
|
50002 | 'FullscreenControl.Exit': 'Exit fullscreen',
|
50003 | 'GeolocateControl.FindMyLocation': 'Find my location',
|
50004 | 'GeolocateControl.LocationNotAvailable': 'Location not available',
|
50005 | 'LogoControl.Title': 'Mapbox logo',
|
50006 | 'NavigationControl.ResetBearing': 'Reset bearing to north',
|
50007 | 'NavigationControl.ZoomIn': 'Zoom in',
|
50008 | 'NavigationControl.ZoomOut': 'Zoom out',
|
50009 | 'ScaleControl.Feet': 'ft',
|
50010 | 'ScaleControl.Meters': 'm',
|
50011 | 'ScaleControl.Kilometers': 'km',
|
50012 | 'ScaleControl.Miles': 'mi',
|
50013 | 'ScaleControl.NauticalMiles': 'nm'
|
50014 | };
|
50015 |
|
50016 | const defaultMinZoom = -2;
|
50017 | const defaultMaxZoom = 22;
|
50018 | // the default values, but also the valid range
|
50019 | const defaultMinPitch = 0;
|
50020 | const defaultMaxPitch = 60;
|
50021 | // use this variable to check maxPitch for validity
|
50022 | const maxPitchThreshold = 85;
|
50023 | const defaultOptions$4 = {
|
50024 | center: [0, 0],
|
50025 | zoom: 0,
|
50026 | bearing: 0,
|
50027 | pitch: 0,
|
50028 | minZoom: defaultMinZoom,
|
50029 | maxZoom: defaultMaxZoom,
|
50030 | minPitch: defaultMinPitch,
|
50031 | maxPitch: defaultMaxPitch,
|
50032 | interactive: true,
|
50033 | scrollZoom: true,
|
50034 | boxZoom: true,
|
50035 | dragRotate: true,
|
50036 | dragPan: true,
|
50037 | keyboard: true,
|
50038 | doubleClickZoom: true,
|
50039 | touchZoomRotate: true,
|
50040 | touchPitch: true,
|
50041 | bearingSnap: 7,
|
50042 | clickTolerance: 3,
|
50043 | pitchWithRotate: true,
|
50044 | hash: false,
|
50045 | attributionControl: true,
|
50046 | maplibreLogo: false,
|
50047 | failIfMajorPerformanceCaveat: false,
|
50048 | preserveDrawingBuffer: false,
|
50049 | trackResize: true,
|
50050 | renderWorldCopies: true,
|
50051 | refreshExpiredTiles: true,
|
50052 | maxTileCacheSize: null,
|
50053 | localIdeographFontFamily: 'sans-serif',
|
50054 | transformRequest: null,
|
50055 | fadeDuration: 300,
|
50056 | crossSourceCollisions: true
|
50057 | };
|
50058 | /**
|
50059 | * The `Map` object represents the map on your page. It exposes methods
|
50060 | * and properties that enable you to programmatically change the map,
|
50061 | * and fires events as users interact with it.
|
50062 | *
|
50063 | * You create a `Map` by specifying a `container` and other options.
|
50064 | * Then MapLibre GL JS initializes the map on the page and returns your `Map`
|
50065 | * object.
|
50066 | *
|
50067 | * @extends Evented
|
50068 | * @param {Object} options
|
50069 | * @param {HTMLElement|string} options.container The HTML element in which MapLibre GL JS will render the map, or the element's string `id`. The specified element must have no children.
|
50070 | * @param {number} [options.minZoom=0] The minimum zoom level of the map (0-24).
|
50071 | * @param {number} [options.maxZoom=22] The maximum zoom level of the map (0-24).
|
50072 | * @param {number} [options.minPitch=0] The minimum pitch of the map (0-85). Values greater than 60 degrees are experimental and may result in rendering issues. If you encounter any, please raise an issue with details in the MapLibre project.
|
50073 | * @param {number} [options.maxPitch=60] The maximum pitch of the map (0-85). Values greater than 60 degrees are experimental and may result in rendering issues. If you encounter any, please raise an issue with details in the MapLibre project.
|
50074 | * @param {Object|string} [options.style] The map's MapLibre style. This must be an a JSON object conforming to
|
50075 | * the schema described in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/), or a URL to
|
50076 | * such JSON.
|
50077 | *
|
50078 | *
|
50079 | * @param {(boolean|string)} [options.hash=false] If `true`, the map's position (zoom, center latitude, center longitude, bearing, and pitch) will be synced with the hash fragment of the page's URL.
|
50080 | * For example, `http://path/to/my/page.html#2.59/39.26/53.07/-24.1/60`.
|
50081 | * An additional string may optionally be provided to indicate a parameter-styled hash,
|
50082 | * e.g. http://path/to/my/page.html#map=2.59/39.26/53.07/-24.1/60&foo=bar, where foo
|
50083 | * is a custom parameter and bar is an arbitrary hash distinct from the map hash.
|
50084 | * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners will be attached to the map, so it will not respond to interaction.
|
50085 | * @param {number} [options.bearingSnap=7] The threshold, measured in degrees, that determines when the map's
|
50086 | * bearing will snap to north. For example, with a `bearingSnap` of 7, if the user rotates
|
50087 | * the map within 7 degrees of north, the map will automatically snap to exact north.
|
50088 | * @param {boolean} [options.pitchWithRotate=true] If `false`, the map's pitch (tilt) control with "drag to rotate" interaction will be disabled.
|
50089 | * @param {number} [options.clickTolerance=3] The max number of pixels a user can shift the mouse pointer during a click for it to be considered a valid click (as opposed to a mouse drag).
|
50090 | * @param {boolean} [options.attributionControl=true] If `true`, an {@link AttributionControl} will be added to the map.
|
50091 | * @param {string | Array<string>} [options.customAttribution] String or strings to show in an {@link AttributionControl}. Only applicable if `options.attributionControl` is `true`.
|
50092 | * @param {boolean} [options.maplibreLogo=false] If `true`, the MapLibre logo will be shown.
|
50093 | * @param {string} [options.logoPosition='bottom-left'] A string representing the position of the MapLibre wordmark on the map. Valid options are `top-left`,`top-right`, `bottom-left`, `bottom-right`.
|
50094 | * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the performance of MapLibre
|
50095 | * GL JS would be dramatically worse than expected (i.e. a software renderer would be used).
|
50096 | * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, the map's canvas can be exported to a PNG using `map.getCanvas().toDataURL()`. This is `false` by default as a performance optimization.
|
50097 | * @param {boolean} [options.antialias] If `true`, the gl context will be created with MSAA antialiasing, which can be useful for antialiasing custom layers. this is `false` by default as a performance optimization.
|
50098 | * @param {boolean} [options.refreshExpiredTiles=true] If `false`, the map won't attempt to re-request tiles once they expire per their HTTP `cacheControl`/`expires` headers.
|
50099 | * @param {LngLatBoundsLike} [options.maxBounds] If set, the map will be constrained to the given bounds.
|
50100 | * @param {boolean|Object} [options.scrollZoom=true] If `true`, the "scroll to zoom" interaction is enabled. An `Object` value is passed as options to {@link ScrollZoomHandler#enable}.
|
50101 | * @param {boolean} [options.boxZoom=true] If `true`, the "box zoom" interaction is enabled (see {@link BoxZoomHandler}).
|
50102 | * @param {boolean} [options.dragRotate=true] If `true`, the "drag to rotate" interaction is enabled (see {@link DragRotateHandler}).
|
50103 | * @param {boolean|Object} [options.dragPan=true] If `true`, the "drag to pan" interaction is enabled. An `Object` value is passed as options to {@link DragPanHandler#enable}.
|
50104 | * @param {boolean} [options.keyboard=true] If `true`, keyboard shortcuts are enabled (see {@link KeyboardHandler}).
|
50105 | * @param {boolean} [options.doubleClickZoom=true] If `true`, the "double click to zoom" interaction is enabled (see {@link DoubleClickZoomHandler}).
|
50106 | * @param {boolean|Object} [options.touchZoomRotate=true] If `true`, the "pinch to rotate and zoom" interaction is enabled. An `Object` value is passed as options to {@link TouchZoomRotateHandler#enable}.
|
50107 | * @param {boolean|Object} [options.touchPitch=true] If `true`, the "drag to pitch" interaction is enabled. An `Object` value is passed as options to {@link TouchPitchHandler#enable}.
|
50108 | * @param {boolean} [options.trackResize=true] If `true`, the map will automatically resize when the browser window resizes.
|
50109 | * @param {LngLatLike} [options.center=[0, 0]] The initial geographical centerpoint of the map. If `center` is not specified in the constructor options, MapLibre GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `[0, 0]` Note: MapLibre GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON.
|
50110 | * @param {number} [options.zoom=0] The initial zoom level of the map. If `zoom` is not specified in the constructor options, MapLibre GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.
|
50111 | * @param {number} [options.bearing=0] The initial bearing (rotation) of the map, measured in degrees counter-clockwise from north. If `bearing` is not specified in the constructor options, MapLibre GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.
|
50112 | * @param {number} [options.pitch=0] The initial pitch (tilt) of the map, measured in degrees away from the plane of the screen (0-85). If `pitch` is not specified in the constructor options, MapLibre GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. Values greater than 60 degrees are experimental and may result in rendering issues. If you encounter any, please raise an issue with details in the MapLibre project.
|
50113 | * @param {LngLatBoundsLike} [options.bounds] The initial bounds of the map. If `bounds` is specified, it overrides `center` and `zoom` constructor options.
|
50114 | * @param {Object} [options.fitBoundsOptions] A {@link Map#fitBounds} options object to use _only_ when fitting the initial `bounds` provided above.
|
50115 | * @param {boolean} [options.renderWorldCopies=true] If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`:
|
50116 | * - When the map is zoomed out far enough that a single representation of the world does not fill the map's entire
|
50117 | * container, there will be blank space beyond 180 and -180 degrees longitude.
|
50118 | * - Features that cross 180 and -180 degrees longitude will be cut in two (with one portion on the right edge of the
|
50119 | * map and the other on the left edge of the map) at every zoom level.
|
50120 | * @param {number} [options.maxTileCacheSize=null] The maximum number of tiles stored in the tile cache for a given source. If omitted, the cache will be dynamically sized based on the current viewport.
|
50121 | * @param {string} [options.localIdeographFontFamily='sans-serif'] Defines a CSS
|
50122 | * font-family for locally overriding generation of glyphs in the 'CJK Unified Ideographs', 'Hiragana', 'Katakana' and 'Hangul Syllables' ranges.
|
50123 | * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold).
|
50124 | * Set to `false`, to enable font settings from the map's style for these glyph ranges.
|
50125 | * The purpose of this option is to avoid bandwidth-intensive glyph server requests. (See [Use locally generated ideographs](https://maplibre.org/maplibre-gl-js-docs/example/local-ideographs).)
|
50126 | * @param {RequestTransformFunction} [options.transformRequest=null] A callback run before the Map makes a request for an external URL. The callback can be used to modify the url, set headers, or set the credentials property for cross-origin requests.
|
50127 | * Expected to return an object with a `url` property and optionally `headers` and `credentials` properties.
|
50128 | * @param {boolean} [options.collectResourceTiming=false] If `true`, Resource Timing API information will be collected for requests made by GeoJSON and Vector Tile web workers (this information is normally inaccessible from the main Javascript thread). Information will be returned in a `resourceTiming` property of relevant `data` events.
|
50129 | * @param {number} [options.fadeDuration=300] Controls the duration of the fade-in/fade-out animation for label collisions, in milliseconds. This setting affects all symbol layers. This setting does not affect the duration of runtime styling transitions or raster tile cross-fading.
|
50130 | * @param {boolean} [options.crossSourceCollisions=true] If `true`, symbols from multiple sources can collide with each other during collision detection. If `false`, collision detection is run separately for the symbols in each source.
|
50131 | * @param {Object} [options.locale=null] A patch to apply to the default localization table for UI strings, e.g. control tooltips. The `locale` object maps namespaced UI string IDs to translated strings in the target language; see `src/ui/default_locale.js` for an example with all supported string IDs. The object may specify all UI strings (thereby adding support for a new translation) or only a subset of strings (thereby patching the default translation table).
|
50132 | * @param {number} [options.pixelRatio] The pixel ratio. The canvas' `width` attribute will be `container.clientWidth * pixelRatio` and its `height` attribute will be `container.clientHeight * pixelRatio`. Defaults to `devicePixelRatio` if not specified.
|
50133 | * @example
|
50134 | * var map = new maplibregl.Map({
|
50135 | * container: 'map',
|
50136 | * center: [-122.420679, 37.772537],
|
50137 | * zoom: 13,
|
50138 | * style: style_object,
|
50139 | * hash: true,
|
50140 | * transformRequest: (url, resourceType)=> {
|
50141 | * if(resourceType === 'Source' && url.startsWith('http://myHost')) {
|
50142 | * return {
|
50143 | * url: url.replace('http', 'https'),
|
50144 | * headers: { 'my-custom-header': true},
|
50145 | * credentials: 'include' // Include cookies for cross-origin requests
|
50146 | * }
|
50147 | * }
|
50148 | * }
|
50149 | * });
|
50150 | * @see [Display a map](https://maplibre.org/maplibre-gl-js-docs/example/simple-map/)
|
50151 | */
|
50152 | class Map extends Camera {
|
50153 | constructor(options) {
|
50154 | var _a;
|
50155 | performance.PerformanceUtils.mark(performance.PerformanceMarkers.create);
|
50156 | options = performance.extend({}, defaultOptions$4, options);
|
50157 | if (options.minZoom != null && options.maxZoom != null && options.minZoom > options.maxZoom) {
|
50158 | throw new Error('maxZoom must be greater than or equal to minZoom');
|
50159 | }
|
50160 | if (options.minPitch != null && options.maxPitch != null && options.minPitch > options.maxPitch) {
|
50161 | throw new Error('maxPitch must be greater than or equal to minPitch');
|
50162 | }
|
50163 | if (options.minPitch != null && options.minPitch < defaultMinPitch) {
|
50164 | throw new Error(`minPitch must be greater than or equal to ${defaultMinPitch}`);
|
50165 | }
|
50166 | if (options.maxPitch != null && options.maxPitch > maxPitchThreshold) {
|
50167 | throw new Error(`maxPitch must be less than or equal to ${maxPitchThreshold}`);
|
50168 | }
|
50169 | const transform = new Transform(options.minZoom, options.maxZoom, options.minPitch, options.maxPitch, options.renderWorldCopies);
|
50170 | super(transform, { bearingSnap: options.bearingSnap });
|
50171 | this._interactive = options.interactive;
|
50172 | this._maxTileCacheSize = options.maxTileCacheSize;
|
50173 | this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat;
|
50174 | this._preserveDrawingBuffer = options.preserveDrawingBuffer;
|
50175 | this._antialias = options.antialias;
|
50176 | this._trackResize = options.trackResize;
|
50177 | this._bearingSnap = options.bearingSnap;
|
50178 | this._refreshExpiredTiles = options.refreshExpiredTiles;
|
50179 | this._fadeDuration = options.fadeDuration;
|
50180 | this._crossSourceCollisions = options.crossSourceCollisions;
|
50181 | this._crossFadingFactor = 1;
|
50182 | this._collectResourceTiming = options.collectResourceTiming;
|
50183 | this._renderTaskQueue = new TaskQueue();
|
50184 | this._controls = [];
|
50185 | this._mapId = performance.uniqueId();
|
50186 | this._locale = performance.extend({}, defaultLocale, options.locale);
|
50187 | this._clickTolerance = options.clickTolerance;
|
50188 | this._pixelRatio = (_a = options.pixelRatio) !== null && _a !== void 0 ? _a : devicePixelRatio;
|
50189 | this._requestManager = new RequestManager(options.transformRequest);
|
50190 | if (typeof options.container === 'string') {
|
50191 | this._container = document.getElementById(options.container);
|
50192 | if (!this._container) {
|
50193 | throw new Error(`Container '${options.container}' not found.`);
|
50194 | }
|
50195 | }
|
50196 | else if (options.container instanceof HTMLElement) {
|
50197 | this._container = options.container;
|
50198 | }
|
50199 | else {
|
50200 | throw new Error('Invalid type: \'container\' must be a String or HTMLElement.');
|
50201 | }
|
50202 | if (options.maxBounds) {
|
50203 | this.setMaxBounds(options.maxBounds);
|
50204 | }
|
50205 | performance.bindAll([
|
50206 | '_onWindowOnline',
|
50207 | '_onWindowResize',
|
50208 | '_onMapScroll',
|
50209 | '_contextLost',
|
50210 | '_contextRestored'
|
50211 | ], this);
|
50212 | this._setupContainer();
|
50213 | this._setupPainter();
|
50214 | if (this.painter === undefined) {
|
50215 | throw new Error('Failed to initialize WebGL.');
|
50216 | }
|
50217 | this.on('move', () => this._update(false));
|
50218 | this.on('moveend', () => this._update(false));
|
50219 | this.on('zoom', () => this._update(true));
|
50220 | if (typeof window !== 'undefined') {
|
50221 | addEventListener('online', this._onWindowOnline, false);
|
50222 | addEventListener('resize', this._onWindowResize, false);
|
50223 | addEventListener('orientationchange', this._onWindowResize, false);
|
50224 | }
|
50225 | this.handlers = new HandlerManager(this, options);
|
50226 | const hashName = (typeof options.hash === 'string' && options.hash) || undefined;
|
50227 | this._hash = options.hash && (new Hash(hashName)).addTo(this);
|
50228 | // don't set position from options if set through hash
|
50229 | if (!this._hash || !this._hash._onHashChange()) {
|
50230 | this.jumpTo({
|
50231 | center: options.center,
|
50232 | zoom: options.zoom,
|
50233 | bearing: options.bearing,
|
50234 | pitch: options.pitch
|
50235 | });
|
50236 | if (options.bounds) {
|
50237 | this.resize();
|
50238 | this.fitBounds(options.bounds, performance.extend({}, options.fitBoundsOptions, { duration: 0 }));
|
50239 | }
|
50240 | }
|
50241 | this.resize();
|
50242 | this._localIdeographFontFamily = options.localIdeographFontFamily;
|
50243 | if (options.style)
|
50244 | this.setStyle(options.style, { localIdeographFontFamily: options.localIdeographFontFamily });
|
50245 | if (options.attributionControl)
|
50246 | this.addControl(new AttributionControl({ customAttribution: options.customAttribution }));
|
50247 | if (options.maplibreLogo)
|
50248 | this.addControl(new LogoControl(), options.logoPosition);
|
50249 | this.on('style.load', () => {
|
50250 | if (this.transform.unmodified) {
|
50251 | this.jumpTo(this.style.stylesheet);
|
50252 | }
|
50253 | });
|
50254 | this.on('data', (event) => {
|
50255 | this._update(event.dataType === 'style');
|
50256 | this.fire(new performance.Event(`${event.dataType}data`, event));
|
50257 | });
|
50258 | this.on('dataloading', (event) => {
|
50259 | this.fire(new performance.Event(`${event.dataType}dataloading`, event));
|
50260 | });
|
50261 | this.on('dataabort', (event) => {
|
50262 | this.fire(new performance.Event('sourcedataabort', event));
|
50263 | });
|
50264 | }
|
50265 | /*
|
50266 | * Returns a unique number for this map instance which is used for the MapLoadEvent
|
50267 | * to make sure we only fire one event per instantiated map object.
|
50268 | * @private
|
50269 | * @returns {number}
|
50270 | */
|
50271 | _getMapId() {
|
50272 | return this._mapId;
|
50273 | }
|
50274 | /**
|
50275 | * Adds an {@link IControl} to the map, calling `control.onAdd(this)`.
|
50276 | *
|
50277 | * @param {IControl} control The {@link IControl} to add.
|
50278 | * @param {string} [position] position on the map to which the control will be added.
|
50279 | * Valid values are `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`. Defaults to `'top-right'`.
|
50280 | * @returns {Map} `this`
|
50281 | * @example
|
50282 | * // Add zoom and rotation controls to the map.
|
50283 | * map.addControl(new maplibregl.NavigationControl());
|
50284 | * @see [Display map navigation controls](https://maplibre.org/maplibre-gl-js-docs/example/navigation/)
|
50285 | */
|
50286 | addControl(control, position) {
|
50287 | if (position === undefined) {
|
50288 | if (control.getDefaultPosition) {
|
50289 | position = control.getDefaultPosition();
|
50290 | }
|
50291 | else {
|
50292 | position = 'top-right';
|
50293 | }
|
50294 | }
|
50295 | if (!control || !control.onAdd) {
|
50296 | return this.fire(new performance.ErrorEvent(new Error('Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.')));
|
50297 | }
|
50298 | const controlElement = control.onAdd(this);
|
50299 | this._controls.push(control);
|
50300 | const positionContainer = this._controlPositions[position];
|
50301 | if (position.indexOf('bottom') !== -1) {
|
50302 | positionContainer.insertBefore(controlElement, positionContainer.firstChild);
|
50303 | }
|
50304 | else {
|
50305 | positionContainer.appendChild(controlElement);
|
50306 | }
|
50307 | return this;
|
50308 | }
|
50309 | /**
|
50310 | * Removes the control from the map.
|
50311 | *
|
50312 | * @param {IControl} control The {@link IControl} to remove.
|
50313 | * @returns {Map} `this`
|
50314 | * @example
|
50315 | * // Define a new navigation control.
|
50316 | * var navigation = new maplibregl.NavigationControl();
|
50317 | * // Add zoom and rotation controls to the map.
|
50318 | * map.addControl(navigation);
|
50319 | * // Remove zoom and rotation controls from the map.
|
50320 | * map.removeControl(navigation);
|
50321 | */
|
50322 | removeControl(control) {
|
50323 | if (!control || !control.onRemove) {
|
50324 | return this.fire(new performance.ErrorEvent(new Error('Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.')));
|
50325 | }
|
50326 | const ci = this._controls.indexOf(control);
|
50327 | if (ci > -1)
|
50328 | this._controls.splice(ci, 1);
|
50329 | control.onRemove(this);
|
50330 | return this;
|
50331 | }
|
50332 | /**
|
50333 | * Checks if a control exists on the map.
|
50334 | *
|
50335 | * @param {IControl} control The {@link IControl} to check.
|
50336 | * @returns {boolean} True if map contains control.
|
50337 | * @example
|
50338 | * // Define a new navigation control.
|
50339 | * var navigation = new maplibregl.NavigationControl();
|
50340 | * // Add zoom and rotation controls to the map.
|
50341 | * map.addControl(navigation);
|
50342 | * // Check that the navigation control exists on the map.
|
50343 | * map.hasControl(navigation);
|
50344 | */
|
50345 | hasControl(control) {
|
50346 | return this._controls.indexOf(control) > -1;
|
50347 | }
|
50348 | /**
|
50349 | * Resizes the map according to the dimensions of its
|
50350 | * `container` element.
|
50351 | *
|
50352 | * Checks if the map container size changed and updates the map if it has changed.
|
50353 | * This method must be called after the map's `container` is resized programmatically
|
50354 | * or when the map is shown after being initially hidden with CSS.
|
50355 | *
|
50356 | * @param eventData Additional properties to be passed to `movestart`, `move`, `resize`, and `moveend`
|
50357 | * events that get triggered as a result of resize. This can be useful for differentiating the
|
50358 | * source of an event (for example, user-initiated or programmatically-triggered events).
|
50359 | * @returns {Map} `this`
|
50360 | * @example
|
50361 | * // Resize the map when the map container is shown
|
50362 | * // after being initially hidden with CSS.
|
50363 | * var mapDiv = document.getElementById('map');
|
50364 | * if (mapDiv.style.visibility === true) map.resize();
|
50365 | */
|
50366 | resize(eventData) {
|
50367 | const dimensions = this._containerDimensions();
|
50368 | const width = dimensions[0];
|
50369 | const height = dimensions[1];
|
50370 | this._resizeCanvas(width, height, this.getPixelRatio());
|
50371 | this.transform.resize(width, height);
|
50372 | this.painter.resize(width, height, this.getPixelRatio());
|
50373 | const fireMoving = !this._moving;
|
50374 | if (fireMoving) {
|
50375 | this.stop();
|
50376 | this.fire(new performance.Event('movestart', eventData))
|
50377 | .fire(new performance.Event('move', eventData));
|
50378 | }
|
50379 | this.fire(new performance.Event('resize', eventData));
|
50380 | if (fireMoving)
|
50381 | this.fire(new performance.Event('moveend', eventData));
|
50382 | return this;
|
50383 | }
|
50384 | /**
|
50385 | * Returns the map's pixel ratio.
|
50386 | * @returns {number} The pixel ratio.
|
50387 | */
|
50388 | getPixelRatio() {
|
50389 | return this._pixelRatio;
|
50390 | }
|
50391 | /**
|
50392 | * Sets the map's pixel ratio. This allows to override `devicePixelRatio`.
|
50393 | * After this call, the canvas' `width` attribute will be `container.clientWidth * pixelRatio`
|
50394 | * and its height attribute will be `container.clientHeight * pixelRatio`.
|
50395 | * @param {number} pixelRatio The pixel ratio.
|
50396 | */
|
50397 | setPixelRatio(pixelRatio) {
|
50398 | const [width, height] = this._containerDimensions();
|
50399 | this._pixelRatio = pixelRatio;
|
50400 | this._resizeCanvas(width, height, pixelRatio);
|
50401 | this.painter.resize(width, height, pixelRatio);
|
50402 | }
|
50403 | /**
|
50404 | * Returns the map's geographical bounds. When the bearing or pitch is non-zero, the visible region is not
|
50405 | * an axis-aligned rectangle, and the result is the smallest bounds that encompasses the visible region.
|
50406 | * @returns {LngLatBounds} The geographical bounds of the map as {@link LngLatBounds}.
|
50407 | * @example
|
50408 | * var bounds = map.getBounds();
|
50409 | */
|
50410 | getBounds() {
|
50411 | return this.transform.getBounds();
|
50412 | }
|
50413 | /**
|
50414 | * Returns the maximum geographical bounds the map is constrained to, or `null` if none set.
|
50415 | * @returns The map object.
|
50416 | * @example
|
50417 | * var maxBounds = map.getMaxBounds();
|
50418 | */
|
50419 | getMaxBounds() {
|
50420 | return this.transform.getMaxBounds();
|
50421 | }
|
50422 | /**
|
50423 | * Sets or clears the map's geographical bounds.
|
50424 | *
|
50425 | * Pan and zoom operations are constrained within these bounds.
|
50426 | * If a pan or zoom is performed that would
|
50427 | * display regions outside these bounds, the map will
|
50428 | * instead display a position and zoom level
|
50429 | * as close as possible to the operation's request while still
|
50430 | * remaining within the bounds.
|
50431 | *
|
50432 | * @param {LngLatBoundsLike | null | undefined} bounds The maximum bounds to set. If `null` or `undefined` is provided, the function removes the map's maximum bounds.
|
50433 | * @returns {Map} `this`
|
50434 | * @example
|
50435 | * // Define bounds that conform to the `LngLatBoundsLike` object.
|
50436 | * var bounds = [
|
50437 | * [-74.04728, 40.68392], // [west, south]
|
50438 | * [-73.91058, 40.87764] // [east, north]
|
50439 | * ];
|
50440 | * // Set the map's max bounds.
|
50441 | * map.setMaxBounds(bounds);
|
50442 | */
|
50443 | setMaxBounds(bounds) {
|
50444 | this.transform.setMaxBounds(performance.LngLatBounds.convert(bounds));
|
50445 | return this._update();
|
50446 | }
|
50447 | /**
|
50448 | * Sets or clears the map's minimum zoom level.
|
50449 | * If the map's current zoom level is lower than the new minimum,
|
50450 | * the map will zoom to the new minimum.
|
50451 | *
|
50452 | * It is not always possible to zoom out and reach the set `minZoom`.
|
50453 | * Other factors such as map height may restrict zooming. For example,
|
50454 | * if the map is 512px tall it will not be possible to zoom below zoom 0
|
50455 | * no matter what the `minZoom` is set to.
|
50456 | *
|
50457 | * @param {number | null | undefined} minZoom The minimum zoom level to set (-2 - 24).
|
50458 | * If `null` or `undefined` is provided, the function removes the current minimum zoom (i.e. sets it to -2).
|
50459 | * @returns {Map} `this`
|
50460 | * @example
|
50461 | * map.setMinZoom(12.25);
|
50462 | */
|
50463 | setMinZoom(minZoom) {
|
50464 | minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom;
|
50465 | if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) {
|
50466 | this.transform.minZoom = minZoom;
|
50467 | this._update();
|
50468 | if (this.getZoom() < minZoom)
|
50469 | this.setZoom(minZoom);
|
50470 | return this;
|
50471 | }
|
50472 | else
|
50473 | throw new Error(`minZoom must be between ${defaultMinZoom} and the current maxZoom, inclusive`);
|
50474 | }
|
50475 | /**
|
50476 | * Returns the map's minimum allowable zoom level.
|
50477 | *
|
50478 | * @returns {number} minZoom
|
50479 | * @example
|
50480 | * var minZoom = map.getMinZoom();
|
50481 | */
|
50482 | getMinZoom() { return this.transform.minZoom; }
|
50483 | /**
|
50484 | * Sets or clears the map's maximum zoom level.
|
50485 | * If the map's current zoom level is higher than the new maximum,
|
50486 | * the map will zoom to the new maximum.
|
50487 | *
|
50488 | * @param {number | null | undefined} maxZoom The maximum zoom level to set.
|
50489 | * If `null` or `undefined` is provided, the function removes the current maximum zoom (sets it to 22).
|
50490 | * @returns {Map} `this`
|
50491 | * @example
|
50492 | * map.setMaxZoom(18.75);
|
50493 | */
|
50494 | setMaxZoom(maxZoom) {
|
50495 | maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom;
|
50496 | if (maxZoom >= this.transform.minZoom) {
|
50497 | this.transform.maxZoom = maxZoom;
|
50498 | this._update();
|
50499 | if (this.getZoom() > maxZoom)
|
50500 | this.setZoom(maxZoom);
|
50501 | return this;
|
50502 | }
|
50503 | else
|
50504 | throw new Error('maxZoom must be greater than the current minZoom');
|
50505 | }
|
50506 | /**
|
50507 | * Returns the map's maximum allowable zoom level.
|
50508 | *
|
50509 | * @returns {number} maxZoom
|
50510 | * @example
|
50511 | * var maxZoom = map.getMaxZoom();
|
50512 | */
|
50513 | getMaxZoom() { return this.transform.maxZoom; }
|
50514 | /**
|
50515 | * Sets or clears the map's minimum pitch.
|
50516 | * If the map's current pitch is lower than the new minimum,
|
50517 | * the map will pitch to the new minimum.
|
50518 | *
|
50519 | * @param {number | null | undefined} minPitch The minimum pitch to set (0-85). Values greater than 60 degrees are experimental and may result in rendering issues. If you encounter any, please raise an issue with details in the MapLibre project.
|
50520 | * If `null` or `undefined` is provided, the function removes the current minimum pitch (i.e. sets it to 0).
|
50521 | * @returns {Map} `this`
|
50522 | */
|
50523 | setMinPitch(minPitch) {
|
50524 | minPitch = minPitch === null || minPitch === undefined ? defaultMinPitch : minPitch;
|
50525 | if (minPitch < defaultMinPitch) {
|
50526 | throw new Error(`minPitch must be greater than or equal to ${defaultMinPitch}`);
|
50527 | }
|
50528 | if (minPitch >= defaultMinPitch && minPitch <= this.transform.maxPitch) {
|
50529 | this.transform.minPitch = minPitch;
|
50530 | this._update();
|
50531 | if (this.getPitch() < minPitch)
|
50532 | this.setPitch(minPitch);
|
50533 | return this;
|
50534 | }
|
50535 | else
|
50536 | throw new Error(`minPitch must be between ${defaultMinPitch} and the current maxPitch, inclusive`);
|
50537 | }
|
50538 | /**
|
50539 | * Returns the map's minimum allowable pitch.
|
50540 | *
|
50541 | * @returns {number} minPitch
|
50542 | */
|
50543 | getMinPitch() { return this.transform.minPitch; }
|
50544 | /**
|
50545 | * Sets or clears the map's maximum pitch.
|
50546 | * If the map's current pitch is higher than the new maximum,
|
50547 | * the map will pitch to the new maximum.
|
50548 | *
|
50549 | * @param {number | null | undefined} maxPitch The maximum pitch to set (0-85). Values greater than 60 degrees are experimental and may result in rendering issues. If you encounter any, please raise an issue with details in the MapLibre project.
|
50550 | * If `null` or `undefined` is provided, the function removes the current maximum pitch (sets it to 60).
|
50551 | * @returns {Map} `this`
|
50552 | */
|
50553 | setMaxPitch(maxPitch) {
|
50554 | maxPitch = maxPitch === null || maxPitch === undefined ? defaultMaxPitch : maxPitch;
|
50555 | if (maxPitch > maxPitchThreshold) {
|
50556 | throw new Error(`maxPitch must be less than or equal to ${maxPitchThreshold}`);
|
50557 | }
|
50558 | if (maxPitch >= this.transform.minPitch) {
|
50559 | this.transform.maxPitch = maxPitch;
|
50560 | this._update();
|
50561 | if (this.getPitch() > maxPitch)
|
50562 | this.setPitch(maxPitch);
|
50563 | return this;
|
50564 | }
|
50565 | else
|
50566 | throw new Error('maxPitch must be greater than the current minPitch');
|
50567 | }
|
50568 | /**
|
50569 | * Returns the map's maximum allowable pitch.
|
50570 | *
|
50571 | * @returns {number} maxPitch
|
50572 | */
|
50573 | getMaxPitch() { return this.transform.maxPitch; }
|
50574 | /**
|
50575 | * Returns the state of `renderWorldCopies`. If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`:
|
50576 | * - When the map is zoomed out far enough that a single representation of the world does not fill the map's entire
|
50577 | * container, there will be blank space beyond 180 and -180 degrees longitude.
|
50578 | * - Features that cross 180 and -180 degrees longitude will be cut in two (with one portion on the right edge of the
|
50579 | * map and the other on the left edge of the map) at every zoom level.
|
50580 | * @returns {boolean} renderWorldCopies
|
50581 | * @example
|
50582 | * var worldCopiesRendered = map.getRenderWorldCopies();
|
50583 | * @see [Render world copies](https://maplibre.org/maplibre-gl-js-docs/example/render-world-copies/)
|
50584 | */
|
50585 | getRenderWorldCopies() { return this.transform.renderWorldCopies; }
|
50586 | /**
|
50587 | * Sets the state of `renderWorldCopies`.
|
50588 | *
|
50589 | * @param {boolean} renderWorldCopies If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`:
|
50590 | * - When the map is zoomed out far enough that a single representation of the world does not fill the map's entire
|
50591 | * container, there will be blank space beyond 180 and -180 degrees longitude.
|
50592 | * - Features that cross 180 and -180 degrees longitude will be cut in two (with one portion on the right edge of the
|
50593 | * map and the other on the left edge of the map) at every zoom level.
|
50594 | *
|
50595 | * `undefined` is treated as `true`, `null` is treated as `false`.
|
50596 | * @returns {Map} `this`
|
50597 | * @example
|
50598 | * map.setRenderWorldCopies(true);
|
50599 | * @see [Render world copies](https://maplibre.org/maplibre-gl-js-docs/example/render-world-copies/)
|
50600 | */
|
50601 | setRenderWorldCopies(renderWorldCopies) {
|
50602 | this.transform.renderWorldCopies = renderWorldCopies;
|
50603 | return this._update();
|
50604 | }
|
50605 | /**
|
50606 | * Returns a [Point](https://github.com/mapbox/point-geometry) representing pixel coordinates, relative to the map's `container`,
|
50607 | * that correspond to the specified geographical location.
|
50608 | *
|
50609 | * @param {LngLatLike} lnglat The geographical location to project.
|
50610 | * @returns {Point} The [Point](https://github.com/mapbox/point-geometry) corresponding to `lnglat`, relative to the map's `container`.
|
50611 | * @example
|
50612 | * var coordinate = [-122.420679, 37.772537];
|
50613 | * var point = map.project(coordinate);
|
50614 | */
|
50615 | project(lnglat) {
|
50616 | return this.transform.locationPoint(performance.LngLat.convert(lnglat));
|
50617 | }
|
50618 | /**
|
50619 | * Returns a {@link LngLat} representing geographical coordinates that correspond
|
50620 | * to the specified pixel coordinates.
|
50621 | *
|
50622 | * @param {PointLike} point The pixel coordinates to unproject.
|
50623 | * @returns {LngLat} The {@link LngLat} corresponding to `point`.
|
50624 | * @example
|
50625 | * map.on('click', function(e) {
|
50626 | * // When the map is clicked, get the geographic coordinate.
|
50627 | * var coordinate = map.unproject(e.point);
|
50628 | * });
|
50629 | */
|
50630 | unproject(point) {
|
50631 | return this.transform.pointLocation(performance.pointGeometry.convert(point));
|
50632 | }
|
50633 | /**
|
50634 | * Returns true if the map is panning, zooming, rotating, or pitching due to a camera animation or user gesture.
|
50635 | * @returns {boolean} True if the map is moving.
|
50636 | * @example
|
50637 | * var isMoving = map.isMoving();
|
50638 | */
|
50639 | isMoving() {
|
50640 | return this._moving || this.handlers.isMoving();
|
50641 | }
|
50642 | /**
|
50643 | * Returns true if the map is zooming due to a camera animation or user gesture.
|
50644 | * @returns {boolean} True if the map is zooming.
|
50645 | * @example
|
50646 | * var isZooming = map.isZooming();
|
50647 | */
|
50648 | isZooming() {
|
50649 | return this._zooming || this.handlers.isZooming();
|
50650 | }
|
50651 | /**
|
50652 | * Returns true if the map is rotating due to a camera animation or user gesture.
|
50653 | * @returns {boolean} True if the map is rotating.
|
50654 | * @example
|
50655 | * map.isRotating();
|
50656 | */
|
50657 | isRotating() {
|
50658 | return this._rotating || this.handlers.isRotating();
|
50659 | }
|
50660 | _createDelegatedListener(type, layerId, listener) {
|
50661 | if (type === 'mouseenter' || type === 'mouseover') {
|
50662 | let mousein = false;
|
50663 | const mousemove = (e) => {
|
50664 | const features = this.getLayer(layerId) ? this.queryRenderedFeatures(e.point, { layers: [layerId] }) : [];
|
50665 | if (!features.length) {
|
50666 | mousein = false;
|
50667 | }
|
50668 | else if (!mousein) {
|
50669 | mousein = true;
|
50670 | listener.call(this, new MapMouseEvent(type, this, e.originalEvent, { features }));
|
50671 | }
|
50672 | };
|
50673 | const mouseout = () => {
|
50674 | mousein = false;
|
50675 | };
|
50676 | return { layer: layerId, listener, delegates: { mousemove, mouseout } };
|
50677 | }
|
50678 | else if (type === 'mouseleave' || type === 'mouseout') {
|
50679 | let mousein = false;
|
50680 | const mousemove = (e) => {
|
50681 | const features = this.getLayer(layerId) ? this.queryRenderedFeatures(e.point, { layers: [layerId] }) : [];
|
50682 | if (features.length) {
|
50683 | mousein = true;
|
50684 | }
|
50685 | else if (mousein) {
|
50686 | mousein = false;
|
50687 | listener.call(this, new MapMouseEvent(type, this, e.originalEvent));
|
50688 | }
|
50689 | };
|
50690 | const mouseout = (e) => {
|
50691 | if (mousein) {
|
50692 | mousein = false;
|
50693 | listener.call(this, new MapMouseEvent(type, this, e.originalEvent));
|
50694 | }
|
50695 | };
|
50696 | return { layer: layerId, listener, delegates: { mousemove, mouseout } };
|
50697 | }
|
50698 | else {
|
50699 | const delegate = (e) => {
|
50700 | const features = this.getLayer(layerId) ? this.queryRenderedFeatures(e.point, { layers: [layerId] }) : [];
|
50701 | if (features.length) {
|
50702 | // Here we need to mutate the original event, so that preventDefault works as expected.
|
50703 | e.features = features;
|
50704 | listener.call(this, e);
|
50705 | delete e.features;
|
50706 | }
|
50707 | };
|
50708 | return { layer: layerId, listener, delegates: { [type]: delegate } };
|
50709 | }
|
50710 | }
|
50711 | on(type, layerIdOrListener, listener) {
|
50712 | if (listener === undefined) {
|
50713 | return super.on(type, layerIdOrListener);
|
50714 | }
|
50715 | const delegatedListener = this._createDelegatedListener(type, layerIdOrListener, listener);
|
50716 | this._delegatedListeners = this._delegatedListeners || {};
|
50717 | this._delegatedListeners[type] = this._delegatedListeners[type] || [];
|
50718 | this._delegatedListeners[type].push(delegatedListener);
|
50719 | for (const event in delegatedListener.delegates) {
|
50720 | this.on(event, delegatedListener.delegates[event]);
|
50721 | }
|
50722 | return this;
|
50723 | }
|
50724 | once(type, layerIdOrListener, listener) {
|
50725 | if (listener === undefined) {
|
50726 | return super.once(type, layerIdOrListener);
|
50727 | }
|
50728 | const delegatedListener = this._createDelegatedListener(type, layerIdOrListener, listener);
|
50729 | for (const event in delegatedListener.delegates) {
|
50730 | this.once(event, delegatedListener.delegates[event]);
|
50731 | }
|
50732 | return this;
|
50733 | }
|
50734 | off(type, layerIdOrListener, listener) {
|
50735 | if (listener === undefined) {
|
50736 | return super.off(type, layerIdOrListener);
|
50737 | }
|
50738 | const removeDelegatedListener = (delegatedListeners) => {
|
50739 | const listeners = delegatedListeners[type];
|
50740 | for (let i = 0; i < listeners.length; i++) {
|
50741 | const delegatedListener = listeners[i];
|
50742 | if (delegatedListener.layer === layerIdOrListener && delegatedListener.listener === listener) {
|
50743 | for (const event in delegatedListener.delegates) {
|
50744 | this.off(event, delegatedListener.delegates[event]);
|
50745 | }
|
50746 | listeners.splice(i, 1);
|
50747 | return this;
|
50748 | }
|
50749 | }
|
50750 | };
|
50751 | if (this._delegatedListeners && this._delegatedListeners[type]) {
|
50752 | removeDelegatedListener(this._delegatedListeners);
|
50753 | }
|
50754 | return this;
|
50755 | }
|
50756 | /**
|
50757 | * Returns an array of MapGeoJSONFeature objects
|
50758 | * representing visible features that satisfy the query parameters.
|
50759 | *
|
50760 | * @param {PointLike|Array<PointLike>} [geometry] - The geometry of the query region:
|
50761 | * either a single point or southwest and northeast points describing a bounding box.
|
50762 | * Omitting this parameter (i.e. calling {@link Map#queryRenderedFeatures} with zero arguments,
|
50763 | * or with only a `options` argument) is equivalent to passing a bounding box encompassing the entire
|
50764 | * map viewport.
|
50765 | * @param {Object} [options] Options object.
|
50766 | * @param {Array<string>} [options.layers] An array of [style layer IDs](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layer-id) for the query to inspect.
|
50767 | * Only features within these layers will be returned. If this parameter is undefined, all layers will be checked.
|
50768 | * @param {Array} [options.filter] A [filter](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#filter)
|
50769 | * to limit query results.
|
50770 | * @param {boolean} [options.validate=true] Whether to check if the [options.filter] conforms to the MapLibre GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
|
50771 | *
|
50772 | * @returns {Array<MapGeoJSONFeature>} An array of MapGeoJSONFeature objects.
|
50773 | *
|
50774 | * The `properties` value of each returned feature object contains the properties of its source feature. For GeoJSON sources, only
|
50775 | * string and numeric property values are supported (i.e. `null`, `Array`, and `Object` values are not supported).
|
50776 | *
|
50777 | * Each feature includes top-level `layer`, `source`, and `sourceLayer` properties. The `layer` property is an object
|
50778 | * representing the style layer to which the feature belongs. Layout and paint properties in this object contain values
|
50779 | * which are fully evaluated for the given zoom level and feature.
|
50780 | *
|
50781 | * Only features that are currently rendered are included. Some features will **not** be included, like:
|
50782 | *
|
50783 | * - Features from layers whose `visibility` property is `"none"`.
|
50784 | * - Features from layers whose zoom range excludes the current zoom level.
|
50785 | * - Symbol features that have been hidden due to text or icon collision.
|
50786 | *
|
50787 | * Features from all other layers are included, including features that may have no visible
|
50788 | * contribution to the rendered result; for example, because the layer's opacity or color alpha component is set to
|
50789 | * 0.
|
50790 | *
|
50791 | * The topmost rendered feature appears first in the returned array, and subsequent features are sorted by
|
50792 | * descending z-order. Features that are rendered multiple times (due to wrapping across the antimeridian at low
|
50793 | * zoom levels) are returned only once (though subject to the following caveat).
|
50794 | *
|
50795 | * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature
|
50796 | * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple
|
50797 | * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query.
|
50798 | * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding
|
50799 | * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile
|
50800 | * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple
|
50801 | * tiles due to tile buffering.
|
50802 | *
|
50803 | * @example
|
50804 | * // Find all features at a point
|
50805 | * var features = map.queryRenderedFeatures(
|
50806 | * [20, 35],
|
50807 | * { layers: ['my-layer-name'] }
|
50808 | * );
|
50809 | *
|
50810 | * @example
|
50811 | * // Find all features within a static bounding box
|
50812 | * var features = map.queryRenderedFeatures(
|
50813 | * [[10, 20], [30, 50]],
|
50814 | * { layers: ['my-layer-name'] }
|
50815 | * );
|
50816 | *
|
50817 | * @example
|
50818 | * // Find all features within a bounding box around a point
|
50819 | * var width = 10;
|
50820 | * var height = 20;
|
50821 | * var features = map.queryRenderedFeatures([
|
50822 | * [point.x - width / 2, point.y - height / 2],
|
50823 | * [point.x + width / 2, point.y + height / 2]
|
50824 | * ], { layers: ['my-layer-name'] });
|
50825 | *
|
50826 | * @example
|
50827 | * // Query all rendered features from a single layer
|
50828 | * var features = map.queryRenderedFeatures({ layers: ['my-layer-name'] });
|
50829 | * @see [Get features under the mouse pointer](https://maplibre.org/maplibre-gl-js-docs/example/queryrenderedfeatures/)
|
50830 | */
|
50831 | queryRenderedFeatures(geometry, options) {
|
50832 | // The first parameter can be omitted entirely, making this effectively an overloaded method
|
50833 | // with two signatures:
|
50834 | //
|
50835 | // queryRenderedFeatures(geometry: PointLike | [PointLike, PointLike], options?: Object)
|
50836 | // queryRenderedFeatures(options?: Object)
|
50837 | //
|
50838 | // There no way to express that in a way that's compatible with both flow and documentation.js.
|
50839 | // Related: https://github.com/facebook/flow/issues/1556
|
50840 | if (!this.style) {
|
50841 | return [];
|
50842 | }
|
50843 | if (options === undefined && geometry !== undefined && !(geometry instanceof performance.pointGeometry) && !Array.isArray(geometry)) {
|
50844 | options = geometry;
|
50845 | geometry = undefined;
|
50846 | }
|
50847 | options = options || {};
|
50848 | geometry = geometry || [[0, 0], [this.transform.width, this.transform.height]];
|
50849 | let queryGeometry;
|
50850 | if (geometry instanceof performance.pointGeometry || typeof geometry[0] === 'number') {
|
50851 | queryGeometry = [performance.pointGeometry.convert(geometry)];
|
50852 | }
|
50853 | else {
|
50854 | const tl = performance.pointGeometry.convert(geometry[0]);
|
50855 | const br = performance.pointGeometry.convert(geometry[1]);
|
50856 | queryGeometry = [tl, new performance.pointGeometry(br.x, tl.y), br, new performance.pointGeometry(tl.x, br.y), tl];
|
50857 | }
|
50858 | return this.style.queryRenderedFeatures(queryGeometry, options, this.transform);
|
50859 | }
|
50860 | /**
|
50861 | * Returns an array of MapGeoJSONFeature objects
|
50862 | * representing features within the specified vector tile or GeoJSON source that satisfy the query parameters.
|
50863 | *
|
50864 | * @param {string} sourceId The ID of the vector tile or GeoJSON source to query.
|
50865 | * @param {Object} [parameters] Options object.
|
50866 | * @param {string} [parameters.sourceLayer] The name of the source layer
|
50867 | * to query. *For vector tile sources, this parameter is required.* For GeoJSON sources, it is ignored.
|
50868 | * @param {Array} [parameters.filter] A [filter](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#filter)
|
50869 | * to limit query results.
|
50870 | * @param {boolean} [parameters.validate=true] Whether to check if the [parameters.filter] conforms to the MapLibre GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
|
50871 | *
|
50872 | * @returns {Array<MapGeoJSONFeature>} An array of MapGeoJSONFeature objects.
|
50873 | *
|
50874 | * In contrast to {@link Map#queryRenderedFeatures}, this function returns all features matching the query parameters,
|
50875 | * whether or not they are rendered by the current style (i.e. visible). The domain of the query includes all currently-loaded
|
50876 | * vector tiles and GeoJSON source tiles: this function does not check tiles outside the currently
|
50877 | * visible viewport.
|
50878 | *
|
50879 | * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature
|
50880 | * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple
|
50881 | * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query.
|
50882 | * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding
|
50883 | * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile
|
50884 | * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple
|
50885 | * tiles due to tile buffering.
|
50886 | *
|
50887 | * @example
|
50888 | * // Find all features in one source layer in a vector source
|
50889 | * var features = map.querySourceFeatures('your-source-id', {
|
50890 | * sourceLayer: 'your-source-layer'
|
50891 | * });
|
50892 | *
|
50893 | */
|
50894 | querySourceFeatures(sourceId, parameters) {
|
50895 | return this.style.querySourceFeatures(sourceId, parameters);
|
50896 | }
|
50897 | /**
|
50898 | * Updates the map's MapLibre style object with a new value.
|
50899 | *
|
50900 | * If a style is already set when this is used and options.diff is set to true, the map renderer will attempt to compare the given style
|
50901 | * against the map's current state and perform only the changes necessary to make the map style match the desired state. Changes in sprites
|
50902 | * (images used for icons and patterns) and glyphs (fonts for label text) **cannot** be diffed. If the sprites or fonts used in the current
|
50903 | * style and the given style are different in any way, the map renderer will force a full update, removing the current style and building
|
50904 | * the given one from scratch.
|
50905 | *
|
50906 | *
|
50907 | * @param style A JSON object conforming to the schema described in the
|
50908 | * [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/), or a URL to such JSON.
|
50909 | * @param {Object} [options] Options object.
|
50910 | * @param {boolean} [options.diff=true] If false, force a 'full' update, removing the current style
|
50911 | * and building the given one instead of attempting a diff-based update.
|
50912 | * @param {string} [options.localIdeographFontFamily='sans-serif'] Defines a CSS
|
50913 | * font-family for locally overriding generation of glyphs in the 'CJK Unified Ideographs', 'Hiragana', 'Katakana' and 'Hangul Syllables' ranges.
|
50914 | * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold).
|
50915 | * Set to `false`, to enable font settings from the map's style for these glyph ranges.
|
50916 | * Forces a full update.
|
50917 | * @returns {Map} `this`
|
50918 | *
|
50919 | * @example
|
50920 | * map.setStyle("https://demotiles.maplibre.org/style.json");
|
50921 | *
|
50922 | */
|
50923 | setStyle(style, options) {
|
50924 | options = performance.extend({}, { localIdeographFontFamily: this._localIdeographFontFamily }, options);
|
50925 | if ((options.diff !== false && options.localIdeographFontFamily === this._localIdeographFontFamily) && this.style && style) {
|
50926 | this._diffStyle(style, options);
|
50927 | return this;
|
50928 | }
|
50929 | else {
|
50930 | this._localIdeographFontFamily = options.localIdeographFontFamily;
|
50931 | return this._updateStyle(style, options);
|
50932 | }
|
50933 | }
|
50934 | /**
|
50935 | * Updates the requestManager's transform request with a new function
|
50936 | *
|
50937 | * @param transformRequest A callback run before the Map makes a request for an external URL. The callback can be used to modify the url, set headers, or set the credentials property for cross-origin requests.
|
50938 | * Expected to return an object with a `url` property and optionally `headers` and `credentials` properties
|
50939 | *
|
50940 | * @returns {Map} `this`
|
50941 | *
|
50942 | * @example
|
50943 | * map.setTransformRequest((url: string, resourceType: string) => {});
|
50944 | */
|
50945 | setTransformRequest(transformRequest) {
|
50946 | this._requestManager.setTransformRequest(transformRequest);
|
50947 | return this;
|
50948 | }
|
50949 | _getUIString(key) {
|
50950 | const str = this._locale[key];
|
50951 | if (str == null) {
|
50952 | throw new Error(`Missing UI string '${key}'`);
|
50953 | }
|
50954 | return str;
|
50955 | }
|
50956 | _updateStyle(style, options) {
|
50957 | if (this.style) {
|
50958 | this.style.setEventedParent(null);
|
50959 | this.style._remove();
|
50960 | }
|
50961 | if (!style) {
|
50962 | delete this.style;
|
50963 | return this;
|
50964 | }
|
50965 | else {
|
50966 | this.style = new Style(this, options || {});
|
50967 | }
|
50968 | this.style.setEventedParent(this, { style: this.style });
|
50969 | if (typeof style === 'string') {
|
50970 | this.style.loadURL(style);
|
50971 | }
|
50972 | else {
|
50973 | this.style.loadJSON(style);
|
50974 | }
|
50975 | return this;
|
50976 | }
|
50977 | _lazyInitEmptyStyle() {
|
50978 | if (!this.style) {
|
50979 | this.style = new Style(this, {});
|
50980 | this.style.setEventedParent(this, { style: this.style });
|
50981 | this.style.loadEmpty();
|
50982 | }
|
50983 | }
|
50984 | _diffStyle(style, options) {
|
50985 | if (typeof style === 'string') {
|
50986 | const url = style;
|
50987 | const request = this._requestManager.transformRequest(url, performance.ResourceType.Style);
|
50988 | performance.getJSON(request, (error, json) => {
|
50989 | if (error) {
|
50990 | this.fire(new performance.ErrorEvent(error));
|
50991 | }
|
50992 | else if (json) {
|
50993 | this._updateDiff(json, options);
|
50994 | }
|
50995 | });
|
50996 | }
|
50997 | else if (typeof style === 'object') {
|
50998 | this._updateDiff(style, options);
|
50999 | }
|
51000 | }
|
51001 | _updateDiff(style, options) {
|
51002 | try {
|
51003 | if (this.style.setState(style)) {
|
51004 | this._update(true);
|
51005 | }
|
51006 | }
|
51007 | catch (e) {
|
51008 | performance.warnOnce(`Unable to perform style diff: ${e.message || e.error || e}. Rebuilding the style from scratch.`);
|
51009 | this._updateStyle(style, options);
|
51010 | }
|
51011 | }
|
51012 | /**
|
51013 | * Returns the map's MapLibre style object, a JSON object which can be used to recreate the map's style.
|
51014 | *
|
51015 | * @returns {Object} The map's style JSON object.
|
51016 | *
|
51017 | * @example
|
51018 | * var styleJson = map.getStyle();
|
51019 | *
|
51020 | */
|
51021 | getStyle() {
|
51022 | if (this.style) {
|
51023 | return this.style.serialize();
|
51024 | }
|
51025 | }
|
51026 | /**
|
51027 | * Returns a Boolean indicating whether the map's style is fully loaded.
|
51028 | *
|
51029 | * @returns {boolean} A Boolean indicating whether the style is fully loaded.
|
51030 | *
|
51031 | * @example
|
51032 | * var styleLoadStatus = map.isStyleLoaded();
|
51033 | */
|
51034 | isStyleLoaded() {
|
51035 | if (!this.style)
|
51036 | return performance.warnOnce('There is no style added to the map.');
|
51037 | return this.style.loaded();
|
51038 | }
|
51039 | /**
|
51040 | * Adds a source to the map's style.
|
51041 | *
|
51042 | * @param {string} id The ID of the source to add. Must not conflict with existing sources.
|
51043 | * @param {Object} source The source object, conforming to the
|
51044 | * MapLibre Style Specification's [source definition](https://maplibre.org/maplibre-gl-js-docs/style-spec/#sources) or
|
51045 | * {@link CanvasSourceOptions}.
|
51046 | * @fires source.add
|
51047 | * @returns {Map} `this`
|
51048 | * @example
|
51049 | * map.addSource('my-data', {
|
51050 | * type: 'vector',
|
51051 | * url: 'https://demotiles.maplibre.org/tiles/tiles.json'
|
51052 | * });
|
51053 | * @example
|
51054 | * map.addSource('my-data', {
|
51055 | * "type": "geojson",
|
51056 | * "data": {
|
51057 | * "type": "Feature",
|
51058 | * "geometry": {
|
51059 | * "type": "Point",
|
51060 | * "coordinates": [-77.0323, 38.9131]
|
51061 | * },
|
51062 | * "properties": {
|
51063 | * "title": "Mapbox DC",
|
51064 | * "marker-symbol": "monument"
|
51065 | * }
|
51066 | * }
|
51067 | * });
|
51068 | * @see GeoJSON source: [Add live realtime data](https://maplibre.org/maplibre-gl-js-docs/example/live-geojson/)
|
51069 | */
|
51070 | addSource(id, source) {
|
51071 | this._lazyInitEmptyStyle();
|
51072 | this.style.addSource(id, source);
|
51073 | return this._update(true);
|
51074 | }
|
51075 | /**
|
51076 | * Returns a Boolean indicating whether the source is loaded. Returns `true` if the source with
|
51077 | * the given ID in the map's style has no outstanding network requests, otherwise `false`.
|
51078 | *
|
51079 | * @param {string} id The ID of the source to be checked.
|
51080 | * @returns {boolean} A Boolean indicating whether the source is loaded.
|
51081 | * @example
|
51082 | * var sourceLoaded = map.isSourceLoaded('bathymetry-data');
|
51083 | */
|
51084 | isSourceLoaded(id) {
|
51085 | const source = this.style && this.style.sourceCaches[id];
|
51086 | if (source === undefined) {
|
51087 | this.fire(new performance.ErrorEvent(new Error(`There is no source with ID '${id}'`)));
|
51088 | return;
|
51089 | }
|
51090 | return source.loaded();
|
51091 | }
|
51092 | /**
|
51093 | * Returns a Boolean indicating whether all tiles in the viewport from all sources on
|
51094 | * the style are loaded.
|
51095 | *
|
51096 | * @returns {boolean} A Boolean indicating whether all tiles are loaded.
|
51097 | * @example
|
51098 | * var tilesLoaded = map.areTilesLoaded();
|
51099 | */
|
51100 | areTilesLoaded() {
|
51101 | const sources = this.style && this.style.sourceCaches;
|
51102 | for (const id in sources) {
|
51103 | const source = sources[id];
|
51104 | const tiles = source._tiles;
|
51105 | for (const t in tiles) {
|
51106 | const tile = tiles[t];
|
51107 | if (!(tile.state === 'loaded' || tile.state === 'errored'))
|
51108 | return false;
|
51109 | }
|
51110 | }
|
51111 | return true;
|
51112 | }
|
51113 | /**
|
51114 | * Adds a [custom source type](#Custom Sources), making it available for use with
|
51115 | * {@link Map#addSource}.
|
51116 | * @private
|
51117 | * @param {string} name The name of the source type; source definition objects use this name in the `{type: ...}` field.
|
51118 | * @param {Function} SourceType A {@link Source} constructor.
|
51119 | * @param {Callback<void>} callback Called when the source type is ready or with an error argument if there is an error.
|
51120 | */
|
51121 | addSourceType(name, SourceType, callback) {
|
51122 | this._lazyInitEmptyStyle();
|
51123 | return this.style.addSourceType(name, SourceType, callback);
|
51124 | }
|
51125 | /**
|
51126 | * Removes a source from the map's style.
|
51127 | *
|
51128 | * @param {string} id The ID of the source to remove.
|
51129 | * @returns {Map} `this`
|
51130 | * @example
|
51131 | * map.removeSource('bathymetry-data');
|
51132 | */
|
51133 | removeSource(id) {
|
51134 | this.style.removeSource(id);
|
51135 | return this._update(true);
|
51136 | }
|
51137 | /**
|
51138 | * Returns the source with the specified ID in the map's style.
|
51139 | *
|
51140 | * This method is often used to update a source using the instance members for the relevant
|
51141 | * source type as defined in [Sources](#sources).
|
51142 | * For example, setting the `data` for a GeoJSON source or updating the `url` and `coordinates`
|
51143 | * of an image source.
|
51144 | *
|
51145 | * @param {string} id The ID of the source to get.
|
51146 | * @returns {Source | undefined} The style source with the specified ID or `undefined` if the ID
|
51147 | * corresponds to no existing sources.
|
51148 | * The shape of the object varies by source type.
|
51149 | * A list of options for each source type is available on the MapLibre Style Specification's
|
51150 | * [Sources](https://maplibre.org/maplibre-gl-js-docs/style-spec/sources/) page.
|
51151 | * @example
|
51152 | * var sourceObject = map.getSource('points');
|
51153 | * @see [Create a draggable point](https://maplibre.org/maplibre-gl-js-docs/example/drag-a-point/)
|
51154 | * @see [Animate a point](https://maplibre.org/maplibre-gl-js-docs/example/animate-point-along-line/)
|
51155 | * @see [Add live realtime data](https://maplibre.org/maplibre-gl-js-docs/example/live-geojson/)
|
51156 | */
|
51157 | getSource(id) {
|
51158 | return this.style.getSource(id);
|
51159 | }
|
51160 | // eslint-disable-next-line jsdoc/require-returns
|
51161 | /**
|
51162 | * Add an image to the style. This image can be displayed on the map like any other icon in the style's
|
51163 | * sprite using the image's ID with
|
51164 | * [`icon-image`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layout-symbol-icon-image),
|
51165 | * [`background-pattern`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#paint-background-background-pattern),
|
51166 | * [`fill-pattern`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#paint-fill-fill-pattern),
|
51167 | * or [`line-pattern`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#paint-line-line-pattern).
|
51168 | * A {@link Map.event:error} event will be fired if there is not enough space in the sprite to add this image.
|
51169 | *
|
51170 | * @param id The ID of the image.
|
51171 | * @param image The image as an `HTMLImageElement`, `ImageData`, `ImageBitmap` or object with `width`, `height`, and `data`
|
51172 | * properties with the same format as `ImageData`.
|
51173 | * @param options Options object.
|
51174 | * @param options.pixelRatio The ratio of pixels in the image to physical pixels on the screen
|
51175 | * @param options.sdf Whether the image should be interpreted as an SDF image
|
51176 | * @param options.content `[x1, y1, x2, y2]` If `icon-text-fit` is used in a layer with this image, this option defines the part of the image that can be covered by the content in `text-field`.
|
51177 | * @param options.stretchX `[[x1, x2], ...]` If `icon-text-fit` is used in a layer with this image, this option defines the part(s) of the image that can be stretched horizontally.
|
51178 | * @param options.stretchY `[[y1, y2], ...]` If `icon-text-fit` is used in a layer with this image, this option defines the part(s) of the image that can be stretched vertically.
|
51179 | *
|
51180 | * @example
|
51181 | * // If the style's sprite does not already contain an image with ID 'cat',
|
51182 | * // add the image 'cat-icon.png' to the style's sprite with the ID 'cat'.
|
51183 | * map.loadImage('https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Cat_silhouette.svg/400px-Cat_silhouette.svg.png', function(error, image) {
|
51184 | * if (error) throw error;
|
51185 | * if (!map.hasImage('cat')) map.addImage('cat', image);
|
51186 | * });
|
51187 | *
|
51188 | *
|
51189 | * // Add a stretchable image that can be used with `icon-text-fit`
|
51190 | * // In this example, the image is 600px wide by 400px high.
|
51191 | * map.loadImage('https://upload.wikimedia.org/wikipedia/commons/8/89/Black_and_White_Boxed_%28bordered%29.png', function(error, image) {
|
51192 | * if (error) throw error;
|
51193 | * if (!map.hasImage('border-image')) {
|
51194 | * map.addImage('border-image', image, {
|
51195 | * content: [16, 16, 300, 384], // place text over left half of image, avoiding the 16px border
|
51196 | * stretchX: [[16, 584]], // stretch everything horizontally except the 16px border
|
51197 | * stretchY: [[16, 384]], // stretch everything vertically except the 16px border
|
51198 | * });
|
51199 | * }
|
51200 | * });
|
51201 | *
|
51202 | *
|
51203 | * @see Use `HTMLImageElement`: [Add an icon to the map](https://maplibre.org/maplibre-gl-js-docs/example/add-image/)
|
51204 | * @see Use `ImageData`: [Add a generated icon to the map](https://maplibre.org/maplibre-gl-js-docs/example/add-image-generated/)
|
51205 | */
|
51206 | addImage(id, image, { pixelRatio = 1, sdf = false, stretchX, stretchY, content } = {}) {
|
51207 | this._lazyInitEmptyStyle();
|
51208 | const version = 0;
|
51209 | if (image instanceof HTMLImageElement || performance.isImageBitmap(image)) {
|
51210 | const { width, height, data } = performance.exported.getImageData(image);
|
51211 | this.style.addImage(id, { data: new performance.RGBAImage({ width, height }, data), pixelRatio, stretchX, stretchY, content, sdf, version });
|
51212 | }
|
51213 | else if (image.width === undefined || image.height === undefined) {
|
51214 | return this.fire(new performance.ErrorEvent(new Error('Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, ' +
|
51215 | 'or object with `width`, `height`, and `data` properties with the same format as `ImageData`')));
|
51216 | }
|
51217 | else {
|
51218 | const { width, height, data } = image;
|
51219 | const userImage = image;
|
51220 | this.style.addImage(id, {
|
51221 | data: new performance.RGBAImage({ width, height }, new Uint8Array(data)),
|
51222 | pixelRatio,
|
51223 | stretchX,
|
51224 | stretchY,
|
51225 | content,
|
51226 | sdf,
|
51227 | version,
|
51228 | userImage
|
51229 | });
|
51230 | if (userImage.onAdd) {
|
51231 | userImage.onAdd(this, id);
|
51232 | }
|
51233 | }
|
51234 | }
|
51235 | // eslint-disable-next-line jsdoc/require-returns
|
51236 | /**
|
51237 | * Update an existing image in a style. This image can be displayed on the map like any other icon in the style's
|
51238 | * sprite using the image's ID with
|
51239 | * [`icon-image`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layout-symbol-icon-image),
|
51240 | * [`background-pattern`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#paint-background-background-pattern),
|
51241 | * [`fill-pattern`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#paint-fill-fill-pattern),
|
51242 | * or [`line-pattern`](https://maplibre.org/maplibre-gl-js-docs/style-spec/#paint-line-line-pattern).
|
51243 | *
|
51244 | * @param id The ID of the image.
|
51245 | * @param image The image as an `HTMLImageElement`, `ImageData`, `ImageBitmap` or object with `width`, `height`, and `data`
|
51246 | * properties with the same format as `ImageData`.
|
51247 | *
|
51248 | * @example
|
51249 | * // If an image with the ID 'cat' already exists in the style's sprite,
|
51250 | * // replace that image with a new image, 'other-cat-icon.png'.
|
51251 | * if (map.hasImage('cat')) map.updateImage('cat', './other-cat-icon.png');
|
51252 | */
|
51253 | updateImage(id, image) {
|
51254 | const existingImage = this.style.getImage(id);
|
51255 | if (!existingImage) {
|
51256 | return this.fire(new performance.ErrorEvent(new Error('The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.')));
|
51257 | }
|
51258 | const imageData = (image instanceof HTMLImageElement || performance.isImageBitmap(image)) ?
|
51259 | performance.exported.getImageData(image) :
|
51260 | image;
|
51261 | const { width, height, data } = imageData;
|
51262 | if (width === undefined || height === undefined) {
|
51263 | return this.fire(new performance.ErrorEvent(new Error('Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, ' +
|
51264 | 'or object with `width`, `height`, and `data` properties with the same format as `ImageData`')));
|
51265 | }
|
51266 | if (width !== existingImage.data.width || height !== existingImage.data.height) {
|
51267 | return this.fire(new performance.ErrorEvent(new Error('The width and height of the updated image must be that same as the previous version of the image')));
|
51268 | }
|
51269 | const copy = !(image instanceof HTMLImageElement || performance.isImageBitmap(image));
|
51270 | existingImage.data.replace(data, copy);
|
51271 | this.style.updateImage(id, existingImage);
|
51272 | }
|
51273 | /**
|
51274 | * Check whether or not an image with a specific ID exists in the style. This checks both images
|
51275 | * in the style's original sprite and any images
|
51276 | * that have been added at runtime using {@link Map#addImage}.
|
51277 | *
|
51278 | * @param id The ID of the image.
|
51279 | *
|
51280 | * @returns {boolean} A Boolean indicating whether the image exists.
|
51281 | * @example
|
51282 | * // Check if an image with the ID 'cat' exists in
|
51283 | * // the style's sprite.
|
51284 | * var catIconExists = map.hasImage('cat');
|
51285 | */
|
51286 | hasImage(id) {
|
51287 | if (!id) {
|
51288 | this.fire(new performance.ErrorEvent(new Error('Missing required image id')));
|
51289 | return false;
|
51290 | }
|
51291 | return !!this.style.getImage(id);
|
51292 | }
|
51293 | /**
|
51294 | * Remove an image from a style. This can be an image from the style's original
|
51295 | * sprite or any images
|
51296 | * that have been added at runtime using {@link Map#addImage}.
|
51297 | *
|
51298 | * @param id The ID of the image.
|
51299 | *
|
51300 | * @example
|
51301 | * // If an image with the ID 'cat' exists in
|
51302 | * // the style's sprite, remove it.
|
51303 | * if (map.hasImage('cat')) map.removeImage('cat');
|
51304 | */
|
51305 | removeImage(id) {
|
51306 | this.style.removeImage(id);
|
51307 | }
|
51308 | /**
|
51309 | * Load an image from an external URL to be used with {@link Map#addImage}. External
|
51310 | * domains must support [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS).
|
51311 | *
|
51312 | * @param {string} url The URL of the image file. Image file must be in png, webp, or jpg format.
|
51313 | * @param {Callback<HTMLImageElement | ImageBitmap>} callback Expecting `callback(error, data)`. Called when the image has loaded or with an error argument if there is an error.
|
51314 | *
|
51315 | * @example
|
51316 | * // Load an image from an external URL.
|
51317 | * map.loadImage('http://placekitten.com/50/50', function(error, image) {
|
51318 | * if (error) throw error;
|
51319 | * // Add the loaded image to the style's sprite with the ID 'kitten'.
|
51320 | * map.addImage('kitten', image);
|
51321 | * });
|
51322 | *
|
51323 | * @see [Add an icon to the map](https://maplibre.org/maplibre-gl-js-docs/example/add-image/)
|
51324 | */
|
51325 | loadImage(url, callback) {
|
51326 | performance.getImage(this._requestManager.transformRequest(url, performance.ResourceType.Image), callback);
|
51327 | }
|
51328 | /**
|
51329 | * Returns an Array of strings containing the IDs of all images currently available in the map.
|
51330 | * This includes both images from the style's original sprite
|
51331 | * and any images that have been added at runtime using {@link Map#addImage}.
|
51332 | *
|
51333 | * @returns {Array<string>} An Array of strings containing the names of all sprites/images currently available in the map.
|
51334 | *
|
51335 | * @example
|
51336 | * var allImages = map.listImages();
|
51337 | *
|
51338 | */
|
51339 | listImages() {
|
51340 | return this.style.listImages();
|
51341 | }
|
51342 | /**
|
51343 | * Adds a [MapLibre style layer](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layers)
|
51344 | * to the map's style.
|
51345 | *
|
51346 | * A layer defines how data from a specified source will be styled. Read more about layer types
|
51347 | * and available paint and layout properties in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layers).
|
51348 | *
|
51349 | * @param {Object | CustomLayerInterface} layer The layer to add, conforming to either the MapLibre Style Specification's [layer definition](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layers) or, less commonly, the {@link CustomLayerInterface} specification.
|
51350 | * The MapLibre Style Specification's layer definition is appropriate for most layers.
|
51351 | *
|
51352 | * @param {string} layer.id A unique identifer that you define.
|
51353 | * @param {string} layer.type The type of layer (for example `fill` or `symbol`).
|
51354 | * A list of layer types is available in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#type).
|
51355 | *
|
51356 | * (This can also be `custom`. For more information, see {@link CustomLayerInterface}.)
|
51357 | * @param {string | Object} [layer.source] The data source for the layer.
|
51358 | * Reference a source that has _already been defined_ using the source's unique id.
|
51359 | * Reference a _new source_ using a source object (as defined in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/sources/)) directly.
|
51360 | * This is **required** for all `layer.type` options _except_ for `custom`.
|
51361 | * @param {string} [layer.sourceLayer] (optional) The name of the source layer within the specified `layer.source` to use for this style layer.
|
51362 | * This is only applicable for vector tile sources and is **required** when `layer.source` is of the type `vector`.
|
51363 | * @param {array} [layer.filter] (optional) An expression specifying conditions on source features.
|
51364 | * Only features that match the filter are displayed.
|
51365 | * The MapLibre Style Specification includes more information on the limitations of the [`filter`](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#filter) parameter
|
51366 | * and a complete list of available [expressions](https://maplibre.org/maplibre-gl-js-docs/style-spec/expressions/).
|
51367 | * If no filter is provided, all features in the source (or source layer for vector tilesets) will be displayed.
|
51368 | * @param {Object} [layer.paint] (optional) Paint properties for the layer.
|
51369 | * Available paint properties vary by `layer.type`.
|
51370 | * A full list of paint properties for each layer type is available in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/).
|
51371 | * If no paint properties are specified, default values will be used.
|
51372 | * @param {Object} [layer.layout] (optional) Layout properties for the layer.
|
51373 | * Available layout properties vary by `layer.type`.
|
51374 | * A full list of layout properties for each layer type is available in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/).
|
51375 | * If no layout properties are specified, default values will be used.
|
51376 | * @param {number} [layer.maxzoom] (optional) The maximum zoom level for the layer.
|
51377 | * At zoom levels equal to or greater than the maxzoom, the layer will be hidden.
|
51378 | * The value can be any number between `0` and `24` (inclusive).
|
51379 | * If no maxzoom is provided, the layer will be visible at all zoom levels for which there are tiles available.
|
51380 | * @param {number} [layer.minzoom] (optional) The minimum zoom level for the layer.
|
51381 | * At zoom levels less than the minzoom, the layer will be hidden.
|
51382 | * The value can be any number between `0` and `24` (inclusive).
|
51383 | * If no minzoom is provided, the layer will be visible at all zoom levels for which there are tiles available.
|
51384 | * @param {Object} [layer.metadata] (optional) Arbitrary properties useful to track with the layer, but do not influence rendering.
|
51385 | * @param {string} [layer.renderingMode] This is only applicable for layers with the type `custom`.
|
51386 | * See {@link CustomLayerInterface} for more information.
|
51387 | * @param {string} [beforeId] The ID of an existing layer to insert the new layer before,
|
51388 | * resulting in the new layer appearing visually beneath the existing layer.
|
51389 | * If this argument is not specified, the layer will be appended to the end of the layers array
|
51390 | * and appear visually above all other layers.
|
51391 | *
|
51392 | * @returns {Map} `this`
|
51393 | *
|
51394 | * @example
|
51395 | * // Add a circle layer with a vector source
|
51396 | * map.addLayer({
|
51397 | * id: 'points-of-interest',
|
51398 | * source: {
|
51399 | * type: 'vector',
|
51400 | * url: 'https://demotiles.maplibre.org/tiles/tiles.json'
|
51401 | * },
|
51402 | * 'source-layer': 'poi_label',
|
51403 | * type: 'circle',
|
51404 | * paint: {
|
51405 | * // MapLibre Style Specification paint properties
|
51406 | * },
|
51407 | * layout: {
|
51408 | * // MapLibre Style Specification layout properties
|
51409 | * }
|
51410 | * });
|
51411 | *
|
51412 | * @example
|
51413 | * // Define a source before using it to create a new layer
|
51414 | * map.addSource('state-data', {
|
51415 | * type: 'geojson',
|
51416 | * data: 'path/to/data.geojson'
|
51417 | * });
|
51418 | *
|
51419 | * map.addLayer({
|
51420 | * id: 'states',
|
51421 | * // References the GeoJSON source defined above
|
51422 | * // and does not require a `source-layer`
|
51423 | * source: 'state-data',
|
51424 | * type: 'symbol',
|
51425 | * layout: {
|
51426 | * // Set the label content to the
|
51427 | * // feature's `name` property
|
51428 | * text-field: ['get', 'name']
|
51429 | * }
|
51430 | * });
|
51431 | *
|
51432 | * @example
|
51433 | * // Add a new symbol layer before an existing layer
|
51434 | * map.addLayer({
|
51435 | * id: 'states',
|
51436 | * // References a source that's already been defined
|
51437 | * source: 'state-data',
|
51438 | * type: 'symbol',
|
51439 | * layout: {
|
51440 | * // Set the label content to the
|
51441 | * // feature's `name` property
|
51442 | * text-field: ['get', 'name']
|
51443 | * }
|
51444 | * // Add the layer before the existing `cities` layer
|
51445 | * }, 'cities');
|
51446 | *
|
51447 | * @see [Create and style clusters](https://maplibre.org/maplibre-gl-js-docs/example/cluster/)
|
51448 | * @see [Add a vector tile source](https://maplibre.org/maplibre-gl-js-docs/example/vector-source/)
|
51449 | * @see [Add a WMS source](https://maplibre.org/maplibre-gl-js-docs/example/wms/)
|
51450 | */
|
51451 | addLayer(layer, beforeId) {
|
51452 | this._lazyInitEmptyStyle();
|
51453 | this.style.addLayer(layer, beforeId);
|
51454 | return this._update(true);
|
51455 | }
|
51456 | /**
|
51457 | * Moves a layer to a different z-position.
|
51458 | *
|
51459 | * @param {string} id The ID of the layer to move.
|
51460 | * @param {string} [beforeId] The ID of an existing layer to insert the new layer before. When viewing the map, the `id` layer will appear beneath the `beforeId` layer. If `beforeId` is omitted, the layer will be appended to the end of the layers array and appear above all other layers on the map.
|
51461 | * @returns {Map} `this`
|
51462 | *
|
51463 | * @example
|
51464 | * // Move a layer with ID 'polygon' before the layer with ID 'country-label'. The `polygon` layer will appear beneath the `country-label` layer on the map.
|
51465 | * map.moveLayer('polygon', 'country-label');
|
51466 | */
|
51467 | moveLayer(id, beforeId) {
|
51468 | this.style.moveLayer(id, beforeId);
|
51469 | return this._update(true);
|
51470 | }
|
51471 | // eslint-disable-next-line jsdoc/require-returns
|
51472 | /**
|
51473 | * Removes the layer with the given ID from the map's style.
|
51474 | *
|
51475 | * If no such layer exists, an `error` event is fired.
|
51476 | *
|
51477 | * @param {string} id id of the layer to remove
|
51478 | * @fires error
|
51479 | *
|
51480 | * @example
|
51481 | * // If a layer with ID 'state-data' exists, remove it.
|
51482 | * if (map.getLayer('state-data')) map.removeLayer('state-data');
|
51483 | */
|
51484 | removeLayer(id) {
|
51485 | this.style.removeLayer(id);
|
51486 | return this._update(true);
|
51487 | }
|
51488 | /**
|
51489 | * Returns the layer with the specified ID in the map's style.
|
51490 | *
|
51491 | * @param {string} id The ID of the layer to get.
|
51492 | * @returns {StyleLayer} The layer with the specified ID, or `undefined`
|
51493 | * if the ID corresponds to no existing layers.
|
51494 | *
|
51495 | * @example
|
51496 | * var stateDataLayer = map.getLayer('state-data');
|
51497 | *
|
51498 | * @see [Filter symbols by toggling a list](https://maplibre.org/maplibre-gl-js-docs/example/filter-markers/)
|
51499 | * @see [Filter symbols by text input](https://maplibre.org/maplibre-gl-js-docs/example/filter-markers-by-input/)
|
51500 | */
|
51501 | getLayer(id) {
|
51502 | return this.style.getLayer(id);
|
51503 | }
|
51504 | /**
|
51505 | * Sets the zoom extent for the specified style layer. The zoom extent includes the
|
51506 | * [minimum zoom level](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layer-minzoom)
|
51507 | * and [maximum zoom level](https://maplibre.org/maplibre-gl-js-docs/style-spec/#layer-maxzoom))
|
51508 | * at which the layer will be rendered.
|
51509 | *
|
51510 | * Note: For style layers using vector sources, style layers cannot be rendered at zoom levels lower than the
|
51511 | * minimum zoom level of the _source layer_ because the data does not exist at those zoom levels. If the minimum
|
51512 | * zoom level of the source layer is higher than the minimum zoom level defined in the style layer, the style
|
51513 | * layer will not be rendered at all zoom levels in the zoom range.
|
51514 | *
|
51515 | * @param {string} layerId The ID of the layer to which the zoom extent will be applied.
|
51516 | * @param {number} minzoom The minimum zoom to set (0-24).
|
51517 | * @param {number} maxzoom The maximum zoom to set (0-24).
|
51518 | * @returns {Map} `this`
|
51519 | *
|
51520 | * @example
|
51521 | * map.setLayerZoomRange('my-layer', 2, 5);
|
51522 | *
|
51523 | */
|
51524 | setLayerZoomRange(layerId, minzoom, maxzoom) {
|
51525 | this.style.setLayerZoomRange(layerId, minzoom, maxzoom);
|
51526 | return this._update(true);
|
51527 | }
|
51528 | /**
|
51529 | * Sets the filter for the specified style layer.
|
51530 | *
|
51531 | * Filters control which features a style layer renders from its source.
|
51532 | * Any feature for which the filter expression evaluates to `true` will be
|
51533 | * rendered on the map. Those that are false will be hidden.
|
51534 | *
|
51535 | * Use `setFilter` to show a subset of your source data.
|
51536 | *
|
51537 | * To clear the filter, pass `null` or `undefined` as the second parameter.
|
51538 | *
|
51539 | * @param {string} layerId The ID of the layer to which the filter will be applied.
|
51540 | * @param {Array | null | undefined} filter The filter, conforming to the MapLibre Style Specification's
|
51541 | * [filter definition](https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#filter). If `null` or `undefined` is provided, the function removes any existing filter from the layer.
|
51542 | * @param {Object} [options] Options object.
|
51543 | * @param {boolean} [options.validate=true] Whether to check if the filter conforms to the MapLibre GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
|
51544 | * @returns {Map} `this`
|
51545 | *
|
51546 | * @example
|
51547 | * // display only features with the 'name' property 'USA'
|
51548 | * map.setFilter('my-layer', ['==', ['get', 'name'], 'USA']);
|
51549 | * @example
|
51550 | * // display only features with five or more 'available-spots'
|
51551 | * map.setFilter('bike-docks', ['>=', ['get', 'available-spots'], 5]);
|
51552 | * @example
|
51553 | * // remove the filter for the 'bike-docks' style layer
|
51554 | * map.setFilter('bike-docks', null);
|
51555 | *
|
51556 | * @see [Create a timeline animation](https://maplibre.org/maplibre-gl-js-docs/example/timeline-animation/)
|
51557 | */
|
51558 | setFilter(layerId, filter, options = {}) {
|
51559 | this.style.setFilter(layerId, filter, options);
|
51560 | return this._update(true);
|
51561 | }
|
51562 | /**
|
51563 | * Returns the filter applied to the specified style layer.
|
51564 | *
|
51565 | * @param {string} layerId The ID of the style layer whose filter to get.
|
51566 | * @returns {Array} The layer's filter.
|
51567 | */
|
51568 | getFilter(layerId) {
|
51569 | return this.style.getFilter(layerId);
|
51570 | }
|
51571 | /**
|
51572 | * Sets the value of a paint property in the specified style layer.
|
51573 | *
|
51574 | * @param {string} layerId The ID of the layer to set the paint property in.
|
51575 | * @param {string} name The name of the paint property to set.
|
51576 | * @param {*} value The value of the paint property to set.
|
51577 | * Must be of a type appropriate for the property, as defined in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/).
|
51578 | * @param {Object} [options] Options object.
|
51579 | * @param {boolean} [options.validate=true] Whether to check if `value` conforms to the MapLibre GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
|
51580 | * @returns {Map} `this`
|
51581 | * @example
|
51582 | * map.setPaintProperty('my-layer', 'fill-color', '#faafee');
|
51583 | * @see [Change a layer's color with buttons](https://maplibre.org/maplibre-gl-js-docs/example/color-switcher/)
|
51584 | * @see [Create a draggable point](https://maplibre.org/maplibre-gl-js-docs/example/drag-a-point/)
|
51585 | */
|
51586 | setPaintProperty(layerId, name, value, options = {}) {
|
51587 | this.style.setPaintProperty(layerId, name, value, options);
|
51588 | return this._update(true);
|
51589 | }
|
51590 | /**
|
51591 | * Returns the value of a paint property in the specified style layer.
|
51592 | *
|
51593 | * @param {string} layerId The ID of the layer to get the paint property from.
|
51594 | * @param {string} name The name of a paint property to get.
|
51595 | * @returns {*} The value of the specified paint property.
|
51596 | */
|
51597 | getPaintProperty(layerId, name) {
|
51598 | return this.style.getPaintProperty(layerId, name);
|
51599 | }
|
51600 | /**
|
51601 | * Sets the value of a layout property in the specified style layer.
|
51602 | *
|
51603 | * @param {string} layerId The ID of the layer to set the layout property in.
|
51604 | * @param {string} name The name of the layout property to set.
|
51605 | * @param {*} value The value of the layout property. Must be of a type appropriate for the property, as defined in the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/).
|
51606 | * @param {Object} [options] Options object.
|
51607 | * @param {boolean} [options.validate=true] Whether to check if `value` conforms to the MapLibre GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
|
51608 | * @returns {Map} `this`
|
51609 | * @example
|
51610 | * map.setLayoutProperty('my-layer', 'visibility', 'none');
|
51611 | */
|
51612 | setLayoutProperty(layerId, name, value, options = {}) {
|
51613 | this.style.setLayoutProperty(layerId, name, value, options);
|
51614 | return this._update(true);
|
51615 | }
|
51616 | /**
|
51617 | * Returns the value of a layout property in the specified style layer.
|
51618 | *
|
51619 | * @param {string} layerId The ID of the layer to get the layout property from.
|
51620 | * @param {string} name The name of the layout property to get.
|
51621 | * @returns {*} The value of the specified layout property.
|
51622 | */
|
51623 | getLayoutProperty(layerId, name) {
|
51624 | return this.style.getLayoutProperty(layerId, name);
|
51625 | }
|
51626 | /**
|
51627 | * Sets the any combination of light values.
|
51628 | *
|
51629 | * @param light Light properties to set. Must conform to the [MapLibre Style Specification](https://maplibre.org/maplibre-gl-js-docs/style-spec/#light).
|
51630 | * @param {Object} [options] Options object.
|
51631 | * @param {boolean} [options.validate=true] Whether to check if the filter conforms to the MapLibre GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
|
51632 | * @returns {Map} `this`
|
51633 | * @example
|
51634 | * var layerVisibility = map.getLayoutProperty('my-layer', 'visibility');
|
51635 | */
|
51636 | setLight(light, options = {}) {
|
51637 | this._lazyInitEmptyStyle();
|
51638 | this.style.setLight(light, options);
|
51639 | return this._update(true);
|
51640 | }
|
51641 | /**
|
51642 | * Returns the value of the light object.
|
51643 | *
|
51644 | * @returns {Object} light Light properties of the style.
|
51645 | */
|
51646 | getLight() {
|
51647 | return this.style.getLight();
|
51648 | }
|
51649 | // eslint-disable-next-line jsdoc/require-returns
|
51650 | /**
|
51651 | * Sets the `state` of a feature.
|
51652 | * A feature's `state` is a set of user-defined key-value pairs that are assigned to a feature at runtime.
|
51653 | * When using this method, the `state` object is merged with any existing key-value pairs in the feature's state.
|
51654 | * Features are identified by their `feature.id` attribute, which can be any number or string.
|
51655 | *
|
51656 | * This method can only be used with sources that have a `feature.id` attribute. The `feature.id` attribute can be defined in three ways:
|
51657 | * - For vector or GeoJSON sources, including an `id` attribute in the original data file.
|
51658 | * - For vector or GeoJSON sources, using the [`promoteId`](https://maplibre.org/maplibre-gl-js-docs/style-spec/sources/#vector-promoteId) option at the time the source is defined.
|
51659 | * - For GeoJSON sources, using the [`generateId`](https://maplibre.org/maplibre-gl-js-docs/style-spec/sources/#geojson-generateId) option to auto-assign an `id` based on the feature's index in the source data. If you change feature data using `map.getSource('some id').setData(..)`, you may need to re-apply state taking into account updated `id` values.
|
51660 | *
|
51661 | * _Note: You can use the [`feature-state` expression](https://maplibre.org/maplibre-gl-js-docs/style-spec/expressions/#feature-state) to access the values in a feature's state object for the purposes of styling._
|
51662 | *
|
51663 | * @param {Object} feature Feature identifier. Feature objects returned from
|
51664 | * {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers.
|
51665 | * @param {string | number} feature.id Unique id of the feature.
|
51666 | * @param {string} feature.source The id of the vector or GeoJSON source for the feature.
|
51667 | * @param {string} [feature.sourceLayer] (optional) *For vector tile sources, `sourceLayer` is required.*
|
51668 | * @param {Object} state A set of key-value pairs. The values should be valid JSON types.
|
51669 | *
|
51670 | * @example
|
51671 | * // When the mouse moves over the `my-layer` layer, update
|
51672 | * // the feature state for the feature under the mouse
|
51673 | * map.on('mousemove', 'my-layer', function(e) {
|
51674 | * if (e.features.length > 0) {
|
51675 | * map.setFeatureState({
|
51676 | * source: 'my-source',
|
51677 | * sourceLayer: 'my-source-layer',
|
51678 | * id: e.features[0].id,
|
51679 | * }, {
|
51680 | * hover: true
|
51681 | * });
|
51682 | * }
|
51683 | * });
|
51684 | *
|
51685 | * @see [Create a hover effect](https://maplibre.org/maplibre-gl-js-docs/example/hover-styles/)
|
51686 | */
|
51687 | setFeatureState(feature, state) {
|
51688 | this.style.setFeatureState(feature, state);
|
51689 | return this._update();
|
51690 | }
|
51691 | // eslint-disable-next-line jsdoc/require-returns
|
51692 | /**
|
51693 | * Removes the `state` of a feature, setting it back to the default behavior.
|
51694 | * If only a `target.source` is specified, it will remove the state for all features from that source.
|
51695 | * If `target.id` is also specified, it will remove all keys for that feature's state.
|
51696 | * If `key` is also specified, it removes only that key from that feature's state.
|
51697 | * Features are identified by their `feature.id` attribute, which can be any number or string.
|
51698 | *
|
51699 | * @param {Object} target Identifier of where to remove state. It can be a source, a feature, or a specific key of feature.
|
51700 | * Feature objects returned from {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers.
|
51701 | * @param {string | number} target.id (optional) Unique id of the feature. Optional if key is not specified.
|
51702 | * @param {string} target.source The id of the vector or GeoJSON source for the feature.
|
51703 | * @param {string} [target.sourceLayer] (optional) *For vector tile sources, `sourceLayer` is required.*
|
51704 | * @param {string} key (optional) The key in the feature state to reset.
|
51705 | *
|
51706 | * @example
|
51707 | * // Reset the entire state object for all features
|
51708 | * // in the `my-source` source
|
51709 | * map.removeFeatureState({
|
51710 | * source: 'my-source'
|
51711 | * });
|
51712 | *
|
51713 | * @example
|
51714 | * // When the mouse leaves the `my-layer` layer,
|
51715 | * // reset the entire state object for the
|
51716 | * // feature under the mouse
|
51717 | * map.on('mouseleave', 'my-layer', function(e) {
|
51718 | * map.removeFeatureState({
|
51719 | * source: 'my-source',
|
51720 | * sourceLayer: 'my-source-layer',
|
51721 | * id: e.features[0].id
|
51722 | * });
|
51723 | * });
|
51724 | *
|
51725 | * @example
|
51726 | * // When the mouse leaves the `my-layer` layer,
|
51727 | * // reset only the `hover` key-value pair in the
|
51728 | * // state for the feature under the mouse
|
51729 | * map.on('mouseleave', 'my-layer', function(e) {
|
51730 | * map.removeFeatureState({
|
51731 | * source: 'my-source',
|
51732 | * sourceLayer: 'my-source-layer',
|
51733 | * id: e.features[0].id
|
51734 | * }, 'hover');
|
51735 | * });
|
51736 | *
|
51737 | */
|
51738 | removeFeatureState(target, key) {
|
51739 | this.style.removeFeatureState(target, key);
|
51740 | return this._update();
|
51741 | }
|
51742 | /**
|
51743 | * Gets the `state` of a feature.
|
51744 | * A feature's `state` is a set of user-defined key-value pairs that are assigned to a feature at runtime.
|
51745 | * Features are identified by their `feature.id` attribute, which can be any number or string.
|
51746 | *
|
51747 | * _Note: To access the values in a feature's state object for the purposes of styling the feature, use the [`feature-state` expression](https://maplibre.org/maplibre-gl-js-docs/style-spec/expressions/#feature-state)._
|
51748 | *
|
51749 | * @param {Object} feature Feature identifier. Feature objects returned from
|
51750 | * {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers.
|
51751 | * @param {string | number} feature.id Unique id of the feature.
|
51752 | * @param {string} feature.source The id of the vector or GeoJSON source for the feature.
|
51753 | * @param {string} [feature.sourceLayer] (optional) *For vector tile sources, `sourceLayer` is required.*
|
51754 | *
|
51755 | * @returns {Object} The state of the feature: a set of key-value pairs that was assigned to the feature at runtime.
|
51756 | *
|
51757 | * @example
|
51758 | * // When the mouse moves over the `my-layer` layer,
|
51759 | * // get the feature state for the feature under the mouse
|
51760 | * map.on('mousemove', 'my-layer', function(e) {
|
51761 | * if (e.features.length > 0) {
|
51762 | * map.getFeatureState({
|
51763 | * source: 'my-source',
|
51764 | * sourceLayer: 'my-source-layer',
|
51765 | * id: e.features[0].id
|
51766 | * });
|
51767 | * }
|
51768 | * });
|
51769 | *
|
51770 | */
|
51771 | getFeatureState(feature) {
|
51772 | return this.style.getFeatureState(feature);
|
51773 | }
|
51774 | /**
|
51775 | * Returns the map's containing HTML element.
|
51776 | *
|
51777 | * @returns {HTMLElement} The map's container.
|
51778 | */
|
51779 | getContainer() {
|
51780 | return this._container;
|
51781 | }
|
51782 | /**
|
51783 | * Returns the HTML element containing the map's `<canvas>` element.
|
51784 | *
|
51785 | * If you want to add non-GL overlays to the map, you should append them to this element.
|
51786 | *
|
51787 | * This is the element to which event bindings for map interactivity (such as panning and zooming) are
|
51788 | * attached. It will receive bubbled events from child elements such as the `<canvas>`, but not from
|
51789 | * map controls.
|
51790 | *
|
51791 | * @returns {HTMLElement} The container of the map's `<canvas>`.
|
51792 | * @see [Create a draggable point](https://maplibre.org/maplibre-gl-js-docs/example/drag-a-point/)
|
51793 | */
|
51794 | getCanvasContainer() {
|
51795 | return this._canvasContainer;
|
51796 | }
|
51797 | /**
|
51798 | * Returns the map's `<canvas>` element.
|
51799 | *
|
51800 | * @returns {HTMLCanvasElement} The map's `<canvas>` element.
|
51801 | * @see [Measure distances](https://maplibre.org/maplibre-gl-js-docs/example/measure/)
|
51802 | * @see [Display a popup on hover](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-hover/)
|
51803 | * @see [Center the map on a clicked symbol](https://maplibre.org/maplibre-gl-js-docs/example/center-on-symbol/)
|
51804 | */
|
51805 | getCanvas() {
|
51806 | return this._canvas;
|
51807 | }
|
51808 | _containerDimensions() {
|
51809 | let width = 0;
|
51810 | let height = 0;
|
51811 | if (this._container) {
|
51812 | width = this._container.clientWidth || 400;
|
51813 | height = this._container.clientHeight || 300;
|
51814 | }
|
51815 | return [width, height];
|
51816 | }
|
51817 | _setupContainer() {
|
51818 | const container = this._container;
|
51819 | container.classList.add('maplibregl-map', 'mapboxgl-map');
|
51820 | const canvasContainer = this._canvasContainer = DOM.create('div', 'maplibregl-canvas-container mapboxgl-canvas-container', container);
|
51821 | if (this._interactive) {
|
51822 | canvasContainer.classList.add('maplibregl-interactive', 'mapboxgl-interactive');
|
51823 | }
|
51824 | this._canvas = DOM.create('canvas', 'maplibregl-canvas mapboxgl-canvas', canvasContainer);
|
51825 | this._canvas.addEventListener('webglcontextlost', this._contextLost, false);
|
51826 | this._canvas.addEventListener('webglcontextrestored', this._contextRestored, false);
|
51827 | this._canvas.setAttribute('tabindex', '0');
|
51828 | this._canvas.setAttribute('aria-label', 'Map');
|
51829 | this._canvas.setAttribute('role', 'region');
|
51830 | const dimensions = this._containerDimensions();
|
51831 | this._resizeCanvas(dimensions[0], dimensions[1], this.getPixelRatio());
|
51832 | const controlContainer = this._controlContainer = DOM.create('div', 'maplibregl-control-container mapboxgl-control-container', container);
|
51833 | const positions = this._controlPositions = {};
|
51834 | ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach((positionName) => {
|
51835 | positions[positionName] = DOM.create('div', `maplibregl-ctrl-${positionName} mapboxgl-ctrl-${positionName}`, controlContainer);
|
51836 | });
|
51837 | this._container.addEventListener('scroll', this._onMapScroll, false);
|
51838 | }
|
51839 | _resizeCanvas(width, height, pixelRatio) {
|
51840 | // Request the required canvas size taking the pixelratio into account.
|
51841 | this._canvas.width = pixelRatio * width;
|
51842 | this._canvas.height = pixelRatio * height;
|
51843 | // Maintain the same canvas size, potentially downscaling it for HiDPI displays
|
51844 | this._canvas.style.width = `${width}px`;
|
51845 | this._canvas.style.height = `${height}px`;
|
51846 | }
|
51847 | _setupPainter() {
|
51848 | const attributes = performance.extend({}, supported.webGLContextAttributes, {
|
51849 | failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat,
|
51850 | preserveDrawingBuffer: this._preserveDrawingBuffer,
|
51851 | antialias: this._antialias || false
|
51852 | });
|
51853 | const gl = this._canvas.getContext('webgl', attributes) ||
|
51854 | this._canvas.getContext('experimental-webgl', attributes);
|
51855 | if (!gl) {
|
51856 | this.fire(new performance.ErrorEvent(new Error('Failed to initialize WebGL')));
|
51857 | return;
|
51858 | }
|
51859 | this.painter = new Painter(gl, this.transform);
|
51860 | performance.exported$1.testSupport(gl);
|
51861 | }
|
51862 | _contextLost(event) {
|
51863 | event.preventDefault();
|
51864 | if (this._frame) {
|
51865 | this._frame.cancel();
|
51866 | this._frame = null;
|
51867 | }
|
51868 | this.fire(new performance.Event('webglcontextlost', { originalEvent: event }));
|
51869 | }
|
51870 | _contextRestored(event) {
|
51871 | this._setupPainter();
|
51872 | this.resize();
|
51873 | this._update();
|
51874 | this.fire(new performance.Event('webglcontextrestored', { originalEvent: event }));
|
51875 | }
|
51876 | _onMapScroll(event) {
|
51877 | if (event.target !== this._container)
|
51878 | return;
|
51879 | // Revert any scroll which would move the canvas outside of the view
|
51880 | this._container.scrollTop = 0;
|
51881 | this._container.scrollLeft = 0;
|
51882 | return false;
|
51883 | }
|
51884 | /**
|
51885 | * Returns a Boolean indicating whether the map is fully loaded.
|
51886 | *
|
51887 | * Returns `false` if the style is not yet fully loaded,
|
51888 | * or if there has been a change to the sources or style that
|
51889 | * has not yet fully loaded.
|
51890 | *
|
51891 | * @returns {boolean} A Boolean indicating whether the map is fully loaded.
|
51892 | */
|
51893 | loaded() {
|
51894 | return !this._styleDirty && !this._sourcesDirty && !!this.style && this.style.loaded();
|
51895 | }
|
51896 | /**
|
51897 | * Update this map's style and sources, and re-render the map.
|
51898 | *
|
51899 | * @param {boolean} updateStyle mark the map's style for reprocessing as
|
51900 | * well as its sources
|
51901 | * @returns {Map} this
|
51902 | * @private
|
51903 | */
|
51904 | _update(updateStyle) {
|
51905 | if (!this.style)
|
51906 | return this;
|
51907 | this._styleDirty = this._styleDirty || updateStyle;
|
51908 | this._sourcesDirty = true;
|
51909 | this.triggerRepaint();
|
51910 | return this;
|
51911 | }
|
51912 | /**
|
51913 | * Request that the given callback be executed during the next render
|
51914 | * frame. Schedule a render frame if one is not already scheduled.
|
51915 | * @returns An id that can be used to cancel the callback
|
51916 | * @private
|
51917 | */
|
51918 | _requestRenderFrame(callback) {
|
51919 | this._update();
|
51920 | return this._renderTaskQueue.add(callback);
|
51921 | }
|
51922 | _cancelRenderFrame(id) {
|
51923 | this._renderTaskQueue.remove(id);
|
51924 | }
|
51925 | /**
|
51926 | * Call when a (re-)render of the map is required:
|
51927 | * - The style has changed (`setPaintProperty()`, etc.)
|
51928 | * - Source data has changed (e.g. tiles have finished loading)
|
51929 | * - The map has is moving (or just finished moving)
|
51930 | * - A transition is in progress
|
51931 | *
|
51932 | * @param {number} paintStartTimeStamp The time when the animation frame began executing.
|
51933 | *
|
51934 | * @returns {Map} this
|
51935 | * @private
|
51936 | */
|
51937 | _render(paintStartTimeStamp) {
|
51938 | let gpuTimer, frameStartTime = 0;
|
51939 | const extTimerQuery = this.painter.context.extTimerQuery;
|
51940 | if (this.listens('gpu-timing-frame')) {
|
51941 | gpuTimer = extTimerQuery.createQueryEXT();
|
51942 | extTimerQuery.beginQueryEXT(extTimerQuery.TIME_ELAPSED_EXT, gpuTimer);
|
51943 | frameStartTime = performance.exported.now();
|
51944 | }
|
51945 | // A custom layer may have used the context asynchronously. Mark the state as dirty.
|
51946 | this.painter.context.setDirty();
|
51947 | this.painter.setBaseState();
|
51948 | this._renderTaskQueue.run(paintStartTimeStamp);
|
51949 | // A task queue callback may have fired a user event which may have removed the map
|
51950 | if (this._removed)
|
51951 | return;
|
51952 | let crossFading = false;
|
51953 | // If the style has changed, the map is being zoomed, or a transition or fade is in progress:
|
51954 | // - Apply style changes (in a batch)
|
51955 | // - Recalculate paint properties.
|
51956 | if (this.style && this._styleDirty) {
|
51957 | this._styleDirty = false;
|
51958 | const zoom = this.transform.zoom;
|
51959 | const now = performance.exported.now();
|
51960 | this.style.zoomHistory.update(zoom, now);
|
51961 | const parameters = new performance.EvaluationParameters(zoom, {
|
51962 | now,
|
51963 | fadeDuration: this._fadeDuration,
|
51964 | zoomHistory: this.style.zoomHistory,
|
51965 | transition: this.style.getTransition()
|
51966 | });
|
51967 | const factor = parameters.crossFadingFactor();
|
51968 | if (factor !== 1 || factor !== this._crossFadingFactor) {
|
51969 | crossFading = true;
|
51970 | this._crossFadingFactor = factor;
|
51971 | }
|
51972 | this.style.update(parameters);
|
51973 | }
|
51974 | // If we are in _render for any reason other than an in-progress paint
|
51975 | // transition, update source caches to check for and load any tiles we
|
51976 | // need for the current transform
|
51977 | if (this.style && this._sourcesDirty) {
|
51978 | this._sourcesDirty = false;
|
51979 | this.style._updateSources(this.transform);
|
51980 | }
|
51981 | this._placementDirty = this.style && this.style._updatePlacement(this.painter.transform, this.showCollisionBoxes, this._fadeDuration, this._crossSourceCollisions);
|
51982 | // Actually draw
|
51983 | this.painter.render(this.style, {
|
51984 | showTileBoundaries: this.showTileBoundaries,
|
51985 | showOverdrawInspector: this._showOverdrawInspector,
|
51986 | rotating: this.isRotating(),
|
51987 | zooming: this.isZooming(),
|
51988 | moving: this.isMoving(),
|
51989 | fadeDuration: this._fadeDuration,
|
51990 | showPadding: this.showPadding,
|
51991 | gpuTiming: !!this.listens('gpu-timing-layer'),
|
51992 | });
|
51993 | this.fire(new performance.Event('render'));
|
51994 | if (this.loaded() && !this._loaded) {
|
51995 | this._loaded = true;
|
51996 | performance.PerformanceUtils.mark(performance.PerformanceMarkers.load);
|
51997 | this.fire(new performance.Event('load'));
|
51998 | }
|
51999 | if (this.style && (this.style.hasTransitions() || crossFading)) {
|
52000 | this._styleDirty = true;
|
52001 | }
|
52002 | if (this.style && !this._placementDirty) {
|
52003 | // Since no fade operations are in progress, we can release
|
52004 | // all tiles held for fading. If we didn't do this, the tiles
|
52005 | // would just sit in the SourceCaches until the next render
|
52006 | this.style._releaseSymbolFadeTiles();
|
52007 | }
|
52008 | if (this.listens('gpu-timing-frame')) {
|
52009 | const renderCPUTime = performance.exported.now() - frameStartTime;
|
52010 | extTimerQuery.endQueryEXT(extTimerQuery.TIME_ELAPSED_EXT, gpuTimer);
|
52011 | setTimeout(() => {
|
52012 | const renderGPUTime = extTimerQuery.getQueryObjectEXT(gpuTimer, extTimerQuery.QUERY_RESULT_EXT) / (1000 * 1000);
|
52013 | extTimerQuery.deleteQueryEXT(gpuTimer);
|
52014 | this.fire(new performance.Event('gpu-timing-frame', {
|
52015 | cpuTime: renderCPUTime,
|
52016 | gpuTime: renderGPUTime
|
52017 | }));
|
52018 | }, 50); // Wait 50ms to give time for all GPU calls to finish before querying
|
52019 | }
|
52020 | if (this.listens('gpu-timing-layer')) {
|
52021 | // Resetting the Painter's per-layer timing queries here allows us to isolate
|
52022 | // the queries to individual frames.
|
52023 | const frameLayerQueries = this.painter.collectGpuTimers();
|
52024 | setTimeout(() => {
|
52025 | const renderedLayerTimes = this.painter.queryGpuTimers(frameLayerQueries);
|
52026 | this.fire(new performance.Event('gpu-timing-layer', {
|
52027 | layerTimes: renderedLayerTimes
|
52028 | }));
|
52029 | }, 50); // Wait 50ms to give time for all GPU calls to finish before querying
|
52030 | }
|
52031 | // Schedule another render frame if it's needed.
|
52032 | //
|
52033 | // Even though `_styleDirty` and `_sourcesDirty` are reset in this
|
52034 | // method, synchronous events fired during Style#update or
|
52035 | // Style#_updateSources could have caused them to be set again.
|
52036 | const somethingDirty = this._sourcesDirty || this._styleDirty || this._placementDirty;
|
52037 | if (somethingDirty || this._repaint) {
|
52038 | this.triggerRepaint();
|
52039 | }
|
52040 | else if (!this.isMoving() && this.loaded()) {
|
52041 | this.fire(new performance.Event('idle'));
|
52042 | }
|
52043 | if (this._loaded && !this._fullyLoaded && !somethingDirty) {
|
52044 | this._fullyLoaded = true;
|
52045 | performance.PerformanceUtils.mark(performance.PerformanceMarkers.fullLoad);
|
52046 | }
|
52047 | return this;
|
52048 | }
|
52049 | /**
|
52050 | * Force a synchronous redraw of the map.
|
52051 | * @example
|
52052 | * map.redraw();
|
52053 | * @returns {Map} `this`
|
52054 | */
|
52055 | redraw() {
|
52056 | if (this.style) {
|
52057 | // cancel the scheduled update
|
52058 | if (this._frame) {
|
52059 | this._frame.cancel();
|
52060 | this._frame = null;
|
52061 | }
|
52062 | this._render(0);
|
52063 | }
|
52064 | return this;
|
52065 | }
|
52066 | /**
|
52067 | * Clean up and release all internal resources associated with this map.
|
52068 | *
|
52069 | * This includes DOM elements, event bindings, web workers, and WebGL resources.
|
52070 | *
|
52071 | * Use this method when you are done using the map and wish to ensure that it no
|
52072 | * longer consumes browser resources. Afterwards, you must not call any other
|
52073 | * methods on the map.
|
52074 | */
|
52075 | remove() {
|
52076 | if (this._hash)
|
52077 | this._hash.remove();
|
52078 | for (const control of this._controls)
|
52079 | control.onRemove(this);
|
52080 | this._controls = [];
|
52081 | if (this._frame) {
|
52082 | this._frame.cancel();
|
52083 | this._frame = null;
|
52084 | }
|
52085 | this._renderTaskQueue.clear();
|
52086 | this.painter.destroy();
|
52087 | this.handlers.destroy();
|
52088 | delete this.handlers;
|
52089 | this.setStyle(null);
|
52090 | if (typeof window !== 'undefined') {
|
52091 | removeEventListener('resize', this._onWindowResize, false);
|
52092 | removeEventListener('orientationchange', this._onWindowResize, false);
|
52093 | removeEventListener('online', this._onWindowOnline, false);
|
52094 | }
|
52095 | const extension = this.painter.context.gl.getExtension('WEBGL_lose_context');
|
52096 | if (extension)
|
52097 | extension.loseContext();
|
52098 | this._canvas.removeEventListener('webglcontextrestored', this._contextRestored, false);
|
52099 | this._canvas.removeEventListener('webglcontextlost', this._contextLost, false);
|
52100 | DOM.remove(this._canvasContainer);
|
52101 | DOM.remove(this._controlContainer);
|
52102 | this._container.classList.remove('maplibregl-map', 'mapboxgl-map');
|
52103 | performance.PerformanceUtils.clearMetrics();
|
52104 | this._removed = true;
|
52105 | this.fire(new performance.Event('remove'));
|
52106 | }
|
52107 | /**
|
52108 | * Trigger the rendering of a single frame. Use this method with custom layers to
|
52109 | * repaint the map when the layer changes. Calling this multiple times before the
|
52110 | * next frame is rendered will still result in only a single frame being rendered.
|
52111 | * @example
|
52112 | * map.triggerRepaint();
|
52113 | * @see [Add a 3D model](https://maplibre.org/maplibre-gl-js-docs/example/add-3d-model/)
|
52114 | * @see [Add an animated icon to the map](https://maplibre.org/maplibre-gl-js-docs/example/add-image-animated/)
|
52115 | */
|
52116 | triggerRepaint() {
|
52117 | if (this.style && !this._frame) {
|
52118 | this._frame = performance.exported.frame((paintStartTimeStamp) => {
|
52119 | performance.PerformanceUtils.frame(paintStartTimeStamp);
|
52120 | this._frame = null;
|
52121 | this._render(paintStartTimeStamp);
|
52122 | });
|
52123 | }
|
52124 | }
|
52125 | _onWindowOnline() {
|
52126 | this._update();
|
52127 | }
|
52128 | _onWindowResize(event) {
|
52129 | if (this._trackResize) {
|
52130 | this.resize({ originalEvent: event })._update();
|
52131 | }
|
52132 | }
|
52133 | /**
|
52134 | * Gets and sets a Boolean indicating whether the map will render an outline
|
52135 | * around each tile and the tile ID. These tile boundaries are useful for
|
52136 | * debugging.
|
52137 | *
|
52138 | * The uncompressed file size of the first vector source is drawn in the top left
|
52139 | * corner of each tile, next to the tile ID.
|
52140 | *
|
52141 | * @name showTileBoundaries
|
52142 | * @type {boolean}
|
52143 | * @instance
|
52144 | * @memberof Map
|
52145 | * @example
|
52146 | * map.showTileBoundaries = true;
|
52147 | */
|
52148 | get showTileBoundaries() { return !!this._showTileBoundaries; }
|
52149 | set showTileBoundaries(value) {
|
52150 | if (this._showTileBoundaries === value)
|
52151 | return;
|
52152 | this._showTileBoundaries = value;
|
52153 | this._update();
|
52154 | }
|
52155 | /**
|
52156 | * Gets and sets a Boolean indicating whether the map will visualize
|
52157 | * the padding offsets.
|
52158 | *
|
52159 | * @name showPadding
|
52160 | * @type {boolean}
|
52161 | * @instance
|
52162 | * @memberof Map
|
52163 | */
|
52164 | get showPadding() { return !!this._showPadding; }
|
52165 | set showPadding(value) {
|
52166 | if (this._showPadding === value)
|
52167 | return;
|
52168 | this._showPadding = value;
|
52169 | this._update();
|
52170 | }
|
52171 | /**
|
52172 | * Gets and sets a Boolean indicating whether the map will render boxes
|
52173 | * around all symbols in the data source, revealing which symbols
|
52174 | * were rendered or which were hidden due to collisions.
|
52175 | * This information is useful for debugging.
|
52176 | *
|
52177 | * @name showCollisionBoxes
|
52178 | * @type {boolean}
|
52179 | * @instance
|
52180 | * @memberof Map
|
52181 | */
|
52182 | get showCollisionBoxes() { return !!this._showCollisionBoxes; }
|
52183 | set showCollisionBoxes(value) {
|
52184 | if (this._showCollisionBoxes === value)
|
52185 | return;
|
52186 | this._showCollisionBoxes = value;
|
52187 | if (value) {
|
52188 | // When we turn collision boxes on we have to generate them for existing tiles
|
52189 | // When we turn them off, there's no cost to leaving existing boxes in place
|
52190 | this.style._generateCollisionBoxes();
|
52191 | }
|
52192 | else {
|
52193 | // Otherwise, call an update to remove collision boxes
|
52194 | this._update();
|
52195 | }
|
52196 | }
|
52197 | /*
|
52198 | * Gets and sets a Boolean indicating whether the map should color-code
|
52199 | * each fragment to show how many times it has been shaded.
|
52200 | * White fragments have been shaded 8 or more times.
|
52201 | * Black fragments have been shaded 0 times.
|
52202 | * This information is useful for debugging.
|
52203 | *
|
52204 | * @name showOverdraw
|
52205 | * @type {boolean}
|
52206 | * @instance
|
52207 | * @memberof Map
|
52208 | */
|
52209 | get showOverdrawInspector() { return !!this._showOverdrawInspector; }
|
52210 | set showOverdrawInspector(value) {
|
52211 | if (this._showOverdrawInspector === value)
|
52212 | return;
|
52213 | this._showOverdrawInspector = value;
|
52214 | this._update();
|
52215 | }
|
52216 | /**
|
52217 | * Gets and sets a Boolean indicating whether the map will
|
52218 | * continuously repaint. This information is useful for analyzing performance.
|
52219 | *
|
52220 | * @name repaint
|
52221 | * @type {boolean}
|
52222 | * @instance
|
52223 | * @memberof Map
|
52224 | */
|
52225 | get repaint() { return !!this._repaint; }
|
52226 | set repaint(value) {
|
52227 | if (this._repaint !== value) {
|
52228 | this._repaint = value;
|
52229 | this.triggerRepaint();
|
52230 | }
|
52231 | }
|
52232 | // show vertices
|
52233 | get vertices() { return !!this._vertices; }
|
52234 | set vertices(value) { this._vertices = value; this._update(); }
|
52235 | // for cache browser tests
|
52236 | _setCacheLimits(limit, checkThreshold) {
|
52237 | performance.setCacheLimits(limit, checkThreshold);
|
52238 | }
|
52239 | }
|
52240 |
|
52241 | const defaultOptions$3 = {
|
52242 | showCompass: true,
|
52243 | showZoom: true,
|
52244 | visualizePitch: false
|
52245 | };
|
52246 | /**
|
52247 | * A `NavigationControl` control contains zoom buttons and a compass.
|
52248 | *
|
52249 | * @implements {IControl}
|
52250 | * @param {Object} [options]
|
52251 | * @param {Boolean} [options.showCompass=true] If `true` the compass button is included.
|
52252 | * @param {Boolean} [options.showZoom=true] If `true` the zoom-in and zoom-out buttons are included.
|
52253 | * @param {Boolean} [options.visualizePitch=false] If `true` the pitch is visualized by rotating X-axis of compass.
|
52254 | * @example
|
52255 | * var nav = new maplibregl.NavigationControl();
|
52256 | * map.addControl(nav, 'top-left');
|
52257 | * @see [Display map navigation controls](https://maplibre.org/maplibre-gl-js-docs/example/navigation/)
|
52258 | * @see [Add a third party vector tile source](https://maplibre.org/maplibre-gl-js-docs/example/third-party/)
|
52259 | */
|
52260 | class NavigationControl {
|
52261 | constructor(options) {
|
52262 | this.options = performance.extend({}, defaultOptions$3, options);
|
52263 | this._container = DOM.create('div', 'maplibregl-ctrl maplibregl-ctrl-group mapboxgl-ctrl mapboxgl-ctrl-group');
|
52264 | this._container.addEventListener('contextmenu', (e) => e.preventDefault());
|
52265 | if (this.options.showZoom) {
|
52266 | performance.bindAll([
|
52267 | '_setButtonTitle',
|
52268 | '_updateZoomButtons'
|
52269 | ], this);
|
52270 | this._zoomInButton = this._createButton('maplibregl-ctrl-zoom-in mapboxgl-ctrl-zoom-in', (e) => this._map.zoomIn({}, { originalEvent: e }));
|
52271 | DOM.create('span', 'maplibregl-ctrl-icon mapboxgl-ctrl-icon', this._zoomInButton).setAttribute('aria-hidden', 'true');
|
52272 | this._zoomOutButton = this._createButton('maplibregl-ctrl-zoom-out mapboxgl-ctrl-zoom-out', (e) => this._map.zoomOut({}, { originalEvent: e }));
|
52273 | DOM.create('span', 'maplibregl-ctrl-icon mapboxgl-ctrl-icon', this._zoomOutButton).setAttribute('aria-hidden', 'true');
|
52274 | }
|
52275 | if (this.options.showCompass) {
|
52276 | performance.bindAll([
|
52277 | '_rotateCompassArrow'
|
52278 | ], this);
|
52279 | this._compass = this._createButton('maplibregl-ctrl-compass mapboxgl-ctrl-compass', (e) => {
|
52280 | if (this.options.visualizePitch) {
|
52281 | this._map.resetNorthPitch({}, { originalEvent: e });
|
52282 | }
|
52283 | else {
|
52284 | this._map.resetNorth({}, { originalEvent: e });
|
52285 | }
|
52286 | });
|
52287 | this._compassIcon = DOM.create('span', 'maplibregl-ctrl-icon mapboxgl-ctrl-icon', this._compass);
|
52288 | this._compassIcon.setAttribute('aria-hidden', 'true');
|
52289 | }
|
52290 | }
|
52291 | _updateZoomButtons() {
|
52292 | const zoom = this._map.getZoom();
|
52293 | const isMax = zoom === this._map.getMaxZoom();
|
52294 | const isMin = zoom === this._map.getMinZoom();
|
52295 | this._zoomInButton.disabled = isMax;
|
52296 | this._zoomOutButton.disabled = isMin;
|
52297 | this._zoomInButton.setAttribute('aria-disabled', isMax.toString());
|
52298 | this._zoomOutButton.setAttribute('aria-disabled', isMin.toString());
|
52299 | }
|
52300 | _rotateCompassArrow() {
|
52301 | const rotate = this.options.visualizePitch ?
|
52302 | `scale(${1 / Math.pow(Math.cos(this._map.transform.pitch * (Math.PI / 180)), 0.5)}) rotateX(${this._map.transform.pitch}deg) rotateZ(${this._map.transform.angle * (180 / Math.PI)}deg)` :
|
52303 | `rotate(${this._map.transform.angle * (180 / Math.PI)}deg)`;
|
52304 | this._compassIcon.style.transform = rotate;
|
52305 | }
|
52306 | onAdd(map) {
|
52307 | this._map = map;
|
52308 | if (this.options.showZoom) {
|
52309 | this._setButtonTitle(this._zoomInButton, 'ZoomIn');
|
52310 | this._setButtonTitle(this._zoomOutButton, 'ZoomOut');
|
52311 | this._map.on('zoom', this._updateZoomButtons);
|
52312 | this._updateZoomButtons();
|
52313 | }
|
52314 | if (this.options.showCompass) {
|
52315 | this._setButtonTitle(this._compass, 'ResetBearing');
|
52316 | if (this.options.visualizePitch) {
|
52317 | this._map.on('pitch', this._rotateCompassArrow);
|
52318 | }
|
52319 | this._map.on('rotate', this._rotateCompassArrow);
|
52320 | this._rotateCompassArrow();
|
52321 | this._handler = new MouseRotateWrapper(this._map, this._compass, this.options.visualizePitch);
|
52322 | }
|
52323 | return this._container;
|
52324 | }
|
52325 | onRemove() {
|
52326 | DOM.remove(this._container);
|
52327 | if (this.options.showZoom) {
|
52328 | this._map.off('zoom', this._updateZoomButtons);
|
52329 | }
|
52330 | if (this.options.showCompass) {
|
52331 | if (this.options.visualizePitch) {
|
52332 | this._map.off('pitch', this._rotateCompassArrow);
|
52333 | }
|
52334 | this._map.off('rotate', this._rotateCompassArrow);
|
52335 | this._handler.off();
|
52336 | delete this._handler;
|
52337 | }
|
52338 | delete this._map;
|
52339 | }
|
52340 | _createButton(className, fn) {
|
52341 | const a = DOM.create('button', className, this._container);
|
52342 | a.type = 'button';
|
52343 | a.addEventListener('click', fn);
|
52344 | return a;
|
52345 | }
|
52346 | _setButtonTitle(button, title) {
|
52347 | const str = this._map._getUIString(`NavigationControl.${title}`);
|
52348 | button.title = str;
|
52349 | button.setAttribute('aria-label', str);
|
52350 | }
|
52351 | }
|
52352 | class MouseRotateWrapper {
|
52353 | constructor(map, element, pitch = false) {
|
52354 | this._clickTolerance = 10;
|
52355 | this.element = element;
|
52356 | this.mouseRotate = new MouseRotateHandler({ clickTolerance: map.dragRotate._mouseRotate._clickTolerance });
|
52357 | this.map = map;
|
52358 | if (pitch)
|
52359 | this.mousePitch = new MousePitchHandler({ clickTolerance: map.dragRotate._mousePitch._clickTolerance });
|
52360 | performance.bindAll(['mousedown', 'mousemove', 'mouseup', 'touchstart', 'touchmove', 'touchend', 'reset'], this);
|
52361 | DOM.addEventListener(element, 'mousedown', this.mousedown);
|
52362 | DOM.addEventListener(element, 'touchstart', this.touchstart, { passive: false });
|
52363 | DOM.addEventListener(element, 'touchmove', this.touchmove);
|
52364 | DOM.addEventListener(element, 'touchend', this.touchend);
|
52365 | DOM.addEventListener(element, 'touchcancel', this.reset);
|
52366 | }
|
52367 | down(e, point) {
|
52368 | this.mouseRotate.mousedown(e, point);
|
52369 | if (this.mousePitch)
|
52370 | this.mousePitch.mousedown(e, point);
|
52371 | DOM.disableDrag();
|
52372 | }
|
52373 | move(e, point) {
|
52374 | const map = this.map;
|
52375 | const r = this.mouseRotate.mousemoveWindow(e, point);
|
52376 | if (r && r.bearingDelta)
|
52377 | map.setBearing(map.getBearing() + r.bearingDelta);
|
52378 | if (this.mousePitch) {
|
52379 | const p = this.mousePitch.mousemoveWindow(e, point);
|
52380 | if (p && p.pitchDelta)
|
52381 | map.setPitch(map.getPitch() + p.pitchDelta);
|
52382 | }
|
52383 | }
|
52384 | off() {
|
52385 | const element = this.element;
|
52386 | DOM.removeEventListener(element, 'mousedown', this.mousedown);
|
52387 | DOM.removeEventListener(element, 'touchstart', this.touchstart, { passive: false });
|
52388 | DOM.removeEventListener(element, 'touchmove', this.touchmove);
|
52389 | DOM.removeEventListener(element, 'touchend', this.touchend);
|
52390 | DOM.removeEventListener(element, 'touchcancel', this.reset);
|
52391 | this.offTemp();
|
52392 | }
|
52393 | offTemp() {
|
52394 | DOM.enableDrag();
|
52395 | DOM.removeEventListener(window, 'mousemove', this.mousemove);
|
52396 | DOM.removeEventListener(window, 'mouseup', this.mouseup);
|
52397 | }
|
52398 | mousedown(e) {
|
52399 | this.down(performance.extend({}, e, { ctrlKey: true, preventDefault: () => e.preventDefault() }), DOM.mousePos(this.element, e));
|
52400 | DOM.addEventListener(window, 'mousemove', this.mousemove);
|
52401 | DOM.addEventListener(window, 'mouseup', this.mouseup);
|
52402 | }
|
52403 | mousemove(e) {
|
52404 | this.move(e, DOM.mousePos(this.element, e));
|
52405 | }
|
52406 | mouseup(e) {
|
52407 | this.mouseRotate.mouseupWindow(e);
|
52408 | if (this.mousePitch)
|
52409 | this.mousePitch.mouseupWindow(e);
|
52410 | this.offTemp();
|
52411 | }
|
52412 | touchstart(e) {
|
52413 | if (e.targetTouches.length !== 1) {
|
52414 | this.reset();
|
52415 | }
|
52416 | else {
|
52417 | this._startPos = this._lastPos = DOM.touchPos(this.element, e.targetTouches)[0];
|
52418 | this.down({ type: 'mousedown', button: 0, ctrlKey: true, preventDefault: () => e.preventDefault() }, this._startPos);
|
52419 | }
|
52420 | }
|
52421 | touchmove(e) {
|
52422 | if (e.targetTouches.length !== 1) {
|
52423 | this.reset();
|
52424 | }
|
52425 | else {
|
52426 | this._lastPos = DOM.touchPos(this.element, e.targetTouches)[0];
|
52427 | this.move({ preventDefault: () => e.preventDefault() }, this._lastPos);
|
52428 | }
|
52429 | }
|
52430 | touchend(e) {
|
52431 | if (e.targetTouches.length === 0 &&
|
52432 | this._startPos &&
|
52433 | this._lastPos &&
|
52434 | this._startPos.dist(this._lastPos) < this._clickTolerance) {
|
52435 | this.element.click();
|
52436 | }
|
52437 | this.reset();
|
52438 | }
|
52439 | reset() {
|
52440 | this.mouseRotate.reset();
|
52441 | if (this.mousePitch)
|
52442 | this.mousePitch.reset();
|
52443 | delete this._startPos;
|
52444 | delete this._lastPos;
|
52445 | this.offTemp();
|
52446 | }
|
52447 | }
|
52448 |
|
52449 | /**
|
52450 | * Given a LngLat, prior projected position, and a transform, return a new LngLat shifted
|
52451 | * n × 360° east or west for some n ≥ 0 such that:
|
52452 | *
|
52453 | * * the projected location of the result is on screen, if possible, and secondarily:
|
52454 | * * the difference between the projected location of the result and the prior position
|
52455 | * is minimized.
|
52456 | *
|
52457 | * The object is to preserve perceived object constancy for Popups and Markers as much as
|
52458 | * possible; they should avoid shifting large distances across the screen, even when the
|
52459 | * map center changes by ±360° due to automatic wrapping, and when about to go off screen,
|
52460 | * should wrap just enough to avoid doing so.
|
52461 | *
|
52462 | * @private
|
52463 | */
|
52464 | function smartWrap (lngLat, priorPos, transform) {
|
52465 | lngLat = new performance.LngLat(lngLat.lng, lngLat.lat);
|
52466 | // First, try shifting one world in either direction, and see if either is closer to the
|
52467 | // prior position. This preserves object constancy when the map center is auto-wrapped
|
52468 | // during animations.
|
52469 | if (priorPos) {
|
52470 | const left = new performance.LngLat(lngLat.lng - 360, lngLat.lat);
|
52471 | const right = new performance.LngLat(lngLat.lng + 360, lngLat.lat);
|
52472 | const delta = transform.locationPoint(lngLat).distSqr(priorPos);
|
52473 | if (transform.locationPoint(left).distSqr(priorPos) < delta) {
|
52474 | lngLat = left;
|
52475 | }
|
52476 | else if (transform.locationPoint(right).distSqr(priorPos) < delta) {
|
52477 | lngLat = right;
|
52478 | }
|
52479 | }
|
52480 | // Second, wrap toward the center until the new position is on screen, or we can't get
|
52481 | // any closer.
|
52482 | while (Math.abs(lngLat.lng - transform.center.lng) > 180) {
|
52483 | const pos = transform.locationPoint(lngLat);
|
52484 | if (pos.x >= 0 && pos.y >= 0 && pos.x <= transform.width && pos.y <= transform.height) {
|
52485 | break;
|
52486 | }
|
52487 | if (lngLat.lng > transform.center.lng) {
|
52488 | lngLat.lng -= 360;
|
52489 | }
|
52490 | else {
|
52491 | lngLat.lng += 360;
|
52492 | }
|
52493 | }
|
52494 | return lngLat;
|
52495 | }
|
52496 |
|
52497 | const anchorTranslate = {
|
52498 | 'center': 'translate(-50%,-50%)',
|
52499 | 'top': 'translate(-50%,0)',
|
52500 | 'top-left': 'translate(0,0)',
|
52501 | 'top-right': 'translate(-100%,0)',
|
52502 | 'bottom': 'translate(-50%,-100%)',
|
52503 | 'bottom-left': 'translate(0,-100%)',
|
52504 | 'bottom-right': 'translate(-100%,-100%)',
|
52505 | 'left': 'translate(0,-50%)',
|
52506 | 'right': 'translate(-100%,-50%)'
|
52507 | };
|
52508 | function applyAnchorClass(element, anchor, prefix) {
|
52509 | const classList = element.classList;
|
52510 | for (const key in anchorTranslate) {
|
52511 | classList.remove(`maplibregl-${prefix}-anchor-${key}`, `mapboxgl-${prefix}-anchor-${key}`);
|
52512 | }
|
52513 | classList.add(`maplibregl-${prefix}-anchor-${anchor}`, `mapboxgl-${prefix}-anchor-${anchor}`);
|
52514 | }
|
52515 |
|
52516 | /**
|
52517 | * Creates a marker component
|
52518 | * @param {Object} [options]
|
52519 | * @param {HTMLElement} [options.element] DOM element to use as a marker. The default is a light blue, droplet-shaped SVG marker.
|
52520 | * @param {string} [options.anchor='center'] A string indicating the part of the Marker that should be positioned closest to the coordinate set via {@link Marker#setLngLat}.
|
52521 | * Options are `'center'`, `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`.
|
52522 | * @param {PointLike} [options.offset] The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up.
|
52523 | * @param {string} [options.color='#3FB1CE'] The color to use for the default marker if options.element is not provided. The default is light blue.
|
52524 | * @param {number} [options.scale=1] The scale to use for the default marker if options.element is not provided. The default scale corresponds to a height of `41px` and a width of `27px`.
|
52525 | * @param {boolean} [options.draggable=false] A boolean indicating whether or not a marker is able to be dragged to a new position on the map.
|
52526 | * @param {number} [options.clickTolerance=0] The max number of pixels a user can shift the mouse pointer during a click on the marker for it to be considered a valid click (as opposed to a marker drag). The default is to inherit map's clickTolerance.
|
52527 | * @param {number} [options.rotation=0] The rotation angle of the marker in degrees, relative to its respective `rotationAlignment` setting. A positive value will rotate the marker clockwise.
|
52528 | * @param {string} [options.pitchAlignment='auto'] `map` aligns the `Marker` to the plane of the map. `viewport` aligns the `Marker` to the plane of the viewport. `auto` automatically matches the value of `rotationAlignment`.
|
52529 | * @param {string} [options.rotationAlignment='auto'] `map` aligns the `Marker`'s rotation relative to the map, maintaining a bearing as the map rotates. `viewport` aligns the `Marker`'s rotation relative to the viewport, agnostic to map rotations. `auto` is equivalent to `viewport`.
|
52530 | * @example
|
52531 | * var marker = new maplibregl.Marker()
|
52532 | * .setLngLat([30.5, 50.5])
|
52533 | * .addTo(map);
|
52534 | * @example
|
52535 | * // Set options
|
52536 | * var marker = new maplibregl.Marker({
|
52537 | * color: "#FFFFFF",
|
52538 | * draggable: true
|
52539 | * }).setLngLat([30.5, 50.5])
|
52540 | * .addTo(map);
|
52541 | * @see [Add custom icons with Markers](https://maplibre.org/maplibre-gl-js-docs/example/custom-marker-icons/)
|
52542 | * @see [Create a draggable Marker](https://maplibre.org/maplibre-gl-js-docs/example/drag-a-marker/)
|
52543 | */
|
52544 | class Marker extends performance.Evented {
|
52545 | constructor(options, legacyOptions) {
|
52546 | super();
|
52547 | // For backward compatibility -- the constructor used to accept the element as a
|
52548 | // required first argument, before it was made optional.
|
52549 | if (options instanceof HTMLElement || legacyOptions) {
|
52550 | options = performance.extend({ element: options }, legacyOptions);
|
52551 | }
|
52552 | performance.bindAll([
|
52553 | '_update',
|
52554 | '_onMove',
|
52555 | '_onUp',
|
52556 | '_addDragHandler',
|
52557 | '_onMapClick',
|
52558 | '_onKeyPress'
|
52559 | ], this);
|
52560 | this._anchor = options && options.anchor || 'center';
|
52561 | this._color = options && options.color || '#3FB1CE';
|
52562 | this._scale = options && options.scale || 1;
|
52563 | this._draggable = options && options.draggable || false;
|
52564 | this._clickTolerance = options && options.clickTolerance || 0;
|
52565 | this._isDragging = false;
|
52566 | this._state = 'inactive';
|
52567 | this._rotation = options && options.rotation || 0;
|
52568 | this._rotationAlignment = options && options.rotationAlignment || 'auto';
|
52569 | this._pitchAlignment = options && options.pitchAlignment && options.pitchAlignment !== 'auto' ? options.pitchAlignment : this._rotationAlignment;
|
52570 | if (!options || !options.element) {
|
52571 | this._defaultMarker = true;
|
52572 | this._element = DOM.create('div');
|
52573 | this._element.setAttribute('aria-label', 'Map marker');
|
52574 | // create default map marker SVG
|
52575 | const svg = DOM.createNS('http://www.w3.org/2000/svg', 'svg');
|
52576 | const defaultHeight = 41;
|
52577 | const defaultWidth = 27;
|
52578 | svg.setAttributeNS(null, 'display', 'block');
|
52579 | svg.setAttributeNS(null, 'height', `${defaultHeight}px`);
|
52580 | svg.setAttributeNS(null, 'width', `${defaultWidth}px`);
|
52581 | svg.setAttributeNS(null, 'viewBox', `0 0 ${defaultWidth} ${defaultHeight}`);
|
52582 | const markerLarge = DOM.createNS('http://www.w3.org/2000/svg', 'g');
|
52583 | markerLarge.setAttributeNS(null, 'stroke', 'none');
|
52584 | markerLarge.setAttributeNS(null, 'stroke-width', '1');
|
52585 | markerLarge.setAttributeNS(null, 'fill', 'none');
|
52586 | markerLarge.setAttributeNS(null, 'fill-rule', 'evenodd');
|
52587 | const page1 = DOM.createNS('http://www.w3.org/2000/svg', 'g');
|
52588 | page1.setAttributeNS(null, 'fill-rule', 'nonzero');
|
52589 | const shadow = DOM.createNS('http://www.w3.org/2000/svg', 'g');
|
52590 | shadow.setAttributeNS(null, 'transform', 'translate(3.0, 29.0)');
|
52591 | shadow.setAttributeNS(null, 'fill', '#000000');
|
52592 | const ellipses = [
|
52593 | { 'rx': '10.5', 'ry': '5.25002273' },
|
52594 | { 'rx': '10.5', 'ry': '5.25002273' },
|
52595 | { 'rx': '9.5', 'ry': '4.77275007' },
|
52596 | { 'rx': '8.5', 'ry': '4.29549936' },
|
52597 | { 'rx': '7.5', 'ry': '3.81822308' },
|
52598 | { 'rx': '6.5', 'ry': '3.34094679' },
|
52599 | { 'rx': '5.5', 'ry': '2.86367051' },
|
52600 | { 'rx': '4.5', 'ry': '2.38636864' }
|
52601 | ];
|
52602 | for (const data of ellipses) {
|
52603 | const ellipse = DOM.createNS('http://www.w3.org/2000/svg', 'ellipse');
|
52604 | ellipse.setAttributeNS(null, 'opacity', '0.04');
|
52605 | ellipse.setAttributeNS(null, 'cx', '10.5');
|
52606 | ellipse.setAttributeNS(null, 'cy', '5.80029008');
|
52607 | ellipse.setAttributeNS(null, 'rx', data['rx']);
|
52608 | ellipse.setAttributeNS(null, 'ry', data['ry']);
|
52609 | shadow.appendChild(ellipse);
|
52610 | }
|
52611 | const background = DOM.createNS('http://www.w3.org/2000/svg', 'g');
|
52612 | background.setAttributeNS(null, 'fill', this._color);
|
52613 | const bgPath = DOM.createNS('http://www.w3.org/2000/svg', 'path');
|
52614 | bgPath.setAttributeNS(null, 'd', 'M27,13.5 C27,19.074644 20.250001,27.000002 14.75,34.500002 C14.016665,35.500004 12.983335,35.500004 12.25,34.500002 C6.7499993,27.000002 0,19.222562 0,13.5 C0,6.0441559 6.0441559,0 13.5,0 C20.955844,0 27,6.0441559 27,13.5 Z');
|
52615 | background.appendChild(bgPath);
|
52616 | const border = DOM.createNS('http://www.w3.org/2000/svg', 'g');
|
52617 | border.setAttributeNS(null, 'opacity', '0.25');
|
52618 | border.setAttributeNS(null, 'fill', '#000000');
|
52619 | const borderPath = DOM.createNS('http://www.w3.org/2000/svg', 'path');
|
52620 | borderPath.setAttributeNS(null, 'd', 'M13.5,0 C6.0441559,0 0,6.0441559 0,13.5 C0,19.222562 6.7499993,27 12.25,34.5 C13,35.522727 14.016664,35.500004 14.75,34.5 C20.250001,27 27,19.074644 27,13.5 C27,6.0441559 20.955844,0 13.5,0 Z M13.5,1 C20.415404,1 26,6.584596 26,13.5 C26,15.898657 24.495584,19.181431 22.220703,22.738281 C19.945823,26.295132 16.705119,30.142167 13.943359,33.908203 C13.743445,34.180814 13.612715,34.322738 13.5,34.441406 C13.387285,34.322738 13.256555,34.180814 13.056641,33.908203 C10.284481,30.127985 7.4148684,26.314159 5.015625,22.773438 C2.6163816,19.232715 1,15.953538 1,13.5 C1,6.584596 6.584596,1 13.5,1 Z');
|
52621 | border.appendChild(borderPath);
|
52622 | const maki = DOM.createNS('http://www.w3.org/2000/svg', 'g');
|
52623 | maki.setAttributeNS(null, 'transform', 'translate(6.0, 7.0)');
|
52624 | maki.setAttributeNS(null, 'fill', '#FFFFFF');
|
52625 | const circleContainer = DOM.createNS('http://www.w3.org/2000/svg', 'g');
|
52626 | circleContainer.setAttributeNS(null, 'transform', 'translate(8.0, 8.0)');
|
52627 | const circle1 = DOM.createNS('http://www.w3.org/2000/svg', 'circle');
|
52628 | circle1.setAttributeNS(null, 'fill', '#000000');
|
52629 | circle1.setAttributeNS(null, 'opacity', '0.25');
|
52630 | circle1.setAttributeNS(null, 'cx', '5.5');
|
52631 | circle1.setAttributeNS(null, 'cy', '5.5');
|
52632 | circle1.setAttributeNS(null, 'r', '5.4999962');
|
52633 | const circle2 = DOM.createNS('http://www.w3.org/2000/svg', 'circle');
|
52634 | circle2.setAttributeNS(null, 'fill', '#FFFFFF');
|
52635 | circle2.setAttributeNS(null, 'cx', '5.5');
|
52636 | circle2.setAttributeNS(null, 'cy', '5.5');
|
52637 | circle2.setAttributeNS(null, 'r', '5.4999962');
|
52638 | circleContainer.appendChild(circle1);
|
52639 | circleContainer.appendChild(circle2);
|
52640 | page1.appendChild(shadow);
|
52641 | page1.appendChild(background);
|
52642 | page1.appendChild(border);
|
52643 | page1.appendChild(maki);
|
52644 | page1.appendChild(circleContainer);
|
52645 | svg.appendChild(page1);
|
52646 | svg.setAttributeNS(null, 'height', `${defaultHeight * this._scale}px`);
|
52647 | svg.setAttributeNS(null, 'width', `${defaultWidth * this._scale}px`);
|
52648 | this._element.appendChild(svg);
|
52649 | // if no element and no offset option given apply an offset for the default marker
|
52650 | // the -14 as the y value of the default marker offset was determined as follows
|
52651 | //
|
52652 | // the marker tip is at the center of the shadow ellipse from the default svg
|
52653 | // the y value of the center of the shadow ellipse relative to the svg top left is "shadow transform translate-y (29.0) + ellipse cy (5.80029008)"
|
52654 | // offset to the svg center "height (41 / 2)" gives (29.0 + 5.80029008) - (41 / 2) and rounded for an integer pixel offset gives 14
|
52655 | // negative is used to move the marker up from the center so the tip is at the Marker lngLat
|
52656 | this._offset = performance.pointGeometry.convert(options && options.offset || [0, -14]);
|
52657 | }
|
52658 | else {
|
52659 | this._element = options.element;
|
52660 | this._offset = performance.pointGeometry.convert(options && options.offset || [0, 0]);
|
52661 | }
|
52662 | this._element.classList.add('maplibregl-marker', 'mapboxgl-marker');
|
52663 | this._element.addEventListener('dragstart', (e) => {
|
52664 | e.preventDefault();
|
52665 | });
|
52666 | this._element.addEventListener('mousedown', (e) => {
|
52667 | // prevent focusing on click
|
52668 | e.preventDefault();
|
52669 | });
|
52670 | applyAnchorClass(this._element, this._anchor, 'marker');
|
52671 | this._popup = null;
|
52672 | }
|
52673 | /**
|
52674 | * Attaches the `Marker` to a `Map` object.
|
52675 | * @param {Map} map The MapLibre GL JS map to add the marker to.
|
52676 | * @returns {Marker} `this`
|
52677 | * @example
|
52678 | * var marker = new maplibregl.Marker()
|
52679 | * .setLngLat([30.5, 50.5])
|
52680 | * .addTo(map); // add the marker to the map
|
52681 | */
|
52682 | addTo(map) {
|
52683 | this.remove();
|
52684 | this._map = map;
|
52685 | map.getCanvasContainer().appendChild(this._element);
|
52686 | map.on('move', this._update);
|
52687 | map.on('moveend', this._update);
|
52688 | this.setDraggable(this._draggable);
|
52689 | this._update();
|
52690 | // If we attached the `click` listener to the marker element, the popup
|
52691 | // would close once the event propogated to `map` due to the
|
52692 | // `Popup#_onClickClose` listener.
|
52693 | this._map.on('click', this._onMapClick);
|
52694 | return this;
|
52695 | }
|
52696 | /**
|
52697 | * Removes the marker from a map
|
52698 | * @example
|
52699 | * var marker = new maplibregl.Marker().addTo(map);
|
52700 | * marker.remove();
|
52701 | * @returns {Marker} `this`
|
52702 | */
|
52703 | remove() {
|
52704 | if (this._map) {
|
52705 | this._map.off('click', this._onMapClick);
|
52706 | this._map.off('move', this._update);
|
52707 | this._map.off('moveend', this._update);
|
52708 | this._map.off('mousedown', this._addDragHandler);
|
52709 | this._map.off('touchstart', this._addDragHandler);
|
52710 | this._map.off('mouseup', this._onUp);
|
52711 | this._map.off('touchend', this._onUp);
|
52712 | this._map.off('mousemove', this._onMove);
|
52713 | this._map.off('touchmove', this._onMove);
|
52714 | delete this._map;
|
52715 | }
|
52716 | DOM.remove(this._element);
|
52717 | if (this._popup)
|
52718 | this._popup.remove();
|
52719 | return this;
|
52720 | }
|
52721 | /**
|
52722 | * Get the marker's geographical location.
|
52723 | *
|
52724 | * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously
|
52725 | * set by `setLngLat` because `Marker` wraps the anchor longitude across copies of the world to keep
|
52726 | * the marker on screen.
|
52727 | *
|
52728 | * @returns {LngLat} A {@link LngLat} describing the marker's location.
|
52729 | * @example
|
52730 | * // Store the marker's longitude and latitude coordinates in a variable
|
52731 | * var lngLat = marker.getLngLat();
|
52732 | * // Print the marker's longitude and latitude values in the console
|
52733 | * console.log('Longitude: ' + lngLat.lng + ', Latitude: ' + lngLat.lat )
|
52734 | * @see [Create a draggable Marker](https://maplibre.org/maplibre-gl-js-docs/example/drag-a-marker/)
|
52735 | */
|
52736 | getLngLat() {
|
52737 | return this._lngLat;
|
52738 | }
|
52739 | /**
|
52740 | * Set the marker's geographical position and move it.
|
52741 | * @param {LngLat} lnglat A {@link LngLat} describing where the marker should be located.
|
52742 | * @returns {Marker} `this`
|
52743 | * @example
|
52744 | * // Create a new marker, set the longitude and latitude, and add it to the map
|
52745 | * new maplibregl.Marker()
|
52746 | * .setLngLat([-65.017, -16.457])
|
52747 | * .addTo(map);
|
52748 | * @see [Add custom icons with Markers](https://maplibre.org/maplibre-gl-js-docs/example/custom-marker-icons/)
|
52749 | * @see [Create a draggable Marker](https://maplibre.org/maplibre-gl-js-docs/example/drag-a-marker/)
|
52750 | */
|
52751 | setLngLat(lnglat) {
|
52752 | this._lngLat = performance.LngLat.convert(lnglat);
|
52753 | this._pos = null;
|
52754 | if (this._popup)
|
52755 | this._popup.setLngLat(this._lngLat);
|
52756 | this._update();
|
52757 | return this;
|
52758 | }
|
52759 | /**
|
52760 | * Returns the `Marker`'s HTML element.
|
52761 | * @returns {HTMLElement} element
|
52762 | */
|
52763 | getElement() {
|
52764 | return this._element;
|
52765 | }
|
52766 | /**
|
52767 | * Binds a {@link Popup} to the {@link Marker}.
|
52768 | * @param popup An instance of the {@link Popup} class. If undefined or null, any popup
|
52769 | * set on this {@link Marker} instance is unset.
|
52770 | * @returns {Marker} `this`
|
52771 | * @example
|
52772 | * var marker = new maplibregl.Marker()
|
52773 | * .setLngLat([0, 0])
|
52774 | * .setPopup(new maplibregl.Popup().setHTML("<h1>Hello World!</h1>")) // add popup
|
52775 | * .addTo(map);
|
52776 | * @see [Attach a popup to a marker instance](https://maplibre.org/maplibre-gl-js-docs/example/set-popup/)
|
52777 | */
|
52778 | setPopup(popup) {
|
52779 | if (this._popup) {
|
52780 | this._popup.remove();
|
52781 | this._popup = null;
|
52782 | this._element.removeEventListener('keypress', this._onKeyPress);
|
52783 | if (!this._originalTabIndex) {
|
52784 | this._element.removeAttribute('tabindex');
|
52785 | }
|
52786 | }
|
52787 | if (popup) {
|
52788 | if (!('offset' in popup.options)) {
|
52789 | const markerHeight = 41 - (5.8 / 2);
|
52790 | const markerRadius = 13.5;
|
52791 | const linearOffset = Math.sqrt(Math.pow(markerRadius, 2) / 2);
|
52792 | popup.options.offset = this._defaultMarker ? {
|
52793 | 'top': [0, 0],
|
52794 | 'top-left': [0, 0],
|
52795 | 'top-right': [0, 0],
|
52796 | 'bottom': [0, -markerHeight],
|
52797 | 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1],
|
52798 | 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1],
|
52799 | 'left': [markerRadius, (markerHeight - markerRadius) * -1],
|
52800 | 'right': [-markerRadius, (markerHeight - markerRadius) * -1]
|
52801 | } : this._offset;
|
52802 | }
|
52803 | this._popup = popup;
|
52804 | if (this._lngLat)
|
52805 | this._popup.setLngLat(this._lngLat);
|
52806 | this._originalTabIndex = this._element.getAttribute('tabindex');
|
52807 | if (!this._originalTabIndex) {
|
52808 | this._element.setAttribute('tabindex', '0');
|
52809 | }
|
52810 | this._element.addEventListener('keypress', this._onKeyPress);
|
52811 | }
|
52812 | return this;
|
52813 | }
|
52814 | _onKeyPress(e) {
|
52815 | const code = e.code;
|
52816 | const legacyCode = e.charCode || e.keyCode;
|
52817 | if ((code === 'Space') || (code === 'Enter') ||
|
52818 | (legacyCode === 32) || (legacyCode === 13) // space or enter
|
52819 | ) {
|
52820 | this.togglePopup();
|
52821 | }
|
52822 | }
|
52823 | _onMapClick(e) {
|
52824 | const targetElement = e.originalEvent.target;
|
52825 | const element = this._element;
|
52826 | if (this._popup && (targetElement === element || element.contains(targetElement))) {
|
52827 | this.togglePopup();
|
52828 | }
|
52829 | }
|
52830 | /**
|
52831 | * Returns the {@link Popup} instance that is bound to the {@link Marker}.
|
52832 | * @returns {Popup} popup
|
52833 | * @example
|
52834 | * var marker = new maplibregl.Marker()
|
52835 | * .setLngLat([0, 0])
|
52836 | * .setPopup(new maplibregl.Popup().setHTML("<h1>Hello World!</h1>"))
|
52837 | * .addTo(map);
|
52838 | *
|
52839 | * console.log(marker.getPopup()); // return the popup instance
|
52840 | */
|
52841 | getPopup() {
|
52842 | return this._popup;
|
52843 | }
|
52844 | /**
|
52845 | * Opens or closes the {@link Popup} instance that is bound to the {@link Marker}, depending on the current state of the {@link Popup}.
|
52846 | * @returns {Marker} `this`
|
52847 | * @example
|
52848 | * var marker = new maplibregl.Marker()
|
52849 | * .setLngLat([0, 0])
|
52850 | * .setPopup(new maplibregl.Popup().setHTML("<h1>Hello World!</h1>"))
|
52851 | * .addTo(map);
|
52852 | *
|
52853 | * marker.togglePopup(); // toggle popup open or closed
|
52854 | */
|
52855 | togglePopup() {
|
52856 | const popup = this._popup;
|
52857 | if (!popup)
|
52858 | return this;
|
52859 | else if (popup.isOpen())
|
52860 | popup.remove();
|
52861 | else
|
52862 | popup.addTo(this._map);
|
52863 | return this;
|
52864 | }
|
52865 | _update(e) {
|
52866 | if (!this._map)
|
52867 | return;
|
52868 | if (this._map.transform.renderWorldCopies) {
|
52869 | this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform);
|
52870 | }
|
52871 | this._pos = this._map.project(this._lngLat)._add(this._offset);
|
52872 | let rotation = '';
|
52873 | if (this._rotationAlignment === 'viewport' || this._rotationAlignment === 'auto') {
|
52874 | rotation = `rotateZ(${this._rotation}deg)`;
|
52875 | }
|
52876 | else if (this._rotationAlignment === 'map') {
|
52877 | rotation = `rotateZ(${this._rotation - this._map.getBearing()}deg)`;
|
52878 | }
|
52879 | let pitch = '';
|
52880 | if (this._pitchAlignment === 'viewport' || this._pitchAlignment === 'auto') {
|
52881 | pitch = 'rotateX(0deg)';
|
52882 | }
|
52883 | else if (this._pitchAlignment === 'map') {
|
52884 | pitch = `rotateX(${this._map.getPitch()}deg)`;
|
52885 | }
|
52886 | // because rounding the coordinates at every `move` event causes stuttered zooming
|
52887 | // we only round them when _update is called with `moveend` or when its called with
|
52888 | // no arguments (when the Marker is initialized or Marker#setLngLat is invoked).
|
52889 | if (!e || e.type === 'moveend') {
|
52890 | this._pos = this._pos.round();
|
52891 | }
|
52892 | DOM.setTransform(this._element, `${anchorTranslate[this._anchor]} translate(${this._pos.x}px, ${this._pos.y}px) ${pitch} ${rotation}`);
|
52893 | }
|
52894 | /**
|
52895 | * Get the marker's offset.
|
52896 | * @returns {Point} The marker's screen coordinates in pixels.
|
52897 | */
|
52898 | getOffset() {
|
52899 | return this._offset;
|
52900 | }
|
52901 | /**
|
52902 | * Sets the offset of the marker
|
52903 | * @param {PointLike} offset The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up.
|
52904 | * @returns {Marker} `this`
|
52905 | */
|
52906 | setOffset(offset) {
|
52907 | this._offset = performance.pointGeometry.convert(offset);
|
52908 | this._update();
|
52909 | return this;
|
52910 | }
|
52911 | _onMove(e) {
|
52912 | if (!this._isDragging) {
|
52913 | const clickTolerance = this._clickTolerance || this._map._clickTolerance;
|
52914 | this._isDragging = e.point.dist(this._pointerdownPos) >= clickTolerance;
|
52915 | }
|
52916 | if (!this._isDragging)
|
52917 | return;
|
52918 | this._pos = e.point.sub(this._positionDelta);
|
52919 | this._lngLat = this._map.unproject(this._pos);
|
52920 | this.setLngLat(this._lngLat);
|
52921 | // suppress click event so that popups don't toggle on drag
|
52922 | this._element.style.pointerEvents = 'none';
|
52923 | // make sure dragstart only fires on the first move event after mousedown.
|
52924 | // this can't be on mousedown because that event doesn't necessarily
|
52925 | // imply that a drag is about to happen.
|
52926 | if (this._state === 'pending') {
|
52927 | this._state = 'active';
|
52928 | /**
|
52929 | * Fired when dragging starts
|
52930 | *
|
52931 | * @event dragstart
|
52932 | * @memberof Marker
|
52933 | * @instance
|
52934 | * @type {Object}
|
52935 | * @property {Marker} marker object that is being dragged
|
52936 | */
|
52937 | this.fire(new performance.Event('dragstart'));
|
52938 | }
|
52939 | /**
|
52940 | * Fired while dragging
|
52941 | *
|
52942 | * @event drag
|
52943 | * @memberof Marker
|
52944 | * @instance
|
52945 | * @type {Object}
|
52946 | * @property {Marker} marker object that is being dragged
|
52947 | */
|
52948 | this.fire(new performance.Event('drag'));
|
52949 | }
|
52950 | _onUp() {
|
52951 | // revert to normal pointer event handling
|
52952 | this._element.style.pointerEvents = 'auto';
|
52953 | this._positionDelta = null;
|
52954 | this._pointerdownPos = null;
|
52955 | this._isDragging = false;
|
52956 | this._map.off('mousemove', this._onMove);
|
52957 | this._map.off('touchmove', this._onMove);
|
52958 | // only fire dragend if it was preceded by at least one drag event
|
52959 | if (this._state === 'active') {
|
52960 | /**
|
52961 | * Fired when the marker is finished being dragged
|
52962 | *
|
52963 | * @event dragend
|
52964 | * @memberof Marker
|
52965 | * @instance
|
52966 | * @type {Object}
|
52967 | * @property {Marker} marker object that was dragged
|
52968 | */
|
52969 | this.fire(new performance.Event('dragend'));
|
52970 | }
|
52971 | this._state = 'inactive';
|
52972 | }
|
52973 | _addDragHandler(e) {
|
52974 | if (this._element.contains(e.originalEvent.target)) {
|
52975 | e.preventDefault();
|
52976 | // We need to calculate the pixel distance between the click point
|
52977 | // and the marker position, with the offset accounted for. Then we
|
52978 | // can subtract this distance from the mousemove event's position
|
52979 | // to calculate the new marker position.
|
52980 | // If we don't do this, the marker 'jumps' to the click position
|
52981 | // creating a jarring UX effect.
|
52982 | this._positionDelta = e.point.sub(this._pos).add(this._offset);
|
52983 | this._pointerdownPos = e.point;
|
52984 | this._state = 'pending';
|
52985 | this._map.on('mousemove', this._onMove);
|
52986 | this._map.on('touchmove', this._onMove);
|
52987 | this._map.once('mouseup', this._onUp);
|
52988 | this._map.once('touchend', this._onUp);
|
52989 | }
|
52990 | }
|
52991 | /**
|
52992 | * Sets the `draggable` property and functionality of the marker
|
52993 | * @param {boolean} [shouldBeDraggable=false] Turns drag functionality on/off
|
52994 | * @returns {Marker} `this`
|
52995 | */
|
52996 | setDraggable(shouldBeDraggable) {
|
52997 | this._draggable = !!shouldBeDraggable; // convert possible undefined value to false
|
52998 | // handle case where map may not exist yet
|
52999 | // e.g. when setDraggable is called before addTo
|
53000 | if (this._map) {
|
53001 | if (shouldBeDraggable) {
|
53002 | this._map.on('mousedown', this._addDragHandler);
|
53003 | this._map.on('touchstart', this._addDragHandler);
|
53004 | }
|
53005 | else {
|
53006 | this._map.off('mousedown', this._addDragHandler);
|
53007 | this._map.off('touchstart', this._addDragHandler);
|
53008 | }
|
53009 | }
|
53010 | return this;
|
53011 | }
|
53012 | /**
|
53013 | * Returns true if the marker can be dragged
|
53014 | * @returns {boolean} True if the marker is draggable.
|
53015 | */
|
53016 | isDraggable() {
|
53017 | return this._draggable;
|
53018 | }
|
53019 | /**
|
53020 | * Sets the `rotation` property of the marker.
|
53021 | * @param {number} [rotation=0] The rotation angle of the marker (clockwise, in degrees), relative to its respective {@link Marker#setRotationAlignment} setting.
|
53022 | * @returns {Marker} `this`
|
53023 | */
|
53024 | setRotation(rotation) {
|
53025 | this._rotation = rotation || 0;
|
53026 | this._update();
|
53027 | return this;
|
53028 | }
|
53029 | /**
|
53030 | * Returns the current rotation angle of the marker (in degrees).
|
53031 | * @returns {number} The current rotation angle of the marker.
|
53032 | */
|
53033 | getRotation() {
|
53034 | return this._rotation;
|
53035 | }
|
53036 | /**
|
53037 | * Sets the `rotationAlignment` property of the marker.
|
53038 | * @param {string} [alignment='auto'] Sets the `rotationAlignment` property of the marker.
|
53039 | * @returns {Marker} `this`
|
53040 | */
|
53041 | setRotationAlignment(alignment) {
|
53042 | this._rotationAlignment = alignment || 'auto';
|
53043 | this._update();
|
53044 | return this;
|
53045 | }
|
53046 | /**
|
53047 | * Returns the current `rotationAlignment` property of the marker.
|
53048 | * @returns {string} The current rotational alignment of the marker.
|
53049 | */
|
53050 | getRotationAlignment() {
|
53051 | return this._rotationAlignment;
|
53052 | }
|
53053 | /**
|
53054 | * Sets the `pitchAlignment` property of the marker.
|
53055 | * @param {string} [alignment] Sets the `pitchAlignment` property of the marker. If alignment is 'auto', it will automatically match `rotationAlignment`.
|
53056 | * @returns {Marker} `this`
|
53057 | */
|
53058 | setPitchAlignment(alignment) {
|
53059 | this._pitchAlignment = alignment && alignment !== 'auto' ? alignment : this._rotationAlignment;
|
53060 | this._update();
|
53061 | return this;
|
53062 | }
|
53063 | /**
|
53064 | * Returns the current `pitchAlignment` property of the marker.
|
53065 | * @returns {string} The current pitch alignment of the marker in degrees.
|
53066 | */
|
53067 | getPitchAlignment() {
|
53068 | return this._pitchAlignment;
|
53069 | }
|
53070 | }
|
53071 |
|
53072 | const defaultOptions$2 = {
|
53073 | positionOptions: {
|
53074 | enableHighAccuracy: false,
|
53075 | maximumAge: 0,
|
53076 | timeout: 6000 /* 6 sec */
|
53077 | },
|
53078 | fitBoundsOptions: {
|
53079 | maxZoom: 15
|
53080 | },
|
53081 | trackUserLocation: false,
|
53082 | showAccuracyCircle: true,
|
53083 | showUserLocation: true
|
53084 | };
|
53085 | let supportsGeolocation;
|
53086 | function checkGeolocationSupport(callback) {
|
53087 | if (supportsGeolocation !== undefined) {
|
53088 | callback(supportsGeolocation);
|
53089 | }
|
53090 | else if (window.navigator.permissions !== undefined) {
|
53091 | // navigator.permissions has incomplete browser support
|
53092 | // http://caniuse.com/#feat=permissions-api
|
53093 | // Test for the case where a browser disables Geolocation because of an
|
53094 | // insecure origin
|
53095 | window.navigator.permissions.query({ name: 'geolocation' }).then((p) => {
|
53096 | supportsGeolocation = p.state !== 'denied';
|
53097 | callback(supportsGeolocation);
|
53098 | });
|
53099 | }
|
53100 | else {
|
53101 | supportsGeolocation = !!window.navigator.geolocation;
|
53102 | callback(supportsGeolocation);
|
53103 | }
|
53104 | }
|
53105 | let numberOfWatches = 0;
|
53106 | let noTimeout = false;
|
53107 | /**
|
53108 | * A `GeolocateControl` control provides a button that uses the browser's geolocation
|
53109 | * API to locate the user on the map.
|
53110 | *
|
53111 | * Not all browsers support geolocation,
|
53112 | * and some users may disable the feature. Geolocation support for modern
|
53113 | * browsers including Chrome requires sites to be served over HTTPS. If
|
53114 | * geolocation support is not available, the GeolocateControl will show
|
53115 | * as disabled.
|
53116 | *
|
53117 | * The zoom level applied will depend on the accuracy of the geolocation provided by the device.
|
53118 | *
|
53119 | * The GeolocateControl has two modes. If `trackUserLocation` is `false` (default) the control acts as a button, which when pressed will set the map's camera to target the user location. If the user moves, the map won't update. This is most suited for the desktop. If `trackUserLocation` is `true` the control acts as a toggle button that when active the user's location is actively monitored for changes. In this mode the GeolocateControl has three interaction states:
|
53120 | * * active - the map's camera automatically updates as the user's location changes, keeping the location dot in the center. Initial state and upon clicking the `GeolocateControl` button.
|
53121 | * * passive - the user's location dot automatically updates, but the map's camera does not. Occurs upon the user initiating a map movement.
|
53122 | * * disabled - occurs if Geolocation is not available, disabled or denied.
|
53123 | *
|
53124 | * These interaction states can't be controlled programmatically, rather they are set based on user interactions.
|
53125 | *
|
53126 | * @implements {IControl}
|
53127 | * @param {Object} [options]
|
53128 | * @param {Object} [options.positionOptions={enableHighAccuracy: false, timeout: 6000}] A Geolocation API [PositionOptions](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions) object.
|
53129 | * @param {Object} [options.fitBoundsOptions={maxZoom: 15}] A {@link Map#fitBounds} options object to use when the map is panned and zoomed to the user's location. The default is to use a `maxZoom` of 15 to limit how far the map will zoom in for very accurate locations.
|
53130 | * @param {Object} [options.trackUserLocation=false] If `true` the Geolocate Control becomes a toggle button and when active the map will receive updates to the user's location as it changes.
|
53131 | * @param {Object} [options.showAccuracyCircle=true] By default, if showUserLocation is `true`, a transparent circle will be drawn around the user location indicating the accuracy (95% confidence level) of the user's location. Set to `false` to disable. Always disabled when showUserLocation is `false`.
|
53132 | * @param {Object} [options.showUserLocation=true] By default a dot will be shown on the map at the user's location. Set to `false` to disable.
|
53133 | *
|
53134 | * @example
|
53135 | * map.addControl(new maplibregl.GeolocateControl({
|
53136 | * positionOptions: {
|
53137 | * enableHighAccuracy: true
|
53138 | * },
|
53139 | * trackUserLocation: true
|
53140 | * }));
|
53141 | * @see [Locate the user](https://maplibre.org/maplibre-gl-js-docs/example/locate-user/)
|
53142 | */
|
53143 | class GeolocateControl extends performance.Evented {
|
53144 | constructor(options) {
|
53145 | super();
|
53146 | this.options = performance.extend({}, defaultOptions$2, options);
|
53147 | performance.bindAll([
|
53148 | '_onSuccess',
|
53149 | '_onError',
|
53150 | '_onZoom',
|
53151 | '_finish',
|
53152 | '_setupUI',
|
53153 | '_updateCamera',
|
53154 | '_updateMarker'
|
53155 | ], this);
|
53156 | }
|
53157 | onAdd(map) {
|
53158 | this._map = map;
|
53159 | this._container = DOM.create('div', 'maplibregl-ctrl maplibregl-ctrl-group mapboxgl-ctrl mapboxgl-ctrl-group');
|
53160 | checkGeolocationSupport(this._setupUI);
|
53161 | return this._container;
|
53162 | }
|
53163 | onRemove() {
|
53164 | // clear the geolocation watch if exists
|
53165 | if (this._geolocationWatchID !== undefined) {
|
53166 | window.navigator.geolocation.clearWatch(this._geolocationWatchID);
|
53167 | this._geolocationWatchID = undefined;
|
53168 | }
|
53169 | // clear the markers from the map
|
53170 | if (this.options.showUserLocation && this._userLocationDotMarker) {
|
53171 | this._userLocationDotMarker.remove();
|
53172 | }
|
53173 | if (this.options.showAccuracyCircle && this._accuracyCircleMarker) {
|
53174 | this._accuracyCircleMarker.remove();
|
53175 | }
|
53176 | DOM.remove(this._container);
|
53177 | this._map.off('zoom', this._onZoom);
|
53178 | this._map = undefined;
|
53179 | numberOfWatches = 0;
|
53180 | noTimeout = false;
|
53181 | }
|
53182 | /**
|
53183 | * Check if the Geolocation API Position is outside the map's maxbounds.
|
53184 | *
|
53185 | * @param {Position} position the Geolocation API Position
|
53186 | * @returns {boolean} Returns `true` if position is outside the map's maxbounds, otherwise returns `false`.
|
53187 | * @private
|
53188 | */
|
53189 | _isOutOfMapMaxBounds(position) {
|
53190 | const bounds = this._map.getMaxBounds();
|
53191 | const coordinates = position.coords;
|
53192 | return bounds && (coordinates.longitude < bounds.getWest() ||
|
53193 | coordinates.longitude > bounds.getEast() ||
|
53194 | coordinates.latitude < bounds.getSouth() ||
|
53195 | coordinates.latitude > bounds.getNorth());
|
53196 | }
|
53197 | _setErrorState() {
|
53198 | switch (this._watchState) {
|
53199 | case 'WAITING_ACTIVE':
|
53200 | this._watchState = 'ACTIVE_ERROR';
|
53201 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
|
53202 | this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-active-error', 'mapboxgl-ctrl-geolocate-active-error');
|
53203 | break;
|
53204 | case 'ACTIVE_LOCK':
|
53205 | this._watchState = 'ACTIVE_ERROR';
|
53206 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
|
53207 | this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-active-error', 'mapboxgl-ctrl-geolocate-active-error');
|
53208 | this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
|
53209 | // turn marker grey
|
53210 | break;
|
53211 | case 'BACKGROUND':
|
53212 | this._watchState = 'BACKGROUND_ERROR';
|
53213 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background', 'mapboxgl-ctrl-geolocate-background');
|
53214 | this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-background-error', 'mapboxgl-ctrl-geolocate-background-error');
|
53215 | this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
|
53216 | // turn marker grey
|
53217 | break;
|
53218 | case 'ACTIVE_ERROR':
|
53219 | break;
|
53220 | default:
|
53221 | performance.assert(false, `Unexpected watchState ${this._watchState}`);
|
53222 | }
|
53223 | }
|
53224 | /**
|
53225 | * When the Geolocation API returns a new location, update the GeolocateControl.
|
53226 | *
|
53227 | * @param {Position} position the Geolocation API Position
|
53228 | * @private
|
53229 | */
|
53230 | _onSuccess(position) {
|
53231 | if (!this._map) {
|
53232 | // control has since been removed
|
53233 | return;
|
53234 | }
|
53235 | if (this._isOutOfMapMaxBounds(position)) {
|
53236 | this._setErrorState();
|
53237 | this.fire(new performance.Event('outofmaxbounds', position));
|
53238 | this._updateMarker();
|
53239 | this._finish();
|
53240 | return;
|
53241 | }
|
53242 | if (this.options.trackUserLocation) {
|
53243 | // keep a record of the position so that if the state is BACKGROUND and the user
|
53244 | // clicks the button, we can move to ACTIVE_LOCK immediately without waiting for
|
53245 | // watchPosition to trigger _onSuccess
|
53246 | this._lastKnownPosition = position;
|
53247 | switch (this._watchState) {
|
53248 | case 'WAITING_ACTIVE':
|
53249 | case 'ACTIVE_LOCK':
|
53250 | case 'ACTIVE_ERROR':
|
53251 | this._watchState = 'ACTIVE_LOCK';
|
53252 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
|
53253 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active-error', 'mapboxgl-ctrl-geolocate-active-error');
|
53254 | this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
|
53255 | break;
|
53256 | case 'BACKGROUND':
|
53257 | case 'BACKGROUND_ERROR':
|
53258 | this._watchState = 'BACKGROUND';
|
53259 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
|
53260 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background-error', 'mapboxgl-ctrl-geolocate-background-error');
|
53261 | this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-background', 'mapboxgl-ctrl-geolocate-background');
|
53262 | break;
|
53263 | default:
|
53264 | performance.assert(false, `Unexpected watchState ${this._watchState}`);
|
53265 | }
|
53266 | }
|
53267 | // if showUserLocation and the watch state isn't off then update the marker location
|
53268 | if (this.options.showUserLocation && this._watchState !== 'OFF') {
|
53269 | this._updateMarker(position);
|
53270 | }
|
53271 | // if in normal mode (not watch mode), or if in watch mode and the state is active watch
|
53272 | // then update the camera
|
53273 | if (!this.options.trackUserLocation || this._watchState === 'ACTIVE_LOCK') {
|
53274 | this._updateCamera(position);
|
53275 | }
|
53276 | if (this.options.showUserLocation) {
|
53277 | this._dotElement.classList.remove('maplibregl-user-location-dot-stale', 'mapboxgl-user-location-dot-stale');
|
53278 | }
|
53279 | this.fire(new performance.Event('geolocate', position));
|
53280 | this._finish();
|
53281 | }
|
53282 | /**
|
53283 | * Update the camera location to center on the current position
|
53284 | *
|
53285 | * @param {Position} position the Geolocation API Position
|
53286 | * @private
|
53287 | */
|
53288 | _updateCamera(position) {
|
53289 | const center = new performance.LngLat(position.coords.longitude, position.coords.latitude);
|
53290 | const radius = position.coords.accuracy;
|
53291 | const bearing = this._map.getBearing();
|
53292 | const options = performance.extend({ bearing }, this.options.fitBoundsOptions);
|
53293 | this._map.fitBounds(center.toBounds(radius), options, {
|
53294 | geolocateSource: true // tag this camera change so it won't cause the control to change to background state
|
53295 | });
|
53296 | }
|
53297 | /**
|
53298 | * Update the user location dot Marker to the current position
|
53299 | *
|
53300 | * @param {Position} [position] the Geolocation API Position
|
53301 | * @private
|
53302 | */
|
53303 | _updateMarker(position) {
|
53304 | if (position) {
|
53305 | const center = new performance.LngLat(position.coords.longitude, position.coords.latitude);
|
53306 | this._accuracyCircleMarker.setLngLat(center).addTo(this._map);
|
53307 | this._userLocationDotMarker.setLngLat(center).addTo(this._map);
|
53308 | this._accuracy = position.coords.accuracy;
|
53309 | if (this.options.showUserLocation && this.options.showAccuracyCircle) {
|
53310 | this._updateCircleRadius();
|
53311 | }
|
53312 | }
|
53313 | else {
|
53314 | this._userLocationDotMarker.remove();
|
53315 | this._accuracyCircleMarker.remove();
|
53316 | }
|
53317 | }
|
53318 | _updateCircleRadius() {
|
53319 | performance.assert(this._circleElement);
|
53320 | const y = this._map._container.clientHeight / 2;
|
53321 | const a = this._map.unproject([0, y]);
|
53322 | const b = this._map.unproject([1, y]);
|
53323 | const metersPerPixel = a.distanceTo(b);
|
53324 | const circleDiameter = Math.ceil(2.0 * this._accuracy / metersPerPixel);
|
53325 | this._circleElement.style.width = `${circleDiameter}px`;
|
53326 | this._circleElement.style.height = `${circleDiameter}px`;
|
53327 | }
|
53328 | _onZoom() {
|
53329 | if (this.options.showUserLocation && this.options.showAccuracyCircle) {
|
53330 | this._updateCircleRadius();
|
53331 | }
|
53332 | }
|
53333 | _onError(error) {
|
53334 | if (!this._map) {
|
53335 | // control has since been removed
|
53336 | return;
|
53337 | }
|
53338 | if (this.options.trackUserLocation) {
|
53339 | if (error.code === 1) {
|
53340 | // PERMISSION_DENIED
|
53341 | this._watchState = 'OFF';
|
53342 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
|
53343 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
|
53344 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active-error', 'mapboxgl-ctrl-geolocate-active-error');
|
53345 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background', 'mapboxgl-ctrl-geolocate-background');
|
53346 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background-error', 'mapboxgl-ctrl-geolocate-background-error');
|
53347 | this._geolocateButton.disabled = true;
|
53348 | const title = this._map._getUIString('GeolocateControl.LocationNotAvailable');
|
53349 | this._geolocateButton.title = title;
|
53350 | this._geolocateButton.setAttribute('aria-label', title);
|
53351 | if (this._geolocationWatchID !== undefined) {
|
53352 | this._clearWatch();
|
53353 | }
|
53354 | }
|
53355 | else if (error.code === 3 && noTimeout) {
|
53356 | // this represents a forced error state
|
53357 | // this was triggered to force immediate geolocation when a watch is already present
|
53358 | // see https://github.com/mapbox/mapbox-gl-js/issues/8214
|
53359 | // and https://w3c.github.io/geolocation-api/#example-5-forcing-the-user-agent-to-return-a-fresh-cached-position
|
53360 | return;
|
53361 | }
|
53362 | else {
|
53363 | this._setErrorState();
|
53364 | }
|
53365 | }
|
53366 | if (this._watchState !== 'OFF' && this.options.showUserLocation) {
|
53367 | this._dotElement.classList.add('maplibregl-user-location-dot-stale', 'mapboxgl-user-location-dot-stale');
|
53368 | }
|
53369 | this.fire(new performance.Event('error', error));
|
53370 | this._finish();
|
53371 | }
|
53372 | _finish() {
|
53373 | if (this._timeoutId) {
|
53374 | clearTimeout(this._timeoutId);
|
53375 | }
|
53376 | this._timeoutId = undefined;
|
53377 | }
|
53378 | _setupUI(supported) {
|
53379 | this._container.addEventListener('contextmenu', (e) => e.preventDefault());
|
53380 | this._geolocateButton = DOM.create('button', 'maplibregl-ctrl-geolocate mapboxgl-ctrl-geolocate', this._container);
|
53381 | DOM.create('span', 'maplibregl-ctrl-icon mapboxgl-ctrl-icon', this._geolocateButton).setAttribute('aria-hidden', 'true');
|
53382 | this._geolocateButton.type = 'button';
|
53383 | if (supported === false) {
|
53384 | performance.warnOnce('Geolocation support is not available so the GeolocateControl will be disabled.');
|
53385 | const title = this._map._getUIString('GeolocateControl.LocationNotAvailable');
|
53386 | this._geolocateButton.disabled = true;
|
53387 | this._geolocateButton.title = title;
|
53388 | this._geolocateButton.setAttribute('aria-label', title);
|
53389 | }
|
53390 | else {
|
53391 | const title = this._map._getUIString('GeolocateControl.FindMyLocation');
|
53392 | this._geolocateButton.title = title;
|
53393 | this._geolocateButton.setAttribute('aria-label', title);
|
53394 | }
|
53395 | if (this.options.trackUserLocation) {
|
53396 | this._geolocateButton.setAttribute('aria-pressed', 'false');
|
53397 | this._watchState = 'OFF';
|
53398 | }
|
53399 | // when showUserLocation is enabled, keep the Geolocate button disabled until the device location marker is setup on the map
|
53400 | if (this.options.showUserLocation) {
|
53401 | this._dotElement = DOM.create('div', 'maplibregl-user-location-dot mapboxgl-user-location-dot');
|
53402 | this._userLocationDotMarker = new Marker(this._dotElement);
|
53403 | this._circleElement = DOM.create('div', 'maplibregl-user-location-accuracy-circle mapboxgl-user-location-accuracy-circle');
|
53404 | this._accuracyCircleMarker = new Marker({ element: this._circleElement, pitchAlignment: 'map' });
|
53405 | if (this.options.trackUserLocation)
|
53406 | this._watchState = 'OFF';
|
53407 | this._map.on('zoom', this._onZoom);
|
53408 | }
|
53409 | this._geolocateButton.addEventListener('click', this.trigger.bind(this));
|
53410 | this._setup = true;
|
53411 | // when the camera is changed (and it's not as a result of the Geolocation Control) change
|
53412 | // the watch mode to background watch, so that the marker is updated but not the camera.
|
53413 | if (this.options.trackUserLocation) {
|
53414 | this._map.on('movestart', (event) => {
|
53415 | const fromResize = event.originalEvent && event.originalEvent.type === 'resize';
|
53416 | if (!event.geolocateSource && this._watchState === 'ACTIVE_LOCK' && !fromResize) {
|
53417 | this._watchState = 'BACKGROUND';
|
53418 | this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-background', 'mapboxgl-ctrl-geolocate-background');
|
53419 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
|
53420 | this.fire(new performance.Event('trackuserlocationend'));
|
53421 | }
|
53422 | });
|
53423 | }
|
53424 | }
|
53425 | /**
|
53426 | * Programmatically request and move the map to the user's location.
|
53427 | *
|
53428 | * @returns {boolean} Returns `false` if called before control was added to a map, otherwise returns `true`.
|
53429 | * @example
|
53430 | * // Initialize the geolocate control.
|
53431 | * var geolocate = new maplibregl.GeolocateControl({
|
53432 | * positionOptions: {
|
53433 | * enableHighAccuracy: true
|
53434 | * },
|
53435 | * trackUserLocation: true
|
53436 | * });
|
53437 | * // Add the control to the map.
|
53438 | * map.addControl(geolocate);
|
53439 | * map.on('load', function() {
|
53440 | * geolocate.trigger();
|
53441 | * });
|
53442 | */
|
53443 | trigger() {
|
53444 | if (!this._setup) {
|
53445 | performance.warnOnce('Geolocate control triggered before added to a map');
|
53446 | return false;
|
53447 | }
|
53448 | if (this.options.trackUserLocation) {
|
53449 | // update watchState and do any outgoing state cleanup
|
53450 | switch (this._watchState) {
|
53451 | case 'OFF':
|
53452 | // turn on the Geolocate Control
|
53453 | this._watchState = 'WAITING_ACTIVE';
|
53454 | this.fire(new performance.Event('trackuserlocationstart'));
|
53455 | break;
|
53456 | case 'WAITING_ACTIVE':
|
53457 | case 'ACTIVE_LOCK':
|
53458 | case 'ACTIVE_ERROR':
|
53459 | case 'BACKGROUND_ERROR':
|
53460 | // turn off the Geolocate Control
|
53461 | numberOfWatches--;
|
53462 | noTimeout = false;
|
53463 | this._watchState = 'OFF';
|
53464 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
|
53465 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
|
53466 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-active-error', 'mapboxgl-ctrl-geolocate-active-error');
|
53467 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background', 'mapboxgl-ctrl-geolocate-background');
|
53468 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background-error', 'mapboxgl-ctrl-geolocate-background-error');
|
53469 | this.fire(new performance.Event('trackuserlocationend'));
|
53470 | break;
|
53471 | case 'BACKGROUND':
|
53472 | this._watchState = 'ACTIVE_LOCK';
|
53473 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-background', 'mapboxgl-ctrl-geolocate-background');
|
53474 | // set camera to last known location
|
53475 | if (this._lastKnownPosition)
|
53476 | this._updateCamera(this._lastKnownPosition);
|
53477 | this.fire(new performance.Event('trackuserlocationstart'));
|
53478 | break;
|
53479 | default:
|
53480 | performance.assert(false, `Unexpected watchState ${this._watchState}`);
|
53481 | }
|
53482 | // incoming state setup
|
53483 | switch (this._watchState) {
|
53484 | case 'WAITING_ACTIVE':
|
53485 | this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
|
53486 | this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
|
53487 | break;
|
53488 | case 'ACTIVE_LOCK':
|
53489 | this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-active', 'mapboxgl-ctrl-geolocate-active');
|
53490 | break;
|
53491 | case 'OFF':
|
53492 | break;
|
53493 | default:
|
53494 | performance.assert(false, `Unexpected watchState ${this._watchState}`);
|
53495 | }
|
53496 | // manage geolocation.watchPosition / geolocation.clearWatch
|
53497 | if (this._watchState === 'OFF' && this._geolocationWatchID !== undefined) {
|
53498 | // clear watchPosition as we've changed to an OFF state
|
53499 | this._clearWatch();
|
53500 | }
|
53501 | else if (this._geolocationWatchID === undefined) {
|
53502 | // enable watchPosition since watchState is not OFF and there is no watchPosition already running
|
53503 | this._geolocateButton.classList.add('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
|
53504 | this._geolocateButton.setAttribute('aria-pressed', 'true');
|
53505 | numberOfWatches++;
|
53506 | let positionOptions;
|
53507 | if (numberOfWatches > 1) {
|
53508 | positionOptions = { maximumAge: 600000, timeout: 0 };
|
53509 | noTimeout = true;
|
53510 | }
|
53511 | else {
|
53512 | positionOptions = this.options.positionOptions;
|
53513 | noTimeout = false;
|
53514 | }
|
53515 | this._geolocationWatchID = window.navigator.geolocation.watchPosition(this._onSuccess, this._onError, positionOptions);
|
53516 | }
|
53517 | }
|
53518 | else {
|
53519 | window.navigator.geolocation.getCurrentPosition(this._onSuccess, this._onError, this.options.positionOptions);
|
53520 | // This timeout ensures that we still call finish() even if
|
53521 | // the user declines to share their location in Firefox
|
53522 | this._timeoutId = setTimeout(this._finish, 10000 /* 10sec */);
|
53523 | }
|
53524 | return true;
|
53525 | }
|
53526 | _clearWatch() {
|
53527 | window.navigator.geolocation.clearWatch(this._geolocationWatchID);
|
53528 | this._geolocationWatchID = undefined;
|
53529 | this._geolocateButton.classList.remove('maplibregl-ctrl-geolocate-waiting', 'mapboxgl-ctrl-geolocate-waiting');
|
53530 | this._geolocateButton.setAttribute('aria-pressed', 'false');
|
53531 | if (this.options.showUserLocation) {
|
53532 | this._updateMarker(null);
|
53533 | }
|
53534 | }
|
53535 | }
|
53536 | /* Geolocate Control Watch States
|
53537 | * This is the private state of the control.
|
53538 | *
|
53539 | * OFF
|
53540 | * off/inactive
|
53541 | * WAITING_ACTIVE
|
53542 | * Geolocate Control was clicked but still waiting for Geolocation API response with user location
|
53543 | * ACTIVE_LOCK
|
53544 | * Showing the user location as a dot AND tracking the camera to be fixed to their location. If their location changes the map moves to follow.
|
53545 | * ACTIVE_ERROR
|
53546 | * There was en error from the Geolocation API while trying to show and track the user location.
|
53547 | * BACKGROUND
|
53548 | * Showing the user location as a dot but the camera doesn't follow their location as it changes.
|
53549 | * BACKGROUND_ERROR
|
53550 | * There was an error from the Geolocation API while trying to show (but not track) the user location.
|
53551 | */
|
53552 | /**
|
53553 | * Fired on each Geolocation API position update which returned as success.
|
53554 | *
|
53555 | * @event geolocate
|
53556 | * @memberof GeolocateControl
|
53557 | * @instance
|
53558 | * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition).
|
53559 | * @example
|
53560 | * // Initialize the geolocate control.
|
53561 | * var geolocate = new maplibregl.GeolocateControl({
|
53562 | * positionOptions: {
|
53563 | * enableHighAccuracy: true
|
53564 | * },
|
53565 | * trackUserLocation: true
|
53566 | * });
|
53567 | * // Add the control to the map.
|
53568 | * map.addControl(geolocate);
|
53569 | * // Set an event listener that fires
|
53570 | * // when a geolocate event occurs.
|
53571 | * geolocate.on('geolocate', function() {
|
53572 | * console.log('A geolocate event has occurred.')
|
53573 | * });
|
53574 | *
|
53575 | */
|
53576 | /**
|
53577 | * Fired on each Geolocation API position update which returned as an error.
|
53578 | *
|
53579 | * @event error
|
53580 | * @memberof GeolocateControl
|
53581 | * @instance
|
53582 | * @property {PositionError} data The returned [PositionError](https://developer.mozilla.org/en-US/docs/Web/API/PositionError) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition).
|
53583 | * @example
|
53584 | * // Initialize the geolocate control.
|
53585 | * var geolocate = new maplibregl.GeolocateControl({
|
53586 | * positionOptions: {
|
53587 | * enableHighAccuracy: true
|
53588 | * },
|
53589 | * trackUserLocation: true
|
53590 | * });
|
53591 | * // Add the control to the map.
|
53592 | * map.addControl(geolocate);
|
53593 | * // Set an event listener that fires
|
53594 | * // when an error event occurs.
|
53595 | * geolocate.on('error', function() {
|
53596 | * console.log('An error event has occurred.')
|
53597 | * });
|
53598 | *
|
53599 | */
|
53600 | /**
|
53601 | * Fired on each Geolocation API position update which returned as success but user position is out of map maxBounds.
|
53602 | *
|
53603 | * @event outofmaxbounds
|
53604 | * @memberof GeolocateControl
|
53605 | * @instance
|
53606 | * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition).
|
53607 | * @example
|
53608 | * // Initialize the geolocate control.
|
53609 | * var geolocate = new maplibregl.GeolocateControl({
|
53610 | * positionOptions: {
|
53611 | * enableHighAccuracy: true
|
53612 | * },
|
53613 | * trackUserLocation: true
|
53614 | * });
|
53615 | * // Add the control to the map.
|
53616 | * map.addControl(geolocate);
|
53617 | * // Set an event listener that fires
|
53618 | * // when an outofmaxbounds event occurs.
|
53619 | * geolocate.on('outofmaxbounds', function() {
|
53620 | * console.log('An outofmaxbounds event has occurred.')
|
53621 | * });
|
53622 | *
|
53623 | */
|
53624 | /**
|
53625 | * Fired when the Geolocate Control changes to the active lock state, which happens either upon first obtaining a successful Geolocation API position for the user (a geolocate event will follow), or the user clicks the geolocate button when in the background state which uses the last known position to recenter the map and enter active lock state (no geolocate event will follow unless the users's location changes).
|
53626 | *
|
53627 | * @event trackuserlocationstart
|
53628 | * @memberof GeolocateControl
|
53629 | * @instance
|
53630 | * @example
|
53631 | * // Initialize the geolocate control.
|
53632 | * var geolocate = new maplibregl.GeolocateControl({
|
53633 | * positionOptions: {
|
53634 | * enableHighAccuracy: true
|
53635 | * },
|
53636 | * trackUserLocation: true
|
53637 | * });
|
53638 | * // Add the control to the map.
|
53639 | * map.addControl(geolocate);
|
53640 | * // Set an event listener that fires
|
53641 | * // when a trackuserlocationstart event occurs.
|
53642 | * geolocate.on('trackuserlocationstart', function() {
|
53643 | * console.log('A trackuserlocationstart event has occurred.')
|
53644 | * });
|
53645 | *
|
53646 | */
|
53647 | /**
|
53648 | * Fired when the Geolocate Control changes to the background state, which happens when a user changes the camera during an active position lock. This only applies when trackUserLocation is true. In the background state, the dot on the map will update with location updates but the camera will not.
|
53649 | *
|
53650 | * @event trackuserlocationend
|
53651 | * @memberof GeolocateControl
|
53652 | * @instance
|
53653 | * @example
|
53654 | * // Initialize the geolocate control.
|
53655 | * var geolocate = new maplibregl.GeolocateControl({
|
53656 | * positionOptions: {
|
53657 | * enableHighAccuracy: true
|
53658 | * },
|
53659 | * trackUserLocation: true
|
53660 | * });
|
53661 | * // Add the control to the map.
|
53662 | * map.addControl(geolocate);
|
53663 | * // Set an event listener that fires
|
53664 | * // when a trackuserlocationend event occurs.
|
53665 | * geolocate.on('trackuserlocationend', function() {
|
53666 | * console.log('A trackuserlocationend event has occurred.')
|
53667 | * });
|
53668 | *
|
53669 | */
|
53670 |
|
53671 | const defaultOptions$1 = {
|
53672 | maxWidth: 100,
|
53673 | unit: 'metric'
|
53674 | };
|
53675 | /**
|
53676 | * A `ScaleControl` control displays the ratio of a distance on the map to the corresponding distance on the ground.
|
53677 | *
|
53678 | * @implements {IControl}
|
53679 | * @param {Object} [options]
|
53680 | * @param {number} [options.maxWidth='100'] The maximum length of the scale control in pixels.
|
53681 | * @param {string} [options.unit='metric'] Unit of the distance (`'imperial'`, `'metric'` or `'nautical'`).
|
53682 | * @example
|
53683 | * var scale = new maplibregl.ScaleControl({
|
53684 | * maxWidth: 80,
|
53685 | * unit: 'imperial'
|
53686 | * });
|
53687 | * map.addControl(scale);
|
53688 | *
|
53689 | * scale.setUnit('metric');
|
53690 | */
|
53691 | class ScaleControl {
|
53692 | constructor(options) {
|
53693 | this.options = performance.extend({}, defaultOptions$1, options);
|
53694 | performance.bindAll([
|
53695 | '_onMove',
|
53696 | 'setUnit'
|
53697 | ], this);
|
53698 | }
|
53699 | getDefaultPosition() {
|
53700 | return 'bottom-left';
|
53701 | }
|
53702 | _onMove() {
|
53703 | updateScale(this._map, this._container, this.options);
|
53704 | }
|
53705 | onAdd(map) {
|
53706 | this._map = map;
|
53707 | this._container = DOM.create('div', 'maplibregl-ctrl maplibregl-ctrl-scale mapboxgl-ctrl mapboxgl-ctrl-scale', map.getContainer());
|
53708 | this._map.on('move', this._onMove);
|
53709 | this._onMove();
|
53710 | return this._container;
|
53711 | }
|
53712 | onRemove() {
|
53713 | DOM.remove(this._container);
|
53714 | this._map.off('move', this._onMove);
|
53715 | this._map = undefined;
|
53716 | }
|
53717 | /**
|
53718 | * Set the scale's unit of the distance
|
53719 | *
|
53720 | * @param unit Unit of the distance (`'imperial'`, `'metric'` or `'nautical'`).
|
53721 | */
|
53722 | setUnit(unit) {
|
53723 | this.options.unit = unit;
|
53724 | updateScale(this._map, this._container, this.options);
|
53725 | }
|
53726 | }
|
53727 | function updateScale(map, container, options) {
|
53728 | // A horizontal scale is imagined to be present at center of the map
|
53729 | // container with maximum length (Default) as 100px.
|
53730 | // Using spherical law of cosines approximation, the real distance is
|
53731 | // found between the two coordinates.
|
53732 | const maxWidth = options && options.maxWidth || 100;
|
53733 | const y = map._container.clientHeight / 2;
|
53734 | const left = map.unproject([0, y]);
|
53735 | const right = map.unproject([maxWidth, y]);
|
53736 | const maxMeters = left.distanceTo(right);
|
53737 | // The real distance corresponding to 100px scale length is rounded off to
|
53738 | // near pretty number and the scale length for the same is found out.
|
53739 | // Default unit of the scale is based on User's locale.
|
53740 | if (options && options.unit === 'imperial') {
|
53741 | const maxFeet = 3.2808 * maxMeters;
|
53742 | if (maxFeet > 5280) {
|
53743 | const maxMiles = maxFeet / 5280;
|
53744 | setScale(container, maxWidth, maxMiles, map._getUIString('ScaleControl.Miles'));
|
53745 | }
|
53746 | else {
|
53747 | setScale(container, maxWidth, maxFeet, map._getUIString('ScaleControl.Feet'));
|
53748 | }
|
53749 | }
|
53750 | else if (options && options.unit === 'nautical') {
|
53751 | const maxNauticals = maxMeters / 1852;
|
53752 | setScale(container, maxWidth, maxNauticals, map._getUIString('ScaleControl.NauticalMiles'));
|
53753 | }
|
53754 | else if (maxMeters >= 1000) {
|
53755 | setScale(container, maxWidth, maxMeters / 1000, map._getUIString('ScaleControl.Kilometers'));
|
53756 | }
|
53757 | else {
|
53758 | setScale(container, maxWidth, maxMeters, map._getUIString('ScaleControl.Meters'));
|
53759 | }
|
53760 | }
|
53761 | function setScale(container, maxWidth, maxDistance, unit) {
|
53762 | const distance = getRoundNum(maxDistance);
|
53763 | const ratio = distance / maxDistance;
|
53764 | container.style.width = `${maxWidth * ratio}px`;
|
53765 | container.innerHTML = `${distance} ${unit}`;
|
53766 | }
|
53767 | function getDecimalRoundNum(d) {
|
53768 | const multiplier = Math.pow(10, Math.ceil(-Math.log(d) / Math.LN10));
|
53769 | return Math.round(d * multiplier) / multiplier;
|
53770 | }
|
53771 | function getRoundNum(num) {
|
53772 | const pow10 = Math.pow(10, (`${Math.floor(num)}`).length - 1);
|
53773 | let d = num / pow10;
|
53774 | d = d >= 10 ? 10 :
|
53775 | d >= 5 ? 5 :
|
53776 | d >= 3 ? 3 :
|
53777 | d >= 2 ? 2 :
|
53778 | d >= 1 ? 1 : getDecimalRoundNum(d);
|
53779 | return pow10 * d;
|
53780 | }
|
53781 |
|
53782 | /**
|
53783 | * A `FullscreenControl` control contains a button for toggling the map in and out of fullscreen mode.
|
53784 | *
|
53785 | * @implements {IControl}
|
53786 | * @param {Object} [options]
|
53787 | * @param {HTMLElement} [options.container] `container` is the [compatible DOM element](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullScreen#Compatible_elements) which should be made full screen. By default, the map container element will be made full screen.
|
53788 | *
|
53789 | * @example
|
53790 | * map.addControl(new maplibregl.FullscreenControl({container: document.querySelector('body')}));
|
53791 | * @see [View a fullscreen map](https://maplibre.org/maplibre-gl-js-docs/example/fullscreen/)
|
53792 | */
|
53793 | class FullscreenControl {
|
53794 | constructor(options) {
|
53795 | this._fullscreen = false;
|
53796 | if (options && options.container) {
|
53797 | if (options.container instanceof HTMLElement) {
|
53798 | this._container = options.container;
|
53799 | }
|
53800 | else {
|
53801 | performance.warnOnce('Full screen control \'container\' must be a DOM element.');
|
53802 | }
|
53803 | }
|
53804 | performance.bindAll([
|
53805 | '_onClickFullscreen',
|
53806 | '_changeIcon'
|
53807 | ], this);
|
53808 | if ('onfullscreenchange' in document) {
|
53809 | this._fullscreenchange = 'fullscreenchange';
|
53810 | }
|
53811 | else if ('onmozfullscreenchange' in document) {
|
53812 | this._fullscreenchange = 'mozfullscreenchange';
|
53813 | }
|
53814 | else if ('onwebkitfullscreenchange' in document) {
|
53815 | this._fullscreenchange = 'webkitfullscreenchange';
|
53816 | }
|
53817 | else if ('onmsfullscreenchange' in document) {
|
53818 | this._fullscreenchange = 'MSFullscreenChange';
|
53819 | }
|
53820 | }
|
53821 | onAdd(map) {
|
53822 | this._map = map;
|
53823 | if (!this._container)
|
53824 | this._container = this._map.getContainer();
|
53825 | this._controlContainer = DOM.create('div', 'maplibregl-ctrl maplibregl-ctrl-group mapboxgl-ctrl mapboxgl-ctrl-group');
|
53826 | if (this._checkFullscreenSupport()) {
|
53827 | this._setupUI();
|
53828 | }
|
53829 | else {
|
53830 | this._controlContainer.style.display = 'none';
|
53831 | performance.warnOnce('This device does not support fullscreen mode.');
|
53832 | }
|
53833 | return this._controlContainer;
|
53834 | }
|
53835 | onRemove() {
|
53836 | DOM.remove(this._controlContainer);
|
53837 | this._map = null;
|
53838 | window.document.removeEventListener(this._fullscreenchange, this._changeIcon);
|
53839 | }
|
53840 | _checkFullscreenSupport() {
|
53841 | return !!(document.fullscreenEnabled ||
|
53842 | document.mozFullScreenEnabled ||
|
53843 | document.msFullscreenEnabled ||
|
53844 | document.webkitFullscreenEnabled);
|
53845 | }
|
53846 | _setupUI() {
|
53847 | const button = this._fullscreenButton = DOM.create('button', (('maplibregl-ctrl-fullscreen mapboxgl-ctrl-fullscreen')), this._controlContainer);
|
53848 | DOM.create('span', 'maplibregl-ctrl-icon mapboxgl-ctrl-icon', button).setAttribute('aria-hidden', 'true');
|
53849 | button.type = 'button';
|
53850 | this._updateTitle();
|
53851 | this._fullscreenButton.addEventListener('click', this._onClickFullscreen);
|
53852 | window.document.addEventListener(this._fullscreenchange, this._changeIcon);
|
53853 | }
|
53854 | _updateTitle() {
|
53855 | const title = this._getTitle();
|
53856 | this._fullscreenButton.setAttribute('aria-label', title);
|
53857 | this._fullscreenButton.title = title;
|
53858 | }
|
53859 | _getTitle() {
|
53860 | return this._map._getUIString(this._isFullscreen() ? 'FullscreenControl.Exit' : 'FullscreenControl.Enter');
|
53861 | }
|
53862 | _isFullscreen() {
|
53863 | return this._fullscreen;
|
53864 | }
|
53865 | _changeIcon() {
|
53866 | const fullscreenElement = window.document.fullscreenElement ||
|
53867 | window.document.mozFullScreenElement ||
|
53868 | window.document.webkitFullscreenElement ||
|
53869 | window.document.msFullscreenElement;
|
53870 | if ((fullscreenElement === this._container) !== this._fullscreen) {
|
53871 | this._fullscreen = !this._fullscreen;
|
53872 | this._fullscreenButton.classList.toggle('maplibregl-ctrl-shrink');
|
53873 | this._fullscreenButton.classList.toggle('mapboxgl-ctrl-shrink');
|
53874 | this._fullscreenButton.classList.toggle('maplibregl-ctrl-fullscreen');
|
53875 | this._fullscreenButton.classList.toggle('mapboxgl-ctrl-fullscreen');
|
53876 | this._updateTitle();
|
53877 | }
|
53878 | }
|
53879 | _onClickFullscreen() {
|
53880 | if (this._isFullscreen()) {
|
53881 | if (window.document.exitFullscreen) {
|
53882 | window.document.exitFullscreen();
|
53883 | }
|
53884 | else if (window.document.mozCancelFullScreen) {
|
53885 | window.document.mozCancelFullScreen();
|
53886 | }
|
53887 | else if (window.document.msExitFullscreen) {
|
53888 | window.document.msExitFullscreen();
|
53889 | }
|
53890 | else if (window.document.webkitCancelFullScreen) {
|
53891 | window.document.webkitCancelFullScreen();
|
53892 | }
|
53893 | }
|
53894 | else if (this._container.requestFullscreen) {
|
53895 | this._container.requestFullscreen();
|
53896 | }
|
53897 | else if (this._container.mozRequestFullScreen) {
|
53898 | this._container.mozRequestFullScreen();
|
53899 | }
|
53900 | else if (this._container.msRequestFullscreen) {
|
53901 | this._container.msRequestFullscreen();
|
53902 | }
|
53903 | else if (this._container.webkitRequestFullscreen) {
|
53904 | this._container.webkitRequestFullscreen();
|
53905 | }
|
53906 | }
|
53907 | }
|
53908 |
|
53909 | const defaultOptions = {
|
53910 | closeButton: true,
|
53911 | closeOnClick: true,
|
53912 | focusAfterOpen: true,
|
53913 | className: '',
|
53914 | maxWidth: '240px'
|
53915 | };
|
53916 | const focusQuerySelector = [
|
53917 | 'a[href]',
|
53918 | '[tabindex]:not([tabindex=\'-1\'])',
|
53919 | '[contenteditable]:not([contenteditable=\'false\'])',
|
53920 | 'button:not([disabled])',
|
53921 | 'input:not([disabled])',
|
53922 | 'select:not([disabled])',
|
53923 | 'textarea:not([disabled])',
|
53924 | ].join(', ');
|
53925 | /**
|
53926 | * A popup component.
|
53927 | *
|
53928 | * @param {Object} [options]
|
53929 | * @param {boolean} [options.closeButton=true] If `true`, a close button will appear in the
|
53930 | * top right corner of the popup.
|
53931 | * @param {boolean} [options.closeOnClick=true] If `true`, the popup will closed when the
|
53932 | * map is clicked.
|
53933 | * @param {boolean} [options.closeOnMove=false] If `true`, the popup will closed when the
|
53934 | * map moves.
|
53935 | * @param {boolean} [options.focusAfterOpen=true] If `true`, the popup will try to focus the
|
53936 | * first focusable element inside the popup.
|
53937 | * @param {string} [options.anchor] - A string indicating the part of the Popup that should
|
53938 | * be positioned closest to the coordinate set via {@link Popup#setLngLat}.
|
53939 | * Options are `'center'`, `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`,
|
53940 | * `'top-right'`, `'bottom-left'`, and `'bottom-right'`. If unset the anchor will be
|
53941 | * dynamically set to ensure the popup falls within the map container with a preference
|
53942 | * for `'bottom'`.
|
53943 | * @param {number|PointLike|Object} [options.offset] -
|
53944 | * A pixel offset applied to the popup's location specified as:
|
53945 | * - a single number specifying a distance from the popup's location
|
53946 | * - a {@link PointLike} specifying a constant offset
|
53947 | * - an object of {@link Point}s specifing an offset for each anchor position
|
53948 | * Negative offsets indicate left and up.
|
53949 | * @param {string} [options.className] Space-separated CSS class names to add to popup container
|
53950 | * @param {string} [options.maxWidth='240px'] -
|
53951 | * A string that sets the CSS property of the popup's maximum width, eg `'300px'`.
|
53952 | * To ensure the popup resizes to fit its content, set this property to `'none'`.
|
53953 | * Available values can be found here: https://developer.mozilla.org/en-US/docs/Web/CSS/max-width
|
53954 | * @example
|
53955 | * var markerHeight = 50, markerRadius = 10, linearOffset = 25;
|
53956 | * var popupOffsets = {
|
53957 | * 'top': [0, 0],
|
53958 | * 'top-left': [0,0],
|
53959 | * 'top-right': [0,0],
|
53960 | * 'bottom': [0, -markerHeight],
|
53961 | * 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1],
|
53962 | * 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1],
|
53963 | * 'left': [markerRadius, (markerHeight - markerRadius) * -1],
|
53964 | * 'right': [-markerRadius, (markerHeight - markerRadius) * -1]
|
53965 | * };
|
53966 | * var popup = new maplibregl.Popup({offset: popupOffsets, className: 'my-class'})
|
53967 | * .setLngLat(e.lngLat)
|
53968 | * .setHTML("<h1>Hello World!</h1>")
|
53969 | * .setMaxWidth("300px")
|
53970 | * .addTo(map);
|
53971 | * @see [Display a popup](https://maplibre.org/maplibre-gl-js-docs/example/popup/)
|
53972 | * @see [Display a popup on hover](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-hover/)
|
53973 | * @see [Display a popup on click](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-click/)
|
53974 | * @see [Attach a popup to a marker instance](https://maplibre.org/maplibre-gl-js-docs/example/set-popup/)
|
53975 | */
|
53976 | class Popup extends performance.Evented {
|
53977 | constructor(options) {
|
53978 | super();
|
53979 | this.options = performance.extend(Object.create(defaultOptions), options);
|
53980 | performance.bindAll(['_update', '_onClose', 'remove', '_onMouseMove', '_onMouseUp', '_onDrag'], this);
|
53981 | }
|
53982 | /**
|
53983 | * Adds the popup to a map.
|
53984 | *
|
53985 | * @param {Map} map The MapLibre GL JS map to add the popup to.
|
53986 | * @returns {Popup} `this`
|
53987 | * @example
|
53988 | * new maplibregl.Popup()
|
53989 | * .setLngLat([0, 0])
|
53990 | * .setHTML("<h1>Null Island</h1>")
|
53991 | * .addTo(map);
|
53992 | * @see [Display a popup](https://maplibre.org/maplibre-gl-js-docs/example/popup/)
|
53993 | * @see [Display a popup on hover](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-hover/)
|
53994 | * @see [Display a popup on click](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-click/)
|
53995 | * @see [Show polygon information on click](https://maplibre.org/maplibre-gl-js-docs/example/polygon-popup-on-click/)
|
53996 | */
|
53997 | addTo(map) {
|
53998 | if (this._map)
|
53999 | this.remove();
|
54000 | this._map = map;
|
54001 | if (this.options.closeOnClick) {
|
54002 | this._map.on('click', this._onClose);
|
54003 | }
|
54004 | if (this.options.closeOnMove) {
|
54005 | this._map.on('move', this._onClose);
|
54006 | }
|
54007 | this._map.on('remove', this.remove);
|
54008 | this._update();
|
54009 | this._focusFirstElement();
|
54010 | if (this._trackPointer) {
|
54011 | this._map.on('mousemove', this._onMouseMove);
|
54012 | this._map.on('mouseup', this._onMouseUp);
|
54013 | if (this._container) {
|
54014 | this._container.classList.add('maplibregl-popup-track-pointer', 'mapboxgl-popup-track-pointer');
|
54015 | }
|
54016 | this._map._canvasContainer.classList.add('maplibregl-track-pointer', 'mapboxgl-track-pointer');
|
54017 | }
|
54018 | else {
|
54019 | this._map.on('move', this._update);
|
54020 | }
|
54021 | /**
|
54022 | * Fired when the popup is opened manually or programatically.
|
54023 | *
|
54024 | * @event open
|
54025 | * @memberof Popup
|
54026 | * @instance
|
54027 | * @type {Object}
|
54028 | * @property {Popup} popup object that was opened
|
54029 | *
|
54030 | * @example
|
54031 | * // Create a popup
|
54032 | * var popup = new maplibregl.Popup();
|
54033 | * // Set an event listener that will fire
|
54034 | * // any time the popup is opened
|
54035 | * popup.on('open', function(){
|
54036 | * console.log('popup was opened');
|
54037 | * });
|
54038 | *
|
54039 | */
|
54040 | this.fire(new performance.Event('open'));
|
54041 | return this;
|
54042 | }
|
54043 | /**
|
54044 | * @returns {boolean} `true` if the popup is open, `false` if it is closed.
|
54045 | */
|
54046 | isOpen() {
|
54047 | return !!this._map;
|
54048 | }
|
54049 | /**
|
54050 | * Removes the popup from the map it has been added to.
|
54051 | *
|
54052 | * @example
|
54053 | * var popup = new maplibregl.Popup().addTo(map);
|
54054 | * popup.remove();
|
54055 | * @returns {Popup} `this`
|
54056 | */
|
54057 | remove() {
|
54058 | if (this._content) {
|
54059 | DOM.remove(this._content);
|
54060 | }
|
54061 | if (this._container) {
|
54062 | DOM.remove(this._container);
|
54063 | delete this._container;
|
54064 | }
|
54065 | if (this._map) {
|
54066 | this._map.off('move', this._update);
|
54067 | this._map.off('move', this._onClose);
|
54068 | this._map.off('click', this._onClose);
|
54069 | this._map.off('remove', this.remove);
|
54070 | this._map.off('mousemove', this._onMouseMove);
|
54071 | this._map.off('mouseup', this._onMouseUp);
|
54072 | this._map.off('drag', this._onDrag);
|
54073 | delete this._map;
|
54074 | }
|
54075 | /**
|
54076 | * Fired when the popup is closed manually or programatically.
|
54077 | *
|
54078 | * @event close
|
54079 | * @memberof Popup
|
54080 | * @instance
|
54081 | * @type {Object}
|
54082 | * @property {Popup} popup object that was closed
|
54083 | *
|
54084 | * @example
|
54085 | * // Create a popup
|
54086 | * var popup = new maplibregl.Popup();
|
54087 | * // Set an event listener that will fire
|
54088 | * // any time the popup is closed
|
54089 | * popup.on('close', function(){
|
54090 | * console.log('popup was closed');
|
54091 | * });
|
54092 | *
|
54093 | */
|
54094 | this.fire(new performance.Event('close'));
|
54095 | return this;
|
54096 | }
|
54097 | /**
|
54098 | * Returns the geographical location of the popup's anchor.
|
54099 | *
|
54100 | * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously
|
54101 | * set by `setLngLat` because `Popup` wraps the anchor longitude across copies of the world to keep
|
54102 | * the popup on screen.
|
54103 | *
|
54104 | * @returns {LngLat} The geographical location of the popup's anchor.
|
54105 | */
|
54106 | getLngLat() {
|
54107 | return this._lngLat;
|
54108 | }
|
54109 | /**
|
54110 | * Sets the geographical location of the popup's anchor, and moves the popup to it. Replaces trackPointer() behavior.
|
54111 | *
|
54112 | * @param lnglat The geographical location to set as the popup's anchor.
|
54113 | * @returns {Popup} `this`
|
54114 | */
|
54115 | setLngLat(lnglat) {
|
54116 | this._lngLat = performance.LngLat.convert(lnglat);
|
54117 | this._pos = null;
|
54118 | this._trackPointer = false;
|
54119 | this._update();
|
54120 | if (this._map) {
|
54121 | this._map.on('move', this._update);
|
54122 | this._map.off('mousemove', this._onMouseMove);
|
54123 | if (this._container) {
|
54124 | this._container.classList.remove('maplibregl-popup-track-pointer', 'mapboxgl-popup-track-pointer');
|
54125 | }
|
54126 | this._map._canvasContainer.classList.remove('maplibregl-track-pointer', 'mapboxgl-track-pointer');
|
54127 | }
|
54128 | return this;
|
54129 | }
|
54130 | /**
|
54131 | * Tracks the popup anchor to the cursor position on screens with a pointer device (it will be hidden on touchscreens). Replaces the `setLngLat` behavior.
|
54132 | * For most use cases, set `closeOnClick` and `closeButton` to `false`.
|
54133 | * @example
|
54134 | * var popup = new maplibregl.Popup({ closeOnClick: false, closeButton: false })
|
54135 | * .setHTML("<h1>Hello World!</h1>")
|
54136 | * .trackPointer()
|
54137 | * .addTo(map);
|
54138 | * @returns {Popup} `this`
|
54139 | */
|
54140 | trackPointer() {
|
54141 | this._trackPointer = true;
|
54142 | this._pos = null;
|
54143 | this._update();
|
54144 | if (this._map) {
|
54145 | this._map.off('move', this._update);
|
54146 | this._map.on('mousemove', this._onMouseMove);
|
54147 | this._map.on('drag', this._onDrag);
|
54148 | if (this._container) {
|
54149 | this._container.classList.add('maplibregl-popup-track-pointer', 'mapboxgl-popup-track-pointer');
|
54150 | }
|
54151 | this._map._canvasContainer.classList.add('maplibregl-track-pointer', 'mapboxgl-track-pointer');
|
54152 | }
|
54153 | return this;
|
54154 | }
|
54155 | /**
|
54156 | * Returns the `Popup`'s HTML element.
|
54157 | * @example
|
54158 | * // Change the `Popup` element's font size
|
54159 | * var popup = new maplibregl.Popup()
|
54160 | * .setLngLat([-96, 37.8])
|
54161 | * .setHTML("<p>Hello World!</p>")
|
54162 | * .addTo(map);
|
54163 | * var popupElem = popup.getElement();
|
54164 | * popupElem.style.fontSize = "25px";
|
54165 | * @returns {HTMLElement} element
|
54166 | */
|
54167 | getElement() {
|
54168 | return this._container;
|
54169 | }
|
54170 | /**
|
54171 | * Sets the popup's content to a string of text.
|
54172 | *
|
54173 | * This function creates a [Text](https://developer.mozilla.org/en-US/docs/Web/API/Text) node in the DOM,
|
54174 | * so it cannot insert raw HTML. Use this method for security against XSS
|
54175 | * if the popup content is user-provided.
|
54176 | *
|
54177 | * @param text Textual content for the popup.
|
54178 | * @returns {Popup} `this`
|
54179 | * @example
|
54180 | * var popup = new maplibregl.Popup()
|
54181 | * .setLngLat(e.lngLat)
|
54182 | * .setText('Hello, world!')
|
54183 | * .addTo(map);
|
54184 | */
|
54185 | setText(text) {
|
54186 | return this.setDOMContent(document.createTextNode(text));
|
54187 | }
|
54188 | /**
|
54189 | * Sets the popup's content to the HTML provided as a string.
|
54190 | *
|
54191 | * This method does not perform HTML filtering or sanitization, and must be
|
54192 | * used only with trusted content. Consider {@link Popup#setText} if
|
54193 | * the content is an untrusted text string.
|
54194 | *
|
54195 | * @param html A string representing HTML content for the popup.
|
54196 | * @returns {Popup} `this`
|
54197 | * @example
|
54198 | * var popup = new maplibregl.Popup()
|
54199 | * .setLngLat(e.lngLat)
|
54200 | * .setHTML("<h1>Hello World!</h1>")
|
54201 | * .addTo(map);
|
54202 | * @see [Display a popup](https://maplibre.org/maplibre-gl-js-docs/example/popup/)
|
54203 | * @see [Display a popup on hover](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-hover/)
|
54204 | * @see [Display a popup on click](https://maplibre.org/maplibre-gl-js-docs/example/popup-on-click/)
|
54205 | * @see [Attach a popup to a marker instance](https://maplibre.org/maplibre-gl-js-docs/example/set-popup/)
|
54206 | */
|
54207 | setHTML(html) {
|
54208 | const frag = document.createDocumentFragment();
|
54209 | const temp = document.createElement('body');
|
54210 | let child;
|
54211 | temp.innerHTML = html;
|
54212 | while (true) {
|
54213 | child = temp.firstChild;
|
54214 | if (!child)
|
54215 | break;
|
54216 | frag.appendChild(child);
|
54217 | }
|
54218 | return this.setDOMContent(frag);
|
54219 | }
|
54220 | /**
|
54221 | * Returns the popup's maximum width.
|
54222 | *
|
54223 | * @returns {string} The maximum width of the popup.
|
54224 | */
|
54225 | getMaxWidth() {
|
54226 | return this._container && this._container.style.maxWidth;
|
54227 | }
|
54228 | /**
|
54229 | * Sets the popup's maximum width. This is setting the CSS property `max-width`.
|
54230 | * Available values can be found here: https://developer.mozilla.org/en-US/docs/Web/CSS/max-width
|
54231 | *
|
54232 | * @param maxWidth A string representing the value for the maximum width.
|
54233 | * @returns {Popup} `this`
|
54234 | */
|
54235 | setMaxWidth(maxWidth) {
|
54236 | this.options.maxWidth = maxWidth;
|
54237 | this._update();
|
54238 | return this;
|
54239 | }
|
54240 | /**
|
54241 | * Sets the popup's content to the element provided as a DOM node.
|
54242 | *
|
54243 | * @param htmlNode A DOM node to be used as content for the popup.
|
54244 | * @returns {Popup} `this`
|
54245 | * @example
|
54246 | * // create an element with the popup content
|
54247 | * var div = document.createElement('div');
|
54248 | * div.innerHTML = 'Hello, world!';
|
54249 | * var popup = new maplibregl.Popup()
|
54250 | * .setLngLat(e.lngLat)
|
54251 | * .setDOMContent(div)
|
54252 | * .addTo(map);
|
54253 | */
|
54254 | setDOMContent(htmlNode) {
|
54255 | if (this._content) {
|
54256 | // Clear out children first.
|
54257 | while (this._content.hasChildNodes()) {
|
54258 | if (this._content.firstChild) {
|
54259 | this._content.removeChild(this._content.firstChild);
|
54260 | }
|
54261 | }
|
54262 | }
|
54263 | else {
|
54264 | this._content = DOM.create('div', 'maplibregl-popup-content mapboxgl-popup-content', this._container);
|
54265 | }
|
54266 | // The close button should be the last tabbable element inside the popup for a good keyboard UX.
|
54267 | this._content.appendChild(htmlNode);
|
54268 | this._createCloseButton();
|
54269 | this._update();
|
54270 | this._focusFirstElement();
|
54271 | return this;
|
54272 | }
|
54273 | /**
|
54274 | * Adds a CSS class to the popup container element.
|
54275 | *
|
54276 | * @param {string} className Non-empty string with CSS class name to add to popup container
|
54277 | *
|
54278 | * @example
|
54279 | * let popup = new maplibregl.Popup()
|
54280 | * popup.addClassName('some-class')
|
54281 | */
|
54282 | addClassName(className) {
|
54283 | if (this._container) {
|
54284 | this._container.classList.add(className);
|
54285 | }
|
54286 | }
|
54287 | /**
|
54288 | * Removes a CSS class from the popup container element.
|
54289 | *
|
54290 | * @param {string} className Non-empty string with CSS class name to remove from popup container
|
54291 | *
|
54292 | * @example
|
54293 | * let popup = new maplibregl.Popup()
|
54294 | * popup.removeClassName('some-class')
|
54295 | */
|
54296 | removeClassName(className) {
|
54297 | if (this._container) {
|
54298 | this._container.classList.remove(className);
|
54299 | }
|
54300 | }
|
54301 | /**
|
54302 | * Sets the popup's offset.
|
54303 | *
|
54304 | * @param offset Sets the popup's offset.
|
54305 | * @returns {Popup} `this`
|
54306 | */
|
54307 | setOffset(offset) {
|
54308 | this.options.offset = offset;
|
54309 | this._update();
|
54310 | return this;
|
54311 | }
|
54312 | /**
|
54313 | * Add or remove the given CSS class on the popup container, depending on whether the container currently has that class.
|
54314 | *
|
54315 | * @param {string} className Non-empty string with CSS class name to add/remove
|
54316 | *
|
54317 | * @returns {boolean} if the class was removed return false, if class was added, then return true
|
54318 | *
|
54319 | * @example
|
54320 | * let popup = new maplibregl.Popup()
|
54321 | * popup.toggleClassName('toggleClass')
|
54322 | */
|
54323 | toggleClassName(className) {
|
54324 | if (this._container) {
|
54325 | return this._container.classList.toggle(className);
|
54326 | }
|
54327 | }
|
54328 | _createCloseButton() {
|
54329 | if (this.options.closeButton) {
|
54330 | this._closeButton = DOM.create('button', 'maplibregl-popup-close-button mapboxgl-popup-close-button', this._content);
|
54331 | this._closeButton.type = 'button';
|
54332 | this._closeButton.setAttribute('aria-label', 'Close popup');
|
54333 | this._closeButton.innerHTML = '×';
|
54334 | this._closeButton.addEventListener('click', this._onClose);
|
54335 | }
|
54336 | }
|
54337 | _onMouseUp(event) {
|
54338 | this._update(event.point);
|
54339 | }
|
54340 | _onMouseMove(event) {
|
54341 | this._update(event.point);
|
54342 | }
|
54343 | _onDrag(event) {
|
54344 | this._update(event.point);
|
54345 | }
|
54346 | _update(cursor) {
|
54347 | const hasPosition = this._lngLat || this._trackPointer;
|
54348 | if (!this._map || !hasPosition || !this._content) {
|
54349 | return;
|
54350 | }
|
54351 | if (!this._container) {
|
54352 | this._container = DOM.create('div', 'maplibregl-popup mapboxgl-popup', this._map.getContainer());
|
54353 | this._tip = DOM.create('div', 'maplibregl-popup-tip mapboxgl-popup-tip', this._container);
|
54354 | this._container.appendChild(this._content);
|
54355 | if (this.options.className) {
|
54356 | this.options.className.split(' ').forEach(name => this._container.classList.add(name));
|
54357 | }
|
54358 | if (this._trackPointer) {
|
54359 | this._container.classList.add('maplibregl-popup-track-pointer', 'mapboxgl-popup-track-pointer');
|
54360 | }
|
54361 | }
|
54362 | if (this.options.maxWidth && this._container.style.maxWidth !== this.options.maxWidth) {
|
54363 | this._container.style.maxWidth = this.options.maxWidth;
|
54364 | }
|
54365 | if (this._map.transform.renderWorldCopies && !this._trackPointer) {
|
54366 | this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform);
|
54367 | }
|
54368 | if (this._trackPointer && !cursor)
|
54369 | return;
|
54370 | const pos = this._pos = this._trackPointer && cursor ? cursor : this._map.project(this._lngLat);
|
54371 | let anchor = this.options.anchor;
|
54372 | const offset = normalizeOffset(this.options.offset);
|
54373 | if (!anchor) {
|
54374 | const width = this._container.offsetWidth;
|
54375 | const height = this._container.offsetHeight;
|
54376 | let anchorComponents;
|
54377 | if (pos.y + offset.bottom.y < height) {
|
54378 | anchorComponents = ['top'];
|
54379 | }
|
54380 | else if (pos.y > this._map.transform.height - height) {
|
54381 | anchorComponents = ['bottom'];
|
54382 | }
|
54383 | else {
|
54384 | anchorComponents = [];
|
54385 | }
|
54386 | if (pos.x < width / 2) {
|
54387 | anchorComponents.push('left');
|
54388 | }
|
54389 | else if (pos.x > this._map.transform.width - width / 2) {
|
54390 | anchorComponents.push('right');
|
54391 | }
|
54392 | if (anchorComponents.length === 0) {
|
54393 | anchor = 'bottom';
|
54394 | }
|
54395 | else {
|
54396 | anchor = anchorComponents.join('-');
|
54397 | }
|
54398 | }
|
54399 | const offsetedPos = pos.add(offset[anchor]).round();
|
54400 | DOM.setTransform(this._container, `${anchorTranslate[anchor]} translate(${offsetedPos.x}px,${offsetedPos.y}px)`);
|
54401 | applyAnchorClass(this._container, anchor, 'popup');
|
54402 | }
|
54403 | _focusFirstElement() {
|
54404 | if (!this.options.focusAfterOpen || !this._container)
|
54405 | return;
|
54406 | const firstFocusable = this._container.querySelector(focusQuerySelector);
|
54407 | if (firstFocusable)
|
54408 | firstFocusable.focus();
|
54409 | }
|
54410 | _onClose() {
|
54411 | this.remove();
|
54412 | }
|
54413 | }
|
54414 | function normalizeOffset(offset) {
|
54415 | if (!offset) {
|
54416 | return normalizeOffset(new performance.pointGeometry(0, 0));
|
54417 | }
|
54418 | else if (typeof offset === 'number') {
|
54419 | // input specifies a radius from which to calculate offsets at all positions
|
54420 | const cornerOffset = Math.round(Math.sqrt(0.5 * Math.pow(offset, 2)));
|
54421 | return {
|
54422 | 'center': new performance.pointGeometry(0, 0),
|
54423 | 'top': new performance.pointGeometry(0, offset),
|
54424 | 'top-left': new performance.pointGeometry(cornerOffset, cornerOffset),
|
54425 | 'top-right': new performance.pointGeometry(-cornerOffset, cornerOffset),
|
54426 | 'bottom': new performance.pointGeometry(0, -offset),
|
54427 | 'bottom-left': new performance.pointGeometry(cornerOffset, -cornerOffset),
|
54428 | 'bottom-right': new performance.pointGeometry(-cornerOffset, -cornerOffset),
|
54429 | 'left': new performance.pointGeometry(offset, 0),
|
54430 | 'right': new performance.pointGeometry(-offset, 0)
|
54431 | };
|
54432 | }
|
54433 | else if (offset instanceof performance.pointGeometry || Array.isArray(offset)) {
|
54434 | // input specifies a single offset to be applied to all positions
|
54435 | const convertedOffset = performance.pointGeometry.convert(offset);
|
54436 | return {
|
54437 | 'center': convertedOffset,
|
54438 | 'top': convertedOffset,
|
54439 | 'top-left': convertedOffset,
|
54440 | 'top-right': convertedOffset,
|
54441 | 'bottom': convertedOffset,
|
54442 | 'bottom-left': convertedOffset,
|
54443 | 'bottom-right': convertedOffset,
|
54444 | 'left': convertedOffset,
|
54445 | 'right': convertedOffset
|
54446 | };
|
54447 | }
|
54448 | else {
|
54449 | // input specifies an offset per position
|
54450 | return {
|
54451 | 'center': performance.pointGeometry.convert(offset['center'] || [0, 0]),
|
54452 | 'top': performance.pointGeometry.convert(offset['top'] || [0, 0]),
|
54453 | 'top-left': performance.pointGeometry.convert(offset['top-left'] || [0, 0]),
|
54454 | 'top-right': performance.pointGeometry.convert(offset['top-right'] || [0, 0]),
|
54455 | 'bottom': performance.pointGeometry.convert(offset['bottom'] || [0, 0]),
|
54456 | 'bottom-left': performance.pointGeometry.convert(offset['bottom-left'] || [0, 0]),
|
54457 | 'bottom-right': performance.pointGeometry.convert(offset['bottom-right'] || [0, 0]),
|
54458 | 'left': performance.pointGeometry.convert(offset['left'] || [0, 0]),
|
54459 | 'right': performance.pointGeometry.convert(offset['right'] || [0, 0])
|
54460 | };
|
54461 | }
|
54462 | }
|
54463 |
|
54464 | const exported = {
|
54465 | supported,
|
54466 | setRTLTextPlugin: performance.setRTLTextPlugin,
|
54467 | getRTLTextPluginStatus: performance.getRTLTextPluginStatus,
|
54468 | Map,
|
54469 | NavigationControl,
|
54470 | GeolocateControl,
|
54471 | AttributionControl,
|
54472 | LogoControl,
|
54473 | ScaleControl,
|
54474 | FullscreenControl,
|
54475 | Popup,
|
54476 | Marker,
|
54477 | Style,
|
54478 | LngLat: performance.LngLat,
|
54479 | LngLatBounds: performance.LngLatBounds,
|
54480 | Point: performance.pointGeometry,
|
54481 | MercatorCoordinate: performance.MercatorCoordinate,
|
54482 | Evented: performance.Evented,
|
54483 | AJAXError: performance.AJAXError,
|
54484 | config: performance.config,
|
54485 | CanvasSource,
|
54486 | GeoJSONSource,
|
54487 | ImageSource,
|
54488 | RasterDEMTileSource,
|
54489 | RasterTileSource,
|
54490 | VectorTileSource,
|
54491 | VideoSource,
|
54492 | /**
|
54493 | * Initializes resources like WebWorkers that can be shared across maps to lower load
|
54494 | * times in some situations. `maplibregl.workerUrl` and `maplibregl.workerCount`, if being
|
54495 | * used, must be set before `prewarm()` is called to have an effect.
|
54496 | *
|
54497 | * By default, the lifecycle of these resources is managed automatically, and they are
|
54498 | * lazily initialized when a Map is first created. By invoking `prewarm()`, these
|
54499 | * resources will be created ahead of time, and will not be cleared when the last Map
|
54500 | * is removed from the page. This allows them to be re-used by new Map instances that
|
54501 | * are created later. They can be manually cleared by calling
|
54502 | * `maplibregl.clearPrewarmedResources()`. This is only necessary if your web page remains
|
54503 | * active but stops using maps altogether.
|
54504 | *
|
54505 | * This is primarily useful when using GL-JS maps in a single page app, wherein a user
|
54506 | * would navigate between various views that can cause Map instances to constantly be
|
54507 | * created and destroyed.
|
54508 | *
|
54509 | * @function prewarm
|
54510 | * @example
|
54511 | * maplibregl.prewarm()
|
54512 | */
|
54513 | prewarm,
|
54514 | /**
|
54515 | * Clears up resources that have previously been created by `maplibregl.prewarm()`.
|
54516 | * Note that this is typically not necessary. You should only call this function
|
54517 | * if you expect the user of your app to not return to a Map view at any point
|
54518 | * in your application.
|
54519 | *
|
54520 | * @function clearPrewarmedResources
|
54521 | * @example
|
54522 | * maplibregl.clearPrewarmedResources()
|
54523 | */
|
54524 | clearPrewarmedResources,
|
54525 | /**
|
54526 | * Gets and sets the number of web workers instantiated on a page with GL JS maps.
|
54527 | * By default, it is set to half the number of CPU cores (capped at 6).
|
54528 | * Make sure to set this property before creating any map instances for it to have effect.
|
54529 | *
|
54530 | * @var {string} workerCount
|
54531 | * @returns {number} Number of workers currently configured.
|
54532 | * @example
|
54533 | * maplibregl.workerCount = 2;
|
54534 | */
|
54535 | get workerCount() {
|
54536 | return WorkerPool.workerCount;
|
54537 | },
|
54538 | set workerCount(count) {
|
54539 | WorkerPool.workerCount = count;
|
54540 | },
|
54541 | /**
|
54542 | * Gets and sets the maximum number of images (raster tiles, sprites, icons) to load in parallel,
|
54543 | * which affects performance in raster-heavy maps. 16 by default.
|
54544 | *
|
54545 | * @var {string} maxParallelImageRequests
|
54546 | * @returns {number} Number of parallel requests currently configured.
|
54547 | * @example
|
54548 | * maplibregl.maxParallelImageRequests = 10;
|
54549 | */
|
54550 | get maxParallelImageRequests() {
|
54551 | return performance.config.MAX_PARALLEL_IMAGE_REQUESTS;
|
54552 | },
|
54553 | set maxParallelImageRequests(numRequests) {
|
54554 | performance.config.MAX_PARALLEL_IMAGE_REQUESTS = numRequests;
|
54555 | },
|
54556 | /**
|
54557 | * Clears browser storage used by this library. Using this method flushes the MapLibre tile
|
54558 | * cache that is managed by this library. Tiles may still be cached by the browser
|
54559 | * in some cases.
|
54560 | *
|
54561 | * This API is supported on browsers where the [`Cache` API](https://developer.mozilla.org/en-US/docs/Web/API/Cache)
|
54562 | * is supported and enabled. This includes all major browsers when pages are served over
|
54563 | * `https://`, except Internet Explorer and Edge Mobile.
|
54564 | *
|
54565 | * When called in unsupported browsers or environments (private or incognito mode), the
|
54566 | * callback will be called with an error argument.
|
54567 | *
|
54568 | * @function clearStorage
|
54569 | * @param {Function} callback Called with an error argument if there is an error.
|
54570 | * @example
|
54571 | * maplibregl.clearStorage();
|
54572 | */
|
54573 | clearStorage(callback) {
|
54574 | performance.clearTileCache(callback);
|
54575 | },
|
54576 | workerUrl: '',
|
54577 | /**
|
54578 | * Sets a custom load tile function that will be called when using a source that starts with a custom url schema.
|
54579 | * The example below will be triggered for custom:// urls defined in the sources list in the style definitions.
|
54580 | * The function passed will receive the request parameters and should call the callback with the resulting request,
|
54581 | * for example a pbf vector tile, non-compressed, represented as ArrayBuffer.
|
54582 | *
|
54583 | * @function addProtocol
|
54584 | * @param {string} customProtocol - the protocol to hook, for example 'custom'
|
54585 | * @param {Function} loadFn - the function to use when trying to fetch a tile specified by the customProtocol
|
54586 | * @example
|
54587 | * // this will fetch a file using the fetch API (this is obviously a non iteresting example...)
|
54588 | * maplibre.addProtocol('custom', (params, callback) => {
|
54589 | fetch(`https://${params.url.split("://")[1]}`)
|
54590 | .then(t => {
|
54591 | if (t.status == 200) {
|
54592 | t.arrayBuffer().then(arr => {
|
54593 | callback(null, arr, null, null);
|
54594 | });
|
54595 | } else {
|
54596 | callback(new Error(`Tile fetch error: ${t.statusText}`));
|
54597 | }
|
54598 | })
|
54599 | .catch(e => {
|
54600 | callback(new Error(e));
|
54601 | });
|
54602 | return { cancel: () => { } };
|
54603 | });
|
54604 | * // the following is an example of a way to return an error when trying to load a tile
|
54605 | * maplibre.addProtocol('custom2', (params, callback) => {
|
54606 | * callback(new Error('someErrorMessage'));
|
54607 | * return { cancel: () => { } };
|
54608 | * });
|
54609 | */
|
54610 | addProtocol(customProtocol, loadFn) {
|
54611 | performance.config.REGISTERED_PROTOCOLS[customProtocol] = loadFn;
|
54612 | },
|
54613 | /**
|
54614 | * Removes a previusly added protocol
|
54615 | *
|
54616 | * @function removeProtocol
|
54617 | * @param {string} customProtocol - the custom protocol to remove registration for
|
54618 | * @example
|
54619 | * maplibregl.removeProtocol('custom');
|
54620 | */
|
54621 | removeProtocol(customProtocol) {
|
54622 | delete performance.config.REGISTERED_PROTOCOLS[customProtocol];
|
54623 | }
|
54624 | };
|
54625 | //This gets automatically stripped out in production builds.
|
54626 | Debug.extend(exported, { isSafari: performance.isSafari, getPerformanceMetrics: performance.PerformanceUtils.getPerformanceMetrics });
|
54627 | /**
|
54628 | * Test whether the browser supports MapLibre GL JS.
|
54629 | *
|
54630 | * @function supported
|
54631 | * @param {Object} [options]
|
54632 | * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`,
|
54633 | * the function will return `false` if the performance of MapLibre GL JS would
|
54634 | * be dramatically worse than expected (e.g. a software WebGL renderer would be used).
|
54635 | * @return {boolean}
|
54636 | * @example
|
54637 | * // Show an alert if the browser does not support MapLibre GL
|
54638 | * if (!maplibregl.supported()) {
|
54639 | * alert('Your browser does not support MapLibre GL');
|
54640 | * }
|
54641 | * @see [Check for browser support](https://maplibre.org/maplibre-gl-js-docs/example/check-for-support/)
|
54642 | */
|
54643 | /**
|
54644 | * Sets the map's [RTL text plugin](https://www.mapbox.com/mapbox-gl-js/plugins/#mapbox-gl-rtl-text).
|
54645 | * Necessary for supporting the Arabic and Hebrew languages, which are written right-to-left.
|
54646 | *
|
54647 | * @function setRTLTextPlugin
|
54648 | * @param {string} pluginURL URL pointing to the Mapbox RTL text plugin source.
|
54649 | * @param {Function} callback Called with an error argument if there is an error.
|
54650 | * @param {boolean} lazy If set to `true`, mapboxgl will defer loading the plugin until rtl text is encountered,
|
54651 | * rtl text will then be rendered only after the plugin finishes loading.
|
54652 | * @example
|
54653 | * maplibregl.setRTLTextPlugin('https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.2.0/mapbox-gl-rtl-text.js');
|
54654 | * @see [Add support for right-to-left scripts](https://maplibre.org/maplibre-gl-js-docs/example/mapbox-gl-rtl-text/)
|
54655 | */
|
54656 | /**
|
54657 | * Gets the map's [RTL text plugin](https://www.mapbox.com/mapbox-gl-js/plugins/#mapbox-gl-rtl-text) status.
|
54658 | * The status can be `unavailable` (i.e. not requested or removed), `loading`, `loaded` or `error`.
|
54659 | * If the status is `loaded` and the plugin is requested again, an error will be thrown.
|
54660 | *
|
54661 | * @function getRTLTextPluginStatus
|
54662 | * @example
|
54663 | * const pluginStatus = maplibregl.getRTLTextPluginStatus();
|
54664 | */
|
54665 | var maplibregl = exported;
|
54666 | // canary assert: used to confirm that asserts have been removed from production build
|
54667 | performance.assert(true, 'canary assert');
|
54668 |
|
54669 | return maplibregl;
|
54670 |
|
54671 | }));
|
54672 |
|
54673 | //
|
54674 |
|
54675 | var maplibregl$1 = maplibregl;
|
54676 |
|
54677 | return maplibregl$1;
|
54678 |
|
54679 | }));
|
54680 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwbGlicmUtZ2wtZGV2LmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9hc3NlcnQvbm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvYXNzZXJ0L25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9hc3NlcnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC91bml0YmV6aWVyL2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9kZWVwX2VxdWFsLnRzIiwiLi4vc3JjL3V0aWwvdXRpbC50cyIsIi4uL3NyYy91dGlsL2Jyb3dzZXIudHMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC9wb2ludC1nZW9tZXRyeS9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2NvbmZpZy50cyIsIi4uL3NyYy91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZS50cyIsIi4uL3NyYy91dGlsL3dlYnBfc3VwcG9ydGVkLnRzIiwiLi4vc3JjL3V0aWwvYWpheC50cyIsIi4uL3NyYy91dGlsL2V2ZW50ZWQudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9lcnJvci92YWxpZGF0aW9uX2Vycm9yLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfY29uc3RhbnRzLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9leHRlbmQudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL3VuYnVuZGxlX2pzb25saW50LnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9wYXJzaW5nX2Vycm9yLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9zY29wZS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMudHMiLCIuLi9ub2RlX21vZHVsZXMvY3NzY29sb3JwYXJzZXIvY3NzY29sb3JwYXJzZXIuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2NvbG9yLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9jb2xsYXRvci50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdmFsdWVzLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9saXRlcmFsLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9ydW50aW1lX2Vycm9yLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9hc3NlcnRpb24udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2Zvcm1hdC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW1hZ2UudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2NvZXJjaW9uLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9ldmFsdWF0aW9uX2NvbnRleHQudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2NvbXBvdW5kX2V4cHJlc3Npb24udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2NvbGxhdG9yLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy93aXRoaW4udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2lzX2NvbnN0YW50LnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy92YXIudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3BhcnNpbmdfY29udGV4dC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vc3RvcHMudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL3N0ZXAudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9jb2xvcl9zcGFjZXMudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2ludGVycG9sYXRlLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jb2FsZXNjZS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbGV0LnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9hdC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW4udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2luZGV4X29mLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9tYXRjaC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY2FzZS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvc2xpY2UudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2NvbXBhcmlzb24udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL251bWJlcl9mb3JtYXQudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2xlbmd0aC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW5kZXgudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL3Jlc3VsdC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvcHJvcGVydGllcy50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvZ2V0X3R5cGUudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9mdW5jdGlvbi9pbmRleC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXgudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9vYmplY3QudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9hcnJheS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX251bWJlci50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2Z1bmN0aW9uLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZXhwcmVzc2lvbi50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2Jvb2xlYW4udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9jb2xvci50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2VudW0udHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlci9pbmRleC50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZpbHRlci50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3Byb3BlcnR5LnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfcGFpbnRfcHJvcGVydHkudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9sYXlvdXRfcHJvcGVydHkudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9sYXllci50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3N0cmluZy50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3NvdXJjZS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2xpZ2h0LnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZm9ybWF0dGVkLnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfaW1hZ2UudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZS50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2dseXBoc191cmwudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZV9zdHlsZS5taW4udHMiLCIuLi9zcmMvc3R5bGUvdmFsaWRhdGVfc3R5bGUudHMiLCIuLi9zcmMvdXRpbC90cmFuc2ZlcmFibGVfZ3JpZF9pbmRleC50cyIsIi4uL3NyYy91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIudHMiLCIuLi9zcmMvc3R5bGUvem9vbV9oaXN0b3J5LnRzIiwiLi4vc3JjL3V0aWwvaXNfY2hhcl9pbl91bmljb2RlX2Jsb2NrLnRzIiwiLi4vc3JjL3V0aWwvc2NyaXB0X2RldGVjdGlvbi50cyIsIi4uL3NyYy9zb3VyY2UvcnRsX3RleHRfcGx1Z2luLnRzIiwiLi4vc3JjL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy50cyIsIi4uL3NyYy9zdHlsZS9wcm9wZXJ0aWVzLnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyLnRzIiwiLi4vc3JjL3V0aWwvc3RydWN0X2FycmF5LnRzIiwiLi4vc3JjL2RhdGEvYXJyYXlfdHlwZXMuZy50cyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9jaXJjbGVfYXR0cmlidXRlcy50cyIsIi4uL3NyYy9kYXRhL3NlZ21lbnQudHMiLCIuLi9zcmMvc2hhZGVycy9lbmNvZGVfYXR0cmlidXRlLnRzIiwiLi4vc3JjL2RhdGEvYnVja2V0L3BhdHRlcm5fYXR0cmlidXRlcy50cyIsIi4uL25vZGVfbW9kdWxlcy9tdXJtdXJoYXNoLWpzL211cm11cmhhc2gzX2djLmpzIiwiLi4vbm9kZV9tb2R1bGVzL211cm11cmhhc2gtanMvbXVybXVyaGFzaDJfZ2MuanMiLCIuLi9ub2RlX21vZHVsZXMvbXVybXVyaGFzaC1qcy9pbmRleC5qcyIsIi4uL3NyYy9kYXRhL2ZlYXR1cmVfcG9zaXRpb25fbWFwLnRzIiwiLi4vc3JjL3JlbmRlci91bmlmb3JtX2JpbmRpbmcudHMiLCIuLi9zcmMvZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24udHMiLCIuLi9zcmMvZGF0YS9leHRlbnQudHMiLCIuLi9zcmMvZGF0YS9sb2FkX2dlb21ldHJ5LnRzIiwiLi4vc3JjL2RhdGEvZXZhbHVhdGlvbl9mZWF0dXJlLnRzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2NpcmNsZV9idWNrZXQudHMiLCIuLi9zcmMvdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMudHMiLCIuLi9zcmMvc3R5bGUvcXVlcnlfdXRpbHMudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuZy50cyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL2NvbW1vbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL21hdDIuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQyZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL21hdDMuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQ0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vdmVjMy5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3ZlYzQuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9xdWF0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vcXVhdDIuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMyLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllci50cyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9oZWF0bWFwX2J1Y2tldC50cyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuZy50cyIsIi4uL3NyYy91dGlsL2ltYWdlLnRzIiwiLi4vc3JjL3V0aWwvY29sb3JfcmFtcC50cyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyLnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmcudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvaGlsbHNoYWRlX3N0eWxlX2xheWVyLnRzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfYXR0cmlidXRlcy50cyIsIi4uL25vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIi4uL25vZGVfbW9kdWxlcy9xdWlja3NlbGVjdC9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2NsYXNzaWZ5X3JpbmdzLnRzIiwiLi4vc3JjL2RhdGEvYnVja2V0L3BhdHRlcm5fYnVja2V0X2ZlYXR1cmVzLnRzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0LnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5nLnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXIudHMiLCIuLi9zcmMvZGF0YS9idWNrZXQvZmlsbF9leHRydXNpb25fYXR0cmlidXRlcy50cyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlZmVhdHVyZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3ZlY3Rvci10aWxlL2luZGV4LmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2J1Y2tldC50cyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmcudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXIudHMiLCIuLi9zcmMvZGF0YS9idWNrZXQvbGluZV9hdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2xpbmVfYXR0cmlidXRlc19leHQudHMiLCIuLi9zcmMvZGF0YS9idWNrZXQvbGluZV9idWNrZXQudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmcudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllci50cyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9zeW1ib2xfYXR0cmlidXRlcy50cyIsIi4uL3NyYy9zeW1ib2wvdHJhbnNmb3JtX3RleHQudHMiLCIuLi9zcmMvc3ltYm9sL21lcmdlbGluZXMudHMiLCIuLi9zcmMvdXRpbC92ZXJ0aWNhbGl6ZV9wdW5jdHVhdGlvbi50cyIsIi4uL3NyYy9zeW1ib2wvb25lX2VtLnRzIiwiLi4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvcGJmL2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlL3BhcnNlX2dseXBoX3BiZi50cyIsIi4uL25vZGVfbW9kdWxlcy9wb3RwYWNrL2luZGV4Lm1qcyIsIi4uL3NyYy9yZW5kZXIvaW1hZ2VfYXRsYXMudHMiLCIuLi9zcmMvc3ltYm9sL3NoYXBpbmcudHMiLCIuLi9zcmMvc3ltYm9sL3N5bWJvbF9zaXplLnRzIiwiLi4vc3JjL3N5bWJvbC9hbmNob3IudHMiLCIuLi9zcmMvc3ltYm9sL2NoZWNrX21heF9hbmdsZS50cyIsIi4uL3NyYy9zeW1ib2wvZ2V0X2FuY2hvcnMudHMiLCIuLi9zcmMvc3ltYm9sL2NsaXBfbGluZS50cyIsIi4uL3NyYy9zeW1ib2wvcXVhZHMudHMiLCIuLi9zcmMvc3ltYm9sL2NvbGxpc2lvbl9mZWF0dXJlLnRzIiwiLi4vbm9kZV9tb2R1bGVzL3RpbnlxdWV1ZS9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2ZpbmRfcG9sZV9vZl9pbmFjY2Vzc2liaWxpdHkudHMiLCIuLi9zcmMvc3ltYm9sL3N5bWJvbF9sYXlvdXQudHMiLCIuLi9zcmMvZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldC50cyIsIi4uL3NyYy91dGlsL3Jlc29sdmVfdG9rZW5zLnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmcudHMiLCIuLi9zcmMvc3R5bGUvZm9ybWF0X3NlY3Rpb25fb3ZlcnJpZGUudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyLnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2JhY2tncm91bmRfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5nLnRzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2JhY2tncm91bmRfc3R5bGVfbGF5ZXIudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvcmFzdGVyX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuZy50cyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXIudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyLnRzIiwiLi4vc3JjL3N0eWxlL2NyZWF0ZV9zdHlsZV9sYXllci50cyIsIi4uL3NyYy91dGlsL3Rocm90dGxlZF9pbnZva2VyLnRzIiwiLi4vc3JjL3V0aWwvYWN0b3IudHMiLCIuLi9zcmMvZ2VvL2xuZ19sYXQudHMiLCIuLi9zcmMvZ2VvL2xuZ19sYXRfYm91bmRzLnRzIiwiLi4vc3JjL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLnRzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvd2hvb3RzLWpzL2luZGV4Lm1qcyIsIi4uL3NyYy9zb3VyY2UvdGlsZV9pZC50cyIsIi4uL3NyYy9kYXRhL2RlbV9kYXRhLnRzIiwiLi4vc3JjL3V0aWwvZGljdGlvbmFyeV9jb2Rlci50cyIsIi4uL3NyYy91dGlsL3ZlY3RvcnRpbGVfdG9fZ2VvanNvbi50cyIsIi4uL3NyYy9kYXRhL2ZlYXR1cmVfaW5kZXgudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL3JlZl9wcm9wZXJ0aWVzLnRzIiwiLi4vc3JjL3V0aWwvcGVyZm9ybWFuY2UudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9ncm91cF9ieV9sYXlvdXQudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXJfaW5kZXgudHMiLCIuLi9zcmMvcmVuZGVyL2dseXBoX2F0bGFzLnRzIiwiLi4vc3JjL3NvdXJjZS93b3JrZXJfdGlsZS50cyIsIi4uL3NyYy9zb3VyY2UvdmVjdG9yX3RpbGVfd29ya2VyX3NvdXJjZS50cyIsIi4uL3NyYy9zb3VyY2UvcmFzdGVyX2RlbV90aWxlX3dvcmtlcl9zb3VyY2UudHMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC9nZW9qc29uLXJld2luZC9pbmRleC5qcyIsIi4uL3NyYy9zb3VyY2UvZ2VvanNvbl93cmFwcGVyLnRzIiwiLi4vbm9kZV9tb2R1bGVzL3Z0LXBiZi9saWIvZ2VvanNvbl93cmFwcGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Z0LXBiZi9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9rZGJ1c2gvc3JjL3NvcnQuanMiLCIuLi9ub2RlX21vZHVsZXMva2RidXNoL3NyYy9yYW5nZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9rZGJ1c2gvc3JjL3dpdGhpbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9rZGJ1c2gvc3JjL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3N1cGVyY2x1c3Rlci9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9zaW1wbGlmeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9mZWF0dXJlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NvbnZlcnQuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY2xpcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy93cmFwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3RyYW5zZm9ybS5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy90aWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2luZGV4LmpzIiwiLi4vc3JjL3NvdXJjZS9nZW9qc29uX3dvcmtlcl9zb3VyY2UudHMiLCIuLi9zcmMvc291cmNlL3dvcmtlci50cyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L21hcGJveC1nbC1zdXBwb3J0ZWQvaW5kZXguanMiLCIuLi9zcmMvdXRpbC9kb20udHMiLCIuLi9zcmMvdXRpbC9yZXF1ZXN0X21hbmFnZXIudHMiLCIuLi9zcmMvc3R5bGUvbG9hZF9zcHJpdGUudHMiLCIuLi9zcmMvcmVuZGVyL3RleHR1cmUudHMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfaW1hZ2UudHMiLCIuLi9zcmMvcmVuZGVyL2ltYWdlX21hbmFnZXIudHMiLCIuLi9zcmMvc3R5bGUvbG9hZF9nbHlwaF9yYW5nZS50cyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3Rpbnktc2RmL2luZGV4LmpzIiwiLi4vc3JjL3JlbmRlci9nbHlwaF9tYW5hZ2VyLnRzIiwiLi4vc3JjL3N0eWxlL2xpZ2h0LnRzIiwiLi4vc3JjL3JlbmRlci9saW5lX2F0bGFzLnRzIiwiLi4vc3JjL3V0aWwvZGlzcGF0Y2hlci50cyIsIi4uL3NyYy9zb3VyY2UvbG9hZF90aWxlanNvbi50cyIsIi4uL3NyYy9zb3VyY2UvdGlsZV9ib3VuZHMudHMiLCIuLi9zcmMvc291cmNlL3ZlY3Rvcl90aWxlX3NvdXJjZS50cyIsIi4uL3NyYy9zb3VyY2UvcmFzdGVyX3RpbGVfc291cmNlLnRzIiwiLi4vc3JjL3V0aWwvb2Zmc2NyZWVuX2NhbnZhc19zdXBwb3J0ZWQudHMiLCIuLi9zcmMvc291cmNlL3Jhc3Rlcl9kZW1fdGlsZV9zb3VyY2UudHMiLCIuLi9zcmMvc291cmNlL2dlb2pzb25fc291cmNlLnRzIiwiLi4vc3JjL2RhdGEvcmFzdGVyX2JvdW5kc19hdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL3NvdXJjZS9pbWFnZV9zb3VyY2UudHMiLCIuLi9zcmMvc291cmNlL3ZpZGVvX3NvdXJjZS50cyIsIi4uL3NyYy9zb3VyY2UvY2FudmFzX3NvdXJjZS50cyIsIi4uL3NyYy9zb3VyY2Uvc291cmNlLnRzIiwiLi4vc3JjL3NvdXJjZS9xdWVyeV9mZWF0dXJlcy50cyIsIi4uL3NyYy9kYXRhL2J1Y2tldC50cyIsIi4uL3NyYy9zb3VyY2UvdGlsZS50cyIsIi4uL3NyYy9zb3VyY2UvdGlsZV9jYWNoZS50cyIsIi4uL3NyYy9zb3VyY2Uvc291cmNlX3N0YXRlLnRzIiwiLi4vc3JjL3NvdXJjZS9zb3VyY2VfY2FjaGUudHMiLCIuLi9zcmMvdXRpbC93ZWJfd29ya2VyLnRzIiwiLi4vc3JjL3V0aWwvd29ya2VyX3Bvb2wudHMiLCIuLi9zcmMvdXRpbC9nbG9iYWxfd29ya2VyX3Bvb2wudHMiLCIuLi9zcmMvc3R5bGUtc3BlYy9kZXJlZi50cyIsIi4uL3NyYy9zdHlsZS1zcGVjL2VtcHR5LnRzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZGlmZi50cyIsIi4uL3NyYy9zeW1ib2wvcGF0aF9pbnRlcnBvbGF0b3IudHMiLCIuLi9zcmMvc3ltYm9sL2dyaWRfaW5kZXgudHMiLCIuLi9zcmMvc3ltYm9sL3Byb2plY3Rpb24udHMiLCIuLi9zcmMvc3ltYm9sL2NvbGxpc2lvbl9pbmRleC50cyIsIi4uL3NyYy9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMudHMiLCIuLi9zcmMvc3ltYm9sL3BsYWNlbWVudC50cyIsIi4uL3NyYy9zdHlsZS9wYXVzZWFibGVfcGxhY2VtZW50LnRzIiwiLi4vc3JjL3N5bWJvbC9jcm9zc190aWxlX3N5bWJvbF9pbmRleC50cyIsIi4uL3NyYy9zdHlsZS9zdHlsZS50cyIsIi4uL3NyYy9kYXRhL3Bvc19hdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL3NoYWRlcnMvX3ByZWx1ZGUuZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvX3ByZWx1ZGUudmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2JhY2tncm91bmQuZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvYmFja2dyb3VuZC52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvYmFja2dyb3VuZF9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2JhY2tncm91bmRfcGF0dGVybi52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvY2lyY2xlLmZyYWdtZW50Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2NpcmNsZS52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvY2xpcHBpbmdfbWFzay5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9jbGlwcGluZ19tYXNrLnZlcnRleC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9oZWF0bWFwLmZyYWdtZW50Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2hlYXRtYXAudmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2hlYXRtYXBfdGV4dHVyZS5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9oZWF0bWFwX3RleHR1cmUudmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2NvbGxpc2lvbl9ib3guZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvY29sbGlzaW9uX2JveC52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvY29sbGlzaW9uX2NpcmNsZS5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9jb2xsaXNpb25fY2lyY2xlLnZlcnRleC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9kZWJ1Zy5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9kZWJ1Zy52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvZmlsbC5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9maWxsLnZlcnRleC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9maWxsX291dGxpbmUuZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvZmlsbF9vdXRsaW5lLnZlcnRleC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9maWxsX291dGxpbmVfcGF0dGVybi5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9maWxsX291dGxpbmVfcGF0dGVybi52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvZmlsbF9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2ZpbGxfcGF0dGVybi52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvZmlsbF9leHRydXNpb24uZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvZmlsbF9leHRydXNpb24udmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2ZpbGxfZXh0cnVzaW9uX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvZmlsbF9leHRydXNpb25fcGF0dGVybi52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvaGlsbHNoYWRlX3ByZXBhcmUuZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvaGlsbHNoYWRlX3ByZXBhcmUudmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2hpbGxzaGFkZS5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9oaWxsc2hhZGUudmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL2xpbmUuZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvbGluZS52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvbGluZV9ncmFkaWVudC5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9saW5lX2dyYWRpZW50LnZlcnRleC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9saW5lX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvbGluZV9wYXR0ZXJuLnZlcnRleC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9saW5lX3NkZi5mcmFnbWVudC5nbHNsLmcudHMiLCIuLi9zcmMvc2hhZGVycy9saW5lX3NkZi52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvcmFzdGVyLmZyYWdtZW50Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL3Jhc3Rlci52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvc3ltYm9sX2ljb24uZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvc3ltYm9sX2ljb24udmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL3N5bWJvbF9zZGYuZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvc3ltYm9sX3NkZi52ZXJ0ZXguZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvc3ltYm9sX3RleHRfYW5kX2ljb24uZnJhZ21lbnQuZ2xzbC5nLnRzIiwiLi4vc3JjL3NoYWRlcnMvc3ltYm9sX3RleHRfYW5kX2ljb24udmVydGV4Lmdsc2wuZy50cyIsIi4uL3NyYy9zaGFkZXJzL3NoYWRlcnMudHMiLCIuLi9zcmMvcmVuZGVyL3ZlcnRleF9hcnJheV9vYmplY3QudHMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0udHMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vcGF0dGVybi50cyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9maWxsX2V4dHJ1c2lvbl9wcm9ncmFtLnRzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2ZpbGxfcHJvZ3JhbS50cyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9jaXJjbGVfcHJvZ3JhbS50cyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9jb2xsaXNpb25fcHJvZ3JhbS50cyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9kZWJ1Z19wcm9ncmFtLnRzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2NsaXBwaW5nX21hc2tfcHJvZ3JhbS50cyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9oZWF0bWFwX3Byb2dyYW0udHMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vaGlsbHNoYWRlX3Byb2dyYW0udHMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vbGluZV9wcm9ncmFtLnRzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL3Jhc3Rlcl9wcm9ncmFtLnRzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL3N5bWJvbF9wcm9ncmFtLnRzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2JhY2tncm91bmRfcHJvZ3JhbS50cyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9wcm9ncmFtX3VuaWZvcm1zLnRzIiwiLi4vc3JjL2dsL2luZGV4X2J1ZmZlci50cyIsIi4uL3NyYy9nbC92ZXJ0ZXhfYnVmZmVyLnRzIiwiLi4vc3JjL2dsL3ZhbHVlLnRzIiwiLi4vc3JjL2dsL2ZyYW1lYnVmZmVyLnRzIiwiLi4vc3JjL2dsL2NvbG9yX21vZGUudHMiLCIuLi9zcmMvZ2wvY29udGV4dC50cyIsIi4uL3NyYy9nbC9kZXB0aF9tb2RlLnRzIiwiLi4vc3JjL2dsL3N0ZW5jaWxfbW9kZS50cyIsIi4uL3NyYy9nbC9jdWxsX2ZhY2VfbW9kZS50cyIsIi4uL3NyYy9yZW5kZXIvZHJhd19jb2xsaXNpb25fZGVidWcudHMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfc3ltYm9sLnRzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2NpcmNsZS50cyIsIi4uL3NyYy9yZW5kZXIvZHJhd19oZWF0bWFwLnRzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2xpbmUudHMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfZmlsbC50cyIsIi4uL3NyYy9yZW5kZXIvZHJhd19maWxsX2V4dHJ1c2lvbi50cyIsIi4uL3NyYy9yZW5kZXIvZHJhd19oaWxsc2hhZGUudHMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfcmFzdGVyLnRzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2JhY2tncm91bmQudHMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfZGVidWcudHMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfY3VzdG9tLnRzIiwiLi4vc3JjL3JlbmRlci9wYWludGVyLnRzIiwiLi4vc3JjL3V0aWwvcHJpbWl0aXZlcy50cyIsIi4uL3NyYy9nZW8vZWRnZV9pbnNldHMudHMiLCIuLi9zcmMvZ2VvL3RyYW5zZm9ybS50cyIsIi4uL3NyYy91dGlsL3Rocm90dGxlLnRzIiwiLi4vc3JjL3VpL2hhc2gudHMiLCIuLi9zcmMvdWkvaGFuZGxlcl9pbmVydGlhLnRzIiwiLi4vc3JjL3VpL2V2ZW50cy50cyIsIi4uL3NyYy91aS9oYW5kbGVyL21hcF9ldmVudC50cyIsIi4uL3NyYy91aS9oYW5kbGVyL2JveF96b29tLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvaGFuZGxlcl91dGlsLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvdGFwX3JlY29nbml6ZXIudHMiLCIuLi9zcmMvdWkvaGFuZGxlci90YXBfem9vbS50cyIsIi4uL3NyYy91aS9oYW5kbGVyL21vdXNlLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvdG91Y2hfcGFuLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvdG91Y2hfem9vbV9yb3RhdGUudHMiLCIuLi9zcmMvdWkvaGFuZGxlci9rZXlib2FyZC50cyIsIi4uL3NyYy91aS9oYW5kbGVyL3Njcm9sbF96b29tLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvc2hpbS9kYmxjbGlja196b29tLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvY2xpY2tfem9vbS50cyIsIi4uL3NyYy91aS9oYW5kbGVyL3RhcF9kcmFnX3pvb20udHMiLCIuLi9zcmMvdWkvaGFuZGxlci9zaGltL2RyYWdfcGFuLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXIvc2hpbS9kcmFnX3JvdGF0ZS50cyIsIi4uL3NyYy91aS9oYW5kbGVyL3NoaW0vdG91Y2hfem9vbV9yb3RhdGUudHMiLCIuLi9zcmMvdWkvaGFuZGxlcl9tYW5hZ2VyLnRzIiwiLi4vc3JjL3V0aWwvZGVidWcudHMiLCIuLi9zcmMvdWkvY2FtZXJhLnRzIiwiLi4vc3JjL3VpL2NvbnRyb2wvYXR0cmlidXRpb25fY29udHJvbC50cyIsIi4uL3NyYy91aS9jb250cm9sL2xvZ29fY29udHJvbC50cyIsIi4uL3NyYy91dGlsL3Rhc2tfcXVldWUudHMiLCIuLi9zcmMvdWkvZGVmYXVsdF9sb2NhbGUudHMiLCIuLi9zcmMvdWkvbWFwLnRzIiwiLi4vc3JjL3VpL2NvbnRyb2wvbmF2aWdhdGlvbl9jb250cm9sLnRzIiwiLi4vc3JjL3V0aWwvc21hcnRfd3JhcC50cyIsIi4uL3NyYy91aS9hbmNob3IudHMiLCIuLi9zcmMvdWkvbWFya2VyLnRzIiwiLi4vc3JjL3VpL2NvbnRyb2wvZ2VvbG9jYXRlX2NvbnRyb2wudHMiLCIuLi9zcmMvdWkvY29udHJvbC9zY2FsZV9jb250cm9sLnRzIiwiLi4vc3JjL3VpL2NvbnRyb2wvZnVsbHNjcmVlbl9jb250cm9sLnRzIiwiLi4vc3JjL3VpL3BvcHVwLnRzIiwiLi4vc3JjL2luZGV4LnRzIiwiLi4vcm9sbHVwL21hcGxpYnJlZ2wuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG9iamVjdEFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxuLy8gY29tcGFyZSBhbmQgaXNCdWZmZXIgdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9ibG9iLzY4MGU5ZTVlNDg4ZjIyYWFjMjc1OTlhNTdkYzg0NGE2MzE1OTI4ZGQvaW5kZXguanNcbi8vIG9yaWdpbmFsIG5vdGljZTpcblxuLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICB2YXIgeCA9IGEubGVuZ3RoO1xuICB2YXIgeSA9IGIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldO1xuICAgICAgeSA9IGJbaV07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgaWYgKHkgPCB4KSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5mdW5jdGlvbiBpc0J1ZmZlcihiKSB7XG4gIGlmIChnbG9iYWwuQnVmZmVyICYmIHR5cGVvZiBnbG9iYWwuQnVmZmVyLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGdsb2JhbC5CdWZmZXIuaXNCdWZmZXIoYik7XG4gIH1cbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcik7XG59XG5cbi8vIGJhc2VkIG9uIG5vZGUgYXNzZXJ0LCBvcmlnaW5hbCBub3RpY2U6XG4vLyBOQjogVGhlIFVSTCB0byB0aGUgQ29tbW9uSlMgc3BlYyBpcyBrZXB0IGp1c3QgZm9yIHRyYWRpdGlvbi5cbi8vICAgICBub2RlLWFzc2VydCBoYXMgZXZvbHZlZCBhIGxvdCBzaW5jZSB0aGVuLCBib3RoIGluIEFQSSBhbmQgYmVoYXZpb3IuXG5cbi8vIGh0dHA6Ly93aWtpLmNvbW1vbmpzLm9yZy93aWtpL1VuaXRfVGVzdGluZy8xLjBcbi8vXG4vLyBUSElTIElTIE5PVCBURVNURUQgTk9SIExJS0VMWSBUTyBXT1JLIE9VVFNJREUgVjghXG4vL1xuLy8gT3JpZ2luYWxseSBmcm9tIG5hcndoYWwuanMgKGh0dHA6Ly9uYXJ3aGFsanMub3JnKVxuLy8gQ29weXJpZ2h0IChjKSAyMDA5IFRob21hcyBSb2JpbnNvbiA8Mjgwbm9ydGguY29tPlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0b1xuLy8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU5cbi8vIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbi8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwvJyk7XG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgZnVuY3Rpb25zSGF2ZU5hbWVzID0gKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZvbygpIHt9Lm5hbWUgPT09ICdmb28nO1xufSgpKTtcbmZ1bmN0aW9uIHBUb1N0cmluZyAob2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcbn1cbmZ1bmN0aW9uIGlzVmlldyhhcnJidWYpIHtcbiAgaWYgKGlzQnVmZmVyKGFycmJ1ZikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBnbG9iYWwuQXJyYXlCdWZmZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGFycmJ1Zik7XG4gIH1cbiAgaWYgKCFhcnJidWYpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGFycmJ1ZiBpbnN0YW5jZW9mIERhdGFWaWV3KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGFycmJ1Zi5idWZmZXIgJiYgYXJyYnVmLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuLy8gMS4gVGhlIGFzc2VydCBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIHRoYXQgdGhyb3dcbi8vIEFzc2VydGlvbkVycm9yJ3Mgd2hlbiBwYXJ0aWN1bGFyIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQuIFRoZVxuLy8gYXNzZXJ0IG1vZHVsZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UuXG5cbnZhciBhc3NlcnQgPSBtb2R1bGUuZXhwb3J0cyA9IG9rO1xuXG4vLyAyLiBUaGUgQXNzZXJ0aW9uRXJyb3IgaXMgZGVmaW5lZCBpbiBhc3NlcnQuXG4vLyBuZXcgYXNzZXJ0LkFzc2VydGlvbkVycm9yKHsgbWVzc2FnZTogbWVzc2FnZSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogZXhwZWN0ZWQgfSlcblxudmFyIHJlZ2V4ID0gL1xccypmdW5jdGlvblxccysoW15cXChcXHNdKilcXHMqLztcbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvZnVuY3Rpb24ucHJvdG90eXBlLm5hbWUvYmxvYi9hZGVlZWVjOGJmY2M2MDY4YjE4N2Q3ZDlmYjNkNWJiMWQzYTMwODk5L2ltcGxlbWVudGF0aW9uLmpzXG5mdW5jdGlvbiBnZXROYW1lKGZ1bmMpIHtcbiAgaWYgKCF1dGlsLmlzRnVuY3Rpb24oZnVuYykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGZ1bmN0aW9uc0hhdmVOYW1lcykge1xuICAgIHJldHVybiBmdW5jLm5hbWU7XG4gIH1cbiAgdmFyIHN0ciA9IGZ1bmMudG9TdHJpbmcoKTtcbiAgdmFyIG1hdGNoID0gc3RyLm1hdGNoKHJlZ2V4KTtcbiAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdO1xufVxuYXNzZXJ0LkFzc2VydGlvbkVycm9yID0gZnVuY3Rpb24gQXNzZXJ0aW9uRXJyb3Iob3B0aW9ucykge1xuICB0aGlzLm5hbWUgPSAnQXNzZXJ0aW9uRXJyb3InO1xuICB0aGlzLmFjdHVhbCA9IG9wdGlvbnMuYWN0dWFsO1xuICB0aGlzLmV4cGVjdGVkID0gb3B0aW9ucy5leHBlY3RlZDtcbiAgdGhpcy5vcGVyYXRvciA9IG9wdGlvbnMub3BlcmF0b3I7XG4gIGlmIChvcHRpb25zLm1lc3NhZ2UpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2U7XG4gICAgdGhpcy5nZW5lcmF0ZWRNZXNzYWdlID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5tZXNzYWdlID0gZ2V0TWVzc2FnZSh0aGlzKTtcbiAgICB0aGlzLmdlbmVyYXRlZE1lc3NhZ2UgPSB0cnVlO1xuICB9XG4gIHZhciBzdGFja1N0YXJ0RnVuY3Rpb24gPSBvcHRpb25zLnN0YWNrU3RhcnRGdW5jdGlvbiB8fCBmYWlsO1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBzdGFja1N0YXJ0RnVuY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIC8vIG5vbiB2OCBicm93c2VycyBzbyB3ZSBjYW4gaGF2ZSBhIHN0YWNrdHJhY2VcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCk7XG4gICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgdmFyIG91dCA9IGVyci5zdGFjaztcblxuICAgICAgLy8gdHJ5IHRvIHN0cmlwIHVzZWxlc3MgZnJhbWVzXG4gICAgICB2YXIgZm5fbmFtZSA9IGdldE5hbWUoc3RhY2tTdGFydEZ1bmN0aW9uKTtcbiAgICAgIHZhciBpZHggPSBvdXQuaW5kZXhPZignXFxuJyArIGZuX25hbWUpO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIC8vIG9uY2Ugd2UgaGF2ZSBsb2NhdGVkIHRoZSBmdW5jdGlvbiBmcmFtZVxuICAgICAgICAvLyB3ZSBuZWVkIHRvIHN0cmlwIG91dCBldmVyeXRoaW5nIGJlZm9yZSBpdCAoYW5kIGl0cyBsaW5lKVxuICAgICAgICB2YXIgbmV4dF9saW5lID0gb3V0LmluZGV4T2YoJ1xcbicsIGlkeCArIDEpO1xuICAgICAgICBvdXQgPSBvdXQuc3Vic3RyaW5nKG5leHRfbGluZSArIDEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YWNrID0gb3V0O1xuICAgIH1cbiAgfVxufTtcblxuLy8gYXNzZXJ0LkFzc2VydGlvbkVycm9yIGluc3RhbmNlb2YgRXJyb3JcbnV0aWwuaW5oZXJpdHMoYXNzZXJ0LkFzc2VydGlvbkVycm9yLCBFcnJvcik7XG5cbmZ1bmN0aW9uIHRydW5jYXRlKHMsIG4pIHtcbiAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzLmxlbmd0aCA8IG4gPyBzIDogcy5zbGljZSgwLCBuKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcztcbiAgfVxufVxuZnVuY3Rpb24gaW5zcGVjdChzb21ldGhpbmcpIHtcbiAgaWYgKGZ1bmN0aW9uc0hhdmVOYW1lcyB8fCAhdXRpbC5pc0Z1bmN0aW9uKHNvbWV0aGluZykpIHtcbiAgICByZXR1cm4gdXRpbC5pbnNwZWN0KHNvbWV0aGluZyk7XG4gIH1cbiAgdmFyIHJhd25hbWUgPSBnZXROYW1lKHNvbWV0aGluZyk7XG4gIHZhciBuYW1lID0gcmF3bmFtZSA/ICc6ICcgKyByYXduYW1lIDogJyc7XG4gIHJldHVybiAnW0Z1bmN0aW9uJyArICBuYW1lICsgJ10nO1xufVxuZnVuY3Rpb24gZ2V0TWVzc2FnZShzZWxmKSB7XG4gIHJldHVybiB0cnVuY2F0ZShpbnNwZWN0KHNlbGYuYWN0dWFsKSwgMTI4KSArICcgJyArXG4gICAgICAgICBzZWxmLm9wZXJhdG9yICsgJyAnICtcbiAgICAgICAgIHRydW5jYXRlKGluc3BlY3Qoc2VsZi5leHBlY3RlZCksIDEyOCk7XG59XG5cbi8vIEF0IHByZXNlbnQgb25seSB0aGUgdGhyZWUga2V5cyBtZW50aW9uZWQgYWJvdmUgYXJlIHVzZWQgYW5kXG4vLyB1bmRlcnN0b29kIGJ5IHRoZSBzcGVjLiBJbXBsZW1lbnRhdGlvbnMgb3Igc3ViIG1vZHVsZXMgY2FuIHBhc3Ncbi8vIG90aGVyIGtleXMgdG8gdGhlIEFzc2VydGlvbkVycm9yJ3MgY29uc3RydWN0b3IgLSB0aGV5IHdpbGwgYmVcbi8vIGlnbm9yZWQuXG5cbi8vIDMuIEFsbCBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtdXN0IHRocm93IGFuIEFzc2VydGlvbkVycm9yXG4vLyB3aGVuIGEgY29ycmVzcG9uZGluZyBjb25kaXRpb24gaXMgbm90IG1ldCwgd2l0aCBhIG1lc3NhZ2UgdGhhdFxuLy8gbWF5IGJlIHVuZGVmaW5lZCBpZiBub3QgcHJvdmlkZWQuICBBbGwgYXNzZXJ0aW9uIG1ldGhvZHMgcHJvdmlkZVxuLy8gYm90aCB0aGUgYWN0dWFsIGFuZCBleHBlY3RlZCB2YWx1ZXMgdG8gdGhlIGFzc2VydGlvbiBlcnJvciBmb3Jcbi8vIGRpc3BsYXkgcHVycG9zZXMuXG5cbmZ1bmN0aW9uIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IsIHN0YWNrU3RhcnRGdW5jdGlvbikge1xuICB0aHJvdyBuZXcgYXNzZXJ0LkFzc2VydGlvbkVycm9yKHtcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGFjdHVhbDogYWN0dWFsLFxuICAgIGV4cGVjdGVkOiBleHBlY3RlZCxcbiAgICBvcGVyYXRvcjogb3BlcmF0b3IsXG4gICAgc3RhY2tTdGFydEZ1bmN0aW9uOiBzdGFja1N0YXJ0RnVuY3Rpb25cbiAgfSk7XG59XG5cbi8vIEVYVEVOU0lPTiEgYWxsb3dzIGZvciB3ZWxsIGJlaGF2ZWQgZXJyb3JzIGRlZmluZWQgZWxzZXdoZXJlLlxuYXNzZXJ0LmZhaWwgPSBmYWlsO1xuXG4vLyA0LiBQdXJlIGFzc2VydGlvbiB0ZXN0cyB3aGV0aGVyIGEgdmFsdWUgaXMgdHJ1dGh5LCBhcyBkZXRlcm1pbmVkXG4vLyBieSAhIWd1YXJkLlxuLy8gYXNzZXJ0Lm9rKGd1YXJkLCBtZXNzYWdlX29wdCk7XG4vLyBUaGlzIHN0YXRlbWVudCBpcyBlcXVpdmFsZW50IHRvIGFzc2VydC5lcXVhbCh0cnVlLCAhIWd1YXJkLFxuLy8gbWVzc2FnZV9vcHQpOy4gVG8gdGVzdCBzdHJpY3RseSBmb3IgdGhlIHZhbHVlIHRydWUsIHVzZVxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKHRydWUsIGd1YXJkLCBtZXNzYWdlX29wdCk7LlxuXG5mdW5jdGlvbiBvayh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAoIXZhbHVlKSBmYWlsKHZhbHVlLCB0cnVlLCBtZXNzYWdlLCAnPT0nLCBhc3NlcnQub2spO1xufVxuYXNzZXJ0Lm9rID0gb2s7XG5cbi8vIDUuIFRoZSBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc2hhbGxvdywgY29lcmNpdmUgZXF1YWxpdHkgd2l0aFxuLy8gPT0uXG4vLyBhc3NlcnQuZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQuZXF1YWwgPSBmdW5jdGlvbiBlcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgIT0gZXhwZWN0ZWQpIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJz09JywgYXNzZXJ0LmVxdWFsKTtcbn07XG5cbi8vIDYuIFRoZSBub24tZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIGZvciB3aGV0aGVyIHR3byBvYmplY3RzIGFyZSBub3QgZXF1YWxcbi8vIHdpdGggIT0gYXNzZXJ0Lm5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdEVxdWFsID0gZnVuY3Rpb24gbm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT0nLCBhc3NlcnQubm90RXF1YWwpO1xuICB9XG59O1xuXG4vLyA3LiBUaGUgZXF1aXZhbGVuY2UgYXNzZXJ0aW9uIHRlc3RzIGEgZGVlcCBlcXVhbGl0eSByZWxhdGlvbi5cbi8vIGFzc2VydC5kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQuZGVlcEVxdWFsID0gZnVuY3Rpb24gZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIGZhbHNlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBFcXVhbCcsIGFzc2VydC5kZWVwRXF1YWwpO1xuICB9XG59O1xuXG5hc3NlcnQuZGVlcFN0cmljdEVxdWFsID0gZnVuY3Rpb24gZGVlcFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHRydWUpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnZGVlcFN0cmljdEVxdWFsJywgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgc3RyaWN0LCBtZW1vcykge1xuICAvLyA3LjEuIEFsbCBpZGVudGljYWwgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbiAgaWYgKGFjdHVhbCA9PT0gZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0J1ZmZlcihhY3R1YWwpICYmIGlzQnVmZmVyKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBjb21wYXJlKGFjdHVhbCwgZXhwZWN0ZWQpID09PSAwO1xuXG4gIC8vIDcuMi4gSWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGEgRGF0ZSBvYmplY3QsIHRoZSBhY3R1YWwgdmFsdWUgaXNcbiAgLy8gZXF1aXZhbGVudCBpZiBpdCBpcyBhbHNvIGEgRGF0ZSBvYmplY3QgdGhhdCByZWZlcnMgdG8gdGhlIHNhbWUgdGltZS5cbiAgfSBlbHNlIGlmICh1dGlsLmlzRGF0ZShhY3R1YWwpICYmIHV0aWwuaXNEYXRlKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKCk7XG5cbiAgLy8gNy4zIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIHRoZSBhY3R1YWwgdmFsdWUgaXNcbiAgLy8gZXF1aXZhbGVudCBpZiBpdCBpcyBhbHNvIGEgUmVnRXhwIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNvdXJjZSBhbmRcbiAgLy8gcHJvcGVydGllcyAoYGdsb2JhbGAsIGBtdWx0aWxpbmVgLCBgbGFzdEluZGV4YCwgYGlnbm9yZUNhc2VgKS5cbiAgfSBlbHNlIGlmICh1dGlsLmlzUmVnRXhwKGFjdHVhbCkgJiYgdXRpbC5pc1JlZ0V4cChleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsLnNvdXJjZSA9PT0gZXhwZWN0ZWQuc291cmNlICYmXG4gICAgICAgICAgIGFjdHVhbC5nbG9iYWwgPT09IGV4cGVjdGVkLmdsb2JhbCAmJlxuICAgICAgICAgICBhY3R1YWwubXVsdGlsaW5lID09PSBleHBlY3RlZC5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgYWN0dWFsLmxhc3RJbmRleCA9PT0gZXhwZWN0ZWQubGFzdEluZGV4ICYmXG4gICAgICAgICAgIGFjdHVhbC5pZ25vcmVDYXNlID09PSBleHBlY3RlZC5pZ25vcmVDYXNlO1xuXG4gIC8vIDcuNC4gT3RoZXIgcGFpcnMgdGhhdCBkbyBub3QgYm90aCBwYXNzIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyxcbiAgLy8gZXF1aXZhbGVuY2UgaXMgZGV0ZXJtaW5lZCBieSA9PS5cbiAgfSBlbHNlIGlmICgoYWN0dWFsID09PSBudWxsIHx8IHR5cGVvZiBhY3R1YWwgIT09ICdvYmplY3QnKSAmJlxuICAgICAgICAgICAgIChleHBlY3RlZCA9PT0gbnVsbCB8fCB0eXBlb2YgZXhwZWN0ZWQgIT09ICdvYmplY3QnKSkge1xuICAgIHJldHVybiBzdHJpY3QgPyBhY3R1YWwgPT09IGV4cGVjdGVkIDogYWN0dWFsID09IGV4cGVjdGVkO1xuXG4gIC8vIElmIGJvdGggdmFsdWVzIGFyZSBpbnN0YW5jZXMgb2YgdHlwZWQgYXJyYXlzLCB3cmFwIHRoZWlyIHVuZGVybHlpbmdcbiAgLy8gQXJyYXlCdWZmZXJzIGluIGEgQnVmZmVyIGVhY2ggdG8gaW5jcmVhc2UgcGVyZm9ybWFuY2VcbiAgLy8gVGhpcyBvcHRpbWl6YXRpb24gcmVxdWlyZXMgdGhlIGFycmF5cyB0byBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgY2hlY2tlZCBieVxuICAvLyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIChha2EgcFRvU3RyaW5nKS4gTmV2ZXIgcGVyZm9ybSBiaW5hcnlcbiAgLy8gY29tcGFyaXNvbnMgZm9yIEZsb2F0KkFycmF5cywgdGhvdWdoLCBzaW5jZSBlLmcuICswID09PSAtMCBidXQgdGhlaXJcbiAgLy8gYml0IHBhdHRlcm5zIGFyZSBub3QgaWRlbnRpY2FsLlxuICB9IGVsc2UgaWYgKGlzVmlldyhhY3R1YWwpICYmIGlzVmlldyhleHBlY3RlZCkgJiZcbiAgICAgICAgICAgICBwVG9TdHJpbmcoYWN0dWFsKSA9PT0gcFRvU3RyaW5nKGV4cGVjdGVkKSAmJlxuICAgICAgICAgICAgICEoYWN0dWFsIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8XG4gICAgICAgICAgICAgICBhY3R1YWwgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUobmV3IFVpbnQ4QXJyYXkoYWN0dWFsLmJ1ZmZlciksXG4gICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoZXhwZWN0ZWQuYnVmZmVyKSkgPT09IDA7XG5cbiAgLy8gNy41IEZvciBhbGwgb3RoZXIgT2JqZWN0IHBhaXJzLCBpbmNsdWRpbmcgQXJyYXkgb2JqZWN0cywgZXF1aXZhbGVuY2UgaXNcbiAgLy8gZGV0ZXJtaW5lZCBieSBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGFzIHZlcmlmaWVkXG4gIC8vIHdpdGggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKSwgdGhlIHNhbWUgc2V0IG9mIGtleXNcbiAgLy8gKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeVxuICAvLyBjb3JyZXNwb25kaW5nIGtleSwgYW5kIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS4gTm90ZTogdGhpc1xuICAvLyBhY2NvdW50cyBmb3IgYm90aCBuYW1lZCBhbmQgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIEFycmF5cy5cbiAgfSBlbHNlIGlmIChpc0J1ZmZlcihhY3R1YWwpICE9PSBpc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgbWVtb3MgPSBtZW1vcyB8fCB7YWN0dWFsOiBbXSwgZXhwZWN0ZWQ6IFtdfTtcblxuICAgIHZhciBhY3R1YWxJbmRleCA9IG1lbW9zLmFjdHVhbC5pbmRleE9mKGFjdHVhbCk7XG4gICAgaWYgKGFjdHVhbEluZGV4ICE9PSAtMSkge1xuICAgICAgaWYgKGFjdHVhbEluZGV4ID09PSBtZW1vcy5leHBlY3RlZC5pbmRleE9mKGV4cGVjdGVkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtZW1vcy5hY3R1YWwucHVzaChhY3R1YWwpO1xuICAgIG1lbW9zLmV4cGVjdGVkLnB1c2goZXhwZWN0ZWQpO1xuXG4gICAgcmV0dXJuIG9iakVxdWl2KGFjdHVhbCwgZXhwZWN0ZWQsIHN0cmljdCwgbWVtb3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQXJndW1lbnRzKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG59XG5cbmZ1bmN0aW9uIG9iakVxdWl2KGEsIGIsIHN0cmljdCwgYWN0dWFsVmlzaXRlZE9iamVjdHMpIHtcbiAgaWYgKGEgPT09IG51bGwgfHwgYSA9PT0gdW5kZWZpbmVkIHx8IGIgPT09IG51bGwgfHwgYiA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy8gaWYgb25lIGlzIGEgcHJpbWl0aXZlLCB0aGUgb3RoZXIgbXVzdCBiZSBzYW1lXG4gIGlmICh1dGlsLmlzUHJpbWl0aXZlKGEpIHx8IHV0aWwuaXNQcmltaXRpdmUoYikpXG4gICAgcmV0dXJuIGEgPT09IGI7XG4gIGlmIChzdHJpY3QgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpICE9PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYikpXG4gICAgcmV0dXJuIGZhbHNlO1xuICB2YXIgYUlzQXJncyA9IGlzQXJndW1lbnRzKGEpO1xuICB2YXIgYklzQXJncyA9IGlzQXJndW1lbnRzKGIpO1xuICBpZiAoKGFJc0FyZ3MgJiYgIWJJc0FyZ3MpIHx8ICghYUlzQXJncyAmJiBiSXNBcmdzKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChhSXNBcmdzKSB7XG4gICAgYSA9IHBTbGljZS5jYWxsKGEpO1xuICAgIGIgPSBwU2xpY2UuY2FsbChiKTtcbiAgICByZXR1cm4gX2RlZXBFcXVhbChhLCBiLCBzdHJpY3QpO1xuICB9XG4gIHZhciBrYSA9IG9iamVjdEtleXMoYSk7XG4gIHZhciBrYiA9IG9iamVjdEtleXMoYik7XG4gIHZhciBrZXksIGk7XG4gIC8vIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoa2V5cyBpbmNvcnBvcmF0ZXNcbiAgLy8gaGFzT3duUHJvcGVydHkpXG4gIGlmIChrYS5sZW5ndGggIT09IGtiLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2U7XG4gIC8vdGhlIHNhbWUgc2V0IG9mIGtleXMgKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksXG4gIGthLnNvcnQoKTtcbiAga2Iuc29ydCgpO1xuICAvL35+fmNoZWFwIGtleSB0ZXN0XG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGthW2ldICE9PSBrYltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvL2VxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeSBjb3JyZXNwb25kaW5nIGtleSwgYW5kXG4gIC8vfn5+cG9zc2libHkgZXhwZW5zaXZlIGRlZXAgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGtleSA9IGthW2ldO1xuICAgIGlmICghX2RlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgc3RyaWN0LCBhY3R1YWxWaXNpdGVkT2JqZWN0cykpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIDguIFRoZSBub24tZXF1aXZhbGVuY2UgYXNzZXJ0aW9uIHRlc3RzIGZvciBhbnkgZGVlcCBpbmVxdWFsaXR5LlxuLy8gYXNzZXJ0Lm5vdERlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3REZWVwRXF1YWwgPSBmdW5jdGlvbiBub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBmYWxzZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdub3REZWVwRXF1YWwnLCBhc3NlcnQubm90RGVlcEVxdWFsKTtcbiAgfVxufTtcblxuYXNzZXJ0Lm5vdERlZXBTdHJpY3RFcXVhbCA9IG5vdERlZXBTdHJpY3RFcXVhbDtcbmZ1bmN0aW9uIG5vdERlZXBTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHRydWUpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnbm90RGVlcFN0cmljdEVxdWFsJywgbm90RGVlcFN0cmljdEVxdWFsKTtcbiAgfVxufVxuXG5cbi8vIDkuIFRoZSBzdHJpY3QgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHN0cmljdCBlcXVhbGl0eSwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4vLyBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQuc3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBzdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnPT09JywgYXNzZXJ0LnN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gMTAuIFRoZSBzdHJpY3Qgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igc3RyaWN0IGluZXF1YWxpdHksIGFzXG4vLyBkZXRlcm1pbmVkIGJ5ICE9PS4gIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIG5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICchPT0nLCBhc3NlcnQubm90U3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7XG4gIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZXhwZWN0ZWQpID09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7XG4gICAgcmV0dXJuIGV4cGVjdGVkLnRlc3QoYWN0dWFsKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGFjdHVhbCBpbnN0YW5jZW9mIGV4cGVjdGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZ25vcmUuICBUaGUgaW5zdGFuY2VvZiBjaGVjayBkb2Vzbid0IHdvcmsgZm9yIGFycm93IGZ1bmN0aW9ucy5cbiAgfVxuXG4gIGlmIChFcnJvci5pc1Byb3RvdHlwZU9mKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBleHBlY3RlZC5jYWxsKHt9LCBhY3R1YWwpID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiBfdHJ5QmxvY2soYmxvY2spIHtcbiAgdmFyIGVycm9yO1xuICB0cnkge1xuICAgIGJsb2NrKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvciA9IGU7XG4gIH1cbiAgcmV0dXJuIGVycm9yO1xufVxuXG5mdW5jdGlvbiBfdGhyb3dzKHNob3VsZFRocm93LCBibG9jaywgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGFjdHVhbDtcblxuICBpZiAodHlwZW9mIGJsb2NrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJibG9ja1wiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gJ3N0cmluZycpIHtcbiAgICBtZXNzYWdlID0gZXhwZWN0ZWQ7XG4gICAgZXhwZWN0ZWQgPSBudWxsO1xuICB9XG5cbiAgYWN0dWFsID0gX3RyeUJsb2NrKGJsb2NrKTtcblxuICBtZXNzYWdlID0gKGV4cGVjdGVkICYmIGV4cGVjdGVkLm5hbWUgPyAnICgnICsgZXhwZWN0ZWQubmFtZSArICcpLicgOiAnLicpICtcbiAgICAgICAgICAgIChtZXNzYWdlID8gJyAnICsgbWVzc2FnZSA6ICcuJyk7XG5cbiAgaWYgKHNob3VsZFRocm93ICYmICFhY3R1YWwpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsICdNaXNzaW5nIGV4cGVjdGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIHZhciB1c2VyUHJvdmlkZWRNZXNzYWdlID0gdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnO1xuICB2YXIgaXNVbndhbnRlZEV4Y2VwdGlvbiA9ICFzaG91bGRUaHJvdyAmJiB1dGlsLmlzRXJyb3IoYWN0dWFsKTtcbiAgdmFyIGlzVW5leHBlY3RlZEV4Y2VwdGlvbiA9ICFzaG91bGRUaHJvdyAmJiBhY3R1YWwgJiYgIWV4cGVjdGVkO1xuXG4gIGlmICgoaXNVbndhbnRlZEV4Y2VwdGlvbiAmJlxuICAgICAgdXNlclByb3ZpZGVkTWVzc2FnZSAmJlxuICAgICAgZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHx8XG4gICAgICBpc1VuZXhwZWN0ZWRFeGNlcHRpb24pIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsICdHb3QgdW53YW50ZWQgZXhjZXB0aW9uJyArIG1lc3NhZ2UpO1xuICB9XG5cbiAgaWYgKChzaG91bGRUaHJvdyAmJiBhY3R1YWwgJiYgZXhwZWN0ZWQgJiZcbiAgICAgICFleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSkgfHwgKCFzaG91bGRUaHJvdyAmJiBhY3R1YWwpKSB7XG4gICAgdGhyb3cgYWN0dWFsO1xuICB9XG59XG5cbi8vIDExLiBFeHBlY3RlZCB0byB0aHJvdyBhbiBlcnJvcjpcbi8vIGFzc2VydC50aHJvd3MoYmxvY2ssIEVycm9yX29wdCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQudGhyb3dzID0gZnVuY3Rpb24oYmxvY2ssIC8qb3B0aW9uYWwqL2Vycm9yLCAvKm9wdGlvbmFsKi9tZXNzYWdlKSB7XG4gIF90aHJvd3ModHJ1ZSwgYmxvY2ssIGVycm9yLCBtZXNzYWdlKTtcbn07XG5cbi8vIEVYVEVOU0lPTiEgVGhpcyBpcyBhbm5veWluZyB0byB3cml0ZSBvdXRzaWRlIHRoaXMgbW9kdWxlLlxuYXNzZXJ0LmRvZXNOb3RUaHJvdyA9IGZ1bmN0aW9uKGJsb2NrLCAvKm9wdGlvbmFsKi9lcnJvciwgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzKGZhbHNlLCBibG9jaywgZXJyb3IsIG1lc3NhZ2UpO1xufTtcblxuYXNzZXJ0LmlmRXJyb3IgPSBmdW5jdGlvbihlcnIpIHsgaWYgKGVycikgdGhyb3cgZXJyOyB9O1xuXG4vLyBFeHBvc2UgYSBzdHJpY3Qgb25seSB2YXJpYW50IG9mIGFzc2VydFxuZnVuY3Rpb24gc3RyaWN0KHZhbHVlLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsdWUpIGZhaWwodmFsdWUsIHRydWUsIG1lc3NhZ2UsICc9PScsIHN0cmljdCk7XG59XG5hc3NlcnQuc3RyaWN0ID0gb2JqZWN0QXNzaWduKHN0cmljdCwgYXNzZXJ0LCB7XG4gIGVxdWFsOiBhc3NlcnQuc3RyaWN0RXF1YWwsXG4gIGRlZXBFcXVhbDogYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCxcbiAgbm90RXF1YWw6IGFzc2VydC5ub3RTdHJpY3RFcXVhbCxcbiAgbm90RGVlcEVxdWFsOiBhc3NlcnQubm90RGVlcFN0cmljdEVxdWFsXG59KTtcbmFzc2VydC5zdHJpY3Quc3RyaWN0ID0gYXNzZXJ0LnN0cmljdDtcblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoaGFzT3duLmNhbGwob2JqLCBrZXkpKSBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4ga2V5cztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gVW5pdEJlemllcjtcblxuZnVuY3Rpb24gVW5pdEJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIHBvbHlub21pYWwgY29lZmZpY2llbnRzLCBpbXBsaWNpdCBmaXJzdCBhbmQgbGFzdCBjb250cm9sIHBvaW50cyBhcmUgKDAsMCkgYW5kICgxLDEpLlxuICAgIHRoaXMuY3ggPSAzLjAgKiBwMXg7XG4gICAgdGhpcy5ieCA9IDMuMCAqIChwMnggLSBwMXgpIC0gdGhpcy5jeDtcbiAgICB0aGlzLmF4ID0gMS4wIC0gdGhpcy5jeCAtIHRoaXMuYng7XG5cbiAgICB0aGlzLmN5ID0gMy4wICogcDF5O1xuICAgIHRoaXMuYnkgPSAzLjAgKiAocDJ5IC0gcDF5KSAtIHRoaXMuY3k7XG4gICAgdGhpcy5heSA9IDEuMCAtIHRoaXMuY3kgLSB0aGlzLmJ5O1xuXG4gICAgdGhpcy5wMXggPSBwMXg7XG4gICAgdGhpcy5wMXkgPSBwMXk7XG4gICAgdGhpcy5wMnggPSBwMng7XG4gICAgdGhpcy5wMnkgPSBwMnk7XG59XG5cblVuaXRCZXppZXIucHJvdG90eXBlID0ge1xuICAgIHNhbXBsZUN1cnZlWDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgLy8gYGF4IHReMyArIGJ4IHReMiArIGN4IHQnIGV4cGFuZGVkIHVzaW5nIEhvcm5lcidzIHJ1bGUuXG4gICAgICAgIHJldHVybiAoKHRoaXMuYXggKiB0ICsgdGhpcy5ieCkgKiB0ICsgdGhpcy5jeCkgKiB0O1xuICAgIH0sXG5cbiAgICBzYW1wbGVDdXJ2ZVk6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiAoKHRoaXMuYXkgKiB0ICsgdGhpcy5ieSkgKiB0ICsgdGhpcy5jeSkgKiB0O1xuICAgIH0sXG5cbiAgICBzYW1wbGVDdXJ2ZURlcml2YXRpdmVYOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gKDMuMCAqIHRoaXMuYXggKiB0ICsgMi4wICogdGhpcy5ieCkgKiB0ICsgdGhpcy5jeDtcbiAgICB9LFxuXG4gICAgc29sdmVDdXJ2ZVg6IGZ1bmN0aW9uICh4LCBlcHNpbG9uKSB7XG4gICAgICAgIGlmIChlcHNpbG9uID09PSB1bmRlZmluZWQpIGVwc2lsb24gPSAxZS02O1xuXG4gICAgICAgIGlmICh4IDwgMC4wKSByZXR1cm4gMC4wO1xuICAgICAgICBpZiAoeCA+IDEuMCkgcmV0dXJuIDEuMDtcblxuICAgICAgICB2YXIgdCA9IHg7XG5cbiAgICAgICAgLy8gRmlyc3QgdHJ5IGEgZmV3IGl0ZXJhdGlvbnMgb2YgTmV3dG9uJ3MgbWV0aG9kIC0gbm9ybWFsbHkgdmVyeSBmYXN0LlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodCkgLSB4O1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHgyKSA8IGVwc2lsb24pIHJldHVybiB0O1xuXG4gICAgICAgICAgICB2YXIgZDIgPSB0aGlzLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVgodCk7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZDIpIDwgMWUtNikgYnJlYWs7XG5cbiAgICAgICAgICAgIHQgPSB0IC0geDIgLyBkMjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgYmlzZWN0aW9uIG1ldGhvZCBmb3IgcmVsaWFiaWxpdHkuXG4gICAgICAgIHZhciB0MCA9IDAuMDtcbiAgICAgICAgdmFyIHQxID0gMS4wO1xuICAgICAgICB0ID0geDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykge1xuICAgICAgICAgICAgeDIgPSB0aGlzLnNhbXBsZUN1cnZlWCh0KTtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh4MiAtIHgpIDwgZXBzaWxvbikgYnJlYWs7XG5cbiAgICAgICAgICAgIGlmICh4ID4geDIpIHtcbiAgICAgICAgICAgICAgICB0MCA9IHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHQxID0gdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdCA9ICh0MSAtIHQwKSAqIDAuNSArIHQwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfSxcblxuICAgIHNvbHZlOiBmdW5jdGlvbiAoeCwgZXBzaWxvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zYW1wbGVDdXJ2ZVkodGhpcy5zb2x2ZUN1cnZlWCh4LCBlcHNpbG9uKSk7XG4gICAgfVxufTtcbiIsbnVsbCxudWxsLG51bGwsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQb2ludDtcblxuLyoqXG4gKiBBIHN0YW5kYWxvbmUgcG9pbnQgZ2VvbWV0cnkgd2l0aCB1c2VmdWwgYWNjZXNzb3IsIGNvbXBhcmlzb24sIGFuZFxuICogbW9kaWZpY2F0aW9uIG1ldGhvZHMuXG4gKlxuICogQGNsYXNzIFBvaW50XG4gKiBAcGFyYW0ge051bWJlcn0geCB0aGUgeC1jb29yZGluYXRlLiB0aGlzIGNvdWxkIGJlIGxvbmdpdHVkZSBvciBzY3JlZW5cbiAqIHBpeGVscywgb3IgYW55IG90aGVyIHNvcnQgb2YgdW5pdC5cbiAqIEBwYXJhbSB7TnVtYmVyfSB5IHRoZSB5LWNvb3JkaW5hdGUuIHRoaXMgY291bGQgYmUgbGF0aXR1ZGUgb3Igc2NyZWVuXG4gKiBwaXhlbHMsIG9yIGFueSBvdGhlciBzb3J0IG9mIHVuaXQuXG4gKiBAZXhhbXBsZVxuICogdmFyIHBvaW50ID0gbmV3IFBvaW50KC03NywgMzgpO1xuICovXG5mdW5jdGlvbiBQb2ludCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xufVxuXG5Qb2ludC5wcm90b3R5cGUgPSB7XG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSB0aGlzIHBvaW50LCByZXR1cm5pbmcgYSBuZXcgcG9pbnQgdGhhdCBjYW4gYmUgbW9kaWZpZWRcbiAgICAgKiB3aXRob3V0IGFmZmVjdGluZyB0aGUgb2xkIG9uZS5cbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gdGhlIGNsb25lXG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IFBvaW50KHRoaXMueCwgdGhpcy55KTsgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgdG8gYW5vdGhlciBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBhZGQ6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2FkZChwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyB0byBmcm9tIHBvaW50LFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIHN1YjogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIGJ5IHBvaW50LFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIG11bHRCeVBvaW50OiAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX211bHRCeVBvaW50KHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyBieSBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBkaXZCeVBvaW50OiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIGJ5IGEgZmFjdG9yLFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IGsgZmFjdG9yXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIG11bHQ6ICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdChrKTsgfSxcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgYnkgYSBmYWN0b3IsXG4gICAgICogeWllbGRpbmcgYSBuZXcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtQb2ludH0gayBmYWN0b3JcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgZGl2OiAgICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYoayk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgdGhpcyBwb2ludCBhcm91bmQgdGhlIDAsIDAgb3JpZ2luIGJ5IGFuIGFuZ2xlIGEsXG4gICAgICogZ2l2ZW4gaW4gcmFkaWFuc1xuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBhIGFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQsIGluIHJhZGlhbnNcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgcm90YXRlOiAgZnVuY3Rpb24oYSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUoYSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgdGhpcyBwb2ludCBhcm91bmQgcCBwb2ludCBieSBhbiBhbmdsZSBhLFxuICAgICAqIGdpdmVuIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYSBhbmdsZSB0byByb3RhdGUgYXJvdW5kLCBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCBQb2ludCB0byByb3RhdGUgYXJvdW5kXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIHJvdGF0ZUFyb3VuZDogIGZ1bmN0aW9uKGEscCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGVBcm91bmQoYSxwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHRoaXMgcG9pbnQgYnkgYSA0eDEgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgICogQHBhcmFtIHtBcnJheTxOdW1iZXI+fSBtIHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBtYXRNdWx0OiBmdW5jdGlvbihtKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQobSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhpcyBwb2ludCBidXQgYXMgYSB1bml0IHZlY3RvciBmcm9tIDAsIDAsIG1lYW5pbmdcbiAgICAgKiB0aGF0IHRoZSBkaXN0YW5jZSBmcm9tIHRoZSByZXN1bHRpbmcgcG9pbnQgdG8gdGhlIDAsIDBcbiAgICAgKiBjb29yZGluYXRlIHdpbGwgYmUgZXF1YWwgdG8gMSBhbmQgdGhlIGFuZ2xlIGZyb20gdGhlIHJlc3VsdGluZ1xuICAgICAqIHBvaW50IHRvIHRoZSAwLCAwIGNvb3JkaW5hdGUgd2lsbCBiZSB0aGUgc2FtZSBhcyBiZWZvcmUuXG4gICAgICogQHJldHVybiB7UG9pbnR9IHVuaXQgdmVjdG9yIHBvaW50XG4gICAgICovXG4gICAgdW5pdDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKTsgfSxcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGUgYSBwZXJwZW5kaWN1bGFyIHBvaW50LCB3aGVyZSB0aGUgbmV3IHkgY29vcmRpbmF0ZVxuICAgICAqIGlzIHRoZSBvbGQgeCBjb29yZGluYXRlIGFuZCB0aGUgbmV3IHggY29vcmRpbmF0ZSBpcyB0aGUgb2xkIHlcbiAgICAgKiBjb29yZGluYXRlIG11bHRpcGxpZWQgYnkgLTFcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gcGVycGVuZGljdWxhciBwb2ludFxuICAgICAqL1xuICAgIHBlcnA6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB2ZXJzaW9uIG9mIHRoaXMgcG9pbnQgd2l0aCB0aGUgeCAmIHkgY29vcmRpbmF0ZXNcbiAgICAgKiByb3VuZGVkIHRvIGludGVnZXJzLlxuICAgICAqIEByZXR1cm4ge1BvaW50fSByb3VuZGVkIHBvaW50XG4gICAgICovXG4gICAgcm91bmQ6ICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG1hZ2l0dWRlIG9mIHRoaXMgcG9pbnQ6IHRoaXMgaXMgdGhlIEV1Y2xpZGVhblxuICAgICAqIGRpc3RhbmNlIGZyb20gdGhlIDAsIDAgY29vcmRpbmF0ZSB0byB0aGlzIHBvaW50J3MgeCBhbmQgeVxuICAgICAqIGNvb3JkaW5hdGVzLlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gbWFnbml0dWRlXG4gICAgICovXG4gICAgbWFnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBKdWRnZSB3aGV0aGVyIHRoaXMgcG9pbnQgaXMgZXF1YWwgdG8gYW5vdGhlciBwb2ludCwgcmV0dXJuaW5nXG4gICAgICogdHJ1ZSBvciBmYWxzZS5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBvdGhlciB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB3aGV0aGVyIHRoZSBwb2ludHMgYXJlIGVxdWFsXG4gICAgICovXG4gICAgZXF1YWxzOiBmdW5jdGlvbihvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy54ID09PSBvdGhlci54ICYmXG4gICAgICAgICAgICAgICB0aGlzLnkgPT09IG90aGVyLnk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIHBvaW50IHRvIGFub3RoZXIgcG9pbnRcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAgICAgKi9cbiAgICBkaXN0OiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHApKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgcG9pbnQgdG8gYW5vdGhlciBwb2ludCxcbiAgICAgKiB3aXRob3V0IHRoZSBzcXVhcmUgcm9vdCBzdGVwLiBVc2VmdWwgaWYgeW91J3JlIGNvbXBhcmluZ1xuICAgICAqIHJlbGF0aXZlIGRpc3RhbmNlcy5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAgICAgKi9cbiAgICBkaXN0U3FyOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHZhciBkeCA9IHAueCAtIHRoaXMueCxcbiAgICAgICAgICAgIGR5ID0gcC55IC0gdGhpcy55O1xuICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYW5nbGUgZnJvbSB0aGUgMCwgMCBjb29yZGluYXRlIHRvIHRoaXMgcG9pbnQsIGluIHJhZGlhbnNcbiAgICAgKiBjb29yZGluYXRlcy5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gICAgICovXG4gICAgYW5nbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksIHRoaXMueCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYW5nbGUgZnJvbSB0aGlzIHBvaW50IHRvIGFub3RoZXIgcG9pbnQsIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBiIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gYW5nbGVcbiAgICAgKi9cbiAgICBhbmdsZVRvOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSAtIGIueSwgdGhpcy54IC0gYi54KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIGFub3RoZXIgcG9pbnQsIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBiIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gYW5nbGVcbiAgICAgKi9cbiAgICBhbmdsZVdpdGg6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKGIueCwgYi55KTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgKiBGaW5kIHRoZSBhbmdsZSBvZiB0aGUgdHdvIHZlY3RvcnMsIHNvbHZpbmcgdGhlIGZvcm11bGEgZm9yXG4gICAgICogdGhlIGNyb3NzIHByb2R1Y3QgYSB4IGIgPSB8YXx8YnxzaW4ozrgpIGZvciDOuC5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0geCB0aGUgeC1jb29yZGluYXRlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHkgdGhlIHktY29vcmRpbmF0ZVxuICAgICAqIEByZXR1cm4ge051bWJlcn0gdGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAgICAgKi9cbiAgICBhbmdsZVdpdGhTZXA6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIoXG4gICAgICAgICAgICB0aGlzLnggKiB5IC0gdGhpcy55ICogeCxcbiAgICAgICAgICAgIHRoaXMueCAqIHggKyB0aGlzLnkgKiB5KTtcbiAgICB9LFxuXG4gICAgX21hdE11bHQ6IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgdmFyIHggPSBtWzBdICogdGhpcy54ICsgbVsxXSAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBtWzJdICogdGhpcy54ICsgbVszXSAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9hZGQ6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54ICs9IHAueDtcbiAgICAgICAgdGhpcy55ICs9IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9zdWI6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54IC09IHAueDtcbiAgICAgICAgdGhpcy55IC09IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9tdWx0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAqPSBrO1xuICAgICAgICB0aGlzLnkgKj0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kaXY6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54IC89IGs7XG4gICAgICAgIHRoaXMueSAvPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX211bHRCeVBvaW50OiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCAqPSBwLng7XG4gICAgICAgIHRoaXMueSAqPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfZGl2QnlQb2ludDogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggLz0gcC54O1xuICAgICAgICB0aGlzLnkgLz0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3VuaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9kaXYodGhpcy5tYWcoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcGVycDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xuICAgICAgICB0aGlzLnkgPSB0aGlzLng7XG4gICAgICAgIHRoaXMueCA9IC15O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdGF0ZTogZnVuY3Rpb24oYW5nbGUpIHtcbiAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIHggPSBjb3MgKiB0aGlzLnggLSBzaW4gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gc2luICogdGhpcy54ICsgY29zICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdGF0ZUFyb3VuZDogZnVuY3Rpb24oYW5nbGUsIHApIHtcbiAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIHggPSBwLnggKyBjb3MgKiAodGhpcy54IC0gcC54KSAtIHNpbiAqICh0aGlzLnkgLSBwLnkpLFxuICAgICAgICAgICAgeSA9IHAueSArIHNpbiAqICh0aGlzLnggLSBwLngpICsgY29zICogKHRoaXMueSAtIHAueSk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm91bmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnggPSBNYXRoLnJvdW5kKHRoaXMueCk7XG4gICAgICAgIHRoaXMueSA9IE1hdGgucm91bmQodGhpcy55KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSBwb2ludCBmcm9tIGFuIGFycmF5IGlmIG5lY2Vzc2FyeSwgb3RoZXJ3aXNlIGlmIHRoZSBpbnB1dFxuICogaXMgYWxyZWFkeSBhIFBvaW50LCBvciBhbiB1bmtub3duIHR5cGUsIHJldHVybiBpdCB1bmNoYW5nZWRcbiAqIEBwYXJhbSB7QXJyYXk8TnVtYmVyPnxQb2ludHwqfSBhIGFueSBraW5kIG9mIGlucHV0IHZhbHVlXG4gKiBAcmV0dXJuIHtQb2ludH0gY29uc3RydWN0ZWQgcG9pbnQsIG9yIHBhc3NlZC10aHJvdWdoIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqIC8vIHRoaXNcbiAqIHZhciBwb2ludCA9IFBvaW50LmNvbnZlcnQoWzAsIDFdKTtcbiAqIC8vIGlzIGVxdWl2YWxlbnQgdG9cbiAqIHZhciBwb2ludCA9IG5ldyBQb2ludCgwLCAxKTtcbiAqL1xuUG9pbnQuY29udmVydCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBQb2ludCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChhWzBdLCBhWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG59O1xuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiLy8gKGMpIERlYW4gTWNOYW1lZSA8ZGVhbkBnbWFpbC5jb20+LCAyMDEyLlxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kZWFubS9jc3MtY29sb3ItcGFyc2VyLWpzXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbi8vIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1Ncbi8vIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci9cbnZhciBrQ1NTQ29sb3JUYWJsZSA9IHtcbiAgXCJ0cmFuc3BhcmVudFwiOiBbMCwwLDAsMF0sIFwiYWxpY2VibHVlXCI6IFsyNDAsMjQ4LDI1NSwxXSxcbiAgXCJhbnRpcXVld2hpdGVcIjogWzI1MCwyMzUsMjE1LDFdLCBcImFxdWFcIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJhcXVhbWFyaW5lXCI6IFsxMjcsMjU1LDIxMiwxXSwgXCJhenVyZVwiOiBbMjQwLDI1NSwyNTUsMV0sXG4gIFwiYmVpZ2VcIjogWzI0NSwyNDUsMjIwLDFdLCBcImJpc3F1ZVwiOiBbMjU1LDIyOCwxOTYsMV0sXG4gIFwiYmxhY2tcIjogWzAsMCwwLDFdLCBcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsMjM1LDIwNSwxXSxcbiAgXCJibHVlXCI6IFswLDAsMjU1LDFdLCBcImJsdWV2aW9sZXRcIjogWzEzOCw0MywyMjYsMV0sXG4gIFwiYnJvd25cIjogWzE2NSw0Miw0MiwxXSwgXCJidXJseXdvb2RcIjogWzIyMiwxODQsMTM1LDFdLFxuICBcImNhZGV0Ymx1ZVwiOiBbOTUsMTU4LDE2MCwxXSwgXCJjaGFydHJldXNlXCI6IFsxMjcsMjU1LDAsMV0sXG4gIFwiY2hvY29sYXRlXCI6IFsyMTAsMTA1LDMwLDFdLCBcImNvcmFsXCI6IFsyNTUsMTI3LDgwLDFdLFxuICBcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsMTQ5LDIzNywxXSwgXCJjb3Juc2lsa1wiOiBbMjU1LDI0OCwyMjAsMV0sXG4gIFwiY3JpbXNvblwiOiBbMjIwLDIwLDYwLDFdLCBcImN5YW5cIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJkYXJrYmx1ZVwiOiBbMCwwLDEzOSwxXSwgXCJkYXJrY3lhblwiOiBbMCwxMzksMTM5LDFdLFxuICBcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwxMzQsMTEsMV0sIFwiZGFya2dyYXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtncmVlblwiOiBbMCwxMDAsMCwxXSwgXCJkYXJrZ3JleVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2toYWtpXCI6IFsxODksMTgzLDEwNywxXSwgXCJkYXJrbWFnZW50YVwiOiBbMTM5LDAsMTM5LDFdLFxuICBcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwxMDcsNDcsMV0sIFwiZGFya29yYW5nZVwiOiBbMjU1LDE0MCwwLDFdLFxuICBcImRhcmtvcmNoaWRcIjogWzE1Myw1MCwyMDQsMV0sIFwiZGFya3JlZFwiOiBbMTM5LDAsMCwxXSxcbiAgXCJkYXJrc2FsbW9uXCI6IFsyMzMsMTUwLDEyMiwxXSwgXCJkYXJrc2VhZ3JlZW5cIjogWzE0MywxODgsMTQzLDFdLFxuICBcImRhcmtzbGF0ZWJsdWVcIjogWzcyLDYxLDEzOSwxXSwgXCJkYXJrc2xhdGVncmF5XCI6IFs0Nyw3OSw3OSwxXSxcbiAgXCJkYXJrc2xhdGVncmV5XCI6IFs0Nyw3OSw3OSwxXSwgXCJkYXJrdHVycXVvaXNlXCI6IFswLDIwNiwyMDksMV0sXG4gIFwiZGFya3Zpb2xldFwiOiBbMTQ4LDAsMjExLDFdLCBcImRlZXBwaW5rXCI6IFsyNTUsMjAsMTQ3LDFdLFxuICBcImRlZXBza3libHVlXCI6IFswLDE5MSwyNTUsMV0sIFwiZGltZ3JheVwiOiBbMTA1LDEwNSwxMDUsMV0sXG4gIFwiZGltZ3JleVwiOiBbMTA1LDEwNSwxMDUsMV0sIFwiZG9kZ2VyYmx1ZVwiOiBbMzAsMTQ0LDI1NSwxXSxcbiAgXCJmaXJlYnJpY2tcIjogWzE3OCwzNCwzNCwxXSwgXCJmbG9yYWx3aGl0ZVwiOiBbMjU1LDI1MCwyNDAsMV0sXG4gIFwiZm9yZXN0Z3JlZW5cIjogWzM0LDEzOSwzNCwxXSwgXCJmdWNoc2lhXCI6IFsyNTUsMCwyNTUsMV0sXG4gIFwiZ2FpbnNib3JvXCI6IFsyMjAsMjIwLDIyMCwxXSwgXCJnaG9zdHdoaXRlXCI6IFsyNDgsMjQ4LDI1NSwxXSxcbiAgXCJnb2xkXCI6IFsyNTUsMjE1LDAsMV0sIFwiZ29sZGVucm9kXCI6IFsyMTgsMTY1LDMyLDFdLFxuICBcImdyYXlcIjogWzEyOCwxMjgsMTI4LDFdLCBcImdyZWVuXCI6IFswLDEyOCwwLDFdLFxuICBcImdyZWVueWVsbG93XCI6IFsxNzMsMjU1LDQ3LDFdLCBcImdyZXlcIjogWzEyOCwxMjgsMTI4LDFdLFxuICBcImhvbmV5ZGV3XCI6IFsyNDAsMjU1LDI0MCwxXSwgXCJob3RwaW5rXCI6IFsyNTUsMTA1LDE4MCwxXSxcbiAgXCJpbmRpYW5yZWRcIjogWzIwNSw5Miw5MiwxXSwgXCJpbmRpZ29cIjogWzc1LDAsMTMwLDFdLFxuICBcIml2b3J5XCI6IFsyNTUsMjU1LDI0MCwxXSwgXCJraGFraVwiOiBbMjQwLDIzMCwxNDAsMV0sXG4gIFwibGF2ZW5kZXJcIjogWzIzMCwyMzAsMjUwLDFdLCBcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwyNDAsMjQ1LDFdLFxuICBcImxhd25ncmVlblwiOiBbMTI0LDI1MiwwLDFdLCBcImxlbW9uY2hpZmZvblwiOiBbMjU1LDI1MCwyMDUsMV0sXG4gIFwibGlnaHRibHVlXCI6IFsxNzMsMjE2LDIzMCwxXSwgXCJsaWdodGNvcmFsXCI6IFsyNDAsMTI4LDEyOCwxXSxcbiAgXCJsaWdodGN5YW5cIjogWzIyNCwyNTUsMjU1LDFdLCBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsMjUwLDIxMCwxXSxcbiAgXCJsaWdodGdyYXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0Z3JlZW5cIjogWzE0NCwyMzgsMTQ0LDFdLFxuICBcImxpZ2h0Z3JleVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRwaW5rXCI6IFsyNTUsMTgyLDE5MywxXSxcbiAgXCJsaWdodHNhbG1vblwiOiBbMjU1LDE2MCwxMjIsMV0sIFwibGlnaHRzZWFncmVlblwiOiBbMzIsMTc4LDE3MCwxXSxcbiAgXCJsaWdodHNreWJsdWVcIjogWzEzNSwyMDYsMjUwLDFdLCBcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksMTM2LDE1MywxXSxcbiAgXCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LDEzNiwxNTMsMV0sIFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwxOTYsMjIyLDFdLFxuICBcImxpZ2h0eWVsbG93XCI6IFsyNTUsMjU1LDIyNCwxXSwgXCJsaW1lXCI6IFswLDI1NSwwLDFdLFxuICBcImxpbWVncmVlblwiOiBbNTAsMjA1LDUwLDFdLCBcImxpbmVuXCI6IFsyNTAsMjQwLDIzMCwxXSxcbiAgXCJtYWdlbnRhXCI6IFsyNTUsMCwyNTUsMV0sIFwibWFyb29uXCI6IFsxMjgsMCwwLDFdLFxuICBcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwyMDUsMTcwLDFdLCBcIm1lZGl1bWJsdWVcIjogWzAsMCwyMDUsMV0sXG4gIFwibWVkaXVtb3JjaGlkXCI6IFsxODYsODUsMjExLDFdLCBcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LDExMiwyMTksMV0sXG4gIFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLDE3OSwxMTMsMV0sIFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsMTA0LDIzOCwxXSxcbiAgXCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwyNTAsMTU0LDFdLCBcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsMjA5LDIwNCwxXSxcbiAgXCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwyMSwxMzMsMV0sIFwibWlkbmlnaHRibHVlXCI6IFsyNSwyNSwxMTIsMV0sXG4gIFwibWludGNyZWFtXCI6IFsyNDUsMjU1LDI1MCwxXSwgXCJtaXN0eXJvc2VcIjogWzI1NSwyMjgsMjI1LDFdLFxuICBcIm1vY2Nhc2luXCI6IFsyNTUsMjI4LDE4MSwxXSwgXCJuYXZham93aGl0ZVwiOiBbMjU1LDIyMiwxNzMsMV0sXG4gIFwibmF2eVwiOiBbMCwwLDEyOCwxXSwgXCJvbGRsYWNlXCI6IFsyNTMsMjQ1LDIzMCwxXSxcbiAgXCJvbGl2ZVwiOiBbMTI4LDEyOCwwLDFdLCBcIm9saXZlZHJhYlwiOiBbMTA3LDE0MiwzNSwxXSxcbiAgXCJvcmFuZ2VcIjogWzI1NSwxNjUsMCwxXSwgXCJvcmFuZ2VyZWRcIjogWzI1NSw2OSwwLDFdLFxuICBcIm9yY2hpZFwiOiBbMjE4LDExMiwyMTQsMV0sIFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LDIzMiwxNzAsMV0sXG4gIFwicGFsZWdyZWVuXCI6IFsxNTIsMjUxLDE1MiwxXSwgXCJwYWxldHVycXVvaXNlXCI6IFsxNzUsMjM4LDIzOCwxXSxcbiAgXCJwYWxldmlvbGV0cmVkXCI6IFsyMTksMTEyLDE0NywxXSwgXCJwYXBheWF3aGlwXCI6IFsyNTUsMjM5LDIxMywxXSxcbiAgXCJwZWFjaHB1ZmZcIjogWzI1NSwyMTgsMTg1LDFdLCBcInBlcnVcIjogWzIwNSwxMzMsNjMsMV0sXG4gIFwicGlua1wiOiBbMjU1LDE5MiwyMDMsMV0sIFwicGx1bVwiOiBbMjIxLDE2MCwyMjEsMV0sXG4gIFwicG93ZGVyYmx1ZVwiOiBbMTc2LDIyNCwyMzAsMV0sIFwicHVycGxlXCI6IFsxMjgsMCwxMjgsMV0sXG4gIFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLDUxLDE1MywxXSxcbiAgXCJyZWRcIjogWzI1NSwwLDAsMV0sIFwicm9zeWJyb3duXCI6IFsxODgsMTQzLDE0MywxXSxcbiAgXCJyb3lhbGJsdWVcIjogWzY1LDEwNSwyMjUsMV0sIFwic2FkZGxlYnJvd25cIjogWzEzOSw2OSwxOSwxXSxcbiAgXCJzYWxtb25cIjogWzI1MCwxMjgsMTE0LDFdLCBcInNhbmR5YnJvd25cIjogWzI0NCwxNjQsOTYsMV0sXG4gIFwic2VhZ3JlZW5cIjogWzQ2LDEzOSw4NywxXSwgXCJzZWFzaGVsbFwiOiBbMjU1LDI0NSwyMzgsMV0sXG4gIFwic2llbm5hXCI6IFsxNjAsODIsNDUsMV0sIFwic2lsdmVyXCI6IFsxOTIsMTkyLDE5MiwxXSxcbiAgXCJza3libHVlXCI6IFsxMzUsMjA2LDIzNSwxXSwgXCJzbGF0ZWJsdWVcIjogWzEwNiw5MCwyMDUsMV0sXG4gIFwic2xhdGVncmF5XCI6IFsxMTIsMTI4LDE0NCwxXSwgXCJzbGF0ZWdyZXlcIjogWzExMiwxMjgsMTQ0LDFdLFxuICBcInNub3dcIjogWzI1NSwyNTAsMjUwLDFdLCBcInNwcmluZ2dyZWVuXCI6IFswLDI1NSwxMjcsMV0sXG4gIFwic3RlZWxibHVlXCI6IFs3MCwxMzAsMTgwLDFdLCBcInRhblwiOiBbMjEwLDE4MCwxNDAsMV0sXG4gIFwidGVhbFwiOiBbMCwxMjgsMTI4LDFdLCBcInRoaXN0bGVcIjogWzIxNiwxOTEsMjE2LDFdLFxuICBcInRvbWF0b1wiOiBbMjU1LDk5LDcxLDFdLCBcInR1cnF1b2lzZVwiOiBbNjQsMjI0LDIwOCwxXSxcbiAgXCJ2aW9sZXRcIjogWzIzOCwxMzAsMjM4LDFdLCBcIndoZWF0XCI6IFsyNDUsMjIyLDE3OSwxXSxcbiAgXCJ3aGl0ZVwiOiBbMjU1LDI1NSwyNTUsMV0sIFwid2hpdGVzbW9rZVwiOiBbMjQ1LDI0NSwyNDUsMV0sXG4gIFwieWVsbG93XCI6IFsyNTUsMjU1LDAsMV0sIFwieWVsbG93Z3JlZW5cIjogWzE1NCwyMDUsNTAsMV19XG5cbmZ1bmN0aW9uIGNsYW1wX2Nzc19ieXRlKGkpIHsgIC8vIENsYW1wIHRvIGludGVnZXIgMCAuLiAyNTUuXG4gIGkgPSBNYXRoLnJvdW5kKGkpOyAgLy8gU2VlbXMgdG8gYmUgd2hhdCBDaHJvbWUgZG9lcyAodnMgdHJ1bmNhdGlvbikuXG4gIHJldHVybiBpIDwgMCA/IDAgOiBpID4gMjU1ID8gMjU1IDogaTtcbn1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2Zsb2F0KGYpIHsgIC8vIENsYW1wIHRvIGZsb2F0IDAuMCAuLiAxLjAuXG4gIHJldHVybiBmIDwgMCA/IDAgOiBmID4gMSA/IDEgOiBmO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfaW50KHN0cikgeyAgLy8gaW50IG9yIHBlcmNlbnRhZ2UuXG4gIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnJScpXG4gICAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlRmxvYXQoc3RyKSAvIDEwMCAqIDI1NSk7XG4gIHJldHVybiBjbGFtcF9jc3NfYnl0ZShwYXJzZUludChzdHIpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3NzX2Zsb2F0KHN0cikgeyAgLy8gZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2Zsb2F0KHBhcnNlRmxvYXQoc3RyKSAvIDEwMCk7XG4gIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpKTtcbn1cblxuZnVuY3Rpb24gY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSB7XG4gIGlmIChoIDwgMCkgaCArPSAxO1xuICBlbHNlIGlmIChoID4gMSkgaCAtPSAxO1xuXG4gIGlmIChoICogNiA8IDEpIHJldHVybiBtMSArIChtMiAtIG0xKSAqIGggKiA2O1xuICBpZiAoaCAqIDIgPCAxKSByZXR1cm4gbTI7XG4gIGlmIChoICogMyA8IDIpIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyLzMgLSBoKSAqIDY7XG4gIHJldHVybiBtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VDU1NDb2xvcihjc3Nfc3RyKSB7XG4gIC8vIFJlbW92ZSBhbGwgd2hpdGVzcGFjZSwgbm90IGNvbXBsaWFudCwgYnV0IHNob3VsZCBqdXN0IGJlIG1vcmUgYWNjZXB0aW5nLlxuICB2YXIgc3RyID0gY3NzX3N0ci5yZXBsYWNlKC8gL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIENvbG9yIGtleXdvcmRzIChhbmQgdHJhbnNwYXJlbnQpIGxvb2t1cC5cbiAgaWYgKHN0ciBpbiBrQ1NTQ29sb3JUYWJsZSkgcmV0dXJuIGtDU1NDb2xvclRhYmxlW3N0cl0uc2xpY2UoKTsgIC8vIGR1cC5cblxuICAvLyAjYWJjIGFuZCAjYWJjMTIzIHN5bnRheC5cbiAgaWYgKHN0clswXSA9PT0gJyMnKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPT09IDQpIHtcbiAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZikpIHJldHVybiBudWxsOyAgLy8gQ292ZXJzIE5hTi5cbiAgICAgIHJldHVybiBbKChpdiAmIDB4ZjAwKSA+PiA0KSB8ICgoaXYgJiAweGYwMCkgPj4gOCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZjApIHwgKChpdiAmIDB4ZjApID4+IDQpLFxuICAgICAgICAgICAgICAoaXYgJiAweGYpIHwgKChpdiAmIDB4ZikgPDwgNCksXG4gICAgICAgICAgICAgIDFdO1xuICAgIH0gZWxzZSBpZiAoc3RyLmxlbmd0aCA9PT0gNykge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoaXYgJiAweGZmMDAwMCkgPj4gMTYsXG4gICAgICAgICAgICAgIChpdiAmIDB4ZmYwMCkgPj4gOCxcbiAgICAgICAgICAgICAgaXYgJiAweGZmLFxuICAgICAgICAgICAgICAxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBvcCA9IHN0ci5pbmRleE9mKCcoJyksIGVwID0gc3RyLmluZGV4T2YoJyknKTtcbiAgaWYgKG9wICE9PSAtMSAmJiBlcCArIDEgPT09IHN0ci5sZW5ndGgpIHtcbiAgICB2YXIgZm5hbWUgPSBzdHIuc3Vic3RyKDAsIG9wKTtcbiAgICB2YXIgcGFyYW1zID0gc3RyLnN1YnN0cihvcCsxLCBlcC0ob3ArMSkpLnNwbGl0KCcsJyk7XG4gICAgdmFyIGFscGhhID0gMTsgIC8vIFRvIGFsbG93IGNhc2UgZmFsbHRocm91Z2guXG4gICAgc3dpdGNoIChmbmFtZSkge1xuICAgICAgY2FzZSAncmdiYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAncmdiJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gW3BhcnNlX2Nzc19pbnQocGFyYW1zWzBdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1sxXSksXG4gICAgICAgICAgICAgICAgcGFyc2VfY3NzX2ludChwYXJhbXNbMl0pLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGNhc2UgJ2hzbGEnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGFscGhhID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtcy5wb3AoKSk7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJ2hzbCc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGggPSAoKChwYXJzZUZsb2F0KHBhcmFtc1swXSkgJSAzNjApICsgMzYwKSAlIDM2MCkgLyAzNjA7ICAvLyAwIC4uIDFcbiAgICAgICAgLy8gTk9URShkZWFubSk6IEFjY29yZGluZyB0byB0aGUgQ1NTIHNwZWMgcy9sIHNob3VsZCBvbmx5IGJlXG4gICAgICAgIC8vIHBlcmNlbnRhZ2VzLCBidXQgd2UgZG9uJ3QgYm90aGVyIGFuZCBsZXQgZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgICAgICAgdmFyIHMgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzFdKTtcbiAgICAgICAgdmFyIGwgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzJdKTtcbiAgICAgICAgdmFyIG0yID0gbCA8PSAwLjUgPyBsICogKHMgKyAxKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgICAgIHZhciBtMSA9IGwgKiAyIC0gbTI7XG4gICAgICAgIHJldHVybiBbY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKzEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCkgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaC0xLzMpICogMjU1KSxcbiAgICAgICAgICAgICAgICBhbHBoYV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudHJ5IHsgZXhwb3J0cy5wYXJzZUNTU0NvbG9yID0gcGFyc2VDU1NDb2xvciB9IGNhdGNoKGUpIHsgfVxuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiLyoqXG4gKiBKUyBJbXBsZW1lbnRhdGlvbiBvZiBNdXJtdXJIYXNoMyAocjEzNikgKGFzIG9mIE1heSAyMCwgMjAxMSlcbiAqIFxuICogQGF1dGhvciA8YSBocmVmPVwibWFpbHRvOmdhcnkuY291cnRAZ21haWwuY29tXCI+R2FyeSBDb3VydDwvYT5cbiAqIEBzZWUgaHR0cDovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L211cm11cmhhc2gtanNcbiAqIEBhdXRob3IgPGEgaHJlZj1cIm1haWx0bzphYXBwbGVieUBnbWFpbC5jb21cIj5BdXN0aW4gQXBwbGVieTwvYT5cbiAqIEBzZWUgaHR0cDovL3NpdGVzLmdvb2dsZS5jb20vc2l0ZS9tdXJtdXJoYXNoL1xuICogXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IEFTQ0lJIG9ubHlcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWVkIFBvc2l0aXZlIGludGVnZXIgb25seVxuICogQHJldHVybiB7bnVtYmVyfSAzMi1iaXQgcG9zaXRpdmUgaW50ZWdlciBoYXNoIFxuICovXG5cbmZ1bmN0aW9uIG11cm11cmhhc2gzXzMyX2djKGtleSwgc2VlZCkge1xuXHR2YXIgcmVtYWluZGVyLCBieXRlcywgaDEsIGgxYiwgYzEsIGMxYiwgYzIsIGMyYiwgazEsIGk7XG5cdFxuXHRyZW1haW5kZXIgPSBrZXkubGVuZ3RoICYgMzsgLy8ga2V5Lmxlbmd0aCAlIDRcblx0Ynl0ZXMgPSBrZXkubGVuZ3RoIC0gcmVtYWluZGVyO1xuXHRoMSA9IHNlZWQ7XG5cdGMxID0gMHhjYzllMmQ1MTtcblx0YzIgPSAweDFiODczNTkzO1xuXHRpID0gMDtcblx0XG5cdHdoaWxlIChpIDwgYnl0ZXMpIHtcblx0ICBcdGsxID0gXG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoaSkgJiAweGZmKSkgfFxuXHQgIFx0ICAoKGtleS5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCA4KSB8XG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDE2KSB8XG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDI0KTtcblx0XHQrK2k7XG5cdFx0XG5cdFx0azEgPSAoKCgoazEgJiAweGZmZmYpICogYzEpICsgKCgoKGsxID4+PiAxNikgKiBjMSkgJiAweGZmZmYpIDw8IDE2KSkpICYgMHhmZmZmZmZmZjtcblx0XHRrMSA9IChrMSA8PCAxNSkgfCAoazEgPj4+IDE3KTtcblx0XHRrMSA9ICgoKChrMSAmIDB4ZmZmZikgKiBjMikgKyAoKCgoazEgPj4+IDE2KSAqIGMyKSAmIDB4ZmZmZikgPDwgMTYpKSkgJiAweGZmZmZmZmZmO1xuXG5cdFx0aDEgXj0gazE7XG4gICAgICAgIGgxID0gKGgxIDw8IDEzKSB8IChoMSA+Pj4gMTkpO1xuXHRcdGgxYiA9ICgoKChoMSAmIDB4ZmZmZikgKiA1KSArICgoKChoMSA+Pj4gMTYpICogNSkgJiAweGZmZmYpIDw8IDE2KSkpICYgMHhmZmZmZmZmZjtcblx0XHRoMSA9ICgoKGgxYiAmIDB4ZmZmZikgKyAweDZiNjQpICsgKCgoKGgxYiA+Pj4gMTYpICsgMHhlNjU0KSAmIDB4ZmZmZikgPDwgMTYpKTtcblx0fVxuXHRcblx0azEgPSAwO1xuXHRcblx0c3dpdGNoIChyZW1haW5kZXIpIHtcblx0XHRjYXNlIDM6IGsxIF49IChrZXkuY2hhckNvZGVBdChpICsgMikgJiAweGZmKSA8PCAxNjtcblx0XHRjYXNlIDI6IGsxIF49IChrZXkuY2hhckNvZGVBdChpICsgMSkgJiAweGZmKSA8PCA4O1xuXHRcdGNhc2UgMTogazEgXj0gKGtleS5jaGFyQ29kZUF0KGkpICYgMHhmZik7XG5cdFx0XG5cdFx0azEgPSAoKChrMSAmIDB4ZmZmZikgKiBjMSkgKyAoKCgoazEgPj4+IDE2KSAqIGMxKSAmIDB4ZmZmZikgPDwgMTYpKSAmIDB4ZmZmZmZmZmY7XG5cdFx0azEgPSAoazEgPDwgMTUpIHwgKGsxID4+PiAxNyk7XG5cdFx0azEgPSAoKChrMSAmIDB4ZmZmZikgKiBjMikgKyAoKCgoazEgPj4+IDE2KSAqIGMyKSAmIDB4ZmZmZikgPDwgMTYpKSAmIDB4ZmZmZmZmZmY7XG5cdFx0aDEgXj0gazE7XG5cdH1cblx0XG5cdGgxIF49IGtleS5sZW5ndGg7XG5cblx0aDEgXj0gaDEgPj4+IDE2O1xuXHRoMSA9ICgoKGgxICYgMHhmZmZmKSAqIDB4ODVlYmNhNmIpICsgKCgoKGgxID4+PiAxNikgKiAweDg1ZWJjYTZiKSAmIDB4ZmZmZikgPDwgMTYpKSAmIDB4ZmZmZmZmZmY7XG5cdGgxIF49IGgxID4+PiAxMztcblx0aDEgPSAoKCgoaDEgJiAweGZmZmYpICogMHhjMmIyYWUzNSkgKyAoKCgoaDEgPj4+IDE2KSAqIDB4YzJiMmFlMzUpICYgMHhmZmZmKSA8PCAxNikpKSAmIDB4ZmZmZmZmZmY7XG5cdGgxIF49IGgxID4+PiAxNjtcblxuXHRyZXR1cm4gaDEgPj4+IDA7XG59XG5cbmlmKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBtdXJtdXJoYXNoM18zMl9nY1xufSIsIi8qKlxuICogSlMgSW1wbGVtZW50YXRpb24gb2YgTXVybXVySGFzaDJcbiAqIFxuICogQGF1dGhvciA8YSBocmVmPVwibWFpbHRvOmdhcnkuY291cnRAZ21haWwuY29tXCI+R2FyeSBDb3VydDwvYT5cbiAqIEBzZWUgaHR0cDovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L211cm11cmhhc2gtanNcbiAqIEBhdXRob3IgPGEgaHJlZj1cIm1haWx0bzphYXBwbGVieUBnbWFpbC5jb21cIj5BdXN0aW4gQXBwbGVieTwvYT5cbiAqIEBzZWUgaHR0cDovL3NpdGVzLmdvb2dsZS5jb20vc2l0ZS9tdXJtdXJoYXNoL1xuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIEFTQ0lJIG9ubHlcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWVkIFBvc2l0aXZlIGludGVnZXIgb25seVxuICogQHJldHVybiB7bnVtYmVyfSAzMi1iaXQgcG9zaXRpdmUgaW50ZWdlciBoYXNoXG4gKi9cblxuZnVuY3Rpb24gbXVybXVyaGFzaDJfMzJfZ2Moc3RyLCBzZWVkKSB7XG4gIHZhclxuICAgIGwgPSBzdHIubGVuZ3RoLFxuICAgIGggPSBzZWVkIF4gbCxcbiAgICBpID0gMCxcbiAgICBrO1xuICBcbiAgd2hpbGUgKGwgPj0gNCkge1xuICBcdGsgPSBcbiAgXHQgICgoc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmKSkgfFxuICBcdCAgKChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgOCkgfFxuICBcdCAgKChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgMTYpIHxcbiAgXHQgICgoc3RyLmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDI0KTtcbiAgICBcbiAgICBrID0gKCgoayAmIDB4ZmZmZikgKiAweDViZDFlOTk1KSArICgoKChrID4+PiAxNikgKiAweDViZDFlOTk1KSAmIDB4ZmZmZikgPDwgMTYpKTtcbiAgICBrIF49IGsgPj4+IDI0O1xuICAgIGsgPSAoKChrICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGsgPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpO1xuXG5cdGggPSAoKChoICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGggPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpIF4gaztcblxuICAgIGwgLT0gNDtcbiAgICArK2k7XG4gIH1cbiAgXG4gIHN3aXRjaCAobCkge1xuICBjYXNlIDM6IGggXj0gKHN0ci5jaGFyQ29kZUF0KGkgKyAyKSAmIDB4ZmYpIDw8IDE2O1xuICBjYXNlIDI6IGggXj0gKHN0ci5jaGFyQ29kZUF0KGkgKyAxKSAmIDB4ZmYpIDw8IDg7XG4gIGNhc2UgMTogaCBePSAoc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmKTtcbiAgICAgICAgICBoID0gKCgoaCAmIDB4ZmZmZikgKiAweDViZDFlOTk1KSArICgoKChoID4+PiAxNikgKiAweDViZDFlOTk1KSAmIDB4ZmZmZikgPDwgMTYpKTtcbiAgfVxuXG4gIGggXj0gaCA+Pj4gMTM7XG4gIGggPSAoKChoICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGggPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpO1xuICBoIF49IGggPj4+IDE1O1xuXG4gIHJldHVybiBoID4+PiAwO1xufVxuXG5pZih0eXBlb2YgbW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBtdXJtdXJoYXNoMl8zMl9nY1xufVxuIiwidmFyIG11cm11cjMgPSByZXF1aXJlKFwiLi9tdXJtdXJoYXNoM19nYy5qc1wiKVxudmFyIG11cm11cjIgPSByZXF1aXJlKFwiLi9tdXJtdXJoYXNoMl9nYy5qc1wiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IG11cm11cjNcbm1vZHVsZS5leHBvcnRzLm11cm11cjMgPSBtdXJtdXIzXG5tb2R1bGUuZXhwb3J0cy5tdXJtdXIyID0gbXVybXVyMlxuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCIvKipcbiAqIENvbW1vbiB1dGlsaXRpZXNcbiAqIEBtb2R1bGUgZ2xNYXRyaXhcbiAqL1xuLy8gQ29uZmlndXJhdGlvbiBDb25zdGFudHNcbmV4cG9ydCB2YXIgRVBTSUxPTiA9IDAuMDAwMDAxO1xuZXhwb3J0IHZhciBBUlJBWV9UWVBFID0gdHlwZW9mIEZsb2F0MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBGbG9hdDMyQXJyYXkgOiBBcnJheTtcbmV4cG9ydCB2YXIgUkFORE9NID0gTWF0aC5yYW5kb207XG4vKipcbiAqIFNldHMgdGhlIHR5cGUgb2YgYXJyYXkgdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyB2ZWN0b3JzIGFuZCBtYXRyaWNlc1xuICpcbiAqIEBwYXJhbSB7RmxvYXQzMkFycmF5Q29uc3RydWN0b3IgfCBBcnJheUNvbnN0cnVjdG9yfSB0eXBlIEFycmF5IHR5cGUsIHN1Y2ggYXMgRmxvYXQzMkFycmF5IG9yIEFycmF5XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldE1hdHJpeEFycmF5VHlwZSh0eXBlKSB7XG4gIEFSUkFZX1RZUEUgPSB0eXBlO1xufVxudmFyIGRlZ3JlZSA9IE1hdGguUEkgLyAxODA7XG4vKipcbiAqIENvbnZlcnQgRGVncmVlIFRvIFJhZGlhblxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIEFuZ2xlIGluIERlZ3JlZXNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdG9SYWRpYW4oYSkge1xuICByZXR1cm4gYSAqIGRlZ3JlZTtcbn1cbi8qKlxuICogVGVzdHMgd2hldGhlciBvciBub3QgdGhlIGFyZ3VtZW50cyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgdmFsdWUsIHdpdGhpbiBhbiBhYnNvbHV0ZVxuICogb3IgcmVsYXRpdmUgdG9sZXJhbmNlIG9mIGdsTWF0cml4LkVQU0lMT04gKGFuIGFic29sdXRlIHRvbGVyYW5jZSBpcyB1c2VkIGZvciB2YWx1ZXMgbGVzc1xuICogdGhhbiBvciBlcXVhbCB0byAxLjAsIGFuZCBhIHJlbGF0aXZlIHRvbGVyYW5jZSBpcyB1c2VkIGZvciBsYXJnZXIgdmFsdWVzKVxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIFRoZSBmaXJzdCBudW1iZXIgdG8gdGVzdC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBiIFRoZSBzZWNvbmQgbnVtYmVyIHRvIHRlc3QuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVycyBhcmUgYXBwcm94aW1hdGVseSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICByZXR1cm4gTWF0aC5hYnMoYSAtIGIpIDw9IEVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEpLCBNYXRoLmFicyhiKSk7XG59XG5pZiAoIU1hdGguaHlwb3QpIE1hdGguaHlwb3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB5ID0gMCxcbiAgICAgIGkgPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICB5ICs9IGFyZ3VtZW50c1tpXSAqIGFyZ3VtZW50c1tpXTtcbiAgfVxuXG4gIHJldHVybiBNYXRoLnNxcnQoeSk7XG59OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiAyeDIgTWF0cml4XG4gKiBAbW9kdWxlIG1hdDJcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0MlxuICpcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIG91dFswXSA9IDE7XG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIG1hdHJpeCB0byBjbG9uZVxuICogQHJldHVybnMge21hdDJ9IGEgbmV3IDJ4MiBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQyIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IGEgbWF0MiB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBtYXQyIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMylcbiAqIEByZXR1cm5zIHttYXQyfSBvdXQgQSBuZXcgMngyIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKG0wMCwgbTAxLCBtMTAsIG0xMSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMTA7XG4gIG91dFszXSA9IG0xMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgbWF0MiB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMylcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgbTAwLCBtMDEsIG0xMCwgbTExKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMTA7XG4gIG91dFszXSA9IG0xMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNwb3NlIHRoZSB2YWx1ZXMgb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShvdXQsIGEpIHtcbiAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZVxuICAvLyBzb21lIHZhbHVlc1xuICBpZiAob3V0ID09PSBhKSB7XG4gICAgdmFyIGExID0gYVsxXTtcbiAgICBvdXRbMV0gPSBhWzJdO1xuICAgIG91dFsyXSA9IGExO1xuICB9IGVsc2Uge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsyXTtcbiAgICBvdXRbMl0gPSBhWzFdO1xuICAgIG91dFszXSA9IGFbM107XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBJbnZlcnRzIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICB2YXIgZGV0ID0gYTAgKiBhMyAtIGEyICogYTE7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gYTMgKiBkZXQ7XG4gIG91dFsxXSA9IC1hMSAqIGRldDtcbiAgb3V0WzJdID0gLWEyICogZGV0O1xuICBvdXRbM10gPSBhMCAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkam9pbnQob3V0LCBhKSB7XG4gIC8vIENhY2hpbmcgdGhpcyB2YWx1ZSBpcyBuZXNzZWNhcnkgaWYgb3V0ID09IGFcbiAgdmFyIGEwID0gYVswXTtcbiAgb3V0WzBdID0gYVszXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSBhMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoYSkge1xuICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzJdICogYVsxXTtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MidzXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIG91dFswXSA9IGEwICogYjAgKyBhMiAqIGIxO1xuICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgb3V0WzJdID0gYTAgKiBiMiArIGEyICogYjM7XG4gIG91dFszXSA9IGExICogYjIgKyBhMyAqIGIzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0MiBieSB0aGUgZ2l2ZW4gYW5nbGVcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYTAgKiBjICsgYTIgKiBzO1xuICBvdXRbMV0gPSBhMSAqIGMgKyBhMyAqIHM7XG4gIG91dFsyXSA9IGEwICogLXMgKyBhMiAqIGM7XG4gIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0MiBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgdGhlIHZlYzIgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciB2MCA9IHZbMF0sXG4gICAgICB2MSA9IHZbMV07XG4gIG91dFswXSA9IGEwICogdjA7XG4gIG91dFsxXSA9IGExICogdjA7XG4gIG91dFsyXSA9IGEyICogdjE7XG4gIG91dFszXSA9IGEzICogdjE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0Mi5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IG1hdDIgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gLXM7XG4gIG91dFszXSA9IGM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0Mi5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgbWF0MiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNjYWxpbmcob3V0LCB2KSB7XG4gIG91dFswXSA9IHZbMF07XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IHZbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwibWF0MihcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIilcIjtcbn1cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pO1xufVxuLyoqXG4gKiBSZXR1cm5zIEwsIEQgYW5kIFUgbWF0cmljZXMgKExvd2VyIHRyaWFuZ3VsYXIsIERpYWdvbmFsIGFuZCBVcHBlciB0cmlhbmd1bGFyKSBieSBmYWN0b3JpemluZyB0aGUgaW5wdXQgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gTCB0aGUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBEIHRoZSBkaWFnb25hbCBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBVIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIGlucHV0IG1hdHJpeCB0byBmYWN0b3JpemVcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gTERVKEwsIEQsIFUsIGEpIHtcbiAgTFsyXSA9IGFbMl0gLyBhWzBdO1xuICBVWzBdID0gYVswXTtcbiAgVVsxXSA9IGFbMV07XG4gIFVbM10gPSBhWzNdIC0gTFsyXSAqIFVbMV07XG4gIHJldHVybiBbTCwgRCwgVV07XG59XG4vKipcbiAqIEFkZHMgdHdvIG1hdDInc1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpO1xufVxuLyoqXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEFkZHMgdHdvIG1hdDIncyBhZnRlciBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhckFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0Mi5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0Mi5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcbiAqIDJ4MyBNYXRyaXhcbiAqIEBtb2R1bGUgbWF0MmRcbiAqIEBkZXNjcmlwdGlvblxuICogQSBtYXQyZCBjb250YWlucyBzaXggZWxlbWVudHMgZGVmaW5lZCBhczpcbiAqIDxwcmU+XG4gKiBbYSwgYixcbiAqICBjLCBkLFxuICogIHR4LCB0eV1cbiAqIDwvcHJlPlxuICogVGhpcyBpcyBhIHNob3J0IGZvcm0gZm9yIHRoZSAzeDMgbWF0cml4OlxuICogPHByZT5cbiAqIFthLCBiLCAwLFxuICogIGMsIGQsIDAsXG4gKiAgdHgsIHR5LCAxXVxuICogPC9wcmU+XG4gKiBUaGUgbGFzdCBjb2x1bW4gaXMgaWdub3JlZCBzbyB0aGUgYXJyYXkgaXMgc2hvcnRlciBhbmQgb3BlcmF0aW9ucyBhcmUgZmFzdGVyLlxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQyZFxuICpcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAwO1xuICB9XG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQyZCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDJkIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IGEgbWF0MmQgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBtYXQyZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gYSBDb21wb25lbnQgQSAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIENvbXBvbmVudCBCIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IGMgQ29tcG9uZW50IEMgKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gZCBDb21wb25lbnQgRCAoaW5kZXggMylcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eCBDb21wb25lbnQgVFggKGluZGV4IDQpXG4gKiBAcGFyYW0ge051bWJlcn0gdHkgQ29tcG9uZW50IFRZIChpbmRleCA1KVxuICogQHJldHVybnMge21hdDJkfSBBIG5ldyBtYXQyZFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKGEsIGIsIGMsIGQsIHR4LCB0eSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNik7XG4gIG91dFswXSA9IGE7XG4gIG91dFsxXSA9IGI7XG4gIG91dFsyXSA9IGM7XG4gIG91dFszXSA9IGQ7XG4gIG91dFs0XSA9IHR4O1xuICBvdXRbNV0gPSB0eTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgbWF0MmQgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtOdW1iZXJ9IGEgQ29tcG9uZW50IEEgKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gYiBDb21wb25lbnQgQiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjIENvbXBvbmVudCBDIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IGQgQ29tcG9uZW50IEQgKGluZGV4IDMpXG4gKiBAcGFyYW0ge051bWJlcn0gdHggQ29tcG9uZW50IFRYIChpbmRleCA0KVxuICogQHBhcmFtIHtOdW1iZXJ9IHR5IENvbXBvbmVudCBUWSAoaW5kZXggNSlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIGEsIGIsIGMsIGQsIHR4LCB0eSkge1xuICBvdXRbMF0gPSBhO1xuICBvdXRbMV0gPSBiO1xuICBvdXRbMl0gPSBjO1xuICBvdXRbM10gPSBkO1xuICBvdXRbNF0gPSB0eDtcbiAgb3V0WzVdID0gdHk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEludmVydHMgYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhYSA9IGFbMF0sXG4gICAgICBhYiA9IGFbMV0sXG4gICAgICBhYyA9IGFbMl0sXG4gICAgICBhZCA9IGFbM107XG4gIHZhciBhdHggPSBhWzRdLFxuICAgICAgYXR5ID0gYVs1XTtcbiAgdmFyIGRldCA9IGFhICogYWQgLSBhYiAqIGFjO1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IGFkICogZGV0O1xuICBvdXRbMV0gPSAtYWIgKiBkZXQ7XG4gIG91dFsyXSA9IC1hYyAqIGRldDtcbiAgb3V0WzNdID0gYWEgKiBkZXQ7XG4gIG91dFs0XSA9IChhYyAqIGF0eSAtIGFkICogYXR4KSAqIGRldDtcbiAgb3V0WzVdID0gKGFiICogYXR4IC0gYWEgKiBhdHkpICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluYW50KGEpIHtcbiAgcmV0dXJuIGFbMF0gKiBhWzNdIC0gYVsxXSAqIGFbMl07XG59XG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDJkJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM10sXG4gICAgICBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV07XG4gIG91dFswXSA9IGEwICogYjAgKyBhMiAqIGIxO1xuICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgb3V0WzJdID0gYTAgKiBiMiArIGEyICogYjM7XG4gIG91dFszXSA9IGExICogYjIgKyBhMyAqIGIzO1xuICBvdXRbNF0gPSBhMCAqIGI0ICsgYTIgKiBiNSArIGE0O1xuICBvdXRbNV0gPSBhMSAqIGI0ICsgYTMgKiBiNSArIGE1O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0MmQgYnkgdGhlIGdpdmVuIGFuZ2xlXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCByYWQpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XTtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGEwICogYyArIGEyICogcztcbiAgb3V0WzFdID0gYTEgKiBjICsgYTMgKiBzO1xuICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICBvdXRbM10gPSBhMSAqIC1zICsgYTMgKiBjO1xuICBvdXRbNF0gPSBhNDtcbiAgb3V0WzVdID0gYTU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0MmQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgdGhlIHZlYzIgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdO1xuICB2YXIgdjAgPSB2WzBdLFxuICAgICAgdjEgPSB2WzFdO1xuICBvdXRbMF0gPSBhMCAqIHYwO1xuICBvdXRbMV0gPSBhMSAqIHYwO1xuICBvdXRbMl0gPSBhMiAqIHYxO1xuICBvdXRbM10gPSBhMyAqIHYxO1xuICBvdXRbNF0gPSBhNDtcbiAgb3V0WzVdID0gYTU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgdGhlIG1hdDJkIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IHRoZSB2ZWMyIHRvIHRyYW5zbGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdO1xuICB2YXIgdjAgPSB2WzBdLFxuICAgICAgdjEgPSB2WzFdO1xuICBvdXRbMF0gPSBhMDtcbiAgb3V0WzFdID0gYTE7XG4gIG91dFsyXSA9IGEyO1xuICBvdXRbM10gPSBhMztcbiAgb3V0WzRdID0gYTAgKiB2MCArIGEyICogdjEgKyBhNDtcbiAgb3V0WzVdID0gYTEgKiB2MCArIGEzICogdjEgKyBhNTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGVcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQyZC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyZC5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgbWF0MmQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IHM7XG4gIG91dFsyXSA9IC1zO1xuICBvdXRbM10gPSBjO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDJkLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IG1hdDJkIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiBTY2FsaW5nIHZlY3RvclxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNjYWxpbmcob3V0LCB2KSB7XG4gIG91dFswXSA9IHZbMF07XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IHZbMV07XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDJkLnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCBtYXQyZCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB2KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IHZbMF07XG4gIG91dFs1XSA9IHZbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJtYXQyZChcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIiwgXCIgKyBhWzRdICsgXCIsIFwiICsgYVs1XSArIFwiKVwiO1xufVxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb2IoYSkge1xuICByZXR1cm4gTWF0aC5oeXBvdChhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCAxKTtcbn1cbi8qKlxuICogQWRkcyB0d28gbWF0MmQnc1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIG1hdHJpeCdzIGVsZW1lbnRzIGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gbWF0MmQncyBhZnRlciBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XSAqIHNjYWxlO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM10sXG4gICAgICBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKTtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyZC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0MmQuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiAzeDMgTWF0cml4XG4gKiBAbW9kdWxlIG1hdDNcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0M1xuICpcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICB9XG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzRdID0gMTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29waWVzIHRoZSB1cHBlci1sZWZ0IDN4MyB2YWx1ZXMgaW50byB0aGUgZ2l2ZW4gbWF0My5cbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIDN4MyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhICAgdGhlIHNvdXJjZSA0eDQgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQ0KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzRdO1xuICBvdXRbNF0gPSBhWzVdO1xuICBvdXRbNV0gPSBhWzZdO1xuICBvdXRbNl0gPSBhWzhdO1xuICBvdXRbN10gPSBhWzldO1xuICBvdXRbOF0gPSBhWzEwXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0M30gYSBuZXcgM3gzIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDMgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgbWF0MyB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDQpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEyIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDIgcG9zaXRpb24gKGluZGV4IDUpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDYpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIxIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDEgcG9zaXRpb24gKGluZGV4IDcpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDgpXG4gKiBAcmV0dXJucyB7bWF0M30gQSBuZXcgbWF0M1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKG0wMCwgbTAxLCBtMDIsIG0xMCwgbTExLCBtMTIsIG0yMCwgbTIxLCBtMjIpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuICBvdXRbMF0gPSBtMDA7XG4gIG91dFsxXSA9IG0wMTtcbiAgb3V0WzJdID0gbTAyO1xuICBvdXRbM10gPSBtMTA7XG4gIG91dFs0XSA9IG0xMTtcbiAgb3V0WzVdID0gbTEyO1xuICBvdXRbNl0gPSBtMjA7XG4gIG91dFs3XSA9IG0yMTtcbiAgb3V0WzhdID0gbTIyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMiBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA1KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMCBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA2KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA3KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA4KVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCBtMDAsIG0wMSwgbTAyLCBtMTAsIG0xMSwgbTEyLCBtMjAsIG0yMSwgbTIyKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0xMDtcbiAgb3V0WzRdID0gbTExO1xuICBvdXRbNV0gPSBtMTI7XG4gIG91dFs2XSA9IG0yMDtcbiAgb3V0WzddID0gbTIxO1xuICBvdXRbOF0gPSBtMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCBhIG1hdDMgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAxO1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKG91dCwgYSkge1xuICAvLyBJZiB3ZSBhcmUgdHJhbnNwb3Npbmcgb3Vyc2VsdmVzIHdlIGNhbiBza2lwIGEgZmV3IHN0ZXBzIGJ1dCBoYXZlIHRvIGNhY2hlIHNvbWUgdmFsdWVzXG4gIGlmIChvdXQgPT09IGEpIHtcbiAgICB2YXIgYTAxID0gYVsxXSxcbiAgICAgICAgYTAyID0gYVsyXSxcbiAgICAgICAgYTEyID0gYVs1XTtcbiAgICBvdXRbMV0gPSBhWzNdO1xuICAgIG91dFsyXSA9IGFbNl07XG4gICAgb3V0WzNdID0gYTAxO1xuICAgIG91dFs1XSA9IGFbN107XG4gICAgb3V0WzZdID0gYTAyO1xuICAgIG91dFs3XSA9IGExMjtcbiAgfSBlbHNlIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbM107XG4gICAgb3V0WzJdID0gYVs2XTtcbiAgICBvdXRbM10gPSBhWzFdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs3XTtcbiAgICBvdXRbNl0gPSBhWzJdO1xuICAgIG91dFs3XSA9IGFbNV07XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEludmVydHMgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgdmFyIGIwMSA9IGEyMiAqIGExMSAtIGExMiAqIGEyMTtcbiAgdmFyIGIxMSA9IC1hMjIgKiBhMTAgKyBhMTIgKiBhMjA7XG4gIHZhciBiMjEgPSBhMjEgKiBhMTAgLSBhMTEgKiBhMjA7IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICB2YXIgZGV0ID0gYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxO1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IGIwMSAqIGRldDtcbiAgb3V0WzFdID0gKC1hMjIgKiBhMDEgKyBhMDIgKiBhMjEpICogZGV0O1xuICBvdXRbMl0gPSAoYTEyICogYTAxIC0gYTAyICogYTExKSAqIGRldDtcbiAgb3V0WzNdID0gYjExICogZGV0O1xuICBvdXRbNF0gPSAoYTIyICogYTAwIC0gYTAyICogYTIwKSAqIGRldDtcbiAgb3V0WzVdID0gKC1hMTIgKiBhMDAgKyBhMDIgKiBhMTApICogZGV0O1xuICBvdXRbNl0gPSBiMjEgKiBkZXQ7XG4gIG91dFs3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGRldDtcbiAgb3V0WzhdID0gKGExMSAqIGEwMCAtIGEwMSAqIGExMCkgKiBkZXQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGpvaW50KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdO1xuICB2YXIgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdO1xuICB2YXIgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdO1xuICBvdXRbMF0gPSBhMTEgKiBhMjIgLSBhMTIgKiBhMjE7XG4gIG91dFsxXSA9IGEwMiAqIGEyMSAtIGEwMSAqIGEyMjtcbiAgb3V0WzJdID0gYTAxICogYTEyIC0gYTAyICogYTExO1xuICBvdXRbM10gPSBhMTIgKiBhMjAgLSBhMTAgKiBhMjI7XG4gIG91dFs0XSA9IGEwMCAqIGEyMiAtIGEwMiAqIGEyMDtcbiAgb3V0WzVdID0gYTAyICogYTEwIC0gYTAwICogYTEyO1xuICBvdXRbNl0gPSBhMTAgKiBhMjEgLSBhMTEgKiBhMjA7XG4gIG91dFs3XSA9IGEwMSAqIGEyMCAtIGEwMCAqIGEyMTtcbiAgb3V0WzhdID0gYTAwICogYTExIC0gYTAxICogYTEwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmFudChhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl07XG4gIHZhciBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV07XG4gIHZhciBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF07XG4gIHJldHVybiBhMDAgKiAoYTIyICogYTExIC0gYTEyICogYTIxKSArIGEwMSAqICgtYTIyICogYTEwICsgYTEyICogYTIwKSArIGEwMiAqIChhMjEgKiBhMTAgLSBhMTEgKiBhMjApO1xufVxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQzJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgdmFyIGIwMCA9IGJbMF0sXG4gICAgICBiMDEgPSBiWzFdLFxuICAgICAgYjAyID0gYlsyXTtcbiAgdmFyIGIxMCA9IGJbM10sXG4gICAgICBiMTEgPSBiWzRdLFxuICAgICAgYjEyID0gYls1XTtcbiAgdmFyIGIyMCA9IGJbNl0sXG4gICAgICBiMjEgPSBiWzddLFxuICAgICAgYjIyID0gYls4XTtcbiAgb3V0WzBdID0gYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwO1xuICBvdXRbMV0gPSBiMDAgKiBhMDEgKyBiMDEgKiBhMTEgKyBiMDIgKiBhMjE7XG4gIG91dFsyXSA9IGIwMCAqIGEwMiArIGIwMSAqIGExMiArIGIwMiAqIGEyMjtcbiAgb3V0WzNdID0gYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwO1xuICBvdXRbNF0gPSBiMTAgKiBhMDEgKyBiMTEgKiBhMTEgKyBiMTIgKiBhMjE7XG4gIG91dFs1XSA9IGIxMCAqIGEwMiArIGIxMSAqIGExMiArIGIxMiAqIGEyMjtcbiAgb3V0WzZdID0gYjIwICogYTAwICsgYjIxICogYTEwICsgYjIyICogYTIwO1xuICBvdXRbN10gPSBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjE7XG4gIG91dFs4XSA9IGIyMCAqIGEwMiArIGIyMSAqIGExMiArIGIyMiAqIGEyMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0MyBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XSxcbiAgICAgIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XSxcbiAgICAgIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV07XG4gIG91dFswXSA9IGEwMDtcbiAgb3V0WzFdID0gYTAxO1xuICBvdXRbMl0gPSBhMDI7XG4gIG91dFszXSA9IGExMDtcbiAgb3V0WzRdID0gYTExO1xuICBvdXRbNV0gPSBhMTI7XG4gIG91dFs2XSA9IHggKiBhMDAgKyB5ICogYTEwICsgYTIwO1xuICBvdXRbN10gPSB4ICogYTAxICsgeSAqIGExMSArIGEyMTtcbiAgb3V0WzhdID0geCAqIGEwMiArIHkgKiBhMTIgKyBhMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQzIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV0sXG4gICAgICBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF0sXG4gICAgICBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBjICogYTAwICsgcyAqIGExMDtcbiAgb3V0WzFdID0gYyAqIGEwMSArIHMgKiBhMTE7XG4gIG91dFsyXSA9IGMgKiBhMDIgKyBzICogYTEyO1xuICBvdXRbM10gPSBjICogYTEwIC0gcyAqIGEwMDtcbiAgb3V0WzRdID0gYyAqIGExMSAtIHMgKiBhMDE7XG4gIG91dFs1XSA9IGMgKiBhMTIgLSBzICogYTAyO1xuICBvdXRbNl0gPSBhMjA7XG4gIG91dFs3XSA9IGEyMTtcbiAgb3V0WzhdID0gYTIyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDMgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXTtcbiAgb3V0WzBdID0geCAqIGFbMF07XG4gIG91dFsxXSA9IHggKiBhWzFdO1xuICBvdXRbMl0gPSB4ICogYVsyXTtcbiAgb3V0WzNdID0geSAqIGFbM107XG4gIG91dFs0XSA9IHkgKiBhWzRdO1xuICBvdXRbNV0gPSB5ICogYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHRyYW5zbGF0aW9uXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB2KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDE7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IHZbMF07XG4gIG91dFs3XSA9IHZbMV07XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gLXM7XG4gIG91dFs0XSA9IGM7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNjYWxpbmcob3V0LCB2KSB7XG4gIG91dFswXSA9IHZbMF07XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHZbMV07XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIGZyb20gYSBtYXQyZCBpbnRvIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIG1hdHJpeCB0byBjb3B5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWF0MmQob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IGFbMl07XG4gIG91dFs0XSA9IGFbM107XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IGFbNF07XG4gIG91dFs3XSA9IGFbNV07XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgYSAzeDMgbWF0cml4IGZyb20gdGhlIGdpdmVuIHF1YXRlcm5pb25cbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBRdWF0ZXJuaW9uIHRvIGNyZWF0ZSBtYXRyaXggZnJvbVxuICpcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVF1YXQob3V0LCBxKSB7XG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeXggPSB5ICogeDI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHp4ID0geiAqIHgyO1xuICB2YXIgenkgPSB6ICogeTI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgb3V0WzBdID0gMSAtIHl5IC0geno7XG4gIG91dFszXSA9IHl4IC0gd3o7XG4gIG91dFs2XSA9IHp4ICsgd3k7XG4gIG91dFsxXSA9IHl4ICsgd3o7XG4gIG91dFs0XSA9IDEgLSB4eCAtIHp6O1xuICBvdXRbN10gPSB6eSAtIHd4O1xuICBvdXRbMl0gPSB6eCAtIHd5O1xuICBvdXRbNV0gPSB6eSArIHd4O1xuICBvdXRbOF0gPSAxIC0geHggLSB5eTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyBhIDN4MyBub3JtYWwgbWF0cml4ICh0cmFuc3Bvc2UgaW52ZXJzZSkgZnJvbSB0aGUgNHg0IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIE1hdDQgdG8gZGVyaXZlIHRoZSBub3JtYWwgbWF0cml4IGZyb21cbiAqXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbEZyb21NYXQ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFsxXSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0O1xuICBvdXRbMl0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcbiAgb3V0WzNdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFs0XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xuICBvdXRbNV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcbiAgb3V0WzZdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gIG91dFs3XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICBvdXRbOF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgMkQgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIFdpZHRoIG9mIHlvdXIgZ2wgY29udGV4dFxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCBIZWlnaHQgb2YgZ2wgY29udGV4dFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0aW9uKG91dCwgd2lkdGgsIGhlaWdodCkge1xuICBvdXRbMF0gPSAyIC8gd2lkdGg7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IC0yIC8gaGVpZ2h0O1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSAtMTtcbiAgb3V0WzddID0gMTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJtYXQzKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiLCBcIiArIGFbNF0gKyBcIiwgXCIgKyBhWzVdICsgXCIsIFwiICsgYVs2XSArIFwiLCBcIiArIGFbN10gKyBcIiwgXCIgKyBhWzhdICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb2IoYSkge1xuICByZXR1cm4gTWF0aC5oeXBvdChhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdLCBhWzddLCBhWzhdKTtcbn1cbi8qKlxuICogQWRkcyB0d28gbWF0MydzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XTtcbiAgb3V0WzddID0gYVs3XSArIGJbN107XG4gIG91dFs4XSA9IGFbOF0gKyBiWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICBvdXRbNl0gPSBhWzZdIC0gYls2XTtcbiAgb3V0WzddID0gYVs3XSAtIGJbN107XG4gIG91dFs4XSA9IGFbOF0gLSBiWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgb3V0WzZdID0gYVs2XSAqIGI7XG4gIG91dFs3XSA9IGFbN10gKiBiO1xuICBvdXRbOF0gPSBhWzhdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gbWF0MydzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIncyBlbGVtZW50cyBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF0gKiBzY2FsZTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV0gKiBzY2FsZTtcbiAgb3V0WzZdID0gYVs2XSArIGJbNl0gKiBzY2FsZTtcbiAgb3V0WzddID0gYVs3XSArIGJbN10gKiBzY2FsZTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXSAmJiBhWzRdID09PSBiWzRdICYmIGFbNV0gPT09IGJbNV0gJiYgYVs2XSA9PT0gYls2XSAmJiBhWzddID09PSBiWzddICYmIGFbOF0gPT09IGJbOF07XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV0sXG4gICAgICBhNiA9IGFbNl0sXG4gICAgICBhNyA9IGFbN10sXG4gICAgICBhOCA9IGFbOF07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM10sXG4gICAgICBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV0sXG4gICAgICBiNiA9IGJbNl0sXG4gICAgICBiNyA9IGJbN10sXG4gICAgICBiOCA9IGJbOF07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKSAmJiBNYXRoLmFicyhhNiAtIGI2KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNiksIE1hdGguYWJzKGI2KSkgJiYgTWF0aC5hYnMoYTcgLSBiNykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTcpLCBNYXRoLmFicyhiNykpICYmIE1hdGguYWJzKGE4IC0gYjgpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE4KSwgTWF0aC5hYnMoYjgpKTtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQzLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQzLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxuICogNHg0IE1hdHJpeDxicj5Gb3JtYXQ6IGNvbHVtbi1tYWpvciwgd2hlbiB0eXBlZCBvdXQgaXQgbG9va3MgbGlrZSByb3ctbWFqb3I8YnI+VGhlIG1hdHJpY2VzIGFyZSBiZWluZyBwb3N0IG11bHRpcGxpZWQuXG4gKiBAbW9kdWxlIG1hdDRcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0NFxuICpcbiAqIEByZXR1cm5zIHttYXQ0fSBhIG5ldyA0eDQgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gIH1cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0NCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIG1hdHJpeCB0byBjbG9uZVxuICogQHJldHVybnMge21hdDR9IGEgbmV3IDR4NCBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICBvdXRbOV0gPSBhWzldO1xuICBvdXRbMTBdID0gYVsxMF07XG4gIG91dFsxMV0gPSBhWzExXTtcbiAgb3V0WzEyXSA9IGFbMTJdO1xuICBvdXRbMTNdID0gYVsxM107XG4gIG91dFsxNF0gPSBhWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0NCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIG91dFs5XSA9IGFbOV07XG4gIG91dFsxMF0gPSBhWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdO1xuICBvdXRbMTJdID0gYVsxMl07XG4gIG91dFsxM10gPSBhWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdO1xuICBvdXRbMTVdID0gYVsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBtYXQ0IHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTMgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggNylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjIgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTApXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzEgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMTMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcbiAqIEByZXR1cm5zIHttYXQ0fSBBIG5ldyBtYXQ0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0wMztcbiAgb3V0WzRdID0gbTEwO1xuICBvdXRbNV0gPSBtMTE7XG4gIG91dFs2XSA9IG0xMjtcbiAgb3V0WzddID0gbTEzO1xuICBvdXRbOF0gPSBtMjA7XG4gIG91dFs5XSA9IG0yMTtcbiAgb3V0WzEwXSA9IG0yMjtcbiAgb3V0WzExXSA9IG0yMztcbiAgb3V0WzEyXSA9IG0zMDtcbiAgb3V0WzEzXSA9IG0zMTtcbiAgb3V0WzE0XSA9IG0zMjtcbiAgb3V0WzE1XSA9IG0zMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgbWF0NCB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTMgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggNylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjIgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTApXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzEgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMTMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgbTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0wMztcbiAgb3V0WzRdID0gbTEwO1xuICBvdXRbNV0gPSBtMTE7XG4gIG91dFs2XSA9IG0xMjtcbiAgb3V0WzddID0gbTEzO1xuICBvdXRbOF0gPSBtMjA7XG4gIG91dFs5XSA9IG0yMTtcbiAgb3V0WzEwXSA9IG0yMjtcbiAgb3V0WzExXSA9IG0yMztcbiAgb3V0WzEyXSA9IG0zMDtcbiAgb3V0WzEzXSA9IG0zMTtcbiAgb3V0WzE0XSA9IG0zMjtcbiAgb3V0WzE1XSA9IG0zMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IGEgbWF0NCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDE7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2Uob3V0LCBhKSB7XG4gIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgaWYgKG91dCA9PT0gYSkge1xuICAgIHZhciBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMDMgPSBhWzNdO1xuICAgIHZhciBhMTIgPSBhWzZdLFxuICAgICAgICBhMTMgPSBhWzddO1xuICAgIHZhciBhMjMgPSBhWzExXTtcbiAgICBvdXRbMV0gPSBhWzRdO1xuICAgIG91dFsyXSA9IGFbOF07XG4gICAgb3V0WzNdID0gYVsxMl07XG4gICAgb3V0WzRdID0gYTAxO1xuICAgIG91dFs2XSA9IGFbOV07XG4gICAgb3V0WzddID0gYVsxM107XG4gICAgb3V0WzhdID0gYTAyO1xuICAgIG91dFs5XSA9IGExMjtcbiAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgb3V0WzEyXSA9IGEwMztcbiAgICBvdXRbMTNdID0gYTEzO1xuICAgIG91dFsxNF0gPSBhMjM7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzRdO1xuICAgIG91dFsyXSA9IGFbOF07XG4gICAgb3V0WzNdID0gYVsxMl07XG4gICAgb3V0WzRdID0gYVsxXTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbOV07XG4gICAgb3V0WzddID0gYVsxM107XG4gICAgb3V0WzhdID0gYVsyXTtcbiAgICBvdXRbOV0gPSBhWzZdO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgb3V0WzEyXSA9IGFbM107XG4gICAgb3V0WzEzXSA9IGFbN107XG4gICAgb3V0WzE0XSA9IGFbMTFdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEludmVydHMgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07XG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7XG4gIHZhciBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTA7XG4gIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTA7XG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7XG4gIHZhciBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTE7XG4gIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTI7XG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzA7XG4gIHZhciBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzA7XG4gIHZhciBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzA7XG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzE7XG4gIHZhciBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzE7XG4gIHZhciBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICB2YXIgZGV0ID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpICogZGV0O1xuICBvdXRbMV0gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDtcbiAgb3V0WzJdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gIG91dFszXSA9IChhMjIgKiBiMDQgLSBhMjEgKiBiMDUgLSBhMjMgKiBiMDMpICogZGV0O1xuICBvdXRbNF0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldDtcbiAgb3V0WzVdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXQ7XG4gIG91dFs2XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICBvdXRbN10gPSAoYTIwICogYjA1IC0gYTIyICogYjAyICsgYTIzICogYjAxKSAqIGRldDtcbiAgb3V0WzhdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXQ7XG4gIG91dFs5XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0O1xuICBvdXRbMTBdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXQ7XG4gIG91dFsxMV0gPSAoYTIxICogYjAyIC0gYTIwICogYjA0IC0gYTIzICogYjAwKSAqIGRldDtcbiAgb3V0WzEyXSA9IChhMTEgKiBiMDcgLSBhMTAgKiBiMDkgLSBhMTIgKiBiMDYpICogZGV0O1xuICBvdXRbMTNdID0gKGEwMCAqIGIwOSAtIGEwMSAqIGIwNyArIGEwMiAqIGIwNikgKiBkZXQ7XG4gIG91dFsxNF0gPSAoYTMxICogYjAxIC0gYTMwICogYjAzIC0gYTMyICogYjAwKSAqIGRldDtcbiAgb3V0WzE1XSA9IChhMjAgKiBiMDMgLSBhMjEgKiBiMDEgKyBhMjIgKiBiMDApICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRqb2ludChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07XG4gIG91dFswXSA9IGExMSAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIxICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgKyBhMzEgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKTtcbiAgb3V0WzFdID0gLShhMDEgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikpO1xuICBvdXRbMl0gPSBhMDEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSAtIGExMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGExMyAtIGEwMyAqIGExMik7XG4gIG91dFszXSA9IC0oYTAxICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTEgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMSAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgb3V0WzRdID0gLShhMTAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpICsgYTMwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikpO1xuICBvdXRbNV0gPSBhMDAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMwICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMik7XG4gIG91dFs2XSA9IC0oYTAwICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgLSBhMTAgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgb3V0WzddID0gYTAwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpO1xuICBvdXRbOF0gPSBhMTAgKiAoYTIxICogYTMzIC0gYTIzICogYTMxKSAtIGEyMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpICsgYTMwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSk7XG4gIG91dFs5XSA9IC0oYTAwICogKGEyMSAqIGEzMyAtIGEyMyAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpKTtcbiAgb3V0WzEwXSA9IGEwMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpIC0gYTEwICogKGEwMSAqIGEzMyAtIGEwMyAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTEzIC0gYTAzICogYTExKTtcbiAgb3V0WzExXSA9IC0oYTAwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSkgLSBhMTAgKiAoYTAxICogYTIzIC0gYTAzICogYTIxKSArIGEyMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpKTtcbiAgb3V0WzEyXSA9IC0oYTEwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSArIGEzMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpKTtcbiAgb3V0WzEzXSA9IGEwMCAqIChhMjEgKiBhMzIgLSBhMjIgKiBhMzEpIC0gYTIwICogKGEwMSAqIGEzMiAtIGEwMiAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTIyIC0gYTAyICogYTIxKTtcbiAgb3V0WzE0XSA9IC0oYTAwICogKGExMSAqIGEzMiAtIGExMiAqIGEzMSkgLSBhMTAgKiAoYTAxICogYTMyIC0gYTAyICogYTMxKSArIGEzMCAqIChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpKTtcbiAgb3V0WzE1XSA9IGEwMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHJldHVybiBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG59XG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDRzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdOyAvLyBDYWNoZSBvbmx5IHRoZSBjdXJyZW50IGxpbmUgb2YgdGhlIHNlY29uZCBtYXRyaXhcblxuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICBvdXRbMF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzFdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFsyXSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbM10gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgYjAgPSBiWzRdO1xuICBiMSA9IGJbNV07XG4gIGIyID0gYls2XTtcbiAgYjMgPSBiWzddO1xuICBvdXRbNF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzVdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFs2XSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbN10gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgYjAgPSBiWzhdO1xuICBiMSA9IGJbOV07XG4gIGIyID0gYlsxMF07XG4gIGIzID0gYlsxMV07XG4gIG91dFs4XSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbOV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzEwXSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbMTFdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gIGIwID0gYlsxMl07XG4gIGIxID0gYlsxM107XG4gIGIyID0gYlsxNF07XG4gIGIzID0gYlsxNV07XG4gIG91dFsxMl0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzEzXSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbMTRdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFsxNV0gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0NCBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV0sXG4gICAgICB6ID0gdlsyXTtcbiAgdmFyIGEwMCwgYTAxLCBhMDIsIGEwMztcbiAgdmFyIGExMCwgYTExLCBhMTIsIGExMztcbiAgdmFyIGEyMCwgYTIxLCBhMjIsIGEyMztcblxuICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgb3V0WzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzFdICogeCArIGFbNV0gKiB5ICsgYVs5XSAqIHogKyBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XG4gIH0gZWxzZSB7XG4gICAgYTAwID0gYVswXTtcbiAgICBhMDEgPSBhWzFdO1xuICAgIGEwMiA9IGFbMl07XG4gICAgYTAzID0gYVszXTtcbiAgICBhMTAgPSBhWzRdO1xuICAgIGExMSA9IGFbNV07XG4gICAgYTEyID0gYVs2XTtcbiAgICBhMTMgPSBhWzddO1xuICAgIGEyMCA9IGFbOF07XG4gICAgYTIxID0gYVs5XTtcbiAgICBhMjIgPSBhWzEwXTtcbiAgICBhMjMgPSBhWzExXTtcbiAgICBvdXRbMF0gPSBhMDA7XG4gICAgb3V0WzFdID0gYTAxO1xuICAgIG91dFsyXSA9IGEwMjtcbiAgICBvdXRbM10gPSBhMDM7XG4gICAgb3V0WzRdID0gYTEwO1xuICAgIG91dFs1XSA9IGExMTtcbiAgICBvdXRbNl0gPSBhMTI7XG4gICAgb3V0WzddID0gYTEzO1xuICAgIG91dFs4XSA9IGEyMDtcbiAgICBvdXRbOV0gPSBhMjE7XG4gICAgb3V0WzEwXSA9IGEyMjtcbiAgICBvdXRbMTFdID0gYTIzO1xuICAgIG91dFsxMl0gPSBhMDAgKiB4ICsgYTEwICogeSArIGEyMCAqIHogKyBhWzEyXTtcbiAgICBvdXRbMTNdID0gYTAxICogeCArIGExMSAqIHkgKyBhMjEgKiB6ICsgYVsxM107XG4gICAgb3V0WzE0XSA9IGEwMiAqIHggKyBhMTIgKiB5ICsgYTIyICogeiArIGFbMTRdO1xuICAgIG91dFsxNV0gPSBhMDMgKiB4ICsgYTEzICogeSArIGEyMyAqIHogKyBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMyBub3QgdXNpbmcgdmVjdG9yaXphdGlvblxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiB0aGUgdmVjMyB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV0sXG4gICAgICB6ID0gdlsyXTtcbiAgb3V0WzBdID0gYVswXSAqIHg7XG4gIG91dFsxXSA9IGFbMV0gKiB4O1xuICBvdXRbMl0gPSBhWzJdICogeDtcbiAgb3V0WzNdID0gYVszXSAqIHg7XG4gIG91dFs0XSA9IGFbNF0gKiB5O1xuICBvdXRbNV0gPSBhWzVdICogeTtcbiAgb3V0WzZdID0gYVs2XSAqIHk7XG4gIG91dFs3XSA9IGFbN10gKiB5O1xuICBvdXRbOF0gPSBhWzhdICogejtcbiAgb3V0WzldID0gYVs5XSAqIHo7XG4gIG91dFsxMF0gPSBhWzEwXSAqIHo7XG4gIG91dFsxMV0gPSBhWzExXSAqIHo7XG4gIG91dFsxMl0gPSBhWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdO1xuICBvdXRbMTRdID0gYVsxNF07XG4gIG91dFsxNV0gPSBhWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIG1hdDQgYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgZ2l2ZW4gYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkLCBheGlzKSB7XG4gIHZhciB4ID0gYXhpc1swXSxcbiAgICAgIHkgPSBheGlzWzFdLFxuICAgICAgeiA9IGF4aXNbMl07XG4gIHZhciBsZW4gPSBNYXRoLmh5cG90KHgsIHksIHopO1xuICB2YXIgcywgYywgdDtcbiAgdmFyIGEwMCwgYTAxLCBhMDIsIGEwMztcbiAgdmFyIGExMCwgYTExLCBhMTIsIGExMztcbiAgdmFyIGEyMCwgYTIxLCBhMjIsIGEyMztcbiAgdmFyIGIwMCwgYjAxLCBiMDI7XG4gIHZhciBiMTAsIGIxMSwgYjEyO1xuICB2YXIgYjIwLCBiMjEsIGIyMjtcblxuICBpZiAobGVuIDwgZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGVuID0gMSAvIGxlbjtcbiAgeCAqPSBsZW47XG4gIHkgKj0gbGVuO1xuICB6ICo9IGxlbjtcbiAgcyA9IE1hdGguc2luKHJhZCk7XG4gIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB0ID0gMSAtIGM7XG4gIGEwMCA9IGFbMF07XG4gIGEwMSA9IGFbMV07XG4gIGEwMiA9IGFbMl07XG4gIGEwMyA9IGFbM107XG4gIGExMCA9IGFbNF07XG4gIGExMSA9IGFbNV07XG4gIGExMiA9IGFbNl07XG4gIGExMyA9IGFbN107XG4gIGEyMCA9IGFbOF07XG4gIGEyMSA9IGFbOV07XG4gIGEyMiA9IGFbMTBdO1xuICBhMjMgPSBhWzExXTsgLy8gQ29uc3RydWN0IHRoZSBlbGVtZW50cyBvZiB0aGUgcm90YXRpb24gbWF0cml4XG5cbiAgYjAwID0geCAqIHggKiB0ICsgYztcbiAgYjAxID0geSAqIHggKiB0ICsgeiAqIHM7XG4gIGIwMiA9IHogKiB4ICogdCAtIHkgKiBzO1xuICBiMTAgPSB4ICogeSAqIHQgLSB6ICogcztcbiAgYjExID0geSAqIHkgKiB0ICsgYztcbiAgYjEyID0geiAqIHkgKiB0ICsgeCAqIHM7XG4gIGIyMCA9IHggKiB6ICogdCArIHkgKiBzO1xuICBiMjEgPSB5ICogeiAqIHQgLSB4ICogcztcbiAgYjIyID0geiAqIHogKiB0ICsgYzsgLy8gUGVyZm9ybSByb3RhdGlvbi1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSBhMDAgKiBiMDAgKyBhMTAgKiBiMDEgKyBhMjAgKiBiMDI7XG4gIG91dFsxXSA9IGEwMSAqIGIwMCArIGExMSAqIGIwMSArIGEyMSAqIGIwMjtcbiAgb3V0WzJdID0gYTAyICogYjAwICsgYTEyICogYjAxICsgYTIyICogYjAyO1xuICBvdXRbM10gPSBhMDMgKiBiMDAgKyBhMTMgKiBiMDEgKyBhMjMgKiBiMDI7XG4gIG91dFs0XSA9IGEwMCAqIGIxMCArIGExMCAqIGIxMSArIGEyMCAqIGIxMjtcbiAgb3V0WzVdID0gYTAxICogYjEwICsgYTExICogYjExICsgYTIxICogYjEyO1xuICBvdXRbNl0gPSBhMDIgKiBiMTAgKyBhMTIgKiBiMTEgKyBhMjIgKiBiMTI7XG4gIG91dFs3XSA9IGEwMyAqIGIxMCArIGExMyAqIGIxMSArIGEyMyAqIGIxMjtcbiAgb3V0WzhdID0gYTAwICogYjIwICsgYTEwICogYjIxICsgYTIwICogYjIyO1xuICBvdXRbOV0gPSBhMDEgKiBiMjAgKyBhMTEgKiBiMjEgKyBhMjEgKiBiMjI7XG4gIG91dFsxMF0gPSBhMDIgKiBiMjAgKyBhMTIgKiBiMjEgKyBhMjIgKiBiMjI7XG4gIG91dFsxMV0gPSBhMDMgKiBiMjAgKyBhMTMgKiBiMjEgKyBhMjMgKiBiMjI7XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIGxhc3Qgcm93XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBhMTAgPSBhWzRdO1xuICB2YXIgYTExID0gYVs1XTtcbiAgdmFyIGExMiA9IGFbNl07XG4gIHZhciBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XTtcbiAgdmFyIGEyMSA9IGFbOV07XG4gIHZhciBhMjIgPSBhWzEwXTtcbiAgdmFyIGEyMyA9IGFbMTFdO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH0gLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG5cbiAgb3V0WzRdID0gYTEwICogYyArIGEyMCAqIHM7XG4gIG91dFs1XSA9IGExMSAqIGMgKyBhMjEgKiBzO1xuICBvdXRbNl0gPSBhMTIgKiBjICsgYTIyICogcztcbiAgb3V0WzddID0gYTEzICogYyArIGEyMyAqIHM7XG4gIG91dFs4XSA9IGEyMCAqIGMgLSBhMTAgKiBzO1xuICBvdXRbOV0gPSBhMjEgKiBjIC0gYTExICogcztcbiAgb3V0WzEwXSA9IGEyMiAqIGMgLSBhMTIgKiBzO1xuICBvdXRbMTFdID0gYTIzICogYyAtIGExMyAqIHM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB2YXIgYTAwID0gYVswXTtcbiAgdmFyIGEwMSA9IGFbMV07XG4gIHZhciBhMDIgPSBhWzJdO1xuICB2YXIgYTAzID0gYVszXTtcbiAgdmFyIGEyMCA9IGFbOF07XG4gIHZhciBhMjEgPSBhWzldO1xuICB2YXIgYTIyID0gYVsxMF07XG4gIHZhciBhMjMgPSBhWzExXTtcblxuICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgcm93c1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuXG4gIG91dFswXSA9IGEwMCAqIGMgLSBhMjAgKiBzO1xuICBvdXRbMV0gPSBhMDEgKiBjIC0gYTIxICogcztcbiAgb3V0WzJdID0gYTAyICogYyAtIGEyMiAqIHM7XG4gIG91dFszXSA9IGEwMyAqIGMgLSBhMjMgKiBzO1xuICBvdXRbOF0gPSBhMDAgKiBzICsgYTIwICogYztcbiAgb3V0WzldID0gYTAxICogcyArIGEyMSAqIGM7XG4gIG91dFsxMF0gPSBhMDIgKiBzICsgYTIyICogYztcbiAgb3V0WzExXSA9IGEwMyAqIHMgKyBhMjMgKiBjO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWihvdXQsIGEsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGEwMCA9IGFbMF07XG4gIHZhciBhMDEgPSBhWzFdO1xuICB2YXIgYTAyID0gYVsyXTtcbiAgdmFyIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdO1xuICB2YXIgYTExID0gYVs1XTtcbiAgdmFyIGExMiA9IGFbNl07XG4gIHZhciBhMTMgPSBhWzddO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgb3V0WzldID0gYVs5XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfSAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cblxuICBvdXRbMF0gPSBhMDAgKiBjICsgYTEwICogcztcbiAgb3V0WzFdID0gYTAxICogYyArIGExMSAqIHM7XG4gIG91dFsyXSA9IGEwMiAqIGMgKyBhMTIgKiBzO1xuICBvdXRbM10gPSBhMDMgKiBjICsgYTEzICogcztcbiAgb3V0WzRdID0gYTEwICogYyAtIGEwMCAqIHM7XG4gIG91dFs1XSA9IGExMSAqIGMgLSBhMDEgKiBzO1xuICBvdXRbNl0gPSBhMTIgKiBjIC0gYTAyICogcztcbiAgb3V0WzddID0gYTEzICogYyAtIGEwMyAqIHM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVRyYW5zbGF0aW9uKG91dCwgdikge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdO1xuICBvdXRbMTNdID0gdlsxXTtcbiAgb3V0WzE0XSA9IHZbMl07XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFNjYWxpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TY2FsaW5nKG91dCwgdikge1xuICBvdXRbMF0gPSB2WzBdO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSB2WzFdO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gdlsyXTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZSBhcm91bmQgYSBnaXZlbiBheGlzXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnJvdGF0ZShkZXN0LCBkZXN0LCByYWQsIGF4aXMpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYXhpcyB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCwgYXhpcykge1xuICB2YXIgeCA9IGF4aXNbMF0sXG4gICAgICB5ID0gYXhpc1sxXSxcbiAgICAgIHogPSBheGlzWzJdO1xuICB2YXIgbGVuID0gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbiAgdmFyIHMsIGMsIHQ7XG5cbiAgaWYgKGxlbiA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxlbiA9IDEgLyBsZW47XG4gIHggKj0gbGVuO1xuICB5ICo9IGxlbjtcbiAgeiAqPSBsZW47XG4gIHMgPSBNYXRoLnNpbihyYWQpO1xuICBjID0gTWF0aC5jb3MocmFkKTtcbiAgdCA9IDEgLSBjOyAvLyBQZXJmb3JtIHJvdGF0aW9uLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IHggKiB4ICogdCArIGM7XG4gIG91dFsxXSA9IHkgKiB4ICogdCArIHogKiBzO1xuICBvdXRbMl0gPSB6ICogeCAqIHQgLSB5ICogcztcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geCAqIHkgKiB0IC0geiAqIHM7XG4gIG91dFs1XSA9IHkgKiB5ICogdCArIGM7XG4gIG91dFs2XSA9IHogKiB5ICogdCArIHggKiBzO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB4ICogeiAqIHQgKyB5ICogcztcbiAgb3V0WzldID0geSAqIHogKiB0IC0geCAqIHM7XG4gIG91dFsxMF0gPSB6ICogeiAqIHQgKyBjO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXNcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQucm90YXRlWChkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21YUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBjO1xuICBvdXRbNl0gPSBzO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAtcztcbiAgb3V0WzEwXSA9IGM7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFkgYXhpc1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5yb3RhdGVZKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVlSb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTsgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IC1zO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSBzO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gYztcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWiBheGlzXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnJvdGF0ZVooZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tWlJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpOyAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gLXM7XG4gIG91dFs1XSA9IGM7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24gYW5kIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtxdWF0NH0gcSBSb3RhdGlvbiBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBxLCB2KSB7XG4gIC8vIFF1YXRlcm5pb24gbWF0aFxuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHh5ID0geCAqIHkyO1xuICB2YXIgeHogPSB4ICogejI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHl6ID0geSAqIHoyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIG91dFswXSA9IDEgLSAoeXkgKyB6eik7XG4gIG91dFsxXSA9IHh5ICsgd3o7XG4gIG91dFsyXSA9IHh6IC0gd3k7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHh5IC0gd3o7XG4gIG91dFs1XSA9IDEgLSAoeHggKyB6eik7XG4gIG91dFs2XSA9IHl6ICsgd3g7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHh6ICsgd3k7XG4gIG91dFs5XSA9IHl6IC0gd3g7XG4gIG91dFsxMF0gPSAxIC0gKHh4ICsgeXkpO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF07XG4gIG91dFsxM10gPSB2WzFdO1xuICBvdXRbMTRdID0gdlsyXTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0NCBmcm9tIGEgZHVhbCBxdWF0LlxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IE1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIER1YWwgUXVhdGVybmlvblxuICogQHJldHVybnMge21hdDR9IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVF1YXQyKG91dCwgYSkge1xuICB2YXIgdHJhbnNsYXRpb24gPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgdmFyIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXSxcbiAgICAgIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XTtcbiAgdmFyIG1hZ25pdHVkZSA9IGJ4ICogYnggKyBieSAqIGJ5ICsgYnogKiBieiArIGJ3ICogYnc7IC8vT25seSBzY2FsZSBpZiBpdCBtYWtlcyBzZW5zZVxuXG4gIGlmIChtYWduaXR1ZGUgPiAwKSB7XG4gICAgdHJhbnNsYXRpb25bMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyIC8gbWFnbml0dWRlO1xuICAgIHRyYW5zbGF0aW9uWzFdID0gKGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnopICogMiAvIG1hZ25pdHVkZTtcbiAgICB0cmFuc2xhdGlvblsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDIgLyBtYWduaXR1ZGU7XG4gIH0gZWxzZSB7XG4gICAgdHJhbnNsYXRpb25bMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyO1xuICAgIHRyYW5zbGF0aW9uWzFdID0gKGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnopICogMjtcbiAgICB0cmFuc2xhdGlvblsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDI7XG4gIH1cblxuICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIGEsIHRyYW5zbGF0aW9uKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yIGNvbXBvbmVudCBvZiBhIHRyYW5zZm9ybWF0aW9uXG4gKiAgbWF0cml4LiBJZiBhIG1hdHJpeCBpcyBidWlsdCB3aXRoIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uLFxuICogIHRoZSByZXR1cm5lZCB2ZWN0b3Igd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yXG4gKiAgb3JpZ2luYWxseSBzdXBwbGllZC5cbiAqIEBwYXJhbSAge3ZlYzN9IG91dCBWZWN0b3IgdG8gcmVjZWl2ZSB0cmFuc2xhdGlvbiBjb21wb25lbnRcbiAqIEBwYXJhbSAge1JlYWRvbmx5TWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcbiAqIEByZXR1cm4ge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbihvdXQsIG1hdCkge1xuICBvdXRbMF0gPSBtYXRbMTJdO1xuICBvdXRbMV0gPSBtYXRbMTNdO1xuICBvdXRbMl0gPSBtYXRbMTRdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzY2FsaW5nIGZhY3RvciBjb21wb25lbnQgb2YgYSB0cmFuc2Zvcm1hdGlvblxuICogIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aCBmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlXG4gKiAgd2l0aCBhIG5vcm1hbGl6ZWQgUXVhdGVybmlvbiBwYXJhbXRlciwgdGhlIHJldHVybmVkIHZlY3RvciB3aWxsIGJlXG4gKiAgdGhlIHNhbWUgYXMgdGhlIHNjYWxpbmcgdmVjdG9yXG4gKiAgb3JpZ2luYWxseSBzdXBwbGllZC5cbiAqIEBwYXJhbSAge3ZlYzN9IG91dCBWZWN0b3IgdG8gcmVjZWl2ZSBzY2FsaW5nIGZhY3RvciBjb21wb25lbnRcbiAqIEBwYXJhbSAge1JlYWRvbmx5TWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcbiAqIEByZXR1cm4ge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2FsaW5nKG91dCwgbWF0KSB7XG4gIHZhciBtMTEgPSBtYXRbMF07XG4gIHZhciBtMTIgPSBtYXRbMV07XG4gIHZhciBtMTMgPSBtYXRbMl07XG4gIHZhciBtMjEgPSBtYXRbNF07XG4gIHZhciBtMjIgPSBtYXRbNV07XG4gIHZhciBtMjMgPSBtYXRbNl07XG4gIHZhciBtMzEgPSBtYXRbOF07XG4gIHZhciBtMzIgPSBtYXRbOV07XG4gIHZhciBtMzMgPSBtYXRbMTBdO1xuICBvdXRbMF0gPSBNYXRoLmh5cG90KG0xMSwgbTEyLCBtMTMpO1xuICBvdXRbMV0gPSBNYXRoLmh5cG90KG0yMSwgbTIyLCBtMjMpO1xuICBvdXRbMl0gPSBNYXRoLmh5cG90KG0zMSwgbTMyLCBtMzMpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIHJvdGF0aW9uYWwgY29tcG9uZW50XG4gKiAgb2YgYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguIElmIGEgbWF0cml4IGlzIGJ1aWx0IHdpdGhcbiAqICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbiwgdGhlIHJldHVybmVkIHF1YXRlcm5pb24gd2lsbCBiZSB0aGVcbiAqICBzYW1lIGFzIHRoZSBxdWF0ZXJuaW9uIG9yaWdpbmFsbHkgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBRdWF0ZXJuaW9uIHRvIHJlY2VpdmUgdGhlIHJvdGF0aW9uIGNvbXBvbmVudFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG1hdCBNYXRyaXggdG8gYmUgZGVjb21wb3NlZCAoaW5wdXQpXG4gKiBAcmV0dXJuIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um90YXRpb24ob3V0LCBtYXQpIHtcbiAgdmFyIHNjYWxpbmcgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgZ2V0U2NhbGluZyhzY2FsaW5nLCBtYXQpO1xuICB2YXIgaXMxID0gMSAvIHNjYWxpbmdbMF07XG4gIHZhciBpczIgPSAxIC8gc2NhbGluZ1sxXTtcbiAgdmFyIGlzMyA9IDEgLyBzY2FsaW5nWzJdO1xuICB2YXIgc20xMSA9IG1hdFswXSAqIGlzMTtcbiAgdmFyIHNtMTIgPSBtYXRbMV0gKiBpczI7XG4gIHZhciBzbTEzID0gbWF0WzJdICogaXMzO1xuICB2YXIgc20yMSA9IG1hdFs0XSAqIGlzMTtcbiAgdmFyIHNtMjIgPSBtYXRbNV0gKiBpczI7XG4gIHZhciBzbTIzID0gbWF0WzZdICogaXMzO1xuICB2YXIgc20zMSA9IG1hdFs4XSAqIGlzMTtcbiAgdmFyIHNtMzIgPSBtYXRbOV0gKiBpczI7XG4gIHZhciBzbTMzID0gbWF0WzEwXSAqIGlzMztcbiAgdmFyIHRyYWNlID0gc20xMSArIHNtMjIgKyBzbTMzO1xuICB2YXIgUyA9IDA7XG5cbiAgaWYgKHRyYWNlID4gMCkge1xuICAgIFMgPSBNYXRoLnNxcnQodHJhY2UgKyAxLjApICogMjtcbiAgICBvdXRbM10gPSAwLjI1ICogUztcbiAgICBvdXRbMF0gPSAoc20yMyAtIHNtMzIpIC8gUztcbiAgICBvdXRbMV0gPSAoc20zMSAtIHNtMTMpIC8gUztcbiAgICBvdXRbMl0gPSAoc20xMiAtIHNtMjEpIC8gUztcbiAgfSBlbHNlIGlmIChzbTExID4gc20yMiAmJiBzbTExID4gc20zMykge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20xMSAtIHNtMjIgLSBzbTMzKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMjMgLSBzbTMyKSAvIFM7XG4gICAgb3V0WzBdID0gMC4yNSAqIFM7XG4gICAgb3V0WzFdID0gKHNtMTIgKyBzbTIxKSAvIFM7XG4gICAgb3V0WzJdID0gKHNtMzEgKyBzbTEzKSAvIFM7XG4gIH0gZWxzZSBpZiAoc20yMiA+IHNtMzMpIHtcbiAgICBTID0gTWF0aC5zcXJ0KDEuMCArIHNtMjIgLSBzbTExIC0gc20zMykgKiAyO1xuICAgIG91dFszXSA9IChzbTMxIC0gc20xMykgLyBTO1xuICAgIG91dFswXSA9IChzbTEyICsgc20yMSkgLyBTO1xuICAgIG91dFsxXSA9IDAuMjUgKiBTO1xuICAgIG91dFsyXSA9IChzbTIzICsgc20zMikgLyBTO1xuICB9IGVsc2Uge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20zMyAtIHNtMTEgLSBzbTIyKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMTIgLSBzbTIxKSAvIFM7XG4gICAgb3V0WzBdID0gKHNtMzEgKyBzbTEzKSAvIFM7XG4gICAgb3V0WzFdID0gKHNtMjMgKyBzbTMyKSAvIFM7XG4gICAgb3V0WzJdID0gMC4yNSAqIFM7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uLCB2ZWN0b3IgdHJhbnNsYXRpb24gYW5kIHZlY3RvciBzY2FsZVxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBzY2FsZSlcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHMgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZShvdXQsIHEsIHYsIHMpIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgdmFyIHN4ID0gc1swXTtcbiAgdmFyIHN5ID0gc1sxXTtcbiAgdmFyIHN6ID0gc1syXTtcbiAgb3V0WzBdID0gKDEgLSAoeXkgKyB6eikpICogc3g7XG4gIG91dFsxXSA9ICh4eSArIHd6KSAqIHN4O1xuICBvdXRbMl0gPSAoeHogLSB3eSkgKiBzeDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gKHh5IC0gd3opICogc3k7XG4gIG91dFs1XSA9ICgxIC0gKHh4ICsgenopKSAqIHN5O1xuICBvdXRbNl0gPSAoeXogKyB3eCkgKiBzeTtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gKHh6ICsgd3kpICogc3o7XG4gIG91dFs5XSA9ICh5eiAtIHd4KSAqIHN6O1xuICBvdXRbMTBdID0gKDEgLSAoeHggKyB5eSkpICogc3o7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXTtcbiAgb3V0WzEzXSA9IHZbMV07XG4gIG91dFsxNF0gPSB2WzJdO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiwgdmVjdG9yIHRyYW5zbGF0aW9uIGFuZCB2ZWN0b3Igc2NhbGUsIHJvdGF0aW5nIGFuZCBzY2FsaW5nIGFyb3VuZCB0aGUgZ2l2ZW4gb3JpZ2luXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCB2ZWMpO1xuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIG9yaWdpbik7XG4gKiAgICAgbGV0IHF1YXRNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xuICogICAgIG1hdDQuc2NhbGUoZGVzdCwgc2NhbGUpXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgbmVnYXRpdmVPcmlnaW4pO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gcyBTY2FsaW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IG8gVGhlIG9yaWdpbiB2ZWN0b3IgYXJvdW5kIHdoaWNoIHRvIHNjYWxlIGFuZCByb3RhdGVcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZU9yaWdpbihvdXQsIHEsIHYsIHMsIG8pIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgdmFyIHN4ID0gc1swXTtcbiAgdmFyIHN5ID0gc1sxXTtcbiAgdmFyIHN6ID0gc1syXTtcbiAgdmFyIG94ID0gb1swXTtcbiAgdmFyIG95ID0gb1sxXTtcbiAgdmFyIG96ID0gb1syXTtcbiAgdmFyIG91dDAgPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgdmFyIG91dDEgPSAoeHkgKyB3eikgKiBzeDtcbiAgdmFyIG91dDIgPSAoeHogLSB3eSkgKiBzeDtcbiAgdmFyIG91dDQgPSAoeHkgLSB3eikgKiBzeTtcbiAgdmFyIG91dDUgPSAoMSAtICh4eCArIHp6KSkgKiBzeTtcbiAgdmFyIG91dDYgPSAoeXogKyB3eCkgKiBzeTtcbiAgdmFyIG91dDggPSAoeHogKyB3eSkgKiBzejtcbiAgdmFyIG91dDkgPSAoeXogLSB3eCkgKiBzejtcbiAgdmFyIG91dDEwID0gKDEgLSAoeHggKyB5eSkpICogc3o7XG4gIG91dFswXSA9IG91dDA7XG4gIG91dFsxXSA9IG91dDE7XG4gIG91dFsyXSA9IG91dDI7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IG91dDQ7XG4gIG91dFs1XSA9IG91dDU7XG4gIG91dFs2XSA9IG91dDY7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IG91dDg7XG4gIG91dFs5XSA9IG91dDk7XG4gIG91dFsxMF0gPSBvdXQxMDtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdICsgb3ggLSAob3V0MCAqIG94ICsgb3V0NCAqIG95ICsgb3V0OCAqIG96KTtcbiAgb3V0WzEzXSA9IHZbMV0gKyBveSAtIChvdXQxICogb3ggKyBvdXQ1ICogb3kgKyBvdXQ5ICogb3opO1xuICBvdXRbMTRdID0gdlsyXSArIG96IC0gKG91dDIgKiBveCArIG91dDYgKiBveSArIG91dDEwICogb3opO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyBhIDR4NCBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIFF1YXRlcm5pb24gdG8gY3JlYXRlIG1hdHJpeCBmcm9tXG4gKlxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUXVhdChvdXQsIHEpIHtcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB5eCA9IHkgKiB4MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgenggPSB6ICogeDI7XG4gIHZhciB6eSA9IHogKiB5MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICBvdXRbMF0gPSAxIC0geXkgLSB6ejtcbiAgb3V0WzFdID0geXggKyB3ejtcbiAgb3V0WzJdID0genggLSB3eTtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geXggLSB3ejtcbiAgb3V0WzVdID0gMSAtIHh4IC0geno7XG4gIG91dFs2XSA9IHp5ICsgd3g7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHp4ICsgd3k7XG4gIG91dFs5XSA9IHp5IC0gd3g7XG4gIG91dFsxMF0gPSAxIC0geHggLSB5eTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBmcnVzdHVtIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge051bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJ1c3R1bShvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gIHZhciBybCA9IDEgLyAocmlnaHQgLSBsZWZ0KTtcbiAgdmFyIHRiID0gMSAvICh0b3AgLSBib3R0b20pO1xuICB2YXIgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMF0gPSBuZWFyICogMiAqIHJsO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBuZWFyICogMiAqIHRiO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAocmlnaHQgKyBsZWZ0KSAqIHJsO1xuICBvdXRbOV0gPSAodG9wICsgYm90dG9tKSAqIHRiO1xuICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gIG91dFsxMV0gPSAtMTtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gZmFyICogbmVhciAqIDIgKiBuZjtcbiAgb3V0WzE1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kcy5cbiAqIFRoZSBuZWFyL2ZhciBjbGlwIHBsYW5lcyBjb3JyZXNwb25kIHRvIGEgbm9ybWFsaXplZCBkZXZpY2UgY29vcmRpbmF0ZSBaIHJhbmdlIG9mIFstMSwgMV0sXG4gKiB3aGljaCBtYXRjaGVzIFdlYkdML09wZW5HTCdzIGNsaXAgdm9sdW1lLlxuICogUGFzc2luZyBudWxsL3VuZGVmaW5lZC9ubyB2YWx1ZSBmb3IgZmFyIHdpbGwgZ2VuZXJhdGUgaW5maW5pdGUgcHJvamVjdGlvbiBtYXRyaXguXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IEFzcGVjdCByYXRpby4gdHlwaWNhbGx5IHZpZXdwb3J0IHdpZHRoL2hlaWdodFxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW0sIGNhbiBiZSBudWxsIG9yIEluZmluaXR5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcnNwZWN0aXZlTk8ob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICB2YXIgZiA9IDEuMCAvIE1hdGgudGFuKGZvdnkgLyAyKSxcbiAgICAgIG5mO1xuICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBmO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTFdID0gLTE7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE1XSA9IDA7XG5cbiAgaWYgKGZhciAhPSBudWxsICYmIGZhciAhPT0gSW5maW5pdHkpIHtcbiAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICAgIG91dFsxNF0gPSAyICogZmFyICogbmVhciAqIG5mO1xuICB9IGVsc2Uge1xuICAgIG91dFsxMF0gPSAtMTtcbiAgICBvdXRbMTRdID0gLTIgKiBuZWFyO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0LnBlcnNwZWN0aXZlTk99XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHBlcnNwZWN0aXZlID0gcGVyc3BlY3RpdmVOTztcbi8qKlxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggc3VpdGFibGUgZm9yIFdlYkdQVSB3aXRoIHRoZSBnaXZlbiBib3VuZHMuXG4gKiBUaGUgbmVhci9mYXIgY2xpcCBwbGFuZXMgY29ycmVzcG9uZCB0byBhIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGUgWiByYW5nZSBvZiBbMCwgMV0sXG4gKiB3aGljaCBtYXRjaGVzIFdlYkdQVS9WdWxrYW4vRGlyZWN0WC9NZXRhbCdzIGNsaXAgdm9sdW1lLlxuICogUGFzc2luZyBudWxsL3VuZGVmaW5lZC9ubyB2YWx1ZSBmb3IgZmFyIHdpbGwgZ2VuZXJhdGUgaW5maW5pdGUgcHJvamVjdGlvbiBtYXRyaXguXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IEFzcGVjdCByYXRpby4gdHlwaWNhbGx5IHZpZXdwb3J0IHdpZHRoL2hlaWdodFxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW0sIGNhbiBiZSBudWxsIG9yIEluZmluaXR5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcnNwZWN0aXZlWk8ob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICB2YXIgZiA9IDEuMCAvIE1hdGgudGFuKGZvdnkgLyAyKSxcbiAgICAgIG5mO1xuICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBmO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTFdID0gLTE7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE1XSA9IDA7XG5cbiAgaWYgKGZhciAhPSBudWxsICYmIGZhciAhPT0gSW5maW5pdHkpIHtcbiAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzEwXSA9IGZhciAqIG5mO1xuICAgIG91dFsxNF0gPSBmYXIgKiBuZWFyICogbmY7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzEwXSA9IC0xO1xuICAgIG91dFsxNF0gPSAtbmVhcjtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGZpZWxkIG9mIHZpZXcuXG4gKiBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIGdlbmVyYXRpbmcgcHJvamVjdGlvbiBtYXRyaWNlcyB0byBiZSB1c2VkXG4gKiB3aXRoIHRoZSBzdGlsbCBleHBlcmllbWVudGFsIFdlYlZSIEFQSS5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge09iamVjdH0gZm92IE9iamVjdCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiB1cERlZ3JlZXMsIGRvd25EZWdyZWVzLCBsZWZ0RGVncmVlcywgcmlnaHREZWdyZWVzXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldyhvdXQsIGZvdiwgbmVhciwgZmFyKSB7XG4gIHZhciB1cFRhbiA9IE1hdGgudGFuKGZvdi51cERlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwLjApO1xuICB2YXIgZG93blRhbiA9IE1hdGgudGFuKGZvdi5kb3duRGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciBsZWZ0VGFuID0gTWF0aC50YW4oZm92LmxlZnREZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIHJpZ2h0VGFuID0gTWF0aC50YW4oZm92LnJpZ2h0RGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciB4U2NhbGUgPSAyLjAgLyAobGVmdFRhbiArIHJpZ2h0VGFuKTtcbiAgdmFyIHlTY2FsZSA9IDIuMCAvICh1cFRhbiArIGRvd25UYW4pO1xuICBvdXRbMF0gPSB4U2NhbGU7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICBvdXRbM10gPSAwLjA7XG4gIG91dFs0XSA9IDAuMDtcbiAgb3V0WzVdID0geVNjYWxlO1xuICBvdXRbNl0gPSAwLjA7XG4gIG91dFs3XSA9IDAuMDtcbiAgb3V0WzhdID0gLSgobGVmdFRhbiAtIHJpZ2h0VGFuKSAqIHhTY2FsZSAqIDAuNSk7XG4gIG91dFs5XSA9ICh1cFRhbiAtIGRvd25UYW4pICogeVNjYWxlICogMC41O1xuICBvdXRbMTBdID0gZmFyIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMTFdID0gLTEuMDtcbiAgb3V0WzEyXSA9IDAuMDtcbiAgb3V0WzEzXSA9IDAuMDtcbiAgb3V0WzE0XSA9IGZhciAqIG5lYXIgLyAobmVhciAtIGZhcik7XG4gIG91dFsxNV0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIG9ydGhvZ29uYWwgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLlxuICogVGhlIG5lYXIvZmFyIGNsaXAgcGxhbmVzIGNvcnJlc3BvbmQgdG8gYSBub3JtYWxpemVkIGRldmljZSBjb29yZGluYXRlIFogcmFuZ2Ugb2YgWy0xLCAxXSxcbiAqIHdoaWNoIG1hdGNoZXMgV2ViR0wvT3BlbkdMJ3MgY2xpcCB2b2x1bWUuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGxlZnQgTGVmdCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IHJpZ2h0IFJpZ2h0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gYm90dG9tIEJvdHRvbSBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IHRvcCBUb3AgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG9ydGhvTk8ob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICB2YXIgbHIgPSAxIC8gKGxlZnQgLSByaWdodCk7XG4gIHZhciBidCA9IDEgLyAoYm90dG9tIC0gdG9wKTtcbiAgdmFyIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgb3V0WzBdID0gLTIgKiBscjtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gLTIgKiBidDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDIgKiBuZjtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAobGVmdCArIHJpZ2h0KSAqIGxyO1xuICBvdXRbMTNdID0gKHRvcCArIGJvdHRvbSkgKiBidDtcbiAgb3V0WzE0XSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0Lm9ydGhvTk99XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG9ydGhvID0gb3J0aG9OTztcbi8qKlxuICogR2VuZXJhdGVzIGEgb3J0aG9nb25hbCBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHMuXG4gKiBUaGUgbmVhci9mYXIgY2xpcCBwbGFuZXMgY29ycmVzcG9uZCB0byBhIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGUgWiByYW5nZSBvZiBbMCwgMV0sXG4gKiB3aGljaCBtYXRjaGVzIFdlYkdQVS9WdWxrYW4vRGlyZWN0WC9NZXRhbCdzIGNsaXAgdm9sdW1lLlxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBvcnRob1pPKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgdmFyIGxyID0gMSAvIChsZWZ0IC0gcmlnaHQpO1xuICB2YXIgYnQgPSAxIC8gKGJvdHRvbSAtIHRvcCk7XG4gIHZhciBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gIG91dFswXSA9IC0yICogbHI7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IC0yICogYnQ7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSBuZjtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAobGVmdCArIHJpZ2h0KSAqIGxyO1xuICBvdXRbMTNdID0gKHRvcCArIGJvdHRvbSkgKiBidDtcbiAgb3V0WzE0XSA9IG5lYXIgKiBuZjtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIGxvb2stYXQgbWF0cml4IHdpdGggdGhlIGdpdmVuIGV5ZSBwb3NpdGlvbiwgZm9jYWwgcG9pbnQsIGFuZCB1cCBheGlzLlxuICogSWYgeW91IHdhbnQgYSBtYXRyaXggdGhhdCBhY3R1YWxseSBtYWtlcyBhbiBvYmplY3QgbG9vayBhdCBhbm90aGVyIG9iamVjdCwgeW91IHNob3VsZCB1c2UgdGFyZ2V0VG8gaW5zdGVhZC5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZXllIFBvc2l0aW9uIG9mIHRoZSB2aWV3ZXJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsb29rQXQob3V0LCBleWUsIGNlbnRlciwgdXApIHtcbiAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbjtcbiAgdmFyIGV5ZXggPSBleWVbMF07XG4gIHZhciBleWV5ID0gZXllWzFdO1xuICB2YXIgZXlleiA9IGV5ZVsyXTtcbiAgdmFyIHVweCA9IHVwWzBdO1xuICB2YXIgdXB5ID0gdXBbMV07XG4gIHZhciB1cHogPSB1cFsyXTtcbiAgdmFyIGNlbnRlcnggPSBjZW50ZXJbMF07XG4gIHZhciBjZW50ZXJ5ID0gY2VudGVyWzFdO1xuICB2YXIgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICBpZiAoTWF0aC5hYnMoZXlleCAtIGNlbnRlcngpIDwgZ2xNYXRyaXguRVBTSUxPTiAmJiBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCBnbE1hdHJpeC5FUFNJTE9OICYmIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gaWRlbnRpdHkob3V0KTtcbiAgfVxuXG4gIHowID0gZXlleCAtIGNlbnRlcng7XG4gIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gIHoyID0gZXlleiAtIGNlbnRlcno7XG4gIGxlbiA9IDEgLyBNYXRoLmh5cG90KHowLCB6MSwgejIpO1xuICB6MCAqPSBsZW47XG4gIHoxICo9IGxlbjtcbiAgejIgKj0gbGVuO1xuICB4MCA9IHVweSAqIHoyIC0gdXB6ICogejE7XG4gIHgxID0gdXB6ICogejAgLSB1cHggKiB6MjtcbiAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICBsZW4gPSBNYXRoLmh5cG90KHgwLCB4MSwgeDIpO1xuXG4gIGlmICghbGVuKSB7XG4gICAgeDAgPSAwO1xuICAgIHgxID0gMDtcbiAgICB4MiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB4MCAqPSBsZW47XG4gICAgeDEgKj0gbGVuO1xuICAgIHgyICo9IGxlbjtcbiAgfVxuXG4gIHkwID0gejEgKiB4MiAtIHoyICogeDE7XG4gIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gIHkyID0gejAgKiB4MSAtIHoxICogeDA7XG4gIGxlbiA9IE1hdGguaHlwb3QoeTAsIHkxLCB5Mik7XG5cbiAgaWYgKCFsZW4pIHtcbiAgICB5MCA9IDA7XG4gICAgeTEgPSAwO1xuICAgIHkyID0gMDtcbiAgfSBlbHNlIHtcbiAgICBsZW4gPSAxIC8gbGVuO1xuICAgIHkwICo9IGxlbjtcbiAgICB5MSAqPSBsZW47XG4gICAgeTIgKj0gbGVuO1xuICB9XG5cbiAgb3V0WzBdID0geDA7XG4gIG91dFsxXSA9IHkwO1xuICBvdXRbMl0gPSB6MDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geDE7XG4gIG91dFs1XSA9IHkxO1xuICBvdXRbNl0gPSB6MTtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0geDI7XG4gIG91dFs5XSA9IHkyO1xuICBvdXRbMTBdID0gejI7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gLSh4MCAqIGV5ZXggKyB4MSAqIGV5ZXkgKyB4MiAqIGV5ZXopO1xuICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopO1xuICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgbWF0cml4IHRoYXQgbWFrZXMgc29tZXRoaW5nIGxvb2sgYXQgc29tZXRoaW5nIGVsc2UuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gY2VudGVyIFBvaW50IHRoZSB2aWV3ZXIgaXMgbG9va2luZyBhdFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHVwIHZlYzMgcG9pbnRpbmcgdXBcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdGFyZ2V0VG8ob3V0LCBleWUsIHRhcmdldCwgdXApIHtcbiAgdmFyIGV5ZXggPSBleWVbMF0sXG4gICAgICBleWV5ID0gZXllWzFdLFxuICAgICAgZXlleiA9IGV5ZVsyXSxcbiAgICAgIHVweCA9IHVwWzBdLFxuICAgICAgdXB5ID0gdXBbMV0sXG4gICAgICB1cHogPSB1cFsyXTtcbiAgdmFyIHowID0gZXlleCAtIHRhcmdldFswXSxcbiAgICAgIHoxID0gZXlleSAtIHRhcmdldFsxXSxcbiAgICAgIHoyID0gZXlleiAtIHRhcmdldFsyXTtcbiAgdmFyIGxlbiA9IHowICogejAgKyB6MSAqIHoxICsgejIgKiB6MjtcblxuICBpZiAobGVuID4gMCkge1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICB6MCAqPSBsZW47XG4gICAgejEgKj0gbGVuO1xuICAgIHoyICo9IGxlbjtcbiAgfVxuXG4gIHZhciB4MCA9IHVweSAqIHoyIC0gdXB6ICogejEsXG4gICAgICB4MSA9IHVweiAqIHowIC0gdXB4ICogejIsXG4gICAgICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XG4gIGxlbiA9IHgwICogeDAgKyB4MSAqIHgxICsgeDIgKiB4MjtcblxuICBpZiAobGVuID4gMCkge1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICB4MCAqPSBsZW47XG4gICAgeDEgKj0gbGVuO1xuICAgIHgyICo9IGxlbjtcbiAgfVxuXG4gIG91dFswXSA9IHgwO1xuICBvdXRbMV0gPSB4MTtcbiAgb3V0WzJdID0geDI7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHoxICogeDIgLSB6MiAqIHgxO1xuICBvdXRbNV0gPSB6MiAqIHgwIC0gejAgKiB4MjtcbiAgb3V0WzZdID0gejAgKiB4MSAtIHoxICogeDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHowO1xuICBvdXRbOV0gPSB6MTtcbiAgb3V0WzEwXSA9IHoyO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IGV5ZXg7XG4gIG91dFsxM10gPSBleWV5O1xuICBvdXRbMTRdID0gZXllejtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwibWF0NChcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIiwgXCIgKyBhWzRdICsgXCIsIFwiICsgYVs1XSArIFwiLCBcIiArIGFbNl0gKyBcIiwgXCIgKyBhWzddICsgXCIsIFwiICsgYVs4XSArIFwiLCBcIiArIGFbOV0gKyBcIiwgXCIgKyBhWzEwXSArIFwiLCBcIiArIGFbMTFdICsgXCIsIFwiICsgYVsxMl0gKyBcIiwgXCIgKyBhWzEzXSArIFwiLCBcIiArIGFbMTRdICsgXCIsIFwiICsgYVsxNV0gKyBcIilcIjtcbn1cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sIGFbNl0sIGFbN10sIGFbOF0sIGFbOV0sIGFbMTBdLCBhWzExXSwgYVsxMl0sIGFbMTNdLCBhWzE0XSwgYVsxNV0pO1xufVxuLyoqXG4gKiBBZGRzIHR3byBtYXQ0J3NcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF07XG4gIG91dFs5XSA9IGFbOV0gKyBiWzldO1xuICBvdXRbMTBdID0gYVsxMF0gKyBiWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdICsgYlsxMV07XG4gIG91dFsxMl0gPSBhWzEyXSArIGJbMTJdO1xuICBvdXRbMTNdID0gYVsxM10gKyBiWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdICsgYlsxNF07XG4gIG91dFsxNV0gPSBhWzE1XSArIGJbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICBvdXRbNl0gPSBhWzZdIC0gYls2XTtcbiAgb3V0WzddID0gYVs3XSAtIGJbN107XG4gIG91dFs4XSA9IGFbOF0gLSBiWzhdO1xuICBvdXRbOV0gPSBhWzldIC0gYls5XTtcbiAgb3V0WzEwXSA9IGFbMTBdIC0gYlsxMF07XG4gIG91dFsxMV0gPSBhWzExXSAtIGJbMTFdO1xuICBvdXRbMTJdID0gYVsxMl0gLSBiWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdIC0gYlsxM107XG4gIG91dFsxNF0gPSBhWzE0XSAtIGJbMTRdO1xuICBvdXRbMTVdID0gYVsxNV0gLSBiWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgbWF0cml4J3MgZWxlbWVudHMgYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICBvdXRbNF0gPSBhWzRdICogYjtcbiAgb3V0WzVdID0gYVs1XSAqIGI7XG4gIG91dFs2XSA9IGFbNl0gKiBiO1xuICBvdXRbN10gPSBhWzddICogYjtcbiAgb3V0WzhdID0gYVs4XSAqIGI7XG4gIG91dFs5XSA9IGFbOV0gKiBiO1xuICBvdXRbMTBdID0gYVsxMF0gKiBiO1xuICBvdXRbMTFdID0gYVsxMV0gKiBiO1xuICBvdXRbMTJdID0gYVsxMl0gKiBiO1xuICBvdXRbMTNdID0gYVsxM10gKiBiO1xuICBvdXRbMTRdID0gYVsxNF0gKiBiO1xuICBvdXRbMTVdID0gYVsxNV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byBtYXQ0J3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XSAqIHNjYWxlO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XSAqIHNjYWxlO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XSAqIHNjYWxlO1xuICBvdXRbN10gPSBhWzddICsgYls3XSAqIHNjYWxlO1xuICBvdXRbOF0gPSBhWzhdICsgYls4XSAqIHNjYWxlO1xuICBvdXRbOV0gPSBhWzldICsgYls5XSAqIHNjYWxlO1xuICBvdXRbMTBdID0gYVsxMF0gKyBiWzEwXSAqIHNjYWxlO1xuICBvdXRbMTFdID0gYVsxMV0gKyBiWzExXSAqIHNjYWxlO1xuICBvdXRbMTJdID0gYVsxMl0gKyBiWzEyXSAqIHNjYWxlO1xuICBvdXRbMTNdID0gYVsxM10gKyBiWzEzXSAqIHNjYWxlO1xuICBvdXRbMTRdID0gYVsxNF0gKyBiWzE0XSAqIHNjYWxlO1xuICBvdXRbMTVdID0gYVsxNV0gKyBiWzE1XSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJiBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN10gJiYgYVs4XSA9PT0gYls4XSAmJiBhWzldID09PSBiWzldICYmIGFbMTBdID09PSBiWzEwXSAmJiBhWzExXSA9PT0gYlsxMV0gJiYgYVsxMl0gPT09IGJbMTJdICYmIGFbMTNdID09PSBiWzEzXSAmJiBhWzE0XSA9PT0gYlsxNF0gJiYgYVsxNV0gPT09IGJbMTVdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdLFxuICAgICAgYTYgPSBhWzZdLFxuICAgICAgYTcgPSBhWzddO1xuICB2YXIgYTggPSBhWzhdLFxuICAgICAgYTkgPSBhWzldLFxuICAgICAgYTEwID0gYVsxMF0sXG4gICAgICBhMTEgPSBhWzExXTtcbiAgdmFyIGExMiA9IGFbMTJdLFxuICAgICAgYTEzID0gYVsxM10sXG4gICAgICBhMTQgPSBhWzE0XSxcbiAgICAgIGExNSA9IGFbMTVdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICB2YXIgYjQgPSBiWzRdLFxuICAgICAgYjUgPSBiWzVdLFxuICAgICAgYjYgPSBiWzZdLFxuICAgICAgYjcgPSBiWzddO1xuICB2YXIgYjggPSBiWzhdLFxuICAgICAgYjkgPSBiWzldLFxuICAgICAgYjEwID0gYlsxMF0sXG4gICAgICBiMTEgPSBiWzExXTtcbiAgdmFyIGIxMiA9IGJbMTJdLFxuICAgICAgYjEzID0gYlsxM10sXG4gICAgICBiMTQgPSBiWzE0XSxcbiAgICAgIGIxNSA9IGJbMTVdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpICYmIE1hdGguYWJzKGE0IC0gYjQpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE0KSwgTWF0aC5hYnMoYjQpKSAmJiBNYXRoLmFicyhhNSAtIGI1KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNSksIE1hdGguYWJzKGI1KSkgJiYgTWF0aC5hYnMoYTYgLSBiNikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTYpLCBNYXRoLmFicyhiNikpICYmIE1hdGguYWJzKGE3IC0gYjcpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE3KSwgTWF0aC5hYnMoYjcpKSAmJiBNYXRoLmFicyhhOCAtIGI4KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhOCksIE1hdGguYWJzKGI4KSkgJiYgTWF0aC5hYnMoYTkgLSBiOSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTkpLCBNYXRoLmFicyhiOSkpICYmIE1hdGguYWJzKGExMCAtIGIxMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEwKSwgTWF0aC5hYnMoYjEwKSkgJiYgTWF0aC5hYnMoYTExIC0gYjExKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTEpLCBNYXRoLmFicyhiMTEpKSAmJiBNYXRoLmFicyhhMTIgLSBiMTIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMiksIE1hdGguYWJzKGIxMikpICYmIE1hdGguYWJzKGExMyAtIGIxMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEzKSwgTWF0aC5hYnMoYjEzKSkgJiYgTWF0aC5hYnMoYTE0IC0gYjE0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTQpLCBNYXRoLmFicyhiMTQpKSAmJiBNYXRoLmFicyhhMTUgLSBiMTUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExNSksIE1hdGguYWJzKGIxNSkpO1xufVxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiAzIERpbWVuc2lvbmFsIFZlY3RvclxuICogQG1vZHVsZSB2ZWMzXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMzXG4gKlxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMyBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzMgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCB4LCB5LCB6KSB7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIG91dFsyXSA9IHo7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEFkZHMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2VpbFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjZWlsKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5jZWlsKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gZmxvb3JcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguZmxvb3IoYVsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gIG91dFsyXSA9IE1hdGgubWF4KGFbMl0sIGJbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gcm91bmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGgucm91bmQoYVsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyBhIHZlYzMgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byB2ZWMzJ3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF07XG4gIHZhciB5ID0gYlsxXSAtIGFbMV07XG4gIHZhciB6ID0gYlsyXSAtIGFbMl07XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHopO1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWRMZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6O1xufVxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGludmVydFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBOb3JtYWxpemUgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6O1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSBhWzBdICogbGVuO1xuICBvdXRbMV0gPSBhWzFdICogbGVuO1xuICBvdXRbMl0gPSBhWzJdICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdO1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3Mob3V0LCBhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl07XG4gIHZhciBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICBieiA9IGJbMl07XG4gIG91dFswXSA9IGF5ICogYnogLSBheiAqIGJ5O1xuICBvdXRbMV0gPSBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzJdID0gYXggKiBieSAtIGF5ICogYng7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXTtcbiAgdmFyIGF5ID0gYVsxXTtcbiAgdmFyIGF6ID0gYVsyXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUGVyZm9ybXMgYSBoZXJtaXRlIGludGVycG9sYXRpb24gd2l0aCB0d28gY29udHJvbCBwb2ludHNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGMgdGhlIHRoaXJkIG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBoZXJtaXRlKG91dCwgYSwgYiwgYywgZCwgdCkge1xuICB2YXIgZmFjdG9yVGltZXMyID0gdCAqIHQ7XG4gIHZhciBmYWN0b3IxID0gZmFjdG9yVGltZXMyICogKDIgKiB0IC0gMykgKyAxO1xuICB2YXIgZmFjdG9yMiA9IGZhY3RvclRpbWVzMiAqICh0IC0gMikgKyB0O1xuICB2YXIgZmFjdG9yMyA9IGZhY3RvclRpbWVzMiAqICh0IC0gMSk7XG4gIHZhciBmYWN0b3I0ID0gZmFjdG9yVGltZXMyICogKDMgLSAyICogdCk7XG4gIG91dFswXSA9IGFbMF0gKiBmYWN0b3IxICsgYlswXSAqIGZhY3RvcjIgKyBjWzBdICogZmFjdG9yMyArIGRbMF0gKiBmYWN0b3I0O1xuICBvdXRbMV0gPSBhWzFdICogZmFjdG9yMSArIGJbMV0gKiBmYWN0b3IyICsgY1sxXSAqIGZhY3RvcjMgKyBkWzFdICogZmFjdG9yNDtcbiAgb3V0WzJdID0gYVsyXSAqIGZhY3RvcjEgKyBiWzJdICogZmFjdG9yMiArIGNbMl0gKiBmYWN0b3IzICsgZFsyXSAqIGZhY3RvcjQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFBlcmZvcm1zIGEgYmV6aWVyIGludGVycG9sYXRpb24gd2l0aCB0d28gY29udHJvbCBwb2ludHNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGMgdGhlIHRoaXJkIG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBiZXppZXIob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBpbnZlcnNlRmFjdG9yID0gMSAtIHQ7XG4gIHZhciBpbnZlcnNlRmFjdG9yVGltZXNUd28gPSBpbnZlcnNlRmFjdG9yICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvclRpbWVzMiA9IHQgKiB0O1xuICB2YXIgZmFjdG9yMSA9IGludmVyc2VGYWN0b3JUaW1lc1R3byAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3IyID0gMyAqIHQgKiBpbnZlcnNlRmFjdG9yVGltZXNUd287XG4gIHZhciBmYWN0b3IzID0gMyAqIGZhY3RvclRpbWVzMiAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3I0ID0gZmFjdG9yVGltZXMyICogdDtcbiAgb3V0WzBdID0gYVswXSAqIGZhY3RvcjEgKyBiWzBdICogZmFjdG9yMiArIGNbMF0gKiBmYWN0b3IzICsgZFswXSAqIGZhY3RvcjQ7XG4gIG91dFsxXSA9IGFbMV0gKiBmYWN0b3IxICsgYlsxXSAqIGZhY3RvcjIgKyBjWzFdICogZmFjdG9yMyArIGRbMV0gKiBmYWN0b3I0O1xuICBvdXRbMl0gPSBhWzJdICogZmFjdG9yMSArIGJbMl0gKiBmYWN0b3IyICsgY1syXSAqIGZhY3RvcjMgKyBkWzJdICogZmFjdG9yNDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG91dCwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG4gIHZhciByID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyLjAgKiBNYXRoLlBJO1xuICB2YXIgeiA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wIC0gMS4wO1xuICB2YXIgelNjYWxlID0gTWF0aC5zcXJ0KDEuMCAtIHogKiB6KSAqIHNjYWxlO1xuICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHpTY2FsZTtcbiAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiB6U2NhbGU7XG4gIG91dFsyXSA9IHogKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgbWF0NC5cbiAqIDR0aCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0NChvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTtcbiAgdmFyIHcgPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV07XG4gIHcgPSB3IHx8IDEuMDtcbiAgb3V0WzBdID0gKG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdKSAvIHc7XG4gIG91dFsxXSA9IChtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSkgLyB3O1xuICBvdXRbMl0gPSAobVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdKSAvIHc7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDMuXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSB0aGUgM3gzIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICBvdXRbMF0gPSB4ICogbVswXSArIHkgKiBtWzNdICsgeiAqIG1bNl07XG4gIG91dFsxXSA9IHggKiBtWzFdICsgeSAqIG1bNF0gKyB6ICogbVs3XTtcbiAgb3V0WzJdID0geCAqIG1bMl0gKyB5ICogbVs1XSArIHogKiBtWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBxdWF0XG4gKiBDYW4gYWxzbyBiZSB1c2VkIGZvciBkdWFsIHF1YXRlcm5pb25zLiAoTXVsdGlwbHkgaXQgd2l0aCB0aGUgcmVhbCBwYXJ0KVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgcXVhdGVybmlvbiB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1RdWF0KG91dCwgYSwgcSkge1xuICAvLyBiZW5jaG1hcmtzOiBodHRwczovL2pzcGVyZi5jb20vcXVhdGVybmlvbi10cmFuc2Zvcm0tdmVjMy1pbXBsZW1lbnRhdGlvbnMtZml4ZWRcbiAgdmFyIHF4ID0gcVswXSxcbiAgICAgIHF5ID0gcVsxXSxcbiAgICAgIHF6ID0gcVsyXSxcbiAgICAgIHF3ID0gcVszXTtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTsgLy8gdmFyIHF2ZWMgPSBbcXgsIHF5LCBxel07XG4gIC8vIHZhciB1diA9IHZlYzMuY3Jvc3MoW10sIHF2ZWMsIGEpO1xuXG4gIHZhciB1dnggPSBxeSAqIHogLSBxeiAqIHksXG4gICAgICB1dnkgPSBxeiAqIHggLSBxeCAqIHosXG4gICAgICB1dnogPSBxeCAqIHkgLSBxeSAqIHg7IC8vIHZhciB1dXYgPSB2ZWMzLmNyb3NzKFtdLCBxdmVjLCB1dik7XG5cbiAgdmFyIHV1dnggPSBxeSAqIHV2eiAtIHF6ICogdXZ5LFxuICAgICAgdXV2eSA9IHF6ICogdXZ4IC0gcXggKiB1dnosXG4gICAgICB1dXZ6ID0gcXggKiB1dnkgLSBxeSAqIHV2eDsgLy8gdmVjMy5zY2FsZSh1diwgdXYsIDIgKiB3KTtcblxuICB2YXIgdzIgPSBxdyAqIDI7XG4gIHV2eCAqPSB3MjtcbiAgdXZ5ICo9IHcyO1xuICB1dnogKj0gdzI7IC8vIHZlYzMuc2NhbGUodXV2LCB1dXYsIDIpO1xuXG4gIHV1dnggKj0gMjtcbiAgdXV2eSAqPSAyO1xuICB1dXZ6ICo9IDI7IC8vIHJldHVybiB2ZWMzLmFkZChvdXQsIGEsIHZlYzMuYWRkKG91dCwgdXYsIHV1dikpO1xuXG4gIG91dFswXSA9IHggKyB1dnggKyB1dXZ4O1xuICBvdXRbMV0gPSB5ICsgdXZ5ICsgdXV2eTtcbiAgb3V0WzJdID0geiArIHV2eiArIHV1dno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHgtYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgdmVjMyBwb2ludCB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICAgIHIgPSBbXTsgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXG4gIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgcFsxXSA9IGFbMV0gLSBiWzFdO1xuICBwWzJdID0gYVsyXSAtIGJbMl07IC8vcGVyZm9ybSByb3RhdGlvblxuXG4gIHJbMF0gPSBwWzBdO1xuICByWzFdID0gcFsxXSAqIE1hdGguY29zKHJhZCkgLSBwWzJdICogTWF0aC5zaW4ocmFkKTtcbiAgclsyXSA9IHBbMV0gKiBNYXRoLnNpbihyYWQpICsgcFsyXSAqIE1hdGguY29zKHJhZCk7IC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgb3V0WzFdID0gclsxXSArIGJbMV07XG4gIG91dFsyXSA9IHJbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB5LWF4aXNcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFsyXSAqIE1hdGguc2luKHJhZCkgKyBwWzBdICogTWF0aC5jb3MocmFkKTtcbiAgclsxXSA9IHBbMV07XG4gIHJbMl0gPSBwWzJdICogTWF0aC5jb3MocmFkKSAtIHBbMF0gKiBNYXRoLnNpbihyYWQpOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgei1heGlzXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWihvdXQsIGEsIGIsIHJhZCkge1xuICB2YXIgcCA9IFtdLFxuICAgICAgciA9IFtdOyAvL1RyYW5zbGF0ZSBwb2ludCB0byB0aGUgb3JpZ2luXG5cbiAgcFswXSA9IGFbMF0gLSBiWzBdO1xuICBwWzFdID0gYVsxXSAtIGJbMV07XG4gIHBbMl0gPSBhWzJdIC0gYlsyXTsgLy9wZXJmb3JtIHJvdGF0aW9uXG5cbiAgclswXSA9IHBbMF0gKiBNYXRoLmNvcyhyYWQpIC0gcFsxXSAqIE1hdGguc2luKHJhZCk7XG4gIHJbMV0gPSBwWzBdICogTWF0aC5zaW4ocmFkKSArIHBbMV0gKiBNYXRoLmNvcyhyYWQpO1xuICByWzJdID0gcFsyXTsgLy90cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdldCB0aGUgYW5nbGUgYmV0d2VlbiB0d28gM0QgdmVjdG9yc1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYW5nbGUoYSwgYikge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYnggPSBiWzBdLFxuICAgICAgYnkgPSBiWzFdLFxuICAgICAgYnogPSBiWzJdLFxuICAgICAgbWFnMSA9IE1hdGguc3FydChheCAqIGF4ICsgYXkgKiBheSArIGF6ICogYXopLFxuICAgICAgbWFnMiA9IE1hdGguc3FydChieCAqIGJ4ICsgYnkgKiBieSArIGJ6ICogYnopLFxuICAgICAgbWFnID0gbWFnMSAqIG1hZzIsXG4gICAgICBjb3NpbmUgPSBtYWcgJiYgZG90KGEsIGIpIC8gbWFnO1xuICByZXR1cm4gTWF0aC5hY29zKE1hdGgubWluKE1hdGgubWF4KGNvc2luZSwgLTEpLCAxKSk7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gemVyb1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJ2ZWMzKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXTtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKTtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzNzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzMuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMzcyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSAzO1xuICAgIH1cblxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgdmVjWzJdID0gYVtpICsgMl07XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICAgIGFbaSArIDJdID0gdmVjWzJdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiA0IERpbWVuc2lvbmFsIFZlY3RvclxuICogQG1vZHVsZSB2ZWM0XG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWM0XG4gKlxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBhIG5ldyA0RCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6LCB3KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgb3V0WzNdID0gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSwgeiwgdykge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICBvdXRbM10gPSB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gIG91dFszXSA9IGFbM10gKiBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXZpZGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gIG91dFszXSA9IGFbM10gLyBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLmNlaWwgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBjZWlsXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmNlaWwoYVsyXSk7XG4gIG91dFszXSA9IE1hdGguY2VpbChhWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTWF0aC5mbG9vciB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGZsb29yXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmZsb29yKGFbMl0pO1xuICBvdXRbM10gPSBNYXRoLmZsb29yKGFbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtaW4ob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5taW4oYVsyXSwgYlsyXSk7XG4gIG91dFszXSA9IE1hdGgubWluKGFbM10sIGJbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gIG91dFszXSA9IE1hdGgubWF4KGFbM10sIGJbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gcm91bmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGgucm91bmQoYVsyXSk7XG4gIG91dFszXSA9IE1hdGgucm91bmQoYVszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyBhIHZlYzQgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gdmVjNCdzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICB2YXIgdyA9IGJbM10gLSBhWzNdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6LCB3KTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgdmFyIHcgPSBiWzNdIC0gYVszXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciB3ID0gYVszXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeiwgdyk7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciB3ID0gYVszXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xufVxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgb3V0WzNdID0gLWFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgb3V0WzJdID0gMS4wIC8gYVsyXTtcbiAgb3V0WzNdID0gMS4wIC8gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIHcgPSBhWzNdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSB4ICogbGVuO1xuICBvdXRbMV0gPSB5ICogbGVuO1xuICBvdXRbMl0gPSB6ICogbGVuO1xuICBvdXRbM10gPSB3ICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdICsgYVszXSAqIGJbM107XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGNyb3NzLXByb2R1Y3Qgb2YgdGhyZWUgdmVjdG9ycyBpbiBhIDQtZGltZW5zaW9uYWwgc3BhY2VcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gcmVzdWx0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gVSB0aGUgZmlyc3QgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gViB0aGUgc2Vjb25kIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IFcgdGhlIHRoaXJkIHZlY3RvclxuICogQHJldHVybnMge3ZlYzR9IHJlc3VsdFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIHUsIHYsIHcpIHtcbiAgdmFyIEEgPSB2WzBdICogd1sxXSAtIHZbMV0gKiB3WzBdLFxuICAgICAgQiA9IHZbMF0gKiB3WzJdIC0gdlsyXSAqIHdbMF0sXG4gICAgICBDID0gdlswXSAqIHdbM10gLSB2WzNdICogd1swXSxcbiAgICAgIEQgPSB2WzFdICogd1syXSAtIHZbMl0gKiB3WzFdLFxuICAgICAgRSA9IHZbMV0gKiB3WzNdIC0gdlszXSAqIHdbMV0sXG4gICAgICBGID0gdlsyXSAqIHdbM10gLSB2WzNdICogd1syXTtcbiAgdmFyIEcgPSB1WzBdO1xuICB2YXIgSCA9IHVbMV07XG4gIHZhciBJID0gdVsyXTtcbiAgdmFyIEogPSB1WzNdO1xuICBvdXRbMF0gPSBIICogRiAtIEkgKiBFICsgSiAqIEQ7XG4gIG91dFsxXSA9IC0oRyAqIEYpICsgSSAqIEMgLSBKICogQjtcbiAgb3V0WzJdID0gRyAqIEUgLSBIICogQyArIEogKiBBO1xuICBvdXRbM10gPSAtKEcgKiBEKSArIEggKiBCIC0gSSAqIEE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXTtcbiAgdmFyIGF5ID0gYVsxXTtcbiAgdmFyIGF6ID0gYVsyXTtcbiAgdmFyIGF3ID0gYVszXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgb3V0WzNdID0gYXcgKyB0ICogKGJbM10gLSBhdyk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQsIHNjYWxlKSB7XG4gIHNjYWxlID0gc2NhbGUgfHwgMS4wOyAvLyBNYXJzYWdsaWEsIEdlb3JnZS4gQ2hvb3NpbmcgYSBQb2ludCBmcm9tIHRoZSBTdXJmYWNlIG9mIGFcbiAgLy8gU3BoZXJlLiBBbm4uIE1hdGguIFN0YXRpc3QuIDQzICgxOTcyKSwgbm8uIDIsIDY0NS0tNjQ2LlxuICAvLyBodHRwOi8vcHJvamVjdGV1Y2xpZC5vcmcvZXVjbGlkLmFvbXMvMTE3NzY5MjY0NDtcblxuICB2YXIgdjEsIHYyLCB2MywgdjQ7XG4gIHZhciBzMSwgczI7XG5cbiAgZG8ge1xuICAgIHYxID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyIC0gMTtcbiAgICB2MiA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgczEgPSB2MSAqIHYxICsgdjIgKiB2MjtcbiAgfSB3aGlsZSAoczEgPj0gMSk7XG5cbiAgZG8ge1xuICAgIHYzID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyIC0gMTtcbiAgICB2NCA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgczIgPSB2MyAqIHYzICsgdjQgKiB2NDtcbiAgfSB3aGlsZSAoczIgPj0gMSk7XG5cbiAgdmFyIGQgPSBNYXRoLnNxcnQoKDEgLSBzMSkgLyBzMik7XG4gIG91dFswXSA9IHNjYWxlICogdjE7XG4gIG91dFsxXSA9IHNjYWxlICogdjI7XG4gIG91dFsyXSA9IHNjYWxlICogdjMgKiBkO1xuICBvdXRbM10gPSBzY2FsZSAqIHY0ICogZDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgbWF0NC5cbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdICogdztcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10gKiB3O1xuICBvdXRbMl0gPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0gKiB3O1xuICBvdXRbM10gPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV0gKiB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWM0IHdpdGggYSBxdWF0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVF1YXQob3V0LCBhLCBxKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07XG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM107IC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjXG5cbiAgdmFyIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5O1xuICB2YXIgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHo7XG4gIHZhciBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDtcbiAgdmFyIGl3ID0gLXF4ICogeCAtIHF5ICogeSAtIHF6ICogejsgLy8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuXG4gIG91dFswXSA9IGl4ICogcXcgKyBpdyAqIC1xeCArIGl5ICogLXF6IC0gaXogKiAtcXk7XG4gIG91dFsxXSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XG4gIG91dFsyXSA9IGl6ICogcXcgKyBpdyAqIC1xeiArIGl4ICogLXF5IC0gaXkgKiAtcXg7XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzQgdG8gemVyb1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIG91dFszXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInZlYzQoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIiwgXCIgKyBhWzNdICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKTtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuZGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzQuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWM0cyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSA0O1xuICAgIH1cblxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgdmVjWzJdID0gYVtpICsgMl07XG4gICAgICB2ZWNbM10gPSBhW2kgKyAzXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgICAgYVtpICsgMl0gPSB2ZWNbMl07XG4gICAgICBhW2kgKyAzXSA9IHZlY1szXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfTtcbn0oKTsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbmltcG9ydCAqIGFzIG1hdDMgZnJvbSBcIi4vbWF0My5qc1wiO1xuaW1wb3J0ICogYXMgdmVjMyBmcm9tIFwiLi92ZWMzLmpzXCI7XG5pbXBvcnQgKiBhcyB2ZWM0IGZyb20gXCIuL3ZlYzQuanNcIjtcbi8qKlxuICogUXVhdGVybmlvblxuICogQG1vZHVsZSBxdWF0XG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IHF1YXRcbiAqXG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCBhIHF1YXQgdG8gdGhlIGlkZW50aXR5IHF1YXRlcm5pb25cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDA7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldHMgYSBxdWF0IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFuZCByb3RhdGlvbiBheGlzLFxuICogdGhlbiByZXR1cm5zIGl0LlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGF4aXMgdGhlIGF4aXMgYXJvdW5kIHdoaWNoIHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgaW4gcmFkaWFuc1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0QXhpc0FuZ2xlKG91dCwgYXhpcywgcmFkKSB7XG4gIHJhZCA9IHJhZCAqIDAuNTtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICBvdXRbMF0gPSBzICogYXhpc1swXTtcbiAgb3V0WzFdID0gcyAqIGF4aXNbMV07XG4gIG91dFsyXSA9IHMgKiBheGlzWzJdO1xuICBvdXRbM10gPSBNYXRoLmNvcyhyYWQpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZXRzIHRoZSByb3RhdGlvbiBheGlzIGFuZCBhbmdsZSBmb3IgYSBnaXZlblxuICogIHF1YXRlcm5pb24uIElmIGEgcXVhdGVybmlvbiBpcyBjcmVhdGVkIHdpdGhcbiAqICBzZXRBeGlzQW5nbGUsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzYW1lXG4gKiAgdmFsdWVzIGFzIHByb3ZpZGllZCBpbiB0aGUgb3JpZ2luYWwgcGFyYW1ldGVyIGxpc3RcbiAqICBPUiBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKiBFeGFtcGxlOiBUaGUgcXVhdGVybmlvbiBmb3JtZWQgYnkgYXhpcyBbMCwgMCwgMV0gYW5kXG4gKiAgYW5nbGUgLTkwIGlzIHRoZSBzYW1lIGFzIHRoZSBxdWF0ZXJuaW9uIGZvcm1lZCBieVxuICogIFswLCAwLCAxXSBhbmQgMjcwLiBUaGlzIG1ldGhvZCBmYXZvcnMgdGhlIGxhdHRlci5cbiAqIEBwYXJhbSAge3ZlYzN9IG91dF9heGlzICBWZWN0b3IgcmVjZWl2aW5nIHRoZSBheGlzIG9mIHJvdGF0aW9uXG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXR9IHEgICAgIFF1YXRlcm5pb24gdG8gYmUgZGVjb21wb3NlZFxuICogQHJldHVybiB7TnVtYmVyfSAgICAgQW5nbGUsIGluIHJhZGlhbnMsIG9mIHRoZSByb3RhdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBeGlzQW5nbGUob3V0X2F4aXMsIHEpIHtcbiAgdmFyIHJhZCA9IE1hdGguYWNvcyhxWzNdKSAqIDIuMDtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQgLyAyLjApO1xuXG4gIGlmIChzID4gZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIG91dF9heGlzWzBdID0gcVswXSAvIHM7XG4gICAgb3V0X2F4aXNbMV0gPSBxWzFdIC8gcztcbiAgICBvdXRfYXhpc1syXSA9IHFbMl0gLyBzO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHMgaXMgemVybywgcmV0dXJuIGFueSBheGlzIChubyByb3RhdGlvbiAtIGF4aXMgZG9lcyBub3QgbWF0dGVyKVxuICAgIG91dF9heGlzWzBdID0gMTtcbiAgICBvdXRfYXhpc1sxXSA9IDA7XG4gICAgb3V0X2F4aXNbMl0gPSAwO1xuICB9XG5cbiAgcmV0dXJuIHJhZDtcbn1cbi8qKlxuICogR2V0cyB0aGUgYW5ndWxhciBkaXN0YW5jZSBiZXR3ZWVuIHR3byB1bml0IHF1YXRlcm5pb25zXG4gKlxuICogQHBhcmFtICB7UmVhZG9ubHlRdWF0fSBhICAgICBPcmlnaW4gdW5pdCBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXR9IGIgICAgIERlc3RpbmF0aW9uIHVuaXQgcXVhdGVybmlvblxuICogQHJldHVybiB7TnVtYmVyfSAgICAgQW5nbGUsIGluIHJhZGlhbnMsIGJldHdlZW4gdGhlIHR3byBxdWF0ZXJuaW9uc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmdsZShhLCBiKSB7XG4gIHZhciBkb3Rwcm9kdWN0ID0gZG90KGEsIGIpO1xuICByZXR1cm4gTWF0aC5hY29zKDIgKiBkb3Rwcm9kdWN0ICogZG90cHJvZHVjdCAtIDEpO1xufVxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIHZhciBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICBieiA9IGJbMl0sXG4gICAgICBidyA9IGJbM107XG4gIG91dFswXSA9IGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFsxXSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYno7XG4gIG91dFsyXSA9IGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYng7XG4gIG91dFszXSA9IGF3ICogYncgLSBheCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBxdWF0ZXJuaW9uIGJ5IHRoZSBnaXZlbiBhbmdsZSBhYm91dCB0aGUgWCBheGlzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVYKG91dCwgYSwgcmFkKSB7XG4gIHJhZCAqPSAwLjU7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIHZhciBieCA9IE1hdGguc2luKHJhZCksXG4gICAgICBidyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGF4ICogYncgKyBhdyAqIGJ4O1xuICBvdXRbMV0gPSBheSAqIGJ3ICsgYXogKiBieDtcbiAgb3V0WzJdID0gYXogKiBidyAtIGF5ICogYng7XG4gIG91dFszXSA9IGF3ICogYncgLSBheCAqIGJ4O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFkgYXhpc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHF1YXQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGFuZ2xlIChpbiByYWRpYW5zKSB0byByb3RhdGVcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWShvdXQsIGEsIHJhZCkge1xuICByYWQgKj0gMC41O1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYXcgPSBhWzNdO1xuICB2YXIgYnkgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYncgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBheCAqIGJ3IC0gYXogKiBieTtcbiAgb3V0WzFdID0gYXkgKiBidyArIGF3ICogYnk7XG4gIG91dFsyXSA9IGF6ICogYncgKyBheCAqIGJ5O1xuICBvdXRbM10gPSBhdyAqIGJ3IC0gYXkgKiBieTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBaIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBhbmdsZSAoaW4gcmFkaWFucykgdG8gcm90YXRlXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCByYWQpIHtcbiAgcmFkICo9IDAuNTtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ6ID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGJ3ID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYXggKiBidyArIGF5ICogYno7XG4gIG91dFsxXSA9IGF5ICogYncgLSBheCAqIGJ6O1xuICBvdXRbMl0gPSBheiAqIGJ3ICsgYXcgKiBiejtcbiAgb3V0WzNdID0gYXcgKiBidyAtIGF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIFcgY29tcG9uZW50IG9mIGEgcXVhdCBmcm9tIHRoZSBYLCBZLCBhbmQgWiBjb21wb25lbnRzLlxuICogQXNzdW1lcyB0aGF0IHF1YXRlcm5pb24gaXMgMSB1bml0IGluIGxlbmd0aC5cbiAqIEFueSBleGlzdGluZyBXIGNvbXBvbmVudCB3aWxsIGJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBXIGNvbXBvbmVudCBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVXKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICBvdXRbM10gPSBNYXRoLnNxcnQoTWF0aC5hYnMoMS4wIC0geCAqIHggLSB5ICogeSAtIHogKiB6KSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2YgYSB1bml0IHF1YXRlcm5pb24uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhwKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIHZhciByID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7XG4gIHZhciBldCA9IE1hdGguZXhwKHcpO1xuICB2YXIgcyA9IHIgPiAwID8gZXQgKiBNYXRoLnNpbihyKSAvIHIgOiAwO1xuICBvdXRbMF0gPSB4ICogcztcbiAgb3V0WzFdID0geSAqIHM7XG4gIG91dFsyXSA9IHogKiBzO1xuICBvdXRbM10gPSBldCAqIE1hdGguY29zKHIpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIGEgdW5pdCBxdWF0ZXJuaW9uLlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdCB0byBjYWxjdWxhdGUgdGhlIGV4cG9uZW50aWFsIG9mXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxuKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIHZhciByID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7XG4gIHZhciB0ID0gciA+IDAgPyBNYXRoLmF0YW4yKHIsIHcpIC8gciA6IDA7XG4gIG91dFswXSA9IHggKiB0O1xuICBvdXRbMV0gPSB5ICogdDtcbiAgb3V0WzJdID0geiAqIHQ7XG4gIG91dFszXSA9IDAuNSAqIE1hdGgubG9nKHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBzY2FsYXIgcG93ZXIgb2YgYSB1bml0IHF1YXRlcm5pb24uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2ZcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgcXVhdGVybmlvbiBieVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwb3cob3V0LCBhLCBiKSB7XG4gIGxuKG91dCwgYSk7XG4gIHNjYWxlKG91dCwgb3V0LCBiKTtcbiAgZXhwKG91dCwgb3V0KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUGVyZm9ybXMgYSBzcGhlcmljYWwgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgLy8gYmVuY2htYXJrczpcbiAgLy8gICAgaHR0cDovL2pzcGVyZi5jb20vcXVhdGVybmlvbi1zbGVycC1pbXBsZW1lbnRhdGlvbnNcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXSxcbiAgICAgIGJ3ID0gYlszXTtcbiAgdmFyIG9tZWdhLCBjb3NvbSwgc2lub20sIHNjYWxlMCwgc2NhbGUxOyAvLyBjYWxjIGNvc2luZVxuXG4gIGNvc29tID0gYXggKiBieCArIGF5ICogYnkgKyBheiAqIGJ6ICsgYXcgKiBidzsgLy8gYWRqdXN0IHNpZ25zIChpZiBuZWNlc3NhcnkpXG5cbiAgaWYgKGNvc29tIDwgMC4wKSB7XG4gICAgY29zb20gPSAtY29zb207XG4gICAgYnggPSAtYng7XG4gICAgYnkgPSAtYnk7XG4gICAgYnogPSAtYno7XG4gICAgYncgPSAtYnc7XG4gIH0gLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xuXG5cbiAgaWYgKDEuMCAtIGNvc29tID4gZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIC8vIHN0YW5kYXJkIGNhc2UgKHNsZXJwKVxuICAgIG9tZWdhID0gTWF0aC5hY29zKGNvc29tKTtcbiAgICBzaW5vbSA9IE1hdGguc2luKG9tZWdhKTtcbiAgICBzY2FsZTAgPSBNYXRoLnNpbigoMS4wIC0gdCkgKiBvbWVnYSkgLyBzaW5vbTtcbiAgICBzY2FsZTEgPSBNYXRoLnNpbih0ICogb21lZ2EpIC8gc2lub207XG4gIH0gZWxzZSB7XG4gICAgLy8gXCJmcm9tXCIgYW5kIFwidG9cIiBxdWF0ZXJuaW9ucyBhcmUgdmVyeSBjbG9zZVxuICAgIC8vICAuLi4gc28gd2UgY2FuIGRvIGEgbGluZWFyIGludGVycG9sYXRpb25cbiAgICBzY2FsZTAgPSAxLjAgLSB0O1xuICAgIHNjYWxlMSA9IHQ7XG4gIH0gLy8gY2FsY3VsYXRlIGZpbmFsIHZhbHVlc1xuXG5cbiAgb3V0WzBdID0gc2NhbGUwICogYXggKyBzY2FsZTEgKiBieDtcbiAgb3V0WzFdID0gc2NhbGUwICogYXkgKyBzY2FsZTEgKiBieTtcbiAgb3V0WzJdID0gc2NhbGUwICogYXogKyBzY2FsZTEgKiBiejtcbiAgb3V0WzNdID0gc2NhbGUwICogYXcgKyBzY2FsZTEgKiBidztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHVuaXQgcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0KSB7XG4gIC8vIEltcGxlbWVudGF0aW9uIG9mIGh0dHA6Ly9wbGFubmluZy5jcy51aXVjLmVkdS9ub2RlMTk4Lmh0bWxcbiAgLy8gVE9ETzogQ2FsbGluZyByYW5kb20gMyB0aW1lcyBpcyBwcm9iYWJseSBub3QgdGhlIGZhc3Rlc3Qgc29sdXRpb25cbiAgdmFyIHUxID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gIHZhciB1MiA9IGdsTWF0cml4LlJBTkRPTSgpO1xuICB2YXIgdTMgPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgdmFyIHNxcnQxTWludXNVMSA9IE1hdGguc3FydCgxIC0gdTEpO1xuICB2YXIgc3FydFUxID0gTWF0aC5zcXJ0KHUxKTtcbiAgb3V0WzBdID0gc3FydDFNaW51c1UxICogTWF0aC5zaW4oMi4wICogTWF0aC5QSSAqIHUyKTtcbiAgb3V0WzFdID0gc3FydDFNaW51c1UxICogTWF0aC5jb3MoMi4wICogTWF0aC5QSSAqIHUyKTtcbiAgb3V0WzJdID0gc3FydFUxICogTWF0aC5zaW4oMi4wICogTWF0aC5QSSAqIHUzKTtcbiAgb3V0WzNdID0gc3FydFUxICogTWF0aC5jb3MoMi4wICogTWF0aC5QSSAqIHUzKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW52ZXJzZSBvZiBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGludmVyc2Ugb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgZG90ID0gYTAgKiBhMCArIGExICogYTEgKyBhMiAqIGEyICsgYTMgKiBhMztcbiAgdmFyIGludkRvdCA9IGRvdCA/IDEuMCAvIGRvdCA6IDA7IC8vIFRPRE86IFdvdWxkIGJlIGZhc3RlciB0byByZXR1cm4gWzAsMCwwLDBdIGltbWVkaWF0ZWx5IGlmIGRvdCA9PSAwXG5cbiAgb3V0WzBdID0gLWEwICogaW52RG90O1xuICBvdXRbMV0gPSAtYTEgKiBpbnZEb3Q7XG4gIG91dFsyXSA9IC1hMiAqIGludkRvdDtcbiAgb3V0WzNdID0gYTMgKiBpbnZEb3Q7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGNvbmp1Z2F0ZSBvZiBhIHF1YXRcbiAqIElmIHRoZSBxdWF0ZXJuaW9uIGlzIG5vcm1hbGl6ZWQsIHRoaXMgZnVuY3Rpb24gaXMgZmFzdGVyIHRoYW4gcXVhdC5pbnZlcnNlIGFuZCBwcm9kdWNlcyB0aGUgc2FtZSByZXN1bHQuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBjb25qdWdhdGUgb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29uanVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgcXVhdGVybmlvbiBmcm9tIHRoZSBnaXZlbiAzeDMgcm90YXRpb24gbWF0cml4LlxuICpcbiAqIE5PVEU6IFRoZSByZXN1bHRhbnQgcXVhdGVybmlvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28geW91IHNob3VsZCBiZSBzdXJlXG4gKiB0byByZW5vcm1hbGl6ZSB0aGUgcXVhdGVybmlvbiB5b3Vyc2VsZiB3aGVyZSBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSByb3RhdGlvbiBtYXRyaXhcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWF0MyhvdXQsIG0pIHtcbiAgLy8gQWxnb3JpdGhtIGluIEtlbiBTaG9lbWFrZSdzIGFydGljbGUgaW4gMTk4NyBTSUdHUkFQSCBjb3Vyc2Ugbm90ZXNcbiAgLy8gYXJ0aWNsZSBcIlF1YXRlcm5pb24gQ2FsY3VsdXMgYW5kIEZhc3QgQW5pbWF0aW9uXCIuXG4gIHZhciBmVHJhY2UgPSBtWzBdICsgbVs0XSArIG1bOF07XG4gIHZhciBmUm9vdDtcblxuICBpZiAoZlRyYWNlID4gMC4wKSB7XG4gICAgLy8gfHd8ID4gMS8yLCBtYXkgYXMgd2VsbCBjaG9vc2UgdyA+IDEvMlxuICAgIGZSb290ID0gTWF0aC5zcXJ0KGZUcmFjZSArIDEuMCk7IC8vIDJ3XG5cbiAgICBvdXRbM10gPSAwLjUgKiBmUm9vdDtcbiAgICBmUm9vdCA9IDAuNSAvIGZSb290OyAvLyAxLyg0dylcblxuICAgIG91dFswXSA9IChtWzVdIC0gbVs3XSkgKiBmUm9vdDtcbiAgICBvdXRbMV0gPSAobVs2XSAtIG1bMl0pICogZlJvb3Q7XG4gICAgb3V0WzJdID0gKG1bMV0gLSBtWzNdKSAqIGZSb290O1xuICB9IGVsc2Uge1xuICAgIC8vIHx3fCA8PSAxLzJcbiAgICB2YXIgaSA9IDA7XG4gICAgaWYgKG1bNF0gPiBtWzBdKSBpID0gMTtcbiAgICBpZiAobVs4XSA+IG1baSAqIDMgKyBpXSkgaSA9IDI7XG4gICAgdmFyIGogPSAoaSArIDEpICUgMztcbiAgICB2YXIgayA9IChpICsgMikgJSAzO1xuICAgIGZSb290ID0gTWF0aC5zcXJ0KG1baSAqIDMgKyBpXSAtIG1baiAqIDMgKyBqXSAtIG1bayAqIDMgKyBrXSArIDEuMCk7XG4gICAgb3V0W2ldID0gMC41ICogZlJvb3Q7XG4gICAgZlJvb3QgPSAwLjUgLyBmUm9vdDtcbiAgICBvdXRbM10gPSAobVtqICogMyArIGtdIC0gbVtrICogMyArIGpdKSAqIGZSb290O1xuICAgIG91dFtqXSA9IChtW2ogKiAzICsgaV0gKyBtW2kgKiAzICsgal0pICogZlJvb3Q7XG4gICAgb3V0W2tdID0gKG1bayAqIDMgKyBpXSArIG1baSAqIDMgKyBrXSkgKiBmUm9vdDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBxdWF0ZXJuaW9uIGZyb20gdGhlIGdpdmVuIGV1bGVyIGFuZ2xlIHgsIHksIHouXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3h9IEFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQgWCBheGlzIGluIGRlZ3JlZXMuXG4gKiBAcGFyYW0ge3l9IEFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQgWSBheGlzIGluIGRlZ3JlZXMuXG4gKiBAcGFyYW0ge3p9IEFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQgWiBheGlzIGluIGRlZ3JlZXMuXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUV1bGVyKG91dCwgeCwgeSwgeikge1xuICB2YXIgaGFsZlRvUmFkID0gMC41ICogTWF0aC5QSSAvIDE4MC4wO1xuICB4ICo9IGhhbGZUb1JhZDtcbiAgeSAqPSBoYWxmVG9SYWQ7XG4gIHogKj0gaGFsZlRvUmFkO1xuICB2YXIgc3ggPSBNYXRoLnNpbih4KTtcbiAgdmFyIGN4ID0gTWF0aC5jb3MoeCk7XG4gIHZhciBzeSA9IE1hdGguc2luKHkpO1xuICB2YXIgY3kgPSBNYXRoLmNvcyh5KTtcbiAgdmFyIHN6ID0gTWF0aC5zaW4oeik7XG4gIHZhciBjeiA9IE1hdGguY29zKHopO1xuICBvdXRbMF0gPSBzeCAqIGN5ICogY3ogLSBjeCAqIHN5ICogc3o7XG4gIG91dFsxXSA9IGN4ICogc3kgKiBjeiArIHN4ICogY3kgKiBzejtcbiAgb3V0WzJdID0gY3ggKiBjeSAqIHN6IC0gc3ggKiBzeSAqIGN6O1xuICBvdXRbM10gPSBjeCAqIGN5ICogY3ogKyBzeCAqIHN5ICogc3o7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBxdWF0ZW5pb25cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJxdWF0KFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiKVwiO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdGVybmlvbiB0byBjbG9uZVxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgY2xvbmUgPSB2ZWM0LmNsb25lO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGZyb21WYWx1ZXMgPSB2ZWM0LmZyb21WYWx1ZXM7XG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBxdWF0IHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBzb3VyY2UgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBjb3B5ID0gdmVjNC5jb3B5O1xuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBxdWF0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNldCA9IHZlYzQuc2V0O1xuLyoqXG4gKiBBZGRzIHR3byBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgYWRkID0gdmVjNC5hZGQ7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcbiAqIFNjYWxlcyBhIHF1YXQgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNjYWxlID0gdmVjNC5zY2FsZTtcbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZG90ID0gdmVjNC5kb3Q7XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcXVhdCdzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGxlcnAgPSB2ZWM0LmxlcnA7XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcbiAqL1xuXG5leHBvcnQgdmFyIGxlbmd0aCA9IHZlYzQubGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3F1YXJlZExlbmd0aCA9IHZlYzQuc3F1YXJlZExlbmd0aDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0LnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcbiAqIE5vcm1hbGl6ZSBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXRlcm5pb24gdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG5vcm1hbGl6ZSA9IHZlYzQubm9ybWFsaXplO1xuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBxdWF0ZXJuaW9ucyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgVGhlIGZpcnN0IHF1YXRlcm5pb24uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiBUaGUgc2Vjb25kIHF1YXRlcm5pb24uXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgdmFyIGV4YWN0RXF1YWxzID0gdmVjNC5leGFjdEVxdWFscztcbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcXVhdGVybmlvbnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCB2YXIgZXF1YWxzID0gdmVjNC5lcXVhbHM7XG4vKipcbiAqIFNldHMgYSBxdWF0ZXJuaW9uIHRvIHJlcHJlc2VudCB0aGUgc2hvcnRlc3Qgcm90YXRpb24gZnJvbSBvbmVcbiAqIHZlY3RvciB0byBhbm90aGVyLlxuICpcbiAqIEJvdGggdmVjdG9ycyBhcmUgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aC5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb24uXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgaW5pdGlhbCB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgdmFyIHJvdGF0aW9uVG8gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0bXB2ZWMzID0gdmVjMy5jcmVhdGUoKTtcbiAgdmFyIHhVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygxLCAwLCAwKTtcbiAgdmFyIHlVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygwLCAxLCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgZG90ID0gdmVjMy5kb3QoYSwgYik7XG5cbiAgICBpZiAoZG90IDwgLTAuOTk5OTk5KSB7XG4gICAgICB2ZWMzLmNyb3NzKHRtcHZlYzMsIHhVbml0VmVjMywgYSk7XG4gICAgICBpZiAodmVjMy5sZW4odG1wdmVjMykgPCAwLjAwMDAwMSkgdmVjMy5jcm9zcyh0bXB2ZWMzLCB5VW5pdFZlYzMsIGEpO1xuICAgICAgdmVjMy5ub3JtYWxpemUodG1wdmVjMywgdG1wdmVjMyk7XG4gICAgICBzZXRBeGlzQW5nbGUob3V0LCB0bXB2ZWMzLCBNYXRoLlBJKTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfSBlbHNlIGlmIChkb3QgPiAwLjk5OTk5OSkge1xuICAgICAgb3V0WzBdID0gMDtcbiAgICAgIG91dFsxXSA9IDA7XG4gICAgICBvdXRbMl0gPSAwO1xuICAgICAgb3V0WzNdID0gMTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZlYzMuY3Jvc3ModG1wdmVjMywgYSwgYik7XG4gICAgICBvdXRbMF0gPSB0bXB2ZWMzWzBdO1xuICAgICAgb3V0WzFdID0gdG1wdmVjM1sxXTtcbiAgICAgIG91dFsyXSA9IHRtcHZlYzNbMl07XG4gICAgICBvdXRbM10gPSAxICsgZG90O1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZShvdXQsIG91dCk7XG4gICAgfVxuICB9O1xufSgpO1xuLyoqXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGMgdGhlIHRoaXJkIG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCB2YXIgc3FsZXJwID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGVtcDEgPSBjcmVhdGUoKTtcbiAgdmFyIHRlbXAyID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gICAgc2xlcnAodGVtcDEsIGEsIGQsIHQpO1xuICAgIHNsZXJwKHRlbXAyLCBiLCBjLCB0KTtcbiAgICBzbGVycChvdXQsIHRlbXAxLCB0ZW1wMiwgMiAqIHQgKiAoMSAtIHQpKTtcbiAgICByZXR1cm4gb3V0O1xuICB9O1xufSgpO1xuLyoqXG4gKiBTZXRzIHRoZSBzcGVjaWZpZWQgcXVhdGVybmlvbiB3aXRoIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlblxuICogYXhlcy4gRWFjaCBheGlzIGlzIGEgdmVjMyBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgdW5pdCBsZW5ndGggYW5kXG4gKiBwZXJwZW5kaWN1bGFyIHRvIGFsbCBvdGhlciBzcGVjaWZpZWQgYXhlcy5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdmlldyAgdGhlIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIHZpZXdpbmcgZGlyZWN0aW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gcmlnaHQgdGhlIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGxvY2FsIFwicmlnaHRcIiBkaXJlY3Rpb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB1cCAgICB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJ1cFwiIGRpcmVjdGlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCB2YXIgc2V0QXhlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG1hdHIgPSBtYXQzLmNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKG91dCwgdmlldywgcmlnaHQsIHVwKSB7XG4gICAgbWF0clswXSA9IHJpZ2h0WzBdO1xuICAgIG1hdHJbM10gPSByaWdodFsxXTtcbiAgICBtYXRyWzZdID0gcmlnaHRbMl07XG4gICAgbWF0clsxXSA9IHVwWzBdO1xuICAgIG1hdHJbNF0gPSB1cFsxXTtcbiAgICBtYXRyWzddID0gdXBbMl07XG4gICAgbWF0clsyXSA9IC12aWV3WzBdO1xuICAgIG1hdHJbNV0gPSAtdmlld1sxXTtcbiAgICBtYXRyWzhdID0gLXZpZXdbMl07XG4gICAgcmV0dXJuIG5vcm1hbGl6ZShvdXQsIGZyb21NYXQzKG91dCwgbWF0cikpO1xuICB9O1xufSgpOyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuaW1wb3J0ICogYXMgcXVhdCBmcm9tIFwiLi9xdWF0LmpzXCI7XG5pbXBvcnQgKiBhcyBtYXQ0IGZyb20gXCIuL21hdDQuanNcIjtcbi8qKlxuICogRHVhbCBRdWF0ZXJuaW9uPGJyPlxuICogRm9ybWF0OiBbcmVhbCwgZHVhbF08YnI+XG4gKiBRdWF0ZXJuaW9uIGZvcm1hdDogWFlaVzxicj5cbiAqIE1ha2Ugc3VyZSB0byBoYXZlIG5vcm1hbGl6ZWQgZHVhbCBxdWF0ZXJuaW9ucywgb3RoZXJ3aXNlIHRoZSBmdW5jdGlvbnMgbWF5IG5vdCB3b3JrIGFzIGludGVuZGVkLjxicj5cbiAqIEBtb2R1bGUgcXVhdDJcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgZHVhbCBxdWF0XG4gKlxuICogQHJldHVybnMge3F1YXQyfSBhIG5ldyBkdWFsIHF1YXRlcm5pb24gW3JlYWwgLT4gcm90YXRpb24sIGR1YWwgLT4gdHJhbnNsYXRpb25dXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIGRxID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOCk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgZHFbMF0gPSAwO1xuICAgIGRxWzFdID0gMDtcbiAgICBkcVsyXSA9IDA7XG4gICAgZHFbNF0gPSAwO1xuICAgIGRxWzVdID0gMDtcbiAgICBkcVs2XSA9IDA7XG4gICAgZHFbN10gPSAwO1xuICB9XG5cbiAgZHFbM10gPSAxO1xuICByZXR1cm4gZHE7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcXVhdCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHF1YXRlcm5pb25cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgZHVhbCBxdWF0ZXJuaW9uIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG5ldyBkdWFsIHF1YXRlcm5pb25cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBkcSA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDgpO1xuICBkcVswXSA9IGFbMF07XG4gIGRxWzFdID0gYVsxXTtcbiAgZHFbMl0gPSBhWzJdO1xuICBkcVszXSA9IGFbM107XG4gIGRxWzRdID0gYVs0XTtcbiAgZHFbNV0gPSBhWzVdO1xuICBkcVs2XSA9IGFbNl07XG4gIGRxWzddID0gYVs3XTtcbiAgcmV0dXJuIGRxO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGR1YWwgcXVhdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geDEgWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHoxIFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdzEgVyBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MiBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkyIFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gejIgWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3MiBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3F1YXQyfSBuZXcgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4MSwgeTEsIHoxLCB3MSwgeDIsIHkyLCB6MiwgdzIpIHtcbiAgdmFyIGRxID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOCk7XG4gIGRxWzBdID0geDE7XG4gIGRxWzFdID0geTE7XG4gIGRxWzJdID0gejE7XG4gIGRxWzNdID0gdzE7XG4gIGRxWzRdID0geDI7XG4gIGRxWzVdID0geTI7XG4gIGRxWzZdID0gejI7XG4gIGRxWzddID0gdzI7XG4gIHJldHVybiBkcTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkdWFsIHF1YXQgZnJvbSB0aGUgZ2l2ZW4gdmFsdWVzIChxdWF0IGFuZCB0cmFuc2xhdGlvbilcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geDEgWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHoxIFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdzEgVyBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MiBYIGNvbXBvbmVudCAodHJhbnNsYXRpb24pXG4gKiBAcGFyYW0ge051bWJlcn0geTIgWSBjb21wb25lbnQgKHRyYW5zbGF0aW9uKVxuICogQHBhcmFtIHtOdW1iZXJ9IHoyIFogY29tcG9uZW50ICh0cmFuc2xhdGlvbilcbiAqIEByZXR1cm5zIHtxdWF0Mn0gbmV3IGR1YWwgcXVhdGVybmlvblxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uVmFsdWVzKHgxLCB5MSwgejEsIHcxLCB4MiwgeTIsIHoyKSB7XG4gIHZhciBkcSA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDgpO1xuICBkcVswXSA9IHgxO1xuICBkcVsxXSA9IHkxO1xuICBkcVsyXSA9IHoxO1xuICBkcVszXSA9IHcxO1xuICB2YXIgYXggPSB4MiAqIDAuNSxcbiAgICAgIGF5ID0geTIgKiAwLjUsXG4gICAgICBheiA9IHoyICogMC41O1xuICBkcVs0XSA9IGF4ICogdzEgKyBheSAqIHoxIC0gYXogKiB5MTtcbiAgZHFbNV0gPSBheSAqIHcxICsgYXogKiB4MSAtIGF4ICogejE7XG4gIGRxWzZdID0gYXogKiB3MSArIGF4ICogeTEgLSBheSAqIHgxO1xuICBkcVs3XSA9IC1heCAqIHgxIC0gYXkgKiB5MSAtIGF6ICogejE7XG4gIHJldHVybiBkcTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIGR1YWwgcXVhdCBmcm9tIGEgcXVhdGVybmlvbiBhbmQgYSB0cmFuc2xhdGlvblxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBhIG5vcm1hbGl6ZWQgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHQgdHJhbmxhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHtxdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBxLCB0KSB7XG4gIHZhciBheCA9IHRbMF0gKiAwLjUsXG4gICAgICBheSA9IHRbMV0gKiAwLjUsXG4gICAgICBheiA9IHRbMl0gKiAwLjUsXG4gICAgICBieCA9IHFbMF0sXG4gICAgICBieSA9IHFbMV0sXG4gICAgICBieiA9IHFbMl0sXG4gICAgICBidyA9IHFbM107XG4gIG91dFswXSA9IGJ4O1xuICBvdXRbMV0gPSBieTtcbiAgb3V0WzJdID0gYno7XG4gIG91dFszXSA9IGJ3O1xuICBvdXRbNF0gPSBheCAqIGJ3ICsgYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFs1XSA9IGF5ICogYncgKyBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzZdID0gYXogKiBidyArIGF4ICogYnkgLSBheSAqIGJ4O1xuICBvdXRbN10gPSAtYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgZHVhbCBxdWF0IGZyb20gYSB0cmFuc2xhdGlvblxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdCB0cmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHtxdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVRyYW5zbGF0aW9uKG91dCwgdCkge1xuICBvdXRbMF0gPSAwO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAxO1xuICBvdXRbNF0gPSB0WzBdICogMC41O1xuICBvdXRbNV0gPSB0WzFdICogMC41O1xuICBvdXRbNl0gPSB0WzJdICogMC41O1xuICBvdXRbN10gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgZHVhbCBxdWF0IGZyb20gYSBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIHRoZSBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7cXVhdDJ9IGR1YWwgcXVhdGVybmlvbiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHEpIHtcbiAgb3V0WzBdID0gcVswXTtcbiAgb3V0WzFdID0gcVsxXTtcbiAgb3V0WzJdID0gcVsyXTtcbiAgb3V0WzNdID0gcVszXTtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkdWFsIHF1YXQgZnJvbSBhIG1hdHJpeCAoNHg0KVxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7cXVhdDJ9IGR1YWwgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQ0KG91dCwgYSkge1xuICAvL1RPRE8gT3B0aW1pemUgdGhpc1xuICB2YXIgb3V0ZXIgPSBxdWF0LmNyZWF0ZSgpO1xuICBtYXQ0LmdldFJvdGF0aW9uKG91dGVyLCBhKTtcbiAgdmFyIHQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgbWF0NC5nZXRUcmFuc2xhdGlvbih0LCBhKTtcbiAgZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBvdXRlciwgdCk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBkdWFsIHF1YXQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBzb3VyY2UgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCBhIGR1YWwgcXVhdCB0byB0aGUgaWRlbnRpdHkgZHVhbCBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDA7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIGR1YWwgcXVhdCB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHgxIFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geTEgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MSBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcxIFcgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geDIgWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MiBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHoyIFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdzIgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeDEsIHkxLCB6MSwgdzEsIHgyLCB5MiwgejIsIHcyKSB7XG4gIG91dFswXSA9IHgxO1xuICBvdXRbMV0gPSB5MTtcbiAgb3V0WzJdID0gejE7XG4gIG91dFszXSA9IHcxO1xuICBvdXRbNF0gPSB4MjtcbiAgb3V0WzVdID0geTI7XG4gIG91dFs2XSA9IHoyO1xuICBvdXRbN10gPSB3MjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2V0cyB0aGUgcmVhbCBwYXJ0IG9mIGEgZHVhbCBxdWF0XG4gKiBAcGFyYW0gIHtxdWF0fSBvdXQgcmVhbCBwYXJ0XG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXQyfSBhIER1YWwgUXVhdGVybmlvblxuICogQHJldHVybiB7cXVhdH0gcmVhbCBwYXJ0XG4gKi9cblxuZXhwb3J0IHZhciBnZXRSZWFsID0gcXVhdC5jb3B5O1xuLyoqXG4gKiBHZXRzIHRoZSBkdWFsIHBhcnQgb2YgYSBkdWFsIHF1YXRcbiAqIEBwYXJhbSAge3F1YXR9IG91dCBkdWFsIHBhcnRcbiAqIEBwYXJhbSAge1JlYWRvbmx5UXVhdDJ9IGEgRHVhbCBRdWF0ZXJuaW9uXG4gKiBAcmV0dXJuIHtxdWF0fSBkdWFsIHBhcnRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHVhbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVs0XTtcbiAgb3V0WzFdID0gYVs1XTtcbiAgb3V0WzJdID0gYVs2XTtcbiAgb3V0WzNdID0gYVs3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IHRoZSByZWFsIGNvbXBvbmVudCBvZiBhIGR1YWwgcXVhdCB0byB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIHJlYWwgcGFydFxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc2V0UmVhbCA9IHF1YXQuY29weTtcbi8qKlxuICogU2V0IHRoZSBkdWFsIGNvbXBvbmVudCBvZiBhIGR1YWwgcXVhdCB0byB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIGR1YWwgcGFydFxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXREdWFsKG91dCwgcSkge1xuICBvdXRbNF0gPSBxWzBdO1xuICBvdXRbNV0gPSBxWzFdO1xuICBvdXRbNl0gPSBxWzJdO1xuICBvdXRbN10gPSBxWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZXRzIHRoZSB0cmFuc2xhdGlvbiBvZiBhIG5vcm1hbGl6ZWQgZHVhbCBxdWF0XG4gKiBAcGFyYW0gIHt2ZWMzfSBvdXQgdHJhbnNsYXRpb25cbiAqIEBwYXJhbSAge1JlYWRvbmx5UXVhdDJ9IGEgRHVhbCBRdWF0ZXJuaW9uIHRvIGJlIGRlY29tcG9zZWRcbiAqIEByZXR1cm4ge3ZlYzN9IHRyYW5zbGF0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uKG91dCwgYSkge1xuICB2YXIgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddLFxuICAgICAgYnggPSAtYVswXSxcbiAgICAgIGJ5ID0gLWFbMV0sXG4gICAgICBieiA9IC1hWzJdLFxuICAgICAgYncgPSBhWzNdO1xuICBvdXRbMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyO1xuICBvdXRbMV0gPSAoYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieikgKiAyO1xuICBvdXRbMl0gPSAoYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCkgKiAyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2xhdGVzIGEgZHVhbCBxdWF0IGJ5IHRoZSBnaXZlbiB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgYXgxID0gYVswXSxcbiAgICAgIGF5MSA9IGFbMV0sXG4gICAgICBhejEgPSBhWzJdLFxuICAgICAgYXcxID0gYVszXSxcbiAgICAgIGJ4MSA9IHZbMF0gKiAwLjUsXG4gICAgICBieTEgPSB2WzFdICogMC41LFxuICAgICAgYnoxID0gdlsyXSAqIDAuNSxcbiAgICAgIGF4MiA9IGFbNF0sXG4gICAgICBheTIgPSBhWzVdLFxuICAgICAgYXoyID0gYVs2XSxcbiAgICAgIGF3MiA9IGFbN107XG4gIG91dFswXSA9IGF4MTtcbiAgb3V0WzFdID0gYXkxO1xuICBvdXRbMl0gPSBhejE7XG4gIG91dFszXSA9IGF3MTtcbiAgb3V0WzRdID0gYXcxICogYngxICsgYXkxICogYnoxIC0gYXoxICogYnkxICsgYXgyO1xuICBvdXRbNV0gPSBhdzEgKiBieTEgKyBhejEgKiBieDEgLSBheDEgKiBiejEgKyBheTI7XG4gIG91dFs2XSA9IGF3MSAqIGJ6MSArIGF4MSAqIGJ5MSAtIGF5MSAqIGJ4MSArIGF6MjtcbiAgb3V0WzddID0gLWF4MSAqIGJ4MSAtIGF5MSAqIGJ5MSAtIGF6MSAqIGJ6MSArIGF3MjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBhcm91bmQgdGhlIFggYXhpc1xuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGhvdyBmYXIgc2hvdWxkIHRoZSByb3RhdGlvbiBiZVxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWChvdXQsIGEsIHJhZCkge1xuICB2YXIgYnggPSAtYVswXSxcbiAgICAgIGJ5ID0gLWFbMV0sXG4gICAgICBieiA9IC1hWzJdLFxuICAgICAgYncgPSBhWzNdLFxuICAgICAgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddLFxuICAgICAgYXgxID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSxcbiAgICAgIGF5MSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnosXG4gICAgICBhejEgPSBheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4LFxuICAgICAgYXcxID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcXVhdC5yb3RhdGVYKG91dCwgYSwgcmFkKTtcbiAgYnggPSBvdXRbMF07XG4gIGJ5ID0gb3V0WzFdO1xuICBieiA9IG91dFsyXTtcbiAgYncgPSBvdXRbM107XG4gIG91dFs0XSA9IGF4MSAqIGJ3ICsgYXcxICogYnggKyBheTEgKiBieiAtIGF6MSAqIGJ5O1xuICBvdXRbNV0gPSBheTEgKiBidyArIGF3MSAqIGJ5ICsgYXoxICogYnggLSBheDEgKiBiejtcbiAgb3V0WzZdID0gYXoxICogYncgKyBhdzEgKiBieiArIGF4MSAqIGJ5IC0gYXkxICogYng7XG4gIG91dFs3XSA9IGF3MSAqIGJ3IC0gYXgxICogYnggLSBheTEgKiBieSAtIGF6MSAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGFyb3VuZCB0aGUgWSBheGlzXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgaG93IGZhciBzaG91bGQgdGhlIHJvdGF0aW9uIGJlXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgcmFkKSB7XG4gIHZhciBieCA9IC1hWzBdLFxuICAgICAgYnkgPSAtYVsxXSxcbiAgICAgIGJ6ID0gLWFbMl0sXG4gICAgICBidyA9IGFbM10sXG4gICAgICBheCA9IGFbNF0sXG4gICAgICBheSA9IGFbNV0sXG4gICAgICBheiA9IGFbNl0sXG4gICAgICBhdyA9IGFbN10sXG4gICAgICBheDEgPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5LFxuICAgICAgYXkxID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieixcbiAgICAgIGF6MSA9IGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngsXG4gICAgICBhdzEgPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICBxdWF0LnJvdGF0ZVkob3V0LCBhLCByYWQpO1xuICBieCA9IG91dFswXTtcbiAgYnkgPSBvdXRbMV07XG4gIGJ6ID0gb3V0WzJdO1xuICBidyA9IG91dFszXTtcbiAgb3V0WzRdID0gYXgxICogYncgKyBhdzEgKiBieCArIGF5MSAqIGJ6IC0gYXoxICogYnk7XG4gIG91dFs1XSA9IGF5MSAqIGJ3ICsgYXcxICogYnkgKyBhejEgKiBieCAtIGF4MSAqIGJ6O1xuICBvdXRbNl0gPSBhejEgKiBidyArIGF3MSAqIGJ6ICsgYXgxICogYnkgLSBheTEgKiBieDtcbiAgb3V0WzddID0gYXcxICogYncgLSBheDEgKiBieCAtIGF5MSAqIGJ5IC0gYXoxICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBkdWFsIHF1YXQgYXJvdW5kIHRoZSBaIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBob3cgZmFyIHNob3VsZCB0aGUgcm90YXRpb24gYmVcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCByYWQpIHtcbiAgdmFyIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXSxcbiAgICAgIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XSxcbiAgICAgIGF4MSA9IGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnksXG4gICAgICBheTEgPSBheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6LFxuICAgICAgYXoxID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCxcbiAgICAgIGF3MSA9IGF3ICogYncgLSBheCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHF1YXQucm90YXRlWihvdXQsIGEsIHJhZCk7XG4gIGJ4ID0gb3V0WzBdO1xuICBieSA9IG91dFsxXTtcbiAgYnogPSBvdXRbMl07XG4gIGJ3ID0gb3V0WzNdO1xuICBvdXRbNF0gPSBheDEgKiBidyArIGF3MSAqIGJ4ICsgYXkxICogYnogLSBhejEgKiBieTtcbiAgb3V0WzVdID0gYXkxICogYncgKyBhdzEgKiBieSArIGF6MSAqIGJ4IC0gYXgxICogYno7XG4gIG91dFs2XSA9IGF6MSAqIGJ3ICsgYXcxICogYnogKyBheDEgKiBieSAtIGF5MSAqIGJ4O1xuICBvdXRbN10gPSBhdzEgKiBidyAtIGF4MSAqIGJ4IC0gYXkxICogYnkgLSBhejEgKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBieSBhIGdpdmVuIHF1YXRlcm5pb24gKGEgKiBxKVxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHJvdGF0ZSBieVxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlQnlRdWF0QXBwZW5kKG91dCwgYSwgcSkge1xuICB2YXIgcXggPSBxWzBdLFxuICAgICAgcXkgPSBxWzFdLFxuICAgICAgcXogPSBxWzJdLFxuICAgICAgcXcgPSBxWzNdLFxuICAgICAgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYXcgPSBhWzNdO1xuICBvdXRbMF0gPSBheCAqIHF3ICsgYXcgKiBxeCArIGF5ICogcXogLSBheiAqIHF5O1xuICBvdXRbMV0gPSBheSAqIHF3ICsgYXcgKiBxeSArIGF6ICogcXggLSBheCAqIHF6O1xuICBvdXRbMl0gPSBheiAqIHF3ICsgYXcgKiBxeiArIGF4ICogcXkgLSBheSAqIHF4O1xuICBvdXRbM10gPSBhdyAqIHF3IC0gYXggKiBxeCAtIGF5ICogcXkgLSBheiAqIHF6O1xuICBheCA9IGFbNF07XG4gIGF5ID0gYVs1XTtcbiAgYXogPSBhWzZdO1xuICBhdyA9IGFbN107XG4gIG91dFs0XSA9IGF4ICogcXcgKyBhdyAqIHF4ICsgYXkgKiBxeiAtIGF6ICogcXk7XG4gIG91dFs1XSA9IGF5ICogcXcgKyBhdyAqIHF5ICsgYXogKiBxeCAtIGF4ICogcXo7XG4gIG91dFs2XSA9IGF6ICogcXcgKyBhdyAqIHF6ICsgYXggKiBxeSAtIGF5ICogcXg7XG4gIG91dFs3XSA9IGF3ICogcXcgLSBheCAqIHF4IC0gYXkgKiBxeSAtIGF6ICogcXo7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBkdWFsIHF1YXQgYnkgYSBnaXZlbiBxdWF0ZXJuaW9uIChxICogYSlcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIHF1YXRlcm5pb24gdG8gcm90YXRlIGJ5XG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byByb3RhdGVcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZUJ5UXVhdFByZXBlbmQob3V0LCBxLCBhKSB7XG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM10sXG4gICAgICBieCA9IGFbMF0sXG4gICAgICBieSA9IGFbMV0sXG4gICAgICBieiA9IGFbMl0sXG4gICAgICBidyA9IGFbM107XG4gIG91dFswXSA9IHF4ICogYncgKyBxdyAqIGJ4ICsgcXkgKiBieiAtIHF6ICogYnk7XG4gIG91dFsxXSA9IHF5ICogYncgKyBxdyAqIGJ5ICsgcXogKiBieCAtIHF4ICogYno7XG4gIG91dFsyXSA9IHF6ICogYncgKyBxdyAqIGJ6ICsgcXggKiBieSAtIHF5ICogYng7XG4gIG91dFszXSA9IHF3ICogYncgLSBxeCAqIGJ4IC0gcXkgKiBieSAtIHF6ICogYno7XG4gIGJ4ID0gYVs0XTtcbiAgYnkgPSBhWzVdO1xuICBieiA9IGFbNl07XG4gIGJ3ID0gYVs3XTtcbiAgb3V0WzRdID0gcXggKiBidyArIHF3ICogYnggKyBxeSAqIGJ6IC0gcXogKiBieTtcbiAgb3V0WzVdID0gcXkgKiBidyArIHF3ICogYnkgKyBxeiAqIGJ4IC0gcXggKiBiejtcbiAgb3V0WzZdID0gcXogKiBidyArIHF3ICogYnogKyBxeCAqIGJ5IC0gcXkgKiBieDtcbiAgb3V0WzddID0gcXcgKiBidyAtIHF4ICogYnggLSBxeSAqIGJ5IC0gcXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBhcm91bmQgYSBnaXZlbiBheGlzLiBEb2VzIHRoZSBub3JtYWxpc2F0aW9uIGF1dG9tYXRpY2FsbHlcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGF4aXMgdGhlIGF4aXMgdG8gcm90YXRlIGFyb3VuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBob3cgZmFyIHRoZSByb3RhdGlvbiBzaG91bGQgYmVcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZUFyb3VuZEF4aXMob3V0LCBhLCBheGlzLCByYWQpIHtcbiAgLy9TcGVjaWFsIGNhc2UgZm9yIHJhZCA9IDBcbiAgaWYgKE1hdGguYWJzKHJhZCkgPCBnbE1hdHJpeC5FUFNJTE9OKSB7XG4gICAgcmV0dXJuIGNvcHkob3V0LCBhKTtcbiAgfVxuXG4gIHZhciBheGlzTGVuZ3RoID0gTWF0aC5oeXBvdChheGlzWzBdLCBheGlzWzFdLCBheGlzWzJdKTtcbiAgcmFkID0gcmFkICogMC41O1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBieCA9IHMgKiBheGlzWzBdIC8gYXhpc0xlbmd0aDtcbiAgdmFyIGJ5ID0gcyAqIGF4aXNbMV0gLyBheGlzTGVuZ3RoO1xuICB2YXIgYnogPSBzICogYXhpc1syXSAvIGF4aXNMZW5ndGg7XG4gIHZhciBidyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBheDEgPSBhWzBdLFxuICAgICAgYXkxID0gYVsxXSxcbiAgICAgIGF6MSA9IGFbMl0sXG4gICAgICBhdzEgPSBhWzNdO1xuICBvdXRbMF0gPSBheDEgKiBidyArIGF3MSAqIGJ4ICsgYXkxICogYnogLSBhejEgKiBieTtcbiAgb3V0WzFdID0gYXkxICogYncgKyBhdzEgKiBieSArIGF6MSAqIGJ4IC0gYXgxICogYno7XG4gIG91dFsyXSA9IGF6MSAqIGJ3ICsgYXcxICogYnogKyBheDEgKiBieSAtIGF5MSAqIGJ4O1xuICBvdXRbM10gPSBhdzEgKiBidyAtIGF4MSAqIGJ4IC0gYXkxICogYnkgLSBhejEgKiBiejtcbiAgdmFyIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XTtcbiAgb3V0WzRdID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzVdID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzZdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgb3V0WzddID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gZHVhbCBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gZHVhbCBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBheDAgPSBhWzBdLFxuICAgICAgYXkwID0gYVsxXSxcbiAgICAgIGF6MCA9IGFbMl0sXG4gICAgICBhdzAgPSBhWzNdLFxuICAgICAgYngxID0gYls0XSxcbiAgICAgIGJ5MSA9IGJbNV0sXG4gICAgICBiejEgPSBiWzZdLFxuICAgICAgYncxID0gYls3XSxcbiAgICAgIGF4MSA9IGFbNF0sXG4gICAgICBheTEgPSBhWzVdLFxuICAgICAgYXoxID0gYVs2XSxcbiAgICAgIGF3MSA9IGFbN10sXG4gICAgICBieDAgPSBiWzBdLFxuICAgICAgYnkwID0gYlsxXSxcbiAgICAgIGJ6MCA9IGJbMl0sXG4gICAgICBidzAgPSBiWzNdO1xuICBvdXRbMF0gPSBheDAgKiBidzAgKyBhdzAgKiBieDAgKyBheTAgKiBiejAgLSBhejAgKiBieTA7XG4gIG91dFsxXSA9IGF5MCAqIGJ3MCArIGF3MCAqIGJ5MCArIGF6MCAqIGJ4MCAtIGF4MCAqIGJ6MDtcbiAgb3V0WzJdID0gYXowICogYncwICsgYXcwICogYnowICsgYXgwICogYnkwIC0gYXkwICogYngwO1xuICBvdXRbM10gPSBhdzAgKiBidzAgLSBheDAgKiBieDAgLSBheTAgKiBieTAgLSBhejAgKiBiejA7XG4gIG91dFs0XSA9IGF4MCAqIGJ3MSArIGF3MCAqIGJ4MSArIGF5MCAqIGJ6MSAtIGF6MCAqIGJ5MSArIGF4MSAqIGJ3MCArIGF3MSAqIGJ4MCArIGF5MSAqIGJ6MCAtIGF6MSAqIGJ5MDtcbiAgb3V0WzVdID0gYXkwICogYncxICsgYXcwICogYnkxICsgYXowICogYngxIC0gYXgwICogYnoxICsgYXkxICogYncwICsgYXcxICogYnkwICsgYXoxICogYngwIC0gYXgxICogYnowO1xuICBvdXRbNl0gPSBhejAgKiBidzEgKyBhdzAgKiBiejEgKyBheDAgKiBieTEgLSBheTAgKiBieDEgKyBhejEgKiBidzAgKyBhdzEgKiBiejAgKyBheDEgKiBieTAgLSBheTEgKiBieDA7XG4gIG91dFs3XSA9IGF3MCAqIGJ3MSAtIGF4MCAqIGJ4MSAtIGF5MCAqIGJ5MSAtIGF6MCAqIGJ6MSArIGF3MSAqIGJ3MCAtIGF4MSAqIGJ4MCAtIGF5MSAqIGJ5MCAtIGF6MSAqIGJ6MDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Mi5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcbiAqIFNjYWxlcyBhIGR1YWwgcXVhdCBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0IHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIGR1YWwgcXVhdCBieVxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgb3V0WzZdID0gYVs2XSAqIGI7XG4gIG91dFs3XSA9IGFbN10gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gZHVhbCBxdWF0J3MgKFRoZSBkb3QgcHJvZHVjdCBvZiB0aGUgcmVhbCBwYXJ0cylcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZG90ID0gcXVhdC5kb3Q7XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gZHVhbCBxdWF0cydzXG4gKiBOT1RFOiBUaGUgcmVzdWx0aW5nIGR1YWwgcXVhdGVybmlvbnMgd29uJ3QgYWx3YXlzIGJlIG5vcm1hbGl6ZWQgKFRoZSBlcnJvciBpcyBtb3N0IG5vdGljZWFibGUgd2hlbiB0ID0gMC41KVxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdFxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgbXQgPSAxIC0gdDtcbiAgaWYgKGRvdChhLCBiKSA8IDApIHQgPSAtdDtcbiAgb3V0WzBdID0gYVswXSAqIG10ICsgYlswXSAqIHQ7XG4gIG91dFsxXSA9IGFbMV0gKiBtdCArIGJbMV0gKiB0O1xuICBvdXRbMl0gPSBhWzJdICogbXQgKyBiWzJdICogdDtcbiAgb3V0WzNdID0gYVszXSAqIG10ICsgYlszXSAqIHQ7XG4gIG91dFs0XSA9IGFbNF0gKiBtdCArIGJbNF0gKiB0O1xuICBvdXRbNV0gPSBhWzVdICogbXQgKyBiWzVdICogdDtcbiAgb3V0WzZdID0gYVs2XSAqIG10ICsgYls2XSAqIHQ7XG4gIG91dFs3XSA9IGFbN10gKiBtdCArIGJbN10gKiB0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBpbnZlcnNlIG9mIGEgZHVhbCBxdWF0LiBJZiB0aGV5IGFyZSBub3JtYWxpemVkLCBjb25qdWdhdGUgaXMgY2hlYXBlclxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIGR1YWwgcXVhdCB0byBjYWxjdWxhdGUgaW52ZXJzZSBvZlxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgc3FsZW4gPSBzcXVhcmVkTGVuZ3RoKGEpO1xuICBvdXRbMF0gPSAtYVswXSAvIHNxbGVuO1xuICBvdXRbMV0gPSAtYVsxXSAvIHNxbGVuO1xuICBvdXRbMl0gPSAtYVsyXSAvIHNxbGVuO1xuICBvdXRbM10gPSBhWzNdIC8gc3FsZW47XG4gIG91dFs0XSA9IC1hWzRdIC8gc3FsZW47XG4gIG91dFs1XSA9IC1hWzVdIC8gc3FsZW47XG4gIG91dFs2XSA9IC1hWzZdIC8gc3FsZW47XG4gIG91dFs3XSA9IGFbN10gLyBzcWxlbjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgY29uanVnYXRlIG9mIGEgZHVhbCBxdWF0XG4gKiBJZiB0aGUgZHVhbCBxdWF0ZXJuaW9uIGlzIG5vcm1hbGl6ZWQsIHRoaXMgZnVuY3Rpb24gaXMgZmFzdGVyIHRoYW4gcXVhdDIuaW52ZXJzZSBhbmQgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LlxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBjb25qdWdhdGUgb2ZcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmp1Z2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gLWFbNF07XG4gIG91dFs1XSA9IC1hWzVdO1xuICBvdXRbNl0gPSAtYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgZHVhbCBxdWF0XG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIGR1YWwgcXVhdCB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBsZW5ndGggPSBxdWF0Lmxlbmd0aDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Mi5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSBkdWFsIHF1YXRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgZHVhbCBxdWF0IHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzcXVhcmVkTGVuZ3RoID0gcXVhdC5zcXVhcmVkTGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQyLnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcbiAqIE5vcm1hbGl6ZSBhIGR1YWwgcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIGR1YWwgcXVhdGVybmlvbiB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgbWFnbml0dWRlID0gc3F1YXJlZExlbmd0aChhKTtcblxuICBpZiAobWFnbml0dWRlID4gMCkge1xuICAgIG1hZ25pdHVkZSA9IE1hdGguc3FydChtYWduaXR1ZGUpO1xuICAgIHZhciBhMCA9IGFbMF0gLyBtYWduaXR1ZGU7XG4gICAgdmFyIGExID0gYVsxXSAvIG1hZ25pdHVkZTtcbiAgICB2YXIgYTIgPSBhWzJdIC8gbWFnbml0dWRlO1xuICAgIHZhciBhMyA9IGFbM10gLyBtYWduaXR1ZGU7XG4gICAgdmFyIGIwID0gYVs0XTtcbiAgICB2YXIgYjEgPSBhWzVdO1xuICAgIHZhciBiMiA9IGFbNl07XG4gICAgdmFyIGIzID0gYVs3XTtcbiAgICB2YXIgYV9kb3RfYiA9IGEwICogYjAgKyBhMSAqIGIxICsgYTIgKiBiMiArIGEzICogYjM7XG4gICAgb3V0WzBdID0gYTA7XG4gICAgb3V0WzFdID0gYTE7XG4gICAgb3V0WzJdID0gYTI7XG4gICAgb3V0WzNdID0gYTM7XG4gICAgb3V0WzRdID0gKGIwIC0gYTAgKiBhX2RvdF9iKSAvIG1hZ25pdHVkZTtcbiAgICBvdXRbNV0gPSAoYjEgLSBhMSAqIGFfZG90X2IpIC8gbWFnbml0dWRlO1xuICAgIG91dFs2XSA9IChiMiAtIGEyICogYV9kb3RfYikgLyBtYWduaXR1ZGU7XG4gICAgb3V0WzddID0gKGIzIC0gYTMgKiBhX2RvdF9iKSAvIG1hZ25pdHVkZTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkdWFsIHF1YXRlbmlvblxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBkdWFsIHF1YXRlcm5pb24gdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGR1YWwgcXVhdFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJxdWF0MihcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIiwgXCIgKyBhWzRdICsgXCIsIFwiICsgYVs1XSArIFwiLCBcIiArIGFbNl0gKyBcIiwgXCIgKyBhWzddICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGR1YWwgcXVhdGVybmlvbnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZmlyc3QgZHVhbCBxdWF0ZXJuaW9uLlxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBiIHRoZSBzZWNvbmQgZHVhbCBxdWF0ZXJuaW9uLlxuICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIGR1YWwgcXVhdGVybmlvbnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdICYmIGFbNl0gPT09IGJbNl0gJiYgYVs3XSA9PT0gYls3XTtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZHVhbCBxdWF0ZXJuaW9ucyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBmaXJzdCBkdWFsIHF1YXQuXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGIgdGhlIHNlY29uZCBkdWFsIHF1YXQuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgZHVhbCBxdWF0cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XSxcbiAgICAgIGE2ID0gYVs2XSxcbiAgICAgIGE3ID0gYVs3XTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXSxcbiAgICAgIGI0ID0gYls0XSxcbiAgICAgIGI1ID0gYls1XSxcbiAgICAgIGI2ID0gYls2XSxcbiAgICAgIGI3ID0gYls3XTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSAmJiBNYXRoLmFicyhhNCAtIGI0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiYgTWF0aC5hYnMoYTUgLSBiNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpICYmIE1hdGguYWJzKGE2IC0gYjYpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE2KSwgTWF0aC5hYnMoYjYpKSAmJiBNYXRoLmFicyhhNyAtIGI3KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNyksIE1hdGguYWJzKGI3KSk7XG59IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcbiAqIDIgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbW9kdWxlIHZlYzJcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzJcbiAqXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKHgsIHkpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMiB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSkge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXZpZGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2VpbFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjZWlsKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTWF0aC5mbG9vciB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGZsb29yXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtaW4ob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE1hdGgucm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byByb3VuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2NhbGVzIGEgdmVjMiBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gdmVjMidzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5KTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgIHkgPSBiWzFdIC0gYVsxXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHk7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHkpO1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWRMZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHk7XG59XG4vKipcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBuZWdhdGVcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbmVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5O1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSBhWzBdICogbGVuO1xuICBvdXRbMV0gPSBhWzFdICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzInc1xuICogTm90ZSB0aGF0IHRoZSBjcm9zcyBwcm9kdWN0IG11c3QgYnkgZGVmaW5pdGlvbiBwcm9kdWNlIGEgM0QgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3Mob3V0LCBhLCBiKSB7XG4gIHZhciB6ID0gYVswXSAqIGJbMV0gLSBhWzFdICogYlswXTtcbiAgb3V0WzBdID0gb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdO1xuICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQsIHNjYWxlKSB7XG4gIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuICB2YXIgciA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgb3V0WzBdID0gTWF0aC5jb3MocikgKiBzY2FsZTtcbiAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDIob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5O1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQyZChvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVsyXSAqIHkgKyBtWzRdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0M1xuICogM3JkIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzNdICogeSArIG1bNl07XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs0XSAqIHkgKyBtWzddO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQ0XG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcwJ1xuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bMTJdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVsxM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZSBhIDJEIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgdmVjMiBwb2ludCB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIGIsIHJhZCkge1xuICAvL1RyYW5zbGF0ZSBwb2ludCB0byB0aGUgb3JpZ2luXG4gIHZhciBwMCA9IGFbMF0gLSBiWzBdLFxuICAgICAgcDEgPSBhWzFdIC0gYlsxXSxcbiAgICAgIHNpbkMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgY29zQyA9IE1hdGguY29zKHJhZCk7IC8vcGVyZm9ybSByb3RhdGlvbiBhbmQgdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSBwMCAqIGNvc0MgLSBwMSAqIHNpbkMgKyBiWzBdO1xuICBvdXRbMV0gPSBwMCAqIHNpbkMgKyBwMSAqIGNvc0MgKyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZXQgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIDJEIHZlY3RvcnNcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFuZ2xlKGEsIGIpIHtcbiAgdmFyIHgxID0gYVswXSxcbiAgICAgIHkxID0gYVsxXSxcbiAgICAgIHgyID0gYlswXSxcbiAgICAgIHkyID0gYlsxXSxcbiAgICAgIC8vIG1hZyBpcyB0aGUgcHJvZHVjdCBvZiB0aGUgbWFnbml0dWRlcyBvZiBhIGFuZCBiXG4gIG1hZyA9IE1hdGguc3FydCh4MSAqIHgxICsgeTEgKiB5MSkgKiBNYXRoLnNxcnQoeDIgKiB4MiArIHkyICogeTIpLFxuICAgICAgLy8gbWFnICYmLi4gc2hvcnQgY2lyY3VpdHMgaWYgbWFnID09IDBcbiAgY29zaW5lID0gbWFnICYmICh4MSAqIHgyICsgeTEgKiB5MikgLyBtYWc7IC8vIE1hdGgubWluKE1hdGgubWF4KGNvc2luZSwgLTEpLCAxKSBjbGFtcHMgdGhlIGNvc2luZSBiZXR3ZWVuIC0xIGFuZCAxXG5cbiAgcmV0dXJuIE1hdGguYWNvcyhNYXRoLm1pbihNYXRoLm1heChjb3NpbmUsIC0xKSwgMSkpO1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyIHRvIHplcm9cbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvKG91dCkge1xuICBvdXRbMF0gPSAwLjA7XG4gIG91dFsxXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInZlYzIoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiKVwiO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGV4YWN0bHkgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSk7XG59XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuZGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMycy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMyLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjMnMgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBmb3JFYWNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmVjID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgdmFyIGksIGw7XG5cbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gMjtcbiAgICB9XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsID0gYS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBlYXJjdXQ7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gZWFyY3V0O1xuXG5mdW5jdGlvbiBlYXJjdXQoZGF0YSwgaG9sZUluZGljZXMsIGRpbSkge1xuXG4gICAgZGltID0gZGltIHx8IDI7XG5cbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGgsXG4gICAgICAgIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoLFxuICAgICAgICBvdXRlck5vZGUgPSBsaW5rZWRMaXN0KGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUpLFxuICAgICAgICB0cmlhbmdsZXMgPSBbXTtcblxuICAgIGlmICghb3V0ZXJOb2RlIHx8IG91dGVyTm9kZS5uZXh0ID09PSBvdXRlck5vZGUucHJldikgcmV0dXJuIHRyaWFuZ2xlcztcblxuICAgIHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBpbnZTaXplO1xuXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xuXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcbiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdO1xuICAgICAgICBtaW5ZID0gbWF4WSA9IGRhdGFbMV07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xuICAgICAgICAgICAgeCA9IGRhdGFbaV07XG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgaW52U2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cbiAgICAgICAgaW52U2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgICAgIGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuICAgIH1cblxuICAgIGVhcmN1dExpbmtlZChvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHJldHVybiB0cmlhbmdsZXM7XG59XG5cbi8vIGNyZWF0ZSBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBmcm9tIHBvbHlnb24gcG9pbnRzIGluIHRoZSBzcGVjaWZpZWQgd2luZGluZyBvcmRlclxuZnVuY3Rpb24gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSkge1xuICAgIHZhciBpLCBsYXN0O1xuXG4gICAgaWYgKGNsb2Nrd2lzZSA9PT0gKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSA+IDApKSB7XG4gICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcbiAgICB9XG5cbiAgICBpZiAobGFzdCAmJiBlcXVhbHMobGFzdCwgbGFzdC5uZXh0KSkge1xuICAgICAgICByZW1vdmVOb2RlKGxhc3QpO1xuICAgICAgICBsYXN0ID0gbGFzdC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBsYXN0O1xufVxuXG4vLyBlbGltaW5hdGUgY29saW5lYXIgb3IgZHVwbGljYXRlIHBvaW50c1xuZnVuY3Rpb24gZmlsdGVyUG9pbnRzKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gc3RhcnQ7XG4gICAgaWYgKCFlbmQpIGVuZCA9IHN0YXJ0O1xuXG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgYWdhaW47XG4gICAgZG8ge1xuICAgICAgICBhZ2FpbiA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghcC5zdGVpbmVyICYmIChlcXVhbHMocCwgcC5uZXh0KSB8fCBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICBwID0gZW5kID0gcC5wcmV2O1xuICAgICAgICAgICAgaWYgKHAgPT09IHAubmV4dCkgYnJlYWs7XG4gICAgICAgICAgICBhZ2FpbiA9IHRydWU7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICAgIH1cbiAgICB9IHdoaWxlIChhZ2FpbiB8fCBwICE9PSBlbmQpO1xuXG4gICAgcmV0dXJuIGVuZDtcbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcykge1xuICAgIGlmICghZWFyKSByZXR1cm47XG5cbiAgICAvLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG4gICAgaWYgKCFwYXNzICYmIGludlNpemUpIGluZGV4Q3VydmUoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHZhciBzdG9wID0gZWFyLFxuICAgICAgICBwcmV2LCBuZXh0O1xuXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG4gICAgd2hpbGUgKGVhci5wcmV2ICE9PSBlYXIubmV4dCkge1xuICAgICAgICBwcmV2ID0gZWFyLnByZXY7XG4gICAgICAgIG5leHQgPSBlYXIubmV4dDtcblxuICAgICAgICBpZiAoaW52U2l6ZSA/IGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSkgOiBpc0VhcihlYXIpKSB7XG4gICAgICAgICAgICAvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocHJldi5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGVhci5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKG5leHQuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIHJlbW92ZU5vZGUoZWFyKTtcblxuICAgICAgICAgICAgLy8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGV4IGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuICAgICAgICAgICAgZWFyID0gbmV4dC5uZXh0O1xuICAgICAgICAgICAgc3RvcCA9IG5leHQubmV4dDtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlYXIgPSBuZXh0O1xuXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXG4gICAgICAgIGlmIChlYXIgPT09IHN0b3ApIHtcbiAgICAgICAgICAgIC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMik7XG5cbiAgICAgICAgICAgIC8vIGFzIGEgbGFzdCByZXNvcnQsIHRyeSBzcGxpdHRpbmcgdGhlIHJlbWFpbmluZyBwb2x5Z29uIGludG8gdHdvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDIpIHtcbiAgICAgICAgICAgICAgICBzcGxpdEVhcmN1dChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuZnVuY3Rpb24gaXNFYXIoZWFyKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG90aGVyIHBvaW50cyBpbnNpZGUgdGhlIHBvdGVudGlhbCBlYXJcbiAgICB2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cbiAgICB3aGlsZSAocCAhPT0gZWFyLnByZXYpIHtcbiAgICAgICAgaWYgKHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcbiAgICB2YXIgbWluVFggPSBhLnggPCBiLnggPyAoYS54IDwgYy54ID8gYS54IDogYy54KSA6IChiLnggPCBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtaW5UWSA9IGEueSA8IGIueSA/IChhLnkgPCBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA8IGMueSA/IGIueSA6IGMueSksXG4gICAgICAgIG1heFRYID0gYS54ID4gYi54ID8gKGEueCA+IGMueCA/IGEueCA6IGMueCkgOiAoYi54ID4gYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWF4VFkgPSBhLnkgPiBiLnkgPyAoYS55ID4gYy55ID8gYS55IDogYy55KSA6IChiLnkgPiBjLnkgPyBiLnkgOiBjLnkpO1xuXG4gICAgLy8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDtcbiAgICB2YXIgbWluWiA9IHpPcmRlcihtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUpLFxuICAgICAgICBtYXhaID0gek9yZGVyKG1heFRYLCBtYXhUWSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG5cbiAgICB2YXIgcCA9IGVhci5wcmV2WixcbiAgICAgICAgbiA9IGVhci5uZXh0WjtcblxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIGluIGJvdGggZGlyZWN0aW9uc1xuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aICYmIG4gJiYgbi56IDw9IG1heFopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLnByZXZaO1xuXG4gICAgICAgIGlmIChuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55KSAmJlxuICAgICAgICAgICAgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBuID0gbi5uZXh0WjtcbiAgICB9XG5cbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5wcmV2WjtcbiAgICB9XG5cbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGluY3JlYXNpbmcgei1vcmRlclxuICAgIHdoaWxlIChuICYmIG4ueiA8PSBtYXhaKSB7XG4gICAgICAgIGlmIChuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55KSAmJlxuICAgICAgICAgICAgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBuID0gbi5uZXh0WjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcywgZGltKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBhID0gcC5wcmV2LFxuICAgICAgICAgICAgYiA9IHAubmV4dC5uZXh0O1xuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcblxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYS5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChiLmkgLyBkaW0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwLm5leHQpO1xuXG4gICAgICAgICAgICBwID0gc3RhcnQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGZpbHRlclBvaW50cyhwKTtcbn1cblxuLy8gdHJ5IHNwbGl0dGluZyBwb2x5Z29uIGludG8gdHdvIGFuZCB0cmlhbmd1bGF0ZSB0aGVtIGluZGVwZW5kZW50bHlcbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xuICAgIC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG4gICAgdmFyIGEgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBiID0gYS5uZXh0Lm5leHQ7XG4gICAgICAgIHdoaWxlIChiICE9PSBhLnByZXYpIHtcbiAgICAgICAgICAgIGlmIChhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGxpdCB0aGUgcG9seWdvbiBpbiB0d28gYnkgdGhlIGRpYWdvbmFsXG4gICAgICAgICAgICAgICAgdmFyIGMgPSBzcGxpdFBvbHlnb24oYSwgYik7XG5cbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgY29saW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xuICAgICAgICAgICAgICAgIGEgPSBmaWx0ZXJQb2ludHMoYSwgYS5uZXh0KTtcbiAgICAgICAgICAgICAgICBjID0gZmlsdGVyUG9pbnRzKGMsIGMubmV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBydW4gZWFyY3V0IG9uIGVhY2ggaGFsZlxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiID0gYi5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhLm5leHQ7XG4gICAgfSB3aGlsZSAoYSAhPT0gc3RhcnQpO1xufVxuXG4vLyBsaW5rIGV2ZXJ5IGhvbGUgaW50byB0aGUgb3V0ZXIgbG9vcCwgcHJvZHVjaW5nIGEgc2luZ2xlLXJpbmcgcG9seWdvbiB3aXRob3V0IGhvbGVzXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pIHtcbiAgICB2YXIgcXVldWUgPSBbXSxcbiAgICAgICAgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgbGlzdCA9IGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSk7XG4gICAgICAgIGlmIChsaXN0ID09PSBsaXN0Lm5leHQpIGxpc3Quc3RlaW5lciA9IHRydWU7XG4gICAgICAgIHF1ZXVlLnB1c2goZ2V0TGVmdG1vc3QobGlzdCkpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNvcnQoY29tcGFyZVgpO1xuXG4gICAgLy8gcHJvY2VzcyBob2xlcyBmcm9tIGxlZnQgdG8gcmlnaHRcbiAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZShxdWV1ZVtpXSwgb3V0ZXJOb2RlKTtcbiAgICAgICAgb3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKG91dGVyTm9kZSwgb3V0ZXJOb2RlLm5leHQpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRlck5vZGU7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVYKGEsIGIpIHtcbiAgICByZXR1cm4gYS54IC0gYi54O1xufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGUoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgdmFyIGJyaWRnZSA9IGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSk7XG4gICAgaWYgKCFicmlkZ2UpIHtcbiAgICAgICAgcmV0dXJuIG91dGVyTm9kZTtcbiAgICB9XG5cbiAgICB2YXIgYnJpZGdlUmV2ZXJzZSA9IHNwbGl0UG9seWdvbihicmlkZ2UsIGhvbGUpO1xuXG4gICAgLy8gZmlsdGVyIGNvbGxpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXG4gICAgdmFyIGZpbHRlcmVkQnJpZGdlID0gZmlsdGVyUG9pbnRzKGJyaWRnZSwgYnJpZGdlLm5leHQpO1xuICAgIGZpbHRlclBvaW50cyhicmlkZ2VSZXZlcnNlLCBicmlkZ2VSZXZlcnNlLm5leHQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgaW5wdXQgbm9kZSB3YXMgcmVtb3ZlZCBieSB0aGUgZmlsdGVyaW5nXG4gICAgcmV0dXJuIG91dGVyTm9kZSA9PT0gYnJpZGdlID8gZmlsdGVyZWRCcmlkZ2UgOiBvdXRlck5vZGU7XG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cbmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIHZhciBwID0gb3V0ZXJOb2RlLFxuICAgICAgICBoeCA9IGhvbGUueCxcbiAgICAgICAgaHkgPSBob2xlLnksXG4gICAgICAgIHF4ID0gLUluZmluaXR5LFxuICAgICAgICBtO1xuXG4gICAgLy8gZmluZCBhIHNlZ21lbnQgaW50ZXJzZWN0ZWQgYnkgYSByYXkgZnJvbSB0aGUgaG9sZSdzIGxlZnRtb3N0IHBvaW50IHRvIHRoZSBsZWZ0O1xuICAgIC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcbiAgICBkbyB7XG4gICAgICAgIGlmIChoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkgJiYgcC5uZXh0LnkgIT09IHAueSkge1xuICAgICAgICAgICAgdmFyIHggPSBwLnggKyAoaHkgLSBwLnkpICogKHAubmV4dC54IC0gcC54KSAvIChwLm5leHQueSAtIHAueSk7XG4gICAgICAgICAgICBpZiAoeCA8PSBoeCAmJiB4ID4gcXgpIHtcbiAgICAgICAgICAgICAgICBxeCA9IHg7XG4gICAgICAgICAgICAgICAgaWYgKHggPT09IGh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC55KSByZXR1cm4gcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh5ID09PSBwLm5leHQueSkgcmV0dXJuIHAubmV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IG91dGVyTm9kZSk7XG5cbiAgICBpZiAoIW0pIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGh4ID09PSBxeCkgcmV0dXJuIG07IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxlZnRtb3N0IGVuZHBvaW50XG5cbiAgICAvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247XG4gICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuICAgIHZhciBzdG9wID0gbSxcbiAgICAgICAgbXggPSBtLngsXG4gICAgICAgIG15ID0gbS55LFxuICAgICAgICB0YW5NaW4gPSBJbmZpbml0eSxcbiAgICAgICAgdGFuO1xuXG4gICAgcCA9IG07XG5cbiAgICBkbyB7XG4gICAgICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiZcbiAgICAgICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoaHkgPCBteSA/IGh4IDogcXgsIGh5LCBteCwgbXksIGh5IDwgbXkgPyBxeCA6IGh4LCBoeSwgcC54LCBwLnkpKSB7XG5cbiAgICAgICAgICAgIHRhbiA9IE1hdGguYWJzKGh5IC0gcC55KSAvIChoeCAtIHAueCk7IC8vIHRhbmdlbnRpYWxcblxuICAgICAgICAgICAgaWYgKGxvY2FsbHlJbnNpZGUocCwgaG9sZSkgJiZcbiAgICAgICAgICAgICAgICAodGFuIDwgdGFuTWluIHx8ICh0YW4gPT09IHRhbk1pbiAmJiAocC54ID4gbS54IHx8IChwLnggPT09IG0ueCAmJiBzZWN0b3JDb250YWluc1NlY3RvcihtLCBwKSkpKSkpIHtcbiAgICAgICAgICAgICAgICBtID0gcDtcbiAgICAgICAgICAgICAgICB0YW5NaW4gPSB0YW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0b3ApO1xuXG4gICAgcmV0dXJuIG07XG59XG5cbi8vIHdoZXRoZXIgc2VjdG9yIGluIHZlcnRleCBtIGNvbnRhaW5zIHNlY3RvciBpbiB2ZXJ0ZXggcCBpbiB0aGUgc2FtZSBjb29yZGluYXRlc1xuZnVuY3Rpb24gc2VjdG9yQ29udGFpbnNTZWN0b3IobSwgcCkge1xuICAgIHJldHVybiBhcmVhKG0ucHJldiwgbSwgcC5wcmV2KSA8IDAgJiYgYXJlYShwLm5leHQsIG0sIG0ubmV4dCkgPCAwO1xufVxuXG4vLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG5mdW5jdGlvbiBpbmRleEN1cnZlKHN0YXJ0LCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnogPT09IG51bGwpIHAueiA9IHpPcmRlcihwLngsIHAueSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG4gICAgICAgIHAucHJldlogPSBwLnByZXY7XG4gICAgICAgIHAubmV4dFogPSBwLm5leHQ7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcC5wcmV2Wi5uZXh0WiA9IG51bGw7XG4gICAgcC5wcmV2WiA9IG51bGw7XG5cbiAgICBzb3J0TGlua2VkKHApO1xufVxuXG4vLyBTaW1vbiBUYXRoYW0ncyBsaW5rZWQgbGlzdCBtZXJnZSBzb3J0IGFsZ29yaXRobVxuLy8gaHR0cDovL3d3dy5jaGlhcmsuZ3JlZW5lbmQub3JnLnVrL35zZ3RhdGhhbS9hbGdvcml0aG1zL2xpc3Rzb3J0Lmh0bWxcbmZ1bmN0aW9uIHNvcnRMaW5rZWQobGlzdCkge1xuICAgIHZhciBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSxcbiAgICAgICAgaW5TaXplID0gMTtcblxuICAgIGRvIHtcbiAgICAgICAgcCA9IGxpc3Q7XG4gICAgICAgIGxpc3QgPSBudWxsO1xuICAgICAgICB0YWlsID0gbnVsbDtcbiAgICAgICAgbnVtTWVyZ2VzID0gMDtcblxuICAgICAgICB3aGlsZSAocCkge1xuICAgICAgICAgICAgbnVtTWVyZ2VzKys7XG4gICAgICAgICAgICBxID0gcDtcbiAgICAgICAgICAgIHBTaXplID0gMDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpblNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgIHBTaXplKys7XG4gICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgaWYgKCFxKSBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHFTaXplID0gaW5TaXplO1xuXG4gICAgICAgICAgICB3aGlsZSAocFNpemUgPiAwIHx8IChxU2l6ZSA+IDAgJiYgcSkpIHtcblxuICAgICAgICAgICAgICAgIGlmIChwU2l6ZSAhPT0gMCAmJiAocVNpemUgPT09IDAgfHwgIXEgfHwgcC56IDw9IHEueikpIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHA7XG4gICAgICAgICAgICAgICAgICAgIHAgPSBwLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBwU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBxO1xuICAgICAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcVNpemUtLTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGFpbCkgdGFpbC5uZXh0WiA9IGU7XG4gICAgICAgICAgICAgICAgZWxzZSBsaXN0ID0gZTtcblxuICAgICAgICAgICAgICAgIGUucHJldlogPSB0YWlsO1xuICAgICAgICAgICAgICAgIHRhaWwgPSBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwID0gcTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhaWwubmV4dFogPSBudWxsO1xuICAgICAgICBpblNpemUgKj0gMjtcblxuICAgIH0gd2hpbGUgKG51bU1lcmdlcyA+IDEpO1xuXG4gICAgcmV0dXJuIGxpc3Q7XG59XG5cbi8vIHotb3JkZXIgb2YgYSBwb2ludCBnaXZlbiBjb29yZHMgYW5kIGludmVyc2Ugb2YgdGhlIGxvbmdlciBzaWRlIG9mIGRhdGEgYmJveFxuZnVuY3Rpb24gek9yZGVyKHgsIHksIG1pblgsIG1pblksIGludlNpemUpIHtcbiAgICAvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG4gICAgeCA9IDMyNzY3ICogKHggLSBtaW5YKSAqIGludlNpemU7XG4gICAgeSA9IDMyNzY3ICogKHkgLSBtaW5ZKSAqIGludlNpemU7XG5cbiAgICB4ID0gKHggfCAoeCA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeCA9ICh4IHwgKHggPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB4ID0gKHggfCAoeCA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgeSA9ICh5IHwgKHkgPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB5ID0gKHkgfCAoeSA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeSA9ICh5IHwgKHkgPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHJldHVybiB4IHwgKHkgPDwgMSk7XG59XG5cbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcbmZ1bmN0aW9uIGdldExlZnRtb3N0KHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgbGVmdG1vc3QgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnggPCBsZWZ0bW9zdC54IHx8IChwLnggPT09IGxlZnRtb3N0LnggJiYgcC55IDwgbGVmdG1vc3QueSkpIGxlZnRtb3N0ID0gcDtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICByZXR1cm4gbGVmdG1vc3Q7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBjb252ZXggdHJpYW5nbGVcbmZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZShheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBweCwgcHkpIHtcbiAgICByZXR1cm4gKGN4IC0gcHgpICogKGF5IC0gcHkpIC0gKGF4IC0gcHgpICogKGN5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGF4IC0gcHgpICogKGJ5IC0gcHkpIC0gKGJ4IC0gcHgpICogKGF5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGJ4IC0gcHgpICogKGN5IC0gcHkpIC0gKGN4IC0gcHgpICogKGJ5IC0gcHkpID49IDA7XG59XG5cbi8vIGNoZWNrIGlmIGEgZGlhZ29uYWwgYmV0d2VlbiB0d28gcG9seWdvbiBub2RlcyBpcyB2YWxpZCAobGllcyBpbiBwb2x5Z29uIGludGVyaW9yKVxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKGEsIGIpIHtcbiAgICByZXR1cm4gYS5uZXh0LmkgIT09IGIuaSAmJiBhLnByZXYuaSAhPT0gYi5pICYmICFpbnRlcnNlY3RzUG9seWdvbihhLCBiKSAmJiAvLyBkb25lcyd0IGludGVyc2VjdCBvdGhlciBlZGdlc1xuICAgICAgICAgICAobG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpICYmIG1pZGRsZUluc2lkZShhLCBiKSAmJiAvLyBsb2NhbGx5IHZpc2libGVcbiAgICAgICAgICAgIChhcmVhKGEucHJldiwgYSwgYi5wcmV2KSB8fCBhcmVhKGEsIGIucHJldiwgYikpIHx8IC8vIGRvZXMgbm90IGNyZWF0ZSBvcHBvc2l0ZS1mYWNpbmcgc2VjdG9yc1xuICAgICAgICAgICAgZXF1YWxzKGEsIGIpICYmIGFyZWEoYS5wcmV2LCBhLCBhLm5leHQpID4gMCAmJiBhcmVhKGIucHJldiwgYiwgYi5uZXh0KSA+IDApOyAvLyBzcGVjaWFsIHplcm8tbGVuZ3RoIGNhc2Vcbn1cblxuLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZVxuZnVuY3Rpb24gYXJlYShwLCBxLCByKSB7XG4gICAgcmV0dXJuIChxLnkgLSBwLnkpICogKHIueCAtIHEueCkgLSAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpO1xufVxuXG4vLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbFxuZnVuY3Rpb24gZXF1YWxzKHAxLCBwMikge1xuICAgIHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBzZWdtZW50cyBpbnRlcnNlY3RcbmZ1bmN0aW9uIGludGVyc2VjdHMocDEsIHExLCBwMiwgcTIpIHtcbiAgICB2YXIgbzEgPSBzaWduKGFyZWEocDEsIHExLCBwMikpO1xuICAgIHZhciBvMiA9IHNpZ24oYXJlYShwMSwgcTEsIHEyKSk7XG4gICAgdmFyIG8zID0gc2lnbihhcmVhKHAyLCBxMiwgcDEpKTtcbiAgICB2YXIgbzQgPSBzaWduKGFyZWEocDIsIHEyLCBxMSkpO1xuXG4gICAgaWYgKG8xICE9PSBvMiAmJiBvMyAhPT0gbzQpIHJldHVybiB0cnVlOyAvLyBnZW5lcmFsIGNhc2VcblxuICAgIGlmIChvMSA9PT0gMCAmJiBvblNlZ21lbnQocDEsIHAyLCBxMSkpIHJldHVybiB0cnVlOyAvLyBwMSwgcTEgYW5kIHAyIGFyZSBjb2xsaW5lYXIgYW5kIHAyIGxpZXMgb24gcDFxMVxuICAgIGlmIChvMiA9PT0gMCAmJiBvblNlZ21lbnQocDEsIHEyLCBxMSkpIHJldHVybiB0cnVlOyAvLyBwMSwgcTEgYW5kIHEyIGFyZSBjb2xsaW5lYXIgYW5kIHEyIGxpZXMgb24gcDFxMVxuICAgIGlmIChvMyA9PT0gMCAmJiBvblNlZ21lbnQocDIsIHAxLCBxMikpIHJldHVybiB0cnVlOyAvLyBwMiwgcTIgYW5kIHAxIGFyZSBjb2xsaW5lYXIgYW5kIHAxIGxpZXMgb24gcDJxMlxuICAgIGlmIChvNCA9PT0gMCAmJiBvblNlZ21lbnQocDIsIHExLCBxMikpIHJldHVybiB0cnVlOyAvLyBwMiwgcTIgYW5kIHExIGFyZSBjb2xsaW5lYXIgYW5kIHExIGxpZXMgb24gcDJxMlxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBmb3IgY29sbGluZWFyIHBvaW50cyBwLCBxLCByLCBjaGVjayBpZiBwb2ludCBxIGxpZXMgb24gc2VnbWVudCBwclxuZnVuY3Rpb24gb25TZWdtZW50KHAsIHEsIHIpIHtcbiAgICByZXR1cm4gcS54IDw9IE1hdGgubWF4KHAueCwgci54KSAmJiBxLnggPj0gTWF0aC5taW4ocC54LCByLngpICYmIHEueSA8PSBNYXRoLm1heChwLnksIHIueSkgJiYgcS55ID49IE1hdGgubWluKHAueSwgci55KTtcbn1cblxuZnVuY3Rpb24gc2lnbihudW0pIHtcbiAgICByZXR1cm4gbnVtID4gMCA/IDEgOiBudW0gPCAwID8gLTEgOiAwO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaW50ZXJzZWN0cyBhbnkgcG9seWdvbiBzZWdtZW50c1xuZnVuY3Rpb24gaW50ZXJzZWN0c1BvbHlnb24oYSwgYikge1xuICAgIHZhciBwID0gYTtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLmkgIT09IGEuaSAmJiBwLm5leHQuaSAhPT0gYS5pICYmIHAuaSAhPT0gYi5pICYmIHAubmV4dC5pICE9PSBiLmkgJiZcbiAgICAgICAgICAgICAgICBpbnRlcnNlY3RzKHAsIHAubmV4dCwgYSwgYikpIHJldHVybiB0cnVlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIGxvY2FsbHlJbnNpZGUoYSwgYikge1xuICAgIHJldHVybiBhcmVhKGEucHJldiwgYSwgYS5uZXh0KSA8IDAgP1xuICAgICAgICBhcmVhKGEsIGIsIGEubmV4dCkgPj0gMCAmJiBhcmVhKGEsIGEucHJldiwgYikgPj0gMCA6XG4gICAgICAgIGFyZWEoYSwgYiwgYS5wcmV2KSA8IDAgfHwgYXJlYShhLCBhLm5leHQsIGIpIDwgMDtcbn1cblxuLy8gY2hlY2sgaWYgdGhlIG1pZGRsZSBwb2ludCBvZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBtaWRkbGVJbnNpZGUoYSwgYikge1xuICAgIHZhciBwID0gYSxcbiAgICAgICAgaW5zaWRlID0gZmFsc2UsXG4gICAgICAgIHB4ID0gKGEueCArIGIueCkgLyAyLFxuICAgICAgICBweSA9IChhLnkgKyBiLnkpIC8gMjtcbiAgICBkbyB7XG4gICAgICAgIGlmICgoKHAueSA+IHB5KSAhPT0gKHAubmV4dC55ID4gcHkpKSAmJiBwLm5leHQueSAhPT0gcC55ICYmXG4gICAgICAgICAgICAgICAgKHB4IDwgKHAubmV4dC54IC0gcC54KSAqIChweSAtIHAueSkgLyAocC5uZXh0LnkgLSBwLnkpICsgcC54KSlcbiAgICAgICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gaW5zaWRlO1xufVxuXG4vLyBsaW5rIHR3byBwb2x5Z29uIHZlcnRpY2VzIHdpdGggYSBicmlkZ2U7IGlmIHRoZSB2ZXJ0aWNlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcmluZywgaXQgc3BsaXRzIHBvbHlnb24gaW50byB0d287XG4vLyBpZiBvbmUgYmVsb25ncyB0byB0aGUgb3V0ZXIgcmluZyBhbmQgYW5vdGhlciB0byBhIGhvbGUsIGl0IG1lcmdlcyBpdCBpbnRvIGEgc2luZ2xlIHJpbmdcbmZ1bmN0aW9uIHNwbGl0UG9seWdvbihhLCBiKSB7XG4gICAgdmFyIGEyID0gbmV3IE5vZGUoYS5pLCBhLngsIGEueSksXG4gICAgICAgIGIyID0gbmV3IE5vZGUoYi5pLCBiLngsIGIueSksXG4gICAgICAgIGFuID0gYS5uZXh0LFxuICAgICAgICBicCA9IGIucHJldjtcblxuICAgIGEubmV4dCA9IGI7XG4gICAgYi5wcmV2ID0gYTtcblxuICAgIGEyLm5leHQgPSBhbjtcbiAgICBhbi5wcmV2ID0gYTI7XG5cbiAgICBiMi5uZXh0ID0gYTI7XG4gICAgYTIucHJldiA9IGIyO1xuXG4gICAgYnAubmV4dCA9IGIyO1xuICAgIGIyLnByZXYgPSBicDtcblxuICAgIHJldHVybiBiMjtcbn1cblxuLy8gY3JlYXRlIGEgbm9kZSBhbmQgb3B0aW9uYWxseSBsaW5rIGl0IHdpdGggcHJldmlvdXMgb25lIChpbiBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGluc2VydE5vZGUoaSwgeCwgeSwgbGFzdCkge1xuICAgIHZhciBwID0gbmV3IE5vZGUoaSwgeCwgeSk7XG5cbiAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgcC5wcmV2ID0gcDtcbiAgICAgICAgcC5uZXh0ID0gcDtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHAubmV4dCA9IGxhc3QubmV4dDtcbiAgICAgICAgcC5wcmV2ID0gbGFzdDtcbiAgICAgICAgbGFzdC5uZXh0LnByZXYgPSBwO1xuICAgICAgICBsYXN0Lm5leHQgPSBwO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShwKSB7XG4gICAgcC5uZXh0LnByZXYgPSBwLnByZXY7XG4gICAgcC5wcmV2Lm5leHQgPSBwLm5leHQ7XG5cbiAgICBpZiAocC5wcmV2WikgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7XG4gICAgaWYgKHAubmV4dFopIHAubmV4dFoucHJldlogPSBwLnByZXZaO1xufVxuXG5mdW5jdGlvbiBOb2RlKGksIHgsIHkpIHtcbiAgICAvLyB2ZXJ0ZXggaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcbiAgICB0aGlzLmkgPSBpO1xuXG4gICAgLy8gdmVydGV4IGNvb3JkaW5hdGVzXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgdmVydGV4IG5vZGVzIGluIGEgcG9seWdvbiByaW5nXG4gICAgdGhpcy5wcmV2ID0gbnVsbDtcbiAgICB0aGlzLm5leHQgPSBudWxsO1xuXG4gICAgLy8gei1vcmRlciBjdXJ2ZSB2YWx1ZVxuICAgIHRoaXMueiA9IG51bGw7XG5cbiAgICAvLyBwcmV2aW91cyBhbmQgbmV4dCBub2RlcyBpbiB6LW9yZGVyXG4gICAgdGhpcy5wcmV2WiA9IG51bGw7XG4gICAgdGhpcy5uZXh0WiA9IG51bGw7XG5cbiAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgc3RlaW5lciBwb2ludFxuICAgIHRoaXMuc3RlaW5lciA9IGZhbHNlO1xufVxuXG4vLyByZXR1cm4gYSBwZXJjZW50YWdlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcG9seWdvbiBhcmVhIGFuZCBpdHMgdHJpYW5ndWxhdGlvbiBhcmVhO1xuLy8gdXNlZCB0byB2ZXJpZnkgY29ycmVjdG5lc3Mgb2YgdHJpYW5ndWxhdGlvblxuZWFyY3V0LmRldmlhdGlvbiA9IGZ1bmN0aW9uIChkYXRhLCBob2xlSW5kaWNlcywgZGltLCB0cmlhbmdsZXMpIHtcbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGg7XG4gICAgdmFyIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuXG4gICAgdmFyIHBvbHlnb25BcmVhID0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCAwLCBvdXRlckxlbiwgZGltKSk7XG4gICAgaWYgKGhhc0hvbGVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XG4gICAgICAgICAgICB2YXIgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHBvbHlnb25BcmVhIC09IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdHJpYW5nbGVzQXJlYSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB2YXIgYSA9IHRyaWFuZ2xlc1tpXSAqIGRpbTtcbiAgICAgICAgdmFyIGIgPSB0cmlhbmdsZXNbaSArIDFdICogZGltO1xuICAgICAgICB2YXIgYyA9IHRyaWFuZ2xlc1tpICsgMl0gKiBkaW07XG4gICAgICAgIHRyaWFuZ2xlc0FyZWEgKz0gTWF0aC5hYnMoXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbY10pICogKGRhdGFbYiArIDFdIC0gZGF0YVthICsgMV0pIC1cbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtiXSkgKiAoZGF0YVtjICsgMV0gLSBkYXRhW2EgKyAxXSkpO1xuICAgIH1cblxuICAgIHJldHVybiBwb2x5Z29uQXJlYSA9PT0gMCAmJiB0cmlhbmdsZXNBcmVhID09PSAwID8gMCA6XG4gICAgICAgIE1hdGguYWJzKCh0cmlhbmdsZXNBcmVhIC0gcG9seWdvbkFyZWEpIC8gcG9seWdvbkFyZWEpO1xufTtcblxuZnVuY3Rpb24gc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pIHtcbiAgICB2YXIgc3VtID0gMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQsIGogPSBlbmQgLSBkaW07IGkgPCBlbmQ7IGkgKz0gZGltKSB7XG4gICAgICAgIHN1bSArPSAoZGF0YVtqXSAtIGRhdGFbaV0pICogKGRhdGFbaSArIDFdICsgZGF0YVtqICsgMV0pO1xuICAgICAgICBqID0gaTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn1cblxuLy8gdHVybiBhIHBvbHlnb24gaW4gYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBmb3JtIChlLmcuIGFzIGluIEdlb0pTT04pIGludG8gYSBmb3JtIEVhcmN1dCBhY2NlcHRzXG5lYXJjdXQuZmxhdHRlbiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIGRpbSA9IGRhdGFbMF1bMF0ubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSB7dmVydGljZXM6IFtdLCBob2xlczogW10sIGRpbWVuc2lvbnM6IGRpbX0sXG4gICAgICAgIGhvbGVJbmRleCA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkYXRhW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8IGRpbTsgZCsrKSByZXN1bHQudmVydGljZXMucHVzaChkYXRhW2ldW2pdW2RdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGhvbGVJbmRleCArPSBkYXRhW2kgLSAxXS5sZW5ndGg7XG4gICAgICAgICAgICByZXN1bHQuaG9sZXMucHVzaChob2xlSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWlja3NlbGVjdChhcnIsIGssIGxlZnQsIHJpZ2h0LCBjb21wYXJlKSB7XG4gICAgcXVpY2tzZWxlY3RTdGVwKGFyciwgaywgbGVmdCB8fCAwLCByaWdodCB8fCAoYXJyLmxlbmd0aCAtIDEpLCBjb21wYXJlIHx8IGRlZmF1bHRDb21wYXJlKTtcbn1cblxuZnVuY3Rpb24gcXVpY2tzZWxlY3RTdGVwKGFyciwgaywgbGVmdCwgcmlnaHQsIGNvbXBhcmUpIHtcblxuICAgIHdoaWxlIChyaWdodCA+IGxlZnQpIHtcbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgdmFyIG4gPSByaWdodCAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgdmFyIG0gPSBrIC0gbGVmdCArIDE7XG4gICAgICAgICAgICB2YXIgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgdmFyIHMgPSAwLjUgKiBNYXRoLmV4cCgyICogeiAvIDMpO1xuICAgICAgICAgICAgdmFyIHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogKG0gLSBuIC8gMiA8IDAgPyAtMSA6IDEpO1xuICAgICAgICAgICAgdmFyIG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgdmFyIG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gbSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICBxdWlja3NlbGVjdFN0ZXAoYXJyLCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdCA9IGFycltrXTtcbiAgICAgICAgdmFyIGkgPSBsZWZ0O1xuICAgICAgICB2YXIgaiA9IHJpZ2h0O1xuXG4gICAgICAgIHN3YXAoYXJyLCBsZWZ0LCBrKTtcbiAgICAgICAgaWYgKGNvbXBhcmUoYXJyW3JpZ2h0XSwgdCkgPiAwKSBzd2FwKGFyciwgbGVmdCwgcmlnaHQpO1xuXG4gICAgICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgICAgICAgc3dhcChhcnIsIGksIGopO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyW2ldLCB0KSA8IDApIGkrKztcbiAgICAgICAgICAgIHdoaWxlIChjb21wYXJlKGFycltqXSwgdCkgPiAwKSBqLS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tcGFyZShhcnJbbGVmdF0sIHQpID09PSAwKSBzd2FwKGFyciwgbGVmdCwgaik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgc3dhcChhcnIsIGosIHJpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICAgICAgaWYgKGsgPD0gaikgcmlnaHQgPSBqIC0gMTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN3YXAoYXJyLCBpLCBqKSB7XG4gICAgdmFyIHRtcCA9IGFycltpXTtcbiAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgYXJyW2pdID0gdG1wO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xufVxuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUZlYXR1cmU7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVGZWF0dXJlKHBiZiwgZW5kLCBleHRlbnQsIGtleXMsIHZhbHVlcykge1xuICAgIC8vIFB1YmxpY1xuICAgIHRoaXMucHJvcGVydGllcyA9IHt9O1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50O1xuICAgIHRoaXMudHlwZSA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2dlb21ldHJ5ID0gLTE7XG4gICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgdGhpcy5fdmFsdWVzID0gdmFsdWVzO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZEZlYXR1cmUsIHRoaXMsIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRGZWF0dXJlKHRhZywgZmVhdHVyZSwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PSAxKSBmZWF0dXJlLmlkID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMikgcmVhZFRhZyhwYmYsIGZlYXR1cmUpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAzKSBmZWF0dXJlLnR5cGUgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSA0KSBmZWF0dXJlLl9nZW9tZXRyeSA9IHBiZi5wb3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWcocGJmLCBmZWF0dXJlKSB7XG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIGtleSA9IGZlYXR1cmUuX2tleXNbcGJmLnJlYWRWYXJpbnQoKV0sXG4gICAgICAgICAgICB2YWx1ZSA9IGZlYXR1cmUuX3ZhbHVlc1twYmYucmVhZFZhcmludCgpXTtcbiAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG59XG5cblZlY3RvclRpbGVGZWF0dXJlLnR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgbGluZXMgPSBbXSxcbiAgICAgICAgbGluZTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmIChsZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcblxuICAgICAgICAgICAgaWYgKGNtZCA9PT0gMSkgeyAvLyBtb3ZlVG9cbiAgICAgICAgICAgICAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpbmUucHVzaChuZXcgUG9pbnQoeCwgeSkpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY21kID09PSA3KSB7XG5cbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwbmlrLXZlY3Rvci10aWxlL2lzc3Vlcy85MFxuICAgICAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICAgICAgICBsaW5lLnB1c2gobGluZVswXS5jbG9uZSgpKTsgLy8gY2xvc2VQb2x5Z29uXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG5cbiAgICByZXR1cm4gbGluZXM7XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUuYmJveCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XG4gICAgcGJmLnBvcyA9IHRoaXMuX2dlb21ldHJ5O1xuXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxuICAgICAgICBjbWQgPSAxLFxuICAgICAgICBsZW5ndGggPSAwLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIHgxID0gSW5maW5pdHksXG4gICAgICAgIHgyID0gLUluZmluaXR5LFxuICAgICAgICB5MSA9IEluZmluaXR5LFxuICAgICAgICB5MiA9IC1JbmZpbml0eTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmIChsZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIGlmICh4IDwgeDEpIHgxID0geDtcbiAgICAgICAgICAgIGlmICh4ID4geDIpIHgyID0geDtcbiAgICAgICAgICAgIGlmICh5IDwgeTEpIHkxID0geTtcbiAgICAgICAgICAgIGlmICh5ID4geTIpIHkyID0geTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCAhPT0gNykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXTtcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS50b0dlb0pTT04gPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLmV4dGVudCAqIE1hdGgucG93KDIsIHopLFxuICAgICAgICB4MCA9IHRoaXMuZXh0ZW50ICogeCxcbiAgICAgICAgeTAgPSB0aGlzLmV4dGVudCAqIHksXG4gICAgICAgIGNvb3JkcyA9IHRoaXMubG9hZEdlb21ldHJ5KCksXG4gICAgICAgIHR5cGUgPSBWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t0aGlzLnR5cGVdLFxuICAgICAgICBpLCBqO1xuXG4gICAgZnVuY3Rpb24gcHJvamVjdChsaW5lKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGluZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHAgPSBsaW5lW2pdLCB5MiA9IDE4MCAtIChwLnkgKyB5MCkgKiAzNjAgLyBzaXplO1xuICAgICAgICAgICAgbGluZVtqXSA9IFtcbiAgICAgICAgICAgICAgICAocC54ICsgeDApICogMzYwIC8gc2l6ZSAtIDE4MCxcbiAgICAgICAgICAgICAgICAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKHkyICogTWF0aC5QSSAvIDE4MCkpIC0gOTBcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgIGNhc2UgMTpcbiAgICAgICAgdmFyIHBvaW50cyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwb2ludHNbaV0gPSBjb29yZHNbaV1bMF07XG4gICAgICAgIH1cbiAgICAgICAgY29vcmRzID0gcG9pbnRzO1xuICAgICAgICBwcm9qZWN0KGNvb3Jkcyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAyOlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwcm9qZWN0KGNvb3Jkc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDM6XG4gICAgICAgIGNvb3JkcyA9IGNsYXNzaWZ5UmluZ3MoY29vcmRzKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvb3Jkc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHByb2plY3QoY29vcmRzW2ldW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY29vcmRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb29yZHMgPSBjb29yZHNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9ICdNdWx0aScgKyB0eXBlO1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIHR5cGU6IFwiRmVhdHVyZVwiLFxuICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZHNcbiAgICAgICAgfSxcbiAgICAgICAgcHJvcGVydGllczogdGhpcy5wcm9wZXJ0aWVzXG4gICAgfTtcblxuICAgIGlmICgnaWQnIGluIHRoaXMpIHtcbiAgICAgICAgcmVzdWx0LmlkID0gdGhpcy5pZDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gY2xhc3NpZmllcyBhbiBhcnJheSBvZiByaW5ncyBpbnRvIHBvbHlnb25zIHdpdGggb3V0ZXIgcmluZ3MgYW5kIGhvbGVzXG5cbmZ1bmN0aW9uIGNsYXNzaWZ5UmluZ3MocmluZ3MpIHtcbiAgICB2YXIgbGVuID0gcmluZ3MubGVuZ3RoO1xuXG4gICAgaWYgKGxlbiA8PSAxKSByZXR1cm4gW3JpbmdzXTtcblxuICAgIHZhciBwb2x5Z29ucyA9IFtdLFxuICAgICAgICBwb2x5Z29uLFxuICAgICAgICBjY3c7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBhcmVhID0gc2lnbmVkQXJlYShyaW5nc1tpXSk7XG4gICAgICAgIGlmIChhcmVhID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoY2N3ID09PSB1bmRlZmluZWQpIGNjdyA9IGFyZWEgPCAwO1xuXG4gICAgICAgIGlmIChjY3cgPT09IGFyZWEgPCAwKSB7XG4gICAgICAgICAgICBpZiAocG9seWdvbikgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcbiAgICAgICAgICAgIHBvbHlnb24gPSBbcmluZ3NbaV1dO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb2x5Z29uLnB1c2gocmluZ3NbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwb2x5Z29uKSBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuXG4gICAgcmV0dXJuIHBvbHlnb25zO1xufVxuXG5mdW5jdGlvbiBzaWduZWRBcmVhKHJpbmcpIHtcbiAgICB2YXIgc3VtID0gMDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAxLCBwMSwgcDI7IGkgPCBsZW47IGogPSBpKyspIHtcbiAgICAgICAgcDEgPSByaW5nW2ldO1xuICAgICAgICBwMiA9IHJpbmdbal07XG4gICAgICAgIHN1bSArPSAocDIueCAtIHAxLngpICogKHAxLnkgKyBwMi55KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlZmVhdHVyZS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVMYXllcjtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUxheWVyKHBiZiwgZW5kKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy52ZXJzaW9uID0gMTtcbiAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgIHRoaXMuZXh0ZW50ID0gNDA5NjtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICB0aGlzLl9mZWF0dXJlcyA9IFtdO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZExheWVyLCB0aGlzLCBlbmQpO1xuXG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLl9mZWF0dXJlcy5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRMYXllcih0YWcsIGxheWVyLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxNSkgbGF5ZXIudmVyc2lvbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAxKSBsYXllci5uYW1lID0gcGJmLnJlYWRTdHJpbmcoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGxheWVyLmV4dGVudCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBsYXllci5fZmVhdHVyZXMucHVzaChwYmYucG9zKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDMpIGxheWVyLl9rZXlzLnB1c2gocGJmLnJlYWRTdHJpbmcoKSk7XG4gICAgZWxzZSBpZiAodGFnID09PSA0KSBsYXllci5fdmFsdWVzLnB1c2gocmVhZFZhbHVlTWVzc2FnZShwYmYpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhbHVlTWVzc2FnZShwYmYpIHtcbiAgICB2YXIgdmFsdWUgPSBudWxsLFxuICAgICAgICBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciB0YWcgPSBwYmYucmVhZFZhcmludCgpID4+IDM7XG5cbiAgICAgICAgdmFsdWUgPSB0YWcgPT09IDEgPyBwYmYucmVhZFN0cmluZygpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMiA/IHBiZi5yZWFkRmxvYXQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDMgPyBwYmYucmVhZERvdWJsZSgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNCA/IHBiZi5yZWFkVmFyaW50NjQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDUgPyBwYmYucmVhZFZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNiA/IHBiZi5yZWFkU1ZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNyA/IHBiZi5yZWFkQm9vbGVhbigpIDogbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIHJldHVybiBmZWF0dXJlIGBpYCBmcm9tIHRoaXMgbGF5ZXIgYXMgYSBgVmVjdG9yVGlsZUZlYXR1cmVgXG5WZWN0b3JUaWxlTGF5ZXIucHJvdG90eXBlLmZlYXR1cmUgPSBmdW5jdGlvbihpKSB7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2ZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kcycpO1xuXG4gICAgdGhpcy5fcGJmLnBvcyA9IHRoaXMuX2ZlYXR1cmVzW2ldO1xuXG4gICAgdmFyIGVuZCA9IHRoaXMuX3BiZi5yZWFkVmFyaW50KCkgKyB0aGlzLl9wYmYucG9zO1xuICAgIHJldHVybiBuZXcgVmVjdG9yVGlsZUZlYXR1cmUodGhpcy5fcGJmLCBlbmQsIHRoaXMuZXh0ZW50LCB0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWxheWVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZShwYmYsIGVuZCkge1xuICAgIHRoaXMubGF5ZXJzID0gcGJmLnJlYWRGaWVsZHMocmVhZFRpbGUsIHt9LCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkVGlsZSh0YWcsIGxheWVycywgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICB2YXIgbGF5ZXIgPSBuZXcgVmVjdG9yVGlsZUxheWVyKHBiZiwgcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MpO1xuICAgICAgICBpZiAobGF5ZXIubGVuZ3RoKSBsYXllcnNbbGF5ZXIubmFtZV0gPSBsYXllcjtcbiAgICB9XG59XG5cbiIsIm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMnKTtcbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYmY7XG5cbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpO1xuXG5mdW5jdGlvbiBQYmYoYnVmKSB7XG4gICAgdGhpcy5idWYgPSBBcnJheUJ1ZmZlci5pc1ZpZXcgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGJ1ZikgPyBidWYgOiBuZXcgVWludDhBcnJheShidWYgfHwgMCk7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMudHlwZSA9IDA7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLmJ1Zi5sZW5ndGg7XG59XG5cblBiZi5WYXJpbnQgID0gMDsgLy8gdmFyaW50OiBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBzaW50MzIsIHNpbnQ2NCwgYm9vbCwgZW51bVxuUGJmLkZpeGVkNjQgPSAxOyAvLyA2NC1iaXQ6IGRvdWJsZSwgZml4ZWQ2NCwgc2ZpeGVkNjRcblBiZi5CeXRlcyAgID0gMjsgLy8gbGVuZ3RoLWRlbGltaXRlZDogc3RyaW5nLCBieXRlcywgZW1iZWRkZWQgbWVzc2FnZXMsIHBhY2tlZCByZXBlYXRlZCBmaWVsZHNcblBiZi5GaXhlZDMyID0gNTsgLy8gMzItYml0OiBmbG9hdCwgZml4ZWQzMiwgc2ZpeGVkMzJcblxudmFyIFNISUZUX0xFRlRfMzIgPSAoMSA8PCAxNikgKiAoMSA8PCAxNiksXG4gICAgU0hJRlRfUklHSFRfMzIgPSAxIC8gU0hJRlRfTEVGVF8zMjtcblxuLy8gVGhyZXNob2xkIGNob3NlbiBiYXNlZCBvbiBib3RoIGJlbmNobWFya2luZyBhbmQga25vd2xlZGdlIGFib3V0IGJyb3dzZXIgc3RyaW5nXG4vLyBkYXRhIHN0cnVjdHVyZXMgKHdoaWNoIGN1cnJlbnRseSBzd2l0Y2ggc3RydWN0dXJlIHR5cGVzIGF0IDEyIGJ5dGVzIG9yIG1vcmUpXG52YXIgVEVYVF9ERUNPREVSX01JTl9MRU5HVEggPSAxMjtcbnZhciB1dGY4VGV4dERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IG5ldyBUZXh0RGVjb2RlcigndXRmOCcpO1xuXG5QYmYucHJvdG90eXBlID0ge1xuXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuYnVmID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gPT09IFJFQURJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHJlYWRGaWVsZHM6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0LCBlbmQpIHtcbiAgICAgICAgZW5kID0gZW5kIHx8IHRoaXMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMucmVhZFZhcmludCgpLFxuICAgICAgICAgICAgICAgIHRhZyA9IHZhbCA+PiAzLFxuICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG5cbiAgICAgICAgICAgIHRoaXMudHlwZSA9IHZhbCAmIDB4NztcbiAgICAgICAgICAgIHJlYWRGaWVsZCh0YWcsIHJlc3VsdCwgdGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyA9PT0gc3RhcnRQb3MpIHRoaXMuc2tpcCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIHJlYWRNZXNzYWdlOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmllbGRzKHJlYWRGaWVsZCwgcmVzdWx0LCB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zKTtcbiAgICB9LFxuXG4gICAgcmVhZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gcmVhZFVJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkU0ZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gcmVhZEludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIC8vIDY0LWJpdCBpbnQgaGFuZGxpbmcgaXMgYmFzZWQgb24gZ2l0aHViLmNvbS9kcHcvbm9kZS1idWZmZXItbW9yZS1pbnRzIChNSVQtbGljZW5zZWQpXG5cbiAgICByZWFkRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSByZWFkVUludDMyKHRoaXMuYnVmLCB0aGlzLnBvcykgKyByZWFkVUludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyArIDQpICogU0hJRlRfTEVGVF8zMjtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFNGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zKSArIHJlYWRJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSBpZWVlNzU0LnJlYWQodGhpcy5idWYsIHRoaXMucG9zLCB0cnVlLCAyMywgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gaWVlZTc1NC5yZWFkKHRoaXMuYnVmLCB0aGlzLnBvcywgdHJ1ZSwgNTIsIDgpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkVmFyaW50OiBmdW5jdGlvbihpc1NpZ25lZCkge1xuICAgICAgICB2YXIgYnVmID0gdGhpcy5idWYsXG4gICAgICAgICAgICB2YWwsIGI7XG5cbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICA9ICBiICYgMHg3ZjsgICAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsIHw9IChiICYgMHg3ZikgPDwgNzsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsIHw9IChiICYgMHg3ZikgPDwgMTQ7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsIHw9IChiICYgMHg3ZikgPDwgMjE7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvc107ICAgdmFsIHw9IChiICYgMHgwZikgPDwgMjg7XG5cbiAgICAgICAgcmV0dXJuIHJlYWRWYXJpbnRSZW1haW5kZXIodmFsLCBpc1NpZ25lZCwgdGhpcyk7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ2NDogZnVuY3Rpb24oKSB7IC8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdjIuMC4xXG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRWYXJpbnQodHJ1ZSk7XG4gICAgfSxcblxuICAgIHJlYWRTVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG51bSA9IHRoaXMucmVhZFZhcmludCgpO1xuICAgICAgICByZXR1cm4gbnVtICUgMiA9PT0gMSA/IChudW0gKyAxKSAvIC0yIDogbnVtIC8gMjsgLy8gemlnemFnIGVuY29kaW5nXG4gICAgfSxcblxuICAgIHJlYWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5yZWFkVmFyaW50KCkpO1xuICAgIH0sXG5cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3M7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG5cbiAgICAgICAgaWYgKGVuZCAtIHBvcyA+PSBURVhUX0RFQ09ERVJfTUlOX0xFTkdUSCAmJiB1dGY4VGV4dERlY29kZXIpIHtcbiAgICAgICAgICAgIC8vIGxvbmdlciBzdHJpbmdzIGFyZSBmYXN0IHdpdGggdGhlIGJ1aWx0LWluIGJyb3dzZXIgVGV4dERlY29kZXIgQVBJXG4gICAgICAgICAgICByZXR1cm4gcmVhZFV0ZjhUZXh0RGVjb2Rlcih0aGlzLmJ1ZiwgcG9zLCBlbmQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNob3J0IHN0cmluZ3MgYXJlIGZhc3Qgd2l0aCBvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gICAgICAgIHJldHVybiByZWFkVXRmOCh0aGlzLmJ1ZiwgcG9zLCBlbmQpO1xuICAgIH0sXG5cbiAgICByZWFkQnl0ZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyxcbiAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuYnVmLnN1YmFycmF5KHRoaXMucG9zLCBlbmQpO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9LFxuXG4gICAgLy8gdmVyYm9zZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczsgZG9lc24ndCBhZmZlY3QgZ3ppcHBlZCBzaXplXG5cbiAgICByZWFkUGFja2VkVmFyaW50OiBmdW5jdGlvbihhcnIsIGlzU2lnbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFZhcmludChpc1NpZ25lZCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFZhcmludChpc1NpZ25lZCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNWYXJpbnQ6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBQYmYuQnl0ZXMpIHJldHVybiBhcnIucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkQm9vbGVhbjogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGbG9hdDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZERvdWJsZTogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRml4ZWQzMjogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkNjQ6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBQYmYuQnl0ZXMpIHJldHVybiBhcnIucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBQYmYuQnl0ZXMpIHJldHVybiBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQ2NCgpKTtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQ2NCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuXG4gICAgc2tpcDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHZhciB0eXBlID0gdmFsICYgMHg3O1xuICAgICAgICBpZiAodHlwZSA9PT0gUGJmLlZhcmludCkgd2hpbGUgKHRoaXMuYnVmW3RoaXMucG9zKytdID4gMHg3Zikge31cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkJ5dGVzKSB0aGlzLnBvcyA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3M7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5GaXhlZDMyKSB0aGlzLnBvcyArPSA0O1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuRml4ZWQ2NCkgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ1VuaW1wbGVtZW50ZWQgdHlwZTogJyArIHR5cGUpO1xuICAgIH0sXG5cbiAgICAvLyA9PT0gV1JJVElORyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgd3JpdGVUYWc6IGZ1bmN0aW9uKHRhZywgdHlwZSkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KCh0YWcgPDwgMykgfCB0eXBlKTtcbiAgICB9LFxuXG4gICAgcmVhbGxvYzogZnVuY3Rpb24obWluKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8fCAxNjtcblxuICAgICAgICB3aGlsZSAobGVuZ3RoIDwgdGhpcy5wb3MgKyBtaW4pIGxlbmd0aCAqPSAyO1xuXG4gICAgICAgIGlmIChsZW5ndGggIT09IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICAgICAgICAgIGJ1Zi5zZXQodGhpcy5idWYpO1xuICAgICAgICAgICAgdGhpcy5idWYgPSBidWY7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMucG9zO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1Zi5zdWJhcnJheSgwLCB0aGlzLmxlbmd0aCk7XG4gICAgfSxcblxuICAgIHdyaXRlRml4ZWQzMjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgdmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZUZpeGVkNjQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIE1hdGguZmxvb3IodmFsICogU0hJRlRfUklHSFRfMzIpLCB0aGlzLnBvcyArIDQpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZVNGaXhlZDY0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB3cml0ZUludDMyKHRoaXMuYnVmLCB2YWwgJiAtMSwgdGhpcy5wb3MpO1xuICAgICAgICB3cml0ZUludDMyKHRoaXMuYnVmLCBNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YWwgPSArdmFsIHx8IDA7XG5cbiAgICAgICAgaWYgKHZhbCA+IDB4ZmZmZmZmZiB8fCB2YWwgPCAwKSB7XG4gICAgICAgICAgICB3cml0ZUJpZ1ZhcmludCh2YWwsIHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuXG4gICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gICAgICAgICAgIHZhbCAmIDB4N2YgIHwgKHZhbCA+IDB4N2YgPyAweDgwIDogMCk7IGlmICh2YWwgPD0gMHg3ZikgcmV0dXJuO1xuICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+Pj0gNykgJiAweDdmKSB8ICh2YWwgPiAweDdmID8gMHg4MCA6IDApOyBpZiAodmFsIDw9IDB4N2YpIHJldHVybjtcbiAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj49IDcpICYgMHg3ZikgfCAodmFsID4gMHg3ZiA/IDB4ODAgOiAwKTsgaWYgKHZhbCA8PSAweDdmKSByZXR1cm47XG4gICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gICAodmFsID4+PiA3KSAmIDB4N2Y7XG4gICAgfSxcblxuICAgIHdyaXRlU1ZhcmludDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQodmFsIDwgMCA/IC12YWwgKiAyIC0gMSA6IHZhbCAqIDIpO1xuICAgIH0sXG5cbiAgICB3cml0ZUJvb2xlYW46IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odmFsKSk7XG4gICAgfSxcblxuICAgIHdyaXRlU3RyaW5nOiBmdW5jdGlvbihzdHIpIHtcbiAgICAgICAgc3RyID0gU3RyaW5nKHN0cik7XG4gICAgICAgIHRoaXMucmVhbGxvYyhzdHIubGVuZ3RoICogNCk7XG5cbiAgICAgICAgdGhpcy5wb3MrKzsgLy8gcmVzZXJ2ZSAxIGJ5dGUgZm9yIHNob3J0IHN0cmluZyBsZW5ndGhcblxuICAgICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnBvcztcbiAgICAgICAgLy8gd3JpdGUgdGhlIHN0cmluZyBkaXJlY3RseSB0byB0aGUgYnVmZmVyIGFuZCBzZWUgaG93IG11Y2ggd2FzIHdyaXR0ZW5cbiAgICAgICAgdGhpcy5wb3MgPSB3cml0ZVV0ZjgodGhpcy5idWYsIHN0ciwgdGhpcy5wb3MpO1xuICAgICAgICB2YXIgbGVuID0gdGhpcy5wb3MgLSBzdGFydFBvcztcblxuICAgICAgICBpZiAobGVuID49IDB4ODApIG1ha2VSb29tRm9yRXh0cmFMZW5ndGgoc3RhcnRQb3MsIGxlbiwgdGhpcyk7XG5cbiAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGluIHRoZSByZXNlcnZlZCBwbGFjZSBhbmQgcmVzdG9yZSB0aGUgcG9zaXRpb25cbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydFBvcyAtIDE7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gbGVuO1xuICAgIH0sXG5cbiAgICB3cml0ZUZsb2F0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICBpZWVlNzU0LndyaXRlKHRoaXMuYnVmLCB2YWwsIHRoaXMucG9zLCB0cnVlLCAyMywgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRG91YmxlOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICBpZWVlNzU0LndyaXRlKHRoaXMuYnVmLCB2YWwsIHRoaXMucG9zLCB0cnVlLCA1MiwgOCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlQnl0ZXM6IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAgICAgICB2YXIgbGVuID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgICAgICB0aGlzLnJlYWxsb2MobGVuKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgdGhpcy5idWZbdGhpcy5wb3MrK10gPSBidWZmZXJbaV07XG4gICAgfSxcblxuICAgIHdyaXRlUmF3TWVzc2FnZTogZnVuY3Rpb24oZm4sIG9iaikge1xuICAgICAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgbWVzc2FnZSBsZW5ndGhcblxuICAgICAgICAvLyB3cml0ZSB0aGUgbWVzc2FnZSBkaXJlY3RseSB0byB0aGUgYnVmZmVyIGFuZCBzZWUgaG93IG11Y2ggd2FzIHdyaXR0ZW5cbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGZuKG9iaiwgdGhpcyk7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuXG4gICAgICAgIGlmIChsZW4gPj0gMHg4MCkgbWFrZVJvb21Gb3JFeHRyYUxlbmd0aChzdGFydFBvcywgbGVuLCB0aGlzKTtcblxuICAgICAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgbWVzc2FnZSBsZW5ndGggaW4gdGhlIHJlc2VydmVkIHBsYWNlIGFuZCByZXN0b3JlIHRoZSBwb3NpdGlvblxuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0UG9zIC0gMTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgICAgICB0aGlzLnBvcyArPSBsZW47XG4gICAgfSxcblxuICAgIHdyaXRlTWVzc2FnZTogZnVuY3Rpb24odGFnLCBmbiwgb2JqKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlUmF3TWVzc2FnZShmbiwgb2JqKTtcbiAgICB9LFxuXG4gICAgd3JpdGVQYWNrZWRWYXJpbnQ6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRWYXJpbnQsIGFycik7ICAgfSxcbiAgICB3cml0ZVBhY2tlZFNWYXJpbnQ6ICBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNWYXJpbnQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkQm9vbGVhbjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkQm9vbGVhbiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRGbG9hdDogICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGbG9hdCwgYXJyKTsgICAgfSxcbiAgICB3cml0ZVBhY2tlZERvdWJsZTogICBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZERvdWJsZSwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQzMjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRml4ZWQzMiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQzMiwgYXJyKTsgfSxcbiAgICB3cml0ZVBhY2tlZEZpeGVkNjQ6ICBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZpeGVkNjQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkNjQsIGFycik7IH0sXG5cbiAgICB3cml0ZUJ5dGVzRmllbGQ6IGZ1bmN0aW9uKHRhZywgYnVmZmVyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlQnl0ZXMoYnVmZmVyKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkMzIodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkNjQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVNWYXJpbnQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU3RyaW5nRmllbGQ6IGZ1bmN0aW9uKHRhZywgc3RyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKHN0cik7XG4gICAgfSxcbiAgICB3cml0ZUZsb2F0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGbG9hdCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVEb3VibGVGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICAgICAgdGhpcy53cml0ZURvdWJsZSh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVCb29sZWFuRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnRGaWVsZCh0YWcsIEJvb2xlYW4odmFsKSk7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gcmVhZFZhcmludFJlbWFpbmRlcihsLCBzLCBwKSB7XG4gICAgdmFyIGJ1ZiA9IHAuYnVmLFxuICAgICAgICBoLCBiO1xuXG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCAgPSAoYiAmIDB4NzApID4+IDQ7ICBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgICBiID0gYnVmW3AucG9zKytdOyBoIHw9IChiICYgMHg3ZikgPDwgMzsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuICAgIGIgPSBidWZbcC5wb3MrK107IGggfD0gKGIgJiAweDdmKSA8PCAxMDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCB8PSAoYiAmIDB4N2YpIDw8IDE3OyBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgICBiID0gYnVmW3AucG9zKytdOyBoIHw9IChiICYgMHg3ZikgPDwgMjQ7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuICAgIGIgPSBidWZbcC5wb3MrK107IGggfD0gKGIgJiAweDAxKSA8PCAzMTsgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrZWRFbmQocGJmKSB7XG4gICAgcmV0dXJuIHBiZi50eXBlID09PSBQYmYuQnl0ZXMgP1xuICAgICAgICBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyA6IHBiZi5wb3MgKyAxO1xufVxuXG5mdW5jdGlvbiB0b051bShsb3csIGhpZ2gsIGlzU2lnbmVkKSB7XG4gICAgaWYgKGlzU2lnbmVkKSB7XG4gICAgICAgIHJldHVybiBoaWdoICogMHgxMDAwMDAwMDAgKyAobG93ID4+PiAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKChoaWdoID4+PiAwKSAqIDB4MTAwMDAwMDAwKSArIChsb3cgPj4+IDApO1xufVxuXG5mdW5jdGlvbiB3cml0ZUJpZ1ZhcmludCh2YWwsIHBiZikge1xuICAgIHZhciBsb3csIGhpZ2g7XG5cbiAgICBpZiAodmFsID49IDApIHtcbiAgICAgICAgbG93ICA9ICh2YWwgJSAweDEwMDAwMDAwMCkgfCAwO1xuICAgICAgICBoaWdoID0gKHZhbCAvIDB4MTAwMDAwMDAwKSB8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG93ICA9IH4oLXZhbCAlIDB4MTAwMDAwMDAwKTtcbiAgICAgICAgaGlnaCA9IH4oLXZhbCAvIDB4MTAwMDAwMDAwKTtcblxuICAgICAgICBpZiAobG93IF4gMHhmZmZmZmZmZikge1xuICAgICAgICAgICAgbG93ID0gKGxvdyArIDEpIHwgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvdyA9IDA7XG4gICAgICAgICAgICBoaWdoID0gKGhpZ2ggKyAxKSB8IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsID49IDB4MTAwMDAwMDAwMDAwMDAwMDAgfHwgdmFsIDwgLTB4MTAwMDAwMDAwMDAwMDAwMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHaXZlbiB2YXJpbnQgZG9lc25cXCd0IGZpdCBpbnRvIDEwIGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgcGJmLnJlYWxsb2MoMTApO1xuXG4gICAgd3JpdGVCaWdWYXJpbnRMb3cobG93LCBoaWdoLCBwYmYpO1xuICAgIHdyaXRlQmlnVmFyaW50SGlnaChoaWdoLCBwYmYpO1xufVxuXG5mdW5jdGlvbiB3cml0ZUJpZ1ZhcmludExvdyhsb3csIGhpZ2gsIHBiZikge1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSA9IGxvdyAmIDB4N2YgfCAweDgwOyBsb3cgPj4+PSA3O1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSA9IGxvdyAmIDB4N2YgfCAweDgwOyBsb3cgPj4+PSA3O1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSA9IGxvdyAmIDB4N2YgfCAweDgwOyBsb3cgPj4+PSA3O1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSA9IGxvdyAmIDB4N2YgfCAweDgwOyBsb3cgPj4+PSA3O1xuICAgIHBiZi5idWZbcGJmLnBvc10gICA9IGxvdyAmIDB4N2Y7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmlnVmFyaW50SGlnaChoaWdoLCBwYmYpIHtcbiAgICB2YXIgbHNiID0gKGhpZ2ggJiAweDA3KSA8PCA0O1xuXG4gICAgcGJmLmJ1ZltwYmYucG9zKytdIHw9IGxzYiAgICAgICAgIHwgKChoaWdoID4+Pj0gMykgPyAweDgwIDogMCk7IGlmICghaGlnaCkgcmV0dXJuO1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSAgPSBoaWdoICYgMHg3ZiB8ICgoaGlnaCA+Pj49IDcpID8gMHg4MCA6IDApOyBpZiAoIWhpZ2gpIHJldHVybjtcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gID0gaGlnaCAmIDB4N2YgfCAoKGhpZ2ggPj4+PSA3KSA/IDB4ODAgOiAwKTsgaWYgKCFoaWdoKSByZXR1cm47XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdICA9IGhpZ2ggJiAweDdmIHwgKChoaWdoID4+Pj0gNykgPyAweDgwIDogMCk7IGlmICghaGlnaCkgcmV0dXJuO1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSAgPSBoaWdoICYgMHg3ZiB8ICgoaGlnaCA+Pj49IDcpID8gMHg4MCA6IDApOyBpZiAoIWhpZ2gpIHJldHVybjtcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gID0gaGlnaCAmIDB4N2Y7XG59XG5cbmZ1bmN0aW9uIG1ha2VSb29tRm9yRXh0cmFMZW5ndGgoc3RhcnRQb3MsIGxlbiwgcGJmKSB7XG4gICAgdmFyIGV4dHJhTGVuID1cbiAgICAgICAgbGVuIDw9IDB4M2ZmZiA/IDEgOlxuICAgICAgICBsZW4gPD0gMHgxZmZmZmYgPyAyIDpcbiAgICAgICAgbGVuIDw9IDB4ZmZmZmZmZiA/IDMgOiBNYXRoLmZsb29yKE1hdGgubG9nKGxlbikgLyAoTWF0aC5MTjIgKiA3KSk7XG5cbiAgICAvLyBpZiAxIGJ5dGUgaXNuJ3QgZW5vdWdoIGZvciBlbmNvZGluZyBtZXNzYWdlIGxlbmd0aCwgc2hpZnQgdGhlIGRhdGEgdG8gdGhlIHJpZ2h0XG4gICAgcGJmLnJlYWxsb2MoZXh0cmFMZW4pO1xuICAgIGZvciAodmFyIGkgPSBwYmYucG9zIC0gMTsgaSA+PSBzdGFydFBvczsgaS0tKSBwYmYuYnVmW2kgKyBleHRyYUxlbl0gPSBwYmYuYnVmW2ldO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBhY2tlZFZhcmludChhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVWYXJpbnQoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNWYXJpbnQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTVmFyaW50KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZsb2F0KGFyciwgcGJmKSAgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGbG9hdChhcnJbaV0pOyAgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZShhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVEb3VibGUoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEJvb2xlYW4oYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVCb29sZWFuKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkMzIoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDMyKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDMyKGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQzMihhcnJbaV0pOyB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDY0KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDY0KGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQ2NChhcnJbaV0pOyB9XG5cbi8vIEJ1ZmZlciBjb2RlIGJlbG93IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIsIE1JVC1saWNlbnNlZFxuXG5mdW5jdGlvbiByZWFkVUludDMyKGJ1ZiwgcG9zKSB7XG4gICAgcmV0dXJuICgoYnVmW3Bvc10pIHxcbiAgICAgICAgKGJ1Zltwb3MgKyAxXSA8PCA4KSB8XG4gICAgICAgIChidWZbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgIChidWZbcG9zICsgM10gKiAweDEwMDAwMDApO1xufVxuXG5mdW5jdGlvbiB3cml0ZUludDMyKGJ1ZiwgdmFsLCBwb3MpIHtcbiAgICBidWZbcG9zXSA9IHZhbDtcbiAgICBidWZbcG9zICsgMV0gPSAodmFsID4+PiA4KTtcbiAgICBidWZbcG9zICsgMl0gPSAodmFsID4+PiAxNik7XG4gICAgYnVmW3BvcyArIDNdID0gKHZhbCA+Pj4gMjQpO1xufVxuXG5mdW5jdGlvbiByZWFkSW50MzIoYnVmLCBwb3MpIHtcbiAgICByZXR1cm4gKChidWZbcG9zXSkgfFxuICAgICAgICAoYnVmW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgKGJ1Zltwb3MgKyAyXSA8PCAxNikpICtcbiAgICAgICAgKGJ1Zltwb3MgKyAzXSA8PCAyNCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRVdGY4KGJ1ZiwgcG9zLCBlbmQpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgdmFyIGkgPSBwb3M7XG5cbiAgICB3aGlsZSAoaSA8IGVuZCkge1xuICAgICAgICB2YXIgYjAgPSBidWZbaV07XG4gICAgICAgIHZhciBjID0gbnVsbDsgLy8gY29kZXBvaW50XG4gICAgICAgIHZhciBieXRlc1BlclNlcXVlbmNlID1cbiAgICAgICAgICAgIGIwID4gMHhFRiA/IDQgOlxuICAgICAgICAgICAgYjAgPiAweERGID8gMyA6XG4gICAgICAgICAgICBiMCA+IDB4QkYgPyAyIDogMTtcblxuICAgICAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPiBlbmQpIGJyZWFrO1xuXG4gICAgICAgIHZhciBiMSwgYjIsIGIzO1xuXG4gICAgICAgIGlmIChieXRlc1BlclNlcXVlbmNlID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoYjAgPCAweDgwKSB7XG4gICAgICAgICAgICAgICAgYyA9IGIwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGJ5dGVzUGVyU2VxdWVuY2UgPT09IDIpIHtcbiAgICAgICAgICAgIGIxID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgICAgIGMgPSAoYjAgJiAweDFGKSA8PCAweDYgfCAoYjEgJiAweDNGKTtcbiAgICAgICAgICAgICAgICBpZiAoYyA8PSAweDdGKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChieXRlc1BlclNlcXVlbmNlID09PSAzKSB7XG4gICAgICAgICAgICBiMSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICBiMiA9IGJ1ZltpICsgMl07XG4gICAgICAgICAgICBpZiAoKGIxICYgMHhDMCkgPT09IDB4ODAgJiYgKGIyICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgICBjID0gKGIwICYgMHhGKSA8PCAweEMgfCAoYjEgJiAweDNGKSA8PCAweDYgfCAoYjIgJiAweDNGKTtcbiAgICAgICAgICAgICAgICBpZiAoYyA8PSAweDdGRiB8fCAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChieXRlc1BlclNlcXVlbmNlID09PSA0KSB7XG4gICAgICAgICAgICBiMSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICBiMiA9IGJ1ZltpICsgMl07XG4gICAgICAgICAgICBiMyA9IGJ1ZltpICsgM107XG4gICAgICAgICAgICBpZiAoKGIxICYgMHhDMCkgPT09IDB4ODAgJiYgKGIyICYgMHhDMCkgPT09IDB4ODAgJiYgKGIzICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgICBjID0gKGIwICYgMHhGKSA8PCAweDEyIHwgKGIxICYgMHgzRikgPDwgMHhDIHwgKGIyICYgMHgzRikgPDwgMHg2IHwgKGIzICYgMHgzRik7XG4gICAgICAgICAgICAgICAgaWYgKGMgPD0gMHhGRkZGIHx8IGMgPj0gMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGMgPSAweEZGRkQ7XG4gICAgICAgICAgICBieXRlc1BlclNlcXVlbmNlID0gMTtcblxuICAgICAgICB9IGVsc2UgaWYgKGMgPiAweEZGRkYpIHtcbiAgICAgICAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuICAgICAgICAgICAgYyA9IDB4REMwMCB8IGMgJiAweDNGRjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gcmVhZFV0ZjhUZXh0RGVjb2RlcihidWYsIHBvcywgZW5kKSB7XG4gICAgcmV0dXJuIHV0ZjhUZXh0RGVjb2Rlci5kZWNvZGUoYnVmLnN1YmFycmF5KHBvcywgZW5kKSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlVXRmOChidWYsIHN0ciwgcG9zKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGMsIGxlYWQ7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpOyAvLyBjb2RlIHBvaW50XG5cbiAgICAgICAgaWYgKGMgPiAweEQ3RkYgJiYgYyA8IDB4RTAwMCkge1xuICAgICAgICAgICAgaWYgKGxlYWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA8IDB4REMwMCkge1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhFRjtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkY7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEJEO1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gYztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IGxlYWQgLSAweEQ4MDAgPDwgMTAgfCBjIC0gMHhEQzAwIHwgMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA+IDB4REJGRiB8fCAoaSArIDEgPT09IHN0ci5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEVGO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRjtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IGM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGxlYWQpIHtcbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEVGO1xuICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkY7XG4gICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRDtcbiAgICAgICAgICAgIGxlYWQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICBidWZbcG9zKytdID0gYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweDYgfCAweEMwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHhDIHwgMHhFMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweDEyIHwgMHhGMDtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHhDICYgMHgzRiB8IDB4ODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjID4+IDB4NiAmIDB4M0YgfCAweDgwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgJiAweDNGIHwgMHg4MDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcG9zO1xufVxuIixudWxsLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBvdHBhY2soYm94ZXMpIHtcblxuICAgIC8vIGNhbGN1bGF0ZSB0b3RhbCBib3ggYXJlYSBhbmQgbWF4aW11bSBib3ggd2lkdGhcbiAgICBsZXQgYXJlYSA9IDA7XG4gICAgbGV0IG1heFdpZHRoID0gMDtcblxuICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzKSB7XG4gICAgICAgIGFyZWEgKz0gYm94LncgKiBib3guaDtcbiAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgYm94LncpO1xuICAgIH1cblxuICAgIC8vIHNvcnQgdGhlIGJveGVzIGZvciBpbnNlcnRpb24gYnkgaGVpZ2h0LCBkZXNjZW5kaW5nXG4gICAgYm94ZXMuc29ydCgoYSwgYikgPT4gYi5oIC0gYS5oKTtcblxuICAgIC8vIGFpbSBmb3IgYSBzcXVhcmlzaCByZXN1bHRpbmcgY29udGFpbmVyLFxuICAgIC8vIHNsaWdodGx5IGFkanVzdGVkIGZvciBzdWItMTAwJSBzcGFjZSB1dGlsaXphdGlvblxuICAgIGNvbnN0IHN0YXJ0V2lkdGggPSBNYXRoLm1heChNYXRoLmNlaWwoTWF0aC5zcXJ0KGFyZWEgLyAwLjk1KSksIG1heFdpZHRoKTtcblxuICAgIC8vIHN0YXJ0IHdpdGggYSBzaW5nbGUgZW1wdHkgc3BhY2UsIHVuYm91bmRlZCBhdCB0aGUgYm90dG9tXG4gICAgY29uc3Qgc3BhY2VzID0gW3t4OiAwLCB5OiAwLCB3OiBzdGFydFdpZHRoLCBoOiBJbmZpbml0eX1dO1xuXG4gICAgbGV0IHdpZHRoID0gMDtcbiAgICBsZXQgaGVpZ2h0ID0gMDtcblxuICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzKSB7XG4gICAgICAgIC8vIGxvb2sgdGhyb3VnaCBzcGFjZXMgYmFja3dhcmRzIHNvIHRoYXQgd2UgY2hlY2sgc21hbGxlciBzcGFjZXMgZmlyc3RcbiAgICAgICAgZm9yIChsZXQgaSA9IHNwYWNlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3Qgc3BhY2UgPSBzcGFjZXNbaV07XG5cbiAgICAgICAgICAgIC8vIGxvb2sgZm9yIGVtcHR5IHNwYWNlcyB0aGF0IGNhbiBhY2NvbW1vZGF0ZSB0aGUgY3VycmVudCBib3hcbiAgICAgICAgICAgIGlmIChib3gudyA+IHNwYWNlLncgfHwgYm94LmggPiBzcGFjZS5oKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gZm91bmQgdGhlIHNwYWNlOyBhZGQgdGhlIGJveCB0byBpdHMgdG9wLWxlZnQgY29ybmVyXG4gICAgICAgICAgICAvLyB8LS0tLS0tLXwtLS0tLS0tfFxuICAgICAgICAgICAgLy8gfCAgYm94ICB8ICAgICAgIHxcbiAgICAgICAgICAgIC8vIHxfX19fX19ffCAgICAgICB8XG4gICAgICAgICAgICAvLyB8ICAgICAgICAgc3BhY2UgfFxuICAgICAgICAgICAgLy8gfF9fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgIGJveC54ID0gc3BhY2UueDtcbiAgICAgICAgICAgIGJveC55ID0gc3BhY2UueTtcblxuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBib3gueSArIGJveC5oKTtcbiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGJveC54ICsgYm94LncpO1xuXG4gICAgICAgICAgICBpZiAoYm94LncgPT09IHNwYWNlLncgJiYgYm94LmggPT09IHNwYWNlLmgpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGFjZSBtYXRjaGVzIHRoZSBib3ggZXhhY3RseTsgcmVtb3ZlIGl0XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IHNwYWNlcy5wb3AoKTtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IHNwYWNlcy5sZW5ndGgpIHNwYWNlc1tpXSA9IGxhc3Q7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm94LmggPT09IHNwYWNlLmgpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGFjZSBtYXRjaGVzIHRoZSBib3ggaGVpZ2h0OyB1cGRhdGUgaXQgYWNjb3JkaW5nbHlcbiAgICAgICAgICAgICAgICAvLyB8LS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18XG4gICAgICAgICAgICAgICAgLy8gfCAgYm94ICB8IHVwZGF0ZWQgc3BhY2UgfFxuICAgICAgICAgICAgICAgIC8vIHxfX19fX19ffF9fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICBzcGFjZS54ICs9IGJveC53O1xuICAgICAgICAgICAgICAgIHNwYWNlLncgLT0gYm94Lnc7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm94LncgPT09IHNwYWNlLncpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGFjZSBtYXRjaGVzIHRoZSBib3ggd2lkdGg7IHVwZGF0ZSBpdCBhY2NvcmRpbmdseVxuICAgICAgICAgICAgICAgIC8vIHwtLS0tLS0tLS0tLS0tLS18XG4gICAgICAgICAgICAgICAgLy8gfCAgICAgIGJveCAgICAgIHxcbiAgICAgICAgICAgICAgICAvLyB8X19fX19fX19fX19fX19ffFxuICAgICAgICAgICAgICAgIC8vIHwgdXBkYXRlZCBzcGFjZSB8XG4gICAgICAgICAgICAgICAgLy8gfF9fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICBzcGFjZS55ICs9IGJveC5oO1xuICAgICAgICAgICAgICAgIHNwYWNlLmggLT0gYm94Lmg7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBib3ggc3BsaXRzIHRoZSBzcGFjZSBpbnRvIHR3byBzcGFjZXNcbiAgICAgICAgICAgICAgICAvLyB8LS0tLS0tLXwtLS0tLS0tLS0tLXxcbiAgICAgICAgICAgICAgICAvLyB8ICBib3ggIHwgbmV3IHNwYWNlIHxcbiAgICAgICAgICAgICAgICAvLyB8X19fX19fX3xfX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICAvLyB8IHVwZGF0ZWQgc3BhY2UgICAgIHxcbiAgICAgICAgICAgICAgICAvLyB8X19fX19fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICBzcGFjZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHg6IHNwYWNlLnggKyBib3gudyxcbiAgICAgICAgICAgICAgICAgICAgeTogc3BhY2UueSxcbiAgICAgICAgICAgICAgICAgICAgdzogc3BhY2UudyAtIGJveC53LFxuICAgICAgICAgICAgICAgICAgICBoOiBib3guaFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHNwYWNlLnkgKz0gYm94Lmg7XG4gICAgICAgICAgICAgICAgc3BhY2UuaCAtPSBib3guaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdzogd2lkdGgsIC8vIGNvbnRhaW5lciB3aWR0aFxuICAgICAgICBoOiBoZWlnaHQsIC8vIGNvbnRhaW5lciBoZWlnaHRcbiAgICAgICAgZmlsbDogKGFyZWEgLyAod2lkdGggKiBoZWlnaHQpKSB8fCAwIC8vIHNwYWNlIHV0aWxpemF0aW9uXG4gICAgfTtcbn1cbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlueVF1ZXVlIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhID0gW10sIGNvbXBhcmUgPSBkZWZhdWx0Q29tcGFyZSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmU7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9ICh0aGlzLmxlbmd0aCA+PiAxKSAtIDE7IGkgPj0gMDsgaS0tKSB0aGlzLl9kb3duKGkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChpdGVtKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICB0aGlzLmxlbmd0aCsrO1xuICAgICAgICB0aGlzLl91cCh0aGlzLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIHBvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuZGF0YVswXTtcbiAgICAgICAgY29uc3QgYm90dG9tID0gdGhpcy5kYXRhLnBvcCgpO1xuICAgICAgICB0aGlzLmxlbmd0aC0tO1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVswXSA9IGJvdHRvbTtcbiAgICAgICAgICAgIHRoaXMuX2Rvd24oMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG9wO1xuICAgIH1cblxuICAgIHBlZWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFbMF07XG4gICAgfVxuXG4gICAgX3VwKHBvcykge1xuICAgICAgICBjb25zdCB7ZGF0YSwgY29tcGFyZX0gPSB0aGlzO1xuICAgICAgICBjb25zdCBpdGVtID0gZGF0YVtwb3NdO1xuXG4gICAgICAgIHdoaWxlIChwb3MgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSAocG9zIC0gMSkgPj4gMTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBkYXRhW3BhcmVudF07XG4gICAgICAgICAgICBpZiAoY29tcGFyZShpdGVtLCBjdXJyZW50KSA+PSAwKSBicmVhaztcbiAgICAgICAgICAgIGRhdGFbcG9zXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICBwb3MgPSBwYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW3Bvc10gPSBpdGVtO1xuICAgIH1cblxuICAgIF9kb3duKHBvcykge1xuICAgICAgICBjb25zdCB7ZGF0YSwgY29tcGFyZX0gPSB0aGlzO1xuICAgICAgICBjb25zdCBoYWxmTGVuZ3RoID0gdGhpcy5sZW5ndGggPj4gMTtcbiAgICAgICAgY29uc3QgaXRlbSA9IGRhdGFbcG9zXTtcblxuICAgICAgICB3aGlsZSAocG9zIDwgaGFsZkxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGxlZnQgPSAocG9zIDw8IDEpICsgMTtcbiAgICAgICAgICAgIGxldCBiZXN0ID0gZGF0YVtsZWZ0XTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gbGVmdCArIDE7XG5cbiAgICAgICAgICAgIGlmIChyaWdodCA8IHRoaXMubGVuZ3RoICYmIGNvbXBhcmUoZGF0YVtyaWdodF0sIGJlc3QpIDwgMCkge1xuICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodDtcbiAgICAgICAgICAgICAgICBiZXN0ID0gZGF0YVtyaWdodF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29tcGFyZShiZXN0LCBpdGVtKSA+PSAwKSBicmVhaztcblxuICAgICAgICAgICAgZGF0YVtwb3NdID0gYmVzdDtcbiAgICAgICAgICAgIHBvcyA9IGxlZnQ7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW3Bvc10gPSBpdGVtO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUoYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbn1cbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsImV4cG9ydCB7IGdldFVSTCwgZ2V0VGlsZUJCb3gsIGdldE1lcmNDb29yZHMgfTtcblxuXG4vKipcbiAqIGdldFVSTFxuICpcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgYmFzZVVybCAgQmFzZSB1cmwgb2YgdGhlIFdNUyBzZXJ2ZXJcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgbGF5ZXIgICAgTGF5ZXIgbmFtZVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB4ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB6ICAgICAgICBUaWxlIHpvb21cbiAqIEBwYXJhbSAgICB7T2JqZWN0fSAgW29wdGlvbnNdXG4gKiBAcGFyYW0gICAge1N0cmluZ30gIFtvcHRpb25zLmZvcm1hdD0naW1hZ2UvcG5nJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMuc2VydmljZT0nV01TJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMudmVyc2lvbj0nMS4xLjEnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5yZXF1ZXN0PSdHZXRNYXAnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5zcnM9J0VQU0c6Mzg1NyddXG4gKiBAcGFyYW0gICAge051bWJlcn0gIFtvcHRpb25zLndpZHRoPScyNTYnXVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICBbb3B0aW9ucy5oZWlnaHQ9JzI1NiddXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIHVybFxuICogQGV4YW1wbGVcbiAqIHZhciBiYXNlVXJsID0gJ2h0dHA6Ly9nZW9kYXRhLnN0YXRlLm5qLnVzL2ltYWdlcnl3bXMvTmF0dXJhbDIwMTUnO1xuICogdmFyIGxheWVyID0gJ05hdHVyYWwyMDE1JztcbiAqIHZhciB1cmwgPSB3aG9vdHMuZ2V0VVJMKGJhc2VVcmwsIGxheWVyLCAxNTQzMDgsIDE5NzE2NywgMTkpO1xuICovXG5mdW5jdGlvbiBnZXRVUkwoYmFzZVVybCwgbGF5ZXIsIHgsIHksIHosIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHZhciB1cmwgPSBiYXNlVXJsICsgJz8nICsgW1xuICAgICAgICAnYmJveD0nICAgICsgZ2V0VGlsZUJCb3goeCwgeSwgeiksXG4gICAgICAgICdmb3JtYXQ9JyAgKyAob3B0aW9ucy5mb3JtYXQgfHwgJ2ltYWdlL3BuZycpLFxuICAgICAgICAnc2VydmljZT0nICsgKG9wdGlvbnMuc2VydmljZSB8fCAnV01TJyksXG4gICAgICAgICd2ZXJzaW9uPScgKyAob3B0aW9ucy52ZXJzaW9uIHx8ICcxLjEuMScpLFxuICAgICAgICAncmVxdWVzdD0nICsgKG9wdGlvbnMucmVxdWVzdCB8fCAnR2V0TWFwJyksXG4gICAgICAgICdzcnM9JyAgICAgKyAob3B0aW9ucy5zcnMgfHwgJ0VQU0c6Mzg1NycpLFxuICAgICAgICAnd2lkdGg9JyAgICsgKG9wdGlvbnMud2lkdGggfHwgMjU2KSxcbiAgICAgICAgJ2hlaWdodD0nICArIChvcHRpb25zLmhlaWdodCB8fCAyNTYpLFxuICAgICAgICAnbGF5ZXJzPScgICsgbGF5ZXJcbiAgICBdLmpvaW4oJyYnKTtcblxuICAgIHJldHVybiB1cmw7XG59XG5cblxuLyoqXG4gKiBnZXRUaWxlQkJveFxuICpcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeCAgVGlsZSBjb29yZGluYXRlIHhcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeSAgVGlsZSBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIFN0cmluZyBvZiB0aGUgYm91bmRpbmcgYm94XG4gKi9cbmZ1bmN0aW9uIGdldFRpbGVCQm94KHgsIHksIHopIHtcbiAgICAvLyBmb3IgR29vZ2xlL09TTSB0aWxlIHNjaGVtZSB3ZSBuZWVkIHRvIGFsdGVyIHRoZSB5XG4gICAgeSA9IChNYXRoLnBvdygyLCB6KSAtIHkgLSAxKTtcblxuICAgIHZhciBtaW4gPSBnZXRNZXJjQ29vcmRzKHggKiAyNTYsIHkgKiAyNTYsIHopLFxuICAgICAgICBtYXggPSBnZXRNZXJjQ29vcmRzKCh4ICsgMSkgKiAyNTYsICh5ICsgMSkgKiAyNTYsIHopO1xuXG4gICAgcmV0dXJuIG1pblswXSArICcsJyArIG1pblsxXSArICcsJyArIG1heFswXSArICcsJyArIG1heFsxXTtcbn1cblxuXG4vKipcbiAqIGdldE1lcmNDb29yZHNcbiAqXG4gKiBAcGFyYW0gICAge051bWJlcn0gIHggIFBpeGVsIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICBQaXhlbCBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge0FycmF5fSAgIFt4LCB5XVxuICovXG5mdW5jdGlvbiBnZXRNZXJjQ29vcmRzKHgsIHksIHopIHtcbiAgICB2YXIgcmVzb2x1dGlvbiA9ICgyICogTWF0aC5QSSAqIDYzNzgxMzcgLyAyNTYpIC8gTWF0aC5wb3coMiwgeiksXG4gICAgICAgIG1lcmNfeCA9ICh4ICogcmVzb2x1dGlvbiAtIDIgKiBNYXRoLlBJICAqIDYzNzgxMzcgLyAyLjApLFxuICAgICAgICBtZXJjX3kgPSAoeSAqIHJlc29sdXRpb24gLSAyICogTWF0aC5QSSAgKiA2Mzc4MTM3IC8gMi4wKTtcblxuICAgIHJldHVybiBbbWVyY194LCBtZXJjX3ldO1xufVxuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCJcbm1vZHVsZS5leHBvcnRzID0gcmV3aW5kO1xuXG5mdW5jdGlvbiByZXdpbmQoZ2osIG91dGVyKSB7XG4gICAgdmFyIHR5cGUgPSBnaiAmJiBnai50eXBlLCBpO1xuXG4gICAgaWYgKHR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdqLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSByZXdpbmQoZ2ouZmVhdHVyZXNbaV0sIG91dGVyKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0dlb21ldHJ5Q29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdqLmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHJld2luZChnai5nZW9tZXRyaWVzW2ldLCBvdXRlcik7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICByZXdpbmQoZ2ouZ2VvbWV0cnksIG91dGVyKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIHJld2luZFJpbmdzKGdqLmNvb3JkaW5hdGVzLCBvdXRlcik7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnai5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykgcmV3aW5kUmluZ3MoZ2ouY29vcmRpbmF0ZXNbaV0sIG91dGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2o7XG59XG5cbmZ1bmN0aW9uIHJld2luZFJpbmdzKHJpbmdzLCBvdXRlcikge1xuICAgIGlmIChyaW5ncy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIHJld2luZFJpbmcocmluZ3NbMF0sIG91dGVyKTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJld2luZFJpbmcocmluZ3NbaV0sICFvdXRlcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZXdpbmRSaW5nKHJpbmcsIGRpcikge1xuICAgIHZhciBhcmVhID0gMCwgZXJyID0gMDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgIHZhciBrID0gKHJpbmdbaV1bMF0gLSByaW5nW2pdWzBdKSAqIChyaW5nW2pdWzFdICsgcmluZ1tpXVsxXSk7XG4gICAgICAgIHZhciBtID0gYXJlYSArIGs7XG4gICAgICAgIGVyciArPSBNYXRoLmFicyhhcmVhKSA+PSBNYXRoLmFicyhrKSA/IGFyZWEgLSBtICsgayA6IGsgLSBtICsgYXJlYTtcbiAgICAgICAgYXJlYSA9IG07XG4gICAgfVxuICAgIGlmIChhcmVhICsgZXJyID49IDAgIT09ICEhZGlyKSByaW5nLnJldmVyc2UoKTtcbn1cbiIsbnVsbCwiJ3VzZSBzdHJpY3QnXG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknKVxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnQG1hcGJveC92ZWN0b3ItdGlsZScpLlZlY3RvclRpbGVGZWF0dXJlXG5cbm1vZHVsZS5leHBvcnRzID0gR2VvSlNPTldyYXBwZXJcblxuLy8gY29uZm9ybSB0byB2ZWN0b3J0aWxlIGFwaVxuZnVuY3Rpb24gR2VvSlNPTldyYXBwZXIgKGZlYXR1cmVzLCBvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzXG4gIHRoaXMubGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoXG59XG5cbkdlb0pTT05XcmFwcGVyLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24gKGkpIHtcbiAgcmV0dXJuIG5ldyBGZWF0dXJlV3JhcHBlcih0aGlzLmZlYXR1cmVzW2ldLCB0aGlzLm9wdGlvbnMuZXh0ZW50KVxufVxuXG5mdW5jdGlvbiBGZWF0dXJlV3JhcHBlciAoZmVhdHVyZSwgZXh0ZW50KSB7XG4gIHRoaXMuaWQgPSB0eXBlb2YgZmVhdHVyZS5pZCA9PT0gJ251bWJlcicgPyBmZWF0dXJlLmlkIDogdW5kZWZpbmVkXG4gIHRoaXMudHlwZSA9IGZlYXR1cmUudHlwZVxuICB0aGlzLnJhd0dlb21ldHJ5ID0gZmVhdHVyZS50eXBlID09PSAxID8gW2ZlYXR1cmUuZ2VvbWV0cnldIDogZmVhdHVyZS5nZW9tZXRyeVxuICB0aGlzLnByb3BlcnRpZXMgPSBmZWF0dXJlLnRhZ3NcbiAgdGhpcy5leHRlbnQgPSBleHRlbnQgfHwgNDA5NlxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmluZ3MgPSB0aGlzLnJhd0dlb21ldHJ5XG4gIHRoaXMuZ2VvbWV0cnkgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG4gICAgdmFyIG5ld1JpbmcgPSBbXVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChyaW5nW2pdWzBdLCByaW5nW2pdWzFdKSlcbiAgICB9XG4gICAgdGhpcy5nZW9tZXRyeS5wdXNoKG5ld1JpbmcpXG4gIH1cbiAgcmV0dXJuIHRoaXMuZ2VvbWV0cnlcbn1cblxuRmVhdHVyZVdyYXBwZXIucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5nZW9tZXRyeSkgdGhpcy5sb2FkR2VvbWV0cnkoKVxuXG4gIHZhciByaW5ncyA9IHRoaXMuZ2VvbWV0cnlcbiAgdmFyIHgxID0gSW5maW5pdHlcbiAgdmFyIHgyID0gLUluZmluaXR5XG4gIHZhciB5MSA9IEluZmluaXR5XG4gIHZhciB5MiA9IC1JbmZpbml0eVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBjb29yZCA9IHJpbmdbal1cblxuICAgICAgeDEgPSBNYXRoLm1pbih4MSwgY29vcmQueClcbiAgICAgIHgyID0gTWF0aC5tYXgoeDIsIGNvb3JkLngpXG4gICAgICB5MSA9IE1hdGgubWluKHkxLCBjb29yZC55KVxuICAgICAgeTIgPSBNYXRoLm1heCh5MiwgY29vcmQueSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXVxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUudG9HZW9KU09OID0gVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTlxuIiwidmFyIFBiZiA9IHJlcXVpcmUoJ3BiZicpXG52YXIgR2VvSlNPTldyYXBwZXIgPSByZXF1aXJlKCcuL2xpYi9nZW9qc29uX3dyYXBwZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZyb21WZWN0b3JUaWxlSnNcbm1vZHVsZS5leHBvcnRzLmZyb21WZWN0b3JUaWxlSnMgPSBmcm9tVmVjdG9yVGlsZUpzXG5tb2R1bGUuZXhwb3J0cy5mcm9tR2VvanNvblZ0ID0gZnJvbUdlb2pzb25WdFxubW9kdWxlLmV4cG9ydHMuR2VvSlNPTldyYXBwZXIgPSBHZW9KU09OV3JhcHBlclxuXG4vKipcbiAqIFNlcmlhbGl6ZSBhIHZlY3Rvci10aWxlLWpzLWNyZWF0ZWQgdGlsZSB0byBwYmZcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGlsZVxuICogQHJldHVybiB7QnVmZmVyfSB1bmNvbXByZXNzZWQsIHBiZi1zZXJpYWxpemVkIHRpbGUgZGF0YVxuICovXG5mdW5jdGlvbiBmcm9tVmVjdG9yVGlsZUpzICh0aWxlKSB7XG4gIHZhciBvdXQgPSBuZXcgUGJmKClcbiAgd3JpdGVUaWxlKHRpbGUsIG91dClcbiAgcmV0dXJuIG91dC5maW5pc2goKVxufVxuXG4vKipcbiAqIFNlcmlhbGl6ZWQgYSBnZW9qc29uLXZ0LWNyZWF0ZWQgdGlsZSB0byBwYmYuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGxheWVycyAtIEFuIG9iamVjdCBtYXBwaW5nIGxheWVyIG5hbWVzIHRvIGdlb2pzb24tdnQtY3JlYXRlZCB2ZWN0b3IgdGlsZSBvYmplY3RzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIHZlY3Rvci10aWxlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBhbmQgZXh0ZW50IHRoYXQgd2VyZSB1c2VkIHRvIGNyZWF0ZSBgbGF5ZXJzYC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy52ZXJzaW9uPTFdIC0gVmVyc2lvbiBvZiB2ZWN0b3ItdGlsZSBzcGVjIHVzZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5leHRlbnQ9NDA5Nl0gLSBFeHRlbnQgb2YgdGhlIHZlY3RvciB0aWxlXG4gKiBAcmV0dXJuIHtCdWZmZXJ9IHVuY29tcHJlc3NlZCwgcGJmLXNlcmlhbGl6ZWQgdGlsZSBkYXRhXG4gKi9cbmZ1bmN0aW9uIGZyb21HZW9qc29uVnQgKGxheWVycywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgbCA9IHt9XG4gIGZvciAodmFyIGsgaW4gbGF5ZXJzKSB7XG4gICAgbFtrXSA9IG5ldyBHZW9KU09OV3JhcHBlcihsYXllcnNba10uZmVhdHVyZXMsIG9wdGlvbnMpXG4gICAgbFtrXS5uYW1lID0ga1xuICAgIGxba10udmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvblxuICAgIGxba10uZXh0ZW50ID0gb3B0aW9ucy5leHRlbnRcbiAgfVxuICByZXR1cm4gZnJvbVZlY3RvclRpbGVKcyh7IGxheWVyczogbCB9KVxufVxuXG5mdW5jdGlvbiB3cml0ZVRpbGUgKHRpbGUsIHBiZikge1xuICBmb3IgKHZhciBrZXkgaW4gdGlsZS5sYXllcnMpIHtcbiAgICBwYmYud3JpdGVNZXNzYWdlKDMsIHdyaXRlTGF5ZXIsIHRpbGUubGF5ZXJzW2tleV0pXG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVMYXllciAobGF5ZXIsIHBiZikge1xuICBwYmYud3JpdGVWYXJpbnRGaWVsZCgxNSwgbGF5ZXIudmVyc2lvbiB8fCAxKVxuICBwYmYud3JpdGVTdHJpbmdGaWVsZCgxLCBsYXllci5uYW1lIHx8ICcnKVxuICBwYmYud3JpdGVWYXJpbnRGaWVsZCg1LCBsYXllci5leHRlbnQgfHwgNDA5NilcblxuICB2YXIgaVxuICB2YXIgY29udGV4dCA9IHtcbiAgICBrZXlzOiBbXSxcbiAgICB2YWx1ZXM6IFtdLFxuICAgIGtleWNhY2hlOiB7fSxcbiAgICB2YWx1ZWNhY2hlOiB7fVxuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IGxheWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29udGV4dC5mZWF0dXJlID0gbGF5ZXIuZmVhdHVyZShpKVxuICAgIHBiZi53cml0ZU1lc3NhZ2UoMiwgd3JpdGVGZWF0dXJlLCBjb250ZXh0KVxuICB9XG5cbiAgdmFyIGtleXMgPSBjb250ZXh0LmtleXNcbiAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBwYmYud3JpdGVTdHJpbmdGaWVsZCgzLCBrZXlzW2ldKVxuICB9XG5cbiAgdmFyIHZhbHVlcyA9IGNvbnRleHQudmFsdWVzXG4gIGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBwYmYud3JpdGVNZXNzYWdlKDQsIHdyaXRlVmFsdWUsIHZhbHVlc1tpXSlcbiAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUZlYXR1cmUgKGNvbnRleHQsIHBiZikge1xuICB2YXIgZmVhdHVyZSA9IGNvbnRleHQuZmVhdHVyZVxuXG4gIGlmIChmZWF0dXJlLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYmYud3JpdGVWYXJpbnRGaWVsZCgxLCBmZWF0dXJlLmlkKVxuICB9XG5cbiAgcGJmLndyaXRlTWVzc2FnZSgyLCB3cml0ZVByb3BlcnRpZXMsIGNvbnRleHQpXG4gIHBiZi53cml0ZVZhcmludEZpZWxkKDMsIGZlYXR1cmUudHlwZSlcbiAgcGJmLndyaXRlTWVzc2FnZSg0LCB3cml0ZUdlb21ldHJ5LCBmZWF0dXJlKVxufVxuXG5mdW5jdGlvbiB3cml0ZVByb3BlcnRpZXMgKGNvbnRleHQsIHBiZikge1xuICB2YXIgZmVhdHVyZSA9IGNvbnRleHQuZmVhdHVyZVxuICB2YXIga2V5cyA9IGNvbnRleHQua2V5c1xuICB2YXIgdmFsdWVzID0gY29udGV4dC52YWx1ZXNcbiAgdmFyIGtleWNhY2hlID0gY29udGV4dC5rZXljYWNoZVxuICB2YXIgdmFsdWVjYWNoZSA9IGNvbnRleHQudmFsdWVjYWNoZVxuXG4gIGZvciAodmFyIGtleSBpbiBmZWF0dXJlLnByb3BlcnRpZXMpIHtcbiAgICB2YXIgdmFsdWUgPSBmZWF0dXJlLnByb3BlcnRpZXNba2V5XVxuXG4gICAgdmFyIGtleUluZGV4ID0ga2V5Y2FjaGVba2V5XVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgY29udGludWUgLy8gZG9uJ3QgZW5jb2RlIG51bGwgdmFsdWUgcHJvcGVydGllc1xuXG4gICAgaWYgKHR5cGVvZiBrZXlJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGtleXMucHVzaChrZXkpXG4gICAgICBrZXlJbmRleCA9IGtleXMubGVuZ3RoIC0gMVxuICAgICAga2V5Y2FjaGVba2V5XSA9IGtleUluZGV4XG4gICAgfVxuICAgIHBiZi53cml0ZVZhcmludChrZXlJbmRleClcblxuICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlXG4gICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnICYmIHR5cGUgIT09ICdib29sZWFuJyAmJiB0eXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgICB9XG4gICAgdmFyIHZhbHVlS2V5ID0gdHlwZSArICc6JyArIHZhbHVlXG4gICAgdmFyIHZhbHVlSW5kZXggPSB2YWx1ZWNhY2hlW3ZhbHVlS2V5XVxuICAgIGlmICh0eXBlb2YgdmFsdWVJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKVxuICAgICAgdmFsdWVJbmRleCA9IHZhbHVlcy5sZW5ndGggLSAxXG4gICAgICB2YWx1ZWNhY2hlW3ZhbHVlS2V5XSA9IHZhbHVlSW5kZXhcbiAgICB9XG4gICAgcGJmLndyaXRlVmFyaW50KHZhbHVlSW5kZXgpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWFuZCAoY21kLCBsZW5ndGgpIHtcbiAgcmV0dXJuIChsZW5ndGggPDwgMykgKyAoY21kICYgMHg3KVxufVxuXG5mdW5jdGlvbiB6aWd6YWcgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCAxKSBeIChudW0gPj4gMzEpXG59XG5cbmZ1bmN0aW9uIHdyaXRlR2VvbWV0cnkgKGZlYXR1cmUsIHBiZikge1xuICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmxvYWRHZW9tZXRyeSgpXG4gIHZhciB0eXBlID0gZmVhdHVyZS50eXBlXG4gIHZhciB4ID0gMFxuICB2YXIgeSA9IDBcbiAgdmFyIHJpbmdzID0gZ2VvbWV0cnkubGVuZ3RoXG4gIGZvciAodmFyIHIgPSAwOyByIDwgcmluZ3M7IHIrKykge1xuICAgIHZhciByaW5nID0gZ2VvbWV0cnlbcl1cbiAgICB2YXIgY291bnQgPSAxXG4gICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgIGNvdW50ID0gcmluZy5sZW5ndGhcbiAgICB9XG4gICAgcGJmLndyaXRlVmFyaW50KGNvbW1hbmQoMSwgY291bnQpKSAvLyBtb3ZldG9cbiAgICAvLyBkbyBub3Qgd3JpdGUgcG9seWdvbiBjbG9zaW5nIHBhdGggYXMgbGluZXRvXG4gICAgdmFyIGxpbmVDb3VudCA9IHR5cGUgPT09IDMgPyByaW5nLmxlbmd0aCAtIDEgOiByaW5nLmxlbmd0aFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHtcbiAgICAgIGlmIChpID09PSAxICYmIHR5cGUgIT09IDEpIHtcbiAgICAgICAgcGJmLndyaXRlVmFyaW50KGNvbW1hbmQoMiwgbGluZUNvdW50IC0gMSkpIC8vIGxpbmV0b1xuICAgICAgfVxuICAgICAgdmFyIGR4ID0gcmluZ1tpXS54IC0geFxuICAgICAgdmFyIGR5ID0gcmluZ1tpXS55IC0geVxuICAgICAgcGJmLndyaXRlVmFyaW50KHppZ3phZyhkeCkpXG4gICAgICBwYmYud3JpdGVWYXJpbnQoemlnemFnKGR5KSlcbiAgICAgIHggKz0gZHhcbiAgICAgIHkgKz0gZHlcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IDMpIHtcbiAgICAgIHBiZi53cml0ZVZhcmludChjb21tYW5kKDcsIDEpKSAvLyBjbG9zZXBhdGhcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVWYWx1ZSAodmFsdWUsIHBiZikge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZVxuICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBwYmYud3JpdGVTdHJpbmdGaWVsZCgxLCB2YWx1ZSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICBwYmYud3JpdGVCb29sZWFuRmllbGQoNywgdmFsdWUpXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodmFsdWUgJSAxICE9PSAwKSB7XG4gICAgICBwYmYud3JpdGVEb3VibGVGaWVsZCgzLCB2YWx1ZSlcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgcGJmLndyaXRlU1ZhcmludEZpZWxkKDYsIHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBwYmYud3JpdGVWYXJpbnRGaWVsZCg1LCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbGVmdCwgcmlnaHQsIGRlcHRoKSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA8PSBub2RlU2l6ZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbSA9IChsZWZ0ICsgcmlnaHQpID4+IDE7XG5cbiAgICBzZWxlY3QoaWRzLCBjb29yZHMsIG0sIGxlZnQsIHJpZ2h0LCBkZXB0aCAlIDIpO1xuXG4gICAgc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbGVmdCwgbSAtIDEsIGRlcHRoICsgMSk7XG4gICAgc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbSArIDEsIHJpZ2h0LCBkZXB0aCArIDEpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3QoaWRzLCBjb29yZHMsIGssIGxlZnQsIHJpZ2h0LCBpbmMpIHtcblxuICAgIHdoaWxlIChyaWdodCA+IGxlZnQpIHtcbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICAgICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICAgICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIHNlbGVjdChpZHMsIGNvb3JkcywgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGluYyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ID0gY29vcmRzWzIgKiBrICsgaW5jXTtcbiAgICAgICAgbGV0IGkgPSBsZWZ0O1xuICAgICAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBsZWZ0LCBrKTtcbiAgICAgICAgaWYgKGNvb3Jkc1syICogcmlnaHQgKyBpbmNdID4gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIHJpZ2h0KTtcblxuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBpLCBqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIHdoaWxlIChjb29yZHNbMiAqIGkgKyBpbmNdIDwgdCkgaSsrO1xuICAgICAgICAgICAgd2hpbGUgKGNvb3Jkc1syICogaiArIGluY10gPiB0KSBqLS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29vcmRzWzIgKiBsZWZ0ICsgaW5jXSA9PT0gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIGopO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBqLCByaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzd2FwSXRlbShpZHMsIGNvb3JkcywgaSwgaikge1xuICAgIHN3YXAoaWRzLCBpLCBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGksIDIgKiBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGkgKyAxLCAyICogaiArIDEpO1xufVxuXG5mdW5jdGlvbiBzd2FwKGFyciwgaSwgaikge1xuICAgIGNvbnN0IHRtcCA9IGFycltpXTtcbiAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgYXJyW2pdID0gdG1wO1xufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShpZHMsIGNvb3JkcywgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgbm9kZVNpemUpIHtcbiAgICBjb25zdCBzdGFjayA9IFswLCBpZHMubGVuZ3RoIC0gMSwgMF07XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IHgsIHk7XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGF4aXMgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPD0gbm9kZVNpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBsZWZ0OyBpIDw9IHJpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgICAgICB4ID0gY29vcmRzWzIgKiBpXTtcbiAgICAgICAgICAgICAgICB5ID0gY29vcmRzWzIgKiBpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKHggPj0gbWluWCAmJiB4IDw9IG1heFggJiYgeSA+PSBtaW5ZICYmIHkgPD0gbWF4WSkgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcblxuICAgICAgICB4ID0gY29vcmRzWzIgKiBtXTtcbiAgICAgICAgeSA9IGNvb3Jkc1syICogbSArIDFdO1xuXG4gICAgICAgIGlmICh4ID49IG1pblggJiYgeCA8PSBtYXhYICYmIHkgPj0gbWluWSAmJiB5IDw9IG1heFkpIHJlc3VsdC5wdXNoKGlkc1ttXSk7XG5cbiAgICAgICAgY29uc3QgbmV4dEF4aXMgPSAoYXhpcyArIDEpICUgMjtcblxuICAgICAgICBpZiAoYXhpcyA9PT0gMCA/IG1pblggPD0geCA6IG1pblkgPD0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChsZWZ0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSAtIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBtYXhYID49IHggOiBtYXhZID49IHkpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSArIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChyaWdodCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG5leHRBeGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdpdGhpbihpZHMsIGNvb3JkcywgcXgsIHF5LCByLCBub2RlU2l6ZSkge1xuICAgIGNvbnN0IHN0YWNrID0gWzAsIGlkcy5sZW5ndGggLSAxLCAwXTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCByMiA9IHIgKiByO1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBheGlzID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDw9IG5vZGVTaXplKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNxRGlzdChjb29yZHNbMiAqIGldLCBjb29yZHNbMiAqIGkgKyAxXSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcblxuICAgICAgICBjb25zdCB4ID0gY29vcmRzWzIgKiBtXTtcbiAgICAgICAgY29uc3QgeSA9IGNvb3Jkc1syICogbSArIDFdO1xuXG4gICAgICAgIGlmIChzcURpc3QoeCwgeSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW21dKTtcblxuICAgICAgICBjb25zdCBuZXh0QXhpcyA9IChheGlzICsgMSkgJSAyO1xuXG4gICAgICAgIGlmIChheGlzID09PSAwID8gcXggLSByIDw9IHggOiBxeSAtIHIgPD0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChsZWZ0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSAtIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBxeCArIHIgPj0geCA6IHF5ICsgciA+PSB5KSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG0gKyAxKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gocmlnaHQpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzcURpc3QoYXgsIGF5LCBieCwgYnkpIHtcbiAgICBjb25zdCBkeCA9IGF4IC0gYng7XG4gICAgY29uc3QgZHkgPSBheSAtIGJ5O1xuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn1cbiIsIlxuaW1wb3J0IHNvcnQgZnJvbSAnLi9zb3J0JztcbmltcG9ydCByYW5nZSBmcm9tICcuL3JhbmdlJztcbmltcG9ydCB3aXRoaW4gZnJvbSAnLi93aXRoaW4nO1xuXG5jb25zdCBkZWZhdWx0R2V0WCA9IHAgPT4gcFswXTtcbmNvbnN0IGRlZmF1bHRHZXRZID0gcCA9PiBwWzFdO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBLREJ1c2gge1xuICAgIGNvbnN0cnVjdG9yKHBvaW50cywgZ2V0WCA9IGRlZmF1bHRHZXRYLCBnZXRZID0gZGVmYXVsdEdldFksIG5vZGVTaXplID0gNjQsIEFycmF5VHlwZSA9IEZsb2F0NjRBcnJheSkge1xuICAgICAgICB0aGlzLm5vZGVTaXplID0gbm9kZVNpemU7XG4gICAgICAgIHRoaXMucG9pbnRzID0gcG9pbnRzO1xuXG4gICAgICAgIGNvbnN0IEluZGV4QXJyYXlUeXBlID0gcG9pbnRzLmxlbmd0aCA8IDY1NTM2ID8gVWludDE2QXJyYXkgOiBVaW50MzJBcnJheTtcblxuICAgICAgICBjb25zdCBpZHMgPSB0aGlzLmlkcyA9IG5ldyBJbmRleEFycmF5VHlwZShwb2ludHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5jb29yZHMgPSBuZXcgQXJyYXlUeXBlKHBvaW50cy5sZW5ndGggKiAyKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWRzW2ldID0gaTtcbiAgICAgICAgICAgIGNvb3Jkc1syICogaV0gPSBnZXRYKHBvaW50c1tpXSk7XG4gICAgICAgICAgICBjb29yZHNbMiAqIGkgKyAxXSA9IGdldFkocG9pbnRzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvcnQoaWRzLCBjb29yZHMsIG5vZGVTaXplLCAwLCBpZHMubGVuZ3RoIC0gMSwgMCk7XG4gICAgfVxuXG4gICAgcmFuZ2UobWluWCwgbWluWSwgbWF4WCwgbWF4WSkge1xuICAgICAgICByZXR1cm4gcmFuZ2UodGhpcy5pZHMsIHRoaXMuY29vcmRzLCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB0aGlzLm5vZGVTaXplKTtcbiAgICB9XG5cbiAgICB3aXRoaW4oeCwgeSwgcikge1xuICAgICAgICByZXR1cm4gd2l0aGluKHRoaXMuaWRzLCB0aGlzLmNvb3JkcywgeCwgeSwgciwgdGhpcy5ub2RlU2l6ZSk7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgS0RCdXNoIGZyb20gJ2tkYnVzaCc7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIG1pblpvb206IDAsICAgLy8gbWluIHpvb20gdG8gZ2VuZXJhdGUgY2x1c3RlcnMgb25cbiAgICBtYXhab29tOiAxNiwgIC8vIG1heCB6b29tIGxldmVsIHRvIGNsdXN0ZXIgdGhlIHBvaW50cyBvblxuICAgIG1pblBvaW50czogMiwgLy8gbWluaW11bSBwb2ludHMgdG8gZm9ybSBhIGNsdXN0ZXJcbiAgICByYWRpdXM6IDQwLCAgIC8vIGNsdXN0ZXIgcmFkaXVzIGluIHBpeGVsc1xuICAgIGV4dGVudDogNTEyLCAgLy8gdGlsZSBleHRlbnQgKHJhZGl1cyBpcyBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIGl0KVxuICAgIG5vZGVTaXplOiA2NCwgLy8gc2l6ZSBvZiB0aGUgS0QtdHJlZSBsZWFmIG5vZGUsIGFmZmVjdHMgcGVyZm9ybWFuY2VcbiAgICBsb2c6IGZhbHNlLCAgIC8vIHdoZXRoZXIgdG8gbG9nIHRpbWluZyBpbmZvXG5cbiAgICAvLyB3aGV0aGVyIHRvIGdlbmVyYXRlIG51bWVyaWMgaWRzIGZvciBpbnB1dCBmZWF0dXJlcyAoaW4gdmVjdG9yIHRpbGVzKVxuICAgIGdlbmVyYXRlSWQ6IGZhbHNlLFxuXG4gICAgLy8gYSByZWR1Y2UgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIGN1c3RvbSBjbHVzdGVyIHByb3BlcnRpZXNcbiAgICByZWR1Y2U6IG51bGwsIC8vIChhY2N1bXVsYXRlZCwgcHJvcHMpID0+IHsgYWNjdW11bGF0ZWQuc3VtICs9IHByb3BzLnN1bTsgfVxuXG4gICAgLy8gcHJvcGVydGllcyB0byB1c2UgZm9yIGluZGl2aWR1YWwgcG9pbnRzIHdoZW4gcnVubmluZyB0aGUgcmVkdWNlclxuICAgIG1hcDogcHJvcHMgPT4gcHJvcHMgLy8gcHJvcHMgPT4gKHtzdW06IHByb3BzLm15X3ZhbHVlfSlcbn07XG5cbmNvbnN0IGZyb3VuZCA9IE1hdGguZnJvdW5kIHx8ICh0bXAgPT4gKCh4KSA9PiB7IHRtcFswXSA9ICt4OyByZXR1cm4gdG1wWzBdOyB9KSkobmV3IEZsb2F0MzJBcnJheSgxKSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN1cGVyY2x1c3RlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZShkZWZhdWx0T3B0aW9ucyksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnRyZWVzID0gbmV3IEFycmF5KHRoaXMub3B0aW9ucy5tYXhab29tICsgMSk7XG4gICAgfVxuXG4gICAgbG9hZChwb2ludHMpIHtcbiAgICAgICAgY29uc3Qge2xvZywgbWluWm9vbSwgbWF4Wm9vbSwgbm9kZVNpemV9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICAgIGlmIChsb2cpIGNvbnNvbGUudGltZSgndG90YWwgdGltZScpO1xuXG4gICAgICAgIGNvbnN0IHRpbWVySWQgPSBgcHJlcGFyZSAkeyAgcG9pbnRzLmxlbmd0aCAgfSBwb2ludHNgO1xuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWUodGltZXJJZCk7XG5cbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG5cbiAgICAgICAgLy8gZ2VuZXJhdGUgYSBjbHVzdGVyIG9iamVjdCBmb3IgZWFjaCBwb2ludCBhbmQgaW5kZXggaW5wdXQgcG9pbnRzIGludG8gYSBLRC10cmVlXG4gICAgICAgIGxldCBjbHVzdGVycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFwb2ludHNbaV0uZ2VvbWV0cnkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY2x1c3RlcnMucHVzaChjcmVhdGVQb2ludENsdXN0ZXIocG9pbnRzW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmVlc1ttYXhab29tICsgMV0gPSBuZXcgS0RCdXNoKGNsdXN0ZXJzLCBnZXRYLCBnZXRZLCBub2RlU2l6ZSwgRmxvYXQzMkFycmF5KTtcblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWVFbmQodGltZXJJZCk7XG5cbiAgICAgICAgLy8gY2x1c3RlciBwb2ludHMgb24gbWF4IHpvb20sIHRoZW4gY2x1c3RlciB0aGUgcmVzdWx0cyBvbiBwcmV2aW91cyB6b29tLCBldGMuO1xuICAgICAgICAvLyByZXN1bHRzIGluIGEgY2x1c3RlciBoaWVyYXJjaHkgYWNyb3NzIHpvb20gbGV2ZWxzXG4gICAgICAgIGZvciAobGV0IHogPSBtYXhab29tOyB6ID49IG1pblpvb207IHotLSkge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gK0RhdGUubm93KCk7XG5cbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBzZXQgb2YgY2x1c3RlcnMgZm9yIHRoZSB6b29tIGFuZCBpbmRleCB0aGVtIHdpdGggYSBLRC10cmVlXG4gICAgICAgICAgICBjbHVzdGVycyA9IHRoaXMuX2NsdXN0ZXIoY2x1c3RlcnMsIHopO1xuICAgICAgICAgICAgdGhpcy50cmVlc1t6XSA9IG5ldyBLREJ1c2goY2x1c3RlcnMsIGdldFgsIGdldFksIG5vZGVTaXplLCBGbG9hdDMyQXJyYXkpO1xuXG4gICAgICAgICAgICBpZiAobG9nKSBjb25zb2xlLmxvZygneiVkOiAlZCBjbHVzdGVycyBpbiAlZG1zJywgeiwgY2x1c3RlcnMubGVuZ3RoLCArRGF0ZS5ub3coKSAtIG5vdyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWVFbmQoJ3RvdGFsIHRpbWUnKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXRDbHVzdGVycyhiYm94LCB6b29tKSB7XG4gICAgICAgIGxldCBtaW5MbmcgPSAoKGJib3hbMF0gKyAxODApICUgMzYwICsgMzYwKSAlIDM2MCAtIDE4MDtcbiAgICAgICAgY29uc3QgbWluTGF0ID0gTWF0aC5tYXgoLTkwLCBNYXRoLm1pbig5MCwgYmJveFsxXSkpO1xuICAgICAgICBsZXQgbWF4TG5nID0gYmJveFsyXSA9PT0gMTgwID8gMTgwIDogKChiYm94WzJdICsgMTgwKSAlIDM2MCArIDM2MCkgJSAzNjAgLSAxODA7XG4gICAgICAgIGNvbnN0IG1heExhdCA9IE1hdGgubWF4KC05MCwgTWF0aC5taW4oOTAsIGJib3hbM10pKTtcblxuICAgICAgICBpZiAoYmJveFsyXSAtIGJib3hbMF0gPj0gMzYwKSB7XG4gICAgICAgICAgICBtaW5MbmcgPSAtMTgwO1xuICAgICAgICAgICAgbWF4TG5nID0gMTgwO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbkxuZyA+IG1heExuZykge1xuICAgICAgICAgICAgY29uc3QgZWFzdGVybkhlbSA9IHRoaXMuZ2V0Q2x1c3RlcnMoW21pbkxuZywgbWluTGF0LCAxODAsIG1heExhdF0sIHpvb20pO1xuICAgICAgICAgICAgY29uc3Qgd2VzdGVybkhlbSA9IHRoaXMuZ2V0Q2x1c3RlcnMoWy0xODAsIG1pbkxhdCwgbWF4TG5nLCBtYXhMYXRdLCB6b29tKTtcbiAgICAgICAgICAgIHJldHVybiBlYXN0ZXJuSGVtLmNvbmNhdCh3ZXN0ZXJuSGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnRyZWVzW3RoaXMuX2xpbWl0Wm9vbSh6b29tKV07XG4gICAgICAgIGNvbnN0IGlkcyA9IHRyZWUucmFuZ2UobG5nWChtaW5MbmcpLCBsYXRZKG1heExhdCksIGxuZ1gobWF4TG5nKSwgbGF0WShtaW5MYXQpKTtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSB0cmVlLnBvaW50c1tpZF07XG4gICAgICAgICAgICBjbHVzdGVycy5wdXNoKGMubnVtUG9pbnRzID8gZ2V0Q2x1c3RlckpTT04oYykgOiB0aGlzLnBvaW50c1tjLmluZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsdXN0ZXJzO1xuICAgIH1cblxuICAgIGdldENoaWxkcmVuKGNsdXN0ZXJJZCkge1xuICAgICAgICBjb25zdCBvcmlnaW5JZCA9IHRoaXMuX2dldE9yaWdpbklkKGNsdXN0ZXJJZCk7XG4gICAgICAgIGNvbnN0IG9yaWdpblpvb20gPSB0aGlzLl9nZXRPcmlnaW5ab29tKGNsdXN0ZXJJZCk7XG4gICAgICAgIGNvbnN0IGVycm9yTXNnID0gJ05vIGNsdXN0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLic7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRyZWVzW29yaWdpblpvb21dO1xuICAgICAgICBpZiAoIWluZGV4KSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IGluZGV4LnBvaW50c1tvcmlnaW5JZF07XG4gICAgICAgIGlmICghb3JpZ2luKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuXG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLm9wdGlvbnMucmFkaXVzIC8gKHRoaXMub3B0aW9ucy5leHRlbnQgKiBNYXRoLnBvdygyLCBvcmlnaW5ab29tIC0gMSkpO1xuICAgICAgICBjb25zdCBpZHMgPSBpbmRleC53aXRoaW4ob3JpZ2luLngsIG9yaWdpbi55LCByKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBpbmRleC5wb2ludHNbaWRdO1xuICAgICAgICAgICAgaWYgKGMucGFyZW50SWQgPT09IGNsdXN0ZXJJZCkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goYy5udW1Qb2ludHMgPyBnZXRDbHVzdGVySlNPTihjKSA6IHRoaXMucG9pbnRzW2MuaW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cblxuICAgIGdldExlYXZlcyhjbHVzdGVySWQsIGxpbWl0LCBvZmZzZXQpIHtcbiAgICAgICAgbGltaXQgPSBsaW1pdCB8fCAxMDtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICAgICAgY29uc3QgbGVhdmVzID0gW107XG4gICAgICAgIHRoaXMuX2FwcGVuZExlYXZlcyhsZWF2ZXMsIGNsdXN0ZXJJZCwgbGltaXQsIG9mZnNldCwgMCk7XG5cbiAgICAgICAgcmV0dXJuIGxlYXZlcztcbiAgICB9XG5cbiAgICBnZXRUaWxlKHosIHgsIHkpIHtcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMudHJlZXNbdGhpcy5fbGltaXRab29tKHopXTtcbiAgICAgICAgY29uc3QgejIgPSBNYXRoLnBvdygyLCB6KTtcbiAgICAgICAgY29uc3Qge2V4dGVudCwgcmFkaXVzfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgcCA9IHJhZGl1cyAvIGV4dGVudDtcbiAgICAgICAgY29uc3QgdG9wID0gKHkgLSBwKSAvIHoyO1xuICAgICAgICBjb25zdCBib3R0b20gPSAoeSArIDEgKyBwKSAvIHoyO1xuXG4gICAgICAgIGNvbnN0IHRpbGUgPSB7XG4gICAgICAgICAgICBmZWF0dXJlczogW11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9hZGRUaWxlRmVhdHVyZXMoXG4gICAgICAgICAgICB0cmVlLnJhbmdlKCh4IC0gcCkgLyB6MiwgdG9wLCAoeCArIDEgKyBwKSAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgdHJlZS5wb2ludHMsIHgsIHksIHoyLCB0aWxlKTtcblxuICAgICAgICBpZiAoeCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fYWRkVGlsZUZlYXR1cmVzKFxuICAgICAgICAgICAgICAgIHRyZWUucmFuZ2UoMSAtIHAgLyB6MiwgdG9wLCAxLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCB6MiwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4ID09PSB6MiAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRpbGVGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICB0cmVlLnJhbmdlKDAsIHRvcCwgcCAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCAtMSwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbGUuZmVhdHVyZXMubGVuZ3RoID8gdGlsZSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20oY2x1c3RlcklkKSB7XG4gICAgICAgIGxldCBleHBhbnNpb25ab29tID0gdGhpcy5fZ2V0T3JpZ2luWm9vbShjbHVzdGVySWQpIC0gMTtcbiAgICAgICAgd2hpbGUgKGV4cGFuc2lvblpvb20gPD0gdGhpcy5vcHRpb25zLm1heFpvb20pIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbihjbHVzdGVySWQpO1xuICAgICAgICAgICAgZXhwYW5zaW9uWm9vbSsrO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCAhPT0gMSkgYnJlYWs7XG4gICAgICAgICAgICBjbHVzdGVySWQgPSBjaGlsZHJlblswXS5wcm9wZXJ0aWVzLmNsdXN0ZXJfaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4cGFuc2lvblpvb207XG4gICAgfVxuXG4gICAgX2FwcGVuZExlYXZlcyhyZXN1bHQsIGNsdXN0ZXJJZCwgbGltaXQsIG9mZnNldCwgc2tpcHBlZCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oY2x1c3RlcklkKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGNoaWxkLnByb3BlcnRpZXM7XG5cbiAgICAgICAgICAgIGlmIChwcm9wcyAmJiBwcm9wcy5jbHVzdGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQgKyBwcm9wcy5wb2ludF9jb3VudCA8PSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgd2hvbGUgY2x1c3RlclxuICAgICAgICAgICAgICAgICAgICBza2lwcGVkICs9IHByb3BzLnBvaW50X2NvdW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVudGVyIHRoZSBjbHVzdGVyXG4gICAgICAgICAgICAgICAgICAgIHNraXBwZWQgPSB0aGlzLl9hcHBlbmRMZWF2ZXMocmVzdWx0LCBwcm9wcy5jbHVzdGVyX2lkLCBsaW1pdCwgb2Zmc2V0LCBza2lwcGVkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhpdCB0aGUgY2x1c3RlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2tpcHBlZCA8IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgYSBzaW5nbGUgcG9pbnRcbiAgICAgICAgICAgICAgICBza2lwcGVkKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGFkZCBhIHNpbmdsZSBwb2ludFxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSBsaW1pdCkgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2tpcHBlZDtcbiAgICB9XG5cbiAgICBfYWRkVGlsZUZlYXR1cmVzKGlkcywgcG9pbnRzLCB4LCB5LCB6MiwgdGlsZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaWRzKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgY29uc3QgaXNDbHVzdGVyID0gYy5udW1Qb2ludHM7XG5cbiAgICAgICAgICAgIGxldCB0YWdzLCBweCwgcHk7XG4gICAgICAgICAgICBpZiAoaXNDbHVzdGVyKSB7XG4gICAgICAgICAgICAgICAgdGFncyA9IGdldENsdXN0ZXJQcm9wZXJ0aWVzKGMpO1xuICAgICAgICAgICAgICAgIHB4ID0gYy54O1xuICAgICAgICAgICAgICAgIHB5ID0gYy55O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gdGhpcy5wb2ludHNbYy5pbmRleF07XG4gICAgICAgICAgICAgICAgdGFncyA9IHAucHJvcGVydGllcztcbiAgICAgICAgICAgICAgICBweCA9IGxuZ1gocC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSk7XG4gICAgICAgICAgICAgICAgcHkgPSBsYXRZKHAuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IFtbXG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQodGhpcy5vcHRpb25zLmV4dGVudCAqIChweCAqIHoyIC0geCkpLFxuICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHRoaXMub3B0aW9ucy5leHRlbnQgKiAocHkgKiB6MiAtIHkpKVxuICAgICAgICAgICAgICAgIF1dLFxuICAgICAgICAgICAgICAgIHRhZ3NcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIGFzc2lnbiBpZFxuICAgICAgICAgICAgbGV0IGlkO1xuICAgICAgICAgICAgaWYgKGlzQ2x1c3Rlcikge1xuICAgICAgICAgICAgICAgIGlkID0gYy5pZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmdlbmVyYXRlSWQpIHtcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25hbGx5IGdlbmVyYXRlIGlkXG4gICAgICAgICAgICAgICAgaWQgPSBjLmluZGV4O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBvaW50c1tjLmluZGV4XS5pZCkge1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgaWQgaWYgYWxyZWFkeSBhc3NpZ25lZFxuICAgICAgICAgICAgICAgIGlkID0gdGhpcy5wb2ludHNbYy5pbmRleF0uaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSBmLmlkID0gaWQ7XG5cbiAgICAgICAgICAgIHRpbGUuZmVhdHVyZXMucHVzaChmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9saW1pdFpvb20oeikge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5vcHRpb25zLm1pblpvb20sIE1hdGgubWluKCt6LCB0aGlzLm9wdGlvbnMubWF4Wm9vbSArIDEpKTtcbiAgICB9XG5cbiAgICBfY2x1c3Rlcihwb2ludHMsIHpvb20pIHtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBbXTtcbiAgICAgICAgY29uc3Qge3JhZGl1cywgZXh0ZW50LCByZWR1Y2UsIG1pblBvaW50c30gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHIgPSByYWRpdXMgLyAoZXh0ZW50ICogTWF0aC5wb3coMiwgem9vbSkpO1xuXG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBlYWNoIHBvaW50XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSB2aXNpdGVkIHRoZSBwb2ludCBhdCB0aGlzIHpvb20gbGV2ZWwsIHNraXAgaXRcbiAgICAgICAgICAgIGlmIChwLnpvb20gPD0gem9vbSkgY29udGludWU7XG4gICAgICAgICAgICBwLnpvb20gPSB6b29tO1xuXG4gICAgICAgICAgICAvLyBmaW5kIGFsbCBuZWFyYnkgcG9pbnRzXG4gICAgICAgICAgICBjb25zdCB0cmVlID0gdGhpcy50cmVlc1t6b29tICsgMV07XG4gICAgICAgICAgICBjb25zdCBuZWlnaGJvcklkcyA9IHRyZWUud2l0aGluKHAueCwgcC55LCByKTtcblxuICAgICAgICAgICAgY29uc3QgbnVtUG9pbnRzT3JpZ2luID0gcC5udW1Qb2ludHMgfHwgMTtcbiAgICAgICAgICAgIGxldCBudW1Qb2ludHMgPSBudW1Qb2ludHNPcmlnaW47XG5cbiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcG9pbnRzIGluIGEgcG90ZW50aWFsIGNsdXN0ZXJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmVpZ2hib3JJZCBvZiBuZWlnaGJvcklkcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkXTtcbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IG5laWdoYm9ycyB0aGF0IGFyZSBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgICAgICAgICAgIGlmIChiLnpvb20gPiB6b29tKSBudW1Qb2ludHMgKz0gYi5udW1Qb2ludHMgfHwgMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2VyZSBuZWlnaGJvcnMgdG8gbWVyZ2UsIGFuZCB0aGVyZSBhcmUgZW5vdWdoIHBvaW50cyB0byBmb3JtIGEgY2x1c3RlclxuICAgICAgICAgICAgaWYgKG51bVBvaW50cyA+IG51bVBvaW50c09yaWdpbiAmJiBudW1Qb2ludHMgPj0gbWluUG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHd4ID0gcC54ICogbnVtUG9pbnRzT3JpZ2luO1xuICAgICAgICAgICAgICAgIGxldCB3eSA9IHAueSAqIG51bVBvaW50c09yaWdpbjtcblxuICAgICAgICAgICAgICAgIGxldCBjbHVzdGVyUHJvcGVydGllcyA9IHJlZHVjZSAmJiBudW1Qb2ludHNPcmlnaW4gPiAxID8gdGhpcy5fbWFwKHAsIHRydWUpIDogbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vIGVuY29kZSBib3RoIHpvb20gYW5kIHBvaW50IGluZGV4IG9uIHdoaWNoIHRoZSBjbHVzdGVyIG9yaWdpbmF0ZWQgLS0gb2Zmc2V0IGJ5IHRvdGFsIGxlbmd0aCBvZiBmZWF0dXJlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gKGkgPDwgNSkgKyAoem9vbSArIDEpICsgdGhpcy5wb2ludHMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuZWlnaGJvcklkIG9mIG5laWdoYm9ySWRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYi56b29tIDw9IHpvb20pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBiLnpvb20gPSB6b29tOyAvLyBzYXZlIHRoZSB6b29tIChzbyBpdCBkb2Vzbid0IGdldCBwcm9jZXNzZWQgdHdpY2UpXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtUG9pbnRzMiA9IGIubnVtUG9pbnRzIHx8IDE7XG4gICAgICAgICAgICAgICAgICAgIHd4ICs9IGIueCAqIG51bVBvaW50czI7IC8vIGFjY3VtdWxhdGUgY29vcmRpbmF0ZXMgZm9yIGNhbGN1bGF0aW5nIHdlaWdodGVkIGNlbnRlclxuICAgICAgICAgICAgICAgICAgICB3eSArPSBiLnkgKiBudW1Qb2ludHMyO1xuXG4gICAgICAgICAgICAgICAgICAgIGIucGFyZW50SWQgPSBpZDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVkdWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsdXN0ZXJQcm9wZXJ0aWVzKSBjbHVzdGVyUHJvcGVydGllcyA9IHRoaXMuX21hcChwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZShjbHVzdGVyUHJvcGVydGllcywgdGhpcy5fbWFwKGIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHAucGFyZW50SWQgPSBpZDtcbiAgICAgICAgICAgICAgICBjbHVzdGVycy5wdXNoKGNyZWF0ZUNsdXN0ZXIod3ggLyBudW1Qb2ludHMsIHd5IC8gbnVtUG9pbnRzLCBpZCwgbnVtUG9pbnRzLCBjbHVzdGVyUHJvcGVydGllcykpO1xuXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBsZWZ0IHBvaW50cyBhcyB1bmNsdXN0ZXJlZFxuICAgICAgICAgICAgICAgIGNsdXN0ZXJzLnB1c2gocCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobnVtUG9pbnRzID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5laWdoYm9ySWQgb2YgbmVpZ2hib3JJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLnpvb20gPD0gem9vbSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBiLnpvb20gPSB6b29tO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnMucHVzaChiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjbHVzdGVycztcbiAgICB9XG5cbiAgICAvLyBnZXQgaW5kZXggb2YgdGhlIHBvaW50IGZyb20gd2hpY2ggdGhlIGNsdXN0ZXIgb3JpZ2luYXRlZFxuICAgIF9nZXRPcmlnaW5JZChjbHVzdGVySWQpIHtcbiAgICAgICAgcmV0dXJuIChjbHVzdGVySWQgLSB0aGlzLnBvaW50cy5sZW5ndGgpID4+IDU7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHpvb20gb2YgdGhlIHBvaW50IGZyb20gd2hpY2ggdGhlIGNsdXN0ZXIgb3JpZ2luYXRlZFxuICAgIF9nZXRPcmlnaW5ab29tKGNsdXN0ZXJJZCkge1xuICAgICAgICByZXR1cm4gKGNsdXN0ZXJJZCAtIHRoaXMucG9pbnRzLmxlbmd0aCkgJSAzMjtcbiAgICB9XG5cbiAgICBfbWFwKHBvaW50LCBjbG9uZSkge1xuICAgICAgICBpZiAocG9pbnQubnVtUG9pbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvbmUgPyBleHRlbmQoe30sIHBvaW50LnByb3BlcnRpZXMpIDogcG9pbnQucHJvcGVydGllcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmlnaW5hbCA9IHRoaXMucG9pbnRzW3BvaW50LmluZGV4XS5wcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm9wdGlvbnMubWFwKG9yaWdpbmFsKTtcbiAgICAgICAgcmV0dXJuIGNsb25lICYmIHJlc3VsdCA9PT0gb3JpZ2luYWwgPyBleHRlbmQoe30sIHJlc3VsdCkgOiByZXN1bHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDbHVzdGVyKHgsIHksIGlkLCBudW1Qb2ludHMsIHByb3BlcnRpZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBmcm91bmQoeCksIC8vIHdlaWdodGVkIGNsdXN0ZXIgY2VudGVyOyByb3VuZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBGbG9hdDMyQXJyYXkgaW5kZXhcbiAgICAgICAgeTogZnJvdW5kKHkpLFxuICAgICAgICB6b29tOiBJbmZpbml0eSwgLy8gdGhlIGxhc3Qgem9vbSB0aGUgY2x1c3RlciB3YXMgcHJvY2Vzc2VkIGF0XG4gICAgICAgIGlkLCAvLyBlbmNvZGVzIGluZGV4IG9mIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY2x1c3RlciBhbmQgaXRzIHpvb20gbGV2ZWxcbiAgICAgICAgcGFyZW50SWQ6IC0xLCAvLyBwYXJlbnQgY2x1c3RlciBpZFxuICAgICAgICBudW1Qb2ludHMsXG4gICAgICAgIHByb3BlcnRpZXNcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQb2ludENsdXN0ZXIocCwgaWQpIHtcbiAgICBjb25zdCBbeCwgeV0gPSBwLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGZyb3VuZChsbmdYKHgpKSwgLy8gcHJvamVjdGVkIHBvaW50IGNvb3JkaW5hdGVzXG4gICAgICAgIHk6IGZyb3VuZChsYXRZKHkpKSxcbiAgICAgICAgem9vbTogSW5maW5pdHksIC8vIHRoZSBsYXN0IHpvb20gdGhlIHBvaW50IHdhcyBwcm9jZXNzZWQgYXRcbiAgICAgICAgaW5kZXg6IGlkLCAvLyBpbmRleCBvZiB0aGUgc291cmNlIGZlYXR1cmUgaW4gdGhlIG9yaWdpbmFsIGlucHV0IGFycmF5LFxuICAgICAgICBwYXJlbnRJZDogLTEgLy8gcGFyZW50IGNsdXN0ZXIgaWRcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDbHVzdGVySlNPTihjbHVzdGVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICBpZDogY2x1c3Rlci5pZCxcbiAgICAgICAgcHJvcGVydGllczogZ2V0Q2x1c3RlclByb3BlcnRpZXMoY2x1c3RlciksXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IFt4TG5nKGNsdXN0ZXIueCksIHlMYXQoY2x1c3Rlci55KV1cbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldENsdXN0ZXJQcm9wZXJ0aWVzKGNsdXN0ZXIpIHtcbiAgICBjb25zdCBjb3VudCA9IGNsdXN0ZXIubnVtUG9pbnRzO1xuICAgIGNvbnN0IGFiYnJldiA9XG4gICAgICAgIGNvdW50ID49IDEwMDAwID8gYCR7TWF0aC5yb3VuZChjb3VudCAvIDEwMDApICB9a2AgOlxuICAgICAgICBjb3VudCA+PSAxMDAwID8gYCR7TWF0aC5yb3VuZChjb3VudCAvIDEwMCkgLyAxMCAgfWtgIDogY291bnQ7XG4gICAgcmV0dXJuIGV4dGVuZChleHRlbmQoe30sIGNsdXN0ZXIucHJvcGVydGllcyksIHtcbiAgICAgICAgY2x1c3RlcjogdHJ1ZSxcbiAgICAgICAgY2x1c3Rlcl9pZDogY2x1c3Rlci5pZCxcbiAgICAgICAgcG9pbnRfY291bnQ6IGNvdW50LFxuICAgICAgICBwb2ludF9jb3VudF9hYmJyZXZpYXRlZDogYWJicmV2XG4gICAgfSk7XG59XG5cbi8vIGxvbmdpdHVkZS9sYXRpdHVkZSB0byBzcGhlcmljYWwgbWVyY2F0b3IgaW4gWzAuLjFdIHJhbmdlXG5mdW5jdGlvbiBsbmdYKGxuZykge1xuICAgIHJldHVybiBsbmcgLyAzNjAgKyAwLjU7XG59XG5mdW5jdGlvbiBsYXRZKGxhdCkge1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGxhdCAqIE1hdGguUEkgLyAxODApO1xuICAgIGNvbnN0IHkgPSAoMC41IC0gMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkgLyBNYXRoLlBJKTtcbiAgICByZXR1cm4geSA8IDAgPyAwIDogeSA+IDEgPyAxIDogeTtcbn1cblxuLy8gc3BoZXJpY2FsIG1lcmNhdG9yIHRvIGxvbmdpdHVkZS9sYXRpdHVkZVxuZnVuY3Rpb24geExuZyh4KSB7XG4gICAgcmV0dXJuICh4IC0gMC41KSAqIDM2MDtcbn1cbmZ1bmN0aW9uIHlMYXQoeSkge1xuICAgIGNvbnN0IHkyID0gKDE4MCAtIHkgKiAzNjApICogTWF0aC5QSSAvIDE4MDtcbiAgICByZXR1cm4gMzYwICogTWF0aC5hdGFuKE1hdGguZXhwKHkyKSkgLyBNYXRoLlBJIC0gOTA7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKGNvbnN0IGlkIGluIHNyYykgZGVzdFtpZF0gPSBzcmNbaWRdO1xuICAgIHJldHVybiBkZXN0O1xufVxuXG5mdW5jdGlvbiBnZXRYKHApIHtcbiAgICByZXR1cm4gcC54O1xufVxuZnVuY3Rpb24gZ2V0WShwKSB7XG4gICAgcmV0dXJuIHAueTtcbn1cbiIsIlxuLy8gY2FsY3VsYXRlIHNpbXBsaWZpY2F0aW9uIGRhdGEgdXNpbmcgb3B0aW1pemVkIERvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2ltcGxpZnkoY29vcmRzLCBmaXJzdCwgbGFzdCwgc3FUb2xlcmFuY2UpIHtcbiAgICB2YXIgbWF4U3FEaXN0ID0gc3FUb2xlcmFuY2U7XG4gICAgdmFyIG1pZCA9IChsYXN0IC0gZmlyc3QpID4+IDE7XG4gICAgdmFyIG1pblBvc1RvTWlkID0gbGFzdCAtIGZpcnN0O1xuICAgIHZhciBpbmRleDtcblxuICAgIHZhciBheCA9IGNvb3Jkc1tmaXJzdF07XG4gICAgdmFyIGF5ID0gY29vcmRzW2ZpcnN0ICsgMV07XG4gICAgdmFyIGJ4ID0gY29vcmRzW2xhc3RdO1xuICAgIHZhciBieSA9IGNvb3Jkc1tsYXN0ICsgMV07XG5cbiAgICBmb3IgKHZhciBpID0gZmlyc3QgKyAzOyBpIDwgbGFzdDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBkID0gZ2V0U3FTZWdEaXN0KGNvb3Jkc1tpXSwgY29vcmRzW2kgKyAxXSwgYXgsIGF5LCBieCwgYnkpO1xuXG4gICAgICAgIGlmIChkID4gbWF4U3FEaXN0KSB7XG4gICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICBtYXhTcURpc3QgPSBkO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZCA9PT0gbWF4U3FEaXN0KSB7XG4gICAgICAgICAgICAvLyBhIHdvcmthcm91bmQgdG8gZW5zdXJlIHdlIGNob29zZSBhIHBpdm90IGNsb3NlIHRvIHRoZSBtaWRkbGUgb2YgdGhlIGxpc3QsXG4gICAgICAgICAgICAvLyByZWR1Y2luZyByZWN1cnNpb24gZGVwdGgsIGZvciBjZXJ0YWluIGRlZ2VuZXJhdGUgaW5wdXRzXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L2dlb2pzb24tdnQvaXNzdWVzLzEwNFxuICAgICAgICAgICAgdmFyIHBvc1RvTWlkID0gTWF0aC5hYnMoaSAtIG1pZCk7XG4gICAgICAgICAgICBpZiAocG9zVG9NaWQgPCBtaW5Qb3NUb01pZCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBtaW5Qb3NUb01pZCA9IHBvc1RvTWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1heFNxRGlzdCA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgIGlmIChpbmRleCAtIGZpcnN0ID4gMykgc2ltcGxpZnkoY29vcmRzLCBmaXJzdCwgaW5kZXgsIHNxVG9sZXJhbmNlKTtcbiAgICAgICAgY29vcmRzW2luZGV4ICsgMl0gPSBtYXhTcURpc3Q7XG4gICAgICAgIGlmIChsYXN0IC0gaW5kZXggPiAzKSBzaW1wbGlmeShjb29yZHMsIGluZGV4LCBsYXN0LCBzcVRvbGVyYW5jZSk7XG4gICAgfVxufVxuXG4vLyBzcXVhcmUgZGlzdGFuY2UgZnJvbSBhIHBvaW50IHRvIGEgc2VnbWVudFxuZnVuY3Rpb24gZ2V0U3FTZWdEaXN0KHB4LCBweSwgeCwgeSwgYngsIGJ5KSB7XG5cbiAgICB2YXIgZHggPSBieCAtIHg7XG4gICAgdmFyIGR5ID0gYnkgLSB5O1xuXG4gICAgaWYgKGR4ICE9PSAwIHx8IGR5ICE9PSAwKSB7XG5cbiAgICAgICAgdmFyIHQgPSAoKHB4IC0geCkgKiBkeCArIChweSAtIHkpICogZHkpIC8gKGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgICAgIHggPSBieDtcbiAgICAgICAgICAgIHkgPSBieTtcblxuICAgICAgICB9IGVsc2UgaWYgKHQgPiAwKSB7XG4gICAgICAgICAgICB4ICs9IGR4ICogdDtcbiAgICAgICAgICAgIHkgKz0gZHkgKiB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHggPSBweCAtIHg7XG4gICAgZHkgPSBweSAtIHk7XG5cbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZUZlYXR1cmUoaWQsIHR5cGUsIGdlb20sIHRhZ3MpIHtcbiAgICB2YXIgZmVhdHVyZSA9IHtcbiAgICAgICAgaWQ6IHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogaWQsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGdlb21ldHJ5OiBnZW9tLFxuICAgICAgICB0YWdzOiB0YWdzLFxuICAgICAgICBtaW5YOiBJbmZpbml0eSxcbiAgICAgICAgbWluWTogSW5maW5pdHksXG4gICAgICAgIG1heFg6IC1JbmZpbml0eSxcbiAgICAgICAgbWF4WTogLUluZmluaXR5XG4gICAgfTtcbiAgICBjYWxjQkJveChmZWF0dXJlKTtcbiAgICByZXR1cm4gZmVhdHVyZTtcbn1cblxuZnVuY3Rpb24gY2FsY0JCb3goZmVhdHVyZSkge1xuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeTtcbiAgICB2YXIgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50JyB8fCB0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgY2FsY0xpbmVCQm94KGZlYXR1cmUsIGdlb20pO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjYWxjTGluZUJCb3goZmVhdHVyZSwgZ2VvbVtpXSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ2VvbVtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGNhbGNMaW5lQkJveChmZWF0dXJlLCBnZW9tW2ldW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FsY0xpbmVCQm94KGZlYXR1cmUsIGdlb20pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgZmVhdHVyZS5taW5YID0gTWF0aC5taW4oZmVhdHVyZS5taW5YLCBnZW9tW2ldKTtcbiAgICAgICAgZmVhdHVyZS5taW5ZID0gTWF0aC5taW4oZmVhdHVyZS5taW5ZLCBnZW9tW2kgKyAxXSk7XG4gICAgICAgIGZlYXR1cmUubWF4WCA9IE1hdGgubWF4KGZlYXR1cmUubWF4WCwgZ2VvbVtpXSk7XG4gICAgICAgIGZlYXR1cmUubWF4WSA9IE1hdGgubWF4KGZlYXR1cmUubWF4WSwgZ2VvbVtpICsgMV0pO1xuICAgIH1cbn1cbiIsIlxuaW1wb3J0IHNpbXBsaWZ5IGZyb20gJy4vc2ltcGxpZnknO1xuaW1wb3J0IGNyZWF0ZUZlYXR1cmUgZnJvbSAnLi9mZWF0dXJlJztcblxuLy8gY29udmVydHMgR2VvSlNPTiBmZWF0dXJlIGludG8gYW4gaW50ZXJtZWRpYXRlIHByb2plY3RlZCBKU09OIHZlY3RvciBmb3JtYXQgd2l0aCBzaW1wbGlmaWNhdGlvbiBkYXRhXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnZlcnQoZGF0YSwgb3B0aW9ucykge1xuICAgIHZhciBmZWF0dXJlcyA9IFtdO1xuICAgIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YS5mZWF0dXJlc1tpXSwgb3B0aW9ucywgaSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEsIG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2luZ2xlIGdlb21ldHJ5IG9yIGEgZ2VvbWV0cnkgY29sbGVjdGlvblxuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge2dlb21ldHJ5OiBkYXRhfSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZ2VvanNvbiwgb3B0aW9ucywgaW5kZXgpIHtcbiAgICBpZiAoIWdlb2pzb24uZ2VvbWV0cnkpIHJldHVybjtcblxuICAgIHZhciBjb29yZHMgPSBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgIHZhciB0eXBlID0gZ2VvanNvbi5nZW9tZXRyeS50eXBlO1xuICAgIHZhciB0b2xlcmFuY2UgPSBNYXRoLnBvdyhvcHRpb25zLnRvbGVyYW5jZSAvICgoMSA8PCBvcHRpb25zLm1heFpvb20pICogb3B0aW9ucy5leHRlbnQpLCAyKTtcbiAgICB2YXIgZ2VvbWV0cnkgPSBbXTtcbiAgICB2YXIgaWQgPSBnZW9qc29uLmlkO1xuICAgIGlmIChvcHRpb25zLnByb21vdGVJZCkge1xuICAgICAgICBpZCA9IGdlb2pzb24ucHJvcGVydGllc1tvcHRpb25zLnByb21vdGVJZF07XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmdlbmVyYXRlSWQpIHtcbiAgICAgICAgaWQgPSBpbmRleCB8fCAwO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBjb252ZXJ0UG9pbnQoY29vcmRzLCBnZW9tZXRyeSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydFBvaW50KGNvb3Jkc1tpXSwgZ2VvbWV0cnkpO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICBjb252ZXJ0TGluZShjb29yZHMsIGdlb21ldHJ5LCB0b2xlcmFuY2UsIGZhbHNlKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMubGluZU1ldHJpY3MpIHtcbiAgICAgICAgICAgIC8vIGV4cGxvZGUgaW50byBsaW5lc3RyaW5ncyB0byBiZSBhYmxlIHRvIHRyYWNrIG1ldHJpY3NcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnZlcnRMaW5lKGNvb3Jkc1tpXSwgZ2VvbWV0cnksIHRvbGVyYW5jZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlRmVhdHVyZShpZCwgJ0xpbmVTdHJpbmcnLCBnZW9tZXRyeSwgZ2VvanNvbi5wcm9wZXJ0aWVzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb252ZXJ0TGluZXMoY29vcmRzLCBnZW9tZXRyeSwgdG9sZXJhbmNlLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGNvbnZlcnRMaW5lcyhjb29yZHMsIGdlb21ldHJ5LCB0b2xlcmFuY2UsIHRydWUpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9seWdvbiA9IFtdO1xuICAgICAgICAgICAgY29udmVydExpbmVzKGNvb3Jkc1tpXSwgcG9seWdvbiwgdG9sZXJhbmNlLCB0cnVlKTtcbiAgICAgICAgICAgIGdlb21ldHJ5LnB1c2gocG9seWdvbik7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdHZW9tZXRyeUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9qc29uLmdlb21ldHJ5Lmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9qc29uLmdlb21ldHJ5Lmdlb21ldHJpZXNbaV0sXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZ2VvanNvbi5wcm9wZXJ0aWVzXG4gICAgICAgICAgICB9LCBvcHRpb25zLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC4nKTtcbiAgICB9XG5cbiAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZUZlYXR1cmUoaWQsIHR5cGUsIGdlb21ldHJ5LCBnZW9qc29uLnByb3BlcnRpZXMpKTtcbn1cblxuZnVuY3Rpb24gY29udmVydFBvaW50KGNvb3Jkcywgb3V0KSB7XG4gICAgb3V0LnB1c2gocHJvamVjdFgoY29vcmRzWzBdKSk7XG4gICAgb3V0LnB1c2gocHJvamVjdFkoY29vcmRzWzFdKSk7XG4gICAgb3V0LnB1c2goMCk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRMaW5lKHJpbmcsIG91dCwgdG9sZXJhbmNlLCBpc1BvbHlnb24pIHtcbiAgICB2YXIgeDAsIHkwO1xuICAgIHZhciBzaXplID0gMDtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgeCA9IHByb2plY3RYKHJpbmdbal1bMF0pO1xuICAgICAgICB2YXIgeSA9IHByb2plY3RZKHJpbmdbal1bMV0pO1xuXG4gICAgICAgIG91dC5wdXNoKHgpO1xuICAgICAgICBvdXQucHVzaCh5KTtcbiAgICAgICAgb3V0LnB1c2goMCk7XG5cbiAgICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgICAgICBpZiAoaXNQb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgc2l6ZSArPSAoeDAgKiB5IC0geCAqIHkwKSAvIDI7IC8vIGFyZWFcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2l6ZSArPSBNYXRoLnNxcnQoTWF0aC5wb3coeCAtIHgwLCAyKSArIE1hdGgucG93KHkgLSB5MCwgMikpOyAvLyBsZW5ndGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB4MCA9IHg7XG4gICAgICAgIHkwID0geTtcbiAgICB9XG5cbiAgICB2YXIgbGFzdCA9IG91dC5sZW5ndGggLSAzO1xuICAgIG91dFsyXSA9IDE7XG4gICAgc2ltcGxpZnkob3V0LCAwLCBsYXN0LCB0b2xlcmFuY2UpO1xuICAgIG91dFtsYXN0ICsgMl0gPSAxO1xuXG4gICAgb3V0LnNpemUgPSBNYXRoLmFicyhzaXplKTtcbiAgICBvdXQuc3RhcnQgPSAwO1xuICAgIG91dC5lbmQgPSBvdXQuc2l6ZTtcbn1cblxuZnVuY3Rpb24gY29udmVydExpbmVzKHJpbmdzLCBvdXQsIHRvbGVyYW5jZSwgaXNQb2x5Z29uKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZ2VvbSA9IFtdO1xuICAgICAgICBjb252ZXJ0TGluZShyaW5nc1tpXSwgZ2VvbSwgdG9sZXJhbmNlLCBpc1BvbHlnb24pO1xuICAgICAgICBvdXQucHVzaChnZW9tKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHByb2plY3RYKHgpIHtcbiAgICByZXR1cm4geCAvIDM2MCArIDAuNTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFkoeSkge1xuICAgIHZhciBzaW4gPSBNYXRoLnNpbih5ICogTWF0aC5QSSAvIDE4MCk7XG4gICAgdmFyIHkyID0gMC41IC0gMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkgLyBNYXRoLlBJO1xuICAgIHJldHVybiB5MiA8IDAgPyAwIDogeTIgPiAxID8gMSA6IHkyO1xufVxuIiwiXG5pbXBvcnQgY3JlYXRlRmVhdHVyZSBmcm9tICcuL2ZlYXR1cmUnO1xuXG4vKiBjbGlwIGZlYXR1cmVzIGJldHdlZW4gdHdvIGF4aXMtcGFyYWxsZWwgbGluZXM6XG4gKiAgICAgfCAgICAgICAgfFxuICogIF9fX3xfX18gICAgIHwgICAgIC9cbiAqIC8gICB8ICAgXFxfX19ffF9fX18vXG4gKiAgICAgfCAgICAgICAgfFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsaXAoZmVhdHVyZXMsIHNjYWxlLCBrMSwgazIsIGF4aXMsIG1pbkFsbCwgbWF4QWxsLCBvcHRpb25zKSB7XG5cbiAgICBrMSAvPSBzY2FsZTtcbiAgICBrMiAvPSBzY2FsZTtcblxuICAgIGlmIChtaW5BbGwgPj0gazEgJiYgbWF4QWxsIDwgazIpIHJldHVybiBmZWF0dXJlczsgLy8gdHJpdmlhbCBhY2NlcHRcbiAgICBlbHNlIGlmIChtYXhBbGwgPCBrMSB8fCBtaW5BbGwgPj0gazIpIHJldHVybiBudWxsOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgdmFyIGNsaXBwZWQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldO1xuICAgICAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgICB2YXIgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICB2YXIgbWluID0gYXhpcyA9PT0gMCA/IGZlYXR1cmUubWluWCA6IGZlYXR1cmUubWluWTtcbiAgICAgICAgdmFyIG1heCA9IGF4aXMgPT09IDAgPyBmZWF0dXJlLm1heFggOiBmZWF0dXJlLm1heFk7XG5cbiAgICAgICAgaWYgKG1pbiA+PSBrMSAmJiBtYXggPCBrMikgeyAvLyB0cml2aWFsIGFjY2VwdFxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGZlYXR1cmUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWF4IDwgazEgfHwgbWluID49IGsyKSB7IC8vIHRyaXZpYWwgcmVqZWN0XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXdHZW9tZXRyeSA9IFtdO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICAgICAgY2xpcFBvaW50cyhnZW9tZXRyeSwgbmV3R2VvbWV0cnksIGsxLCBrMiwgYXhpcyk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIGNsaXBMaW5lKGdlb21ldHJ5LCBuZXdHZW9tZXRyeSwgazEsIGsyLCBheGlzLCBmYWxzZSwgb3B0aW9ucy5saW5lTWV0cmljcyk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgY2xpcExpbmVzKGdlb21ldHJ5LCBuZXdHZW9tZXRyeSwgazEsIGsyLCBheGlzLCBmYWxzZSk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgICAgIGNsaXBMaW5lcyhnZW9tZXRyeSwgbmV3R2VvbWV0cnksIGsxLCBrMiwgYXhpcywgdHJ1ZSk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBnZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBwb2x5Z29uID0gW107XG4gICAgICAgICAgICAgICAgY2xpcExpbmVzKGdlb21ldHJ5W2pdLCBwb2x5Z29uLCBrMSwgazIsIGF4aXMsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChwb2x5Z29uLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeS5wdXNoKHBvbHlnb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdHZW9tZXRyeS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbmVNZXRyaWNzICYmIHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuZXdHZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBjbGlwcGVkLnB1c2goY3JlYXRlRmVhdHVyZShmZWF0dXJlLmlkLCB0eXBlLCBuZXdHZW9tZXRyeVtqXSwgZmVhdHVyZS50YWdzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0dlb21ldHJ5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ0xpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeSA9IG5ld0dlb21ldHJ5WzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gbmV3R2VvbWV0cnkubGVuZ3RoID09PSAzID8gJ1BvaW50JyA6ICdNdWx0aVBvaW50JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGNyZWF0ZUZlYXR1cmUoZmVhdHVyZS5pZCwgdHlwZSwgbmV3R2VvbWV0cnksIGZlYXR1cmUudGFncykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBwZWQubGVuZ3RoID8gY2xpcHBlZCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNsaXBQb2ludHMoZ2VvbSwgbmV3R2VvbSwgazEsIGsyLCBheGlzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBhID0gZ2VvbVtpICsgYXhpc107XG5cbiAgICAgICAgaWYgKGEgPj0gazEgJiYgYSA8PSBrMikge1xuICAgICAgICAgICAgbmV3R2VvbS5wdXNoKGdlb21baV0pO1xuICAgICAgICAgICAgbmV3R2VvbS5wdXNoKGdlb21baSArIDFdKTtcbiAgICAgICAgICAgIG5ld0dlb20ucHVzaChnZW9tW2kgKyAyXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNsaXBMaW5lKGdlb20sIG5ld0dlb20sIGsxLCBrMiwgYXhpcywgaXNQb2x5Z29uLCB0cmFja01ldHJpY3MpIHtcblxuICAgIHZhciBzbGljZSA9IG5ld1NsaWNlKGdlb20pO1xuICAgIHZhciBpbnRlcnNlY3QgPSBheGlzID09PSAwID8gaW50ZXJzZWN0WCA6IGludGVyc2VjdFk7XG4gICAgdmFyIGxlbiA9IGdlb20uc3RhcnQ7XG4gICAgdmFyIHNlZ0xlbiwgdDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGggLSAzOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGF4ID0gZ2VvbVtpXTtcbiAgICAgICAgdmFyIGF5ID0gZ2VvbVtpICsgMV07XG4gICAgICAgIHZhciBheiA9IGdlb21baSArIDJdO1xuICAgICAgICB2YXIgYnggPSBnZW9tW2kgKyAzXTtcbiAgICAgICAgdmFyIGJ5ID0gZ2VvbVtpICsgNF07XG4gICAgICAgIHZhciBhID0gYXhpcyA9PT0gMCA/IGF4IDogYXk7XG4gICAgICAgIHZhciBiID0gYXhpcyA9PT0gMCA/IGJ4IDogYnk7XG4gICAgICAgIHZhciBleGl0ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzZWdMZW4gPSBNYXRoLnNxcnQoTWF0aC5wb3coYXggLSBieCwgMikgKyBNYXRoLnBvdyhheSAtIGJ5LCAyKSk7XG5cbiAgICAgICAgaWYgKGEgPCBrMSkge1xuICAgICAgICAgICAgLy8gLS0tfC0tPiAgfCAobGluZSBlbnRlcnMgdGhlIGNsaXAgcmVnaW9uIGZyb20gdGhlIGxlZnQpXG4gICAgICAgICAgICBpZiAoYiA+IGsxKSB7XG4gICAgICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsxKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzbGljZS5zdGFydCA9IGxlbiArIHNlZ0xlbiAqIHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYSA+IGsyKSB7XG4gICAgICAgICAgICAvLyB8ICA8LS18LS0tIChsaW5lIGVudGVycyB0aGUgY2xpcCByZWdpb24gZnJvbSB0aGUgcmlnaHQpXG4gICAgICAgICAgICBpZiAoYiA8IGsyKSB7XG4gICAgICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsyKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzbGljZS5zdGFydCA9IGxlbiArIHNlZ0xlbiAqIHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZGRQb2ludChzbGljZSwgYXgsIGF5LCBheik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPCBrMSAmJiBhID49IGsxKSB7XG4gICAgICAgICAgICAvLyA8LS18LS0tICB8IG9yIDwtLXwtLS0tLXwtLS0gKGxpbmUgZXhpdHMgdGhlIGNsaXAgcmVnaW9uIG9uIHRoZSBsZWZ0KVxuICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsxKTtcbiAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPiBrMiAmJiBhIDw9IGsyKSB7XG4gICAgICAgICAgICAvLyB8ICAtLS18LS0+IG9yIC0tLXwtLS0tLXwtLT4gKGxpbmUgZXhpdHMgdGhlIGNsaXAgcmVnaW9uIG9uIHRoZSByaWdodClcbiAgICAgICAgICAgIHQgPSBpbnRlcnNlY3Qoc2xpY2UsIGF4LCBheSwgYngsIGJ5LCBrMik7XG4gICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1BvbHlnb24gJiYgZXhpdGVkKSB7XG4gICAgICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzbGljZS5lbmQgPSBsZW4gKyBzZWdMZW4gKiB0O1xuICAgICAgICAgICAgbmV3R2VvbS5wdXNoKHNsaWNlKTtcbiAgICAgICAgICAgIHNsaWNlID0gbmV3U2xpY2UoZ2VvbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBsZW4gKz0gc2VnTGVuO1xuICAgIH1cblxuICAgIC8vIGFkZCB0aGUgbGFzdCBwb2ludFxuICAgIHZhciBsYXN0ID0gZ2VvbS5sZW5ndGggLSAzO1xuICAgIGF4ID0gZ2VvbVtsYXN0XTtcbiAgICBheSA9IGdlb21bbGFzdCArIDFdO1xuICAgIGF6ID0gZ2VvbVtsYXN0ICsgMl07XG4gICAgYSA9IGF4aXMgPT09IDAgPyBheCA6IGF5O1xuICAgIGlmIChhID49IGsxICYmIGEgPD0gazIpIGFkZFBvaW50KHNsaWNlLCBheCwgYXksIGF6KTtcblxuICAgIC8vIGNsb3NlIHRoZSBwb2x5Z29uIGlmIGl0cyBlbmRwb2ludHMgYXJlIG5vdCB0aGUgc2FtZSBhZnRlciBjbGlwcGluZ1xuICAgIGxhc3QgPSBzbGljZS5sZW5ndGggLSAzO1xuICAgIGlmIChpc1BvbHlnb24gJiYgbGFzdCA+PSAzICYmIChzbGljZVtsYXN0XSAhPT0gc2xpY2VbMF0gfHwgc2xpY2VbbGFzdCArIDFdICE9PSBzbGljZVsxXSkpIHtcbiAgICAgICAgYWRkUG9pbnQoc2xpY2UsIHNsaWNlWzBdLCBzbGljZVsxXSwgc2xpY2VbMl0pO1xuICAgIH1cblxuICAgIC8vIGFkZCB0aGUgZmluYWwgc2xpY2VcbiAgICBpZiAoc2xpY2UubGVuZ3RoKSB7XG4gICAgICAgIG5ld0dlb20ucHVzaChzbGljZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBuZXdTbGljZShsaW5lKSB7XG4gICAgdmFyIHNsaWNlID0gW107XG4gICAgc2xpY2Uuc2l6ZSA9IGxpbmUuc2l6ZTtcbiAgICBzbGljZS5zdGFydCA9IGxpbmUuc3RhcnQ7XG4gICAgc2xpY2UuZW5kID0gbGluZS5lbmQ7XG4gICAgcmV0dXJuIHNsaWNlO1xufVxuXG5mdW5jdGlvbiBjbGlwTGluZXMoZ2VvbSwgbmV3R2VvbSwgazEsIGsyLCBheGlzLCBpc1BvbHlnb24pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2xpcExpbmUoZ2VvbVtpXSwgbmV3R2VvbSwgazEsIGsyLCBheGlzLCBpc1BvbHlnb24sIGZhbHNlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZFBvaW50KG91dCwgeCwgeSwgeikge1xuICAgIG91dC5wdXNoKHgpO1xuICAgIG91dC5wdXNoKHkpO1xuICAgIG91dC5wdXNoKHopO1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3RYKG91dCwgYXgsIGF5LCBieCwgYnksIHgpIHtcbiAgICB2YXIgdCA9ICh4IC0gYXgpIC8gKGJ4IC0gYXgpO1xuICAgIG91dC5wdXNoKHgpO1xuICAgIG91dC5wdXNoKGF5ICsgKGJ5IC0gYXkpICogdCk7XG4gICAgb3V0LnB1c2goMSk7XG4gICAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdFkob3V0LCBheCwgYXksIGJ4LCBieSwgeSkge1xuICAgIHZhciB0ID0gKHkgLSBheSkgLyAoYnkgLSBheSk7XG4gICAgb3V0LnB1c2goYXggKyAoYnggLSBheCkgKiB0KTtcbiAgICBvdXQucHVzaCh5KTtcbiAgICBvdXQucHVzaCgxKTtcbiAgICByZXR1cm4gdDtcbn1cbiIsIlxuaW1wb3J0IGNsaXAgZnJvbSAnLi9jbGlwJztcbmltcG9ydCBjcmVhdGVGZWF0dXJlIGZyb20gJy4vZmVhdHVyZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdyYXAoZmVhdHVyZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgYnVmZmVyID0gb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudDtcbiAgICB2YXIgbWVyZ2VkID0gZmVhdHVyZXM7XG4gICAgdmFyIGxlZnQgID0gY2xpcChmZWF0dXJlcywgMSwgLTEgLSBidWZmZXIsIGJ1ZmZlciwgICAgIDAsIC0xLCAyLCBvcHRpb25zKTsgLy8gbGVmdCB3b3JsZCBjb3B5XG4gICAgdmFyIHJpZ2h0ID0gY2xpcChmZWF0dXJlcywgMSwgIDEgLSBidWZmZXIsIDIgKyBidWZmZXIsIDAsIC0xLCAyLCBvcHRpb25zKTsgLy8gcmlnaHQgd29ybGQgY29weVxuXG4gICAgaWYgKGxlZnQgfHwgcmlnaHQpIHtcbiAgICAgICAgbWVyZ2VkID0gY2xpcChmZWF0dXJlcywgMSwgLWJ1ZmZlciwgMSArIGJ1ZmZlciwgMCwgLTEsIDIsIG9wdGlvbnMpIHx8IFtdOyAvLyBjZW50ZXIgd29ybGQgY29weVxuXG4gICAgICAgIGlmIChsZWZ0KSBtZXJnZWQgPSBzaGlmdEZlYXR1cmVDb29yZHMobGVmdCwgMSkuY29uY2F0KG1lcmdlZCk7IC8vIG1lcmdlIGxlZnQgaW50byBjZW50ZXJcbiAgICAgICAgaWYgKHJpZ2h0KSBtZXJnZWQgPSBtZXJnZWQuY29uY2F0KHNoaWZ0RmVhdHVyZUNvb3JkcyhyaWdodCwgLTEpKTsgLy8gbWVyZ2UgcmlnaHQgaW50byBjZW50ZXJcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBzaGlmdEZlYXR1cmVDb29yZHMoZmVhdHVyZXMsIG9mZnNldCkge1xuICAgIHZhciBuZXdGZWF0dXJlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICB2YXIgbmV3R2VvbWV0cnk7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnIHx8IHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5LCBvZmZzZXQpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5W2pdLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1BvbHlnb24gPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGZlYXR1cmUuZ2VvbWV0cnlbal0ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UG9seWdvbi5wdXNoKHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnlbal1ba10sIG9mZnNldCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeS5wdXNoKG5ld1BvbHlnb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbmV3RmVhdHVyZXMucHVzaChjcmVhdGVGZWF0dXJlKGZlYXR1cmUuaWQsIHR5cGUsIG5ld0dlb21ldHJ5LCBmZWF0dXJlLnRhZ3MpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0Q29vcmRzKHBvaW50cywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld1BvaW50cyA9IFtdO1xuICAgIG5ld1BvaW50cy5zaXplID0gcG9pbnRzLnNpemU7XG5cbiAgICBpZiAocG9pbnRzLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3UG9pbnRzLnN0YXJ0ID0gcG9pbnRzLnN0YXJ0O1xuICAgICAgICBuZXdQb2ludHMuZW5kID0gcG9pbnRzLmVuZDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICBuZXdQb2ludHMucHVzaChwb2ludHNbaV0gKyBvZmZzZXQsIHBvaW50c1tpICsgMV0sIHBvaW50c1tpICsgMl0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UG9pbnRzO1xufVxuIiwiXG4vLyBUcmFuc2Zvcm1zIHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIGZlYXR1cmUgaW4gdGhlIGdpdmVuIHRpbGUgZnJvbVxuLy8gbWVyY2F0b3ItcHJvamVjdGVkIHNwYWNlIGludG8gKGV4dGVudCB4IGV4dGVudCkgdGlsZSBzcGFjZS5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUodGlsZSwgZXh0ZW50KSB7XG4gICAgaWYgKHRpbGUudHJhbnNmb3JtZWQpIHJldHVybiB0aWxlO1xuXG4gICAgdmFyIHoyID0gMSA8PCB0aWxlLnosXG4gICAgICAgIHR4ID0gdGlsZS54LFxuICAgICAgICB0eSA9IHRpbGUueSxcbiAgICAgICAgaSwgaiwgaztcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0aWxlLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gdGlsZS5mZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICBmZWF0dXJlLmdlb21ldHJ5ID0gW107XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaiArPSAyKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZS5nZW9tZXRyeS5wdXNoKHRyYW5zZm9ybVBvaW50KGdlb21bal0sIGdlb21baiArIDFdLCBleHRlbnQsIHoyLCB0eCwgdHkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZ2VvbVtqXS5sZW5ndGg7IGsgKz0gMikge1xuICAgICAgICAgICAgICAgICAgICByaW5nLnB1c2godHJhbnNmb3JtUG9pbnQoZ2VvbVtqXVtrXSwgZ2VvbVtqXVtrICsgMV0sIGV4dGVudCwgejIsIHR4LCB0eSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmZWF0dXJlLmdlb21ldHJ5LnB1c2gocmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aWxlLnRyYW5zZm9ybWVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludCh4LCB5LCBleHRlbnQsIHoyLCB0eCwgdHkpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBNYXRoLnJvdW5kKGV4dGVudCAqICh4ICogejIgLSB0eCkpLFxuICAgICAgICBNYXRoLnJvdW5kKGV4dGVudCAqICh5ICogejIgLSB0eSkpXTtcbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlVGlsZShmZWF0dXJlcywgeiwgdHgsIHR5LCBvcHRpb25zKSB7XG4gICAgdmFyIHRvbGVyYW5jZSA9IHogPT09IG9wdGlvbnMubWF4Wm9vbSA/IDAgOiBvcHRpb25zLnRvbGVyYW5jZSAvICgoMSA8PCB6KSAqIG9wdGlvbnMuZXh0ZW50KTtcbiAgICB2YXIgdGlsZSA9IHtcbiAgICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgICBudW1Qb2ludHM6IDAsXG4gICAgICAgIG51bVNpbXBsaWZpZWQ6IDAsXG4gICAgICAgIG51bUZlYXR1cmVzOiAwLFxuICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgIHg6IHR4LFxuICAgICAgICB5OiB0eSxcbiAgICAgICAgejogeixcbiAgICAgICAgdHJhbnNmb3JtZWQ6IGZhbHNlLFxuICAgICAgICBtaW5YOiAyLFxuICAgICAgICBtaW5ZOiAxLFxuICAgICAgICBtYXhYOiAtMSxcbiAgICAgICAgbWF4WTogMFxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aWxlLm51bUZlYXR1cmVzKys7XG4gICAgICAgIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIG1pblggPSBmZWF0dXJlc1tpXS5taW5YO1xuICAgICAgICB2YXIgbWluWSA9IGZlYXR1cmVzW2ldLm1pblk7XG4gICAgICAgIHZhciBtYXhYID0gZmVhdHVyZXNbaV0ubWF4WDtcbiAgICAgICAgdmFyIG1heFkgPSBmZWF0dXJlc1tpXS5tYXhZO1xuXG4gICAgICAgIGlmIChtaW5YIDwgdGlsZS5taW5YKSB0aWxlLm1pblggPSBtaW5YO1xuICAgICAgICBpZiAobWluWSA8IHRpbGUubWluWSkgdGlsZS5taW5ZID0gbWluWTtcbiAgICAgICAgaWYgKG1heFggPiB0aWxlLm1heFgpIHRpbGUubWF4WCA9IG1heFg7XG4gICAgICAgIGlmIChtYXhZID4gdGlsZS5tYXhZKSB0aWxlLm1heFkgPSBtYXhZO1xuICAgIH1cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlLCB0b2xlcmFuY2UsIG9wdGlvbnMpIHtcblxuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgc2ltcGxpZmllZCA9IFtdO1xuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKGdlb21baV0pO1xuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKGdlb21baSArIDFdKTtcbiAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBnZW9tLCB0aWxlLCB0b2xlcmFuY2UsIGZhbHNlLCBmYWxzZSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBnZW9tW2ldLCB0aWxlLCB0b2xlcmFuY2UsIHR5cGUgPT09ICdQb2x5Z29uJywgaSA9PT0gMCk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcblxuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGdlb20ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHZhciBwb2x5Z29uID0gZ2VvbVtrXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBwb2x5Z29uW2ldLCB0aWxlLCB0b2xlcmFuY2UsIHRydWUsIGkgPT09IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpbXBsaWZpZWQubGVuZ3RoKSB7XG4gICAgICAgIHZhciB0YWdzID0gZmVhdHVyZS50YWdzIHx8IG51bGw7XG4gICAgICAgIGlmICh0eXBlID09PSAnTGluZVN0cmluZycgJiYgb3B0aW9ucy5saW5lTWV0cmljcykge1xuICAgICAgICAgICAgdGFncyA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZlYXR1cmUudGFncykgdGFnc1trZXldID0gZmVhdHVyZS50YWdzW2tleV07XG4gICAgICAgICAgICB0YWdzWydtYXBib3hfY2xpcF9zdGFydCddID0gZ2VvbS5zdGFydCAvIGdlb20uc2l6ZTtcbiAgICAgICAgICAgIHRhZ3NbJ21hcGJveF9jbGlwX2VuZCddID0gZ2VvbS5lbmQgLyBnZW9tLnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRpbGVGZWF0dXJlID0ge1xuICAgICAgICAgICAgZ2VvbWV0cnk6IHNpbXBsaWZpZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpUG9seWdvbicgPyAzIDpcbiAgICAgICAgICAgICAgICB0eXBlID09PSAnTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgPyAyIDogMSxcbiAgICAgICAgICAgIHRhZ3M6IHRhZ3NcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZlYXR1cmUuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRpbGVGZWF0dXJlLmlkID0gZmVhdHVyZS5pZDtcbiAgICAgICAgfVxuICAgICAgICB0aWxlLmZlYXR1cmVzLnB1c2godGlsZUZlYXR1cmUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkTGluZShyZXN1bHQsIGdlb20sIHRpbGUsIHRvbGVyYW5jZSwgaXNQb2x5Z29uLCBpc091dGVyKSB7XG4gICAgdmFyIHNxVG9sZXJhbmNlID0gdG9sZXJhbmNlICogdG9sZXJhbmNlO1xuXG4gICAgaWYgKHRvbGVyYW5jZSA+IDAgJiYgKGdlb20uc2l6ZSA8IChpc1BvbHlnb24gPyBzcVRvbGVyYW5jZSA6IHRvbGVyYW5jZSkpKSB7XG4gICAgICAgIHRpbGUubnVtUG9pbnRzICs9IGdlb20ubGVuZ3RoIC8gMztcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByaW5nID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgaWYgKHRvbGVyYW5jZSA9PT0gMCB8fCBnZW9tW2kgKyAyXSA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgICAgIHJpbmcucHVzaChnZW9tW2ldKTtcbiAgICAgICAgICAgIHJpbmcucHVzaChnZW9tW2kgKyAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGlsZS5udW1Qb2ludHMrKztcbiAgICB9XG5cbiAgICBpZiAoaXNQb2x5Z29uKSByZXdpbmQocmluZywgaXNPdXRlcik7XG5cbiAgICByZXN1bHQucHVzaChyaW5nKTtcbn1cblxuZnVuY3Rpb24gcmV3aW5kKHJpbmcsIGNsb2Nrd2lzZSkge1xuICAgIHZhciBhcmVhID0gMDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAyOyBpIDwgbGVuOyBqID0gaSwgaSArPSAyKSB7XG4gICAgICAgIGFyZWEgKz0gKHJpbmdbaV0gLSByaW5nW2pdKSAqIChyaW5nW2kgKyAxXSArIHJpbmdbaiArIDFdKTtcbiAgICB9XG4gICAgaWYgKGFyZWEgPiAwID09PSBjbG9ja3dpc2UpIHtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmluZy5sZW5ndGg7IGkgPCBsZW4gLyAyOyBpICs9IDIpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcmluZ1tpXTtcbiAgICAgICAgICAgIHZhciB5ID0gcmluZ1tpICsgMV07XG4gICAgICAgICAgICByaW5nW2ldID0gcmluZ1tsZW4gLSAyIC0gaV07XG4gICAgICAgICAgICByaW5nW2kgKyAxXSA9IHJpbmdbbGVuIC0gMSAtIGldO1xuICAgICAgICAgICAgcmluZ1tsZW4gLSAyIC0gaV0gPSB4O1xuICAgICAgICAgICAgcmluZ1tsZW4gLSAxIC0gaV0gPSB5O1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgY29udmVydCBmcm9tICcuL2NvbnZlcnQnOyAgICAgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXG5pbXBvcnQgY2xpcCBmcm9tICcuL2NsaXAnOyAgICAgICAgICAgLy8gc3RyaXBlIGNsaXBwaW5nIGFsZ29yaXRobVxuaW1wb3J0IHdyYXAgZnJvbSAnLi93cmFwJzsgICAgICAgICAgIC8vIGRhdGUgbGluZSBwcm9jZXNzaW5nXG5pbXBvcnQgdHJhbnNmb3JtIGZyb20gJy4vdHJhbnNmb3JtJzsgLy8gY29vcmRpbmF0ZSB0cmFuc2Zvcm1hdGlvblxuaW1wb3J0IGNyZWF0ZVRpbGUgZnJvbSAnLi90aWxlJzsgICAgIC8vIGZpbmFsIHNpbXBsaWZpZWQgdGlsZSBnZW5lcmF0aW9uXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdlb2pzb252dChkYXRhLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIEdlb0pTT05WVChkYXRhLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyA9IGV4dGVuZChPYmplY3QuY3JlYXRlKHRoaXMub3B0aW9ucyksIG9wdGlvbnMpO1xuXG4gICAgdmFyIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIGlmIChkZWJ1ZykgY29uc29sZS50aW1lKCdwcmVwcm9jZXNzIGRhdGEnKTtcblxuICAgIGlmIChvcHRpb25zLm1heFpvb20gPCAwIHx8IG9wdGlvbnMubWF4Wm9vbSA+IDI0KSB0aHJvdyBuZXcgRXJyb3IoJ21heFpvb20gc2hvdWxkIGJlIGluIHRoZSAwLTI0IHJhbmdlJyk7XG4gICAgaWYgKG9wdGlvbnMucHJvbW90ZUlkICYmIG9wdGlvbnMuZ2VuZXJhdGVJZCkgdGhyb3cgbmV3IEVycm9yKCdwcm9tb3RlSWQgYW5kIGdlbmVyYXRlSWQgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuJyk7XG5cbiAgICB2YXIgZmVhdHVyZXMgPSBjb252ZXJ0KGRhdGEsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy50aWxlcyA9IHt9O1xuICAgIHRoaXMudGlsZUNvb3JkcyA9IFtdO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgncHJlcHJvY2VzcyBkYXRhJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdpbmRleDogbWF4Wm9vbTogJWQsIG1heFBvaW50czogJWQnLCBvcHRpb25zLmluZGV4TWF4Wm9vbSwgb3B0aW9ucy5pbmRleE1heFBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZSgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgdGhpcy5zdGF0cyA9IHt9O1xuICAgICAgICB0aGlzLnRvdGFsID0gMDtcbiAgICB9XG5cbiAgICBmZWF0dXJlcyA9IHdyYXAoZmVhdHVyZXMsIG9wdGlvbnMpO1xuXG4gICAgLy8gc3RhcnQgc2xpY2luZyBmcm9tIHRoZSB0b3AgdGlsZSBkb3duXG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgdGhpcy5zcGxpdFRpbGUoZmVhdHVyZXMsIDAsIDAsIDApO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIGNvbnNvbGUubG9nKCdmZWF0dXJlczogJWQsIHBvaW50czogJWQnLCB0aGlzLnRpbGVzWzBdLm51bUZlYXR1cmVzLCB0aGlzLnRpbGVzWzBdLm51bVBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3RpbGVzIGdlbmVyYXRlZDonLCB0aGlzLnRvdGFsLCBKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSk7XG4gICAgfVxufVxuXG5HZW9KU09OVlQucHJvdG90eXBlLm9wdGlvbnMgPSB7XG4gICAgbWF4Wm9vbTogMTQsICAgICAgICAgICAgLy8gbWF4IHpvb20gdG8gcHJlc2VydmUgZGV0YWlsIG9uXG4gICAgaW5kZXhNYXhab29tOiA1LCAgICAgICAgLy8gbWF4IHpvb20gaW4gdGhlIHRpbGUgaW5kZXhcbiAgICBpbmRleE1heFBvaW50czogMTAwMDAwLCAvLyBtYXggbnVtYmVyIG9mIHBvaW50cyBwZXIgdGlsZSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIHRvbGVyYW5jZTogMywgICAgICAgICAgIC8vIHNpbXBsaWZpY2F0aW9uIHRvbGVyYW5jZSAoaGlnaGVyIG1lYW5zIHNpbXBsZXIpXG4gICAgZXh0ZW50OiA0MDk2LCAgICAgICAgICAgLy8gdGlsZSBleHRlbnRcbiAgICBidWZmZXI6IDY0LCAgICAgICAgICAgICAvLyB0aWxlIGJ1ZmZlciBvbiBlYWNoIHNpZGVcbiAgICBsaW5lTWV0cmljczogZmFsc2UsICAgICAvLyB3aGV0aGVyIHRvIGNhbGN1bGF0ZSBsaW5lIG1ldHJpY3NcbiAgICBwcm9tb3RlSWQ6IG51bGwsICAgICAgICAvLyBuYW1lIG9mIGEgZmVhdHVyZSBwcm9wZXJ0eSB0byBiZSBwcm9tb3RlZCB0byBmZWF0dXJlLmlkXG4gICAgZ2VuZXJhdGVJZDogZmFsc2UsICAgICAgLy8gd2hldGhlciB0byBnZW5lcmF0ZSBmZWF0dXJlIGlkcy4gQ2Fubm90IGJlIHVzZWQgd2l0aCBwcm9tb3RlSWRcbiAgICBkZWJ1ZzogMCAgICAgICAgICAgICAgICAvLyBsb2dnaW5nIGxldmVsICgwLCAxIG9yIDIpXG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLnNwbGl0VGlsZSA9IGZ1bmN0aW9uIChmZWF0dXJlcywgeiwgeCwgeSwgY3osIGN4LCBjeSkge1xuXG4gICAgdmFyIHN0YWNrID0gW2ZlYXR1cmVzLCB6LCB4LCB5XSxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgLy8gYXZvaWQgcmVjdXJzaW9uIGJ5IHVzaW5nIGEgcHJvY2Vzc2luZyBxdWV1ZVxuICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgeSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB4ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHogPSBzdGFjay5wb3AoKTtcbiAgICAgICAgZmVhdHVyZXMgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICB2YXIgejIgPSAxIDw8IHosXG4gICAgICAgICAgICBpZCA9IHRvSUQoeiwgeCwgeSksXG4gICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1tpZF07XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NyZWF0aW9uJyk7XG5cbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSA9IGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHosIHgsIHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy50aWxlQ29vcmRzLnB1c2goe3o6IHosIHg6IHgsIHk6IHl9KTtcblxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGlsZSB6JWQtJWQtJWQgKGZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCwgc2ltcGxpZmllZDogJWQpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHosIHgsIHksIHRpbGUubnVtRmVhdHVyZXMsIHRpbGUubnVtUG9pbnRzLCB0aWxlLm51bVNpbXBsaWZpZWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2NyZWF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSAneicgKyB6O1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHNba2V5XSA9ICh0aGlzLnN0YXRzW2tleV0gfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWwrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIGdlb21ldHJ5IGluIHRpbGUgc28gdGhhdCB3ZSBjYW4gZHJpbGwgZG93biBsYXRlciBpZiB3ZSBzdG9wIG5vd1xuICAgICAgICB0aWxlLnNvdXJjZSA9IGZlYXR1cmVzO1xuXG4gICAgICAgIC8vIGlmIGl0J3MgdGhlIGZpcnN0LXBhc3MgdGlsaW5nXG4gICAgICAgIGlmICghY3opIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgbWF4IHpvb20sIG9yIGlmIHRoZSB0aWxlIGlzIHRvbyBzaW1wbGVcbiAgICAgICAgICAgIGlmICh6ID09PSBvcHRpb25zLmluZGV4TWF4Wm9vbSB8fCB0aWxlLm51bVBvaW50cyA8PSBvcHRpb25zLmluZGV4TWF4UG9pbnRzKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBhIGRyaWxsZG93biB0byBhIHNwZWNpZmljIHRpbGVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgYmFzZSB6b29tIG9yIG91ciB0YXJnZXQgdGlsZSB6b29tXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5tYXhab29tIHx8IHogPT09IGN6KSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgaXQncyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIHRhcmdldCB0aWxlXG4gICAgICAgICAgICB2YXIgbSA9IDEgPDwgKGN6IC0geik7XG4gICAgICAgICAgICBpZiAoeCAhPT0gTWF0aC5mbG9vcihjeCAvIG0pIHx8IHkgIT09IE1hdGguZmxvb3IoY3kgLyBtKSkgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB3ZSBzbGljZSBmdXJ0aGVyIGRvd24sIG5vIG5lZWQgdG8ga2VlcCBzb3VyY2UgZ2VvbWV0cnlcbiAgICAgICAgdGlsZS5zb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY2xpcHBpbmcnKTtcblxuICAgICAgICAvLyB2YWx1ZXMgd2UnbGwgdXNlIGZvciBjbGlwcGluZ1xuICAgICAgICB2YXIgazEgPSAwLjUgKiBvcHRpb25zLmJ1ZmZlciAvIG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICAgICAgazIgPSAwLjUgLSBrMSxcbiAgICAgICAgICAgIGszID0gMC41ICsgazEsXG4gICAgICAgICAgICBrNCA9IDEgKyBrMSxcbiAgICAgICAgICAgIHRsLCBibCwgdHIsIGJyLCBsZWZ0LCByaWdodDtcblxuICAgICAgICB0bCA9IGJsID0gdHIgPSBiciA9IG51bGw7XG5cbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCAtIGsxLCB4ICsgazMsIDAsIHRpbGUubWluWCwgdGlsZS5tYXhYLCBvcHRpb25zKTtcbiAgICAgICAgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCArIGsyLCB4ICsgazQsIDAsIHRpbGUubWluWCwgdGlsZS5tYXhYLCBvcHRpb25zKTtcbiAgICAgICAgZmVhdHVyZXMgPSBudWxsO1xuXG4gICAgICAgIGlmIChsZWZ0KSB7XG4gICAgICAgICAgICB0bCA9IGNsaXAobGVmdCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBibCA9IGNsaXAobGVmdCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBsZWZ0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgICAgdHIgPSBjbGlwKHJpZ2h0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIHRpbGUubWluWSwgdGlsZS5tYXhZLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyID0gY2xpcChyaWdodCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByaWdodCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgc3RhY2sucHVzaCh0bCB8fCBbXSwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIpO1xuICAgICAgICBzdGFjay5wdXNoKGJsIHx8IFtdLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMiArIDEpO1xuICAgICAgICBzdGFjay5wdXNoKHRyIHx8IFtdLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMik7XG4gICAgICAgIHN0YWNrLnB1c2goYnIgfHwgW10sIHogKyAxLCB4ICogMiArIDEsIHkgKiAyICsgMSk7XG4gICAgfVxufTtcblxuR2VvSlNPTlZULnByb3RvdHlwZS5nZXRUaWxlID0gZnVuY3Rpb24gKHosIHgsIHkpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZXh0ZW50ID0gb3B0aW9ucy5leHRlbnQsXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIGlmICh6IDwgMCB8fCB6ID4gMjQpIHJldHVybiBudWxsO1xuXG4gICAgdmFyIHoyID0gMSA8PCB6O1xuICAgIHggPSAoKHggJSB6MikgKyB6MikgJSB6MjsgLy8gd3JhcCB0aWxlIHggY29vcmRpbmF0ZVxuXG4gICAgdmFyIGlkID0gdG9JRCh6LCB4LCB5KTtcbiAgICBpZiAodGhpcy50aWxlc1tpZF0pIHJldHVybiB0cmFuc2Zvcm0odGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWQnLCB6LCB4LCB5KTtcblxuICAgIHZhciB6MCA9IHosXG4gICAgICAgIHgwID0geCxcbiAgICAgICAgeTAgPSB5LFxuICAgICAgICBwYXJlbnQ7XG5cbiAgICB3aGlsZSAoIXBhcmVudCAmJiB6MCA+IDApIHtcbiAgICAgICAgejAtLTtcbiAgICAgICAgeDAgPSBNYXRoLmZsb29yKHgwIC8gMik7XG4gICAgICAgIHkwID0gTWF0aC5mbG9vcih5MCAvIDIpO1xuICAgICAgICBwYXJlbnQgPSB0aGlzLnRpbGVzW3RvSUQoejAsIHgwLCB5MCldO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQuc291cmNlKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIGlmIHdlIGZvdW5kIGEgcGFyZW50IHRpbGUgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZ2VvbWV0cnksIHdlIGNhbiBkcmlsbCBkb3duIGZyb20gaXRcbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZm91bmQgcGFyZW50IHRpbGUgeiVkLSVkLSVkJywgejAsIHgwLCB5MCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2RyaWxsaW5nIGRvd24nKTtcbiAgICB0aGlzLnNwbGl0VGlsZShwYXJlbnQuc291cmNlLCB6MCwgeDAsIHkwLCB6LCB4LCB5KTtcbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2RyaWxsaW5nIGRvd24nKTtcblxuICAgIHJldHVybiB0aGlzLnRpbGVzW2lkXSA/IHRyYW5zZm9ybSh0aGlzLnRpbGVzW2lkXSwgZXh0ZW50KSA6IG51bGw7XG59O1xuXG5mdW5jdGlvbiB0b0lEKHosIHgsIHkpIHtcbiAgICByZXR1cm4gKCgoMSA8PCB6KSAqIHkgKyB4KSAqIDMyKSArIHo7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKHZhciBpIGluIHNyYykgZGVzdFtpXSA9IHNyY1tpXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cbiIsbnVsbCxudWxsLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuc3VwcG9ydGVkID0gaXNTdXBwb3J0ZWQ7XG5leHBvcnRzLm5vdFN1cHBvcnRlZFJlYXNvbiA9IG5vdFN1cHBvcnRlZFJlYXNvbjtcblxuLyoqXG4gKiBUZXN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgYnJvd3NlciBzdXBwb3J0cyBNYXBib3ggR0wgSlNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ9ZmFsc2VdIFJldHVybiBgZmFsc2VgXG4gKiAgIGlmIHRoZSBwZXJmb3JtYW5jZSBvZiBNYXBib3ggR0wgSlMgd291bGQgYmUgZHJhbWF0aWNhbGx5IHdvcnNlIHRoYW5cbiAqICAgZXhwZWN0ZWQgKGkuZS4gYSBzb2Z0d2FyZSByZW5kZXJlciBpcyB3b3VsZCBiZSB1c2VkKVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTdXBwb3J0ZWQob3B0aW9ucykge1xuICAgIHJldHVybiAhbm90U3VwcG9ydGVkUmVhc29uKG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBub3RTdXBwb3J0ZWRSZWFzb24ob3B0aW9ucykge1xuICAgIGlmICghaXNCcm93c2VyKCkpIHJldHVybiAnbm90IGEgYnJvd3Nlcic7XG4gICAgaWYgKCFpc0FycmF5U3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNlbnQgQXJyYXkgc3VwcG9ydCc7XG4gICAgaWYgKCFpc0Z1bmN0aW9uU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IEZ1bmN0aW9uIHN1cHBvcnQnO1xuICAgIGlmICghaXNPYmplY3RTdXBwb3J0ZWQoKSkgcmV0dXJuICdpbnN1ZmZpY2llbnQgT2JqZWN0IHN1cHBvcnQnO1xuICAgIGlmICghaXNKU09OU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IEpTT04gc3VwcG9ydCc7XG4gICAgaWYgKCFpc1dvcmtlclN1cHBvcnRlZCgpKSByZXR1cm4gJ2luc3VmZmljaWVudCB3b3JrZXIgc3VwcG9ydCc7XG4gICAgaWYgKCFpc1VpbnQ4Q2xhbXBlZEFycmF5U3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IFVpbnQ4Q2xhbXBlZEFycmF5IHN1cHBvcnQnO1xuICAgIGlmICghaXNBcnJheUJ1ZmZlclN1cHBvcnRlZCgpKSByZXR1cm4gJ2luc3VmZmljaWVudCBBcnJheUJ1ZmZlciBzdXBwb3J0JztcbiAgICBpZiAoIWlzQ2FudmFzR2V0SW1hZ2VEYXRhU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IENhbnZhcy9nZXRJbWFnZURhdGEgc3VwcG9ydCc7XG4gICAgaWYgKCFpc1dlYkdMU3VwcG9ydGVkQ2FjaGVkKG9wdGlvbnMgJiYgb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSkgcmV0dXJuICdpbnN1ZmZpY2llbnQgV2ViR0wgc3VwcG9ydCc7XG4gICAgaWYgKCFpc05vdElFKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IEVDTUFTY3JpcHQgNiBzdXBwb3J0Jztcbn1cblxuZnVuY3Rpb24gaXNCcm93c2VyKCkge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5U3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICAgIEFycmF5LnByb3RvdHlwZSAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZXZlcnkgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLm1hcCAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuc29tZSAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodCAmJlxuICAgICAgICBBcnJheS5pc0FycmF5XG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvblN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdFN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBPYmplY3Qua2V5cyAmJlxuICAgICAgICBPYmplY3QuY3JlYXRlICYmXG4gICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJlxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyAmJlxuICAgICAgICBPYmplY3QuaXNTZWFsZWQgJiZcbiAgICAgICAgT2JqZWN0LmlzRnJvemVuICYmXG4gICAgICAgIE9iamVjdC5pc0V4dGVuc2libGUgJiZcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJlxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiZcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgJiZcbiAgICAgICAgT2JqZWN0LnNlYWwgJiZcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSAmJlxuICAgICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnNcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpc0pTT05TdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICdKU09OJyBpbiB3aW5kb3cgJiYgJ3BhcnNlJyBpbiBKU09OICYmICdzdHJpbmdpZnknIGluIEpTT047XG59XG5cbmZ1bmN0aW9uIGlzV29ya2VyU3VwcG9ydGVkKCkge1xuICAgIGlmICghKCdXb3JrZXInIGluIHdpbmRvdyAmJiAnQmxvYicgaW4gd2luZG93ICYmICdVUkwnIGluIHdpbmRvdykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoWycnXSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KTtcbiAgICB2YXIgd29ya2VyVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB2YXIgc3VwcG9ydGVkO1xuICAgIHZhciB3b3JrZXI7XG5cbiAgICB0cnkge1xuICAgICAgICB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVSTCk7XG4gICAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAod29ya2VyKSB7XG4gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICB9XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh3b3JrZXJVUkwpO1xuXG4gICAgcmV0dXJuIHN1cHBvcnRlZDtcbn1cblxuLy8gSUUxMSBvbmx5IHN1cHBvcnRzIGBVaW50OENsYW1wZWRBcnJheWAgYXMgb2YgdmVyc2lvblxuLy8gW0tCMjkyOTQzN10oaHR0cHM6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZW4tdXMva2IvMjkyOTQzNylcbmZ1bmN0aW9uIGlzVWludDhDbGFtcGVkQXJyYXlTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICdVaW50OENsYW1wZWRBcnJheScgaW4gd2luZG93O1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1zdXBwb3J0ZWQvaXNzdWVzLzE5XG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXc7XG59XG5cbi8vIFNvbWUgYnJvd3NlcnMgb3IgYnJvd3NlciBleHRlbnNpb25zIGJsb2NrIGFjY2VzcyB0byBjYW52YXMgZGF0YSB0byBwcmV2ZW50IGZpbmdlcnByaW50aW5nLlxuLy8gTWFwYm94IEdMIHVzZXMgdGhpcyBBUEkgdG8gbG9hZCBzcHJpdGVzIGFuZCBpbWFnZXMgaW4gZ2VuZXJhbC5cbmZ1bmN0aW9uIGlzQ2FudmFzR2V0SW1hZ2VEYXRhU3VwcG9ydGVkKCkge1xuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gMTtcbiAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBpbWFnZURhdGEgPSBjb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKTtcbiAgICByZXR1cm4gaW1hZ2VEYXRhICYmIGltYWdlRGF0YS53aWR0aCA9PT0gY2FudmFzLndpZHRoO1xufVxuXG52YXIgaXNXZWJHTFN1cHBvcnRlZENhY2hlID0ge307XG5mdW5jdGlvbiBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVkKGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpIHtcblxuICAgIGlmIChpc1dlYkdMU3VwcG9ydGVkQ2FjaGVbZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVbZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdF0gPSBpc1dlYkdMU3VwcG9ydGVkKGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpO1xuICAgIH1cblxuICAgIHJldHVybiBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVbZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdF07XG59XG5cbmlzU3VwcG9ydGVkLndlYkdMQ29udGV4dEF0dHJpYnV0ZXMgPSB7XG4gICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICBhbHBoYTogdHJ1ZSxcbiAgICBzdGVuY2lsOiB0cnVlLFxuICAgIGRlcHRoOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBnZXRXZWJHTENvbnRleHQoZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCkge1xuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblxuICAgIHZhciBhdHRyaWJ1dGVzID0gT2JqZWN0LmNyZWF0ZShpc1N1cHBvcnRlZC53ZWJHTENvbnRleHRBdHRyaWJ1dGVzKTtcbiAgICBhdHRyaWJ1dGVzLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgPSBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgYXR0cmlidXRlcykgfHxcbiAgICAgICAgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNXZWJHTFN1cHBvcnRlZChmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSB7XG4gICAgdmFyIGdsID0gZ2V0V2ViR0xDb250ZXh0KGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpO1xuICAgIGlmICghZ2wpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRyeSBjb21waWxpbmcgYSBzaGFkZXIgYW5kIGdldCBpdHMgY29tcGlsZSBzdGF0dXMuIFNvbWUgYnJvd3NlcnMgbGlrZSBCcmF2ZSBibG9jayB0aGlzIEFQSVxuICAgIC8vIHRvIHByZXZlbnQgZmluZ2VycHJpbnRpbmcuIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxzbyBtZWFucyB0aGF0IE1hcGJveCBHTCB3b24ndCB3b3JrLlxuICAgIHZhciBzaGFkZXI7XG4gICAgdHJ5IHtcbiAgICAgICAgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKGdsLlZFUlRFWF9TSEFERVIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gc29tZSBvbGRlciBicm93c2VycyB0aHJvdyBhbiBleGNlcHRpb24gdGhhdCBgY3JlYXRlU2hhZGVyYCBpcyBub3QgZGVmaW5lZFxuICAgICAgICAvLyBzbyBoYW5kbGUgdGhpcyBzZXBhcmF0ZWx5IGZyb20gdGhlIGNhc2Ugd2hlcmUgYnJvd3NlcnMgYmxvY2sgYGNyZWF0ZVNoYWRlcmBcbiAgICAgICAgLy8gZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghc2hhZGVyIHx8IGdsLmlzQ29udGV4dExvc3QoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsICd2b2lkIG1haW4oKSB7fScpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTtcbiAgICByZXR1cm4gZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc05vdElFKCkge1xuICAgIHJldHVybiAhZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xufVxuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCJjb25zdCBJTkYgPSAxZTIwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW55U0RGIHtcbiAgICBjb25zdHJ1Y3Rvcih7XG4gICAgICAgIGZvbnRTaXplID0gMjQsXG4gICAgICAgIGJ1ZmZlciA9IDMsXG4gICAgICAgIHJhZGl1cyA9IDgsXG4gICAgICAgIGN1dG9mZiA9IDAuMjUsXG4gICAgICAgIGZvbnRGYW1pbHkgPSAnc2Fucy1zZXJpZicsXG4gICAgICAgIGZvbnRXZWlnaHQgPSAnbm9ybWFsJyxcbiAgICAgICAgZm9udFN0eWxlID0gJ25vcm1hbCdcbiAgICB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgIHRoaXMuY3V0b2ZmID0gY3V0b2ZmO1xuICAgICAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cztcblxuICAgICAgICAvLyBtYWtlIHRoZSBjYW52YXMgc2l6ZSBiaWcgZW5vdWdoIHRvIGJvdGggaGF2ZSB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBhcm91bmQgdGhlIGdseXBoXG4gICAgICAgIC8vIGZvciBcImhhbG9cIiwgYW5kIGFjY291bnQgZm9yIHNvbWUgZ2x5cGhzIHBvc3NpYmx5IGJlaW5nIGxhcmdlciB0aGFuIHRoZWlyIGZvbnQgc2l6ZVxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplID0gZm9udFNpemUgKyBidWZmZXIgKiA0O1xuXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2NyZWF0ZUNhbnZhcyhzaXplKTtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7d2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlfSk7XG4gICAgICAgIGN0eC5mb250ID0gYCR7Zm9udFN0eWxlfSAke2ZvbnRXZWlnaHR9ICR7Zm9udFNpemV9cHggJHtmb250RmFtaWx5fWA7XG5cbiAgICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICdhbHBoYWJldGljJztcbiAgICAgICAgY3R4LnRleHRBbGlnbiA9ICdsZWZ0JzsgLy8gTmVjZXNzYXJ5IHNvIHRoYXQgUlRMIHRleHQgZG9lc24ndCBoYXZlIGRpZmZlcmVudCBhbGlnbm1lbnRcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICdibGFjayc7XG5cbiAgICAgICAgLy8gdGVtcG9yYXJ5IGFycmF5cyBmb3IgdGhlIGRpc3RhbmNlIHRyYW5zZm9ybVxuICAgICAgICB0aGlzLmdyaWRPdXRlciA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSAqIHNpemUpO1xuICAgICAgICB0aGlzLmdyaWRJbm5lciA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSAqIHNpemUpO1xuICAgICAgICB0aGlzLmYgPSBuZXcgRmxvYXQ2NEFycmF5KHNpemUpO1xuICAgICAgICB0aGlzLnogPSBuZXcgRmxvYXQ2NEFycmF5KHNpemUgKyAxKTtcbiAgICAgICAgdGhpcy52ID0gbmV3IFVpbnQxNkFycmF5KHNpemUpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDYW52YXMoc2l6ZSkge1xuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgY2FudmFzLndpZHRoID0gY2FudmFzLmhlaWdodCA9IHNpemU7XG4gICAgICAgIHJldHVybiBjYW52YXM7XG4gICAgfVxuXG4gICAgZHJhdyhjaGFyKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHdpZHRoOiBnbHlwaEFkdmFuY2UsXG4gICAgICAgICAgICBhY3R1YWxCb3VuZGluZ0JveEFzY2VudCxcbiAgICAgICAgICAgIGFjdHVhbEJvdW5kaW5nQm94RGVzY2VudCxcbiAgICAgICAgICAgIGFjdHVhbEJvdW5kaW5nQm94TGVmdCxcbiAgICAgICAgICAgIGFjdHVhbEJvdW5kaW5nQm94UmlnaHRcbiAgICAgICAgfSA9IHRoaXMuY3R4Lm1lYXN1cmVUZXh0KGNoYXIpO1xuXG4gICAgICAgIC8vIFRoZSBpbnRlZ2VyL3BpeGVsIHBhcnQgb2YgdGhlIHRvcCBhbGlnbm1lbnQgaXMgZW5jb2RlZCBpbiBtZXRyaWNzLmdseXBoVG9wXG4gICAgICAgIC8vIFRoZSByZW1haW5kZXIgaXMgaW1wbGljaXRseSBlbmNvZGVkIGluIHRoZSByYXN0ZXJpemF0aW9uXG4gICAgICAgIGNvbnN0IGdseXBoVG9wID0gTWF0aC5jZWlsKGFjdHVhbEJvdW5kaW5nQm94QXNjZW50KTtcbiAgICAgICAgY29uc3QgZ2x5cGhMZWZ0ID0gMDtcblxuICAgICAgICAvLyBJZiB0aGUgZ2x5cGggb3ZlcmZsb3dzIHRoZSBjYW52YXMgc2l6ZSwgaXQgd2lsbCBiZSBjbGlwcGVkIGF0IHRoZSBib3R0b20vcmlnaHRcbiAgICAgICAgY29uc3QgZ2x5cGhXaWR0aCA9IE1hdGgubWluKHRoaXMuc2l6ZSAtIHRoaXMuYnVmZmVyLCBNYXRoLmNlaWwoYWN0dWFsQm91bmRpbmdCb3hSaWdodCAtIGFjdHVhbEJvdW5kaW5nQm94TGVmdCkpO1xuICAgICAgICBjb25zdCBnbHlwaEhlaWdodCA9IE1hdGgubWluKHRoaXMuc2l6ZSAtIHRoaXMuYnVmZmVyLCBnbHlwaFRvcCArIE1hdGguY2VpbChhY3R1YWxCb3VuZGluZ0JveERlc2NlbnQpKTtcblxuICAgICAgICBjb25zdCB3aWR0aCA9IGdseXBoV2lkdGggKyAyICogdGhpcy5idWZmZXI7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGdseXBoSGVpZ2h0ICsgMiAqIHRoaXMuYnVmZmVyO1xuXG4gICAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWF4KHdpZHRoICogaGVpZ2h0LCAwKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShsZW4pO1xuICAgICAgICBjb25zdCBnbHlwaCA9IHtkYXRhLCB3aWR0aCwgaGVpZ2h0LCBnbHlwaFdpZHRoLCBnbHlwaEhlaWdodCwgZ2x5cGhUb3AsIGdseXBoTGVmdCwgZ2x5cGhBZHZhbmNlfTtcbiAgICAgICAgaWYgKGdseXBoV2lkdGggPT09IDAgfHwgZ2x5cGhIZWlnaHQgPT09IDApIHJldHVybiBnbHlwaDtcblxuICAgICAgICBjb25zdCB7Y3R4LCBidWZmZXIsIGdyaWRJbm5lciwgZ3JpZE91dGVyfSA9IHRoaXM7XG4gICAgICAgIGN0eC5jbGVhclJlY3QoYnVmZmVyLCBidWZmZXIsIGdseXBoV2lkdGgsIGdseXBoSGVpZ2h0KTtcbiAgICAgICAgY3R4LmZpbGxUZXh0KGNoYXIsIGJ1ZmZlciwgYnVmZmVyICsgZ2x5cGhUb3ApO1xuICAgICAgICBjb25zdCBpbWdEYXRhID0gY3R4LmdldEltYWdlRGF0YShidWZmZXIsIGJ1ZmZlciwgZ2x5cGhXaWR0aCwgZ2x5cGhIZWlnaHQpO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgZ3JpZHMgb3V0c2lkZSB0aGUgZ2x5cGggcmFuZ2UgdG8gYWxwaGEgMFxuICAgICAgICBncmlkT3V0ZXIuZmlsbChJTkYsIDAsIGxlbik7XG4gICAgICAgIGdyaWRJbm5lci5maWxsKDAsIDAsIGxlbik7XG5cbiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBnbHlwaEhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGdseXBoV2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBpbWdEYXRhLmRhdGFbNCAqICh5ICogZ2x5cGhXaWR0aCArIHgpICsgM10gLyAyNTU7IC8vIGFscGhhIHZhbHVlXG4gICAgICAgICAgICAgICAgaWYgKGEgPT09IDApIGNvbnRpbnVlOyAvLyBlbXB0eSBwaXhlbHNcblxuICAgICAgICAgICAgICAgIGNvbnN0IGogPSAoeSArIGJ1ZmZlcikgKiB3aWR0aCArIHggKyBidWZmZXI7XG5cbiAgICAgICAgICAgICAgICBpZiAoYSA9PT0gMSkgeyAvLyBmdWxseSBkcmF3biBwaXhlbHNcbiAgICAgICAgICAgICAgICAgICAgZ3JpZE91dGVyW2pdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZ3JpZElubmVyW2pdID0gSU5GO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gYWxpYXNlZCBwaXhlbHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZCA9IDAuNSAtIGE7XG4gICAgICAgICAgICAgICAgICAgIGdyaWRPdXRlcltqXSA9IGQgPiAwID8gZCAqIGQgOiAwO1xuICAgICAgICAgICAgICAgICAgICBncmlkSW5uZXJbal0gPSBkIDwgMCA/IGQgKiBkIDogMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlZHQoZ3JpZE91dGVyLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgdGhpcy5mLCB0aGlzLnYsIHRoaXMueik7XG4gICAgICAgIGVkdChncmlkSW5uZXIsIGJ1ZmZlciwgYnVmZmVyLCBnbHlwaFdpZHRoLCBnbHlwaEhlaWdodCwgd2lkdGgsIHRoaXMuZiwgdGhpcy52LCB0aGlzLnopO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBNYXRoLnNxcnQoZ3JpZE91dGVyW2ldKSAtIE1hdGguc3FydChncmlkSW5uZXJbaV0pO1xuICAgICAgICAgICAgZGF0YVtpXSA9IE1hdGgucm91bmQoMjU1IC0gMjU1ICogKGQgLyB0aGlzLnJhZGl1cyArIHRoaXMuY3V0b2ZmKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2x5cGg7XG4gICAgfVxufVxuXG4vLyAyRCBFdWNsaWRlYW4gc3F1YXJlZCBkaXN0YW5jZSB0cmFuc2Zvcm0gYnkgRmVsemVuc3p3YWxiICYgSHV0dGVubG9jaGVyIGh0dHBzOi8vY3MuYnJvd24uZWR1L35wZmYvcGFwZXJzL2R0LWZpbmFsLnBkZlxuZnVuY3Rpb24gZWR0KGRhdGEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgZ3JpZFNpemUsIGYsIHYsIHopIHtcbiAgICBmb3IgKGxldCB4ID0geDA7IHggPCB4MCArIHdpZHRoOyB4KyspIGVkdDFkKGRhdGEsIHkwICogZ3JpZFNpemUgKyB4LCBncmlkU2l6ZSwgaGVpZ2h0LCBmLCB2LCB6KTtcbiAgICBmb3IgKGxldCB5ID0geTA7IHkgPCB5MCArIGhlaWdodDsgeSsrKSBlZHQxZChkYXRhLCB5ICogZ3JpZFNpemUgKyB4MCwgMSwgd2lkdGgsIGYsIHYsIHopO1xufVxuXG4vLyAxRCBzcXVhcmVkIGRpc3RhbmNlIHRyYW5zZm9ybVxuZnVuY3Rpb24gZWR0MWQoZ3JpZCwgb2Zmc2V0LCBzdHJpZGUsIGxlbmd0aCwgZiwgdiwgeikge1xuICAgIHZbMF0gPSAwO1xuICAgIHpbMF0gPSAtSU5GO1xuICAgIHpbMV0gPSBJTkY7XG4gICAgZlswXSA9IGdyaWRbb2Zmc2V0XTtcblxuICAgIGZvciAobGV0IHEgPSAxLCBrID0gMCwgcyA9IDA7IHEgPCBsZW5ndGg7IHErKykge1xuICAgICAgICBmW3FdID0gZ3JpZFtvZmZzZXQgKyBxICogc3RyaWRlXTtcbiAgICAgICAgY29uc3QgcTIgPSBxICogcTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY29uc3QgciA9IHZba107XG4gICAgICAgICAgICBzID0gKGZbcV0gLSBmW3JdICsgcTIgLSByICogcikgLyAocSAtIHIpIC8gMjtcbiAgICAgICAgfSB3aGlsZSAocyA8PSB6W2tdICYmIC0tayA+IC0xKTtcblxuICAgICAgICBrKys7XG4gICAgICAgIHZba10gPSBxO1xuICAgICAgICB6W2tdID0gcztcbiAgICAgICAgeltrICsgMV0gPSBJTkY7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgcSA9IDAsIGsgPSAwOyBxIDwgbGVuZ3RoOyBxKyspIHtcbiAgICAgICAgd2hpbGUgKHpbayArIDFdIDwgcSkgaysrO1xuICAgICAgICBjb25zdCByID0gdltrXTtcbiAgICAgICAgY29uc3QgcXIgPSBxIC0gcjtcbiAgICAgICAgZ3JpZFtvZmZzZXQgKyBxICogc3RyaWRlXSA9IGZbcl0gKyBxciAqIHFyO1xuICAgIH1cbn1cbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiLy9cbi8vIE91ciBjdXN0b20gaW50cm8gcHJvdmlkZXMgYSBzcGVjaWFsaXplZCBcImRlZmluZSgpXCIgZnVuY3Rpb24sIGNhbGxlZCBieSB0aGVcbi8vIEFNRCBtb2R1bGVzIGJlbG93LCB0aGF0IHNldHMgdXAgdGhlIHdvcmtlciBibG9iIFVSTCBhbmQgdGhlbiBleGVjdXRlcyB0aGVcbi8vIG1haW4gbW9kdWxlLCBzdG9yaW5nIGl0cyBleHBvcnRlZCB2YWx1ZSBhcyAnbWFwbGlicmVnbCdcblxuLy8gVGhlIHRocmVlIFwiY2h1bmtzXCIgaW1wb3J0ZWQgaGVyZSBhcmUgcHJvZHVjZWQgYnkgYSBmaXJzdCBSb2xsdXAgcGFzcyxcbi8vIHdoaWNoIG91dHB1dHMgdGhlbSBhcyBBTUQgbW9kdWxlcy5cblxuLy8gU2hhcmVkIGRlcGVuZGVuY2llcywgaS5lLjpcbi8qXG5kZWZpbmUoWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gICAgLy8gQ29kZSBmb3IgYWxsIGNvbW1vbiBkZXBlbmRlbmNpZXNcbiAgICAvLyBFYWNoIG1vZHVsZSdzIGV4cG9ydHMgYXJlIGF0dGFjaGVkIGF0dGFjaGVkIHRvICdleHBvcnRzJyAod2l0aFxuICAgIC8vIG5hbWVzIHJld3JpdHRlbiB0byBhdm9pZCBjb2xsaXNpb25zLCBldGMuKVxufSlcbiovXG5pbXBvcnQgJy4vYnVpbGQvbWFwbGlicmVnbC9zaGFyZWQnO1xuXG4vLyBXb3JrZXIgYW5kIGl0cyB1bmlxdWUgZGVwZW5kZW5jaWVzLCBpLmUuOlxuLypcbmRlZmluZShbJy4vc2hhcmVkLmpzJ10sIGZ1bmN0aW9uIChfX3NoYXJlZF9fanMpIHtcbiAgICAvLyAgQ29kZSBmb3Igd29ya2VyIHNjcmlwdCBhbmQgaXRzIHVuaXF1ZSBkZXBlbmRlbmNpZXMuXG4gICAgLy8gIEV4cGVjdHMgdGhlIG91dHB1dCBvZiAnc2hhcmVkJyBtb2R1bGUgdG8gYmUgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50LFxuICAgIC8vICBzaW5jZSBhbGwgcmVmZXJlbmNlcyB0byBjb21tb24gZGVwcyBsb29rIGxpa2UsIGUuZy4sXG4gICAgLy8gIF9fc2hhcmVkX19qcy5zaGFwZVRleHQoKS5cbn0pO1xuKi9cbi8vIFdoZW4gdGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byBvdXIgY3VzdG9tIGRlZmluZSgpIGFib3ZlLFxuLy8gaXQgZ2V0cyBzdHJpbmdpZmllZCwgdG9nZXRoZXIgd2l0aCB0aGUgc2hhcmVkIHdyYXBwZXIgKHVzaW5nXG4vLyBGdW5jdGlvbi50b1N0cmluZygpKSwgYW5kIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9mIGNvZGUgaXMgbWFkZSBpbnRvIGFcbi8vIEJsb2IgVVJMIHRoYXQgZ2V0cyB1c2VkIGJ5IHRoZSBtYWluIG1vZHVsZSB0byBjcmVhdGUgdGhlIHdlYiB3b3JrZXJzLlxuaW1wb3J0ICcuL2J1aWxkL21hcGxpYnJlZ2wvd29ya2VyJztcblxuLy8gTWFpbiBtb2R1bGUgYW5kIGl0cyB1bmlxdWUgZGVwZW5kZW5jaWVzXG4vKlxuZGVmaW5lKFsnLi9zaGFyZWQuanMnXSwgZnVuY3Rpb24gKF9fc2hhcmVkX19qcykge1xuICAgIC8vICBDb2RlIGZvciBtYWluIEdMIEpTIG1vZHVsZSBhbmQgaXRzIHVuaXF1ZSBkZXBlbmRlbmNpZXMuXG4gICAgLy8gIEV4cGVjdHMgdGhlIG91dHB1dCBvZiAnc2hhcmVkJyBtb2R1bGUgdG8gYmUgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50LFxuICAgIC8vICBzaW5jZSBhbGwgcmVmZXJlbmNlcyB0byBjb21tb24gZGVwcyBsb29rIGxpa2UsIGUuZy4sXG4gICAgLy8gIF9fc2hhcmVkX19qcy5zaGFwZVRleHQoKS5cbiAgICAvL1xuICAgIC8vICBSZXR1cm5zIHRoZSBhY3R1YWwgbWFwbGlicmVnbCAoaS5lLiBzcmMvaW5kZXguanMpXG59KTtcbiovXG5pbXBvcnQgJy4vYnVpbGQvbWFwbGlicmVnbC9pbmRleCc7XG5cbmV4cG9ydCBkZWZhdWx0IG1hcGxpYnJlZ2w7XG4iXSwibmFtZXMiOlsib2JqZWN0QXNzaWduIiwiaW5oZXJpdHNfYnJvd3Nlck1vZHVsZSIsInJlcXVpcmUkJDAiLCJyZXF1aXJlJCQxIiwiY29tcGFyZSIsImFzc2VydE1vZHVsZSIsImJlemllciIsIlVuaXRCZXppZXIiLCJleHRlbmQiLCJjbG9uZSIsImV4cG9ydGVkIiwiUG9pbnQiLCJ3ZWJwU3VwcG9ydGVkIiwiYXNzZXJ0IiwiYXJyYXkiLCJ0b1N0cmluZyIsInBhcnNlQ1NTQ29sb3IiLCJ0eXBlcyIsInZhbHVlVG9TdHJpbmciLCJQYXJzaW5nQ29udGV4dCIsIkVYVEVOVCIsIm1lcmNhdG9yWGZyb21MbmciLCJtZXJjYXRvcllmcm9tTGF0IiwiaW50ZXJwb2xhdGVOdW1iZXIiLCJ0eXBlVG9TdHJpbmciLCJkZWZpbml0aW9ucyIsImlzQ29uc3RhbnQuaXNTdGF0ZUNvbnN0YW50IiwiaXNGZWF0dXJlQ29uc3RhbnQiLCJpc0NvbnN0YW50LmlzRmVhdHVyZUNvbnN0YW50IiwiaXNDb25zdGFudC5pc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQiLCJ2YWxpZGF0ZVNwZWMiLCJ2YWxpZGF0ZUZpbHRlciIsInZhbGlkYXRlUGFpbnRQcm9wZXJ0eSIsInZhbGlkYXRlTGF5b3V0UHJvcGVydHkiLCJ2YWxpZGF0ZVNvdXJjZSIsInZhbGlkYXRlTGlnaHQiLCJsYXRlc3RTdHlsZVNwZWMiLCJpc0NoYXIiLCJicm93c2VyIiwicnRsVGV4dFBsdWdpbiIsInN0eWxlU3BlYyIsImFsaWduIiwibGF5b3V0IiwibWVtYmVycyIsInNpemUiLCJhbGlnbm1lbnQiLCJtdXJtdXJoYXNoSnNNb2R1bGUiLCJtdXJtdXJoYXNoSnMiLCJtdXJtdXIzIiwic3dhcCIsImxheW91dEF0dHJpYnV0ZXMiLCJ0cmFuc2xhdGUiLCJwYWludCIsImVxdWFscyIsImNyZWF0ZSIsImdsTWF0cml4LkFSUkFZX1RZUEUiLCJjb3B5IiwiaWRlbnRpdHkiLCJmcm9tVmFsdWVzIiwic2V0IiwidHJhbnNwb3NlIiwiaW52ZXJ0IiwiYWRqb2ludCIsImRldGVybWluYW50IiwibXVsdGlwbHkiLCJyb3RhdGUiLCJzY2FsZSIsImZyb21Sb3RhdGlvbiIsImZyb21TY2FsaW5nIiwic3RyIiwiZnJvYiIsImFkZCIsInN1YnRyYWN0IiwiZXhhY3RFcXVhbHMiLCJnbE1hdHJpeC5FUFNJTE9OIiwibXVsdGlwbHlTY2FsYXIiLCJtdWx0aXBseVNjYWxhckFuZEFkZCIsIm11bCIsInN1YiIsImZyb21UcmFuc2xhdGlvbiIsImZyb21NYXQ0IiwiZnJvbVF1YXQiLCJyb3RhdGVYIiwicm90YXRlWSIsInJvdGF0ZVoiLCJmcm9tUm90YXRpb25UcmFuc2xhdGlvbiIsImdldFRyYW5zbGF0aW9uIiwibGVuZ3RoIiwiZGl2aWRlIiwiY2VpbCIsImZsb29yIiwibWluIiwibWF4Iiwicm91bmQiLCJzY2FsZUFuZEFkZCIsImRpc3RhbmNlIiwic3F1YXJlZERpc3RhbmNlIiwic3F1YXJlZExlbmd0aCIsIm5lZ2F0ZSIsImludmVyc2UiLCJub3JtYWxpemUiLCJkb3QiLCJjcm9zcyIsImxlcnAiLCJyYW5kb20iLCJnbE1hdHJpeC5SQU5ET00iLCJ0cmFuc2Zvcm1NYXQ0IiwidHJhbnNmb3JtTWF0MyIsInRyYW5zZm9ybVF1YXQiLCJhbmdsZSIsInplcm8iLCJkaXYiLCJkaXN0Iiwic3FyRGlzdCIsImxlbiIsInNxckxlbiIsImZvckVhY2giLCJjb25qdWdhdGUiLCJ2ZWM0LmNsb25lIiwidmVjNC5mcm9tVmFsdWVzIiwidmVjNC5jb3B5IiwidmVjNC5zZXQiLCJ2ZWM0LmFkZCIsInZlYzQuc2NhbGUiLCJ2ZWM0LmRvdCIsInZlYzQubGVycCIsInZlYzQubGVuZ3RoIiwidmVjNC5zcXVhcmVkTGVuZ3RoIiwidmVjNC5ub3JtYWxpemUiLCJ2ZWM0LmV4YWN0RXF1YWxzIiwidmVjNC5lcXVhbHMiLCJ2ZWMzLmNyZWF0ZSIsInZlYzMuZnJvbVZhbHVlcyIsInZlYzMuZG90IiwidmVjMy5jcm9zcyIsInZlYzMubGVuIiwidmVjMy5ub3JtYWxpemUiLCJtYXQzLmNyZWF0ZSIsInF1YXQuY3JlYXRlIiwibWF0NC5nZXRSb3RhdGlvbiIsIm1hdDQuZ2V0VHJhbnNsYXRpb24iLCJxdWF0LmNvcHkiLCJxdWF0LnJvdGF0ZVgiLCJxdWF0LnJvdGF0ZVkiLCJxdWF0LnJvdGF0ZVoiLCJxdWF0LmRvdCIsInF1YXQubGVuZ3RoIiwicXVhdC5zcXVhcmVkTGVuZ3RoIiwicHJvcGVydGllcyIsInByb2plY3RRdWVyeUdlb21ldHJ5IiwidmVjNC50cmFuc2Zvcm1NYXQ0IiwiZWFyY3V0TW9kdWxlIiwiZWFyY3V0XzEiLCJzaWduZWRBcmVhIiwiZGVmYXVsdENvbXBhcmUiLCJjbGFzc2lmeVJpbmdzIiwiRUFSQ1VUX01BWF9SSU5HUyIsImVhcmN1dCIsIlZlY3RvclRpbGVGZWF0dXJlIiwiVmVjdG9yVGlsZUxheWVyIiwiVmVjdG9yVGlsZSIsInJlcXVpcmUkJDIiLCJ2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzIiwibXZ0IiwiYWRkVmVydGV4IiwibGF5b3V0QXR0cmlidXRlc0V4dCIsImllZWU3NTQiLCJib3JkZXIiLCJQcm90b2J1ZiIsIldyaXRpbmdNb2RlIiwiaW50ZXJwb2xhdGUiLCJRdWV1ZSIsIlN5bWJvbEJ1Y2tldCIsIm1hdDQuaWRlbnRpdHkiLCJnbG9iYWxSVExUZXh0UGx1Z2luIiwidHJhbnNmb3JtVGV4dCIsImNpcmNsZSIsImhlYXRtYXAiLCJoaWxsc2hhZGUiLCJmaWxsIiwiZmlsbEV4dHJ1c2lvbiIsImxpbmUiLCJzeW1ib2wiLCJiYWNrZ3JvdW5kIiwicmFzdGVyIiwiTG5nTGF0Qm91bmRzIiwidnQiLCJmZWF0dXJlRmlsdGVyIiwiUGVyZm9ybWFuY2VNYXJrZXJzIiwicmVmUHJvcGVydGllcyIsImNyZWF0ZVN0eWxlTGF5ZXIiLCJwb3RwYWNrIiwiQWxwaGFJbWFnZSIsInJlZ2lzdGVyIiwiT3ZlcnNjYWxlZFRpbGVJRCIsIkNvbGxpc2lvbkJveEFycmF5IiwiRGljdGlvbmFyeUNvZGVyIiwiRmVhdHVyZUluZGV4Iiwid2Fybk9uY2UiLCJtYXBPYmplY3QiLCJJbWFnZUF0bGFzIiwicGVyZm9ybVN5bWJvbExheW91dCIsIkxpbmVCdWNrZXQiLCJGaWxsQnVja2V0IiwiRmlsbEV4dHJ1c2lvbkJ1Y2tldCIsIkV2YWx1YXRpb25QYXJhbWV0ZXJzIiwiZ2V0QXJyYXlCdWZmZXIiLCJSZXF1ZXN0UGVyZm9ybWFuY2UiLCJpc0ltYWdlQml0bWFwIiwiREVNRGF0YSIsIlJHQkFJbWFnZSIsInJld2luZCIsIkZlYXR1cmVXcmFwcGVyIiwiR2VvSlNPTldyYXBwZXIiLCJ2dFBiZk1vZHVsZSIsInZ0UGJmIiwic29ydCIsInRyYW5zZm9ybSIsImNyZWF0ZUV4cHJlc3Npb24iLCJnZXRKU09OIiwiQWN0b3IiLCJlbmZvcmNlQ2FjaGVTaXplTGltaXQiLCJSZXNvdXJjZVR5cGUiLCJnZXRJbWFnZSIsIkV2ZW50ZWQiLCJFcnJvckV2ZW50IiwiRXZlbnQiLCJJbWFnZVBvc2l0aW9uIiwicGFyc2VHbHlwaFBCRiIsImFzeW5jQWxsIiwic3BoZXJpY2FsVG9DYXJ0ZXNpYW4iLCJQcm9wZXJ0aWVzIiwiRGF0YUNvbnN0YW50UHJvcGVydHkiLCJUcmFuc2l0aW9uYWJsZSIsImVtaXRWYWxpZGF0aW9uRXJyb3JzIiwidmFsaWRhdGVTdHlsZSIsInVuaXF1ZUlkIiwicGljayIsImNhY2hlRW50cnlQb3NzaWJseUFkZGVkIiwiY3JlYXRlTGF5b3V0IiwiTWVyY2F0b3JDb29yZGluYXRlIiwiUmFzdGVyQm91bmRzQXJyYXkiLCJTZWdtZW50VmVjdG9yIiwiQ2Fub25pY2FsVGlsZUlEIiwiZ2V0VmlkZW8iLCJWYWxpZGF0aW9uRXJyb3IiLCJ2ZWN0b3IiLCJyYXN0ZXJEZW0iLCJnZW9qc29uIiwidmlkZW8iLCJpbWFnZSIsImNhbnZhcyIsImJpbmRBbGwiLCJtYXQ0LmNyZWF0ZSIsIm1hdDQudHJhbnNsYXRlIiwibWF0NC5zY2FsZSIsIm1hdDQubXVsdGlwbHkiLCJkZXNlcmlhbGl6ZUJ1Y2tldCIsImxhenlMb2FkUlRMVGV4dFBsdWdpbiIsInRvRXZhbHVhdGlvbkZlYXR1cmUiLCJHZW9KU09ORmVhdHVyZSIsInBhcnNlQ2FjaGVDb250cm9sIiwiY3JlYXRlU291cmNlIiwia2V5c0RpZmZlcmVuY2UiLCJ3ZWJXb3JrZXJGYWN0b3J5IiwibGF0ZXN0IiwiaXNFcXVhbCIsImNsYW1wIiwibWF0NC5yb3RhdGVaIiwibWF0NC5jbG9uZSIsInN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbSIsInN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yRmVhdHVyZSIsImFkZER5bmFtaWNBdHRyaWJ1dGVzIiwicHJvamVjdGlvbi5wcm9qZWN0IiwicHJvamVjdGlvbi5nZXRQZXJzcGVjdGl2ZVJhdGlvIiwiT05FX0VNIiwicHJvamVjdGlvbi5wbGFjZUZpcnN0QW5kTGFzdEdseXBoIiwiY2xpcExpbmUiLCJpbnRlcnNlY3Rpb25UZXN0cy5wb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24iLCJwcm9qZWN0aW9uLnh5VHJhbnNmb3JtTWF0NCIsImdldEFuY2hvckFsaWdubWVudCIsImV2YWx1YXRlVmFyaWFibGVPZmZzZXQiLCJwcm9qZWN0aW9uLmdldExhYmVsUGxhbmVNYXRyaXgiLCJwcm9qZWN0aW9uLmdldEdsQ29vcmRNYXRyaXgiLCJnZXRPdmVybGFwTW9kZSIsIm1hdDQuaW52ZXJ0IiwiZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbiIsIl9lbWl0VmFsaWRhdGlvbkVycm9ycyIsImRpZmZPcGVyYXRpb25zIiwiZ2V0V29ya2VyUG9vbCIsIlpvb21IaXN0b3J5IiwiZ2V0UmVmZXJyZXIiLCJ0cmlnZ2VyUGx1Z2luQ29tcGxldGlvbkV2ZW50IiwiZGVyZWYiLCJ2YWxpZGF0ZUN1c3RvbVN0eWxlTGF5ZXIiLCJkZWVwRXF1YWwiLCJmaWx0ZXJPYmplY3QiLCJydGxUZXh0UGx1Z2luRXZlbnRlZCIsIm1ha2VSZXF1ZXN0IiwicmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZSIsIlVuaWZvcm1NYXRyaXg0ZiIsIlVuaWZvcm0zZiIsIlVuaWZvcm0xZiIsIlVuaWZvcm0xaSIsIlVuaWZvcm0yZiIsIm1hdDMuZnJvbVJvdGF0aW9uIiwidmVjMy50cmFuc2Zvcm1NYXQzIiwiVW5pZm9ybUNvbG9yIiwibWF0NC5vcnRobyIsIlVuaWZvcm00ZiIsIkNvbG9yIiwiQUxXQVlTIiwibWF0NC5tdWwiLCJDb2xsaXNpb25DaXJjbGVMYXlvdXRBcnJheSIsImNvbGxpc2lvbkNpcmNsZUxheW91dCIsIlF1YWRUcmlhbmdsZUFycmF5IiwiZXZhbHVhdGVTaXplRm9yWm9vbSIsInN5bWJvbFByb2plY3Rpb24uZ2V0TGFiZWxQbGFuZU1hdHJpeCIsInN5bWJvbFByb2plY3Rpb24uaGlkZUdseXBocyIsInN5bWJvbFByb2plY3Rpb24ucHJvamVjdCIsInN5bWJvbFByb2plY3Rpb24uZ2V0UGVyc3BlY3RpdmVSYXRpbyIsImV2YWx1YXRlU2l6ZUZvckZlYXR1cmUiLCJzeW1ib2xQcm9qZWN0aW9uLmdldEdsQ29vcmRNYXRyaXgiLCJzeW1ib2xQcm9qZWN0aW9uLnVwZGF0ZUxpbmVMYWJlbHMiLCJuZXh0UG93ZXJPZlR3byIsInJlbmRlckNvbG9yUmFtcCIsImRyYXciLCJkZWJ1ZyIsImN1c3RvbSIsIlBvc0FycmF5IiwiTGluZVN0cmlwSW5kZXhBcnJheSIsIlRyaWFuZ2xlSW5kZXhBcnJheSIsInZlYzMuc3ViIiwidmVjMy5zY2FsZSIsInZlYzMuYWRkIiwidmVjMy5jbG9uZSIsIm51bWJlciIsIkxuZ0xhdCIsIndyYXAiLCJtYXQyLmNyZWF0ZSIsIm1hdDIucm90YXRlIiwiVW53cmFwcGVkVGlsZUlEIiwidmVjMi5zcXJMZW4iLCJtYXQ0LnBlcnNwZWN0aXZlIiwibWF0NC5yb3RhdGVYIiwibWVyY2F0b3JaZnJvbUFsdGl0dWRlIiwiZGVmYXVsdE9wdGlvbnMiLCJfZWFzZSIsImRlZmF1bHRFYXNpbmciLCJQZXJmb3JtYW5jZVV0aWxzIiwic2V0Q2FjaGVMaW1pdHMiLCJzZXRSVExUZXh0UGx1Z2luIiwiZ2V0UlRMVGV4dFBsdWdpblN0YXR1cyIsIkFKQVhFcnJvciIsImNvbmZpZyIsImNsZWFyVGlsZUNhY2hlIiwiaXNTYWZhcmkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQSxZQUFZLENBQUM7QUFDYjtBQUNBLElBQUkscUJBQXFCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDO0FBQ3pELElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDO0FBQ3JELElBQUksZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQztBQUM3RDtBQUNBLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRTtBQUN2QixDQUFDLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO0FBQ3hDLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0FBQy9FLEVBQUU7QUFDRjtBQUNBLENBQUMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxlQUFlLEdBQUc7QUFDM0IsQ0FBQyxJQUFJO0FBQ0wsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtBQUN0QixHQUFHLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO0FBQ3BELEdBQUcsT0FBTyxLQUFLLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNqQixFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDL0IsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0MsR0FBRztBQUNILEVBQUUsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRTtBQUNsRSxHQUFHLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssWUFBWSxFQUFFO0FBQ3hDLEdBQUcsT0FBTyxLQUFLLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNqQixFQUFFLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxNQUFNLEVBQUU7QUFDN0QsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQzFCLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3BELElBQUksc0JBQXNCLEVBQUU7QUFDNUIsR0FBRyxPQUFPLEtBQUssQ0FBQztBQUNoQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ2QsRUFBRSxDQUFDLE9BQU8sR0FBRyxFQUFFO0FBQ2Y7QUFDQSxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ2YsRUFBRTtBQUNGLENBQUM7QUFDRDtBQUNBLElBQUFBLGNBQWMsR0FBRyxlQUFlLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLFVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRTtBQUMvRSxDQUFDLElBQUksSUFBSSxDQUFDO0FBQ1YsQ0FBQyxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDM0IsQ0FBQyxJQUFJLE9BQU8sQ0FBQztBQUNiO0FBQ0EsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM1QyxFQUFFLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUI7QUFDQSxFQUFFLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ3hCLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRTtBQUN2QyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsSUFBSTtBQUNKLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxxQkFBcUIsRUFBRTtBQUM3QixHQUFHLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzVDLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ2pELEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxLQUFLO0FBQ0wsSUFBSTtBQUNKLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7QUFDQSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ1gsQ0FBQyxDQUFBOzs7O0FDekZELElBQUEsZUFBYyxHQUFHLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRTtBQUN4QyxFQUFFLE9BQU8sR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7QUFDdkMsT0FBTyxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssVUFBVTtBQUNyQyxPQUFPLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxVQUFVO0FBQ3JDLE9BQU8sT0FBTyxHQUFHLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQztBQUMzQyxDQUFBLENBQUE7Ozs7QUNMQSxJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7QUFDekM7QUFDQSxFQUFFQyxrQkFBQSxDQUFBLE9BQWMsR0FBRyxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO0FBQ3RELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUE7QUFDM0IsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRTtBQUN4RCxNQUFNLFdBQVcsRUFBRTtBQUNuQixRQUFRLEtBQUssRUFBRSxJQUFJO0FBQ25CLFFBQVEsVUFBVSxFQUFFLEtBQUs7QUFDekIsUUFBUSxRQUFRLEVBQUUsSUFBSTtBQUN0QixRQUFRLFlBQVksRUFBRSxJQUFJO0FBQzFCLE9BQU87QUFDUCxLQUFLLENBQUMsQ0FBQztBQUNQLEdBQUcsQ0FBQztBQUNKLENBQUMsTUFBTTtBQUNQO0FBQ0EsRUFBRUEsa0JBQUEsQ0FBQSxPQUFjLEdBQUcsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUN0RCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFBO0FBQzNCLElBQUksSUFBSSxRQUFRLEdBQUcsWUFBWSxFQUFFLENBQUE7QUFDakMsSUFBSSxRQUFRLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUE7QUFDNUMsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksUUFBUSxFQUFFLENBQUE7QUFDbkMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUE7QUFDckMsR0FBRyxDQUFBO0FBQ0gsQ0FBQTs7Ozs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxZQUFZLEdBQUcsVUFBVSxDQUFDO0FBQzlCLE9BQWlCLENBQUEsTUFBQSxHQUFBLFNBQVMsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNwQixJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNyQixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQy9DLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxLQUFLO0FBQ0wsSUFBSSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDWixFQUFFLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQztBQUN2QixFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDeEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN4RCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUMvQixJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMzQixJQUFJLFFBQVEsQ0FBQztBQUNiLE1BQU0sS0FBSyxJQUFJLEVBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxNQUFNLEtBQUssSUFBSSxFQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUMsTUFBTSxLQUFLLElBQUk7QUFDZixRQUFRLElBQUk7QUFDWixVQUFVLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNwQixVQUFVLE9BQU8sWUFBWSxDQUFDO0FBQzlCLFNBQVM7QUFDVCxNQUFNO0FBQ04sUUFBUSxPQUFPLENBQUMsQ0FBQztBQUNqQixLQUFLO0FBQ0wsR0FBRyxDQUFDLENBQUM7QUFDTCxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hELElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDbkMsTUFBTSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNyQixLQUFLLE1BQU07QUFDWCxNQUFNLEdBQUcsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLEtBQUs7QUFDTCxHQUFHO0FBQ0gsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFBLENBQUEsU0FBQSxHQUFvQixTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUU7QUFDdEM7QUFDQSxFQUFFLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNuQyxJQUFJLE9BQU8sV0FBVztBQUN0QixNQUFNLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMvRCxLQUFLLENBQUM7QUFDTixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksT0FBTyxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUU7QUFDdEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUNkLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLEVBQUUsU0FBUyxVQUFVLEdBQUc7QUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2pCLE1BQU0sSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7QUFDcEMsUUFBUSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLE9BQU8sTUFBTSxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtBQUMzQyxRQUFRLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsT0FBTyxNQUFNO0FBQ2IsUUFBUSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE9BQU87QUFDUCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMLElBQUksT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyQyxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDaEIsSUFBSSxZQUFZLENBQUM7QUFDakIsT0FBbUIsQ0FBQSxRQUFBLEdBQUEsU0FBUyxHQUFHLEVBQUU7QUFDakMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUM7QUFDL0IsSUFBSSxZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO0FBQ2hELEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUMxQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDcEIsSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtBQUNqRSxNQUFNLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7QUFDNUIsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVztBQUMvQixRQUFRLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMzRCxRQUFRLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDbEQsT0FBTyxDQUFDO0FBQ1IsS0FBSyxNQUFNO0FBQ1gsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUM7QUFDbEMsS0FBSztBQUNMLEdBQUc7QUFDSCxFQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRTtBQUM1QjtBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUc7QUFDWixJQUFJLElBQUksRUFBRSxFQUFFO0FBQ1osSUFBSSxPQUFPLEVBQUUsY0FBYztBQUMzQixHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkQsRUFBRSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN2QjtBQUNBLElBQUksR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDMUIsR0FBRyxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ25CO0FBQ0EsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztBQUMxRCxFQUFFLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztBQUM1QyxFQUFFLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNsRCxFQUFFLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxHQUFHLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztBQUMvRCxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsT0FBTyxHQUFHLGdCQUFnQixDQUFDO0FBQ2pELEVBQUUsT0FBTyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUNELE9BQUEsQ0FBQSxPQUFBLEdBQWtCLE9BQU8sQ0FBQztBQUMxQjtBQUNBO0FBQ0E7QUFDQSxPQUFPLENBQUMsTUFBTSxHQUFHO0FBQ2pCLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUNsQixFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7QUFDcEIsRUFBRSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQ3ZCLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUNyQixFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDcEIsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ25CLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNwQixFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDbkIsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ25CLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNwQixFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDdEIsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0EsT0FBTyxDQUFDLE1BQU0sR0FBRztBQUNqQixFQUFFLFNBQVMsRUFBRSxNQUFNO0FBQ25CLEVBQUUsUUFBUSxFQUFFLFFBQVE7QUFDcEIsRUFBRSxTQUFTLEVBQUUsUUFBUTtBQUNyQixFQUFFLFdBQVcsRUFBRSxNQUFNO0FBQ3JCLEVBQUUsTUFBTSxFQUFFLE1BQU07QUFDaEIsRUFBRSxRQUFRLEVBQUUsT0FBTztBQUNuQixFQUFFLE1BQU0sRUFBRSxTQUFTO0FBQ25CO0FBQ0EsRUFBRSxRQUFRLEVBQUUsS0FBSztBQUNqQixDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0EsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFO0FBQzFDLEVBQUUsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN4QztBQUNBLEVBQUUsSUFBSSxLQUFLLEVBQUU7QUFDYixJQUFJLE9BQU8sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDM0QsV0FBVyxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdEQsR0FBRyxNQUFNO0FBQ1QsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNmLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUU7QUFDeEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxXQUFXLENBQUMsS0FBSyxFQUFFO0FBQzVCLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2hCO0FBQ0EsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNuQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckIsR0FBRyxDQUFDLENBQUM7QUFDTDtBQUNBLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO0FBQy9DO0FBQ0E7QUFDQSxFQUFFLElBQUksR0FBRyxDQUFDLGFBQWE7QUFDdkIsTUFBTSxLQUFLO0FBQ1gsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztBQUMvQjtBQUNBLE1BQU0sS0FBSyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsT0FBTztBQUN2QztBQUNBLE1BQU0sRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3JFLElBQUksSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDL0MsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3hCLE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ2hELEtBQUs7QUFDTCxJQUFJLE9BQU8sR0FBRyxDQUFDO0FBQ2YsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLElBQUksU0FBUyxHQUFHLGVBQWUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUMsRUFBRSxJQUFJLFNBQVMsRUFBRTtBQUNqQixJQUFJLE9BQU8sU0FBUyxDQUFDO0FBQ3JCLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsSUFBSSxXQUFXLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RDO0FBQ0EsRUFBRSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUU7QUFDdEIsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxFQUFFLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQztBQUNwQixVQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDN0UsSUFBSSxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QixHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUN6QixJQUFJLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzNCLE1BQU0sSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7QUFDckQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDOUQsS0FBSztBQUNMLElBQUksSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDekIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzFFLEtBQUs7QUFDTCxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3ZCLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0RSxLQUFLO0FBQ0wsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUN4QixNQUFNLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNwRDtBQUNBO0FBQ0EsRUFBRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUN0QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDakIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDeEIsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3pCLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7QUFDaEQsSUFBSSxJQUFJLEdBQUcsWUFBWSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEMsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3ZCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdkQsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3JCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEQsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3RCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEMsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDMUQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFO0FBQ3hCLElBQUksSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDekIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzFFLEtBQUssTUFBTTtBQUNYLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNoRCxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0EsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2QjtBQUNBLEVBQUUsSUFBSSxNQUFNLENBQUM7QUFDYixFQUFFLElBQUksS0FBSyxFQUFFO0FBQ2IsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0RSxHQUFHLE1BQU07QUFDVCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxFQUFFO0FBQ3BDLE1BQU0sT0FBTyxjQUFjLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvRSxLQUFLLENBQUMsQ0FBQztBQUNQLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQjtBQUNBLEVBQUUsT0FBTyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxlQUFlLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUNyQyxFQUFFLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQztBQUN4QixJQUFJLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDakQsRUFBRSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUN2QixJQUFJLElBQUksTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO0FBQ25FLDhDQUE4QyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQztBQUNsRSw4Q0FBOEMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDMUUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3pDLEdBQUc7QUFDSCxFQUFFLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQztBQUNyQixJQUFJLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzdDLEVBQUUsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDO0FBQ3RCLElBQUksT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDOUM7QUFDQSxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQztBQUNuQixJQUFJLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUU7QUFDNUIsRUFBRSxPQUFPLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFELENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtBQUNsRSxFQUFFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDaEQsSUFBSSxJQUFJLGNBQWMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDMUMsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxXQUFXO0FBQ3RFLFVBQVUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDNUIsS0FBSyxNQUFNO0FBQ1gsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RCLEtBQUs7QUFDTCxHQUFHO0FBQ0gsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxFQUFFO0FBQzdCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDN0IsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxXQUFXO0FBQ3RFLFVBQVUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdEIsS0FBSztBQUNMLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQzNFLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQztBQUN0QixFQUFFLElBQUksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQzlFLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ2hCLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ2xCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdEQsS0FBSyxNQUFNO0FBQ1gsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDL0MsS0FBSztBQUNMLEdBQUcsTUFBTTtBQUNULElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ2xCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQy9DLEtBQUs7QUFDTCxHQUFHO0FBQ0gsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRTtBQUN6QyxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUMzQixHQUFHO0FBQ0gsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDMUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRTtBQUNoQyxRQUFRLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDakQsT0FBTyxNQUFNO0FBQ2IsUUFBUSxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxPQUFPO0FBQ1AsTUFBTSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDbEMsUUFBUSxJQUFJLEtBQUssRUFBRTtBQUNuQixVQUFVLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRTtBQUNuRCxZQUFZLE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQztBQUMvQixXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLFNBQVMsTUFBTTtBQUNmLFVBQVUsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRTtBQUMxRCxZQUFZLE9BQU8sS0FBSyxHQUFHLElBQUksQ0FBQztBQUNoQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEIsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLLE1BQU07QUFDWCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRCxLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDekIsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0FBQ3JDLE1BQU0sT0FBTyxHQUFHLENBQUM7QUFDakIsS0FBSztBQUNMLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLEVBQUU7QUFDcEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN2QyxLQUFLLE1BQU07QUFDWCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7QUFDdEMsa0JBQWtCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQ3RDLGtCQUFrQixPQUFPLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzNDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3pDLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7QUFDM0IsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0FBQ3BELEVBQUUsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDakQsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUNsQixJQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFDOUMsSUFBSSxPQUFPLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDaEUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ1I7QUFDQSxFQUFFLElBQUksTUFBTSxHQUFHLEVBQUUsRUFBRTtBQUNuQixJQUFJLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNwQixZQUFZLElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7QUFDNUMsV0FBVyxHQUFHO0FBQ2QsV0FBVyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUMvQixXQUFXLEdBQUc7QUFDZCxXQUFXLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRTtBQUNyQixFQUFFLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBQ0QsT0FBQSxDQUFBLE9BQUEsR0FBa0IsT0FBTyxDQUFDO0FBQzFCO0FBQ0EsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFO0FBQ3hCLEVBQUUsT0FBTyxPQUFPLEdBQUcsS0FBSyxTQUFTLENBQUM7QUFDbEMsQ0FBQztBQUNELE9BQUEsQ0FBQSxTQUFBLEdBQW9CLFNBQVMsQ0FBQztBQUM5QjtBQUNBLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRTtBQUNyQixFQUFFLE9BQU8sR0FBRyxLQUFLLElBQUksQ0FBQztBQUN0QixDQUFDO0FBQ0QsT0FBQSxDQUFBLE1BQUEsR0FBaUIsTUFBTSxDQUFDO0FBQ3hCO0FBQ0EsU0FBUyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7QUFDaEMsRUFBRSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUM7QUFDckIsQ0FBQztBQUNELE9BQUEsQ0FBQSxpQkFBQSxHQUE0QixpQkFBaUIsQ0FBQztBQUM5QztBQUNBLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRTtBQUN2QixFQUFFLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDO0FBQ2pDLENBQUM7QUFDRCxPQUFBLENBQUEsUUFBQSxHQUFtQixRQUFRLENBQUM7QUFDNUI7QUFDQSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDdkIsRUFBRSxPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQztBQUNqQyxDQUFDO0FBQ0QsT0FBQSxDQUFBLFFBQUEsR0FBbUIsUUFBUSxDQUFDO0FBQzVCO0FBQ0EsU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFO0FBQ3ZCLEVBQUUsT0FBTyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUM7QUFDakMsQ0FBQztBQUNELE9BQUEsQ0FBQSxRQUFBLEdBQW1CLFFBQVEsQ0FBQztBQUM1QjtBQUNBLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRTtBQUMxQixFQUFFLE9BQU8sR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFDRCxPQUFBLENBQUEsV0FBQSxHQUFzQixXQUFXLENBQUM7QUFDbEM7QUFDQSxTQUFTLFFBQVEsQ0FBQyxFQUFFLEVBQUU7QUFDdEIsRUFBRSxPQUFPLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssaUJBQWlCLENBQUM7QUFDbEUsQ0FBQztBQUNELE9BQUEsQ0FBQSxRQUFBLEdBQW1CLFFBQVEsQ0FBQztBQUM1QjtBQUNBLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRTtBQUN2QixFQUFFLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUM7QUFDakQsQ0FBQztBQUNELE9BQUEsQ0FBQSxRQUFBLEdBQW1CLFFBQVEsQ0FBQztBQUM1QjtBQUNBLFNBQVMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUNuQixFQUFFLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxlQUFlLENBQUM7QUFDOUQsQ0FBQztBQUNELE9BQUEsQ0FBQSxNQUFBLEdBQWlCLE1BQU0sQ0FBQztBQUN4QjtBQUNBLFNBQVMsT0FBTyxDQUFDLENBQUMsRUFBRTtBQUNwQixFQUFFLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQztBQUNwQixPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsSUFBSSxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUNELE9BQUEsQ0FBQSxPQUFBLEdBQWtCLE9BQU8sQ0FBQztBQUMxQjtBQUNBLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRTtBQUN6QixFQUFFLE9BQU8sT0FBTyxHQUFHLEtBQUssVUFBVSxDQUFDO0FBQ25DLENBQUM7QUFDRCxPQUFBLENBQUEsVUFBQSxHQUFxQixVQUFVLENBQUM7QUFDaEM7QUFDQSxTQUFTLFdBQVcsQ0FBQyxHQUFHLEVBQUU7QUFDMUIsRUFBRSxPQUFPLEdBQUcsS0FBSyxJQUFJO0FBQ3JCLFNBQVMsT0FBTyxHQUFHLEtBQUssU0FBUztBQUNqQyxTQUFTLE9BQU8sR0FBRyxLQUFLLFFBQVE7QUFDaEMsU0FBUyxPQUFPLEdBQUcsS0FBSyxRQUFRO0FBQ2hDLFNBQVMsT0FBTyxHQUFHLEtBQUssUUFBUTtBQUNoQyxTQUFTLE9BQU8sR0FBRyxLQUFLLFdBQVcsQ0FBQztBQUNwQyxDQUFDO0FBQ0QsT0FBQSxDQUFBLFdBQUEsR0FBc0IsV0FBVyxDQUFDO0FBQ2xDO0FBQ0EsT0FBQSxDQUFBLFFBQUEsR0FBbUJDLGVBQTZCLENBQUM7QUFDakQ7QUFDQSxTQUFTLGNBQWMsQ0FBQyxDQUFDLEVBQUU7QUFDM0IsRUFBRSxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUNoQixFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFDRDtBQUNBO0FBQ0EsSUFBSSxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7QUFDM0UsY0FBYyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ25DO0FBQ0E7QUFDQSxTQUFTLFNBQVMsR0FBRztBQUNyQixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7QUFDckIsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDL0IsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2pDLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxPQUFBLENBQUEsR0FBQSxHQUFjLFdBQVc7QUFDekIsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUNoRixDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFBLENBQUEsUUFBQSxHQUFtQkMsa0JBQUFBLENBQUFBLE9BQW1CLENBQUM7QUFDdkM7QUFDQSxPQUFBLENBQUEsT0FBQSxHQUFrQixTQUFTLE1BQU0sRUFBRSxHQUFHLEVBQUU7QUFDeEM7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFDNUM7QUFDQSxFQUFFLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRTtBQUNkLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxHQUFHO0FBQ0gsRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFDRjtBQUNBLFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDbkMsRUFBRSxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekQsQ0FBQTs7O0FDemtCQSxZQUFZLENBQUM7QUFDYjtBQUNBLElBQUksWUFBWSxHQUFHRCxjQUF3QixDQUFDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0UsU0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdkIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDZixJQUFJLE9BQU8sQ0FBQyxDQUFDO0FBQ2IsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ25CLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNuQjtBQUNBLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDdEQsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDdkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxNQUFNO0FBQ1osS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ2IsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2QsR0FBRztBQUNILEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ2IsSUFBSSxPQUFPLENBQUMsQ0FBQztBQUNiLEdBQUc7QUFDSCxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUNELFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUNyQixFQUFFLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRTtBQUNyRSxJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckMsR0FBRztBQUNILEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksR0FBR0QsTUFBZ0IsQ0FBQztBQUM1QixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztBQUM3QyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztBQUNuQyxJQUFJLGtCQUFrQixJQUFJLFlBQVk7QUFDdEMsRUFBRSxPQUFPLFNBQVMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDO0FBQzFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDTCxTQUFTLFNBQVMsRUFBRSxHQUFHLEVBQUU7QUFDekIsRUFBRSxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBQ0QsU0FBUyxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQ3hCLEVBQUUsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDeEIsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixHQUFHO0FBQ0gsRUFBRSxJQUFJLE9BQU8sTUFBTSxDQUFDLFdBQVcsS0FBSyxVQUFVLEVBQUU7QUFDaEQsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixHQUFHO0FBQ0gsRUFBRSxJQUFJLE9BQU8sV0FBVyxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7QUFDaEQsSUFBSSxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEMsR0FBRztBQUNILEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNmLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsR0FBRztBQUNILEVBQUUsSUFBSSxNQUFNLFlBQVksUUFBUSxFQUFFO0FBQ2xDLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsR0FBRztBQUNILEVBQUUsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLFlBQVksV0FBVyxFQUFFO0FBQzdELElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsR0FBRztBQUNILEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sR0FBR0UsUUFBYyxDQUFBLE9BQUEsR0FBRyxFQUFFLENBQUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxLQUFLLEdBQUcsNkJBQTZCLENBQUM7QUFDMUM7QUFDQSxTQUFTLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFDdkIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUM5QixJQUFJLE9BQU87QUFDWCxHQUFHO0FBQ0gsRUFBRSxJQUFJLGtCQUFrQixFQUFFO0FBQzFCLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3JCLEdBQUc7QUFDSCxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUM1QixFQUFFLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0IsRUFBRSxPQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUNELE1BQU0sQ0FBQyxjQUFjLEdBQUcsU0FBUyxjQUFjLENBQUMsT0FBTyxFQUFFO0FBQ3pELEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztBQUMvQixFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUMvQixFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUNuQyxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUNuQyxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtBQUN2QixJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUNuQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFDbEMsR0FBRyxNQUFNO0FBQ1QsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFDakMsR0FBRztBQUNILEVBQUUsSUFBSSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDO0FBQzlELEVBQUUsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEVBQUU7QUFDL0IsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDdEQsR0FBRyxNQUFNO0FBQ1Q7QUFDQSxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFDMUIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUU7QUFDbkIsTUFBTSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBQzFCO0FBQ0E7QUFDQSxNQUFNLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ2hELE1BQU0sSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUM7QUFDNUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7QUFDcEI7QUFDQTtBQUNBLFFBQVEsSUFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25ELFFBQVEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNDLE9BQU87QUFDUDtBQUNBLE1BQU0sSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDdkIsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVDO0FBQ0EsU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN4QixFQUFFLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFO0FBQzdCLElBQUksT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUMsR0FBRyxNQUFNO0FBQ1QsSUFBSSxPQUFPLENBQUMsQ0FBQztBQUNiLEdBQUc7QUFDSCxDQUFDO0FBQ0QsU0FBUyxPQUFPLENBQUMsU0FBUyxFQUFFO0FBQzVCLEVBQUUsSUFBSSxrQkFBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUU7QUFDekQsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDbkMsR0FBRztBQUNILEVBQUUsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25DLEVBQUUsSUFBSSxJQUFJLEdBQUcsT0FBTyxHQUFHLElBQUksR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQzNDLEVBQUUsT0FBTyxXQUFXLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUNuQyxDQUFDO0FBQ0QsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0FBQzFCLEVBQUUsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHO0FBQ2xELFNBQVMsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHO0FBQzVCLFNBQVMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtBQUN2RSxFQUFFLE1BQU0sSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDO0FBQ2xDLElBQUksT0FBTyxFQUFFLE9BQU87QUFDcEIsSUFBSSxNQUFNLEVBQUUsTUFBTTtBQUNsQixJQUFJLFFBQVEsRUFBRSxRQUFRO0FBQ3RCLElBQUksUUFBUSxFQUFFLFFBQVE7QUFDdEIsSUFBSSxrQkFBa0IsRUFBRSxrQkFBa0I7QUFDMUMsR0FBRyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFO0FBQzVCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ0QsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxDQUFDLEtBQUssR0FBRyxTQUFTLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtBQUN6RCxFQUFFLElBQUksTUFBTSxJQUFJLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sQ0FBQyxRQUFRLEdBQUcsU0FBUyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7QUFDL0QsRUFBRSxJQUFJLE1BQU0sSUFBSSxRQUFRLEVBQUU7QUFDMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMzRCxHQUFHO0FBQ0gsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO0FBQ2pFLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFO0FBQzVDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDbkUsR0FBRztBQUNILENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTSxDQUFDLGVBQWUsR0FBRyxTQUFTLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtBQUM3RSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRTtBQUMzQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDL0UsR0FBRztBQUNILENBQUMsQ0FBQztBQUNGO0FBQ0EsU0FBUyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO0FBQ3JEO0FBQ0EsRUFBRSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7QUFDM0IsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHLE1BQU0sSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQ3JELElBQUksT0FBT0QsU0FBTyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQzNELElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQy9ELElBQUksT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNO0FBQzVDLFdBQVcsTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsTUFBTTtBQUM1QyxXQUFXLE1BQU0sQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLFNBQVM7QUFDbEQsV0FBVyxNQUFNLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxTQUFTO0FBQ2xELFdBQVcsTUFBTSxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsVUFBVSxDQUFDO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRO0FBQzNELGNBQWMsUUFBUSxLQUFLLElBQUksSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLENBQUMsRUFBRTtBQUNsRSxJQUFJLE9BQU8sTUFBTSxHQUFHLE1BQU0sS0FBSyxRQUFRLEdBQUcsTUFBTSxJQUFJLFFBQVEsQ0FBQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQy9DLGFBQWEsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFDdEQsYUFBYSxFQUFFLE1BQU0sWUFBWSxZQUFZO0FBQzdDLGVBQWUsTUFBTSxZQUFZLFlBQVksQ0FBQyxFQUFFO0FBQ2hELElBQUksT0FBT0EsU0FBTyxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDaEQsbUJBQW1CLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7QUFDdEQsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixHQUFHLE1BQU07QUFDVCxJQUFJLEtBQUssR0FBRyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNoRDtBQUNBLElBQUksSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbkQsSUFBSSxJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUM1QixNQUFNLElBQUksV0FBVyxLQUFLLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQzVELFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUIsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNsQztBQUNBLElBQUksT0FBTyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDckQsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBLFNBQVMsV0FBVyxDQUFDLE1BQU0sRUFBRTtBQUM3QixFQUFFLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLG9CQUFvQixDQUFDO0FBQ3hFLENBQUM7QUFDRDtBQUNBLFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFO0FBQ3RELEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUztBQUNwRSxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDaEQsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkIsRUFBRSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsRUFBRSxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsRUFBRSxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxNQUFNLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQztBQUNwRCxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxPQUFPLEVBQUU7QUFDZixJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsSUFBSSxPQUFPLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3BDLEdBQUc7QUFDSCxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QixFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QixFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNiO0FBQ0E7QUFDQSxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsTUFBTTtBQUM3QixJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCO0FBQ0EsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDWixFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNaO0FBQ0EsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3ZDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2QixNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQ25CLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3ZDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLENBQUM7QUFDakUsTUFBTSxPQUFPLEtBQUssQ0FBQztBQUNuQixHQUFHO0FBQ0gsRUFBRSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sQ0FBQyxZQUFZLEdBQUcsU0FBUyxZQUFZLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7QUFDdkUsRUFBRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFO0FBQzNDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDekUsR0FBRztBQUNILENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO0FBQy9DLFNBQVMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7QUFDdkQsRUFBRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFO0FBQzFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDOUUsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxDQUFDLFdBQVcsR0FBRyxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtBQUNyRSxFQUFFLElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRTtBQUMzQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQy9ELEdBQUc7QUFDSCxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sQ0FBQyxjQUFjLEdBQUcsU0FBUyxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7QUFDM0UsRUFBRSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7QUFDM0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNsRSxHQUFHO0FBQ0gsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxTQUFTLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUU7QUFDN0MsRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFO0FBQzVCLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxpQkFBaUIsRUFBRTtBQUNyRSxJQUFJLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqQyxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUk7QUFDTixJQUFJLElBQUksTUFBTSxZQUFZLFFBQVEsRUFBRTtBQUNwQyxNQUFNLE9BQU8sSUFBSSxDQUFDO0FBQ2xCLEtBQUs7QUFDTCxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDZDtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQ3JDLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQztBQUM1QyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUU7QUFDMUIsRUFBRSxJQUFJLEtBQUssQ0FBQztBQUNaLEVBQUUsSUFBSTtBQUNOLElBQUksS0FBSyxFQUFFLENBQUM7QUFDWixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDZCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDZCxHQUFHO0FBQ0gsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFDRDtBQUNBLFNBQVMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtBQUN4RCxFQUFFLElBQUksTUFBTSxDQUFDO0FBQ2I7QUFDQSxFQUFFLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFO0FBQ25DLElBQUksTUFBTSxJQUFJLFNBQVMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0FBQy9ELEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7QUFDcEMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQ3ZCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztBQUNwQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUI7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHO0FBQzFFLGFBQWEsT0FBTyxHQUFHLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDNUM7QUFDQSxFQUFFLElBQUksV0FBVyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQzlCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsNEJBQTRCLEdBQUcsT0FBTyxDQUFDLENBQUM7QUFDbkUsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLG1CQUFtQixHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQztBQUN4RCxFQUFFLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqRSxFQUFFLElBQUkscUJBQXFCLEdBQUcsQ0FBQyxXQUFXLElBQUksTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQ2xFO0FBQ0EsRUFBRSxJQUFJLENBQUMsbUJBQW1CO0FBQzFCLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0saUJBQWlCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztBQUN6QyxNQUFNLHFCQUFxQixFQUFFO0FBQzdCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsd0JBQXdCLEdBQUcsT0FBTyxDQUFDLENBQUM7QUFDL0QsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLE1BQU0sSUFBSSxRQUFRO0FBQ3hDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLEVBQUU7QUFDekUsSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUNqQixHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxDQUFDLE1BQU0sR0FBRyxTQUFTLEtBQUssY0FBYyxLQUFLLGNBQWMsT0FBTyxFQUFFO0FBQ3hFLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQSxNQUFNLENBQUMsWUFBWSxHQUFHLFNBQVMsS0FBSyxjQUFjLEtBQUssY0FBYyxPQUFPLEVBQUU7QUFDOUUsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEMsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ3ZEO0FBQ0E7QUFDQSxTQUFTLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFO0FBQ2hDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQzdDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxXQUFXO0FBQzNCLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxlQUFlO0FBQ25DLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxjQUFjO0FBQ2pDLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxrQkFBa0I7QUFDekMsQ0FBQyxDQUFDLENBQUM7QUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ3JDO0FBQ0EsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxVQUFVLEdBQUcsRUFBRTtBQUMvQyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNoQixFQUFFLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO0FBQ3ZCLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlDLEdBQUc7QUFDSCxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFBOzs7O0FDemZELFlBQVksQ0FBQztBQUNiO0lBQ0EsVUFBYyxHQUFHLFVBQVUsQ0FBQztBQUM1QjtBQUNBLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN4QztBQUNBLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3hCLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDMUMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDdEM7QUFDQSxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN4QixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzFDLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3RDO0FBQ0EsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuQixJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ25CLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbkIsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuQixDQUFDO0FBQ0Q7QUFDQSxVQUFVLENBQUMsU0FBUyxHQUFHO0FBQ3ZCLElBQUksWUFBWSxFQUFFLFVBQVUsQ0FBQyxFQUFFO0FBQy9CO0FBQ0EsUUFBUSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFlBQVksRUFBRSxVQUFVLENBQUMsRUFBRTtBQUMvQixRQUFRLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNELEtBQUs7QUFDTDtBQUNBLElBQUksc0JBQXNCLEVBQUUsVUFBVSxDQUFDLEVBQUU7QUFDekMsUUFBUSxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pFLEtBQUs7QUFDTDtBQUNBLElBQUksV0FBVyxFQUFFLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRTtBQUN2QyxRQUFRLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ2xEO0FBQ0EsUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDaEM7QUFDQSxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQjtBQUNBO0FBQ0EsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3BDLFlBQVksSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUMsWUFBWSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2pEO0FBQ0EsWUFBWSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsWUFBWSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLE1BQU07QUFDM0M7QUFDQSxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM1QixTQUFTO0FBQ1Q7QUFDQTtBQUNBLFFBQVEsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JCLFFBQVEsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JCLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkO0FBQ0EsUUFBUSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNqQyxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLFlBQVksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsTUFBTTtBQUNsRDtBQUNBLFlBQVksSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO0FBQ3hCLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCLGFBQWEsTUFBTTtBQUNuQixnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN2QixhQUFhO0FBQ2I7QUFDQSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyQyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sQ0FBQyxDQUFDO0FBQ2pCLEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRTtBQUNqQyxRQUFRLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQy9ELEtBQUs7QUFDTCxDQUFDLENBQUE7O0FDN0VEOzs7O0FBSUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxDQUFrQixFQUFFLENBQWtCLEVBQUE7QUFDckQsSUFBQSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDbEIsUUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO0FBQUUsWUFBQSxPQUFPLEtBQUssQ0FBQztBQUM3RCxRQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQy9CLFlBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQUUsZ0JBQUEsT0FBTyxLQUFLLENBQUM7QUFDNUMsU0FBQTtBQUNELFFBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixLQUFBO0FBQ0QsSUFBQSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7QUFDbkQsUUFBQSxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDO0FBQUUsWUFBQSxPQUFPLEtBQUssQ0FBQztRQUMzQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07QUFBRSxZQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ3hELFFBQUEsS0FBSyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUU7QUFDakIsWUFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFBRSxnQkFBQSxPQUFPLEtBQUssQ0FBQztBQUNoRCxTQUFBO0FBQ0QsUUFBQSxPQUFPLElBQUksQ0FBQztBQUNmLEtBQUE7SUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkIsQ0FBQTs7QUNqQkE7OztBQUdHO0FBRUg7Ozs7OztBQU1HO0FBQ0csU0FBVSxjQUFjLENBQUMsQ0FBUyxFQUFBO0lBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUM7QUFBRSxRQUFBLE9BQU8sQ0FBQyxDQUFDO0lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUM7QUFBRSxRQUFBLE9BQU8sQ0FBQyxDQUFDO0lBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQ1osRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDaEIsSUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQ7Ozs7Ozs7OztBQVNHO0FBQ0csU0FBVUUsUUFBTSxDQUFDLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBQTtBQUNyRSxJQUFBLE1BQU0sTUFBTSxHQUFHLElBQUlDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNsRCxJQUFBLE9BQU8sVUFBUyxDQUFTLEVBQUE7QUFDckIsUUFBQSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsS0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVEOzs7OztBQUtHO0FBQ0ksTUFBTSxJQUFJLEdBQUdELFFBQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUUsQ0FBQTtBQUUvQzs7Ozs7Ozs7QUFRRztBQUNhLFNBQUEsS0FBSyxDQUFDLENBQVMsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFBO0FBQ3JELElBQUEsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRDs7Ozs7Ozs7QUFRRztBQUNhLFNBQUEsSUFBSSxDQUFDLENBQVMsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFBO0FBQ3BELElBQUEsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNwQixJQUFBLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN4QyxJQUFBLE9BQU8sQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7Ozs7Ozs7QUFTRztBQUNhLFNBQUEsUUFBUSxDQUNwQixLQUFrQixFQUNsQixFQUFzRCxFQUN0RCxRQUFpQyxFQUFBO0FBRWpDLElBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFBRSxRQUFBLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUFFLEtBQUE7QUFDakQsSUFBQSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDakIsSUFBQSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSTtBQUN0QixRQUFBLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxLQUFJO0FBQ3JCLFlBQUEsSUFBSSxHQUFHO2dCQUFFLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDckIsWUFBQSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUksTUFBd0IsQ0FBQztZQUN2QyxJQUFJLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFBRSxnQkFBQSxRQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3BELFNBQUMsQ0FBQyxDQUFDO0FBQ1AsS0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQ7Ozs7OztBQU1HO0FBQ2EsU0FBQSxjQUFjLENBQzFCLEdBQXVCLEVBQ3ZCLEtBQXlCLEVBQUE7SUFFekIsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLElBQUEsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUU7QUFDakIsUUFBQSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQ2YsWUFBQSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFNBQUE7QUFDSixLQUFBO0FBQ0QsSUFBQSxPQUFPLFVBQVUsQ0FBQztBQUN0QixDQUFDO0FBRUQ7Ozs7Ozs7OztBQVNHO0FBQ2FFLFNBQUFBLFFBQU0sQ0FBQyxJQUFTLEVBQUUsR0FBRyxPQUFtQixFQUFBO0FBQ3BELElBQUEsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUU7QUFDdkIsUUFBQSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRTtZQUNqQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLFNBQUE7QUFDSixLQUFBO0FBQ0QsSUFBQSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7QUFhRztBQUNhLFNBQUEsSUFBSSxDQUFDLEdBQVEsRUFBRSxVQUF5QixFQUFBO0lBQ3BELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixJQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3hDLFFBQUEsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRTtZQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsU0FBQTtBQUNKLEtBQUE7QUFDRCxJQUFBLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFWDs7Ozs7O0FBTUc7QUFDYSxTQUFBLFFBQVEsR0FBQTtJQUNwQixPQUFPLEVBQUUsRUFBRSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7O0FBR0c7QUFDRyxTQUFVLFlBQVksQ0FBQyxLQUFhLEVBQUE7QUFDdEMsSUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7QUFHRztBQUNHLFNBQVUsY0FBYyxDQUFDLEtBQWEsRUFBQTtJQUN4QyxJQUFJLEtBQUssSUFBSSxDQUFDO0FBQUUsUUFBQSxPQUFPLENBQUMsQ0FBQztJQUN6QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JHO0FBQ2EsU0FBQSxPQUFPLENBQUMsR0FBa0IsRUFBRSxPQUFZLEVBQUE7QUFDcEQsSUFBQSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFJO0FBQ2YsUUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQUUsT0FBTztBQUFFLFNBQUE7QUFDN0IsUUFBQSxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1QyxLQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRDs7Ozs7QUFLRztBQUNhLFNBQUEsU0FBUyxDQUFDLEtBQVUsRUFBRSxRQUFrQixFQUFFLE9BQWEsRUFBQTtJQUNuRSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsSUFBQSxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRTtRQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEUsS0FBQTtBQUNELElBQUEsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7O0FBSUc7QUFDYSxTQUFBLFlBQVksQ0FBQyxLQUFVLEVBQUUsUUFBa0IsRUFBRSxPQUFhLEVBQUE7SUFDdEUsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLElBQUEsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUU7QUFDckIsUUFBQSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ3hELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUIsU0FBQTtBQUNKLEtBQUE7QUFDRCxJQUFBLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFLRDs7OztBQUlHO0FBQ0csU0FBVUMsT0FBSyxDQUFJLEtBQVEsRUFBQTtBQUM3QixJQUFBLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUN0QixRQUFBLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQ0EsT0FBSyxDQUFhLENBQUM7QUFDdkMsS0FBQTtBQUFNLFNBQUEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxFQUFFO0FBQzNDLFFBQUEsT0FBTyxTQUFTLENBQUMsS0FBSyxFQUFFQSxPQUFLLENBQWEsQ0FBQztBQUM5QyxLQUFBO0FBQU0sU0FBQTtBQUNILFFBQUEsT0FBTyxLQUFLLENBQUM7QUFDaEIsS0FBQTtBQUNMLENBQUM7QUFFRDs7OztBQUlHO0FBQ2EsU0FBQSxlQUFlLENBQUksQ0FBVyxFQUFFLENBQVcsRUFBQTtBQUN2RCxJQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQy9CLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQUUsWUFBQSxPQUFPLElBQUksQ0FBQztBQUN6QyxLQUFBO0FBQ0QsSUFBQSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7O0FBS0c7QUFDSCxNQUFNLGVBQWUsR0FBNkIsRUFBRSxDQUFDO0FBRS9DLFNBQVUsUUFBUSxDQUFDLE9BQWUsRUFBQTtBQUNwQyxJQUFBLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUU7O1FBRTNCLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVztBQUFFLFlBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMxRCxRQUFBLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDbkMsS0FBQTtBQUNMLENBQUM7QUFFRDs7Ozs7QUFLRztBQUNIO0FBQ2dCLFNBQUEsa0JBQWtCLENBQUMsQ0FBUSxFQUFFLENBQVEsRUFBRSxDQUFRLEVBQUE7QUFDM0QsSUFBQSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRDs7Ozs7OztBQU9HO0FBQ0csU0FBVSxtQkFBbUIsQ0FBQyxJQUFrQixFQUFBO0lBQ2xELElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNaLElBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtBQUN0RSxRQUFBLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixRQUFBLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixRQUFBLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QyxLQUFBO0FBQ0QsSUFBQSxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7O0FBTUc7QUFDRyxTQUFVLGVBQWUsQ0FBQyxNQUFvQixFQUFBOzs7QUFHaEQsSUFBQSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztBQUNqQixRQUFBLE9BQU8sS0FBSyxDQUFDO0FBRWpCLElBQUEsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRXJDLElBQUEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDekIsUUFBQSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUMzQixRQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLEtBQUE7O0lBR0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3hELENBQUM7QUFFRDs7Ozs7O0FBTUc7QUFFRyxTQUFVLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQTJCLEVBQUE7OztJQU9oRixTQUFTLElBQUksRUFBRSxDQUFDOztBQUdoQixJQUFBLFNBQVMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUMzQixJQUFBLEtBQUssSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUV2QixPQUFPO0FBQ0gsUUFBQSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDNUMsUUFBQSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDNUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztLQUN6QixDQUFDO0FBQ04sQ0FBQztBQUVEO0FBQ0E7Ozs7O0FBS0c7QUFDYSxTQUFBLFFBQVEsR0FBQTtJQUNwQixPQUFPLE9BQU8saUJBQWlCLEtBQUssV0FBVyxJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVc7UUFDdkUsSUFBSSxZQUFZLGlCQUFpQixDQUFDO0FBQzdDLENBQUM7QUFFRDs7Ozs7O0FBTUc7QUFFRyxTQUFVLGlCQUFpQixDQUFDLFlBQW9CLEVBQUE7O0lBRWxELE1BQU0sRUFBRSxHQUFHLDBKQUEwSixDQUFDO0lBRXRLLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixJQUFBLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFJO0FBQ3hDLFFBQUEsTUFBTSxLQUFLLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUN2QixRQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNoRCxRQUFBLE9BQU8sRUFBRSxDQUFDO0FBQ2QsS0FBQyxDQUFDLENBQUM7QUFFSCxJQUFBLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQ25CLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0MsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQUUsWUFBQSxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7QUFDdkMsWUFBQSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ25DLEtBQUE7QUFFRCxJQUFBLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFFckI7Ozs7Ozs7Ozs7OztBQVlHO0FBQ0csU0FBVSxRQUFRLENBQUMsS0FBVSxFQUFBO0lBQy9CLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtBQUNuQixRQUFBLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ3JFLFFBQUEsU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTTtBQUMxQixZQUFBLENBQUMsRUFBRSxTQUFTLEtBQUssd0JBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5SCxLQUFBO0FBQ0QsSUFBQSxPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDO0FBRUssU0FBVSxnQkFBZ0IsQ0FBQyxJQUFZLEVBQUE7SUFDekMsSUFBSTtBQUNBLFFBQUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdCLFFBQUEsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEMsUUFBQSxPQUFPLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3BDLFFBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixLQUFBO0FBQUMsSUFBQSxPQUFPLENBQUMsRUFBRTtBQUNSLFFBQUEsT0FBTyxLQUFLLENBQUM7QUFDaEIsS0FBQTtBQUNMLENBQUM7QUFFRDtBQUNBO0FBQ00sU0FBVSxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUE7QUFDeEMsSUFBQSxPQUFPLElBQUksQ0FDUCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQzdDLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSTtBQUNWLFFBQUEsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNqRCxLQUFBLENBQ0osQ0FDSixDQUFDO0FBQ04sQ0FBQztBQUVEO0FBQ00sU0FBVSxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUE7QUFDeEMsSUFBQSxPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFJO1FBQ3BELE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLEtBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLENBQUM7QUFFSyxTQUFVLGFBQWEsQ0FBQyxLQUFVLEVBQUE7SUFDcEMsT0FBTyxPQUFPLFdBQVcsS0FBSyxXQUFXLElBQUksS0FBSyxZQUFZLFdBQVcsQ0FBQztBQUM5RSxDQUFBOztBQ2hlQSxNQUFNLEdBQUcsR0FBRyxPQUFPLFdBQVcsS0FBSyxXQUFXLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxHQUFHO0FBQzVFLElBQUEsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0FBQ2pDLElBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFeEIsSUFBSSxNQUFNLENBQUM7QUFFWCxJQUFJLGtCQUFrQyxDQUFDO0FBRXZDOztBQUVHO0FBQ0gsTUFBTUMsVUFBUSxHQUFHO0FBQ2I7OztBQUdHO0lBQ0gsR0FBRztBQUVILElBQUEsS0FBSyxDQUFDLEVBQXlDLEVBQUE7QUFDM0MsUUFBQSxNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QyxPQUFPLEVBQUMsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQztBQUN0RCxLQUFBO0FBRUQsSUFBQSxZQUFZLENBQUMsR0FBc0IsRUFBRSxPQUFBLEdBQWtCLENBQUMsRUFBQTtRQUNwRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDVixZQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztBQUN6RCxTQUFBO0FBQ0QsUUFBQSxNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFlLENBQUM7QUFDbkMsUUFBQSxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFnQixDQUFDO0FBQ3JDLFFBQUEsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBZSxFQUFFLEdBQUcsQ0FBQyxNQUFnQixDQUFDLENBQUM7UUFDeEUsT0FBTyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxLQUFlLEdBQUcsQ0FBQyxHQUFHLE9BQU8sRUFBRSxHQUFHLENBQUMsTUFBZ0IsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7QUFDMUgsS0FBQTtBQUVELElBQUEsVUFBVSxDQUFDLElBQVksRUFBQTtBQUNuQixRQUFBLElBQUksQ0FBQyxNQUFNO0FBQUUsWUFBQSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsRCxRQUFBLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztBQUN0QixLQUFBO0lBRUQsbUJBQW1CLEVBQUUsT0FBTyxTQUFTLEtBQUssV0FBVyxJQUFJLFNBQVMsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDO0FBRTNGLElBQUEsSUFBSSxvQkFBb0IsR0FBQTtBQUNwQixRQUFBLElBQUksQ0FBQyxVQUFVO0FBQUUsWUFBQSxPQUFPLEtBQUssQ0FBQzs7UUFFOUIsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLEVBQUU7QUFDNUIsWUFBQSxrQkFBa0IsR0FBRyxVQUFVLENBQUMsa0NBQWtDLENBQUMsQ0FBQztBQUN2RSxTQUFBO1FBQ0QsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7QUFDckMsS0FBQTs7O0FDcERMLFlBQVksQ0FBQztBQUNiO0FBQ0EsSUFBQSxhQUFjLEdBQUdDLE9BQU0sQ0FBQTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLE9BQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3JCLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsQ0FBQztBQUNEO0FBQ0FBLE9BQUssQ0FBQyxTQUFTLEdBQUc7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sSUFBSUEsT0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEdBQUcsTUFBTSxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxLQUFLLFNBQVMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFVBQVUsTUFBTSxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLEtBQUssV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUU7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksS0FBSyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQUssSUFBSSxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRyxFQUFFLFdBQVc7QUFDcEIsUUFBUSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksTUFBTSxFQUFFLFNBQVMsS0FBSyxFQUFFO0FBQzVCLFFBQVEsT0FBTyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQ2pDLGVBQWUsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN0QixRQUFRLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN6QixRQUFRLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDN0IsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFFBQVEsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSyxFQUFFLFdBQVc7QUFDdEIsUUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFO0FBQ3pCLFFBQVEsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDM0IsUUFBUSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0MsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsUUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLO0FBQ3pCLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ25DLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRTtBQUMxQixRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM5QyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN0QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDdkIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDdEIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDOUIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsRUFB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1S0Q7QUFFYyxNQUFPLGVBQWUsQ0FBQTtBQUtoQyxJQUFBLFdBQUEsQ0FBWSxHQUFXLEVBQUUsS0FFeEIsRUFBRSxPQUFlLEVBQUUsVUFBMEIsRUFBQTtBQUMxQyxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQSxFQUFHLEdBQUcsQ0FBQSxFQUFBLENBQUksR0FBRyxFQUFFLElBQUksT0FBTyxDQUFDO0FBQ2pELFFBQUEsSUFBSSxVQUFVO0FBQUUsWUFBQSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUU3QyxJQUFJLEtBQUssS0FBSyxJQUFJLElB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Q0EsSUFBSSxjQUFjLEdBQUc7QUFDckIsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckQsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RCxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuRCxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pELEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3BELEVBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlELEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVELEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUQsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0QsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDL0QsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUQsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUQsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEQsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEQsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEQsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDL0QsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxzQkFBc0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RSxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRSxFQUFFLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RSxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRCxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxFQUFFLGtCQUFrQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RSxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRCxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNyRCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoRSxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRCxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RCxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRCxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RCxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyRCxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuRCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFF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QUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDMUMsUUFBQSxNQUFNLGFBQWEsR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDO0FBQ3RDLFFBQUEsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDckgsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ2IsWUFBQSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDcEgsU0FBQTtBQUNELFFBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUNqQixLQUFBO0FBQ0QsSUFBQSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUE7SUFDbkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDN0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztBQUNsQyxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFBO0FBQzNELElBQUEsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxRQUFNLENBQUM7QUFDcEQsSUFBQSxNQUFNLE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUdBLFFBQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHQSxRQUFNLENBQUMsQ0FBQztJQUM1RCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDdEIsSUFBQSxLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsRUFBRTtBQUMzQixRQUFBLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFO1lBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxXQUFXLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDL0MsWUFBQSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFNBQUE7QUFDSixLQUFBO0FBQ0QsSUFBQSxPQUFPLFVBQVUsQ0FBQztBQUN0QixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFBO0FBQ3pELElBQUEsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxRQUFNLENBQUM7QUFDcEQsSUFBQSxNQUFNLE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUdBLFFBQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHQSxRQUFNLENBQUMsQ0FBQztJQUM1RCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDckIsSUFBQSxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRTtRQUN6QixNQUFNLFFB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QyxFQUFFLENBQUMsRUFBSSxFQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ3hDLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFJLEVBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDeEMsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUksRUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUMzQyxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBSSxFQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO0FBRTNDLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBSSxFQUFBLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7QUFDbEUsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFBLEVBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3RFLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBSSxFQUFBLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDaEUsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFJLEVBQUEsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUNoRSxTQUFTLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUks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LENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxLQUFBO0FBQ0QsSUFBQSxNQUFNLEVBQUU7UUFDSixVQUFVO0FBQ1YsUUFBQSxDQUFDLFVBQVUsQ0FBQztRQUNaLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUc7QUFDckQsS0FBQTtBQUNELElBQUEsS0FBSyxFQUFFO1FBQ0gsVUFBVTtBQUNWLFFBQUEsQ0FBQyxVQUFVLENBQUM7QUFDWixRQUFBLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLEtBQUE7QUFDRCxJQUFBLEtBQUssRUFBRTtRQUNILFVBQVU7QUFDVixRQUFBLENBQUMsVUFBVSxDQUFDO0FBQ1osUUFBQSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxLQUFBO0FBQ0QsSUFBQSxLQUFLLEVBQUU7UUFDSCxVQUFVO0FBQ1YsUUFBQSxDQUFDLFVBQVUsQ0FBQztBQUNaLFFBQUEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsS0FBQTtBQUNELElBQUEsTUFBTSxFQUFFO1FBQ0osVUFBVTtBQUNWLFFBQUEsQ0FBQyxVQUFVLENBQUM7QUFDWixRQUFBLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFD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QUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDL0MsUUFBQSxPQUFPLEtBQUssQ0FBQztBQUNoQixLQUFBO0FBQ0QsSUFBQSxRQUFRLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDYixRQUFBLEtBQUssS0FBSztBQUNOLFlBQUEsT0FBTyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7QUFFOUUsUUFBQSxLQUFLLElBQUk7WUFDTCxPQUFPLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFN0YsUUFBQSxLQUFLLEtBQUssQ0FBQztBQUNYLFFBQUEsS0FBSyxNQUFNLENBQUM7QUFDWixRQUFBLEtBQUssTUFBTTtBQUNQLFlBQUEsT0FBTyxLQUFLLENBQUM7QUFFakIsUUFBQSxLQUFLLElBQUksQ0FBQztBQUNWLFFBQUEsS0FBSyxJQUFJLENBQUM7QUFDVixRQUFBLEtBQUssR0FBRyxDQUFDO0FBQ1QsUUFBQSxLQUFLLElBQUksQ0FBQztBQUNWLFFBQUEsS0FBSyxHQUFHLENBQUM7QUFDVCxRQUFBLEtBQUssSUFBSTtZQUNMLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFekYsUUFBQSxLQUFLLEtBQUssQ0FBQztBQUNYLFFBQUEsS0FBSyxLQUFLO1lBQ04sS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxD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QUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM1RSxLQUFBO0lBRU0sT0FBTyxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBQTtBQUN0SyxRQUFBLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsUUFBQSxPQUFPLENBQUMsQ0FBQztBQUNaLEtBQUE7QUFDSixDQUFBO0FBRUQsMEJBQTBCLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDMUQsUUFBUSxDQUFDLDRCQUE0QixFQUFFLDBCQUEwQixDQUFDLENBQUM7QUFFbkU7Ozs7O0FBS0c7QUFDSCxNQUFNLHFCQUFzQixTQUFRLFdBQVcsQ0FBQTtBQUkzQyxJQUFBLGFBQWEsR0FBQTtRQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3JELEtBQUE7QUFFTSxJQUFBLFdBQVcsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBQTtBQUNqRCxRQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDdEIsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQixRQUFBLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN0QyxLQUFBO0FBRU0sSUFBQSxPQUFPLENBQUMsQ0FBUyxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFBO0FBQ3hELFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixRQUFBLE9BQU8sQ0FBQyxDQUFDO0FBQ1osS0FBQTtBQUNKLENBQUE7QUFFRCxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUNyRCxRQUFRLENBQUMsdUJBQXVCLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUV6RDs7Ozs7QUFLRztBQUNILE1BQU0scUJBQXNCLFNBQVEsV0FBVyxDQUFBO0FBSTNDLElBQUEsYUFBYSxHQUFBO1FBQ1QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbkQsS0FBQTtBQUVNLElBQUEsV0FBVyxDQUFDLEVBQVUsRUFBQTtBQUN6QixRQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDdEIsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzlCLEtBQUE7QUFFTSxJQUFBLE9BQU8sQ0FBQyxDQUFTLEVBQUUsRUFBVSxFQUFBO0FBQ2hDLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDekIsUUFBQSxPQUFPLENBQUMsQ0FBQztBQUNaLEtBQUE7QUFDSixDQUFBO0FBRUQscUJBQXFCLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFDcEQsUUFBUSxDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFFekQ7Ozs7Ozs7QUFPRztBQUNILE1BQU0sMkJBQTRCLFNBQVEsV0FBVyxDQUFBO0FBTWpELElBQUEsYUFBYSxHQUFBO1FBQ1QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbkQsS0FBQTtBQUVNLElBQUEsV0FBVyxDQUFDLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFBO0FBQ3pILFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5RCxLQUFBO0FBRU0sSUFBQSxPQUFPLENBQUMsQ0FBUyxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFBO0FBQ2hJLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixRQUFBLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDekIsUUFBQSxPQUFPLENBQUMsQ0FBQztBQUNaLEtBQUE7QUFDSixDQUFBO0FBRUQsMkJBQTJCLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDM0QsUUFBUSxDQUFDLDZCQUE2QixFQUFFLDJCQUEyQixDQUFDLENBQUM7QUFFckU7Ozs7Ozs7QUFPRztBQUNILE1BQU0seUJBQTBCLFNBQVEsV0FBVyxDQUFBO0FBSS9DLElBQUEsYUFBYSxHQUFBO1FBQ1QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDakQsS0FBQTtBQUVNLElBQUEsV0FBVyxDQUFDLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFBO0FBQ3JGLFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25CLFFBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELEtBQUE7QUFFTSxJQUFBLE9BQU8sQ0FBQyxDQUFTLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUE7QUFDNUYsUUFBQSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLFFBQUEsT0FBTyxDQUFDLENBQUM7QUFDWixLQUFBO0FBQ0osQ0FBQTtBQUVELHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQ3pELFFBQVEsQ0FBQywyQkFBMkIsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0FBRWpFOzs7Ozs7O0FBT0c7QUFDSCxNQUFNLHlCQUEwQixTQUFRLFdBQVcsQ0FBQTtBQUsvQyxJQUFBLGFBQWEsR0FBQTtRQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ2pELEtBQUE7SUFFTSxXQUFXLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBQTtBQUN6RSxRQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDdEIsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQixRQUFBLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzlDLEtBQUE7QUFFTSxJQUFBLE9BQU8sQ0FBQyxDQUFTLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBQTtBQUNoRixRQUFBLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDeEIsUUFBQSxPQUFPLENBQUMsQ0FBQztBQUNaLEtBQUE7QUFDSixDQUFBO0FBRUQseUJBQXlCLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDekQsUUFBUSxDQUFDLDJCQUEyQixFQUFFLHlCQUF5QixDQUFDLENBQUM7QUFFakU7Ozs7OztBQU1HO0FBQ0gsTUFBTSx3QkFBeUIsU0FBUSxXQUFXLENBQUE7QUFJOUMsSUFBQSxhQUFhLEdBQUE7UUFDVCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNyRCxLQUFBO0FBRU0sSUFBQSxXQUFXLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFBO0FBQzdELFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25CLFFBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxQyxLQUFBO0lBRU0sT0FBTyxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUE7QUFDcEUsUUFBQSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDMUIsUUFBQSxPQUFPLENBQUMsQ0FBQztBQUNaLEtBQUE7QUFDSixDQUFBO0FBRUQsd0JBQXdCLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDeEQsUUFBUSxDQUFDLDBCQUEwQixFQUFFLHdCQUF3QixDQUFDLENBQUM7QUFFL0Q7Ozs7O0FBS0c7QUFDSCxNQUFNLHFCQUFzQixTQUFRLFdBQVcsQ0FBQTtBQUkzQyxJQUFBLGFBQWEsR0FBQTtRQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ25ELEtBQUE7QUFFTSxJQUFBLFdBQVcsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBQTtBQUNqRCxRQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDdEIsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQixRQUFBLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN0QyxLQUFBO0FBRU0sSUFBQSxPQUFPLENBQUMsQ0FBUyxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFBO0FBQ3hELFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN6QixRQUFBLE9BQU8sQ0FBQyxDQUFDO0FBQ1osS0FBQTtBQUNKLENBQUE7QUFFRCxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQztBQUNwRCxRQUFRLENBQUMsdUJBQXVCLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUV6RDs7Ozs7Ozs7Ozs7O0FBWUc7QUFDSCxNQUFNLHdDQUF5QyxTQUFRLFdBQVcsQ0FBQTtBQU85RCxJQUFBLGFBQWEsR0FBQTtRQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3JELEtBQUE7QUFFTSxJQUFBLFdBQVcsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFBO0FBQ2hPLFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25CLFFBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckcsS0FBQTtBQUVNLElBQUEsT0FBTyxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFBO0FBQ3ZPLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixRQUFBLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsUUFBQSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsUUFBQSxPQUFPLENBQUMsQ0FBQztBQUNaLEtBQUE7QUFDSixDQUFBO0FBRUQsd0NBQXdDLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDeEUsUUFBUSxDQUFDLDBDQUEwQyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7QUFFL0Y7Ozs7Ozs7O0FBUUc7QUFDSCxNQUFNLDhCQUErQixTQUFRLFdBQVcsQ0FBQTtBQU9wRCxJQUFBLGFBQWEsR0FBQTtRQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3JELEtBQUE7SUFFTSxXQUFXLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFBO0FBQy9XLFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25CLFFBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM1SixLQUFBO0lBRU0sT0FBTyxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUE7QUFDdFgsUUFBQSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDNUIsUUFBQSxPQUFPLENBQUMsQ0FBQztBQUNaLEtBQUE7QUFDSixDQUFBO0FBRUQsOEJBQThCLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDOUQsUUFBUSxDQUFDLGdDQUFnQyxFQUFFLDhCQUE4QixDQUFDLENBQUM7QUFFM0U7Ozs7O0FBS0c7QUFDSCxNQUFNLG9CQUFxQixTQUFRLFdBQVcsQ0FBQTtBQUkxQyxJQUFBLGFBQWEsR0FBQTtRQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3JELEtBQUE7QUFFTSxJQUFBLFdBQVcsQ0FBQyxFQUFVLEVBQUE7QUFDekIsUUFBQSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ3RCLFFBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5QixLQUFBO0FBRU0sSUFBQSxPQUFPLENBQUMsQ0FBUyxFQUFFLEVBQVUsRUFBQTtBQUNoQyxRQUFBLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQUEsT0FBTyxDQUFDLENBQUM7QUFDWixLQUFBO0FBQ0osQ0FBQTtBQUVELG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBRXZEOzs7OztBQUtHO0FBQ0gsTUFBTSxvQkFBcUIsU0FBUSxXQUFXLENBQUE7QUFJMUMsSUFBQSxhQUFhLEdBQUE7UUFDVCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNqRCxLQUFBO0FBRU0sSUFBQSxXQUFXLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUE7QUFDakQsUUFBQSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ3RCLFFBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbkIsUUFBQSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdEMsS0FBQTtBQUVNLElBQUEsT0FBTyxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBQTtBQUN4RCxRQUFBLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDeEIsUUFBQSxPQUFPLENBQUMsQ0FBQztBQUNaLEtBQUE7QUFDSixDQUFBO0FBRUQsb0JBQW9CLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFDbkQsUUFBUSxDQUFDLHNCQUFzQixFQUFFLG9CQUFvQixDQUFDLENBQUM7QUFFdkQ7Ozs7OztBQU1HO0FBQ0gsTUFBTSx3QkFBeUIsU0FBUSxXQUFXLENBQUE7QUFLOUMsSUFBQSxhQUFhLEdBQUE7UUFDVCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNuRCxLQUFBO0FBRU0sSUFBQSxXQUFXLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUE7QUFDakQsUUFBQSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ3RCLFFBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbkIsUUFBQSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdEMsS0FBQTtBQUVNLElBQUEsT0FBTyxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBQTtBQUN4RCxRQUFBLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLFFBQUEsT0FBTyxDQUFDLENBQUM7QUFDWixLQUFBO0FBQ0osQ0FBQTtBQUVELHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZELFFBQVEsQ0FBQywwQkFBMEIsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0FBRS9EOzs7OztBQUtHO0FBQ0gsTUFBTSxxQkFBc0IsU0FBUSxXQUFXLENBQUE7QUFJM0MsSUFBQSxhQUFhLEdBQUE7UUFDVCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNuRCxLQUFBO0FBRU0sSUFBQSxXQUFXLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBQTtBQUNyQyxRQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDdEIsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsQyxLQUFBO0FBRU0sSUFBQSxPQUFPLENBQUMsQ0FBUyxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUE7QUFDNUMsUUFBQSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDekIsUUFBQSxPQUFPLENBQUMsQ0FBQztBQUNaLEtBQUE7QUFDSixDQUFBO0FBRUQscUJBQXFCLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFDcEQsUUFBUSxDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFFekQ7Ozs7O0FBS0c7QUFDSCxNQUFNLHFCQUFzQixTQUFRLFdBQVcsQ0FBQTtBQUkzQyxJQUFBLGFBQWEsR0FBQTtRQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ25ELEtBQUE7QUFFTSxJQUFBLFdBQVcsQ0FBQyxFQUFVLEVBQUE7QUFDekIsUUFBQSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ3RCLFFBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5QixLQUFBO0FBRU0sSUFBQSxPQUFPLENBQUMsQ0FBUyxFQUFFLEVBQVUsRUFBQTtBQUNoQyxRQUFBLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLFFBQUEsT0FBTyxDQUFDLENBQUM7QUFDWixLQUFBO0FBQ0osQ0FBQTtBQUVELHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQ3BELFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0FBRXpEOzs7OztBQUtHO0FBQ0gsTUFBTSxxQkFBc0IsU0FBUSxXQUFXLENBQUE7QUFJM0MsSUFBQSxhQUFhLEdBQUE7UUFDVCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNyRCxLQUFBO0FBRU0sSUFBQSxXQUFXLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFBO0FBQzdELFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25CLFFBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxQyxLQUFBO0lBRU0sT0FBTyxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUE7QUFDcEUsUUFBQSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixRQUFBLE9BQU8sQ0FBQyxDQUFDO0FBQ1osS0FBQTtBQUNKLENBQUE7QUFFRCxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUNyRCxRQUFRLENBQUMsdUJBQXVCLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUV6RCxNQUFNLGtCQUFtQixTQUFRLE1BQU0sQ0FBQTtBQUVuQyxJQUFBLElBQUksWUFBWSxHQUFLLEVBQUEsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDdEUsSUFBQSxJQUFJLFlBQVksR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3RFLElBQUEsSUFBSSxFQUFFLEdBQUssRUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM1RCxJQUFBLElBQUksRUFBRSxHQUFLLEVBQUEsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDNUQsSUFBQSxJQUFJLEVBQUUsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzVELElBQUEsSUFBSSxFQUFFLEdBQUssRUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM1RCxJQUFBLElBQUksWUFBWSxHQUFLLEVBQUEsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDdkUsSUFBQSxJQUFJLGdCQUFnQixHQUFLLEVBQUEsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDM0UsSUFBQSxJQUFJLFdBQVcsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3RFLElBQUEsSUFBSSxXQUFXLEdBQUssRUFBQSxPQUFPLElBQUk5QixhQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRTtBQUNoRixDQUFBO0FBRUQsa0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7QUFJdkM7O0FBRUc7QUFDRyxNQUFPLGlCQUFrQixTQUFRLDJCQUEyQixDQUFBO0FBQzlEOzs7O0FBSUc7QUFDSCxJQUFBLEdBQUcsQ0FBQyxLQUFhLEVBQUE7QUFDYixRQUFBRSxRQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDNUIsUUFBQSxPQUFPLElBQUksa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzlDLEtBQUE7QUFDSixDQUFBO0FBRUQsUUFBUSxDQUFDLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFFakQsTUFBTSxrQkFBbUIsU0FBUSxNQUFNLENBQUE7QUFFbkMsSUFBQSxJQUFJLE9BQU8sR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ2pFLElBQUEsSUFBSSxPQUFPLEdBQUssRUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNqRSxJQUFBLElBQUksZUFBZSxHQUFLLEVBQUEsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDMUUsSUFBQSxJQUFJLFNBQVMsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3BFLElBQUEsSUFBSSxnQkFBZ0IsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzNFLElBQUEsSUFBSSxjQUFjLEdBQUssRUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN6RSxJQUFBLElBQUksVUFBVSxHQUFLLEVBQUEsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDckUsSUFBQSxJQUFJLE9BQU8sR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ25FLElBQUEsSUFBSSxTQUFTLEdBQUssRUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNyRSxJQUFBLElBQUksU0FBUyxHQUFLLEVBQUEsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDckUsSUFBQSxJQUFJLFdBQVcsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3ZFLElBQUEsSUFBSSxXQUFXLEdBQUssRUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN2RSxJQUFBLElBQUksV0FBVyxHQUFLLEVBQUEsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDdEUsSUFBQSxJQUFJLGlCQUFpQixHQUFLLEVBQUEsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDNUUsSUFBSSxpQkFBaUIsQ0FBQyxDQUFTLEVBQUEsRUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ2xGLElBQUEsSUFBSSxNQUFNLEdBQUssRUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNqRSxJQUFJLE1BQU0sQ0FBQyxDQUFTLEVBQUEsRUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ3ZFLElBQUEsSUFBSSxXQUFXLEdBQUssRUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUN2RSxJQUFJLFdBQVcsQ0FBQyxDQUFTLEVBQUEsRUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQzdFLElBQUEsSUFBSSxtQkFBbUIsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2pGLENBQUE7QUFFRCxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUl2Qzs7QUFFRztBQUNHLE1BQU8saUJBQWtCLFNBQVEsd0NBQXdDLENBQUE7QUFDM0U7Ozs7QUFJRztBQUNILElBQUEsR0FBRyxDQUFDLEtBQWEsRUFBQTtBQUNiLFFBQUFBLFFBQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUM1QixRQUFBLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUMsS0FBQTtBQUNKLENBQUE7QUFFRCxRQUFRLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUVqRCxNQUFNLG9CQUFxQixTQUFRLE1BQU0sQ0FBQTtBQUVyQyxJQUFBLElBQUksT0FBTyxHQUFLLEVBQUEsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDakUsSUFBQSxJQUFJLE9BQU8sR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ2pFLElBQUEsSUFBSSw2QkFBNkIsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3ZGLElBQUEsSUFBSSw4QkFBOEIsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3hGLElBQUEsSUFBSSw0QkFBNEIsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3RGLElBQUEsSUFBSSw2QkFBNkIsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3ZGLElBQUEsSUFBSSxxQkFBcUIsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQy9FLElBQUEsSUFBSSw2QkFBNkIsR0FBSyxFQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3ZGLElBQUEsSUFBSSxHQUFHLEdBQUssRUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFD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QyxLQUFLLFVBQVUsQ0FBQztBQUNyRjtBQUNBLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNYLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDdEMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxLQUFLLFVBQVUsQ0FBQztBQUNwRixFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEYsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ1I7QUFDQSxDQUFDLFFBQVEsU0FBUztBQUNsQixFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFDckQsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDO0FBQ3BELEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDM0M7QUFDQSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUFNLEtBQUss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Q0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0RjtBQUNBLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNYLElBQUksRUFBRSxDQUFDLENBQUM7QUFDUixHQUFHO0FBQ0g7QUFDQSxFQUFFLFFBQVEsQ0FBQztBQUNYLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUNwRCxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7QUFDbkQsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUMxQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0YsR0FBRztBQUNIO0FBQ0EsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNoQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkYsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNoQjtBQUNBLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pCLENBQUM7QUFDRDtB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QUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2RSxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQUUsUUFBQSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUFFLFFBQUEsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQ7QUFDQSxTQUFTLHlCQUF5QixDQUFDLEtBQWtCLEVBQUUsQ0FBUSxFQUFBO0lBQzNELElBQUksQ0FBQyxHQUFHLEtBQUssRUFDVCxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUVqQixJQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ25DLFFBQUEsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO0FBQzNELFlBQUEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLFlBQUEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMs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LENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsWUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUMvQyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlILFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ksS0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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LEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVND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QyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNuQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxhQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNwQixRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlxQixPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFWLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxnQkFBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLHNCQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJQyxLQUFHLEdBQUdiLFVBQVEsQ0FBQztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSWMsS0FBRyxHQUFHTixVQUFRLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOWF6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNsQixRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJQyxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzlDLE9BQUssQ0FBQyxDQUFDLEVBQUU7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJOEMsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFlBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUMvQyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlILFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNJLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0UsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM5QjtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNaLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3ZDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSxhQUFXLENBQUMsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNsQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztB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LENBQUM7QUFDM0QsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNHLGdCQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLHNCQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSCxhQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUcsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTcEIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSXFCLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVB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RyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNFLFlBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN4RSxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlILFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNJLEtBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDdEUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNGLFVBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDbEM7QUFDQSxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtBQUNqQixJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsR0FBRyxNQUFNO0FBQ1QsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQztBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDOUM7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNyQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDekMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNyQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDekMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNyQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDekMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsU0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDaEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGFBQVcsQ0FBQyxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxPQUFPLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDeEcsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNiLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNyQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ25DLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNjLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNwQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTYSxpQkFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNaLGNBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3ZDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDdkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsYUFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2EsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDdkMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEM7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xGO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDL0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNyQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1osS0FBRyxDQUFDLENBQUMsRUFBRTtBQUN2QixFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzlJLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE1BQUksQ0FBQyxDQUFDLEVBQUU7QUFDeEIsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csZ0JBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Msc0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ3ZELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNILGFBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvSixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNwQixRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJcUIsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNud0IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJRyxLQUFHLEdBQUdiLFVBQVEsQ0FBQztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSWMsS0FBRyxHQUFHTixVQUFRLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeHdCekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNsQixRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJQyxVQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM5QyxPQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSThDLFVBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0UsWUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUMzRyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlILFVBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ksS0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNGLFVBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNsQztBQUNBLEVBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQ2pCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLEdBQUcsTUFBTTtBQUNULElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSSxRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQztBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEY7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0csRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzFHLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEM7QUFDQSxFQUFFLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDL0UsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNHLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQjtBQUNBLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDYixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0RCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RELEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0RCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTYixXQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDekIsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUN6QixFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ3pCO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEQsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELEdBQUcsTUFBTTtBQUNULElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEQsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2UsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcs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QUM7QUFDZCxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZDtBQUNBLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDOUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDOUM7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTtBQUNqQjtBQUNBLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNRLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakI7QUFDQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM5QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakI7QUFDQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM5QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakI7QUFDQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNMLGlCQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUN4QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNaLGNBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtBQUM3QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDakIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2Q7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHTyxPQUFnQixFQUFFO0FBQzlCLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWCxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWCxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWCxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3hDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEI7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN4QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDeEMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QjtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNXLHlCQUF1QixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25EO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFF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Q08sU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNyQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN0QyxFQUFFLElBQUksT0FBTyxHQUFHLElBQUkvQixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMzQixFQUFFLElBQUksS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1o7QUFDQSxFQUFFLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtBQUNqQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN0QixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixHQUFHLE1BQU0sSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEVBQUU7QUFDekMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixHQUFHLE1BQU0sSUFBSSxJQUFJLEdBQUcsSUFBSSxFQUFFO0FBQzFCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsR0FBRyxNQUFNO0FBQ1QsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN0QixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsNEJBQTRCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzNEO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsa0NBQWtDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwRTtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM1QixFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzVCLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNsQyxFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzVCLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM1QixFQUFFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzVELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUM1RCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDN0QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDeEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUNsRSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDOUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQzlCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUM5QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQzVELEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNsQyxNQUFNLEVBQUUsQ0FBQztBQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZDtBQUNBLEVBQUUsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxRQUFRLEVBQUU7QUFDdkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMxQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQ2hDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNsQyxHQUFHLE1BQU07QUFDVCxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDeEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1UsSUFBQyxXQUFXLEdBQUcsYUFBYyxDQUFBO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQzVELEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNsQyxNQUFNLEVBQUUsQ0FBQztBQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7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R0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQzlCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNVLElBQUMsS0FBSyxHQUFHLE9BQVEsQ0FBQTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDbEUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQzlCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM5QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztB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LEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxHQUFHO0FBQ0g7QUFDQSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDekIsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN6QixFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0I7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDWCxHQUFHLE1BQU07QUFDVCxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7QUFDL0MsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25CLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbkIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDM0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDM0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3hDO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7QUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUU7QUFDOUIsTUFBTSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRTtBQUM5QixNQUFNLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDL0IsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDcEM7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTWSxLQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ3ZCLEVBQUUsT0FBTyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN0UCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDeEIsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUgsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNFLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxhQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsUyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNwQixRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSXFCLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENB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QyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNSLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVN3QixRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTM0IsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTNEIsYUFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUM5QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxJQUFJLENBQUMsR0FB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RSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDNUMsRUFBRSxJQUFJLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsSUFBSSxPQUFPLEdBQUcsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLEVBQUUsSUFBSSxPQUFPLEdBQUcsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0MsRUFBRSxJQUFJLE9BQU8sR0FBRyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsSUFBSSxPQUFPLEdBQUcsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUM3RSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FB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RSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsZUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsZUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3pDO0FBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmO0FBQ0E7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDM0IsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUMzQixNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUI7QUFDQSxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUc7QUFDaEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRztBQUNoQyxNQUFNLElBQUksR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDakM7QUFDQSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ1osRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ1osRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ1o7QUFDQSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7QUFDWixFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7QUFDWixFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7QUFDWjtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQzFCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzFCLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDeEMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2I7QUFDQSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQjtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JEO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3hDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNaLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckI7QUFDQSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRDtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsU0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUN4QyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYjtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2Q7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFH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RyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTWSxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1IsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTd0IsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTM0IsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM0QixhQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQzlDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsSUFB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QUNPLFNBQVNDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUM7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFFBQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ25DLEVBQUUsS0FBSyxHQUFHLEtBQUssSUFBSSxHQUFHLENBQUM7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNyQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNiO0FBQ0EsRUFBRSxHQUFHO0FBQ0wsSUFBSSxFQUFFLEdBQUdDLE1BQWUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsSUFBSSxFQUFFLEdBQUdBLE1BQWUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzNCLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFO0FBQ3BCO0FBQ0EsRUFBRSxHQUFHO0FBQ0wsSUFBSSxFQUFFLEdBQUdBLE1BQWUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsSUFBSSxFQUFFLEdBQUdBLE1BQWUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzNCLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFO0FBQ3BCO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNuQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxlQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDekMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDekMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCO0FBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNwRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ3BELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDcEQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSSxNQUFJLENBQUMsR0FBRyxFQUFFO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsT0FB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QUFJLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLEVBQUU7QUFDekMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEIsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4QixNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxDQUFDLENBQUM7QUFDYixHQUFHLENBQUM7QUFDSixDQUFDLEVBQUUsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNscEJIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQSxRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJQyxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0UsVUFBUSxDQUFDLEdBQUcsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDN0MsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFD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QUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsU0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3JDLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUNiLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDeEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDckMsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ2IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUN4QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNuQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM1QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzNCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0MsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdB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Q0FBQztBQUNyQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNyQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDckMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNyQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzhCLFFBQU0sQ0FBQyxHQUFHLEVBQUU7QUFDNUI7QUFDQTtBQUNBLEVBQUUsSUFBSSxFQUFFLEdBQUdDLE1BQWUsRUFBRSxDQUFDO0FBQzdCLEVBQUUsSUFBSSxFQUFFLEdBQUdBLE1BQWUsRUFBRSxDQUFDO0FBQzdCLEVBQUUsSUFBSSxFQUFFLEdBQUdBLE1BQWUsRUFBRSxDQUFDO0FBQzdCLEVBQUUsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDdkMsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUMsR0FB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LENBQUM7QUFDekIsSUFBSSxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztBQUN4QjtBQUNBLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDbkMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUNuQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ25DLEdBQUcsTUFBTTtBQUNUO0FBQ0EsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDeEUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztBQUN6QixJQUFJLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ3hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ25ELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ25ELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ25ELEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN4QyxFQUFFLElBQUksU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztBQUN4QyxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUM7QUFDakIsRUFBRSxDQUFDLElBQUksU0FBUyxDQUFDO0FBQ2pCLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2hELEtBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDdkIsRUFBRSxPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJ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QUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsSUFBSSxPQUFPckMsV0FBUyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDL0MsR0FBRyxDQUFDO0FBQ0osQ0FBQyxFQUFFLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xzQkg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM5QyxRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJQyxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxHQUFHO0FBQ0g7QUFDQSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDWixFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTOUMsT0FBSyxDQUFDLENBQUMsRUFBRTtBQUN6QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUk4QyxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csWUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDM0QsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJSCxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsNkJBQTZCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQzFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSUEsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHO0FBQ25CLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHO0FBQ25CLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDcEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuRCxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHO0FBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHO0FBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHO0FBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUN4QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDckMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNqQztBQUNBLEVBQUUsSUFBSSxLQUFLLEdBQUdtRixRQUFXLEVBQUUsQ0FBQztBQUM1QixFQUFFQyxXQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUlwRixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLEVBQUVxRixnQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3BGLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csS0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ3pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFH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QyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNyQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbkQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ25ELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3BELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDckMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEQsRUFBRUMsU0FBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUIsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3JDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2xELEVBQUVDLFNBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNsRCxFQUFFQyxTQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM1QixFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM5QyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVB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LENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNlLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTUCxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekcsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSWEsS0FBRyxHQUFHYixVQUFRLENBQUM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSW1DLEtBQUcsR0FBRzRDLEtBQVEsQ0FBQztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzFDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSUYsS0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENB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QUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLElBQUksU0FBUyxHQUFHSCxlQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkM7QUFDQSxFQUFFLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtBQUNyQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3JDLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUM5QixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDOUIsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQzlCLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUM5QixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDeEQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQzdDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQzdDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQzdDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQzdDLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTNUIsS0FBRyxDQUFDLENBQUMsRUFBRTtBQUN2QixFQUFFLE9BQU8sUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqSSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNJLGFBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUksQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTcEIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlxQixPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzlxQixDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqMEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE1BQU0sR0FBRztBQUN6QixFQUFFLElBQUksR0FBRyxHQUFHLElBQUluQixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSUEsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJQSxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQzlDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxNQUFNLENBQUMsQ0FBQyxFQUFFO0FBQzFCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQjtBQUNBLEVBQUUsSUFBSSxHQUFHLEdB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QUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtB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QUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkU7QUFDQSxFQUFFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDO0FBQzVDO0FBQ0EsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDdkIsRUFBRSxPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDNUMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNB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QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxRQUFRLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdFLFFBQVEsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0UsUUFBUSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlFO0FBQ0E7QUFDQSxJQUFJLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQ3hELFFBQVEsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDekQ7QUFDQSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLO0FBQ3JCLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDdEI7QUFDQTtBQUNBLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO0FBQ2pELFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUk7QUFDNUMsWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDdkQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUNwQjtBQUNBLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUk7QUFDNUMsWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFD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SSxDQUFDLENBQUM7QUFDcEI7QUFDQSxLQUFLLFFBQVEsU0FBUyxHQUFHLENBQUMsRUFBRTtBQUM1QjtBQUNBLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQzNDO0FBQ0EsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDckMsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDckM7QUFDQSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0FBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0FBQ3BDO0FBQ0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0FBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUNwQztBQUNB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LENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUN4QixJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNwQyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLElBQUksSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEMsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwQyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDO0FBQ0EsSUFBSSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQztBQUM1QztBQUNBLElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3ZELElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFD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R0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRTtBQUMxRCxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsS0FBSztBQUNMLElBQUksT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBQ0Q7QUFDQTtBQUNBLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxJQUFJLEVBQUU7QUFDakMsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtBQUMvQixRQUFRLE1BQU0sR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDO0FBQzNELFFBQVEsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUN0QjtBQUNBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDMUMsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNqRCxZQUFZLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUUsU0FBUztBQUNULFFBQVEsSUFBSSxD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LFFBQVEsQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDMUMsU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLE9BQU8sY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDcEQsQ0FBQTs7QUM3RU8sTUFBTSx3QkFBd0IsR0FBRztBQUNwQyxJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLElBQUksRUFBRSxHQUFHO0FBQ1QsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztBQUNSLElBQUEsR0FBRyxFQUFFLEdBQUc7QUFDUixJQUFBLEdBQUcsRUFBRSxHQUFHO0FBQ1IsSUFBQSxHQUFHLEVBQUUsR0FBRztDQUNYLENBQUM7QUFFc0IsU0FBQSxzQkFBc0IsQ0FBQyxLQUFhLEVBQUE7SUFDeEQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBRWhCLElBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbkMsUUFBQSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDckQsUUFBQSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7UUFFckQsTUFBTSxxQkFBcUIsSUFDdkIsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLGlDQUFpQyxDQUFDLFlBQVksQ0FBQyxJQUFJLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0csYUFBQSxD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LEdBQUcsTUFBTTtBQUNULElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFBO0FBQ2pCLEdBQUc7QUFDSCxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2pELENBQUMsQ0FBQTtBQUNEO0FBQ0EsSUFBQSxLQUFBLEdBQUFBLFNBQUEsQ0FBQSxLQUFhLEdBQUcsVUFBVSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtBQUNyRSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDYixFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFBO0FBQ3BDLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQTtBQUM1QixFQUFFLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUE7QUFDdkIsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUNsRSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUN2QixFQUFFLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDN0Q7QUFDQSxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3pCO0FBQ0EsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO0FBQzFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQzVCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQTtBQUNaLEdBQUcsTUFBTTtBQUNULElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDOUMsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUMzQyxNQUFNLENBQUMsRUFBRSxDQUFBO0FBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ1osS0FBSztBQUNMLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsRUFBRTtBQUN4QixNQUFNLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQ3JCLEtBQUssTUFBTTtBQUNYLE1BQU0sS0FBSyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUE7QUFDMUMsS0FBSztBQUNMLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN4QixNQUFNLENBQUMsRUFBRSxDQUFBO0FBQ1QsTUFB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QUFJLElBQUksS0FBSyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxPQUFPO0FBQ3hHLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO0FBQ3BELEtBQUs7QUFDTDtBQUNBLElBQUksWUFBWSxFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNELEtBQUs7QUFDTDtBQUNBLElBQUksWUFBWSxFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUMvQixRQUFRLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckM7QUFDQSxRQUFRLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuQjtBQUNBLFFBQVEsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUNoQztBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUM7QUFDdEM7QUFDQSxRQUFRLElBQUksR0FB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Q0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7QUFDMUcsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO0FBQzFHLFNBQVMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtBQUMxRyxTQUFTLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7QUFDMUcsU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO0FBQzFHLFNBQVMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcs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Q0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDN0U7QUFDQTtBQUNBLElBQUksTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQzlEO0FBQ0EsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDbEIsSUFBSSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDbkI7QUFDQSxJQUFJLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFO0FBQzdCO0FBQ0EsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDckQsWUFBWSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEM7QUFDQTtBQUNBLFlBQVksSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM1QixZQUFZLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM1QjtBQUNBLFlBQVksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELFlBQVksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25EO0FBQ0EsWUFB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LENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDOztBQUVoRSxZQUFBLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDeEYsWUFBQSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQU0sQ0FBQyxFQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDeEYsWUFBQSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQyxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQ3hGLFlBQUEsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQU0sQ0FBQyxFQUFFLENBQUMsRUFBQyxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFD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QUFDLENBQUMsR0FBRyxVQUFVO1lBQzlDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVU7U0FDakQsQ0FBQztBQUNMLEtBQUE7Ozs7QUFNRCxJQUFBLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO0FBQzdDLElBQUEsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7QUFFL0MsSUFBQSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQztBQUM3QixJQUFBLElBQUksT0FBTyxLQUFLLE9BQU8sSUFBSSxPQUFPLEtBQUssTUFBTSxFQUFFOztBQUUzQyxRQUFBLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxRQUFBLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxLQUFBO0FBQU0sU0FBQTs7QUFFSCxRQUFBLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsU0FBUyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pFLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxLQUFBO0FBRUQsSUFBQSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQztBQUMzQyxJQUFBLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBQ2pELElBQUEsSUFBSSxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUU7O0FBRTVDLFFBQUEsR0FBRyxHQUFHLFVB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QkFBQSxFQUFBLFlBQWlDLEVBQ2pDLFNBQW9CLEdBQUEsQ0FBQyxFQUNyQixLQUFBLEdBQWlCLEtBQUssRUFBQTs7QUFHdEIsSUFBQSxJQUFJLElBQUksR0FBRyxRQUFRLEVBQUUsSUFBSSxHQUFHLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDO0FBQ3pFLElBQUEsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLElBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdkMsUUFBQSxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsUUFBQSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUFFLFlBQUEsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBQSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUFFLFlBQUEsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBQSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUFFLFlBQUEsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBQSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUFFLFlBQUEsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsS0FBQTtBQUVELElBQUEsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQixJQUFBLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7SUFDM0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDekMsSUFBQSxJQUFJLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDOztJQUdyQixNQUFNLFNBQVMsR0FBRyxJQUFJZ0ssU0FBSyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUU1QyxJQUFJLFFBQVEsS0FBSyxDQUFDO0FBQUUsUUFBQSxPQUFPLElBQUloSyxhQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztBQUdqRCxJQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRTtBQUN4QyxRQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRTtBQUN4QyxZQUFBLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQzNELFNBQUE7QUFDSixLQUFBOztBQUdELElBQUEsSUFBSSxRQUFRLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzdDLElBQUEsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUVqQyxPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUU7O0FBRXJCLFFBQUEsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDOztBQUc3QixRQUFBLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRTtZQUNwQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLFlBQUEsSUFBSSxLQUFLO2dCQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN0RyxTQUFBOztRQUdELElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFJLFNBQVM7WUFBRSxTQUFTOztBQUdqRCxRQUFBLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN0RSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDdEUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN0RSxTQUFTLElBQUksQ0FBQyxDQUFDO0FBQ2xCLEtBQUE7QUFFRCxJQUFBLElBQUksS0FBSyxFQUFFO0FBQ1AsUUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsU0FBUyxDQUFBLENBQUUsQ0FBQyxDQUFDO0FBQ3hDLFFBQUEsT0FB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LENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM1QixRQUFBLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUV0SCxRQUFBLE1BQU0sU0FBUyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsUUFBQSxPQUFPLFNBQVMsQ0FBQztBQUNwQixLQUFBO0FBRUQ7Ozs7Ozs7O0FBUUc7SUFDSCxRQUFRLENBQUMsTUFBaUIsR0FBQSxDQUFDLEVBQUE7UUFDdkIsTUFBTSxtQ0FBbUMsR0FBRyxRQUFRLENBQUM7QUFDckQsUUFBQSxNQUFNLFdBQVcsR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLG1DQUFtQyxFQUNsRSxXQUFXLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFckUsUUFBQSxPQUFPLElBQUlDLGNBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxFQUM5RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxD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QUFBLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLFFBQUEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzlDLFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDOzs7O1FBS3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O1lBRTFCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFekQsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFFaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUV6RCxZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLFNBQUE7O0FBRUQsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakUsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNFLEtBQUE7QUFFRCxJQUFBLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFBO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDaEQsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFB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SUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFELElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtBQUNsRDtBQUNBLElBQUksT0FBTyxLQUFLLEdBQUcsSUFBSSxFQUFFO0FBQ3pCLFFBQVEsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsRUFBRTtBQUNoQyxZQUFZLE1BQU0sQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLFlBQVksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDbkMsWUFBWSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLFlBQVksTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoRCxZQUFZLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RixZQUFZLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUks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QUFDakUsUUFBUSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEU7QUFDQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2hELFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QixZQUFZLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVDLFlBQVksTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hELFNBQVM7QUFDVDtBQUNBLFFBQVFDLE1BQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUQsS0FBSztBQUNMO0FBQ0EsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQ2xDLFFBQVEsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbkYsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEIsUUFBUSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JFLEtBQUs7QUFDTCxDQUFBOztBQy9CQSxNQUFNLGNBQWMsR0FBRztBQUN2QixJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ2QsSUFBSSxPQUFPLEVBQUUsRUFBRTtBQUNmLElBQUksU0FBUyxFQUFFLENBQUM7QUFDaEIsSUFBSSxNQUFNLEVBQUUsRUFBRTtBQUNkLElBQUksTUFBTSxFQUFFLEdBQUc7QUFDZixJQUFJLFFBQVEsRUFBRSxFQUFFO0FBQ2hCLElBQUksR0FBRyxFQUFFLEtBQUs7QUFDZDtBQUNBO0FBQ0EsSUFBSSxVQUFVLEVBQUUsS0FBSztBQUNyQjtBQUNBO0FBQ0EsSUFBSSxNQUFNLEVBQUUsSUFBSTtBQUNoQjtBQUNBO0FBQ0EsSUFBSSxHQUFHLEVBQUUsS0FBSyxJQUFJLEtBQUs7QUFDdkIsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRztBQUNlLE1BQU0sWUFBWSxDQUFDO0FBQ2xDLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtBQUN6QixRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUdoTixRQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN0RSxRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekQsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2pCLFFBQVEsTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDL0Q7QUFDQSxRQUFRLElBQUksR0FBRyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDNUM7QUFDQSxRQUFRLE1BQU0sT0FBTyxHQUFHLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUM7QUFDOUQsUUFBUSxJQUFJLEdBQUcsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsUUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUM3QjtBQUNBO0FBQ0EsUUFBUSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDMUIsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoRCxZQUFZLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFNBQVM7QUFDOUMsWUFBWSxRQUFRLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUMzRjtBQUNBLFFBQVEsSUFBSSxHQUFHLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMxQztBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDakQsWUFBWSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNwQztBQUNBO0FBQ0EsWUFBWSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEQsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNyRjtBQUNBLFlBQVksSUFBSSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNwRyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDL0M7QUFDQSxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDNUIsUUFBUSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDL0QsUUFBUSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUQsUUFBUSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdB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QUUsU0FBUyxDQUFDLENBQUM7QUFDdEMsSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QjtBQUNBLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlCLElBQUksR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDdkIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxZQUFZLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0FBQ3hELElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDM0MsUUFBUSxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7QUFDdEIsUUFBUSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDMUQsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDckIsSUFBSSxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLENBQUM7QUFDRDtBQUNBLFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUNyQixJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUMsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FB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QUFDdEMsU0FBUztBQUNULEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUU7QUFDeEU7QUFDQSxJQUFJLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUN6RCxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDekIsSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDbEI7QUFDQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ2pELFFBQVEsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3QixRQUFRLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0IsUUFBUSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdCLFFBQVEsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3QixRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNyQyxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNyQyxRQUFRLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztB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QUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3hEO0FBQ0E7QUFDQSxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUM1QixJQUFJLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzlGLFFBQVEsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDdEIsUUFBUSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUU7QUFDeEIsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDbkIsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDM0IsSUFBSSxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDN0IsSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDekIsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUMzRCxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFDLFFBQVEsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ25FLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDaEMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDNUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsSUFBSSxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQzVDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxD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QUFDaEIsUUFBUSxJQUFJLEVBQUUsQ0FBQztBQUNmLEtBQUssQ0FBQztBQUNOLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDOUMsUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDM0IsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDMUQ7QUFDQSxRQUFRLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEMsUUFBUSxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEM7QUFDQSxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDL0MsUUFBUSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQy9DLFFBQVEsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMvQyxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDL0MsS0FBSztBQUNMLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVB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LENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEYsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEYsWUFBWSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxLQUFLLEVBQUU7QUFDbkIsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkYsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkYsWUFBWSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDbkQ7QUFDQSxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUs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QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDakYsWUFBQUEscUJBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFNLENBQUMsRUFBQyxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQ2pGLFlBQUFBLHFCQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDakYsWUFBQUEscUJBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQU0sQ0FBQyxFQUFFLENBQUMsRUFBQyxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQ3BGLFNBQUE7QUFFRCxRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLEtBQUE7QUFFRCxJQUFBLFVBQVUsR0FBQTtBQUNOLFFBQUEsSUFBSSxDQUFDLDJC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QUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9GO0FBQ0EsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3RDLFlBQVksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hFLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUM5RSxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sS0FBSyxDQUFDO0FBQ3JCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzdELElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsUUFBUSxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEcsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxRQUFRLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUs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QUFVLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDMUUsU0FBQTtRQUNELElBQUksQ0FBQ0EsV0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNyQyxZQUFBLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQ3RFLFNBQUE7UUFDRCxJQUFJLENBQUNBLFdBQU8sQ0FBQSxTQUFBLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDdkMsWUFBQSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUMsQ0FBQztBQUN4RSxTQUFBO1FBQ0QsSUFBSSxDQUFDQSxXQUFPLENBQUEsU0FBQSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQ3ZDLFlBQUEsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDeEUsU0FBQTtRQUNELElBQUksQ0FBQ0EsV0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtBQUMvQyxZQUFBLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQ2hGLFNBQUE7UUFDRCxJQUFJLENBQUNBLFdBQU8sQ0FBQSxTQUFBLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDckMsWUFBQSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsQ0FBQztBQUN0RSxTQUFBOzs7O1FBS0QsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDOztRQUcxQixNQUFNLHlCQUF5QixHQUFHLEVBQUUsQ0FBQztBQUNyQyxRQUFBLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsY0FBYyxDQUFDLENBQUM7Ozs7OztRQU90RixNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQ2YsWUFBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSTtBQUM1QixnQkFBQSxJQUFJLGNBQWMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDOUIsb0JBQUEsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7QUFDdEUsaUJBQUE7QUFBTSxxQkFBQTtBQUNILG9CQUFBLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUIsaUJBQUE7QUFDTCxhQUFDLENBQUMsQ0FBQztBQUNOLFNBQUE7QUFDRCxRQUFBLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7O1FBR3RELFVBQVUsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUVwRCxLQUFBO0FBQUMsSUFBQSxPQUFPLENBQUMsRUFBRTs7QUFFUixRQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakQsUUFBQSxRQUFRLEdBQUcsQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsQ0FBQztBQUM5RCxLQUFBO0FBRUQsSUFBQSxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFBOztBQ2pZQSxNQUFNLGdCQUFnQixDQUFBO0FBT2xCLElBQUEsV0FBWSxDQUFBLE9BQTZCLEVBQUUsUUFBd0IsRUFBQTtBQUMvRCxRQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2pDLEtBQUE7QUFFRCxJQUFBLEtBQUssQ0FBQyxPQUE2QixFQUFFLFFBQXdCLEVBQUE7QUFDekQsUUFBQSxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7OztBQUk1QixRQUFBLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUV4QixRQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxZQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUQsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzFELFFBQUEsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQ3hELEtBQUE7QUFFRCxJQUFBLElBQUksQ0FBQyxDQUFTLEVBQUE7UUFDVjdQLFdBQU0sQ0FBQSxNQUFBLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUMxQixZQUFBLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QixTQUFBO1FBRUQsQ0FBQyxHQUFHOFAsaUJBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztRQUduQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JELE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFFMUQsT0FBTyxnQkFBZ0IsR0FBRyxZQUFZLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQzdFLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUN0RCxTQUFBOztBQUdELFFBQUEsTUFBTSxjQUFjLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3RELFFBQUEsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLEdBQUcsYUFBYSxDQUFDO0FBQ3ZELFFBQUEsTUFBTSxRQUFRLEdBQUcsYUFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxhQUFhLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztBQUV4RixRQUFBLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ3pHLEtBQUE7QUFDSixDQUFBOztBQ3hCRCxTQUFTLGNBQWMsQ0FBQyxRQUFxQixFQUFFLFFBQXFCLEVBQUE7SUFDaEUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRW5CLElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRTs7QUFFMUIsS0FBQTtBQUFNLFNBQUEsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUU7OztRQUdyRCxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ25CLEtBQUE7QUFFRCxJQUFBLE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0FBWUc7QUFDSCxNQUFNLFNBQVMsQ0FBQTtBQWdCWCxJQUFBLFdBQUEsQ0FBYSxLQUFhLEVBQUUsTUFBYyxFQUFFLFFBQWdCLEVBQUE7QUFDeEQsUUFBQSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUNwQyxRQUFBLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDOzs7O1FBSzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQztBQUUvQyxRQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDeEQsWUFBQSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLFlBQUEsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QixTQUFBO0FBQ0QsUUFBQSxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUNyQixRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUVsQixRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25CLFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDaEIsUUFBQSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUN0QixLQUFBO0FBRUQsSUFBQSxVQUFVLEdBQUE7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0FBQ3ZELEtBQUE7SUFFRCxNQUFNLENBQUMsR0FBTSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBQTtRQUN6RCxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3RFLFFBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkIsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyQixRQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JCLFFBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckIsUUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QixLQUFBO0FBRUQsSUFBQSxZQUFZLENBQUMsR0FBTSxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsTUFBYyxFQUFBOzs7QUFHckQsUUFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQzVHLFFBQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsUUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixRQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLFFBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0IsS0FBQTtBQUVPLElBQUEsY0FBYyxDQUFDLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxTQUFpQixFQUFFLEdBQVcsRUFBQTtRQUNqRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QyxLQUFBO0FBRU8sSUFBQSxpQkFBaUIsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsU0FBaUIsRUFBRSxHQUFXLEVBQUE7UUFDcEcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekMsS0FBQTtBQUVPLElBQUEsTUFBTSxDQUFDLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxPQUFnQixFQUFFLFdBQXdCLEVBQUUsU0FBK0IsRUFBQTtBQUN0SSxRQUFBLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ3pELFlBQUEsT0FBTyxFQUFFLENBQUM7QUFDYixTQUFBO1FBQ0QsTUFBTSxNQUFNLEdBQTBCLEVBQUUsQ0FBQztBQUN6QyxRQUFBLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFO0FBQzdELFlBQUEsSUFBSSxPQUFPLEVBQUU7O0FBRVQsZ0JBQUEsT0FBTyxDQUFDO0FBQ0osd0JBQUEsR0FBRyxFQUFFLElBQUk7d0JBQ1QsRUFBRTt3QkFDRixFQUFFO3dCQUNGLEVBQUU7d0JBQ0YsRUFBRTtBQUNMLHFCQUFBLENBQUMsQ0FBQztBQUNOLGFBQUE7QUFDRCxZQUFBLEtBQUssSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDekQsTUFBTSxDQUFDLElBQUksQ0FBQztBQUNSLG9CQUFBLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztvQkFDekIsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDM0IsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQy9CLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMvQixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQyxpQkFBQSxDQUFDLENBQUM7QUFDTixhQUFBO0FBQ0QsWUFBQSxLQUFLLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUU7Z0JBQ3JFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLGdCQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxQyxnQkFBQSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDUixvQkFBQSxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7b0JBQy9CLEVBQUUsRUFBRSxDQUFDLEdBQUcsTUFBTTtvQkFDZCxFQUFFLEVBQUUsQ0FBQyxHQUFHLE1BQU07b0JBQ2QsRUFBRSxFQUFFLENBQUMsR0FBRyxNQUFNO29CQUNkLEVBQUUsRUFBRSxDQUFDLEdBQUcsTUFBTTtBQUNqQixpQkFBQSxDQUFDLENBQUM7QUFDTixhQUFBO0FBQ0osU0FBQTtBQUFNLGFBQUE7QUFDSCxZQUFBLE1BQU0sU0FBUyxHQUFjO2dCQUN6QixPQUFPO2dCQUNQLFdBQVc7Z0JBQ1gsUUFBUSxFQUFFLEVBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFDO2FBQ2xDLENBQUM7WUFDRixJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDcEYsU0FBQTtBQUVELFFBQUEsT0FBTyxNQUFNLENBQUM7QUFDakIsS0FBQTtBQUVELElBQUEsS0FBSyxDQUFDLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBQTtBQUNoRCxRQUFBLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25ELEtBQUE7QUFFRCxJQUFBLE9BQU8sQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsV0FBd0IsRUFBRSxTQUErQixFQUFBO1FBQzdHLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQy9FLEtBQUE7SUFFRCxhQUFhLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxNQUFjLEVBQUUsV0FBd0IsRUFBRSxTQUErQixFQUFBOzs7QUFHekcsUUFBQSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3RCLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN0QixRQUFBLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDdEIsUUFBQSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3RCLFFBQUEsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDekQsWUFBQSxPQUFPLEtBQUssQ0FBQztBQUNoQixTQUFBOzs7O1FBS0QsTUFBTSxNQUFNLEdBQWMsRUFBRSxDQUFDO0FBQzdCLFFBQUEsTUFBTSxTQUFTLEdBQWM7QUFDekIsWUFBQSxPQUFPLEVBQUUsSUFBSTtZQUNiLFdBQVc7QUFDWCxZQUFBLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFDO1lBQ3RCLFFBQVEsRUFBRSxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBQztTQUNsQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkYsUUFBQSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLEtBQUE7QUFFTyxJQUFBLFVBQVUsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsU0FBaUIsRUFBRSxNQUE2QixFQUFFLFNBQW9CLEVBQUUsU0FBK0IsRUFBQTtRQUN0SyxNQUFNLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUMsR0FBRyxTQUFTLENBQUM7UUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV6QyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7QUFDbEIsWUFBQSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzNCLFlBQUEsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7QUFDMUIsZ0JBQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDdkIsb0JBQUEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDNUIsb0JBQUEsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFFakMsSUFBSSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUN4Qix5QkFBQSxFQUFFLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6Qix5QkFBQSxFQUFFLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6Qix5QkFBQSxFQUFFLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6Qix5QkFBQSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUNoQyx3QkFBQSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUU7NEJBQzNELE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0NBQ1IsR0FBRztBQUNILGdDQUFBLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ2xCLGdDQUFBLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUN0QixnQ0FBQSxFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDdEIsZ0NBQUEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLDZCQUFBLENBQUMsQ0FBQztBQUNILDRCQUFBLElBQUksT0FBTyxFQUFFOztBQUVULGdDQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsNkJBQUE7QUFDSix5QkFBQTtBQUNKLHFCQUFBO0FBQ0osaUJBQUE7QUFDSixhQUFBO0FBQ0osU0FBQTtRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFO0FBQ3JCLFlBQUEsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUM3QixZQUFBLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO0FBQ2hDLGdCQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFO0FBQzdCLG9CQUFBLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2xDLG9CQUFBLE1BQU0sTUFBTSxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7b0JBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFFdkMsb0JBQUEsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQzFCLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFDZixPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUNuQixPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUNuQixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLENBQUM7QUFDRix5QkFBQSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUNoQyx3QkFBQSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUU7QUFDM0QsNEJBQUEsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDOzRCQUMxQixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUM5QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dDQUNSLEdBQUc7Z0NBQ0gsRUFBRSxFQUFFLENBQUMsR0FBRyxNQUFNO2dDQUNkLEVBQUUsRUFBRSxDQUFDLEdBQUcsTUFBTTtnQ0FDZCxFQUFFLEVBQUUsQ0FBQyxHQUFHLE1BQU07Z0NBQ2QsRUFBRSxFQUFFLENBQUMsR0FBRyxNQUFNO0FBQ2pCLDZCQUFBLENBQUMsQ0FBQztBQUNILDRCQUFBLElBQUksT0FBTyxFQUFFOztBQUVULGdDQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsNkJBQUE7QUFDSix5QkFBQTtBQUNKLHFCQUFBO0FBQ0osaUJBQUE7QUFDSixhQUFBO0FBQ0osU0FBQTs7QUFHRCxRQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLEtBQUE7QUFFTyxJQUFBLGdCQUFnQixDQUFDLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxTQUFpQixFQUFFLE1BQXNCLEVBQUUsU0FBb0IsRUFBRSxTQUErQixFQUFBO1FBQ3JLLE1BQU0sRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBQyxHQUFHLFNBQVMsQ0FBQztRQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXpDLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtBQUNsQixZQUFBLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDM0IsWUFBQSxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtBQUMxQixnQkFBQSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUN2QixvQkFBQSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztBQUM1QixvQkFBQSxNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2pDLG9CQUFBLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUMxQixNQUFNLENBQUMsQ0FBQyxFQUNSLE1BQU0sQ0FBQyxDQUFDLEVBQ1IsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUNsQixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUNsQixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUNsQixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25CLHlCQUFDLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDOUIsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRTtBQUMvQyx3QkFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xCLHdCQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YscUJBQUE7QUFDSixpQkFBQTtBQUNKLGFBQUE7QUFDSixTQUFBO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7QUFDckIsWUFBQSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQzdCLFlBQUEsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUU7QUFDaEMsZ0JBQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7QUFDN0Isb0JBQUEsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDbEMsb0JBQUEsTUFBTSxNQUFNLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztvQkFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN2QyxvQkFBQSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQ3BCLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFDZixPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUNuQixPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUNuQixNQUFNLENBQUMsQ0FBQyxFQUNSLE1BQU0sQ0FBQyxDQUFDLEVBQ1IsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUNkLHlCQUFDLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDOUIsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRTtBQUMvQyx3QkFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xCLHdCQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YscUJBQUE7QUFDSixpQkFBQTtBQUNKLGFBQUE7QUFDSixTQUFBO0FBQ0osS0FBQTtBQUVPLElBQUEsWUFBWSxDQUNoQixFQUFVLEVBQ1YsRUFBVSxFQUNWLEVBQVUsRUFDVixFQUFVLEVBQ1YsRUFBd0osRUFDeEosSUFBVSxFQUNWLElBQWdCLEVBQ2hCLFNBQStCLEVBQUE7UUFDL0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTFDLEtBQUssSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDN0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUM7b0JBQUUsT0FBTztBQUMvRSxhQUFBO0FBQ0osU0FBQTtBQUNKLEtBQUE7QUFFTyxJQUFBLG9CQUFvQixDQUFDLENBQVMsRUFBQTtBQUNsQyxRQUFBLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLEtBQUE7QUFFTyxJQUFBLG9CQUFvQixDQUFDLENBQVMsRUFBQTtBQUNsQyxRQUFBLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLEtBQUE7QUFFTyxJQUFBLGVBQWUsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBQTtBQUMxRixRQUFBLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsUUFBQSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLFFBQUEsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUMxQixRQUFBLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3hELEtBQUE7QUFFTyxJQUFBLHFCQUFxQixDQUN6QixPQUFlLEVBQ2YsT0FBZSxFQUNmLE1BQWMsRUFDZCxFQUFVLEVBQ1YsRUFBVSxFQUNWLEVBQVUsRUFDVixFQUFVLEVBQUE7UUFFVixNQUFNLGFBQWEsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3BDLFFBQUEsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUM7QUFDdkQsUUFBQSxJQUFJLEtBQUssSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLEVBQUU7QUFDbEMsWUFBQSxPQUFPLEtBQUssQ0FBQztBQUNoQixTQUFBO1FBRUQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNyQyxRQUFBLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDO0FBQ3hELFFBQUEsSUFBSSxLQUFLLElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxFQUFFO0FBQ25DLFlBQUEsT0FBTyxLQUFLLENBQUM7QUFDaEIsU0FBQTtBQUVELFFBQUEsSUFBSSxLQUFLLElBQUksYUFBYSxJQUFJLEtBQUssSUFBSSxjQUFjLEVBQUU7QUFDbkQsWUFBQSxPQUFPLElBQUksQ0FBQztBQUNmLFNBQUE7QUFFRCxRQUFBLE1BQU0sRUFBRSxHQUFHLEtBQUssR0FBRyxhQUFhLENBQUM7QUFDakMsUUFBQSxNQUFNLEVBQUUsR0FBRyxLQUFLLEdBQUcsY0FBYyxDQUFDO0FBQ2xDLFFBQUEsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssTUFBTSxHQUFHLE1BQU0sQ0FBQyxFQUFFO0FBQ25ELEtBQUE7QUFDSixDQUFBOztBQ3pZRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJDRztBQUVIOztBQUVHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxTQUFlLEVBQ3hDLFlBQXFCLEVBQ3JCLGFBQXNCLEVBQ3RCLFNBQW9CLEVBQ3BCLGlCQUF5QixFQUFBO0FBQ3pCLElBQUEsTUFBTSxDQUFDLEdBQUdkLFdBQUFBLENBQUFBLE1BQVcsRUFBRSxDQUFDO0FBQ3hCLElBQUEsSUFBSSxZQUFZLEVBQUU7QUFDZCxRQUFBRSxpQkFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoQmEsV0FBWSxDQUFBLE9BQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2QyxTQUFBO0FBQ0osS0FBQTtBQUFNLFNBQUE7UUFDSFosV0FBYSxDQUFBLFFBQUEsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzNELEtBQUE7QUFDRCxJQUFBLE9BQU8sQ0FBQyxDQUFDO0FBQ2IsQ0FBQztBQUVEOztBQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxTQUFlLEVBQ3JDLFlBQXFCLEVBQ3JCLGFBQXNCLEVBQ3RCLFNBQW9CLEVBQ3BCLGlCQUF5QixFQUFBO0FBQ3pCLElBQUEsSUFBSSxZQUFZLEVBQUU7QUFDZCxRQUFBLE1BQU0sQ0FBQyxHQUFHYSxXQUFBQSxDQUFBQSxLQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDaEMsUUFBQWQsV0FBVSxDQUFBLEtBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsYUFBYSxFQUFFO0FBQ2hCLFlBQUFhLFdBQUFBLENBQUFBLE9BQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLFNBQUE7QUFDRCxRQUFBLE9BQU8sQ0FBQyxDQUFDO0FBQ1osS0FBQTtBQUFNLFNBQUE7UUFDSCxPQUFPLFNBQVMsQ0FBQyxhQUFhLENBQUM7QUFDbEMsS0FBQTtBQUNMLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxLQUFZLEVBQUUsTUFBWSxFQUFBO0FBQ3ZDLElBQUEsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBUyxDQUFDO0FBQzdDLElBQUEsZUFBZSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbEMsSUFBQSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsT0FBTztBQUNILFFBQUEsS0FBSyxFQUFFLElBQUlqUSx5QkFBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QyxRQUFBLHdCQUF3QixFQUFFLENBQUM7S0FDOUIsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLHNCQUE4QixFQUFFLHdCQUFnQyxFQUFBO0lBQ3pGLE9BQU8sR0FBRyxHQUFHLEdBQUcsSUFBSSxzQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxTQUFlLEVBQzlCLGNBQWdDLEVBQUE7SUFDaEMsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sZ0JBQWdCLElBQ2xCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsUUFBQSxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsUUFBQSxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsSUFBQSxPQUFPLGdCQUFnQixDQUFDO0FBQzVCLENBQUM7QUFFRDs7O0FBR0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLE1BQW9CLEVBQzFDLFNBQWUsRUFDZixPQUFnQixFQUNoQixNQUFlLEVBQ2YsZ0JBQXNCLEVBQ3RCLGFBQW1CLEVBQ25CLFlBQXFCLEVBQ3JCLFdBQW9CLEVBQ3BCLFlBQXFCLEVBQUE7QUFFckIsSUFBQSxNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQ3BFLElBQUEsTUFBTSxzQkFBc0IsR0FBR21RLFdBQUFBLENBQUFBLG1CQUE4QixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRWhHLE1BQU0sY0FBYyxHQUFxQixDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRXJHLElBQUEsTUFBTSx3QkFBd0IsR0FBRyxNQUFNO0FBQ25DLFFBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0I7QUFDcEMsUUFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDO0lBQ3pDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxDQUFDO0FBRWpDLElBQUEsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztBQUMvQyxJQUFBLE1BQU0sYUFBYSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7QUFFN0YsSUFBQSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUV2RSxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFFeEIsSUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMzQyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7O0FBS3BDLFFBQUEsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUtyRyx1QkFBVyxDQUFDLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUM5RSxZQUFBLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLHdCQUF3QixDQUFDLENBQUM7WUFDdkQsU0FBUztBQUNaLFNBQUE7O1FBRUQsV0FBVyxHQUFHLEtBQUssQ0FBQztBQUVwQixRQUFBLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQVMsQ0FBQztBQUNqRW5CLFFBQUFBLFdBQUFBLENBQUFBLGFBQWtCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQzs7QUFHcEQsUUFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsRUFBRTtBQUN2QyxZQUFBLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLHdCQUF3QixDQUFDLENBQUM7WUFDdkQsU0FBUztBQUNaLFNBQUE7QUFFRCxRQUFBLE1BQU0sc0JBQXNCLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVDLFFBQUEsTUFBTSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLHNCQUFzQixDQUFDLENBQUM7QUFFL0csUUFBQSxNQUFNLFFBQVEsR0FBR3lILFdBQWlDLENBQUEsc0JBQUEsQ0FBQyxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDN0YsUUFBQSxNQUFNLG1CQUFtQixHQUFHLFlBQVksR0FBRyxRQUFRLEdBQUcsZ0JBQWdCLEdBQUcsUUFBUSxHQUFHLGdCQUFnQixDQUFDO0FBRXJHLFFBQUEsTUFBTSxlQUFlLEdBQUcsSUFBSXBRLHlCQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNyRSxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFFM0IsUUFBQSxNQUFNLGNBQWMsR0FBUSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxnQkFBZ0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQ3RKLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBRWxKLFFBQUEsV0FBVyxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUM7QUFFekMsUUFBQSxJQUFJLGNBQWMsQ0FBQyxhQUFhLElBQUksV0FBVztBQUMxQyxhQUFBLGNBQWMsQ0FBQyxhQUFhO0FBQzNCLGdCQUFBLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxJQUFJLGNBQWMsV0FBVyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQ3hILE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFO0FBQzNLLFlBQUEsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztBQUMxRCxTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsSUFBSSxNQUFNLEVBQUU7UUFDUixNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQzlFLEtBQUE7QUFBTSxTQUFBO1FBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUM5RSxLQUFBO0FBQ0wsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsU0FBaUIsRUFBRSxnQkFBa0MsRUFBRSxXQUFtQixFQUFFLFdBQW1CLEVBQUUsSUFBYSxFQUFFLFdBQWtCLEVBQUUsZUFBc0IsRUFBRSxNQUFXLEVBQUUsZUFBc0MsRUFBRSxnQkFBc0IsRUFBRSxlQUFvQixFQUFFLFlBQXFCLEVBQUE7SUFDaFQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO0FBQ2hFLElBQUEsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUM3QyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFFL0QsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFdkUsSUFBQSxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQ25KLGNBQWMsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNwRyxJQUFBLElBQUksQ0FBQyxnQkFBZ0I7QUFDakIsUUFBQSxPQUFPLElBQUksQ0FBQztBQUVoQixJQUFBLE1BQU0sZUFBZSxHQUFHLG1CQUFtQixDQUFDLFNBQVMsR0FBRyxlQUFlLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUNqSixjQUFjLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDcEcsSUFBQSxJQUFJLENBQUMsZUFBZTtBQUNoQixRQUFBLE9BQU8sSUFBSSxDQUFDO0lBRWhCLE9BQU8sRUFBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFTLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBQTtBQUM5RSxJQUFBLElBQUksV0FBVyxLQUFLOEosV0FBVyxDQUFBLFdBQUEsQ0FBQyxVQUFVLEVBQUU7Ozs7O0FBS3hDLFFBQUEsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxRQUFBLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQy9ELElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRTtBQUNaLFlBQUEsT0FBTyxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUMsQ0FBQztBQUM5QixTQUFBO0FBQ0osS0FBQTtJQUVELElBQUksV0FBVyxLQUFLQSxXQUFXLENBQUEsV0FBQSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxFQUFFOztBQUVoRyxRQUFBLE9BQU8sRUFBQyxhQUFhLEVBQUUsSUFBSSxFQUFDLENBQUM7QUFDaEMsS0FBQTtBQUVELElBQUEsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLHdCQUF3QixFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUE7QUFDaFAsSUFBQSxNQUFNLFNBQVMsR0FBRyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLElBQUEsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7QUFDbkQsSUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztBQUVuRCxJQUFBLElBQUksWUFBWSxDQUFDO0FBQ2pCLElBQUEsSUFBSSxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRTtRQUN0QixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDaEUsUUFBQSxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQzdDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQzs7O0FBSS9ELFFBQUEsTUFBTSxpQkFBaUIsR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN0TixJQUFJLENBQUMsaUJBQWlCLEVBQUU7QUFDcEIsWUFBQSxPQUFPLEVBQUMsYUFBYSxFQUFFLElBQUksRUFBQyxDQUFDO0FBQ2hDLFNBQUE7QUFDRCxRQUFBLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUMvRSxRQUFBLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUU3RSxRQUFBLElBQUksV0FBVyxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ3RCLFlBQUEsTUFBTSxpQkFBaUIsR0FBRyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDNUcsWUFBQSxJQUFJLGlCQUFpQixFQUFFO0FBQ25CLGdCQUFBLE9BQU8saUJBQWlCLENBQUM7QUFDNUIsYUFBQTtBQUNKLFNBQUE7QUFFRCxRQUFBLFlBQVksR0FBRyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pDLFFBQUEsS0FBSyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsZUFBZSxHQUFHLENBQUMsRUFBRSxVQUFVLEdBQUcsYUFBYSxHQUFHLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRTs7O0FBRzVGLFlBQUEsWUFBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFDbkssY0FBYyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDeEcsU0FBQTtBQUNELFFBQUEsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxLQUFBO0FBQU0sU0FBQTs7O0FBR0gsUUFBQSxJQUFJLFdBQVcsSUFBSSxDQUFDLElBQUksRUFBRTtZQUN0QixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUNwRCxZQUFBLE1BQU0sZUFBZSxJQUFJLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQzs7QUFFckUsWUFBQSxNQUFNLGNBQWMsR0FBRyxJQUFJOUoseUJBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUMvRyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDOzs7O0FBSTNELFlBQUEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLEdBQUcsQ0FBQztBQUNuRCxnQkFBQSxlQUFlLENBQUMsS0FBSztnQkFDckIsMkJBQTJCLENBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRWxGLFlBQUEsTUFBTSxpQkFBaUIsR0FBRyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDM0YsWUFBQSxJQUFJLGlCQUFpQixFQUFFO0FBQ25CLGdCQUFBLE9BQU8saUJBQWlCLENBQUM7QUFDNUIsYUFBQTtBQUNKLFNBQUE7O1FBRUQsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUNqTCxNQUFNLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3hJLFFBQUEsSUFBSSxDQUFDLFdBQVc7QUFDWixZQUFBLE9BQU8sRUFBQyxhQUFhLEVBQUUsSUFBSSxFQUFDLENBQUM7QUFFakMsUUFBQSxZQUFZLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNoQyxLQUFBO0FBRUQsSUFBQSxLQUFLLE1BQU0sS0FBSyxJQUFJLFlBQVksRUFBRTtRQUM5QnFRLFdBQW9CLENBQUEsb0JBQUEsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1RSxLQUFBO0FBQ0QsSUFBQSxPQUFPLEVBQUUsQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLDJCQUEyQixDQUFDLGlCQUF3QixFQUFFLGdCQUF1QixFQUFFLHNCQUE2QixFQUFFLGFBQXFCLEVBQUUsZ0JBQXNCLEVBQUE7Ozs7O0lBS2hLLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3BJLE1BQU0sb0JBQW9CLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFN0UsSUFBQSxPQUFPLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5RyxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxPQUFlLEVBQ3hDLFdBQW1CLEVBQ25CLFdBQW1CLEVBQ25CLElBQWEsRUFDYixXQUFrQixFQUNsQixlQUFzQixFQUN0QixhQUFxQixFQUNyQixjQUFzQixFQUN0QixZQUFvQixFQUNwQixlQUFzQyxFQUN0QyxnQkFBc0IsRUFDdEIsZUFFQyxFQUNELFlBQXFCLEVBQUE7QUFFckIsSUFBQSxNQUFNLGVBQWUsR0FBRyxJQUFJO0FBQ3hCLFFBQUEsT0FBTyxHQUFHLFdBQVc7UUFDckIsT0FBTyxHQUFHLFdBQVcsQ0FBQztBQUUxQixJQUFBLElBQUksR0FBRyxHQUFHLGVBQWUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRXZDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztBQUNkLElBQUEsSUFBSSxJQUFJLEVBQUU7OztRQUdOLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNWLFFBQUEsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDbkIsS0FBQTtJQUVELElBQUksR0FBRyxHQUFHLENBQUM7QUFBRSxRQUFBLEtBQUssSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBRTlCLElBQUEsSUFBSSxZQUFZLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDdEIsUUFBQSxjQUFjLEdBQUcsYUFBYTtBQUM5QixRQUFBLGNBQWMsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBRXZDLElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQztJQUMxQixJQUFJLElBQUksR0FBRyxXQUFXLENBQUM7SUFDdkIsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLElBQUksc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDN0MsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBRXhCLElBQUEsT0FBTyxjQUFjLEdBQUcsc0JBQXNCLElBQUksVUFBVSxFQUFFO1FBQzFELFlBQVksSUFBSSxHQUFHLENBQUM7O0FBR3BCLFFBQUEsSUFBSSxZQUFZLEdBQUcsY0FBYyxJQUFJLFlBQVksSUFBSSxZQUFZO0FBQzdELFlBQUEsT0FBTyxJQUFJLENBQUM7UUFFaEIsSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUNmLFFBQUEsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUUzQixRQUFBLE9BQU8sR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEMsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO0FBQ3ZCLFlBQUEsTUFBTSxhQUFhLEdBQUcsSUFBSXJRLHlCQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDeEcsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVELFlBQUEsSUFBSSxVQUFVLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QyxPQUFPLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7QUFDOUQsYUFBQTtBQUFNLGlCQUFBOzs7QUFHSCxnQkFBQSxNQUFNLHVCQUF1QixHQUFHLFlBQVksR0FBRyxHQUFHLENBQUM7QUFDbkQsZ0JBQUEsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLEtBQUssQ0FBQztBQUMxQyxvQkFBQSxlQUFlO0FBQ2Ysb0JBQUEsSUFBSUEsV0FBSyxDQUFBLGFBQUEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7O0FBRTVHLGdCQUFBLE9BQU8sR0FBRywyQkFBMkIsQ0FBQyxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLFVBQVUsR0FBRyxjQUFjLEdBQUcsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDcEksYUFBQTtBQUNKLFNBQUE7UUFFRCxjQUFjLElBQUksc0JBQXNCLENBQUM7QUFDekMsUUFBQSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9DLEtBQUE7O0lBR0QsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFVBQVUsR0FBRyxjQUFjLElBQUksc0JBQXNCLENBQUM7SUFDckYsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QyxJQUFBLE1BQU0sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O0FBRy9ELElBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sWUFBWSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVoRixJQUFBLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFckIsT0FBTztBQUNILFFBQUEsS0FBSyxFQUFFLENBQUM7QUFDUixRQUFBLEtBQUssRUFBRSxZQUFZLEdBQUcsWUFBWSxHQUFHLEdBQUc7QUFDeEMsUUFBQSxJQUFJLEVBQUUsWUFBWTtLQUNyQixDQUFDO0FBQ04sQ0FBQztBQUVELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXJKO0FBQ0E7QUFDQSxTQUFTLFVBQVUsQ0FBQyxHQUFXLEVBQUUsd0JBQWtELEVBQUE7SUFDL0UsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxQixRQUFBLE1BQU0sTUFBTSxHQUFHLHdCQUF3QixDQUFDLE1BQU0sQ0FBQztBQUMvQyxRQUFBLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7OztRQUc1Qyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzRSxLQUFBO0FBQ0wsQ0FBQztBQUVEO0FBQ0E7QUFDQSxTQUFTLGVBQWUsQ0FBQyxHQUFTLEVBQUUsQ0FBTyxFQUFFLENBQU8sRUFBQTtBQUNoRCxJQUFBLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLElBQUEsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFBOztBQ2hiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFTNUI7Ozs7Ozs7Ozs7O0FBV0c7QUFDSCxNQUFNLGNBQWMsQ0FBQTtJQVVoQixXQUNJLENBQUEsU0FBb0IsRUFDcEIsSUFBTyxHQUFBLElBQUksU0FBUyxDQUFhLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLGVBQWUsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxlQUFlLEVBQUUsRUFBRSxDQUFDLEVBQ25ILFdBQUEsR0FBYyxJQUFJLFNBQVMsQ0FBYSxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxlQUFlLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsZUFBZSxFQUFFLEVBQUUsQ0FBQyxFQUFBO0FBRTFILFFBQUEsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFFM0IsUUFBQSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqQixRQUFBLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0FBQy9CLFFBQUEsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQUM7UUFFakYsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDO1FBQzdELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQztRQUMvRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsZUFBZSxDQUFDO1FBQy9ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUM7QUFDcEUsS0FBQTtJQUVELGlCQUFpQixDQUNiLFlBQWdDLEVBQ2hDLFdBQXdCLEVBQ3hCLGNBQXNCLEVBQ3RCLFNBQWUsRUFDZix1QkFBc0QsRUFBQTtBQUt0RCxRQUFBLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDM0gsUUFBQSxNQUFNLGNBQWMsR0FBRyxjQUFjLEdBQUcsY0FBYyxDQUFDLGdCQUFnQixDQUFDO0FBQ3hFLFFBQUEsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLEVBQUUsR0FBRyxjQUFjLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdEUsUUFBQSxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsRUFBRSxHQUFHLGNBQWMsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN0RSxRQUFBLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxFQUFFLEdBQUcsY0FBYyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLFFBQUEsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLEVBQUUsR0FBRyxjQUFjLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFdEUsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7YUFDckMsV0FBVyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixDQUFDLENBQUMsRUFBRTtZQUMzRyxPQUFPO0FBQ0gsZ0JBQUEsR0FBRyxFQUFFLEVBQUU7QUFDUCxnQkFBQSxTQUFTLEVBQUUsS0FBSzthQUNuQixDQUFDO0FBQ0wsU0FBQTtRQUVELE9BQU87WUFDSCxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDekIsWUFBQSxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7U0FDbEQsQ0FBQztBQUNMLEtBQUE7SUFFRCxxQkFBcUIsQ0FDakIsV0FBd0IsRUFDeEIsTUFBVyxFQUNYLGVBQXNDLEVBQ3RDLGdCQUFrQyxFQUNsQyxRQUFnQixFQUNoQixTQUFlLEVBQ2YsZ0JBQXNCLEVBQ3RCLG1CQUF5QixFQUN6QixvQkFBNkIsRUFDN0IsWUFBcUIsRUFDckIsdUJBQXFELEVBQ3JELG1CQUEyQixFQUMzQixnQkFBd0IsRUFBQTtRQU14QixNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUVsQyxRQUFBLE1BQU0sbUJBQW1CLEdBQUcsSUFBSUEseUJBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RSxNQUFNLGlCQUFpQixHQUFHc1EsT0FBa0IsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM3RSxRQUFBLE1BQU0sZ0JBQWdCLEdBQUdDLG1CQUE4QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUMzSSxRQUFBLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxHQUFHLFFBQVEsR0FBRyxnQkFBZ0IsR0FBRyxRQUFRLEdBQUcsZ0JBQWdCLENBQUM7QUFDcEcsUUFBQSxNQUFNLG1CQUFtQixHQUFHLGtCQUFrQixHQUFHQyxrQkFBTSxDQUFDO0FBRXhELFFBQUEsTUFBTSxxQkFBcUIsR0FBR0YsT0FBa0IsQ0FBQyxtQkFBbUIsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUU5RixNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDM0IsUUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLG1CQUFtQixDQUFDO0FBQzdELFFBQUEsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQztBQUU3RCxRQUFBLE1BQU0saUJBQWlCLEdBQUdHLHNCQUFpQyxDQUN2RCxtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxXQUFXO0FBQ1gsaUJBQVMsS0FBSyxFQUNkLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsTUFBTSxFQUNOLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLEtBQUssQ0FBQyxDQUFDO1FBRVgsSUFBSSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBRTdCLFFBQUEsSUFBSSxpQkFBaUIsRUFBRTtZQUNuQixNQUFNLE1BQU0sR0FBRyxtQkFBbUIsR0FBRyxHQUFHLEdBQUcsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7WUFDL0UsTUFBTSxjQUFjLEdBQUcsSUFBSXpRLFdBQUssQ0FBQSxhQUFBLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNyRSxZQUFBLE1BQU0sY0FBYyxHQUFHLElBQUlBLHlCQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ3RGLFlBQUEsTUFBTSxZQUFZLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDOztBQUc1QyxZQUFBLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQztBQUN0QyxZQUFBLE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQztZQUVwQyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDdkIsWUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM3QyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQyxhQUFBO0FBQ0QsWUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLGFBQUE7QUFDRCxZQUFBRSxXQUFBQSxDQUFBQSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQzs7QUFHbEMsWUFBQSxNQUFNLFVBQVUsR0FBRyxNQUFNLEdBQUcsR0FBRyxDQUFDOztBQUdoQyxZQUFBLElBQUksbUJBQW1CLEVBQUU7QUFDckIsZ0JBQUEsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUlvUSxPQUFrQixDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7OztBQUkzRixnQkFBQSxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLENBQUMsRUFBRTtvQkFDcEUsYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUN0QixpQkFBQTtBQUFNLHFCQUFBO0FBQ0gsb0JBQUEsYUFBYSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyRCxpQkFBQTtBQUNKLGFBQUE7WUFFRCxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFFbEIsWUFBQSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzs7Z0JBRzFCLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDMUMsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBRTFDLGdCQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNDLG9CQUFBLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxvQkFBQSxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsb0JBQUEsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELG9CQUFBLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RCxpQkFBQTtBQUVELGdCQUFBLElBQUksUUFBUSxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUM7QUFDaEUsb0JBQUEsUUFBUSxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsRUFBRTs7QUFFbEUsb0JBQUEsUUFBUSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDOUIsaUJBQUE7QUFBTSxxQkFBQSxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO0FBQ3JFLG9CQUFBLFFBQVEsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLEVBQUU7O29CQUVoRSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ2pCLGlCQUFBO0FBQU0scUJBQUE7b0JBQ0gsUUFBUSxHQUFHSSxvQkFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hILGlCQUFBO0FBQ0osYUFBQTtBQUVELFlBQUEsS0FBSyxNQUFNLEdBQUcsSUFBSSxRQUFRLEVBQUU7O0FBRXhCLGdCQUFBeFEsV0FBQUEsQ0FBQUEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZCLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFFdkMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBRW5CLGdCQUFBLElBQUksWUFBWSxDQUFDLE1BQU0sSUFBSSxHQUFHLEdBQUcsTUFBTSxFQUFFO29CQUNyQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLGlCQUFBO0FBQU0scUJBQUE7QUFDSCxvQkFBQSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RSxpQkFBQTtnQkFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pDLG9CQUFBLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzFDLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRzVDLG9CQUFBLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO0FBQ25ELG9CQUFBLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO29CQUVuRCxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFekQsb0JBQUEsTUFBTSxFQUFFLEdBQUcsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUM1QixvQkFBQSxNQUFNLEVBQUUsR0FBRyxPQUFPLEdBQUcsTUFBTSxDQUFDO0FBQzVCLG9CQUFBLE1BQU0sRUFBRSxHQUFHLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDNUIsb0JBQUEsTUFBTSxFQUFFLEdBQUcsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUU1QixvQkFBQSxpQkFBaUIsR0FBRyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLG9CQUFBLE1BQU0sR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFFckQsSUFBSSxXQUFXLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSx1QkFBdUIsQ0FBQyxFQUFFOzs7d0JBR3JILGlCQUFpQixHQUFHLElBQUksQ0FBQzt3QkFDekIsSUFBSSxDQUFDLG9CQUFvQixFQUFFOzRCQUN2QixPQUFPO0FBQ0gsZ0NBQUEsT0FBTyxFQUFFLEVBQUU7QUFDWCxnQ0FBQSxTQUFTLEVBQUUsS0FBSztnQ0FDaEIsaUJBQWlCOzZCQUNwQixDQUFDO0FBQ0wseUJBQUE7QUFDSixxQkFBQTtBQUNKLGlCQUFBO0FBQ0osYUFBQTtBQUNKLFNBQUE7UUFFRCxPQUFPO0FBQ0gsWUFBQSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLElBQUksaUJBQWlCLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxHQUFHLHNCQUFzQjtBQUNoRyxZQUFBLFNBQVMsRUFBRSxpQkFBaUI7WUFDNUIsaUJBQWlCO1NBQ3BCLENBQUM7QUFDTCxLQUFBO0FBRUQ7Ozs7OztBQU1HO0FBQ0gsSUFBQSxvQkFBb0IsQ0FBQyxxQkFBbUMsRUFBQTtRQUNwRCxJQUFJLHFCQUFxQixDQUFDLE1BQU0sS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUM3RyxZQUFBLE9BQU8sRUFBRSxDQUFDO0FBQ2IsU0FBQTtRQUVELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLElBQUksR0FBRyxRQUFRLENBQUM7UUFDcEIsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO0FBQ3BCLFFBQUEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUM7QUFDckIsUUFBQSxJQUFJLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQztBQUNyQixRQUFBLEtBQUssTUFBTSxLQUFLLElBQUkscUJBQXFCLEVBQUU7QUFDdkMsWUFBQSxNQUFNLFNBQVMsR0FBRyxJQUFJRixXQUFLLENBQUEsYUFBQSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUM7WUFDbEYsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxZQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekIsU0FBQTtBQUVELFFBQUEsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBQ25ELGFBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFNUQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUVsQixRQUFBLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFO0FBQzVCLFlBQUEsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQzs7WUFFL0IsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEtBQUssU0FBUyxFQUFFO0FBQ3pELGdCQUFBLFlBQVksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEQsYUFBQTtZQUNELElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDcEUsU0FBUztBQUNaLGFBQUE7Ozs7OztBQU9ELFlBQUEsTUFBTSxJQUFJLEdBQUc7Z0JBQ1QsSUFBSUEsV0FBQUEsQ0FBQUEsYUFBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDakMsSUFBSUEsV0FBQUEsQ0FBQUEsYUFBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDakMsSUFBSUEsV0FBQUEsQ0FBQUEsYUFBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDakMsSUFBSUEsV0FBQUEsQ0FBQUEsYUFBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQzthQUNwQyxDQUFDO0FBQ0YsWUFBQSxJQUFJLENBQUMyUSxXQUEwQyxDQUFBLHdCQUFBLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUMxRCxTQUFTO0FBQ1osYUFBQTtBQUVELFlBQUEsWUFBWSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDMUUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEtBQUssU0FBUyxFQUFFO0FBQ25ELGdCQUFBLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDNUMsYUFBQTtBQUNELFlBQUEsTUFBTSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDckUsU0FBQTtBQUVELFFBQUEsT0FBTyxNQUFNLENBQUM7QUFDakIsS0FBQTtBQUVELElBQUEsa0JBQWtCLENBQUMsWUFBMkIsRUFBRSxXQUF3QixFQUFFLGVBQXdCLEVBQUUsZ0JBQXdCLEVBQUUsWUFBb0IsRUFBRSxnQkFBd0IsRUFBQTtBQUN4SyxRQUFBLE1BQU0sSUFBSSxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFNUQsTUFBTSxHQUFHLEdBQUcsRUFBQyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEYsS0FBQTtBQUVELElBQUEsc0JBQXNCLENBQUMsZ0JBQStCLEVBQUUsV0FBd0IsRUFBRSxlQUF3QixFQUFFLGdCQUF3QixFQUFFLFlBQW9CLEVBQUUsZ0JBQXdCLEVBQUE7QUFDaEwsUUFBQSxNQUFNLElBQUksR0FBRyxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRTVELE1BQU0sR0FBRyxHQUFHLEVBQUMsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBQyxDQUFDO0FBQzVFLFFBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRyxTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsNkJBQTZCLENBQUMsU0FBZSxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUE7UUFDL0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQVMsQ0FBQztBQUMvQkMsUUFBQUEsZUFBMEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzVDLFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSTVRLFdBQUFBLENBQUFBLGFBQUssQ0FDZixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksZUFBZSxFQUNsRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxlQUFlLENBQ3ZFLENBQUM7UUFDRixPQUFPO0FBQ0gsWUFBQSxLQUFLLEVBQUUsQ0FBQzs7OztBQUlSLFlBQUEsZ0JBQWdCLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvRSxDQUFDO0FBQ0wsS0FBQTtBQUVELElBQUEsV0FBVyxDQUFDLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBQTtBQUN0RCxRQUFBLE9BQU8sRUFBRSxHQUFHLGVBQWUsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsR0FBRyxlQUFlLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztBQUMzSCxLQUFBO0FBRUQsSUFBQSxZQUFZLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFBO0FBQ3ZELFFBQUEsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0FBQzVGLEtBQUE7QUFFRDs7OztBQUlFO0FBQ0YsSUFBQSxpQkFBaUIsR0FBQTtBQUNiLFFBQUEsTUFBTSxDQUFDLEdBQUdrSyxXQUFBQSxDQUFBQSxRQUFhLENBQUMsRUFBUyxDQUFDLENBQUM7QUFDbkMsUUFBQWlGLHFCQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEUsUUFBQSxPQUFPLENBQUMsQ0FBQztBQUNaLEtBQUE7QUFDSixDQUFBOztBQ2xZRDs7Ozs7Ozs7Ozs7QUFXRztBQUNXLFNBQUEsaUJBQUEsRUFDVixJQUdDLEVBQ0QsVUFBa0IsRUFDbEIsQ0FBUyxFQUFBO0lBRVQsT0FBTyxVQUFVLElBQUkxTyxXQUFBQSxDQUFBQSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUYsQ0FBQTs7QUNBQSxNQUFNLFlBQVksQ0FBQTtBQUdkLElBQUEsV0FBQSxDQUFZLFNBQXVCLEVBQUUsU0FBaUIsRUFBRSxNQUFlLEVBQUUsUUFBeUIsRUFBQTtBQUM5RixRQUFBLElBQUksU0FBUyxFQUFFO0FBQ1gsWUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxTQUFTLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUcsU0FBQTtBQUFNLGFBQUE7QUFDSCxZQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxRQUFRLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0MsU0FBQTtBQUNELFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDeEIsS0FBQTtBQUNELElBQUEsUUFBUSxHQUFBO1FBQ0osT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDN0MsS0FBQTtBQUNKLENBQUE7QUFFRCxNQUFNLGlCQUFpQixDQUFBO0lBR25CLFdBQVksQ0FBQSxTQUE0QixFQUFFLFNBQWlCLEVBQUUsVUFBbUIsRUFBRSxVQUFtQixFQUFFLFFBQXlCLEVBQUE7UUFDNUgsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFlBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNqRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksWUFBWSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3BHLEtBQUE7QUFDRCxJQUFBLFFBQVEsR0FBQTtBQUNKLFFBQUEsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDdkQsS0FBQTtBQUNKLENBQUE7QUFFRCxNQUFNLGNBQWMsQ0FBQTtBQVFoQixJQUFBLFdBQUEsQ0FBWSxJQUFhLEVBQUUsSUFBYSxFQUFFLFFBQWlCLEVBQUE7QUFDdkQsUUFBQSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqQixRQUFBLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDNUIsS0FBQTtBQUNKLENBQUE7QUFFRCxNQUFNLG9CQUFvQixDQUFBO0FBTXRCLElBQUEsV0FBQSxHQUFBO0FBQ0ksUUFBQSxJQUFJLENBQUMsYUFBYSxHQUFHeU8sV0FBQUEsQ0FBQUEsTUFBVyxFQUFFLENBQUM7QUFDbkMsUUFBQSxJQUFJLENBQUMsY0FBYyxHQUFHQSxXQUFBQSxDQUFBQSxNQUFXLEVBQUUsQ0FBQztBQUNwQyxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ3JCLEtBQUE7QUFDSixDQUFBO0FBRVksTUFBQSxpQkFBaUIsQ0FBQTtJQU8xQixXQUFZLENBQUEsZ0JBQXdCLEVBQ2hDLFlBQTBCLEVBQzFCLGdCQUF3QixFQUN4QixXQUFtQixFQUNuQixNQUF3QixFQUFBO0FBQ3hCLFFBQUEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBQ3pDLFFBQUEsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7QUFDakMsUUFBQSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7QUFDekMsUUFBQSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztBQUMvQixRQUFBLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3hCLEtBQUE7QUFDSixDQUFBO0FBT0QsTUFBTSxlQUFlLENBQUE7QUFLakIsSUFBQSxXQUFBLENBQVkscUJBQThCLEVBQUE7QUFDdEMsUUFBQSxJQUFJLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUM7QUFDbkQsUUFBQSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUNwQixRQUFBLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEtBQUE7QUFFRCxJQUFBLEdBQUcsQ0FBQyxRQUFnQixFQUFBOzs7O0FBSWhCLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtBQUM3QixZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQ2pDLGdCQUFBLE1BQU0sV0FBVyxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUN0QyxnQkFBQSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHO0FBQzdCLG9CQUFBLEVBQUUsRUFBRSxXQUFXO0FBQ2Ysb0JBQUEsU0FBUyxFQUFFLENBQUMsR0FBRyxLQUFJO0FBQ2Ysd0JBQUEsT0FBTyxHQUFHLENBQUMsZ0JBQWdCLEtBQUssV0FBVyxDQUFDO0FBQy9DLHFCQUFBO2lCQUNKLENBQUM7QUFDTCxhQUFBO0FBQ0QsWUFBQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDekMsU0FBQTtBQUFNLGFBQUE7WUFDSCxPQUFPLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUM7QUFDbkMsU0FBQTtBQUNKLEtBQUE7QUFDSixDQUFBO0FBRUQsU0FBUyw0QkFBNEIsQ0FDakMsTUFBa0IsRUFDbEIsS0FBYSxFQUNiLE1BQWMsRUFDZCxVQUE0QixFQUM1QixZQUFvQixFQUFBO0lBRXBCLE1BQU0sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFDLEdBQUcyQixXQUFrQixDQUFBLGtCQUFBLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEUsTUFBTSxNQUFNLEdBQUcsRUFBRSxlQUFlLEdBQUcsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFHLEVBQUUsYUFBYSxHQUFHLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUMvQyxNQUFNLE1BQU0sR0FBR0MsV0FBc0IsQ0FBQSxzQkFBQSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMxRCxPQUFPLElBQUk5USx5QkFBSyxDQUNaLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxFQUNqQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FDcEMsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLHlCQUF5QixDQUFDLFlBQWdDLEVBQy9ELE1BQWMsRUFBRSxNQUFjLEVBQzlCLGFBQXNCLEVBQUUsWUFBcUIsRUFDN0MsS0FBYSxFQUFBO0FBQ2IsSUFBQSxNQUFNLEVBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUMsR0FBRyxZQUFZLENBQUM7SUFDbEUsTUFBTSxhQUFhLEdBQUcsSUFBSUEsV0FBQUEsQ0FBQUEsYUFBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNoRCxJQUFBLElBQUksYUFBYSxFQUFFO0FBQ2YsUUFBQSxhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4RCxLQUFBO0lBQ0QsT0FBTztBQUNILFFBQUEsRUFBRSxFQUFFLEVBQUUsR0FBRyxhQUFhLENBQUMsQ0FBQztBQUN4QixRQUFBLEVBQUUsRUFBRSxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUM7QUFDeEIsUUFBQSxFQUFFLEVBQUUsRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDO0FBQ3hCLFFBQUEsRUFBRSxFQUFFLEVBQUUsR0FBRyxhQUFhLENBQUMsQ0FBQzs7UUFFeEIsWUFBWTtRQUNaLFlBQVk7S0FDZixDQUFDO0FBQ04sQ0FBQztBQXFDWSxNQUFBLFNBQVMsQ0FBQTtBQThCbEIsSUFBQSxXQUFBLENBQVksU0FBb0IsRUFBRSxZQUFvQixFQUFFLHFCQUE4QixFQUFFLGFBQXlCLEVBQUE7QUFDN0csUUFBQSxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN6RCxRQUFBLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3JCLFFBQUEsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDcEIsUUFBQSxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUMxQixRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25CLFFBQUEsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDcEIsUUFBQSxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztBQUNqQyxRQUFBLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ2xFLFFBQUEsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQUVoQyxRQUFBLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQ25DLFFBQUEsSUFBSSxhQUFhLEVBQUU7QUFDZixZQUFBLGFBQWEsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0FBQzNDLFNBQUE7QUFFRCxRQUFBLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFDaEMsS0FBQTtBQUVELElBQUEsY0FBYyxDQUFDLE9BQTBCLEVBQUUsVUFBc0IsRUFBRSxJQUFVLEVBQUUsZUFBd0IsRUFBQTtRQUNuRyxNQUFNLFlBQVksR0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBa0IsQ0FBQztBQUNsRSxRQUFBLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0FBQ25ELFFBQUEsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLGtCQUFrQixJQUFJLFVBQVUsQ0FBQyxFQUFFLEtBQUssWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbEYsT0FBTztBQUVYLFFBQUEsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFFakQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN6RSxRQUFBLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUdTLGtCQUFNLENBQUM7QUFFOUMsUUFBQSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUUvRSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLEtBQUssS0FBSyxDQUFDO1FBQ2xFLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsS0FBSyxLQUFLLENBQUM7QUFDdEUsUUFBQSxNQUFNLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFdEUsUUFBQSxNQUFNLG9CQUFvQixHQUFHc1EsbUJBQThCLENBQUMsU0FBUyxFQUNqRSxZQUFZLEVBQ1osYUFBYSxFQUNiLElBQUksQ0FBQyxTQUFTLEVBQ2QsYUFBYSxDQUFDLENBQUM7UUFFbkIsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFFL0IsUUFBQSxJQUFJLFlBQVksRUFBRTtBQUNkLFlBQUEsTUFBTSxRQUFRLEdBQUdDLGdCQUEyQixDQUN4QyxTQUFTLEVBQ1QsWUFBWSxFQUNaLGFBQWEsRUFDYixJQUFJLENBQUMsU0FBUyxFQUNkLGFBQWEsQ0FBQyxDQUFDO0FBRW5CLFlBQUEsbUJBQW1CLEdBQUczQixXQUFhLENBQUEsUUFBQSxDQUFDLEVBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzdGLFNBQUE7OztBQUlELFFBQUEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksaUJBQWlCLENBQ3pFLFlBQVksQ0FBQyxnQkFBZ0IsRUFDN0Isa0JBQWtCLEVBQ2xCLFlBQVksQ0FBQyxnQkFBZ0IsRUFDN0IsWUFBWSxDQUFDLEtBQUssRUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FDZCxDQUFDO0FBRUYsUUFBQSxNQUFNLFVBQVUsR0FBRztBQUNmLFlBQUEsTUFBTSxFQUFFLFlBQVk7WUFDcEIsTUFBTTtZQUNOLFNBQVM7WUFDVCxvQkFBb0I7WUFDcEIsbUJBQW1CO1lBQ25CLEtBQUs7WUFDTCxjQUFjO0FBQ2QsWUFBQSxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNyQyxpQkFBaUI7QUFDakIsWUFBQSwwQkFBMEIsRUFBRWMsV0FBOEIsQ0FBQSxtQkFBQSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDMUcsY0FBYyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7U0FDbEUsQ0FBQztBQUVGLFFBQUEsSUFBSSxlQUFlLEVBQUU7QUFDakIsWUFBQSxLQUFLLE1BQU0sS0FBSyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7Z0JBQzVDLE1BQU0sRUFBQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUMsR0FBRyxLQUFLLENBQUM7QUFDaEUsZ0JBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO0FBQy9FLGFBQUE7QUFDSixTQUFBO0FBQU0sYUFBQTtZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDVCxnQkFBQSxtQkFBbUIsRUFBRSxDQUFDO0FBQ3RCLGdCQUFBLGlCQUFpQixFQUFFLFlBQVksQ0FBQyxlQUFlLENBQUMsTUFBTTtnQkFDdEQsVUFBVTtBQUNiLGFBQUEsQ0FBQyxDQUFDO0FBQ04sU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLHNCQUFzQixDQUNsQixNQUFrQixFQUNsQixPQUEyQixFQUMzQixLQUFhLEVBQ2IsTUFBYyxFQUNkLFlBQW9CLEVBQ3BCLGFBQXNCLEVBQ3RCLFlBQXFCLEVBQ3JCLGNBQXNCLEVBQ3RCLFNBQWUsRUFDZixjQUE4QixFQUM5QixlQUE0QixFQUM1QixjQUE4QixFQUM5QixNQUFvQixFQUNwQixXQUFtQixFQUNuQixPQUFtQyxFQUFBO1FBU25DLE1BQU0sVUFBVSxHQUFHLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsV0FBVyxDQUFxQixDQUFDO0FBQ2hHLFFBQUEsTUFBTSxLQUFLLEdBQUcsNEJBQTRCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBRTVGLFFBQUEsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUMxRCx5QkFBeUIsQ0FDckIsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFDekIsYUFBYSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUN0RCxlQUFlLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7QUFFMUUsUUFBQSxJQUFJLE9BQU8sRUFBRTtBQUNULFlBQUEsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FDekQseUJBQXlCLENBQ3JCLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQ3pCLGFBQWEsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFDdEQsZUFBZSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzFFLFlBQUEsSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE9BQU87QUFDaEQsU0FBQTtBQUVELFFBQUEsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNqQyxZQUFBLElBQUksVUFBVSxDQUFDOzs7WUFHZixJQUFJLElBQUksQ0FBQyxhQUFhO2dCQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxFQUFFO0FBQ2hFLGdCQUFBLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3RGLGFBQUE7QUFDRCxZQUFBalEsV0FBQUEsQ0FBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekMsWUFBQSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsR0FBRztnQkFDL0MsVUFBVTtnQkFDVixLQUFLO2dCQUNMLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixZQUFZO2dCQUNaLFVBQVU7YUFDYixDQUFDO1lBQ0YsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRXhFLElBQUksTUFBTSxDQUFDLHNCQUFzQixFQUFFO2dCQUMvQixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDckUsYUFBQTtBQUVELFlBQUEsT0FBTyxFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBQyxDQUFDO0FBQ3BDLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxvQkFBb0IsQ0FBQyxVQUFzQixFQUFFLGdCQUU1QyxFQUFFLGtCQUEyQixFQUFBO1FBRTFCLE1BQU0sRUFDRixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLGNBQWMsRUFDZCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLDBCQUEwQixFQUMxQixjQUFjLEVBQ2pCLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUUxQixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakQsTUFBTSxlQUFlLEdBQUcrUSxXQUFBQSxDQUFBQSxjQUFjLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQ3JGLFFBQUEsTUFBTSxpQkFBaUIsR0FBRyxlQUFlLEtBQUssUUFBUSxDQUFDO1FBQ3ZELE1BQU0sZUFBZSxHQUFHQSxXQUFBQSxDQUFBQSxjQUFjLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQ3JGLFFBQUEsTUFBTSxpQkFBaUIsR0FBRyxlQUFlLEtBQUssUUFBUSxDQUFDO1FBQ3ZELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsS0FBSyxLQUFLLENBQUM7UUFDdEUsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEtBQUssQ0FBQztRQUNsRSxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxLQUFLLE1BQU0sQ0FBQztRQUM5RCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQWdCeEUsUUFBQSxNQUFNLGNBQWMsR0FBRyxpQkFBaUIsS0FBSyxpQkFBaUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxZQUFZLENBQUMsQ0FBQztBQUN6RyxRQUFBLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixLQUFLLGlCQUFpQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDO0FBRXpHLFFBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLElBQUksaUJBQWlCLEVBQUU7QUFDOUMsWUFBQSxNQUFNLENBQUMseUJBQXlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUN2RCxTQUFBO0FBRUQsUUFBQSxNQUFNLFdBQVcsR0FBRyxDQUFDLGNBQThCLEVBQUUsZUFBZ0MsS0FBSTtBQUNyRixZQUFBLElBQUksZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztnQkFBRSxPQUFPO0FBQ3pELFlBQUEsSUFBSSxjQUFjLEVBQUU7OztBQUdoQixnQkFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN0RixPQUFPO0FBQ1YsYUFBQTtZQUVELElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztZQUVqQixJQUFJLE1BQU0sR0FBRyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDO1lBQzFDLElBQUksa0JBQWtCLEdBQUcsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQztZQUV0RCxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLGtCQUFrQixHQUFHLElBQUksQ0FBQztZQUM5QixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFDekIsSUFBSSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7WUFDakMsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFFekIsSUFBSSxlQUFlLENBQUMsZ0JBQWdCLEVBQUU7QUFDbEMsZ0JBQUEsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUFDO0FBQ3ZELGFBQUE7aUJBQU0sSUFBSSxjQUFjLENBQUMsMEJBQTBCLEVBQUU7QUFDbEQsZ0JBQUEsZ0JBQWdCLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQztBQUNsRCxhQUFBO1lBQ0QsSUFBSSxlQUFlLENBQUMsd0JBQXdCLEVBQUU7QUFDMUMsZ0JBQUEsd0JBQXdCLEdBQUcsZUFBZSxDQUFDLHdCQUF3QixDQUFDO0FBQ3ZFLGFBQUE7QUFFRCxZQUFBLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUM7QUFDeEMsWUFBQSxJQUFJLE9BQU8sRUFBRTtBQUVULGdCQUFBLE1BQU0sb0NBQW9DLEdBQUcsQ0FBQyxRQUFRLEtBQUk7QUFDdEQsb0JBQUEsSUFBSSxtQkFBbUIsR0FBR25ILFdBQVcsQ0FBQSxXQUFBLENBQUMsVUFBVSxDQUFDO29CQUNqRCxJQUFJLE1BQU0sQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO0FBQ2xFLHdCQUFBLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDaEcsd0JBQUEsSUFBSSxxQkFBcUIsRUFBRTs0QkFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsR0FBRyxxQkFBcUIsQ0FBQzs0QkFDNUUsbUJBQW1CLEdBQUcscUJBQXFCLENBQUM7NEJBQzVDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDekUseUJBQUE7QUFDSixxQkFBQTtBQUNELG9CQUFBLE9BQU8sbUJBQW1CLENBQUM7QUFDL0IsaUJBQUMsQ0FBQztBQUVGLGdCQUFBLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLEtBQUk7QUFDdEUsb0JBQUEsSUFBSSxNQUFNLENBQUMsc0JBQXNCLElBQUksY0FBYyxDQUFDLHdCQUF3QixHQUFHLENBQUMsSUFBSSxlQUFlLENBQUMsZUFBZSxFQUFFO0FBQ2pILHdCQUFBLEtBQUssTUFBTSxhQUFhLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRTtBQUM3Qyw0QkFBQSxJQUFJLGFBQWEsS0FBS0EsV0FBVyxDQUFBLFdBQUEsQ0FBQyxRQUFRLEVBQUU7Z0NBQ3hDLE1BQU0sR0FBRyxlQUFlLEVBQUUsQ0FBQztnQ0FDM0Isa0JBQWtCLEdBQUcsTUFBTSxDQUFDO0FBQy9CLDZCQUFBO0FBQU0saUNBQUE7Z0NBQ0gsTUFBTSxHQUFHLGlCQUFpQixFQUFFLENBQUM7QUFDaEMsNkJBQUE7NEJBQ0QsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU07Z0NBQUUsTUFBTTtBQUN4RCx5QkFBQTtBQUNKLHFCQUFBO0FBQU0seUJBQUE7d0JBQ0gsTUFBTSxHQUFHLGlCQUFpQixFQUFFLENBQUM7QUFDaEMscUJBQUE7QUFDTCxpQkFBQyxDQUFDO0FBRUYsZ0JBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsRUFBRTtBQUNyQyxvQkFBQSxNQUFNLFFBQVEsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsS0FBSTt3QkFDL0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FDdkQsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixjQUFjLEVBQ2QsU0FBUyxFQUNULGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDOUIsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLEdBQUcsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTs0QkFDaEUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7NEJBQzlELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3JFLHlCQUFBO0FBQ0Qsd0JBQUEsT0FBTyxhQUFhLENBQUM7QUFDekIscUJBQUMsQ0FBQztvQkFFRixNQUFNLGVBQWUsR0FBRyxNQUFLO3dCQUN6QixPQUFPLFFBQVEsQ0FBQyxPQUFPLEVBQUVBLHVCQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckQscUJBQUMsQ0FBQztvQkFFRixNQUFNLGFBQWEsR0FBRyxNQUFLO0FBQ3ZCLHdCQUFBLE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUM7d0JBQ3hELElBQUksTUFBTSxDQUFDLHNCQUFzQixJQUFJLGNBQWMsQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLElBQUksZUFBZSxFQUFFOzRCQUNqRyxPQUFPLFFBQVEsQ0FBQyxlQUFlLEVBQUVBLHVCQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUQseUJBQUE7d0JBQ0QsT0FBTyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDO0FBQ3hDLHFCQUFDLENBQUM7QUFFRixvQkFBQSwwQkFBMEIsQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDM0Qsb0JBQUEsb0NBQW9DLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUVuRixpQkFBQTtBQUFNLHFCQUFBO29CQUNILElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQzs7OztBQUtqRCxvQkFBQSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFO0FBQ3RGLHdCQUFBLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDbkYsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDekMsNEJBQUEsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sS0FBSyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbEUsNEJBQUEsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkMseUJBQUE7QUFDSixxQkFBQTtvQkFFRCxNQUFNLDBCQUEwQixHQUFHLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxLQUFJO3dCQUNuRixNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO3dCQUN4RCxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO0FBQ3pELHdCQUFBLE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUM7QUFFakQsd0JBQUEsTUFBTSxlQUFlLEdBQUcsY0FBYyxLQUFLLGVBQWUsS0FBSyxPQUFPLENBQUMsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7d0JBRWxHLElBQUksU0FBUyxHQUdULEVBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUM7QUFDaEMsd0JBQUEsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLGVBQWUsS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQzt3QkFDOUYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxFQUFFOzRCQUN4QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzQyw0QkFBQSxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLGVBQWUsR0FBRyxPQUFPLENBQUM7QUFDdEUsNEJBQUEsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUN0QyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFDdkMsWUFBWSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFDcEUsY0FBYyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztBQUV2Riw0QkFBQSxJQUFJLE1BQU0sRUFBRTtBQUNSLGdDQUFBLFNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Z0NBQ3BDLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxHQUFHLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7b0NBQ3BELFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDakIsb0NBQUEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0NBQ3JCLE1BQU07QUFDVCxpQ0FBQTtBQUNKLDZCQUFBO0FBQ0oseUJBQUE7QUFFRCx3QkFBQSxPQUFPLFNBQVMsQ0FBQztBQUNyQixxQkFBQyxDQUFDO29CQUVGLE1BQU0sZUFBZSxHQUFHLE1BQUs7QUFDekIsd0JBQUEsT0FBTywwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU8sRUFBRUEsV0FBQUEsQ0FBQUEsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2hHLHFCQUFDLENBQUM7b0JBRUYsTUFBTSxhQUFhLEdBQUcsTUFBSztBQUN2Qix3QkFBQSxNQUFNLGVBQWUsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDO0FBQ3hELHdCQUFBLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO0FBQzVELHdCQUFBLElBQUksTUFBTSxDQUFDLHNCQUFzQixJQUFJLENBQUMsU0FBUyxJQUFJLGNBQWMsQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLElBQUksZUFBZSxFQUFFO0FBQy9HLDRCQUFBLE9BQU8sMEJBQTBCLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxlQUFlLEVBQUVBLFdBQUFBLENBQUFBLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM3Ryx5QkFBQTt3QkFDRCxPQUFPLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUM7QUFDeEMscUJBQUMsQ0FBQztBQUVGLG9CQUFBLDBCQUEwQixDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUUzRCxvQkFBQSxJQUFJLE1BQU0sRUFBRTtBQUNSLHdCQUFBLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQ3ZCLHdCQUFBLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO0FBQ2hDLHFCQUFBO29CQUVELE1BQU0sZUFBZSxHQUFHLG9DQUFvQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7OztBQUluRixvQkFBQSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7QUFDbEMsd0JBQUEsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ2xGLHdCQUFBLElBQUksVUFBVSxFQUFFOzRCQUNaLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUM5RCw0QkFBQSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzFGLHlCQUFBO0FBQ0oscUJBQUE7QUFFSixpQkFBQTtBQUNKLGFBQUE7WUFFRCxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7QUFDMUIsWUFBQSxTQUFTLEdBQUcsZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsR0FBRyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBRXhGLFlBQUEsU0FBUyxHQUFHLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztZQUUzRCxJQUFJLGNBQWMsQ0FBQywwQkFBMEIsRUFBRTtBQUMzQyxnQkFBQSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsOEJBQThCLENBQUMsQ0FBQztBQUN0RyxnQkFBQSxNQUFNLFFBQVEsR0FBR3NHLFdBQUFBLENBQUFBLHNCQUFpQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsMEJBQTBCLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBRWxILE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNwRCxnQkFBQSxNQUFNLG1CQUFtQixHQUFHLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQztBQUVuRSxnQkFBQSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUMxRCxlQUFlLEVBQ2YsWUFBWSxFQUNaLE1BQU0sQ0FBQyxlQUFlLEVBQ3RCLE1BQU0sQ0FBQyxnQkFBZ0IsRUFDdkIsUUFBUSxFQUNSLFNBQVMsRUFDVCxvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osY0FBYyxDQUFDLFNBQVMsRUFDeEIsbUJBQW1CLEVBQ25CLGdCQUFnQixDQUFDLENBQUM7QUFFdEIsZ0JBQUFsUSxrQkFBTSxDQUFDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixJQUFJLGtCQUFrQixDQUFDLENBQUMsQ0FBQzs7Ozs7QUFLNUcsZ0JBQUEsU0FBUyxHQUFHLGlCQUFpQixLQUFLLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUNsSCxnQkFBQSxTQUFTLEdBQUcsU0FBUyxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQztBQUN6RCxhQUFBO1lBRUQsSUFBSSxlQUFlLENBQUMsZ0JBQWdCLEVBQUU7QUFDbEMsZ0JBQUEsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUFDO0FBQ3ZELGFBQUE7WUFFRCxJQUFJLGVBQWUsQ0FBQyxPQUFPLEVBQUU7QUFFekIsZ0JBQUEsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLElBQUc7QUFDL0Isb0JBQUEsTUFBTSxjQUFjLEdBQUcsY0FBYyxJQUFJLEtBQUs7d0JBQzFDLHlCQUF5QixDQUNyQixPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUN6QixhQUFhLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO0FBQ3RELHdCQUFBLE9BQU8sQ0FBQztBQUNaLG9CQUFBLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQ3ZELGVBQWUsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM5RSxpQkFBQyxDQUFDO0FBRUYsZ0JBQUEsSUFBSSxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxlQUFlLENBQUMsZUFBZSxFQUFFO0FBQ2xILG9CQUFBLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3BFLFNBQVMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDOUMsaUJBQUE7QUFBTSxxQkFBQTtBQUNILG9CQUFBLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQzVELFNBQVMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDOUMsaUJBQUE7QUFDRCxnQkFBQSxTQUFTLEdBQUcsU0FBUyxJQUFJLGVBQWUsQ0FBQyxTQUFTLENBQUM7QUFDdEQsYUFBQTtZQUVELE1BQU0sZUFBZSxHQUFHLFlBQVk7QUFDaEMsaUJBQUMsY0FBYyxDQUFDLDBCQUEwQixLQUFLLENBQUMsSUFBSSxjQUFjLENBQUMsd0JBQXdCLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkcsTUFBTSxlQUFlLEdBQUcsWUFBWSxJQUFJLGNBQWMsQ0FBQyxlQUFlLEtBQUssQ0FBQyxDQUFDOztBQUc3RSxZQUFBLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxlQUFlLEVBQUU7QUFDdEMsZ0JBQUEsU0FBUyxHQUFHLFNBQVMsR0FBRyxTQUFTLElBQUksU0FBUyxDQUFDO0FBQ2xELGFBQUE7aUJBQU0sSUFBSSxDQUFDLGVBQWUsRUFBRTtBQUN6QixnQkFBQSxTQUFTLEdBQUcsU0FBUyxJQUFJLFNBQVMsQ0FBQztBQUN0QyxhQUFBO2lCQUFNLElBQUksQ0FBQyxlQUFlLEVBQUU7QUFDekIsZ0JBQUEsU0FBUyxHQUFHLFNBQVMsSUFBSSxTQUFTLENBQUM7QUFDdEMsYUFBQTtBQUVELFlBQUEsSUFBSSxTQUFTLElBQUksZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFO0FBQ3ZELGdCQUFBLElBQUksa0JBQWtCLElBQUksa0JBQWtCLENBQUMsR0FBRyxJQUFJLHdCQUF3QixFQUFFO0FBQzFFLG9CQUFBLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQ2xDLGdCQUFnQixDQUFDLEdBQUcsRUFDcEIsZUFBZSxFQUNmLE1BQU0sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsRUFDbkMsTUFBTSxDQUFDLGdCQUFnQixFQUN2Qix3QkFBd0IsRUFDeEIsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLGlCQUFBO0FBQU0scUJBQUE7QUFDSCxvQkFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUNsQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQ3BCLGVBQWUsRUFDZixNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLEVBQ25DLE1BQU0sQ0FBQyxnQkFBZ0IsRUFDdkIsZ0JBQWdCLEVBQ2hCLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixpQkFBQTtBQUVKLGFBQUE7WUFDRCxJQUFJLFNBQVMsSUFBSSxlQUFlLEVBQUU7QUFDOUIsZ0JBQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FDbEMsZUFBZSxDQUFDLEdBQUcsRUFDbkIsZUFBZSxFQUNmLE1BQU0sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsRUFDbkMsTUFBTSxDQUFDLGdCQUFnQixFQUN2QixnQkFBZ0IsRUFDaEIsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLGFBQUE7QUFDRCxZQUFBLElBQUksa0JBQWtCLEVBQUU7QUFDcEIsZ0JBQUEsSUFBSSxTQUFTLEVBQUU7QUFDWCxvQkFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUN0QyxrQkFBa0IsQ0FBQyxPQUFPLEVBQzFCLGVBQWUsRUFDZixNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLEVBQ25DLE1BQU0sQ0FBQyxnQkFBZ0IsRUFDdkIsZ0JBQWdCLEVBQ2hCLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixpQkFBQTtBQUVELGdCQUFBLElBQUksa0JBQWtCLEVBQUU7QUFDcEIsb0JBQUEsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO29CQUNuQyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUM7OztvQkFJakQsSUFBSSxXQUFXLEtBQUssU0FBUzt3QkFDekIsV0FBVyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7QUFFOUUsb0JBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUMzRCx3QkFBQSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUQsd0JBQUEsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELHdCQUFBLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RCx3QkFBQSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUUscUJBQUE7QUFDSixpQkFBQTtBQUNKLGFBQUE7QUFFRCxZQUFBQSxXQUFBQSxDQUFBQSxNQUFNLENBQUMsY0FBYyxDQUFDLFdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN6QyxZQUFBQSxXQUFBQSxDQUFBQSxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRXRDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksY0FBYyxDQUFDLFNBQVMsSUFBSSxjQUFjLEVBQUUsU0FBUyxJQUFJLGNBQWMsRUFBRSxTQUFTLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzdKLFlBQUEsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN4RCxTQUFDLENBQUM7QUFFRixRQUFBLElBQUksaUJBQWlCLEVBQUU7QUFDbkIsWUFBQUEsV0FBQUEsQ0FBQUEsTUFBTSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM3QyxZQUFBLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFFLFlBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ2hELGdCQUFBLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQyxnQkFBQSxXQUFXLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQzdGLGFBQUE7QUFDSixTQUFBO0FBQU0sYUFBQTtBQUNILFlBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoRixnQkFBQSxXQUFXLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLGFBQUE7QUFDSixTQUFBO1FBRUQsSUFBSSxrQkFBa0IsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzdFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs7QUFHeEVnUixZQUFBQSxXQUFBQSxDQUFBQSxNQUFXLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsRCxXQUFXLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztBQUN4RSxTQUFBO0FBRUQsUUFBQSxNQUFNLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztBQUMvQixLQUFBO0FBRUQsSUFBQSxxQkFBcUIsQ0FBQyxNQUFvQixFQUFFLFlBQXdCLEVBQUUsY0FBOEIsRUFBRSxXQUFtQixFQUFBO0FBQ3JILFFBQUEsTUFBTSxjQUFjLEdBQUc7WUFDbkIsTUFBTSxFQUFFLGNBQWMsQ0FBQyw0QkFBNEI7WUFDbkQsUUFBUSxFQUFFLGNBQWMsQ0FBQyw4QkFBOEI7WUFDdkQsT0FBTyxFQUFFLGNBQWMsQ0FBQyw2QkFBNkI7U0FDeEQsQ0FBQztBQUVGLFFBQUEsSUFBSSxTQUFTLENBQUM7QUFDZCxRQUFBLElBQUksV0FBVyxLQUFLcEgsV0FBVyxDQUFBLFdBQUEsQ0FBQyxRQUFRLEVBQUU7QUFDdEMsWUFBQSxTQUFTLEdBQUcsY0FBYyxDQUFDLDZCQUE2QixDQUFDO0FBQzVELFNBQUE7QUFBTSxhQUFBO1lBQ0gsU0FBUyxHQUFHLGNBQWMsQ0FBQ3FILFdBQUFBLENBQUFBLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDcEUsU0FBQTtBQUVELFFBQUEsTUFBTSxPQUFPLEdBQUc7QUFDWixZQUFBLGNBQWMsQ0FBQyw0QkFBNEI7QUFDM0MsWUFBQSxjQUFjLENBQUMsOEJBQThCO0FBQzdDLFlBQUEsY0FBYyxDQUFDLDZCQUE2QjtBQUM1QyxZQUFBLGNBQWMsQ0FBQyw2QkFBNkI7U0FDL0MsQ0FBQztBQUVGLFFBQUEsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUU7WUFDekIsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQ1osZ0JBQUEsSUFBSSxTQUFTLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7O0FBRXZDLG9CQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDNUQsaUJBQUE7QUFBTSxxQkFBQTs7QUFFSCxvQkFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQztBQUNyRixpQkFBQTtBQUNKLGFBQUE7QUFDSixTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsbUJBQW1CLENBQUMsTUFBb0IsRUFBRSxXQUFtQixFQUFFLGNBQThCLEVBQUE7QUFDekYsUUFBQSxNQUFNLFVBQVUsR0FBRyxDQUFDLFdBQVcsS0FBS3JILFdBQUFBLENBQUFBLFdBQVcsQ0FBQyxVQUFVLElBQUksV0FBVyxLQUFLQSx1QkFBVyxDQUFDLGNBQWMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQzVILFFBQUEsTUFBTSxRQUFRLEdBQUcsV0FBVyxLQUFLQSxXQUFBQSxDQUFBQSxXQUFXLENBQUMsUUFBUSxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFFeEUsUUFBQSxNQUFNLGlCQUFpQixHQUFHO0FBQ3RCLFlBQUEsY0FBYyxDQUFDLDRCQUE0QjtBQUMzQyxZQUFBLGNBQWMsQ0FBQyw4QkFBOEI7QUFDN0MsWUFBQSxjQUFjLENBQUMsNkJBQTZCO1NBQy9DLENBQUM7QUFFRixRQUFBLEtBQUssTUFBTSxLQUFLLElBQUksaUJBQWlCLEVBQUU7QUFDbkMsWUFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUM7QUFDM0UsU0FBQTtRQUVELElBQUksY0FBYyxDQUFDLDZCQUE2QixFQUFFO0FBQzlDLFlBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLDZCQUE2QixDQUFDLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDO0FBQ2hILFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxNQUFNLENBQUMsR0FBVyxFQUFBO0FBQ2QsUUFBQSxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztRQUN0QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFFbEQsUUFBQSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3pDLElBQUksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBRTdCLFFBQUEsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGFBQWEsR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hHLFFBQUEsTUFBTSxTQUFTLEdBQUcsYUFBYSxHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFMUUsUUFBQSxNQUFNLGFBQWEsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDbkUsUUFBQSxNQUFNLFdBQVcsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDdkUsUUFBQSxNQUFNLGdCQUFnQixHQUFHLGFBQWEsR0FBRyxhQUFhLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDOztBQUcvRSxRQUFBLEtBQUssTUFBTSxXQUFXLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN2QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3BELFlBQUEsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQy9DLFlBQUEsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEgsZ0JBQUEsZ0JBQWdCLEdBQUcsZ0JBQWdCO0FBQy9CLG9CQUFBLGNBQWMsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNO29CQUMvQyxjQUFjLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ3ZELGFBQUE7QUFBTSxpQkFBQTtnQkFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksaUJBQWlCLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN4SSxnQkFBZ0IsR0FBRyxnQkFBZ0IsSUFBSSxjQUFjLENBQUMsSUFBSSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUM7QUFDckYsYUFBQTtBQUNKLFNBQUE7O0FBR0QsUUFBQSxLQUFLLE1BQU0sV0FBVyxJQUFJLGFBQWEsRUFBRTtBQUNyQyxZQUFBLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUMvQyxZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO0FBQzlCLGdCQUFBLE1BQU0sWUFBWSxHQUFHLElBQUksaUJBQWlCLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDakYsZ0JBQUEsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRTtBQUMxQixvQkFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFlBQVksQ0FBQztBQUMzQyxvQkFBQSxnQkFBZ0IsR0FBRyxnQkFBZ0IsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUM3RixpQkFBQTtBQUNKLGFBQUE7QUFDSixTQUFBO0FBQ0QsUUFBQSxLQUFLLE1BQU0sV0FBVyxJQUFJLFdBQVcsRUFBRTtZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDOUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDaEUsYUFBQTtBQUNKLFNBQUE7QUFFRCxRQUFBLEtBQUssTUFBTSxXQUFXLElBQUksZ0JBQWdCLEVBQUU7WUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDakgsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3hFLGFBQUE7QUFDSixTQUFBOzs7O1FBS0Q1SixXQUFNLENBQUEsTUFBQSxDQUFDLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLENBQUMsQ0FBQztBQUM5RSxRQUFBLElBQUksZ0JBQWdCLEVBQUU7QUFDbEIsWUFBQSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBQ3RDLFNBQUE7QUFBTSxhQUFBLElBQUksT0FBTyxJQUFJLENBQUMsdUJBQXVCLEtBQUssUUFBUSxFQUFFO0FBQ3pELFlBQUEsSUFBSSxDQUFDLHVCQUF1QixHQUFHLGFBQWEsR0FBRyxhQUFhLENBQUMsdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBQzlGLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxvQkFBb0IsQ0FBQyxVQUFzQixFQUFFLEtBQWtCLEVBQUE7UUFDM0QsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsUUFBQSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN0QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBaUIsQ0FBQztBQUNoRSxZQUFBLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxVQUFVLENBQUMsRUFBRSxLQUFLLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZGLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDdEYsYUFBQTtBQUNKLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxxQkFBcUIsQ0FBQyxNQUFvQixFQUFFLGdCQUUzQyxFQUFFLGlCQUE0QyxFQUFBO1FBQzNDLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtBQUFFLFlBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqRSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7QUFBRSxZQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakUsSUFBSSxNQUFNLENBQUMsdUJBQXVCLEVBQUU7QUFBRSxZQUFBLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzRixJQUFJLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRTtBQUFFLFlBQUEsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3ZDLFFBQUEsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUMxRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUMxRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUM3RCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLEtBQUssS0FBSyxDQUFDO1FBQ3RFLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsS0FBSyxLQUFLLENBQUM7UUFDbEUsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsS0FBSyxNQUFNLENBQUM7Ozs7O1FBSzlELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUNyRCxnQkFBZ0IsS0FBSyxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQzlGLGdCQUFnQixLQUFLLGdCQUFnQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsRUFDOUYsSUFBSSxDQUFDLENBQUM7QUFFVixRQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxJQUFJLGlCQUFpQixNQUFNLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEVBQUU7QUFDMUgsWUFBQSxNQUFNLENBQUMseUJBQXlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUN2RCxTQUFBO1FBRUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxVQUFVLEVBQUUsV0FBbUIsRUFBRSxPQUFlLEtBQUk7QUFDdEUsWUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0QyxnQkFBQSxVQUFVLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RELGFBQUE7QUFDTCxTQUFDLENBQUM7QUFFRixRQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLEVBQ0YsMEJBQTBCLEVBQzFCLHdCQUF3QixFQUN4QixXQUFXLEVBQ2QsR0FBRyxjQUFjLENBQUM7QUFFbkIsWUFBQSxNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVsRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQy9DLFlBQUEsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsWUFBWSxHQUFHLHFCQUFxQixDQUFDO0FBQ3hDLGFBQUE7aUJBQU0sSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDdEIsWUFBWSxHQUFHLG1CQUFtQixDQUFDOztBQUVuQyxnQkFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFlBQVksQ0FBQztBQUM5QyxhQUFBO0FBRUQsWUFBQSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7WUFFckMsTUFBTSxPQUFPLEdBQUcsMEJBQTBCLEdBQUcsQ0FBQyxJQUFJLHdCQUF3QixHQUFHLENBQUMsQ0FBQztBQUMvRSxZQUFBLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO1lBRW5ELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM5RSxZQUFBLE1BQU0sZ0JBQWdCLEdBQUcsaUJBQWlCLEtBQUs0SixXQUFXLENBQUEsV0FBQSxDQUFDLFFBQVEsQ0FBQztBQUNwRSxZQUFBLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixLQUFLQSxXQUFXLENBQUEsV0FBQSxDQUFDLFVBQVUsSUFBSSxpQkFBaUIsS0FBS0EsV0FBVyxDQUFBLFdBQUEsQ0FBQyxjQUFjLENBQUM7QUFFeEgsWUFBQSxJQUFJLE9BQU8sRUFBRTtnQkFDVCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDOzs7QUFHckQsZ0JBQUEsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsR0FBRyxxQkFBcUIsR0FBRyxhQUFhLENBQUM7Z0JBQ25GLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLDBCQUEwQixFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDekUsZ0JBQUEsTUFBTSxlQUFlLEdBQUcsY0FBYyxHQUFHLHFCQUFxQixHQUFHLGFBQWEsQ0FBQztnQkFDL0UsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsZUFBZSxDQUFDLENBQUM7Ozs7O2dCQU1yRSxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ2xELGdCQUFBO0FBQ0ksb0JBQUEsY0FBYyxDQUFDLDZCQUE2QjtBQUM1QyxvQkFBQSxjQUFjLENBQUMsOEJBQThCO0FBQzdDLG9CQUFBLGNBQWMsQ0FBQyw0QkFBNEI7QUFDOUMsaUJBQUEsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFHO29CQUNkLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtBQUNaLHdCQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxZQUFZLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5RixxQkFBQTtBQUNMLGlCQUFDLENBQUMsQ0FBQztBQUVILGdCQUFBLElBQUksY0FBYyxDQUFDLDZCQUE2QixJQUFJLENBQUMsRUFBRTtvQkFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLDZCQUE2QixDQUFDLENBQUMsTUFBTSxHQUFHLFlBQVksSUFBSSxjQUFjLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuSSxpQkFBQTtnQkFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNwRSxnQkFBQSxJQUFJLFVBQVUsRUFBRTtBQUNaLG9CQUFBLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUM1RixpQkFBQTtnQkFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzVFLGdCQUFBLElBQUksZUFBZSxFQUFFO29CQUNqQixJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsZUFBZSxDQUFDLENBQUM7b0JBQzVFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ3JFLGlCQUFBO0FBQ0osYUFBQTtBQUVELFlBQUEsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUVyRCxnQkFBQSxNQUFNLGFBQWEsR0FBRyxFQUFFLGNBQWMsSUFBSSxjQUFjLENBQUMsNkJBQTZCLElBQUksZ0JBQWdCLENBQUMsQ0FBQztBQUU1RyxnQkFBQSxJQUFJLGNBQWMsQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLEVBQUU7QUFDM0Msb0JBQUEsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLEdBQUcsYUFBYSxHQUFHLHFCQUFxQixDQUFDO29CQUNoRixZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDN0Usb0JBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLENBQUMsTUFBTTtBQUN6RSx3QkFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBVSxDQUFDO0FBQzdDLGlCQUFBO0FBRUQsZ0JBQUEsSUFBSSxjQUFjLENBQUMsNkJBQTZCLElBQUksQ0FBQyxFQUFFO0FBQ25ELG9CQUFBLE1BQU0sZUFBZSxHQUFHLENBQUMsYUFBYSxHQUFHLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQztvQkFDL0UsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLHVCQUF1QixFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ25GLG9CQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLE1BQU07QUFDakYsd0JBQUEsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQVUsQ0FBQztBQUM3QyxpQkFBQTtBQUNKLGFBQUE7WUFFRCxJQUFJLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFO2dCQUN0RSxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xELGdCQUFBLElBQUksZUFBZSxFQUFFO29CQUNqQixJQUFJLEtBQUssR0FBRyxJQUFJOUosV0FBQUEsQ0FBQUEsYUFBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixvQkFBQSxJQUFJLGVBQWUsQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDLGVBQWUsRUFBRTt3QkFDNUQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLHdCQUFBLElBQUksaUJBQWlCLEVBQUU7NEJBQ25CLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDekQsNEJBQUEsSUFBSSxjQUFjLEVBQUU7Ozs7O2dDQUtoQixLQUFLLEdBQUcsNEJBQTRCLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFDdEQsY0FBYyxDQUFDLEtBQUssRUFDcEIsY0FBYyxDQUFDLE1BQU0sRUFDckIsY0FBYyxDQUFDLFVBQVUsRUFDekIsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2pDLGdDQUFBLElBQUksYUFBYSxFQUFFO0FBQ2Ysb0NBQUEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlFLGlDQUFBO0FBQ0osNkJBQUE7QUFBTSxpQ0FBQTs7OztnQ0FJSCxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ2hCLDZCQUFBO0FBQ0oseUJBQUE7d0JBRUQsSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFOzRCQUN6Qix1QkFBdUIsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEoseUJBQUE7d0JBQ0QsSUFBSSxlQUFlLENBQUMsZUFBZSxFQUFFOzRCQUNqQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLElBQUksY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlJLHlCQUFBO0FBQ0oscUJBQUE7b0JBRUQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsQ0FBQyxjQUFjLElBQUksZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUVyRixJQUFJLGVBQWUsQ0FBQyxPQUFPLEVBQUU7QUFDekIsd0JBQUEsdUJBQXVCLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUM1RyxjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQzVCLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLHFCQUFBO29CQUVELElBQUksZUFBZSxDQUFDLGVBQWUsRUFBRTtBQUNqQyx3QkFBQSx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxnQkFBZ0IsRUFDN0csY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUM1QixjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyQyxxQkFBQTtBQUNKLGlCQUFBO0FBQ0osYUFBQTtBQUNKLFNBQUE7UUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7QUFDakQsWUFBQSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0FBQzlGLFNBQUE7UUFFRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO0FBQ3pELFlBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQzlFLFNBQUE7UUFDRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO0FBQ3pELFlBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQzlFLFNBQUE7UUFDRCxJQUFJLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRTtBQUNuRixZQUFBLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDMUcsU0FBQTtRQUNELElBQUksTUFBTSxDQUFDLHVCQUF1QixFQUFFLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFO0FBQ25GLFlBQUEsTUFBTSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUMxRyxTQUFBO0FBRUQsUUFBQUUsV0FBQUEsQ0FBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNGLFFBQUFBLFdBQUFBLENBQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzs7QUFHM0YsUUFBQSxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDdkQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRXJFLFlBQUEsTUFBTSxDQUFDLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7QUFDdkQsWUFBQSxNQUFNLENBQUMsdUJBQXVCLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztBQUN6RCxZQUFBLE1BQU0sQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBRS9DLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzlELFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUE7QUFDeEIsUUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLEtBQUssQ0FBQztBQUMxQixZQUFBLENBQUM7QUFDRCxhQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUMvRSxLQUFBO0FBRUQsSUFBQSxjQUFjLENBQUMsSUFBWSxFQUFBOzs7OztBQUt2QixRQUFBLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7QUFDMUQsS0FBQTtBQUVELElBQUEsY0FBYyxDQUFDLEdBQVcsRUFBQTtRQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLO1lBQ2IsR0FBRyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO0FBQzlELEtBQUE7QUFFRCxJQUFBLFdBQVcsQ0FBQyxHQUFXLEVBQUUsSUFBWSxFQUFBOzs7O0FBSWpDLFFBQUEsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEtBQUssSUFBSTtBQUMxRCxhQUFBLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztBQUM5QixZQUFBLENBQUMsQ0FBQztBQUNOLFFBQUEsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUVuQyxPQUFPLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFDekUsS0FBQTtBQUVELElBQUEsUUFBUSxHQUFBO0FBQ0osUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNyQixLQUFBO0FBQ0osQ0FBQTtBQUVELFNBQVMsdUJBQXVCLENBQUMsb0JBQTBDLEVBQUUsTUFBZSxFQUFFLE9BQXlCLEVBQUUsTUFBZSxFQUFFLE1BQWUsRUFBQTtBQUNySixJQUFBLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM1RixJQUFBLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM1RixJQUFBLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM1RixJQUFBLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNoRyxDQUFDO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5QixTQUFTLFdBQVcsQ0FBQyxZQUEwQixFQUFBO0lBQzNDLElBQUksWUFBWSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO0FBQ3BELFFBQUEsT0FBTyxDQUFDLENBQUM7QUFDWixLQUFBO1NBQU0sSUFBSSxZQUFZLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFO0FBQzFELFFBQUEsT0FBTyxVQUFVLENBQUM7QUFDckIsS0FBQTtBQUNELElBQUEsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlDLElBQUEsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzNELElBQUEsT0FBTyxXQUFXLEdBQUcsT0FBTyxHQUFHLFNBQVMsR0FBRyxPQUFPO0FBQzlDLFFBQUEsV0FBVyxHQUFHLE9BQU8sR0FBRyxTQUFTLEdBQUcsT0FBTztBQUMzQyxRQUFBLFdBQVcsR0FBRyxNQUFNLEdBQUcsU0FBUyxHQUFHLE1BQU07QUFDekMsUUFBQSxXQUFXLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUE7O0FDenFDL0IsTUFBTSxjQUFjLENBQUE7QUFTaEIsSUFBQSxXQUFBLENBQVksVUFBNEIsRUFBQTtBQUNwQyxRQUFBLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLFlBQVk7WUFDNUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBRTNELFFBQUEsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUMzQixRQUFBLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDM0IsUUFBQSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDMUIsS0FBQTtJQUVELGlCQUFpQixDQUFDLEtBQWtCLEVBQUUsU0FBb0IsRUFBRSxrQkFBMkIsRUFBRSxVQUFzQixFQUFFLG9CQUFtQyxFQUFBO0FBRWhKLFFBQUEsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztBQUV0QyxRQUFBLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDMUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzNDLFlBQUEsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUUvRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLG9CQUFvQixFQUFFLEVBQUU7QUFDeEIsZ0JBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixhQUFBO0FBQ0osU0FBQTtRQUVELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO0FBQ3ZCLFlBQUEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUM5QixZQUFBLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFNLENBQUMsQ0FBQyxPQUF5QixHQUFJLENBQUMsQ0FBQyxPQUF5QixDQUFDLENBQUM7QUFDM0YsU0FBQTtBQUVELFFBQUEsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUNoRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDdkQsU0FBUyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUV2RixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLG9CQUFvQixFQUFFLEVBQUU7QUFDeEIsZ0JBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixhQUFBO0FBQ0osU0FBQTtBQUNELFFBQUEsT0FBTyxLQUFLLENBQUM7QUFDaEIsS0FBQTtBQUNKLENBQUE7QUFFRCxNQUFNLGtCQUFrQixDQUFBO0FBUXBCLElBQUEsV0FBQSxDQUNJLFNBQW9CLEVBQ3BCLEtBQW9CLEVBQ3BCLGtCQUEyQixFQUMzQixrQkFBMkIsRUFDM0IsWUFBb0IsRUFDcEIscUJBQThCLEVBQzlCLGFBQXlCLEVBQUE7QUFFekIsUUFBQSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDOUYsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLFFBQUEsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO0FBQzlDLFFBQUEsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO0FBQzlDLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdEIsS0FBQTtBQUVELElBQUEsTUFBTSxHQUFBO1FBQ0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3JCLEtBQUE7QUFFRCxJQUFBLGlCQUFpQixDQUNiLEtBQW9CLEVBQ3BCLE1BQWlDLEVBQ2pDLFVBQXNDLEVBQUE7QUFFdEMsUUFBQSxNQUFNLFNBQVMsR0FBR3lCLG9CQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFaEMsTUFBTSxvQkFBb0IsR0FBRyxNQUFLO1lBQzlCLE1BQU0sV0FBVyxHQUFHQSxXQUFPLENBQUEsUUFBQSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztBQUM5QyxZQUFBLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQzlELFNBQUMsQ0FBQztBQUVGLFFBQUEsT0FBTyxJQUFJLENBQUMsc0JBQXNCLElBQUksQ0FBQyxFQUFFO1lBQ3JDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUNuRCxZQUFBLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQ25FLFlBQUEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7aUJBQ3RCLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLGFBQWEsQ0FBQztpQkFDakQsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDLEVBQUU7QUFFbkQsZ0JBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLEtBQWdDLENBQUMsQ0FBQztBQUNoRixpQkFBQTtnQkFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUVoSyxnQkFBQSxJQUFJLGNBQWMsRUFBRTs7OztvQkFJaEIsT0FBTztBQUNWLGlCQUFBO2dCQUVELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0FBQ2hDLGFBQUE7WUFFRCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztBQUNqQyxTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNyQixLQUFBO0FBRUQsSUFBQSxNQUFNLENBQUMsR0FBVyxFQUFBO0FBQ2QsUUFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7QUFDekIsS0FBQTtBQUNKLENBQUE7O0FDN0hEOzs7Ozs7Ozs7Ozs7QUFZRTtBQUVGO0FBQ0EsTUFBTSxjQUFjLEdBQUcsR0FBRyxHQUFHbEIsV0FBTSxDQUFBLE1BQUEsR0FBRyxDQUFDLENBQUM7QUFFeEMsTUFBTSxjQUFjLENBQUE7QUFhaEIsSUFBQSxXQUFBLENBQVksTUFBd0IsRUFBRSxlQUFvQyxFQUFFLGdCQUF3QixFQUFBO0FBQ2hHLFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDckIsUUFBQSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLFFBQUEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBRXpDLFFBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QyxZQUFBLE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUM7QUFDL0IsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ25DLGdCQUFBLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDekMsYUFBQTs7O0FBR0QsWUFBQSxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNsQyxXQUFXLEVBQUUsY0FBYyxDQUFDLFdBQVc7Z0JBQ3ZDLEtBQUssRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQztBQUMzRCxhQUFBLENBQUMsQ0FBQztBQUNOLFNBQUE7QUFDSixLQUFBOzs7Ozs7O0FBUUQsSUFBQSxvQkFBb0IsQ0FBQyxjQUE4QixFQUFFLFdBQTZCLEVBQUE7QUFDOUUsUUFBQSxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDdEUsUUFBQSxNQUFNLEtBQUssR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDeEQsT0FBTztBQUNILFlBQUEsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBR0Esa0JBQU0sR0FBRyxjQUFjLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQztBQUNsRixZQUFBLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUdBLGtCQUFNLEdBQUcsY0FBYyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUM7U0FDckYsQ0FBQztBQUNMLEtBQUE7QUFFRCxJQUFBLFdBQVcsQ0FBQyxlQUFvQyxFQUFFLFNBQTJCLEVBQUUsZ0JBRTlFLEVBQUE7QUFDRyxRQUFBLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFckksUUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QyxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLElBQUksY0FBYyxDQUFDLFdBQVcsRUFBRTs7Z0JBRTVCLFNBQVM7QUFDWixhQUFBO1lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTs7Z0JBRW5CLFNBQVM7QUFDWixhQUFBO1lBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRS9FLFlBQUEsS0FBSyxNQUFNLGNBQWMsSUFBSSxnQkFBZ0IsRUFBRTs7O0FBRzNDLGdCQUFBLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTO0FBQ25FLG9CQUFBLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztBQUNuRSxvQkFBQSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRTs7OztBQUkvQyxvQkFBQSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BELG9CQUFBLGNBQWMsQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQztvQkFDeEQsTUFBTTtBQUNULGlCQUFBO0FBQ0osYUFBQTtBQUNKLFNBQUE7QUFDSixLQUFBO0FBQ0osQ0FBQTtBQUVELE1BQU0sWUFBWSxDQUFBO0FBRWQsSUFBQSxXQUFBLEdBQUE7QUFDSSxRQUFBLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLEtBQUE7QUFDRCxJQUFBLFFBQVEsR0FBQTtBQUNKLFFBQUEsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUM7QUFDaEMsS0FBQTtBQUNKLENBQUE7QUFFRCxNQUFNLHlCQUF5QixDQUFBO0FBYTNCLElBQUEsV0FBQSxHQUFBO0FBQ0ksUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNsQixRQUFBLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDM0IsUUFBQSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNoQixLQUFBO0FBRUQ7Ozs7QUFJRztBQUNILElBQUEsY0FBYyxDQUFDLEdBQVcsRUFBQTtBQUN0QixRQUFBLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNyRCxJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUU7QUFDakIsWUFBQSxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQzdCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUN4QixnQkFBQSxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRTs7QUFFM0Isb0JBQUEsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLG9CQUFBLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUM7b0JBQ3BFLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMxQyxpQkFBQTtBQUNELGdCQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDO0FBQ3JDLGFBQUE7QUFDSixTQUFBO0FBQ0QsUUFBQSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQixLQUFBO0FBRUQsSUFBQSxTQUFTLENBQUMsTUFBd0IsRUFBRSxNQUFvQixFQUFFLFlBQTBCLEVBQUE7QUFDaEYsUUFBQSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztBQUNoQyxZQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUM5QyxZQUFBLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQjtnQkFDN0QsTUFBTSxDQUFDLGdCQUFnQixFQUFFO0FBQ3pCLGdCQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLGFBQUE7QUFBTSxpQkFBQTs7Ozs7O2dCQU1ILElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyRCxhQUFBO0FBQ0osU0FBQTtBQUVELFFBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELFlBQUEsY0FBYyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDbEMsU0FBQTtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzVDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xELFNBQUE7UUFDRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFbkUsUUFBQSxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDN0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFO0FBQ25DLGdCQUFBLEtBQUssTUFBTSxFQUFFLElBQUksV0FBVyxFQUFFO0FBQzFCLG9CQUFBLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDckMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVFLHFCQUFBO0FBQ0osaUJBQUE7QUFDSixhQUFBO0FBQU0saUJBQUE7Z0JBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqRCxnQkFBQSxJQUFJLFdBQVcsRUFBRTtvQkFDYixXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDN0UsaUJBQUE7QUFDSixhQUFBO0FBQ0osU0FBQTtBQUVELFFBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELFlBQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUU7O0FBRTdCLGdCQUFBLGNBQWMsQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3JELGdCQUFBLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDdkQsYUFBQTtBQUNKLFNBQUE7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDekMsU0FBQTtRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUUzSCxRQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsS0FBQTtBQUVELElBQUEsd0JBQXdCLENBQUMsSUFBcUIsRUFBRSxhQUE2QixFQUFBO0FBQ3pFLFFBQUEsS0FBSyxNQUFNLEdBQUcsSUFBSSxhQUFhLENBQUMsc0JBQXNCLEVBQUU7WUFDcEQsS0FBSyxNQUFNLGNBQWMsSUFBSSxhQUFhLENBQUMsc0JBQXNCLENBQUUsR0FBVyxDQUFDLEVBQUU7Z0JBQzdFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNsRSxhQUFBO0FBQ0osU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLGtCQUFrQixDQUFDLFVBRWxCLEVBQUE7UUFDRyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7QUFDekIsUUFBQSxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDMUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxZQUFBLEtBQUssTUFBTSxPQUFPLElBQUksV0FBVyxFQUFFO2dCQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO29CQUNwRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELG9CQUFBLE9BQU8sV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM1QixZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQ3ZCLGlCQUFBO0FBQ0osYUFBQTtBQUNKLFNBQUE7QUFDRCxRQUFBLE9BQU8sWUFBWSxDQUFDO0FBQ3ZCLEtBQUE7QUFDSixDQUFBO0FBRUQsTUFBTSxvQkFBb0IsQ0FBQTtBQU10QixJQUFBLFdBQUEsR0FBQTtBQUNJLFFBQUEsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDdkIsUUFBQSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7QUFDdkMsUUFBQSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLFFBQUEsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEVBQUUsQ0FBQztBQUN2QyxLQUFBO0FBRUQsSUFBQSxRQUFRLENBQUMsVUFBc0IsRUFBRSxLQUFrQixFQUFFLEdBQVcsRUFBQTtRQUM1RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsRCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7QUFDMUIsWUFBQSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO0FBQ25GLFNBQUE7UUFFRCxJQUFJLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNqQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUU1QixRQUFBLFVBQVUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFL0IsUUFBQSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN0QixNQUFNLFlBQVksR0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBeUIsQ0FBQztBQUN6RSxZQUFBLElBQUksQ0FBQyxZQUFZLElBQUksVUFBVSxDQUFDLEVBQUUsS0FBSyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsU0FBUztBQUViLFlBQUEsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRTtBQUNoQyxnQkFBQSxZQUFZLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUM7QUFDOUQsYUFBQTtBQUVELFlBQUEsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDcEUsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0FBQy9CLGFBQUE7QUFDRCxZQUFBLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUMxRCxTQUFBO0FBRUQsUUFBQSxJQUFJLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ2pELG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUMvQixTQUFBO0FBRUQsUUFBQSxPQUFPLG9CQUFvQixDQUFDO0FBQy9CLEtBQUE7QUFFRCxJQUFBLGlCQUFpQixDQUFDLFVBQXlCLEVBQUE7UUFDdkMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLFFBQUEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsS0FBSTtBQUM3QixZQUFBLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDbkMsU0FBQyxDQUFDLENBQUM7QUFDSCxRQUFBLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtBQUNyQyxZQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDeEIsZ0JBQUEsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3JDLGFBQUE7QUFDSixTQUFBO0FBQ0osS0FBQTtBQUNKLENBQUE7O0FDbFJEO0FBQ0E7QUFDQTtBQUNBLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxPQUFnQixFQUFFLE1BR3ZDLEtBQ0wyUSxXQUFxQixDQUFBLG9CQUFBLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUM7QUFzQjNHLE1BQU0sdUJBQXVCLEdBQUdsRCxXQUFJLENBQUEsSUFBQSxDQUFDbUQsVUFBYyxFQUFFO0lBQ2pELFVBQVU7SUFDVixhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixXQUFXO0lBQ1gsV0FBVztJQUNYLGNBQWM7SUFDZCxtQkFBbUI7SUFDbkIsVUFBVTtJQUNWLGVBQWU7SUFDZixzQkFBc0I7OztBQUd6QixDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0scUJBQXFCLEdBQUduRCxXQUFJLENBQUEsSUFBQSxDQUFDbUQsVUFBYyxFQUFFO0lBQy9DLFdBQVc7SUFDWCxTQUFTO0lBQ1QsWUFBWTtJQUNaLFVBQVU7QUFDYixDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0sS0FBSyxHQUFHLFVBQVUsRUFBd0IsQ0FBQztBQWdCakQ7O0FBRUc7QUFDSCxNQUFNLEtBQU0sU0FBUWhFLFdBQUFBLENBQUFBLE9BQU8sQ0FBQTtBQXFDdkIsSUFBQSxXQUFZLENBQUEsR0FBUSxFQUFFLE9BQUEsR0FBd0IsRUFBRSxFQUFBO0FBQzVDLFFBQUEsS0FBSyxFQUFFLENBQUM7QUFFUixRQUFBLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQ2lFLG1CQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN4RCxRQUFBLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztBQUN2QyxRQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsUUFBQSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDekMsUUFBQSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO0FBRXZELFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDbEIsUUFBQSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBSSxFQUFFLENBQUM7QUFDbEIsUUFBQSxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUN2QixRQUFBLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSUMsV0FBQUEsQ0FBQUEsV0FBVyxFQUFFLENBQUM7QUFDckMsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUNyQixRQUFBLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFFM0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXJCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRUMsV0FBQUEsQ0FBQUEsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUV4RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLEtBQUssS0FBSTtBQUN2RSxZQUFBLE1BQU0sS0FBSyxHQUFHO2dCQUNWLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDaEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2FBQzdCLENBQUM7QUFDRixZQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxPQUFPLEtBQUk7Z0JBQ3BFQyxXQUE0QixDQUFBLDRCQUFBLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEMsZ0JBQUEsSUFBSSxPQUFPLEVBQUU7QUFDVCxvQkFBQSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQ2xELG9CQUFBLElBQUksV0FBVyxFQUFFO0FBQ2Isd0JBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFOzRCQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ2xDLHlCQUFBO0FBQ0oscUJBQUE7QUFDSixpQkFBQTtBQUVMLGFBQUMsQ0FBQyxDQUFDO0FBQ1AsU0FBQyxDQUFDLENBQUM7QUFFSCxRQUFBLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxLQUFJO1lBQ3RCLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLGNBQWMsS0FBSyxVQUFVLEVBQUU7Z0JBQ3BFLE9BQU87QUFDVixhQUFBO1lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDZCxPQUFPO0FBQ1YsYUFBQTtBQUVELFlBQUEsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3ZDLFlBQUEsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUU7Z0JBQ25DLE9BQU87QUFDVixhQUFBO0FBRUQsWUFBQSxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEMsZ0JBQUEsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUU7QUFDNUIsb0JBQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QixpQkFBQTtBQUNKLGFBQUE7QUFDTCxTQUFDLENBQUMsQ0FBQztBQUNOLEtBQUE7QUFFRCxJQUFBLE9BQU8sQ0FBQyxHQUFXLEVBQUUsT0FBQSxHQUVqQixFQUFFLEVBQUE7QUFDRixRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSWxFLGlCQUFLLENBQUMsYUFBYSxFQUFFLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQztBQUV6RCxRQUFBLE1BQU0sUUFBUSxHQUFHLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTO0FBQ2xELFlBQUEsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFFNUIsUUFBQSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUVKLHdCQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkYsUUFBQSxJQUFJLENBQUMsUUFBUSxHQUFHSCxXQUFPLENBQUEsT0FBQSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQW9CLEVBQUUsSUFBaUIsS0FBSTtBQUN6RSxZQUFBLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLFlBQUEsSUFBSSxLQUFLLEVBQUU7Z0JBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJTSxzQkFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDcEMsYUFBQTtBQUFNLGlCQUFBLElBQUksSUFBSSxFQUFFO0FBQ2IsZ0JBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDOUIsYUFBQTtBQUNMLFNBQUMsQ0FBQyxDQUFDO0FBQ04sS0FBQTtBQUVELElBQUEsUUFBUSxDQUFDLElBQXdCLEVBQUUsT0FBQSxHQUE4QixFQUFFLEVBQUE7QUFDL0QsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlDLGlCQUFLLENBQUMsYUFBYSxFQUFFLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQztBQUV6RCxRQUFBLElBQUksQ0FBQyxRQUFRLEdBQUc1TCxvQkFBTyxDQUFDLEtBQUssQ0FBQyxNQUFLO0FBQy9CLFlBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsS0FBSyxLQUFLLENBQUMsQ0FBQztBQUNqRCxTQUFDLENBQUMsQ0FBQztBQUNOLEtBQUE7QUFFRCxJQUFBLFNBQVMsR0FBQTtBQUNMLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJNEwsaUJBQUssQ0FBQyxhQUFhLEVBQUUsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pELFFBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDNUIsS0FBQTtBQUVELElBQUEsS0FBSyxDQUFDLElBQXdCLEVBQUUsUUFBaUIsRUFBQTtRQUM3QyxJQUFJLFFBQVEsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUVTLFdBQUFBLENBQUFBLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQzdELE9BQU87QUFDVixTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztBQUNwQixRQUFBLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBRXZCLFFBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzNCLFlBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO0FBQzNELFNBQUE7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDYixZQUFBLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2pDLFNBQUE7QUFBTSxhQUFBO0FBQ0gsWUFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQyxTQUFBO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXRDLE1BQU0sTUFBTSxHQUFHMEQsV0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFN0MsUUFBQSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRTlDLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDbEIsUUFBQSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLFFBQUEsS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUU7QUFDdEIsWUFBQSxLQUFLLEdBQUd2RyxXQUFBQSxDQUFBQSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQyxZQUFBLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBQyxFQUFDLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsWUFBQSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN4RCxTQUFBO0FBQ0QsUUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBRTNFLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRTlDLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJb0MsaUJBQUssQ0FBQyxNQUFNLEVBQUUsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUEsaUJBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEtBQUE7QUFFRCxJQUFBLFdBQVcsQ0FBQyxHQUFXLEVBQUE7UUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxLQUFJO0FBQ3RHLFlBQUEsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFDM0IsWUFBQSxJQUFJLEdBQUcsRUFBRTtnQkFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlELHNCQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsQyxhQUFBO0FBQU0saUJBQUEsSUFBSSxNQUFNLEVBQUU7QUFDZixnQkFBQSxLQUFLLE1BQU0sRUFBRSxJQUFJLE1BQU0sRUFBRTtBQUNyQixvQkFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUMsaUJBQUE7QUFDSixhQUFBO0FBRUQsWUFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDOUQsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlDLGlCQUFLLENBQUMsTUFBTSxFQUFFLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxTQUFDLENBQUMsQ0FBQztBQUNOLEtBQUE7QUFFRCxJQUFBLGNBQWMsQ0FBQyxLQUFpQixFQUFBO1FBQzVCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDZCxPQUFPO0FBQ1YsU0FBQTtBQUVELFFBQUEsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2QsT0FBTztBQUNWLFNBQUE7QUFFRCxRQUFBLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN2QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxLQUFLLE1BQU0sQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMzRyxZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUQsc0JBQVUsQ0FBQyxJQUFJLEtBQUssQ0FDOUIsQ0FBaUIsY0FBQSxFQUFBLFdBQVcsQ0FBSSxFQUFBLENBQUE7QUFDaEMsZ0JBQUEsQ0FBNkIsMEJBQUEsRUFBQSxNQUFNLENBQUMsRUFBRSxDQUFJLEVBQUEsQ0FBQTtBQUMxQyxnQkFBQSxDQUFBLDZCQUFBLEVBQWdDLEtBQUssQ0FBQyxFQUFFLENBQUksRUFBQSxDQUFBLENBQy9DLENBQUMsQ0FBQyxDQUFDO0FBQ1AsU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLE1BQU0sR0FBQTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztBQUNiLFlBQUEsT0FBTyxLQUFLLENBQUM7UUFFakIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNO0FBQ3hDLFlBQUEsT0FBTyxLQUFLLENBQUM7QUFFakIsUUFBQSxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZO1lBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUMvQixnQkFBQSxPQUFPLEtBQUssQ0FBQztBQUVyQixRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtBQUM3QixZQUFBLE9BQU8sS0FBSyxDQUFDO0FBRWpCLFFBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixLQUFBO0FBRUQsSUFBQSxnQkFBZ0IsQ0FBQyxHQUFrQixFQUFBO1FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLFFBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDbEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMvQixZQUFBLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQ3pCLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUM1QyxhQUFBO0FBQ0osU0FBQTtBQUNELFFBQUEsT0FBTyxnQkFBZ0IsQ0FBQztBQUMzQixLQUFBO0FBRUQsSUFBQSxjQUFjLEdBQUE7UUFDVixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRTtBQUMxQyxZQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsU0FBQTtBQUVELFFBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2hDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtBQUN2QyxnQkFBQSxPQUFPLElBQUksQ0FBQztBQUNmLGFBQUE7QUFDSixTQUFBO0FBRUQsUUFBQSxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDM0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO0FBQ2xDLGdCQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsYUFBQTtBQUNKLFNBQUE7QUFFRCxRQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLEtBQUE7QUFFRCxJQUFBLFlBQVksR0FBQTtBQUNSLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDZixZQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUNqRCxTQUFBO0FBQ0osS0FBQTtBQUVEOzs7QUFHRztBQUNILElBQUEsTUFBTSxDQUFDLFVBQWdDLEVBQUE7QUFDbkMsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNmLE9BQU87QUFDVixTQUFBO0FBRUQsUUFBQSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRXBELFlBQUEsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7QUFDeEMsZ0JBQUEsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNwRCxhQUFBO0FBQ0QsWUFBQSxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3hDcE4sV0FBTSxDQUFBLE1BQUEsQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sS0FBSyxPQUFPLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxNQUFNLEtBQUssUUFBUSxFQUFFO0FBQ3JCLG9CQUFBLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsaUJBQUE7cUJBQU0sSUFBSSxNQUFNLEtBQUssT0FBTyxFQUFFO0FBQzNCLG9CQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekIsaUJBQUE7QUFDSixhQUFBO1lBRUQsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7QUFFcEMsWUFBQSxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNsRCxhQUFBO0FBRUQsWUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXpDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUN4QixTQUFBO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFFN0IsUUFBQSxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNoRCxZQUFBLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7QUFDL0MsWUFBQSxXQUFXLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUM1QixTQUFBO0FBRUQsUUFBQSxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVwQyxLQUFLLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNyRCxZQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQy9DLGFBQUE7QUFDSixTQUFBO0FBRUQsUUFBQSxLQUFLLE1BQU0sUUFBUSxJQUFJLGlCQUFpQixFQUFFO1lBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEQsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxXQUFXLENBQUMsSUFBSSxFQUFFO2dCQUNsRCxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUlxTixpQkFBSyxDQUFDLE1BQU0sRUFBRSxFQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEcsYUFBQTtBQUNKLFNBQUE7QUFFRCxRQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25DLFFBQUEsSUFBSSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO0FBRXpCLFFBQUEsSUFBSSxPQUFPLEVBQUU7QUFDVCxZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUEsaUJBQUssQ0FBQyxNQUFNLEVBQUUsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELFNBQUE7QUFFSixLQUFBO0FBRUQ7O0FBRUc7QUFDSCxJQUFBLDRCQUE0QixHQUFBO1FBQ3hCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRTtBQUN0QixZQUFBLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtBQUNsQyxnQkFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQzVGLGFBQUE7QUFDRCxZQUFBLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBQzVCLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxtQkFBbUIsQ0FBQyxVQUF5QixFQUFFLFVBQXlCLEVBQUE7QUFDcEUsUUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUU7QUFDdEMsWUFBQSxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQztZQUN6QyxVQUFVO0FBQ2IsU0FBQSxDQUFDLENBQUM7QUFDTixLQUFBO0FBRUQsSUFBQSxhQUFhLEdBQUE7QUFDVCxRQUFBLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBRXRCLFFBQUEsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDekIsUUFBQSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztBQUV6QixRQUFBLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQUEsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUU3QixRQUFBLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBQzVCLEtBQUE7QUFFRDs7Ozs7Ozs7O0FBU0c7QUFDSCxJQUFBLFFBQVEsQ0FBQyxTQUE2QixFQUFBO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBRVMseUJBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUFFLFlBQUEsT0FBTyxLQUFLLENBQUM7QUFFdkUsUUFBQSxTQUFTLEdBQUdsTyxXQUFBQSxDQUFBQSxPQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0IsU0FBUyxDQUFDLE1BQU0sR0FBRzRSLFdBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFM0MsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLENBQUM7QUFDbEQsYUFBQSxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7QUFFMUQsUUFBQSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ3RCLFlBQUEsT0FBTyxLQUFLLENBQUM7QUFDaEIsU0FBQTtBQUVELFFBQUEsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLElBQUksdUJBQXVCLENBQUMsQ0FBQyxDQUFDO0FBQ3hGLFFBQUEsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQSxlQUFBLEVBQWtCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBRyxDQUFBLENBQUEsQ0FBQyxDQUFDO0FBQzNGLFNBQUE7QUFFRCxRQUFBLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUk7QUFDbkIsWUFBQSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEtBQUssZUFBZSxFQUFFOzs7Z0JBR2hDLE9BQU87QUFDVixhQUFBO0FBQ0EsWUFBQSxJQUFZLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25ELFNBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBQSxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztBQUU1QixRQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsS0FBQTtBQUVELElBQUEsUUFBUSxDQUFDLEVBQVUsRUFBRSxLQUFpQixFQUFBO0FBQ2xDLFFBQUEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25CLFlBQUEsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlwRSxzQkFBVSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUEsZ0JBQUEsRUFBbUIsRUFBRSxDQUFBLGlCQUFBLENBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekYsU0FBQTtRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN0QyxRQUFBLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMvQixLQUFBO0FBRUQsSUFBQSxXQUFXLENBQUMsRUFBVSxFQUFFLEtBQWlCLEVBQUE7UUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVDLEtBQUE7QUFFRCxJQUFBLFFBQVEsQ0FBQyxFQUFVLEVBQUE7UUFDZixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLEtBQUE7QUFFRCxJQUFBLFdBQVcsQ0FBQyxFQUFVLEVBQUE7QUFDbEIsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQixZQUFBLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJQSxzQkFBVSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUEsZ0JBQUEsRUFBbUIsRUFBRSxDQUFBLGlCQUFBLENBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekYsU0FBQTtBQUNELFFBQUEsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsUUFBQSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDL0IsS0FBQTtBQUVELElBQUEsa0JBQWtCLENBQUMsRUFBVSxFQUFBO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3ZELFFBQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDL0IsUUFBQSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDOUQsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlDLGlCQUFLLENBQUMsTUFBTSxFQUFFLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQztBQUNyRCxLQUFBO0FBRUQsSUFBQSxVQUFVLEdBQUE7UUFDTixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7QUFFcEIsUUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDekMsS0FBQTtBQUVELElBQUEsU0FBUyxDQUFDLEVBQVUsRUFBRSxNQUEyQixFQUFFLE9BQUEsR0FBOEIsRUFBRSxFQUFBO1FBQy9FLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEtBQUssU0FBUyxFQUFFO0FBQ3JDLFlBQUEsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFBLFFBQUEsRUFBVyxFQUFFLENBQUEsaUJBQUEsQ0FBbUIsQ0FBQyxDQUFDO0FBQ3JELFNBQUE7QUFFRCxRQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO0FBQ2QsWUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLENBQW9GLGlGQUFBLEVBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQSxDQUFHLENBQUMsQ0FBQztBQUMxSSxTQUFBO0FBRUQsUUFBQSxNQUFNLFFBQVEsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRSxRQUFBLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxRCxRQUFBLElBQUksY0FBYyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUNTLFdBQWEsQ0FBQSxhQUFBLENBQUMsTUFBTSxFQUFFLENBQVcsUUFBQSxFQUFBLEVBQUUsQ0FBRSxDQUFBLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7WUFBRSxPQUFPO1FBRTNHLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLHNCQUFzQjtBQUFHLFlBQUEsTUFBYyxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUM5RixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3pGLFFBQUEsV0FBVyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDekIsUUFBQSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE9BQU87QUFDdEMsWUFBQSxjQUFjLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUM3QixZQUFBLE1BQU0sRUFBRSxXQUFXLENBQUMsU0FBUyxFQUFFO0FBQy9CLFlBQUEsUUFBUSxFQUFFLEVBQUU7QUFDZixTQUFBLENBQUMsQ0FBQyxDQUFDO0FBRUosUUFBQSxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QixRQUFBLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLEtBQUE7QUFFRDs7Ozs7QUFLRztBQUNILElBQUEsWUFBWSxDQUFDLEVBQVUsRUFBQTtRQUNuQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFcEIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxLQUFLLFNBQVMsRUFBRTtBQUNyQyxZQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUN0RCxTQUFBO0FBQ0QsUUFBQSxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7QUFDckMsZ0JBQUEsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlWLFdBQUFBLENBQUFBLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFBLFFBQUEsRUFBVyxFQUFFLENBQW9DLGlDQUFBLEVBQUEsT0FBTyxDQUFnQixjQUFBLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6SCxhQUFBO0FBQ0osU0FBQTtRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUMsUUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0IsUUFBQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJQyxpQkFBSyxDQUFDLE1BQU0sRUFBRSxFQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25HLFFBQUEsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLFFBQUEsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsUUFBQSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztBQUN4QixLQUFBO0FBRUQ7Ozs7QUFJRztBQUNILElBQUEsb0JBQW9CLENBQUMsRUFBVSxFQUFFLElBQThCLEVBQUE7UUFDM0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBRXBCLFFBQUFyTixXQUFNLENBQUEsTUFBQSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEtBQUssU0FBUyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7UUFDL0UsTUFBTSxhQUFhLEdBQW1CLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFVLENBQUM7QUFDaEYsUUFBQUEsV0FBQUEsQ0FBQUEsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUM7QUFFekMsUUFBQSxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDeEIsS0FBQTtBQUVEOzs7O0FBSUc7QUFDSCxJQUFBLFNBQVMsQ0FBQyxFQUFVLEVBQUE7QUFDaEIsUUFBQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNyRSxLQUFBO0FBRUQ7Ozs7Ozs7QUFPRztBQUNILElBQUEsUUFBUSxDQUFDLFdBQXNELEVBQUUsTUFBZSxFQUFFLE9BQUEsR0FBOEIsRUFBRSxFQUFBO1FBQzlHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUVwQixRQUFBLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUM7QUFFMUIsUUFBQSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkIsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlvTixXQUFBQSxDQUFBQSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQSxPQUFBLEVBQVUsRUFBRSxDQUFBLDZCQUFBLENBQStCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEYsT0FBTztBQUNWLFNBQUE7QUFFRCxRQUFBLElBQUksS0FBSyxDQUFDO0FBQ1YsUUFBQSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBRS9CLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFcUUsb0NBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQUUsT0FBTztBQUU5RSxZQUFBLEtBQUssR0FBR3hHLFdBQUFBLENBQUFBLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRXpDLFNBQUE7QUFBTSxhQUFBO0FBQ0gsWUFBQSxJQUFJLE9BQVEsV0FBbUIsQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFO2dCQUNqRCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRyxXQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2hELGdCQUFBLFdBQVcsR0FBR3JMLFdBQUFBLENBQUFBLE9BQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDakMsV0FBVyxHQUFJRCxXQUFNLENBQUEsTUFBQSxDQUFDLFdBQVcsRUFBRSxFQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUMsQ0FBUyxDQUFDO0FBQzVELGFBQUE7O1lBR0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDbU8sV0FBQUEsQ0FBQUEsYUFBYSxDQUFDLEtBQUssRUFDbEMsQ0FBQSxPQUFBLEVBQVUsRUFBRSxDQUFBLENBQUUsRUFBRSxXQUFXLEVBQUUsRUFBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLENBQUM7Z0JBQUUsT0FBTztBQUVwRSxZQUFBLEtBQUssR0FBRzdDLFdBQUFBLENBQUFBLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RDLFlBQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUUzQixZQUFBLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBQyxFQUFFLEVBQUMsRUFBQyxDQUFDLENBQUM7QUFDNUMsWUFBQSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN4RCxTQUFBO0FBRUQsUUFBQSxNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDeEUsUUFBQSxJQUFJLE1BQU0sSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7QUFDeEIsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUltQyxXQUFVLENBQUEsVUFBQSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUEsa0JBQUEsRUFBcUIsRUFBRSxDQUFnQyw2QkFBQSxFQUFBLE1BQU0sQ0FBSSxFQUFBLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RyxPQUFPO0FBQ1YsU0FBQTtRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDakMsUUFBQSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBRS9CLFFBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7QUFFekIsUUFBQSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTs7Ozs7Ozs7WUFRcEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QyxZQUFBLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMvQixZQUFBLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxFQUFFO2dCQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDaEQsYUFBQTtBQUFNLGlCQUFBO2dCQUNILElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDM0MsYUFBQTtBQUNKLFNBQUE7QUFDRCxRQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFekIsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO0FBQ2IsWUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixTQUFBO0FBQ0osS0FBQTtBQUVEOzs7OztBQUtHO0FBQ0gsSUFBQSxTQUFTLENBQUMsRUFBVSxFQUFFLE1BQWUsRUFBQTtRQUNqQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDcEIsUUFBQSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUVyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDUixZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUEsV0FBQUEsQ0FBQUEsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUEsV0FBQSxFQUFjLEVBQUUsQ0FBQSx3REFBQSxDQUEwRCxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pILE9BQU87QUFDVixTQUFBO1FBRUQsSUFBSSxFQUFFLEtBQUssTUFBTSxFQUFFO1lBQ2YsT0FBTztBQUNWLFNBQUE7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFN0IsUUFBQSxNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDM0UsUUFBQSxJQUFJLE1BQU0sSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUU7QUFDM0IsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlBLFdBQVUsQ0FBQSxVQUFBLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQSxtQkFBQSxFQUFzQixFQUFFLENBQWdDLDZCQUFBLEVBQUEsTUFBTSxDQUFJLEVBQUEsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pHLE9BQU87QUFDVixTQUFBO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVwQyxRQUFBLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7QUFDbEMsS0FBQTtBQUVEOzs7Ozs7O0FBT0c7QUFDSCxJQUFBLFdBQVcsQ0FBQyxFQUFVLEVBQUE7UUFDbEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNSLFlBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJQSxXQUFBQSxDQUFBQSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQSxrQ0FBQSxFQUFxQyxFQUFFLENBQUEsRUFBQSxDQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEYsT0FBTztBQUNWLFNBQUE7QUFFRCxRQUFBLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFN0IsUUFBQSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBQy9CLFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDckIsUUFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNoQyxRQUFBLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QixRQUFBLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xDLFFBQUEsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbkMsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO0FBQ2hCLFlBQUEsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUIsU0FBQTtBQUNKLEtBQUE7QUFFRDs7Ozs7QUFLRztBQUNILElBQUEsUUFBUSxDQUFDLEVBQVUsRUFBQTtBQUNmLFFBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzNCLEtBQUE7QUFFRDs7Ozs7QUFLRztBQUNILElBQUEsUUFBUSxDQUFDLEVBQVUsRUFBQTtBQUNmLFFBQUEsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUM3QixLQUFBO0FBRUQsSUFBQSxpQkFBaUIsQ0FBQyxPQUFlLEVBQUUsT0FBdUIsRUFBRSxPQUF1QixFQUFBO1FBQy9FLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDUixZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUEsV0FBQUEsQ0FBQUEsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUEsaURBQUEsRUFBb0QsT0FBTyxDQUFBLEVBQUEsQ0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RHLE9BQU87QUFDVixTQUFBO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLE9BQU87WUFBRSxPQUFPO1FBRW5FLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUNqQixZQUFBLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQzNCLFNBQUE7UUFDRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7QUFDakIsWUFBQSxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMzQixTQUFBO0FBQ0QsUUFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLEtBQUE7QUFFRCxJQUFBLFNBQVMsQ0FBQyxPQUFlLEVBQUUsTUFBbUMsRUFBRyxPQUFBLEdBQThCLEVBQUUsRUFBQTtRQUM3RixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ1IsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlBLFdBQUFBLENBQUFBLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFBLGtDQUFBLEVBQXFDLE9BQU8sQ0FBQSxFQUFBLENBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RixPQUFPO0FBQ1YsU0FBQTtRQUVELElBQUlzRSxXQUFBQSxDQUFBQSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNqQyxPQUFPO0FBQ1YsU0FBQTtBQUVELFFBQUEsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7QUFDekMsWUFBQSxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUN6QixZQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekIsT0FBTztBQUNWLFNBQUE7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM1RCxXQUFBQSxDQUFBQSxhQUFhLENBQUMsTUFBTSxFQUFFLENBQVUsT0FBQSxFQUFBLEtBQUssQ0FBQyxFQUFFLENBQUEsT0FBQSxDQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRTtZQUMxRixPQUFPO0FBQ1YsU0FBQTtBQUVELFFBQUEsS0FBSyxDQUFDLE1BQU0sR0FBR2xPLG1CQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0IsUUFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLEtBQUE7QUFFRDs7OztBQUlHO0FBQ0gsSUFBQSxTQUFTLENBQUMsS0FBYSxFQUFBO1FBQ25CLE9BQU9BLFdBQUFBLENBQUFBLE9BQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzdDLEtBQUE7SUFFRCxpQkFBaUIsQ0FBQyxPQUFlLEVBQUUsSUFBWSxFQUFFLEtBQVUsRUFBRyxPQUE4QixHQUFBLEVBQUUsRUFBQTtRQUMxRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ1IsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUl3TixXQUFBQSxDQUFBQSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQSxpQ0FBQSxFQUFvQyxPQUFPLENBQUEsRUFBQSxDQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEYsT0FBTztBQUNWLFNBQUE7UUFFRCxJQUFJc0UsV0FBQUEsQ0FBQUEsU0FBUyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBRTVELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzlDLFFBQUEsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QixLQUFBO0FBRUQ7Ozs7O0FBS0c7QUFDSCxJQUFBLGlCQUFpQixDQUFDLE9BQWUsRUFBRSxJQUFZLEVBQUE7UUFDM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ1IsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUl0RSxXQUFBQSxDQUFBQSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQSx3Q0FBQSxFQUEyQyxPQUFPLENBQUEsRUFBQSxDQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0YsT0FBTztBQUNWLFNBQUE7QUFFRCxRQUFBLE9BQU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hDLEtBQUE7SUFFRCxnQkFBZ0IsQ0FBQyxPQUFlLEVBQUUsSUFBWSxFQUFFLEtBQVUsRUFBRSxPQUE4QixHQUFBLEVBQUUsRUFBQTtRQUN4RixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ1IsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlBLFdBQUFBLENBQUFBLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFBLGlDQUFBLEVBQW9DLE9BQU8sQ0FBQSxFQUFBLENBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RixPQUFPO0FBQ1YsU0FBQTtRQUVELElBQUlzRSxXQUFBQSxDQUFBQSxTQUFTLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQztZQUFFLE9BQU87QUFFM0QsUUFBQSxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RFLFFBQUEsSUFBSSxnQkFBZ0IsRUFBRTtBQUNsQixZQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUIsU0FBQTtBQUVELFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDckIsUUFBQSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzNDLEtBQUE7QUFFRCxJQUFBLGdCQUFnQixDQUFDLEtBQWEsRUFBRSxJQUFZLEVBQUE7UUFDeEMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RELEtBQUE7QUFFRCxJQUFBLGVBQWUsQ0FBQyxNQUF5QixFQUFFLEtBQVUsRUFBQTtRQUNqRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDcEIsUUFBQSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQy9CLFFBQUEsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUN2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWhELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtBQUMzQixZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSXRFLFdBQUFBLENBQUFBLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFBLFlBQUEsRUFBZSxRQUFRLENBQUEsb0NBQUEsQ0FBc0MsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRyxPQUFPO0FBQ1YsU0FBQTtRQUNELE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUM7QUFDaEQsUUFBQSxJQUFJLFVBQVUsS0FBSyxTQUFTLElBQUksV0FBVyxFQUFFO0FBQ3pDLFlBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJQSxXQUFVLENBQUEsVUFBQSxDQUFDLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdGLE9BQU87QUFDVixTQUFBO0FBQ0QsUUFBQSxJQUFJLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxXQUFXLEVBQUU7QUFDekMsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlBLFdBQVUsQ0FBQSxVQUFBLENBQUMsSUFBSSxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUcsT0FBTztBQUNWLFNBQUE7QUFDRCxRQUFBLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUU7QUFDekIsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlBLFdBQVUsQ0FBQSxVQUFBLENBQUMsSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEYsU0FBQTtRQUVELFdBQVcsQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUQsS0FBQTtBQUVELElBQUEsa0JBQWtCLENBQUMsTUFBeUIsRUFBRSxHQUFZLEVBQUE7UUFDdEQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ3BCLFFBQUEsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWhELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtBQUMzQixZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSUEsV0FBQUEsQ0FBQUEsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUEsWUFBQSxFQUFlLFFBQVEsQ0FBQSxvQ0FBQSxDQUFzQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLE9BQU87QUFDVixTQUFBO1FBRUQsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQztBQUNoRCxRQUFBLE1BQU0sV0FBVyxHQUFHLFVBQVUsS0FBSyxRQUFRLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7QUFFN0UsUUFBQSxJQUFJLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxXQUFXLEVBQUU7QUFDekMsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlBLFdBQVUsQ0FBQSxVQUFBLENBQUMsSUFBSSxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUcsT0FBTztBQUNWLFNBQUE7QUFFRCxRQUFBLElBQUksR0FBRyxLQUFLLE9BQU8sTUFBTSxDQUFDLEVBQUUsS0FBSyxRQUFRLElBQUksT0FBTyxNQUFNLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxFQUFFO0FBQ3pFLFlBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJQSxXQUFVLENBQUEsVUFBQSxDQUFDLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hHLE9BQU87QUFDVixTQUFBO1FBRUQsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQy9ELEtBQUE7QUFFRCxJQUFBLGVBQWUsQ0FBQyxNQUF5QixFQUFBO1FBQ3JDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUNwQixRQUFBLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDL0IsUUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFaEQsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO0FBQzNCLFlBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJQSxXQUFBQSxDQUFBQSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQSxZQUFBLEVBQWUsUUFBUSxDQUFBLG9DQUFBLENBQXNDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEcsT0FBTztBQUNWLFNBQUE7UUFDRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDO0FBQ2hELFFBQUEsSUFBSSxVQUFVLEtBQUssUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQ3pDLFlBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJQSxXQUFVLENBQUEsVUFBQSxDQUFDLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVHLE9BQU87QUFDVixTQUFBO0FBQ0QsUUFBQSxJQUFJLE1BQU0sQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFO0FBQ3pCLFlBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJQSxXQUFVLENBQUEsVUFBQSxDQUFDLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RGLFNBQUE7UUFFRCxPQUFPLFdBQVcsQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM5RCxLQUFBO0FBRUQsSUFBQSxhQUFhLEdBQUE7UUFDVCxPQUFPek4sV0FBQUEsQ0FBQUEsTUFBTSxDQUFDLEVBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzNGLEtBQUE7QUFFRCxJQUFBLFNBQVMsR0FBQTtBQUNMLFFBQUEsT0FBT2dTLHdCQUFZLENBQUM7QUFDaEIsWUFBQSxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPO0FBQ2hDLFlBQUEsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSTtBQUMxQixZQUFBLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVE7QUFDbEMsWUFBQSxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLO0FBQzVCLFlBQUEsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTTtBQUM5QixZQUFBLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUk7QUFDMUIsWUFBQSxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPO0FBQ2hDLFlBQUEsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSztBQUM1QixZQUFBLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU07QUFDOUIsWUFBQSxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO0FBQzlCLFlBQUEsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVTtBQUN0QyxZQUFBLE9BQU8sRUFBRWpHLFdBQVMsQ0FBQSxTQUFBLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckUsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzdDLFNBQUEsRUFBRSxDQUFDLEtBQUssS0FBTyxFQUFBLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsRCxLQUFBO0FBRUQsSUFBQSxZQUFZLENBQUMsS0FBaUIsRUFBQTtRQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckMsUUFBQSxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7O0FBRW5ELFlBQUEsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMvRCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUM7WUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDM0MsU0FBQTtBQUNELFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDeEIsS0FBQTtBQUVELElBQUEsK0JBQStCLENBQUMsYUFBa0csRUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQjlILFFBQUEsTUFBTSxTQUFTLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDO1FBRTdFLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUN0QixNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDdEIsUUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsWUFBQSxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNwQixnQkFBQSxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLGdCQUFBLEtBQUssTUFBTSxZQUFZLElBQUksYUFBYSxFQUFFO0FBQ3RDLG9CQUFBLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1QyxvQkFBQSxJQUFJLGFBQWEsRUFBRTtBQUNmLHdCQUFBLEtBQUssTUFBTSxjQUFjLElBQUksYUFBYSxFQUFFO0FBQ3hDLDRCQUFBLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDbkMseUJBQUE7QUFDSixxQkFBQTtBQUNKLGlCQUFBO0FBQ0osYUFBQTtBQUNKLFNBQUE7QUFFRCxRQUFBLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFJO0FBQ3JCLFlBQUEsT0FBTyxDQUFDLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUM7QUFDN0MsU0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDcEIsUUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFL0IsWUFBQSxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTs7QUFFcEIsZ0JBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUM3QyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO29CQUN4QyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7d0JBQUUsTUFBTTtBQUM5QyxvQkFBQSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUN6QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsaUJBQUE7QUFDSixhQUFBO0FBQU0saUJBQUE7QUFDSCxnQkFBQSxLQUFLLE1BQU0sWUFBWSxJQUFJLGFBQWEsRUFBRTtBQUN0QyxvQkFBQSxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDNUMsb0JBQUEsSUFBSSxhQUFhLEVBQUU7QUFDZix3QkFBQSxLQUFLLE1BQU0sY0FBYyxJQUFJLGFBQWEsRUFBRTtBQUN4Qyw0QkFBQSxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6Qyx5QkFBQTtBQUNKLHFCQUFBO0FBQ0osaUJBQUE7QUFDSixhQUFBO0FBQ0osU0FBQTtBQUVELFFBQUEsT0FBTyxRQUFRLENBQUM7QUFDbkIsS0FBQTtBQUVELElBQUEscUJBQXFCLENBQUMsYUFBa0IsRUFBRSxNQUFXLEVBQUUsU0FBb0IsRUFBQTtBQUN2RSxRQUFBLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7QUFDekIsWUFBQSxJQUFJLENBQUMsU0FBUyxDQUFDb0MsV0FBYSxDQUFBLGFBQUEsQ0FBQyxNQUFNLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDckcsU0FBQTtRQUVELE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUMzQixRQUFBLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQy9CLGdCQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSVYsV0FBVSxDQUFBLFVBQUEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxnQkFBQSxPQUFPLEVBQUUsQ0FBQztBQUNiLGFBQUE7QUFDRCxZQUFBLEtBQUssTUFBTSxPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtnQkFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLEtBQUssRUFBRTs7QUFFUixvQkFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlBLFdBQUFBLENBQUFBLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFBLFdBQUEsRUFBYyxPQUFPLENBQUEsdUVBQUEsQ0FBeUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNySSxvQkFBQSxPQUFPLEVBQUUsQ0FBQztBQUNiLGlCQUFBO0FBQ0QsZ0JBQUEsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDeEMsYUFBQTtBQUNKLFNBQUE7UUFFRCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFFekIsUUFBQSxNQUFNLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztBQUUvQyxRQUFBLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNoQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO2dCQUFFLFNBQVM7WUFDcEQsYUFBYSxDQUFDLElBQUksQ0FDZCxxQkFBcUIsQ0FDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDckIsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLGFBQWEsRUFDYixNQUFNLEVBQ04sU0FBUyxDQUFDLENBQ2pCLENBQUM7QUFDTCxTQUFBO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFOzs7QUFHaEIsWUFBQSxhQUFhLENBQUMsSUFBSSxDQUNkLG9CQUFvQixDQUNoQixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLFlBQVksRUFDakIsYUFBYSxFQUNiLE1BQU0sRUFDTixJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUN4QyxDQUFDO0FBQ0wsU0FBQTtBQUVELFFBQUEsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDOUQsS0FBQTtBQUVELElBQUEsbUJBQW1CLENBQ2YsUUFBZ0IsRUFDaEIsTUFJQyxFQUFBO0FBRUQsUUFBQSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQ3pCLFlBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQ1UsV0FBYSxDQUFBLGFBQUEsQ0FBQyxNQUFNLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbkcsU0FBQTtRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEQsUUFBQSxPQUFPLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3RFLEtBQUE7QUFFRCxJQUFBLGFBQWEsQ0FBQyxJQUFZLEVBQUUsVUFBdUIsRUFBRSxRQUF3QixFQUFBO0FBQ3pFLFFBQUEsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzNCLFlBQUEsT0FBTyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQSxzQkFBQSxFQUF5QixJQUFJLENBQUEsaUJBQUEsQ0FBbUIsQ0FBQyxDQUFDLENBQUM7QUFDaEYsU0FBQTtBQUVELFFBQUEsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFFdEMsUUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRTtBQUM3QixZQUFBLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQixTQUFBO0FBRUQsUUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRTtZQUMxQyxJQUFJO1lBQ0osR0FBRyxFQUFFLFVBQVUsQ0FBQyxlQUFlO1NBQ2xDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDaEIsS0FBQTtBQUVELElBQUEsUUFBUSxHQUFBO0FBQ0osUUFBQSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDaEMsS0FBQTtBQUVELElBQUEsUUFBUSxDQUFDLFlBQWdDLEVBQUUsT0FBQSxHQUE4QixFQUFFLEVBQUE7UUFDdkUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ3BCLFFBQUEsS0FBSyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUU7QUFDNUIsWUFBQSxJQUFJLENBQUM0RCxXQUFTLENBQUEsU0FBQSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDM0MsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDZixNQUFNO0FBQ1QsYUFBQTtBQUNKLFNBQUE7QUFDRCxRQUFBLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztBQUVyQixRQUFBLE1BQU0sVUFBVSxHQUFHO0FBQ2YsWUFBQSxHQUFHLEVBQUVqUSxXQUFPLENBQUEsUUFBQSxDQUFDLEdBQUcsRUFBRTtZQUNsQixVQUFVLEVBQUU5QixrQkFBTSxDQUFDO0FBQ2YsZ0JBQUEsUUFBUSxFQUFFLEdBQUc7QUFDYixnQkFBQSxLQUFLLEVBQUUsQ0FBQztBQUNYLGFBQUEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztTQUNqQyxDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzNDLFFBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM1QyxLQUFBO0FBRUQsSUFBQSxTQUFTLENBQUMsUUFBbUIsRUFBRSxHQUFXLEVBQUUsS0FBVSxFQUFFLEtBQVUsRUFBRSxPQUFBLEdBRWhFLEVBQUUsRUFBQTtBQUNGLFFBQUEsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7QUFDdkMsWUFBQSxPQUFPLEtBQUssQ0FBQztBQUNoQixTQUFBO1FBQ0QsT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQ21PLFdBQUFBLENBQUFBLGFBQWEsRUFBRW5PLFdBQUFBLENBQUFBLE1BQU0sQ0FBQztZQUNsRSxHQUFHO0FBQ0gsWUFBQSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN2QixLQUFLO3VCQUNMZ0MsV0FBUyxDQUFBLElBQUE7QUFDWixTQUFBLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsS0FBQTtBQUVELElBQUEsT0FBTyxHQUFBO1FBQ0gsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO0FBQ2YsWUFBQSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3ZCLFlBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDeEIsU0FBQTtRQUNELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtBQUNyQixZQUFBLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDN0IsWUFBQSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztBQUM5QixTQUFBO1FBQ0RpUSxXQUFvQixDQUFBLE9BQUEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDM0UsUUFBQSxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEMsTUFBTSxLQUFLLEdBQWUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoRCxZQUFBLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxTQUFBO0FBQ0QsUUFBQSxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDaEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQyxZQUFBLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxZQUFBLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLFNBQUE7QUFDRCxRQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsUUFBQSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUIsUUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQzVCLEtBQUE7QUFFRCxJQUFBLFlBQVksQ0FBQyxFQUFVLEVBQUE7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUN0QyxLQUFBO0FBRUQsSUFBQSxhQUFhLENBQUMsRUFBVSxFQUFBO1FBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNsQyxLQUFBO0FBRUQsSUFBQSxjQUFjLENBQUMsU0FBb0IsRUFBQTtBQUMvQixRQUFBLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMzQyxTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsdUJBQXVCLEdBQUE7QUFDbkIsUUFBQSxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7QUFDaEMsWUFBQSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLFNBQUE7QUFDSixLQUFBO0FBRUQsSUFBQSxnQkFBZ0IsQ0FBQyxTQUFvQixFQUFFLGtCQUEyQixFQUFFLFlBQW9CLEVBQUUscUJBQThCLEVBQUUsa0JBQUEsR0FBOEIsS0FBSyxFQUFBO1FBQ3pKLElBQUksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBRS9CLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUV0QixRQUFBLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUMvQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLFlBQUEsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLFFBQVE7Z0JBQUUsU0FBUztBQUUzQyxZQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDekQsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0FBQzdELHFCQUFBLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLHFCQUFBLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsSCxhQUFBO1lBRUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEksWUFBQSxvQkFBb0IsR0FBRyxvQkFBb0IsSUFBSSxtQkFBbUIsQ0FBQztBQUN0RSxTQUFBO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzs7Ozs7OztRQVF6RCxrQkFBa0IsR0FBRyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQztBQUV6RixRQUFBLElBQUksa0JBQWtCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUNuUSxvQkFBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ3BKLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdEssWUFBQSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0FBQ25DLFNBQUE7QUFFRCxRQUFBLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxFQUFFOzs7OztBQUtsQyxZQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDN0IsU0FBQTtBQUFNLGFBQUE7QUFDSCxZQUFBLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFFakYsWUFBQSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsRUFBRTtBQUNsQyxnQkFBQSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUNBLFdBQU8sQ0FBQSxRQUFBLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDL0Qsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBQzdCLGFBQUE7QUFFRCxZQUFBLElBQUksb0JBQW9CLEVBQUU7Ozs7QUFJdEIsZ0JBQUEsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNoRCxhQUFBO0FBQ0osU0FBQTtRQUVELElBQUksa0JBQWtCLElBQUksb0JBQW9CLEVBQUU7QUFDNUMsWUFBQSxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQy9CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsZ0JBQUEsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLFFBQVE7b0JBQUUsU0FBUztBQUMzQyxnQkFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDbEYsYUFBQTtBQUNKLFNBQUE7O1FBR0QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUNBLG9CQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN4RyxRQUFBLE9BQU8sYUFBYSxDQUFDO0FBQ3hCLEtBQUE7QUFFRCxJQUFBLHVCQUF1QixHQUFBO0FBQ25CLFFBQUEsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztBQUNsRCxTQUFBO0FBQ0osS0FBQTs7QUFJRCxJQUFBLFNBQVMsQ0FDTCxLQUFhLEVBQ2IsTUFLQyxFQUNELFFBQTZDLEVBQUE7UUFFN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQzs7Ozs7Ozs7O1FBVXBELElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBRXBDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JELFFBQUEsSUFBSSxXQUFXLEVBQUU7QUFDYixZQUFBLFdBQVcsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0UsU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLFNBQVMsQ0FDTCxLQUFhLEVBQ2IsTUFBOEMsRUFDOUMsUUFBNEQsRUFBQTtRQUU1RCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3hELEtBQUE7QUFFRCxJQUFBLFdBQVcsQ0FBQyxLQUFhLEVBQUUsTUFBeUIsRUFBRSxRQUErQixFQUFBO0FBQ2pGLFFBQUEsT0FBT29RLFdBQVcsQ0FBQSxXQUFBLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLEtBQUE7QUFDSixDQUFBO0FBRUQsS0FBSyxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7QUFDcEMsS0FBSyxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7QUFDcEMsS0FBSyxDQUFDLDRCQUE0QixHQUFHQyxXQUE0QixDQUFBLDRCQUFBLENBQUE7O0FDOTJDakUsSUFBQSxhQUFBLEdBQWU1RCx3QkFBWSxDQUFDO0lBQ3hCLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUM7QUFDaEQsQ0FBQSxDQUFDLENBQUE7O0FDSkY7QUFDQSxJQUFBLFdBQUEsR0FBZSw2TEFBNkwsQ0FBQTs7QUNENU07QUFDQSxJQUFBLFdBQUEsR0FBZSxrdkNBQWt2QyxDQUFBOztBQ0Rqd0M7QUFDQSxJQUFBLGNBQUEsR0FBZSwwSkFBMEosQ0FBQTs7QUNEeks7QUFDQSxJQUFBLGNBQUEsR0FBZSxnR0FBZ0csQ0FBQTs7QUNEL0c7QUFDQSxJQUFBLHFCQUFBLEdBQWUseXBCQUF5cEIsQ0FBQTs7QUNEeHFCO0FBQ0EsSUFBQSxxQkFBQSxHQUFlLCtrQkFBK2tCLENBQUE7O0FDRDlsQjtBQUNBLElBQUEsVUFBQSxHQUFlLHFwQ0FBcXBDLENBQUE7O0FDRHBxQztBQUNBLElBQUEsVUFBQSxHQUFlLGd0REFBZ3RELENBQUE7O0FDRC90RDtBQUNBLElBQUEsZ0JBQUEsR0FBZSx1Q0FBdUMsQ0FBQTs7QUNEdEQ7QUFDQSxJQUFBLGdCQUFBLEdBQWUsZ0dBQWdHLENBQUE7O0FDRC9HO0FBQ0EsSUFBQSxXQUFBLEdBQWUsMFlBQTBZLENBQUE7O0FDRHpaO0FBQ0EsSUFBQSxXQUFBLEdBQWUsbXJCQUFtckIsQ0FBQTs7QUNEbHNCO0FBQ0EsSUFBQSxrQkFBQSxHQUFlLGlTQUFpUyxDQUFBOztBQ0RoVDtBQUNBLElBQUEsa0JBQUEsR0FBZSxvTEFBb0wsQ0FBQTs7QUNEbk07QUFDQSxJQUFBLGdCQUFBLEdBQWUsK05BQStOLENBQUE7O0FDRDlPO0FBQ0EsSUFBQSxnQkFBQSxHQUFlLHVxQkFBdXFCLENBQUE7O0FDRHRyQjtBQUNBLElBQUEsbUJBQUEsR0FBZSwyZUFBMmUsQ0FBQTs7QUNEMWY7QUFDQSxJQUFBLG1CQUFBLEdBQWUsMDFDQUEwMUMsQ0FBQTs7QUNEejJDO0FBQ0EsSUFBQSxTQUFBLEdBQWUsOExBQThMLENBQUE7O0FDRDdNO0FBQ0EsSUFBQSxTQUFBLEdBQWUsa0xBQWtMLENBQUE7O0FDRGpNO0FBQ0EsSUFBQSxRQUFBLEdBQWUsMlJBQTJSLENBQUE7O0FDRDFTO0FBQ0EsSUFBQSxRQUFBLEdBQWUsb1JBQW9SLENBQUE7O0FDRG5TO0FBQ0EsSUFBQSxlQUFBLEdBQWUsa2FBQWthLENBQUE7O0FDRGpiO0FBQ0EsSUFBQSxlQUFBLEdBQWUsaVlBQWlZLENBQUE7O0FDRGhaO0FBQ0EsSUFBQSxzQkFBQSxHQUFlLDRoQ0FBNGhDLENBQUE7O0FDRDNpQztBQUNBLElBQUEsc0JBQUEsR0FBZSx3MUNBQXcxQyxDQUFBOztBQ0R2MkM7QUFDQSxJQUFBLGVBQUEsR0FBZSwrOUJBQSs5QixDQUFBOztBQ0Q5K0I7QUFDQSxJQUFBLGVBQUEsR0FBZSx1d0NBQXV3QyxDQUFBOztBQ0R0eEM7QUFDQSxJQUFBLGlCQUFBLEdBQWUsd0hBQXdILENBQUE7O0FDRHZJO0FBQ0EsSUFBQSxpQkFBQSxHQUFlLG82Q0FBbzZDLENBQUE7O0FDRG43QztBQUNBLElBQUEsd0JBQUEsR0FBZSw2d0NBQTZ3QyxDQUFBOztBQ0Q1eEM7QUFDQSxJQUFBLHdCQUFBLEdBQWUsb3hFQUFveEUsQ0FBQTs7QUNEbnlFO0FBQ0EsSUFBQSxvQkFBQSxHQUFlLDJwQ0FBMnBDLENBQUE7O0FDRDFxQztBQUNBLElBQUEsb0JBQUEsR0FBZSxxU0FBcVMsQ0FBQTs7QUNEcFQ7QUFDQSxJQUFBLGFBQUEsR0FBZSx3akNBQXdqQyxDQUFBOztBQ0R2a0M7QUFDQSxJQUFBLGFBQUEsR0FBZSwyS0FBMkssQ0FBQTs7QUNEMUw7QUFDQSxJQUFBLFFBQUEsR0FBZSx3cEJBQXdwQixDQUFBOztBQ0R2cUI7QUFDQSxJQUFBLFFBQUEsR0FBZSxrNURBQWs1RCxDQUFBOztBQ0RqNkQ7QUFDQSxJQUFBLGdCQUFBLEdBQWUsdXBCQUF1cEIsQ0FBQTs7QUNEdHFCO0FBQ0EsSUFBQSxnQkFBQSxHQUFlLDQrREFBNCtELENBQUE7O0FDRDMvRDtBQUNBLElBQUEsZUFBQSxHQUFlLDZwRUFBNnBFLENBQUE7O0FDRDVxRTtBQUNBLElBQUEsZUFBQSxHQUFlLHc2RUFBdzZFLENBQUE7O0FDRHY3RTtBQUNBLElBQUEsV0FBQSxHQUFlLDJwQ0FBMnBDLENBQUE7O0FDRDFxQztBQUNBLElBQUEsV0FBQSxHQUFlLDIxRUFBMjFFLENBQUE7O0FDRDEyRTtBQUNBLElBQUEsVUFBQSxHQUFlLHVpQ0FBdWlDLENBQUE7O0FDRHRqQztBQUNBLElBQUEsVUFBQSxHQUFlLDZWQUE2VixDQUFBOztBQ0Q1VztBQUNBLElBQUEsY0FBQSxHQUFlLDhVQUE4VSxDQUFBOztBQ0Q3VjtBQUNBLElBQUEsY0FBQSxHQUFlLGdnRkFBZ2dGLENBQUE7O0FDRC9nRjtBQUNBLElBQUEsYUFBQSxHQUFlLHM0Q0FBczRDLENBQUE7O0FDRHI1QztBQUNBLElBQUEsYUFBQSxHQUFlLGc2RkFBZzZGLENBQUE7O0FDRC82RjtBQUNBLElBQUEscUJBQUEsR0FBZSxpbkRBQWluRCxDQUFBOztBQ0Rob0Q7QUFDQSxJQUFBLHFCQUFBLEdBQWUsZzdGQUFnN0YsQ0FBQTs7QUNvRC83RixJQUFlLE9BQUEsR0FBQTtBQUNYLElBQUEsT0FBTyxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDO0FBQzFDLElBQUEsVUFBVSxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDO0FBQ25ELElBQUEsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDO0FBQ3hFLElBQUEsTUFBTSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDO0FBQ3ZDLElBQUEsWUFBWSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQztBQUN6RCxJQUFBLE9BQU8sRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztBQUMxQyxJQUFBLGNBQWMsRUFBRSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7QUFDL0QsSUFBQSxZQUFZLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDO0FBQ3pELElBQUEsZUFBZSxFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQztBQUNsRSxJQUFBLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztBQUNwQyxJQUFBLElBQUksRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztBQUNqQyxJQUFBLFdBQVcsRUFBRSxPQUFPLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztBQUN0RCxJQUFBLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxzQkFBc0IsQ0FBQztBQUMzRSxJQUFBLFdBQVcsRUFBRSxPQUFPLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztBQUN0RCxJQUFBLGFBQWEsRUFBRSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7QUFDNUQsSUFBQSxvQkFBb0IsRUFBRSxPQUFPLENBQUMsd0JBQXdCLEVBQUUsd0JBQXdCLENBQUM7QUFDakYsSUFBQSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUM7QUFDckUsSUFBQSxTQUFTLEVBQUUsT0FBTyxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUM7QUFDaEQsSUFBQSxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7QUFDakMsSUFBQSxZQUFZLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDO0FBQ3pELElBQUEsV0FBVyxFQUFFLE9BQU8sQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDO0FBQ3RELElBQUEsT0FBTyxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDO0FBQzFDLElBQUEsTUFBTSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDO0FBQ3ZDLElBQUEsVUFBVSxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDO0FBQ25ELElBQUEsU0FBUyxFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDO0FBQ2hELElBQUEsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDO0NBQzNFLENBQUM7QUFFRjtBQUVBLFNBQVMsT0FBTyxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUE7SUFDekMsTUFBTSxFQUFFLEdBQUcsa0RBQWtELENBQUM7SUFFOUQsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDMUUsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDeEYsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0FBQ3BGLElBQUEsTUFBTSxjQUFjLEdBQUcsY0FBYyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztJQUVuRyxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFFM0IsSUFBQSxjQUFjLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxLQUFJO0FBQ3BGLFFBQUEsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLFNBQVMsS0FBSyxRQUFRLEVBQUU7QUFDeEIsWUFBQSxPQUFPLENBQUE7QUFDSyxzQkFBQSxFQUFBLElBQUksQ0FBQTtVQUNsQixTQUFTLENBQUEsQ0FBQSxFQUFJLElBQUksQ0FBQSxDQUFBLEVBQUksSUFBSSxDQUFBOztVQUV6QixTQUFTLENBQUEsQ0FBQSxFQUFJLElBQUksQ0FBQSxHQUFBLEVBQU0sSUFBSSxDQUFBOztDQUVwQyxDQUFDO0FBQ08sU0FBQTtBQUFNLG1EQUFzQztBQUN6QyxZQUFBLE9BQU8sQ0FBQTtBQUNJLHFCQUFBLEVBQUEsSUFBSSxDQUFBO0FBQ3JCLElBQUEsRUFBQSxTQUFTLENBQUksQ0FBQSxFQUFBLElBQUksQ0FBSSxDQUFBLEVBQUEsSUFBSSxDQUFRLEtBQUEsRUFBQSxJQUFJLENBQUE7O0NBRTFDLENBQUM7QUFDTyxTQUFBO0FBQ0wsS0FBQyxDQUFDLENBQUM7QUFFSCxJQUFBLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEtBQUk7QUFDaEYsUUFBQSxNQUFNLFFBQVEsR0FBRyxJQUFJLEtBQUssT0FBTyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDcEQsUUFBQSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFFNUQsUUFBQSxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2QixJQUFJLFNBQVMsS0FBSyxRQUFRLEVBQUU7QUFDeEIsZ0JBQUEsT0FBTyxDQUFBO0FBQ0Msc0JBQUEsRUFBQSxJQUFJLENBQUE7QUFDTCxxQkFBQSxFQUFBLElBQUksQ0FBQTtZQUNmLFNBQVMsQ0FBQSxDQUFBLEVBQUksUUFBUSxDQUFBLEdBQUEsRUFBTSxJQUFJLENBQUE7VUFDakMsU0FBUyxDQUFBLENBQUEsRUFBSSxJQUFJLENBQUEsQ0FBQSxFQUFJLElBQUksQ0FBQTs7VUFFekIsU0FBUyxDQUFBLENBQUEsRUFBSSxJQUFJLENBQUEsR0FBQSxFQUFNLElBQUksQ0FBQTs7Q0FFcEMsQ0FBQztBQUNXLGFBQUE7QUFBTSx1REFBc0M7Z0JBQ3pDLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRTs7QUFFdkIsb0JBQUEsT0FBTyxDQUFBO0FBQ0gsc0JBQUEsRUFBQSxJQUFJLENBQUE7QUFDdEIsSUFBQSxFQUFBLElBQUksQ0FBUSxLQUFBLEVBQUEsSUFBSSxDQUFBOztBQUVoQixJQUFBLEVBQUEsU0FBUyxDQUFJLENBQUEsRUFBQSxJQUFJLENBQUksQ0FBQSxFQUFBLElBQUksQ0FBUSxLQUFBLEVBQUEsSUFBSSxDQUFBOztDQUUxQyxDQUFDO0FBQ2UsaUJBQUE7QUFBTSxxQkFBQTtBQUNILG9CQUFBLE9BQU8sQ0FBQTtBQUNILHNCQUFBLEVBQUEsSUFBSSxDQUFBO0FBQ3RCLElBQUEsRUFBQSxJQUFJLENBQWlCLGNBQUEsRUFBQSxVQUFVLENBQU0sR0FBQSxFQUFBLElBQUksQ0FBTyxJQUFBLEVBQUEsSUFBSSxDQUFBOztBQUVwRCxJQUFBLEVBQUEsU0FBUyxDQUFJLENBQUEsRUFBQSxJQUFJLENBQUksQ0FBQSxFQUFBLElBQUksQ0FBUSxLQUFBLEVBQUEsSUFBSSxDQUFBOztDQUUxQyxDQUFDO0FBQ2UsaUJBQUE7QUFDSixhQUFBO0FBQ0osU0FBQTtBQUFNLGFBQUE7WUFDSCxJQUFJLFNBQVMsS0FBSyxRQUFRLEVBQUU7QUFDeEIsZ0JBQUEsT0FBTyxDQUFBO0FBQ0Msc0JBQUEsRUFBQSxJQUFJLENBQUE7QUFDTCxxQkFBQSxFQUFBLElBQUksQ0FBQTtZQUNmLFNBQVMsQ0FBQSxDQUFBLEVBQUksUUFBUSxDQUFBLEdBQUEsRUFBTSxJQUFJLENBQUE7O1VBRWpDLFNBQVMsQ0FBQSxDQUFBLEVBQUksSUFBSSxDQUFBLEdBQUEsRUFBTSxJQUFJLENBQUE7O0NBRXBDLENBQUM7QUFDVyxhQUFBO0FBQU0sdURBQXNDO2dCQUN6QyxJQUFJLFVBQVUsS0FBSyxNQUFNLEVBQUU7O0FBRXZCLG9CQUFBLE9BQU8sQ0FBQTtBQUNILHNCQUFBLEVBQUEsSUFBSSxDQUFBO0FBQ3RCLElBQUEsRUFBQSxTQUFTLENBQUksQ0FBQSxFQUFBLElBQUksQ0FBSSxDQUFBLEVBQUEsSUFBSSxDQUFRLEtBQUEsRUFBQSxJQUFJLENBQUE7O0FBRXJDLElBQUEsRUFBQSxTQUFTLENBQUksQ0FBQSxFQUFBLElBQUksQ0FBSSxDQUFBLEVBQUEsSUFBSSxDQUFRLEtBQUEsRUFBQSxJQUFJLENBQUE7O0NBRTFDLENBQUM7QUFDZSxpQkFBQTtBQUFNLDJCQUFNO0FBQ1Qsb0JBQUEsT0FBTyxDQUFBO0FBQ0gsc0JBQUEsRUFBQSxJQUFJLENBQUE7QUFDdEIsSUFBQSxFQUFBLFNBQVMsQ0FBQSxDQUFBLEVBQUksSUFBSSxDQUFJLENBQUEsRUFBQSxJQUFJLENBQUEsY0FBQSxFQUFpQixVQUFVLENBQUEsR0FBQSxFQUFNLElBQUksQ0FBQSxJQUFBLEVBQU8sSUFBSSxDQUFBOztBQUV6RSxJQUFBLEVBQUEsU0FBUyxDQUFJLENBQUEsRUFBQSxJQUFJLENBQUksQ0FBQSxFQUFBLElBQUksQ0FBUSxLQUFBLEVBQUEsSUFBSSxDQUFBOztDQUUxQyxDQUFDO0FBQ2UsaUJBQUE7QUFDSixhQUFBO0FBQ0osU0FBQTtBQUNMLEtBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFDLENBQUM7QUFDNUUsQ0FBQTs7QUMvS0EsTUFBTSxpQkFBaUIsQ0FBQTtBQVduQixJQUFBLFdBQUEsR0FBQTtBQUNJLFFBQUEsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDekIsUUFBQSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLFFBQUEsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQUNsQyxRQUFBLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFDN0IsUUFBQSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFFBQUEsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztBQUNyQyxRQUFBLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ25CLEtBQUE7QUFFRCxJQUFBLElBQUksQ0FBQyxPQUFnQixFQUNqQixPQUFxQixFQUNyQixrQkFBZ0MsRUFDaEMsa0JBQXVDLEVBQ3ZDLFdBQWdDLEVBQ2hDLFlBQTRCLEVBQzVCLG1CQUF5QyxFQUN6QyxvQkFBMEMsRUFBQTtBQUUxQyxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBRXZCLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sS0FBSyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7QUFDM0YsUUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGtCQUFrQixJQUFJLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkUsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEtBQUssa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzNELGtCQUFrQixHQUFHLElBQUksQ0FBQztBQUM3QixhQUFBO0FBQ0osU0FBQTtBQUVELFFBQUEsTUFBTSxtQkFBbUIsSUFDckIsQ0FBQyxJQUFJLENBQUMsR0FBRztZQUNULElBQUksQ0FBQyxZQUFZLEtBQUssT0FBTztZQUM3QixJQUFJLENBQUMsdUJBQXVCLEtBQUssa0JBQWtCO1lBQ25ELGtCQUFrQjtZQUNsQixJQUFJLENBQUMsZ0JBQWdCLEtBQUssV0FBVztZQUNyQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssWUFBWTtZQUN2QyxJQUFJLENBQUMsd0JBQXdCLEtBQUssbUJBQW1CO0FBQ3JELFlBQUEsSUFBSSxDQUFDLHlCQUF5QixLQUFLLG9CQUFvQixDQUMxRCxDQUFDO0FBRUYsUUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixJQUFJLG1CQUFtQixFQUFFO0FBQ3RELFlBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQ3pJLFNBQUE7QUFBTSxhQUFBO1lBQ0gsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFekMsWUFBQSxJQUFJLG1CQUFtQixFQUFFOztnQkFFckIsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDOUIsYUFBQTtBQUVELFlBQUEsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLFdBQVcsRUFBRTtnQkFDeEMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3RCLGFBQUE7QUFFRCxZQUFBLElBQUksb0JBQW9CLEVBQUU7Z0JBQ3RCLG9CQUFvQixDQUFDLElBQUksRUFBRSxDQUFDO0FBQy9CLGFBQUE7QUFDSixTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsU0FBUyxDQUFDLE9BQXFCLEVBQzNCLGtCQUFnQyxFQUNoQyxrQkFBdUMsRUFDdkMsV0FBZ0MsRUFDaEMsWUFBNEIsRUFDNUIsbUJBQXlDLEVBQ3pDLG9CQUEwQyxFQUFBO0FBQzFDLFFBQUEsSUFBSSxpQkFBaUIsQ0FBQztBQUN0QixRQUFBLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUVoRCxRQUFBLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDN0IsUUFBQSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBRXRCLElBQUksT0FBTyxDQUFDLG9CQUFvQixFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLEdBQUc7Z0JBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDL0QsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDOztBQUd0QixZQUFBLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDO0FBQzVCLFlBQUEsSUFBSSxDQUFDLHVCQUF1QixHQUFHLGtCQUFrQixDQUFDO0FBQ2xELFlBQUEsSUFBSSxDQUFDLHVCQUF1QixHQUFHLGtCQUFrQixDQUFDO0FBQ2xELFlBQUEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztBQUNwQyxZQUFBLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUM7QUFDdEMsWUFBQSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsbUJBQW1CLENBQUM7QUFDcEQsWUFBQSxJQUFJLENBQUMseUJBQXlCLEdBQUcsb0JBQW9CLENBQUM7QUFFekQsU0FBQTtBQUFNLGFBQUE7QUFDSCxZQUFBLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLENBQUM7OztZQUl0RCxLQUFLLElBQUksQ0FBQyxHQUFHLGlCQUFpQixFQUFFLENBQUMsR0FBRyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsRUFBRTs7O0FBR3hELGdCQUFBbE8sa0JBQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDaEIsZ0JBQUEsRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLGFBQUE7QUFDSixTQUFBO0FBRUQsUUFBQSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDakQsUUFBQSxLQUFLLE1BQU0sWUFBWSxJQUFJLGtCQUFrQixFQUFFO0FBQzNDLFlBQUEsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM5QyxTQUFBO0FBRUQsUUFBQSxJQUFJLG1CQUFtQixFQUFFO0FBQ3JCLFlBQUEsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3JELFNBQUE7QUFDRCxRQUFBLElBQUksb0JBQW9CLEVBQUU7QUFDdEIsWUFBQSxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdEQsU0FBQTtRQUVELGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDdEUsUUFBQSxLQUFLLE1BQU0sWUFBWSxJQUFJLGtCQUFrQixFQUFFO1lBQzNDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQixZQUFZLENBQUMsdUJBQXVCLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNuRSxTQUFBO0FBRUQsUUFBQSxJQUFJLG1CQUFtQixFQUFFO1lBQ3JCLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNCLG1CQUFtQixDQUFDLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDMUUsU0FBQTtBQUNELFFBQUEsSUFBSSxXQUFXLEVBQUU7WUFDYixXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDdEIsU0FBQTtBQUNELFFBQUEsSUFBSSxvQkFBb0IsRUFBRTtZQUN0QixvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QixvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzNFLFNBQUE7QUFFRCxRQUFBLE9BQU8sQ0FBQyxvQkFBb0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxLQUFBO0FBRUQsSUFBQSxPQUFPLEdBQUE7UUFDSCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqRSxZQUFBLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ25CLFNBQUE7QUFDSixLQUFBO0FBQ0osQ0FBQTs7QUM1SUQsU0FBUyxpQ0FBaUMsQ0FBQyxLQUFvQixFQUFBO0lBQzNELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUVsQixJQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ25DLFFBQUEsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTtZQUFFLFNBQVM7UUFDaEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzVCLEtBQUE7QUFDRCxJQUFBLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFDRCxNQUFNLE9BQU8sQ0FBQTtBQVFULElBQUEsV0FBWSxDQUFBLE9BQWdCLEVBQ3hCLElBQVksRUFDWixNQUtDLEVBQ0QsYUFBbUMsRUFDbkMsYUFBc0QsRUFDdEQscUJBQThCLEVBQUE7QUFDOUIsUUFBQSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQ3RCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFbEMsTUFBTSxjQUFjLEdBQUcsaUNBQWlDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDbEYsUUFBQSxNQUFNLGVBQWUsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2pGLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFFM0QsUUFBQSxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxjQUFjLEdBQUcsaUNBQWlDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqSCxRQUFBLE1BQU0sbUJBQW1CLEdBQUcsYUFBYSxHQUFHLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7UUFFbkYsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkUsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzNCLFFBQUEsS0FBSyxNQUFNLE9BQU8sSUFBSSxXQUFXLEVBQUU7QUFDL0IsWUFBQSxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUFFLGdCQUFBLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0UsU0FBQTtBQUVELFFBQUEsTUFBTSxPQUFPLEdBQUcsYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0QsUUFBQSxJQUFJLHFCQUFxQixFQUFFO0FBQ3ZCLFlBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBQy9DLFNBQUE7UUFFRCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEcsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xHLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzNELFFBQUEsSUFBSSxFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUU7QUFDcEIsWUFBQSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixPQUFPO0FBQ1YsU0FBQTtBQUNELFFBQUEsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDaEQsUUFBQSxFQUFFLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ2pDLFFBQUFBLFdBQUFBLENBQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFTLENBQUMsQ0FBQztRQUMvRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFOUMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDdkQsUUFBQSxJQUFJLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRTtBQUNwQixZQUFBLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLE9BQU87QUFDVixTQUFBO0FBQ0QsUUFBQSxFQUFFLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztBQUM1QyxRQUFBLEVBQUUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDL0IsUUFBQUEsV0FBQUEsQ0FBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQVMsQ0FBQyxDQUFDO1FBQzNHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUU1QyxRQUFBLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBRTVCLFFBQUEsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO0FBRXhDLFFBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDekMsWUFBQSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNoQixnQkFBQSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLGFBQUE7QUFDSixTQUFBO0FBRUQsUUFBQSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QkEsV0FBTSxDQUFBLE1BQUEsQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQVMsQ0FBQyxDQUFDO0FBRTFHLFFBQUEsRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUM5QixRQUFBLEVBQUUsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFaEMsUUFBQSxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNoRCxZQUFBLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQyxZQUFBLElBQUksT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDdkMsZ0JBQUEsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckUsZ0JBQUEsSUFBSSxlQUFlLEVBQUU7QUFDakIsb0JBQUEsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEdBQUcsZUFBZSxDQUFDO0FBQy9DLGlCQUFBO0FBQ0osYUFBQTtBQUNKLFNBQUE7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUM5RCxRQUFBLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ25HLEtBQUE7QUFFRCxJQUFBLElBQUksQ0FBQyxPQUFnQixFQUNqQixRQUFrQixFQUNsQixTQUE4QixFQUM5QixXQUFrQyxFQUNsQyxTQUE4QixFQUM5QixZQUFvQyxFQUNwQyxhQUFnQyxFQUNoQyxPQUFlLEVBQ2Ysa0JBQWdDLEVBQ2hDLFdBQXdCLEVBQ3hCLFFBQXVCLEVBQ3ZCLGlCQUF1QixFQUN2QixJQUFvQixFQUNwQixhQUEyQyxFQUMzQyxtQkFBeUMsRUFDekMsb0JBQTBDLEVBQUE7QUFFMUMsUUFBQSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBRXRCLElBQUksSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPO1FBRWhDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsQyxRQUFBLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDaEMsUUFBQSxPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3BDLFFBQUEsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNoQyxRQUFBLE9BQU8sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFbEMsUUFBQSxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7QUFDbkMsWUFBQSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNyRCxTQUFBO0FBRUQsUUFBQSxJQUFJLGFBQWEsRUFBRTtBQUNmLFlBQUEsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxFQUFDLElBQUksRUFBRyxJQUFZLEVBQUMsQ0FBQyxDQUFDO0FBQ3JHLFNBQUE7QUFFRCxRQUFBLE1BQU0sYUFBYSxHQUFHO0FBQ2xCLFlBQUEsQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUM7QUFDYixZQUFBLENBQUMsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDO0FBQ2pCLFlBQUEsQ0FBQyxFQUFFLENBQUMsVUFBVSxHQUFHLENBQUM7U0FDckIsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVaLFFBQUEsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUU7QUFDbEMsWUFBQSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDakQsWUFBQSxNQUFNLEdBQUcsR0FBc0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUMsQ0FBQztBQUUxRixZQUFBLEdBQUcsQ0FBQyxJQUFJLENBQ0osT0FBTyxFQUNQLElBQUksRUFDSixrQkFBa0IsRUFDbEIsYUFBYSxHQUFHLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsRUFDMUQsV0FBVyxFQUNYLE9BQU8sQ0FBQyxZQUFZLEVBQ3BCLG1CQUFtQixFQUNuQixvQkFBb0IsQ0FDdkIsQ0FBQztZQUVGLEVBQUUsQ0FBQyxZQUFZLENBQ1gsUUFBUSxFQUNSLE9BQU8sQ0FBQyxlQUFlLEdBQUcsYUFBYSxFQUN2QyxFQUFFLENBQUMsY0FBYyxFQUNqQixPQUFPLENBQUMsZUFBZSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxTQUFBO0FBQ0osS0FBQTtBQUNKLENBQUE7O0FDN0lELFNBQVMsb0JBQW9CLENBQUMsU0FBOEIsRUFBRSxPQUFnQixFQUFFLElBQVUsRUFBQTtBQUV0RixJQUFBLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFN0UsSUFBQSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUVqRyxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDL0YsTUFBTSxNQUFNLEdBQUcscUJBQXFCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRS9ELE9BQU87QUFDSCxRQUFBLFNBQVMsRUFBRSxDQUFDO0FBQ1osUUFBQSxXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUk7UUFDeEMsU0FBUyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUM5RCxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7O1FBRXJCLHFCQUFxQixFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO1FBQ25ELHFCQUFxQixFQUFFLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDO0tBQzVELENBQUM7QUFDTixDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FDM0IsS0FBZ0MsRUFDaEMsU0FBOEIsRUFDOUIsT0FBZ0IsRUFDaEIsSUFHQyxFQUFBO0FBRUQsSUFBQSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDekUsSUFBQSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDdkUsSUFBQUEsa0JBQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLENBQUM7QUFDL0IsSUFBQSxNQUFNLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7QUFFNUQsSUFBQSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUVqRyxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDL0YsTUFBTSxNQUFNLEdBQUcscUJBQXFCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRS9ELE9BQU87QUFDSCxRQUFBLFNBQVMsRUFBRSxDQUFDO1FBQ1osZ0JBQWdCLEVBQUcsU0FBaUIsQ0FBQyxFQUFFO1FBQ3ZDLGdCQUFnQixFQUFHLFNBQWlCLENBQUMsRUFBRTtRQUN2QyxnQkFBZ0IsRUFBRyxTQUFpQixDQUFDLEVBQUU7UUFDdkMsZ0JBQWdCLEVBQUcsU0FBaUIsQ0FBQyxFQUFFO0FBQ3ZDLFFBQUEsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztRQUM1QixPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEIsa0JBQWtCLEVBQUcsU0FBaUIsQ0FBQyxXQUFXO1FBQ2xELGtCQUFrQixFQUFHLFNBQWlCLENBQUMsV0FBVztRQUNsRCxXQUFXLEVBQUUsU0FBUyxDQUFDLFNBQVM7UUFDaEMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxPQUFPO0FBQzlCLFFBQUEsd0JBQXdCLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7O1FBRXBGLHFCQUFxQixFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO1FBQ25ELHFCQUFxQixFQUFFLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDO0tBQzVELENBQUM7QUFDTixDQUFBOztBQ3pEQSxNQUFNLHFCQUFxQixHQUFHLENBQUMsT0FBZ0IsRUFBRSxTQUEyQixNQUFpQztJQUN6RyxVQUFVLEVBQUUsSUFBSStSLFdBQWUsQ0FBQSxlQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDNUQsWUFBWSxFQUFFLElBQUlDLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUM7SUFDMUQsa0JBQWtCLEVBQUUsSUFBSUMsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixDQUFDO0lBQ3RFLGNBQWMsRUFBRSxJQUFJRCxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsWUFBWSxDQUFDO0lBQzlELHFCQUFxQixFQUFFLElBQUlDLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztJQUM1RSxXQUFXLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQztBQUMzRCxDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxPQUFnQixFQUFFLFNBQTJCLE1BQXdDO0lBQ3ZILFVBQVUsRUFBRSxJQUFJRixXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQzVELFlBQVksRUFBRSxJQUFJQyxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDO0lBQzFELGtCQUFrQixFQUFFLElBQUlDLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN0RSxjQUFjLEVBQUUsSUFBSUQsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQztJQUM5RCxxQkFBcUIsRUFBRSxJQUFJQyxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsbUJBQW1CLENBQUM7SUFDNUUsaUJBQWlCLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGVBQWUsQ0FBQzs7SUFFcEUsU0FBUyxFQUFFLElBQUlDLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsV0FBVyxFQUFFLElBQUlDLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDeEQscUJBQXFCLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDO0lBQzVFLHFCQUFxQixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztJQUM1RSxTQUFTLEVBQUUsSUFBSUgsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUNwRCxRQUFRLEVBQUUsSUFBSUMsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNsRCxXQUFXLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQztBQUMzRCxDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0sMEJBQTBCLEdBQUcsQ0FDL0IsTUFBWSxFQUNaLE9BQWdCLEVBQ2hCLHlCQUFrQyxFQUNsQyxPQUFlLEtBQzJCO0FBQzFDLElBQUEsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDbEMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDN0MsSUFBQSxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFTLENBQUM7QUFDL0MsSUFBQSxNQUFNLFFBQVEsR0FBR3JLLFdBQUFBLENBQUFBLFFBQVcsRUFBRSxDQUFDO0lBQy9CLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssVUFBVSxFQUFFO0FBQy9DLFFBQUF3SyxXQUFBQSxDQUFBQSxZQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekQsS0FBQTtBQUNEQyxJQUFBQSxXQUFBQSxDQUFBQSxhQUFrQixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFakQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFakQsT0FBTztBQUNILFFBQUEsVUFBVSxFQUFFLE1BQU07QUFDbEIsUUFBQSxZQUFZLEVBQUUsUUFBUTtRQUN0QixrQkFBa0IsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7QUFDckQsUUFBQSxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUMxRCxxQkFBcUIsRUFBRSxDQUFDLHlCQUF5QjtBQUNqRCxRQUFBLFdBQVcsRUFBRSxPQUFPO0tBQ3ZCLENBQUM7QUFDTixDQUFDLENBQUM7QUFFRixNQUFNLGlDQUFpQyxHQUFHLENBQ3RDLE1BQVksRUFDWixPQUFnQixFQUNoQix5QkFBa0MsRUFDbEMsT0FBZSxFQUNmLEtBQXVCLEVBQ3ZCLFNBQThCLEVBQzlCLElBQVUsS0FDdUM7SUFDakQsT0FBTzFTLFdBQUFBLENBQUFBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE9BQU8sQ0FBQyxFQUN6RixvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUM5QztBQUNJLFFBQUEsaUJBQWlCLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDO0FBQ3pFLEtBQUEsQ0FBQyxDQUFDO0FBQ1gsQ0FBQyxDQUFBOztBQy9ERCxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQWdCLEVBQUUsU0FBMkIsTUFBd0I7SUFDdkYsVUFBVSxFQUFFLElBQUlvUyxXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0FBQy9ELENBQUEsQ0FBQyxDQUFDO0FBRUgsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLE9BQWdCLEVBQUUsU0FBMkIsTUFBK0I7SUFDckcsVUFBVSxFQUFFLElBQUlBLFdBQWUsQ0FBQSxlQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDNUQsU0FBUyxFQUFFLElBQUlHLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsV0FBVyxFQUFFLElBQUlDLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDeEQscUJBQXFCLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDO0lBQzVFLHFCQUFxQixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztJQUM1RSxTQUFTLEVBQUUsSUFBSUgsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUNwRCxRQUFRLEVBQUUsSUFBSUMsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztBQUNyRCxDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxPQUFnQixFQUFFLFNBQTJCLE1BQStCO0lBQ3JHLFVBQVUsRUFBRSxJQUFJRixXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQzVELFNBQVMsRUFBRSxJQUFJSSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDO0FBQ3ZELENBQUEsQ0FBQyxDQUFDO0FBRUgsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLE9BQWdCLEVBQUUsU0FBMkIsTUFBc0M7SUFDbkgsVUFBVSxFQUFFLElBQUlKLFdBQWUsQ0FBQSxlQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDNUQsU0FBUyxFQUFFLElBQUlJLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsU0FBUyxFQUFFLElBQUlELFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsV0FBVyxFQUFFLElBQUlDLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDeEQscUJBQXFCLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDO0lBQzVFLHFCQUFxQixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztJQUM1RSxTQUFTLEVBQUUsSUFBSUgsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUNwRCxRQUFRLEVBQUUsSUFBSUMsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztBQUNyRCxDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxNQUFZLE1BQXVDO0FBQzFFLElBQUEsVUFBVSxFQUFFLE1BQU07QUFDckIsQ0FBQSxDQUFDLENBQUM7QUFFSCxNQUFNLHdCQUF3QixHQUFHLENBQzdCLE1BQVksRUFDWixPQUFnQixFQUNoQixTQUE4QixFQUM5QixJQUFVLEtBQytCdFMsV0FBTSxDQUFBLE1BQUEsQ0FDL0MsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQ3pCLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQ2pELENBQUM7QUFFRixNQUFNLHdCQUF3QixHQUFHLENBQUMsTUFBWSxFQUFFLGlCQUFtQyxNQUE4QztBQUM3SCxJQUFBLFVBQVUsRUFBRSxNQUFNO0FBQ2xCLElBQUEsU0FBUyxFQUFFLGlCQUFpQjtBQUMvQixDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0sK0JBQStCLEdBQUcsQ0FDcEMsTUFBWSxFQUNaLE9BQWdCLEVBQ2hCLFNBQThCLEVBQzlCLElBQVUsRUFDVixpQkFBbUMsS0FDYUEsV0FBTSxDQUFBLE1BQUEsQ0FDdEQsd0JBQXdCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQzFEO0FBQ0ksSUFBQSxTQUFTLEVBQUUsaUJBQWlCO0FBQy9CLENBQUEsQ0FDSixDQUFBOztBQzFGRCxNQUFNLGNBQWMsR0FBRyxDQUFDLE9BQWdCLEVBQUUsU0FBMkIsTUFBMEI7SUFDM0YsNkJBQTZCLEVBQUUsSUFBSXNTLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQztJQUM1RixrQkFBa0IsRUFBRSxJQUFJQyxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsZ0JBQWdCLENBQUM7SUFDdEUsa0JBQWtCLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixDQUFDO0lBQ3RFLGlCQUFpQixFQUFFLElBQUlDLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxlQUFlLENBQUM7SUFDcEUsc0JBQXNCLEVBQUUsSUFBSUYsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLG9CQUFvQixDQUFDO0lBQzlFLFVBQVUsRUFBRSxJQUFJRixXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0FBQy9ELENBQUEsQ0FBQyxDQUFDO0FBRUgsTUFBTSxtQkFBbUIsR0FBRyxDQUN4QixPQUFnQixFQUNoQixLQUF1QixFQUN2QixJQUFVLEVBQ1YsS0FBdUIsS0FDWTtBQUNuQyxJQUFBLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFFcEMsSUFBSSxZQUFxQixFQUFFLFlBQThCLENBQUM7SUFDMUQsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEtBQUssRUFBRTtBQUNyRCxRQUFBLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELFlBQVksR0FBRyxJQUFJLENBQUM7QUFDcEIsUUFBQSxZQUFZLEdBQUcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDM0MsS0FBQTtBQUFNLFNBQUE7UUFDSCxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLFFBQUEsWUFBWSxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUM7QUFDNUMsS0FBQTtJQUVELE9BQU87UUFDSCw2QkFBNkIsRUFBRSxTQUFTLENBQUMsc0JBQXNCO0FBQy9ELFFBQUEsa0JBQWtCLEVBQUUsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEtBQUssQ0FBQztBQUN0RSxRQUFBLFVBQVUsRUFBRSxPQUFPLENBQUMsa0JBQWtCLENBQ2xDLEtBQUssQ0FBQyxTQUFTLEVBQ2YsSUFBSSxFQUNKLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQ25DLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDL0MsUUFBQSxrQkFBa0IsRUFBRSxFQUFFLFlBQVksQ0FBQztRQUNuQyxzQkFBc0IsRUFBRSxPQUFPLENBQUMsVUFBVTtBQUMxQyxRQUFBLGlCQUFpQixFQUFFLFlBQVk7S0FDbEMsQ0FBQztBQUNOLENBQUMsQ0FBQTs7QUNsQ0QsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE9BQWdCLEVBQUUsU0FBMkIsTUFBNkI7SUFDakcsVUFBVSxFQUFFLElBQUlBLFdBQWUsQ0FBQSxlQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDNUQsNkJBQTZCLEVBQUUsSUFBSUUsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLDJCQUEyQixDQUFDO0lBQzVGLHdCQUF3QixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQztJQUNsRixpQkFBaUIsRUFBRSxJQUFJRSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsZUFBZSxDQUFDO0lBQ3BFLG9CQUFvQixFQUFFLElBQUlGLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQztBQUM3RSxDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxPQUFnQixFQUFFLFNBQTJCLE1BQW1DO0lBQzdHLFVBQVUsRUFBRSxJQUFJRixXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQzVELGNBQWMsRUFBRSxJQUFJQSxXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsWUFBWSxDQUFDO0lBQ3BFLDZCQUE2QixFQUFFLElBQUlFLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQztJQUM1RixpQkFBaUIsRUFBRSxJQUFJRSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsZUFBZSxDQUFDO0FBQ3ZFLENBQUEsQ0FBQyxDQUFDO0FBRUgsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLE1BQVksRUFBRSxTQUFvQixFQUFFLElBQVUsS0FBMEM7QUFDcEgsSUFBQSxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5RCxJQUFBLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwRSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3RELE9BQU87QUFDSCxRQUFBLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLDZCQUE2QixFQUFFLFNBQVMsQ0FBQyxzQkFBc0I7QUFDL0QsUUFBQSx3QkFBd0IsRUFBRSxVQUFVO0FBQ3BDLFFBQUEsaUJBQWlCLEVBQUUsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDbkUsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDeEQsUUFBQSxvQkFBb0IsRUFBRSxlQUFlO0tBQ3hDLENBQUM7QUFDTixDQUFDLENBQUM7QUFFRixNQUFNLDRCQUE0QixHQUFHLENBQUMsTUFBWSxFQUFFLFNBQWUsRUFBRSxTQUFvQixLQUFnRDtJQUNySSxPQUFPO0FBQ0gsUUFBQSxVQUFVLEVBQUUsTUFBTTtBQUNsQixRQUFBLGNBQWMsRUFBRSxTQUFTO1FBQ3pCLDZCQUE2QixFQUFFLFNBQVMsQ0FBQyxzQkFBc0I7UUFDL0QsaUJBQWlCLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUM7S0FDekQsQ0FBQztBQUNOLENBQUMsQ0FBQTs7QUM5Q0QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxPQUFnQixFQUFFLFNBQTJCLE1BQXlCO0lBQ3pGLFNBQVMsRUFBRSxJQUFJRyxXQUFZLENBQUEsWUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3ZELFVBQVUsRUFBRSxJQUFJUCxXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQzVELFdBQVcsRUFBRSxJQUFJRyxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDO0lBQ3hELGlCQUFpQixFQUFHLElBQUlELFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxlQUFlLENBQUM7QUFDeEUsQ0FBQSxDQUFDLENBQUM7QUFFSCxNQUFNLGtCQUFrQixHQUFHLENBQUMsTUFBWSxFQUFFLEtBQVksRUFBRSxVQUFBLEdBQXFCLENBQUMsTUFBd0M7QUFDbEgsSUFBQSxVQUFVLEVBQUUsTUFBTTtBQUNsQixJQUFBLFNBQVMsRUFBRSxLQUFLO0FBQ2hCLElBQUEsV0FBVyxFQUFFLENBQUM7QUFDZCxJQUFBLGlCQUFpQixFQUFFLFVBQVU7QUFDaEMsQ0FBQSxDQUFDLENBQUE7O0FDaEJGLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxPQUFnQixFQUFFLFNBQTJCLE1BQWdDO0lBQ3ZHLFVBQVUsRUFBRSxJQUFJRixXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0FBQy9ELENBQUEsQ0FBQyxDQUFDO0FBRUgsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLE1BQVksTUFBK0M7QUFDMUYsSUFBQSxVQUFVLEVBQUUsTUFBTTtBQUNyQixDQUFBLENBQUMsQ0FBQTs7QUNjRixNQUFNLGVBQWUsR0FBRyxDQUFDLE9BQWdCLEVBQUUsU0FBMkIsTUFBMkI7SUFDN0YsaUJBQWlCLEVBQUUsSUFBSUUsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGVBQWUsQ0FBQztJQUNwRSxhQUFhLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQztJQUM1RCxVQUFVLEVBQUUsSUFBSUYsV0FBZSxDQUFBLGVBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQztBQUMvRCxDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxPQUFnQixFQUFFLFNBQTJCLE1BQWtDO0lBQzNHLFVBQVUsRUFBRSxJQUFJQSxXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQzVELFNBQVMsRUFBRSxJQUFJSSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3BELFNBQVMsRUFBRSxJQUFJRCxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3BELGNBQWMsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsWUFBWSxDQUFDO0lBQzlELFdBQVcsRUFBRSxJQUFJRCxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDO0FBQzNELENBQUEsQ0FBQyxDQUFDO0FBRUgsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLE1BQVksRUFBRSxJQUFVLEVBQUUsSUFBWSxFQUFFLFNBQWlCLE1BQTBDO0FBQzdILElBQUEsVUFBVSxFQUFFLE1BQU07SUFDbEIsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDbkQsSUFBQSxhQUFhLEVBQUUsU0FBUztBQUMzQixDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0sMkJBQTJCLEdBQUcsQ0FDaEMsT0FBZ0IsRUFDaEIsS0FBd0IsRUFDeEIsV0FBbUIsRUFDbkIsYUFBcUIsS0FDc0I7QUFDM0MsSUFBQSxNQUFNLE1BQU0sR0FBR2pELFdBQUFBLENBQUFBLE1BQVcsRUFBRSxDQUFDO0FBQzdCdUQsSUFBQUEsV0FBQUEsQ0FBQUEsS0FBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFOUQsSUFBQSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUU5QixPQUFPO0FBQ0gsUUFBQSxVQUFVLEVBQUUsTUFBTTtRQUNsQixTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDO0FBQzFELFFBQUEsU0FBUyxFQUFFLFdBQVc7QUFDdEIsUUFBQSxjQUFjLEVBQUUsYUFBYTtRQUM3QixXQUFXLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7S0FDbEQsQ0FBQztBQUNOLENBQUMsQ0FBQTs7QUM3QkQsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE9BQWdCLEVBQUUsU0FBMkIsTUFBNkI7SUFDakcsVUFBVSxFQUFFLElBQUlSLFdBQWUsQ0FBQSxlQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDNUQsU0FBUyxFQUFFLElBQUlHLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsWUFBWSxFQUFFLElBQUlDLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUM7SUFDMUQsU0FBUyxFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsVUFBVSxFQUFFLElBQUlHLFdBQVksQ0FBQSxZQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDekQsYUFBYSxFQUFFLElBQUlBLFdBQVksQ0FBQSxZQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUM7SUFDL0QsVUFBVSxFQUFFLElBQUlBLFdBQVksQ0FBQSxZQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFDNUQsQ0FBQSxDQUFDLENBQUM7QUFFSCxNQUFNLHdCQUF3QixHQUFHLENBQUMsT0FBZ0IsRUFBRSxTQUEyQixNQUFvQztJQUMvRyxVQUFVLEVBQUUsSUFBSVAsV0FBZSxDQUFBLGVBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUM1RCxTQUFTLEVBQUUsSUFBSUcsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUNwRCxhQUFhLEVBQUUsSUFBSUMsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQztJQUM1RCxRQUFRLEVBQUUsSUFBSUYsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNsRCxVQUFVLEVBQUUsSUFBSU8sV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQztBQUN6RCxDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxPQUFnQixFQUFFLElBQVUsRUFBRSxLQUEwQixLQUEwQztJQUM5SCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDL0QsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUV6RCxJQUFBLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQzs7SUFFdEYsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLFVBQVUsRUFBRTtBQUNqRSxRQUFBLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztBQUN4QyxLQUFBO0lBQ0QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUN0QyxPQUFPO0FBQ0gsUUFBQSxVQUFVLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssQ0FBQztBQUNsRixRQUFBLFNBQVMsRUFBRSxDQUFDO1FBQ1osWUFBWSxFQUFFLGVBQWUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUNuRCxRQUFBLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsU0FBUyxDQUFDO0FBQ2pFLFFBQUEsVUFBVSxFQUFFLE1BQU07QUFDbEIsUUFBQSxhQUFhLEVBQUUsU0FBUztBQUN4QixRQUFBLFVBQVUsRUFBRSxNQUFNO0tBQ3JCLENBQUM7QUFDTixDQUFDLENBQUM7QUFFRixNQUFNLDZCQUE2QixHQUFHLENBQUMsTUFBd0IsRUFBRSxHQUFZLEtBQWlEO0FBRTFILElBQUEsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUMxQixJQUFBLE1BQU0sTUFBTSxHQUFHeEQsV0FBQUEsQ0FBQUEsTUFBVyxFQUFFLENBQUM7O0FBRTdCLElBQUF1RCxpQkFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUVoUyxXQUFNLENBQUEsTUFBQSxFQUFFLENBQUNBLFdBQUFBLENBQUFBLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hELElBQUEwTyxXQUFjLENBQUEsU0FBQSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzFPLFdBQU0sQ0FBQSxNQUFBLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoRCxPQUFPO0FBQ0gsUUFBQSxVQUFVLEVBQUUsTUFBTTtBQUNsQixRQUFBLFNBQVMsRUFBRSxDQUFDO0FBQ1osUUFBQSxhQUFhLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO1FBQy9CLFFBQVEsRUFBRSxNQUFNLENBQUMsV0FBVztBQUM1QixRQUFBLFVBQVUsRUFBRSxHQUFHLENBQUMsZUFBZSxFQUFFO0tBQ3BDLENBQUM7QUFDTixDQUFDLENBQUM7QUFFRixTQUFTLGVBQWUsQ0FBQyxPQUFnQixFQUFFLE1BQXdCLEVBQUE7O0FBRS9ELElBQUEsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxJQUFBLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE9BQU87QUFDSCxRQUFBLElBQUk0TixXQUFBQSxDQUFBQSxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUc7QUFDekQsUUFBQSxJQUFJQSxXQUFrQixDQUFBLGtCQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHO0tBQUMsQ0FBQztBQUN6RSxDQUFBOztBQ2pEQSxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQWdCLEVBQUUsU0FBMkIsTUFBd0I7SUFDdkYsVUFBVSxFQUFFLElBQUk0RCxXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQzVELFNBQVMsRUFBRSxJQUFJRSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3BELHNCQUFzQixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQztJQUM5RSxtQkFBbUIsRUFBRSxJQUFJRSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsaUJBQWlCLENBQUM7QUFDM0UsQ0FBQSxDQUFDLENBQUM7QUFFSCxNQUFNLG9CQUFvQixHQUFHLENBQUMsT0FBZ0IsRUFBRSxTQUEyQixNQUFnQztJQUN2RyxVQUFVLEVBQUUsSUFBSUosV0FBZSxDQUFBLGVBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUM1RCxTQUFTLEVBQUUsSUFBSUUsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUNwRCxzQkFBc0IsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsb0JBQW9CLENBQUM7SUFDOUUsbUJBQW1CLEVBQUUsSUFBSUUsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGlCQUFpQixDQUFDO0lBQ3hFLFNBQVMsRUFBRSxJQUFJRCxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3BELGdCQUFnQixFQUFFLElBQUlELFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUM7QUFDckUsQ0FBQSxDQUFDLENBQUM7QUFFSCxNQUFNLG1CQUFtQixHQUFHLENBQUMsT0FBZ0IsRUFBRSxTQUEyQixNQUErQjtJQUNyRyxVQUFVLEVBQUUsSUFBSUYsV0FBZSxDQUFBLGVBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUM1RCxXQUFXLEVBQUUsSUFBSUksV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxTQUFTLEVBQUUsSUFBSUYsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUNwRCxzQkFBc0IsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsb0JBQW9CLENBQUM7SUFDOUUsU0FBUyxFQUFFLElBQUlDLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsbUJBQW1CLEVBQUUsSUFBSUMsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGlCQUFpQixDQUFDO0lBQ3hFLFNBQVMsRUFBRSxJQUFJSCxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3BELFFBQVEsRUFBRSxJQUFJQyxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQ3JELENBQUEsQ0FBQyxDQUFDO0FBRUgsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFnQixFQUFFLFNBQTJCLE1BQTJCO0lBQzdGLFVBQVUsRUFBRSxJQUFJRixXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQzVELFNBQVMsRUFBRSxJQUFJRSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3BELHNCQUFzQixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQztJQUM5RSxtQkFBbUIsRUFBRSxJQUFJRSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsaUJBQWlCLENBQUM7SUFDeEUsa0JBQWtCLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixDQUFDO0lBQ3RFLGtCQUFrQixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN0RSxZQUFZLEVBQUUsSUFBSUYsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQztJQUMxRCxTQUFTLEVBQUUsSUFBSUMsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUNwRCxXQUFXLEVBQUUsSUFBSUQsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxXQUFXLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxPQUFPLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQztBQUNuRCxDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxPQUFnQixFQUFFLElBQVUsRUFBRSxLQUFxQixLQUFxQztBQUMvRyxJQUFBLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFFcEMsT0FBTztRQUNILFVBQVUsRUFBRSxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7QUFDakQsUUFBQSxTQUFTLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQztRQUN6RCxzQkFBc0IsRUFBRSxPQUFPLENBQUMsVUFBVTtBQUMxQyxRQUFBLG1CQUFtQixFQUFFO0FBQ2pCLFlBQUEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFlBQUEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBQ25DLFNBQUE7S0FDSixDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLE9BQWdCLEVBQUUsSUFBVSxFQUFFLEtBQXFCLEVBQUUsV0FBbUIsS0FBNkM7SUFDcEosT0FBT3RTLFdBQUFBLENBQUFBLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO0FBQ25ELFFBQUEsU0FBUyxFQUFFLENBQUM7QUFDWixRQUFBLGdCQUFnQixFQUFFLFdBQVc7QUFDaEMsS0FBQSxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7QUFFRixNQUFNLHdCQUF3QixHQUFHLENBQzdCLE9BQWdCLEVBQ2hCLElBQVUsRUFDVixLQUFxQixFQUNyQixTQUE4QixLQUNVO0FBQ3hDLElBQUEsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztJQUNwQyxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDMUQsT0FBTztRQUNILFVBQVUsRUFBRSxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7QUFDakQsUUFBQSxXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUk7O0FBRXhDLFFBQUEsU0FBUyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDekQsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLFVBQVU7QUFDMUMsUUFBQSxTQUFTLEVBQUUsQ0FBQztRQUNaLFNBQVMsRUFBRSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDbEUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3JCLFFBQUEsbUJBQW1CLEVBQUU7QUFDakIsWUFBQSxDQUFDLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7QUFDaEMsWUFBQSxDQUFDLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7QUFDbkMsU0FBQTtLQUNKLENBQUM7QUFDTixDQUFDLENBQUM7QUFFRixNQUFNLG9CQUFvQixHQUFHLENBQ3pCLE9BQWdCLEVBQ2hCLElBQVUsRUFDVixLQUFxQixFQUNyQixTQUFvQyxFQUNwQyxTQUE4QixLQUNNO0FBQ3BDLElBQUEsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUNwQyxJQUFBLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDcEMsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRXRELElBQUEsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssT0FBTyxDQUFDO0FBRXZELElBQUEsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RELElBQUEsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXBELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztJQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFFOUMsT0FBT0EsV0FBQUEsQ0FBQUEsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7QUFDbkQsUUFBQSxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMxRCxRQUFBLGtCQUFrQixFQUFFLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzFELFlBQVksRUFBRSxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztBQUN6RixRQUFBLFNBQVMsRUFBRSxDQUFDO1FBQ1osV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25CLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQixPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkIsS0FBQSxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7QUFFRixTQUFTLGtCQUFrQixDQUFDLElBQVUsRUFBRSxTQUFvQixFQUFBO0FBQ3hELElBQUEsT0FBTyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFBO0FBQ3pDLElBQUEsT0FBTyxPQUFPLENBQUMsa0JBQWtCLENBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUNyQixJQUFJLEVBQ0osS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFDakMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FDM0MsQ0FBQztBQUNOLENBQUE7O0FDOUpBLE1BQU0sY0FBYyxHQUFHLENBQUMsT0FBZ0IsRUFBRSxTQUEyQixNQUEwQjtJQUMzRixVQUFVLEVBQUUsSUFBSW9TLFdBQWUsQ0FBQSxlQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDNUQsYUFBYSxFQUFFLElBQUlJLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUM7SUFDNUQsZ0JBQWdCLEVBQUUsSUFBSUYsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQztJQUNsRSxnQkFBZ0IsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDO0lBQ2xFLFVBQVUsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQ3RELFdBQVcsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDO0lBQ3hELFVBQVUsRUFBRSxJQUFJQyxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQ3RELFVBQVUsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQ3RELGtCQUFrQixFQUFFLElBQUlELFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN0RSxtQkFBbUIsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsaUJBQWlCLENBQUM7SUFDeEUscUJBQXFCLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDO0lBQzVFLG1CQUFtQixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztJQUN4RSxnQkFBZ0IsRUFBRSxJQUFJRCxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDO0FBQ3JFLENBQUEsQ0FBQyxDQUFDO0FBRUgsTUFBTSxtQkFBbUIsR0FBRyxDQUN4QixNQUFZLEVBQ1osUUFBMEIsRUFDMUIsYUFBcUIsRUFDckIsSUFHQyxFQUNELEtBQXVCLE1BQ2M7QUFDckMsSUFBQSxVQUFVLEVBQUUsTUFBTTtBQUNsQixJQUFBLGFBQWEsRUFBRSxRQUFRO0FBQ3ZCLElBQUEsZ0JBQWdCLEVBQUUsYUFBYTtBQUMvQixJQUFBLGdCQUFnQixFQUFFLENBQUM7SUFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHO0FBQ3BCLElBQUEsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7QUFDN0QsSUFBQSxVQUFVLEVBQUUsQ0FBQztBQUNiLElBQUEsVUFBVSxFQUFFLENBQUM7SUFDYixrQkFBa0IsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztJQUM1RCxtQkFBbUIsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztJQUM3RCxxQkFBcUIsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzdFLG1CQUFtQixFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZFLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQ3RFLENBQUEsQ0FBQyxDQUFDO0FBRUgsU0FBUyxXQUFXLENBQUMsS0FBSyxFQUFBO0FBQ3RCLElBQUEsS0FBSyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQ3ZCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixPQUFPO0FBQ0gsUUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDZixRQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDL0IsUUFBQSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztLQUNqQyxDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLFFBQVEsRUFBQTtBQUM1QixJQUFBLE9BQU8sUUFBUSxHQUFHLENBQUM7QUFDZixRQUFBLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ2xCLENBQUMsR0FBRyxRQUFRLENBQUM7QUFDckIsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsVUFBVSxFQUFBO0FBQ2hDLElBQUEsT0FBTyxVQUFVLEdBQUcsQ0FBQztBQUNqQixRQUFBLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQztBQUM1QixRQUFBLENBQUMsVUFBVSxDQUFDO0FBQ3BCLENBQUE7O0FDWkEsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLE9BQWdCLEVBQUUsU0FBMkIsTUFBOEI7SUFDbkcseUJBQXlCLEVBQUUsSUFBSUUsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLHVCQUF1QixDQUFDO0lBQ3BGLDRCQUE0QixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQztJQUMxRixVQUFVLEVBQUUsSUFBSUQsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUN0RCxRQUFRLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNsRCw2QkFBNkIsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsMkJBQTJCLENBQUM7SUFDNUYsU0FBUyxFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsaUJBQWlCLEVBQUUsSUFBSUMsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGVBQWUsQ0FBQztJQUNwRSxnQkFBZ0IsRUFBRSxJQUFJRCxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDO0lBQ2xFLGVBQWUsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsYUFBYSxDQUFDO0lBQ2hFLFVBQVUsRUFBRSxJQUFJRixXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQzVELHNCQUFzQixFQUFFLElBQUlBLFdBQWUsQ0FBQSxlQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQztJQUNwRixnQkFBZ0IsRUFBRSxJQUFJQSxXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDO0lBQ3hFLFdBQVcsRUFBRSxJQUFJRyxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDO0lBQ3hELGtCQUFrQixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN0RSxXQUFXLEVBQUUsSUFBSUMsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxXQUFXLEVBQUUsSUFBSUQsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQztBQUMzRCxDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxPQUFnQixFQUFFLFNBQTJCLE1BQTZCO0lBQ2pHLHlCQUF5QixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQztJQUNwRiw0QkFBNEIsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsMEJBQTBCLENBQUM7SUFDMUYsVUFBVSxFQUFFLElBQUlELFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDdEQsUUFBUSxFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDbEQsNkJBQTZCLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLDJCQUEyQixDQUFDO0lBQzVGLFNBQVMsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3BELGlCQUFpQixFQUFFLElBQUlDLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxlQUFlLENBQUM7SUFDcEUsZ0JBQWdCLEVBQUUsSUFBSUQsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQztJQUNsRSxlQUFlLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGFBQWEsQ0FBQztJQUNoRSxVQUFVLEVBQUUsSUFBSUYsV0FBZSxDQUFBLGVBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUM1RCxzQkFBc0IsRUFBRSxJQUFJQSxXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsb0JBQW9CLENBQUM7SUFDcEYsZ0JBQWdCLEVBQUUsSUFBSUEsV0FBZSxDQUFBLGVBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQztJQUN4RSxXQUFXLEVBQUUsSUFBSUcsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxrQkFBa0IsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsZ0JBQWdCLENBQUM7SUFDdEUsV0FBVyxFQUFFLElBQUlDLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDeEQsV0FBVyxFQUFFLElBQUlELFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDeEQsZUFBZSxFQUFFLElBQUlELFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxhQUFhLENBQUM7SUFDaEUsc0JBQXNCLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLG9CQUFvQixDQUFDO0lBQzlFLFdBQVcsRUFBRSxJQUFJQyxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDO0FBQzNELENBQUEsQ0FBQyxDQUFDO0FBRUgsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLE9BQWdCLEVBQUUsU0FBMkIsTUFBcUM7SUFDakgseUJBQXlCLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLHVCQUF1QixDQUFDO0lBQ3BGLDRCQUE0QixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQztJQUMxRixVQUFVLEVBQUUsSUFBSUQsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUN0RCxRQUFRLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNsRCw2QkFBNkIsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsMkJBQTJCLENBQUM7SUFDNUYsU0FBUyxFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsaUJBQWlCLEVBQUUsSUFBSUMsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGVBQWUsQ0FBQztJQUNwRSxnQkFBZ0IsRUFBRSxJQUFJRCxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDO0lBQ2xFLGVBQWUsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsYUFBYSxDQUFDO0lBQ2hFLFVBQVUsRUFBRSxJQUFJRixXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQzVELHNCQUFzQixFQUFFLElBQUlBLFdBQWUsQ0FBQSxlQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQztJQUNwRixnQkFBZ0IsRUFBRSxJQUFJQSxXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDO0lBQ3hFLFdBQVcsRUFBRSxJQUFJRyxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDO0lBQ3hELGtCQUFrQixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN0RSxXQUFXLEVBQUUsSUFBSUMsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxnQkFBZ0IsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDO0lBQ2xFLFdBQVcsRUFBRSxJQUFJRCxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDO0lBQ3hELGdCQUFnQixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUM7SUFDbEUsZUFBZSxFQUFFLElBQUlELFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxhQUFhLENBQUM7SUFDaEUsc0JBQXNCLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLG9CQUFvQixDQUFDO0lBQzlFLFdBQVcsRUFBRSxJQUFJQyxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDO0FBQzNELENBQUEsQ0FBQyxDQUFDO0FBRUgsTUFBTSx1QkFBdUIsR0FBRyxDQUM1QixZQUFvQixFQUNwQixJQUdDLEVBQ0QsY0FBdUIsRUFDdkIsWUFBcUIsRUFDckIsT0FBZ0IsRUFDaEIsTUFBWSxFQUNaLGdCQUFzQixFQUN0QixhQUFtQixFQUNuQixNQUFlLEVBQ2YsT0FBeUIsS0FDYztBQUN2QyxJQUFBLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFFcEMsT0FBTztRQUNILHlCQUF5QixFQUFFLEVBQUUsWUFBWSxLQUFLLFVBQVUsSUFBSSxZQUFZLEtBQUssUUFBUSxDQUFDO1FBQ3RGLDRCQUE0QixFQUFFLEVBQUUsWUFBWSxLQUFLLFVBQVUsSUFBSSxZQUFZLEtBQUssUUFBUSxDQUFDO0FBQ3pGLFFBQUEsVUFBVSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDbEMsUUFBQSxRQUFRLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUMvQiw2QkFBNkIsRUFBRSxTQUFTLENBQUMsc0JBQXNCO1FBQy9ELFNBQVMsRUFBRSxTQUFTLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUU7UUFDOUMsaUJBQWlCLEVBQUUsQ0FBQyxjQUFjO0FBQ2xDLFFBQUEsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTTtBQUNwRCxRQUFBLGVBQWUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQztBQUM1RSxRQUFBLFVBQVUsRUFBRSxNQUFNO0FBQ2xCLFFBQUEsc0JBQXNCLEVBQUUsZ0JBQWdCO0FBQ3hDLFFBQUEsZ0JBQWdCLEVBQUUsYUFBYTtRQUMvQixXQUFXLEVBQUUsQ0FBQyxNQUFNO1FBQ3BCLGtCQUFrQixFQUFFLENBQUMsWUFBWTtBQUNqQyxRQUFBLFdBQVcsRUFBRSxPQUFPO0FBQ3BCLFFBQUEsV0FBVyxFQUFFLENBQUM7S0FDakIsQ0FBQztBQUNOLENBQUMsQ0FBQztBQUVGLE1BQU0sc0JBQXNCLEdBQUcsQ0FDM0IsWUFBb0IsRUFDcEIsSUFHQyxFQUNELGNBQXVCLEVBQ3ZCLFlBQXFCLEVBQ3JCLE9BQWdCLEVBQ2hCLE1BQVksRUFDWixnQkFBc0IsRUFDdEIsYUFBbUIsRUFDbkIsTUFBZSxFQUNmLE9BQXlCLEVBQ3pCLE1BQWUsS0FDdUI7QUFDdEMsSUFBQSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBRXBDLE9BQU92UyxXQUFBQSxDQUFBQSxNQUFNLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFFLElBQUksRUFDcEQsY0FBYyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUMvRCxhQUFhLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFO0FBQ2pDLFFBQUEsZUFBZSxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO1FBQ25HLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxVQUFVO1FBQzFDLFdBQVcsRUFBRSxDQUFDLE1BQU07QUFDdkIsS0FBQSxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7QUFFRixNQUFNLDhCQUE4QixHQUFHLENBQ25DLFlBQW9CLEVBQ3BCLElBR0MsRUFDRCxjQUF1QixFQUN2QixZQUFxQixFQUNyQixPQUFnQixFQUNoQixNQUFZLEVBQ1osZ0JBQXNCLEVBQ3RCLGFBQW1CLEVBQ25CLFVBQTRCLEVBQzVCLFdBQTZCLEtBQ1U7SUFDdkMsT0FBT0EsV0FBQUEsQ0FBQUEsTUFBTSxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxJQUFJLEVBQ25ELGNBQWMsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFDL0QsYUFBYSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUU7QUFDeEMsUUFBQSxnQkFBZ0IsRUFBRSxXQUFXO0FBQzdCLFFBQUEsZ0JBQWdCLEVBQUUsQ0FBQztBQUN0QixLQUFBLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQTs7QUNqTEQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLE9BQWdCLEVBQUUsU0FBMkIsTUFBOEI7SUFDbkcsVUFBVSxFQUFFLElBQUlvUyxXQUFlLENBQUEsZUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQzVELFdBQVcsRUFBRSxJQUFJRSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDO0lBQ3hELFNBQVMsRUFBRSxJQUFJSyxXQUFZLENBQUEsWUFBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDO0FBQzFELENBQUEsQ0FBQyxDQUFDO0FBRUgsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLE9BQWdCLEVBQUUsU0FBMkIsTUFBcUM7SUFDakgsVUFBVSxFQUFFLElBQUlQLFdBQWUsQ0FBQSxlQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDNUQsV0FBVyxFQUFFLElBQUlFLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDeEQsU0FBUyxFQUFFLElBQUlDLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsZ0JBQWdCLEVBQUUsSUFBSUMsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQztJQUNsRSxnQkFBZ0IsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDO0lBQ2xFLGdCQUFnQixFQUFFLElBQUlBLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUM7SUFDbEUsZ0JBQWdCLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQztJQUNsRSxXQUFXLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxPQUFPLEVBQUUsSUFBSUYsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQztJQUNoRCxrQkFBa0IsRUFBRSxJQUFJRSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsZ0JBQWdCLENBQUM7SUFDdEUsa0JBQWtCLEVBQUUsSUFBSUEsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixDQUFDO0lBQ3RFLFdBQVcsRUFBRSxJQUFJRixXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDO0lBQ3hELFdBQVcsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDO0lBQ3hELHFCQUFxQixFQUFFLElBQUlFLFdBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztJQUM1RSxxQkFBcUIsRUFBRSxJQUFJQSxXQUFTLENBQUEsU0FBQSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsbUJBQW1CLENBQUM7SUFDNUUsd0JBQXdCLEVBQUUsSUFBSUYsV0FBUyxDQUFBLFNBQUEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLHNCQUFzQixDQUFDO0FBQ3JGLENBQUEsQ0FBQyxDQUFDO0FBRUgsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLE1BQVksRUFBRSxPQUFlLEVBQUUsS0FBWSxNQUE2QztBQUNySCxJQUFBLFVBQVUsRUFBRSxNQUFNO0FBQ2xCLElBQUEsV0FBVyxFQUFFLE9BQU87QUFDcEIsSUFBQSxTQUFTLEVBQUUsS0FBSztBQUNuQixDQUFBLENBQUMsQ0FBQztBQUVILE1BQU0sOEJBQThCLEdBQUcsQ0FDbkMsTUFBWSxFQUNaLE9BQWUsRUFDZixPQUFnQixFQUNoQixLQUFnQyxFQUNoQyxJQUdDLEVBQ0QsU0FBOEIsS0FDaUJ0UyxXQUFNLENBQUEsTUFBQSxDQUNyRCxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFDdkQ7QUFDSSxJQUFBLFVBQVUsRUFBRSxNQUFNO0FBQ2xCLElBQUEsV0FBVyxFQUFFLE9BQU87QUFDdkIsQ0FBQSxDQUNKLENBQUE7O0FDaEZNLE1BQU0sZUFBZSxHQUFHO0FBQzNCLElBQUEsYUFBYSxFQUFFLHFCQUFxQjtBQUNwQyxJQUFBLG9CQUFvQixFQUFFLDRCQUE0QjtBQUNsRCxJQUFBLElBQUksRUFBRSxZQUFZO0FBQ2xCLElBQUEsV0FBVyxFQUFFLG1CQUFtQjtBQUNoQyxJQUFBLFdBQVcsRUFBRSxtQkFBbUI7QUFDaEMsSUFBQSxrQkFBa0IsRUFBRSwwQkFBMEI7QUFDOUMsSUFBQSxNQUFNLEVBQUUsY0FBYztBQUN0QixJQUFBLFlBQVksRUFBRSxpQkFBaUI7QUFDL0IsSUFBQSxlQUFlLEVBQUUsdUJBQXVCO0FBQ3hDLElBQUEsS0FBSyxFQUFFLGFBQWE7QUFDcEIsSUFBQSxZQUFZLEVBQUUsb0JBQW9CO0FBQ2xDLElBQUEsT0FBTyxFQUFFLGVBQWU7QUFDeEIsSUFBQSxjQUFjLEVBQUUsc0JBQXNCO0FBQ3RDLElBQUEsU0FBUyxFQUFFLGlCQUFpQjtBQUM1QixJQUFBLGdCQUFnQixFQUFFLHdCQUF3QjtBQUMxQyxJQUFBLElBQUksRUFBRSxZQUFZO0FBQ2xCLElBQUEsWUFBWSxFQUFFLG9CQUFvQjtBQUNsQyxJQUFBLFdBQVcsRUFBRSxtQkFBbUI7QUFDaEMsSUFBQSxPQUFPLEVBQUUsZUFBZTtBQUN4QixJQUFBLE1BQU0sRUFBRSxjQUFjO0FBQ3RCLElBQUEsVUFBVSxFQUFFLGtCQUFrQjtBQUM5QixJQUFBLFNBQVMsRUFBRSxpQkFBaUI7QUFDNUIsSUFBQSxpQkFBaUIsRUFBRSx5QkFBeUI7QUFDNUMsSUFBQSxVQUFVLEVBQUUsa0JBQWtCO0FBQzlCLElBQUEsaUJBQWlCLEVBQUUseUJBQXlCO0FBQy9DLENBQUEsQ0FBQTs7QUNqQ0QsTUFBTSxXQUFXLENBQUE7QUFLYixJQUFBLFdBQUEsQ0FBWSxPQUFnQixFQUFFLEtBQWdFLEVBQUUsV0FBcUIsRUFBQTtBQUNqSCxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLFFBQUEsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ2hDLFFBQUEsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Ozs7QUFLeEMsUUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXpCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUUvRyxRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ25CLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQztBQUM1QixTQUFBO0FBQ0osS0FBQTtBQUVELElBQUEsSUFBSSxHQUFBO1FBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25ELEtBQUE7QUFFRCxJQUFBLFVBQVUsQ0FBQyxLQUFrQixFQUFBO0FBQ3pCLFFBQUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDM0IsUUFBQUssa0JBQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7OztBQUd6QixRQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ1osUUFBQSxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ25FLEtBQUE7QUFFRCxJQUFBLE9BQU8sR0FBQTtBQUNILFFBQUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2IsWUFBQSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDdEIsU0FBQTtBQUNKLEtBQUE7QUFDSixDQUFBOztBQ3pDRDs7OztBQUlHO0FBQ0gsTUFBTSxhQUFhLEdBQUc7QUFDbEIsSUFBQSxJQUFJLEVBQUksTUFBTTtBQUNkLElBQUEsS0FBSyxFQUFHLGVBQWU7QUFDdkIsSUFBQSxLQUFLLEVBQUcsT0FBTztBQUNmLElBQUEsTUFBTSxFQUFFLGdCQUFnQjtBQUN4QixJQUFBLEtBQUssRUFBRyxLQUFLO0FBQ2IsSUFBQSxNQUFNLEVBQUUsY0FBYztBQUN0QixJQUFBLE9BQU8sRUFBRSxPQUFPO0NBQ25CLENBQUM7QUFFRjs7OztBQUlHO0FBQ0gsTUFBTSxZQUFZLENBQUE7QUFRZDs7O0FBR0c7QUFDSCxJQUFBLFdBQUEsQ0FBWSxPQUFnQixFQUFFLEtBQWtCLEVBQUUsVUFBNEMsRUFBRSxXQUFxQixFQUFBO0FBQ2pILFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQzNCLFFBQUEsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDN0IsUUFBQSxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7QUFDdEMsUUFBQSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztBQUUvQixRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLFFBQUEsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdkcsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQyxXQUFXLENBQUM7QUFDNUIsU0FBQTtBQUNKLEtBQUE7QUFFRCxJQUFBLElBQUksR0FBQTtRQUNBLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNsRCxLQUFBO0FBRUQsSUFBQSxVQUFVLENBQUMsS0FBa0IsRUFBQTtRQUN6QkEsV0FBTSxDQUFBLE1BQUEsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNyQyxRQUFBLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNaLFFBQUEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDM0QsS0FBQTtBQUVELElBQUEsZ0JBQWdCLENBQUMsRUFBeUIsRUFBRSxPQUFxQixFQUFBO0FBQzdELFFBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQWtCLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25FLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtBQUMzQixnQkFBQSxFQUFFLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDM0MsYUFBQTtBQUNKLFNBQUE7QUFDSixLQUFBO0FBRUQ7Ozs7O0FBS0c7QUFDSCxJQUFBLHVCQUF1QixDQUFDLEVBQXlCLEVBQUUsT0FBcUIsRUFBRSxZQUE0QixFQUFBO0FBQ2xHLFFBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQWtCLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRW5FLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtBQUMzQixnQkFBQSxFQUFFLENBQUMsbUJBQW1CLENBQ2xCLFdBQVcsRUFDWCxNQUFNLENBQUMsVUFBVSxFQUNoQixFQUFVLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUN2QyxLQUFLLEVBQ0wsSUFBSSxDQUFDLFFBQVEsRUFDYixNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ3hELENBQUM7QUFDTCxhQUFBO0FBQ0osU0FBQTtBQUNKLEtBQUE7QUFFRDs7QUFFRztBQUNILElBQUEsT0FBTyxHQUFBO0FBQ0gsUUFBQSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDYixZQUFBLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUN0QixTQUFBO0FBQ0osS0FBQTtBQUNKLENBQUE7O0FDdkZELE1BQU0sU0FBUyxDQUFBO0FBTVgsSUFBQSxXQUFBLENBQVksT0FBZ0IsRUFBQTtBQUN4QixRQUFBLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUNyQixRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2pDLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdEIsS0FBQTtBQUVELElBQUEsR0FBRyxHQUFBO1FBQ0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3ZCLEtBQUE7QUFDRCxJQUFBLEdBQUcsQ0FBQyxLQUFRLEVBQUE7O0FBRVgsS0FBQTtBQUVELElBQUEsVUFBVSxHQUFBO0FBQ04sUUFBQSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDdkIsS0FBQTtBQUNELElBQUEsVUFBVSxHQUFBO0FBQ04sUUFBQSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMxQixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sVUFBVyxTQUFRLFNBQWdCLENBQUE7QUFDNUMsSUFBQSxVQUFVLEdBQUE7UUFDTixPQUFPeVMsV0FBQUEsQ0FBQUEsS0FBSyxDQUFDLFdBQVcsQ0FBQztBQUM1QixLQUFBO0FBQ0QsSUFBQSxHQUFHLENBQUMsQ0FBUSxFQUFBO0FBQ1IsUUFBQSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3ZCLFFBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFDcEYsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sVUFBVyxTQUFRLFNBQWlCLENBQUE7QUFDN0MsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sQ0FBQyxDQUFDO0FBQ1osS0FBQTtBQUNELElBQUEsR0FBRyxDQUFDLENBQVMsRUFBQTtRQUNULElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87QUFDOUMsUUFBQSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdEIsS0FBQTtBQUNKLENBQUE7QUFFSyxNQUFPLFlBQWEsU0FBUSxTQUFpQixDQUFBO0FBQy9DLElBQUEsVUFBVSxHQUFBO0FBQ04sUUFBQSxPQUFPLENBQUMsQ0FBQztBQUNaLEtBQUE7QUFDRCxJQUFBLEdBQUcsQ0FBQyxDQUFTLEVBQUE7UUFDVCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO0FBQzlDLFFBQUEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNqQixRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLEtBQUE7QUFDSixDQUFBO0FBRUssTUFBTyxTQUFVLFNBQVEsU0FBd0IsQ0FBQTtBQUNuRCxJQUFBLFVBQVUsR0FBQTtRQUNOLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuQyxLQUFBO0FBQ0QsSUFBQSxHQUFHLENBQUMsQ0FBZ0IsRUFBQTtBQUNoQixRQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDdkIsUUFBQSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFDNUYsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNqQixRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLEtBQUE7QUFDSixDQUFBO0FBRUssTUFBTyxTQUFVLFNBQVEsU0FBd0IsQ0FBQTtBQUNuRCxJQUFBLFVBQVUsR0FBQTtBQUNOLFFBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixLQUFBO0FBQ0QsSUFBQSxHQUFHLENBQUMsQ0FBZ0IsRUFBQTtRQUNoQixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO0FBQzlDLFFBQUEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNqQixRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLEtBQUE7QUFDSixDQUFBO0FBRUssTUFBTyxXQUFZLFNBQVEsU0FBaUIsQ0FBQTtBQUM5QyxJQUFBLFVBQVUsR0FBQTtBQUNOLFFBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixLQUFBO0FBQ0QsSUFBQSxHQUFHLENBQUMsQ0FBUyxFQUFBO1FBQ1QsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztBQUM5QyxRQUFBLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sV0FBWSxTQUFRLFNBQTBCLENBQUE7QUFDdkQsSUFBQSxVQUFVLEdBQUE7UUFDTixPQUFPO0FBQ0gsWUFBQSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNO0FBQ3BCLFlBQUEsR0FBRyxFQUFFLENBQUM7QUFDTixZQUFBLElBQUksRUFBRSxJQUFJO1NBQ2IsQ0FBQztBQUNMLEtBQUE7QUFDRCxJQUFBLEdBQUcsQ0FBQyxDQUFrQixFQUFBO0FBQ2xCLFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO0FBQ3JGLFFBQUEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQyxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdEIsS0FBQTtBQUNKLENBQUE7QUFFSyxNQUFPLFNBQVUsU0FBUSxTQUF3QixDQUFBO0FBQ25ELElBQUEsVUFBVSxHQUFBO0FBQ04sUUFBQSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ25CLFFBQUEsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEMsS0FBQTtBQUNELElBQUEsR0FBRyxDQUFDLENBQWdCLEVBQUE7QUFDaEIsUUFBQSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3ZCLFFBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUMzRSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sV0FBWSxTQUFRLFNBQWtCLENBQUE7QUFDL0MsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLEtBQUE7QUFDRCxJQUFBLEdBQUcsQ0FBQyxDQUFVLEVBQUE7UUFDVixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO0FBQzlDLFFBQUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNuQixRQUFBLElBQUksQ0FBQyxFQUFFO0FBQ0gsWUFBQSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUM5QixTQUFBO0FBQU0sYUFBQTtBQUNILFlBQUEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDL0IsU0FBQTtBQUNELFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sVUFBVyxTQUFRLFNBQXlCLENBQUE7QUFDckQsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakIsS0FBQTtBQUNELElBQUEsR0FBRyxDQUFDLENBQWlCLEVBQUE7QUFDakIsUUFBQSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO0FBQzFELFFBQUEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sU0FBVSxTQUFRLFNBQWtCLENBQUE7QUFDN0MsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLEtBQUE7QUFDRCxJQUFBLEdBQUcsQ0FBQyxDQUFVLEVBQUE7UUFDVixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO0FBQzlDLFFBQUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNuQixRQUFBLElBQUksQ0FBQyxFQUFFO0FBQ0gsWUFBQSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM1QixTQUFBO0FBQU0sYUFBQTtBQUNILFlBQUEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDN0IsU0FBQTtBQUNELFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sU0FBVSxTQUFRLFNBQXdCLENBQUE7QUFDbkQsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7QUFDdkIsS0FBQTtBQUNELElBQUEsR0FBRyxDQUFDLENBQWdCLEVBQUE7UUFDaEIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztBQUM5QyxRQUFBLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sS0FBTSxTQUFRLFNBQWtCLENBQUE7QUFDekMsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLEtBQUE7QUFDRCxJQUFBLEdBQUcsQ0FBQyxDQUFVLEVBQUE7UUFDVixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO0FBQzlDLFFBQUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNuQixRQUFBLElBQUksQ0FBQyxFQUFFO0FBQ0gsWUFBQSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2QixTQUFBO0FBQU0sYUFBQTtBQUNILFlBQUEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEIsU0FBQTtBQUNELFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sU0FBVSxTQUFRLFNBQXdCLENBQUE7QUFDbkQsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVCLEtBQUE7QUFDRCxJQUFBLEdBQUcsQ0FBQyxDQUFnQixFQUFBO0FBQ2hCLFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztBQUMxRCxRQUFBLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdEIsS0FBQTtBQUNKLENBQUE7QUFFSyxNQUFPLFVBQVcsU0FBUSxTQUFnQixDQUFBO0FBQzVDLElBQUEsVUFBVSxHQUFBO1FBQ04sT0FBT0EsV0FBQUEsQ0FBQUEsS0FBSyxDQUFDLFdBQVcsQ0FBQztBQUM1QixLQUFBO0FBQ0QsSUFBQSxHQUFHLENBQUMsQ0FBUSxFQUFBO0FBQ1IsUUFBQSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3ZCLFFBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFDcEYsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sYUFBYyxTQUFRLFNBQTRCLENBQUE7QUFDM0QsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7QUFDM0IsS0FBQTtBQUNELElBQUEsR0FBRyxDQUFDLENBQW9CLEVBQUE7UUFDcEIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztBQUM5QyxRQUFBLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sUUFBUyxTQUFRLFNBQWtCLENBQUE7QUFDNUMsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLEtBQUE7QUFDRCxJQUFBLEdBQUcsQ0FBQyxDQUFVLEVBQUE7UUFDVixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO0FBQzlDLFFBQUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNuQixRQUFBLElBQUksQ0FBQyxFQUFFO0FBQ0gsWUFBQSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMzQixTQUFBO0FBQU0sYUFBQTtBQUNILFlBQUEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDNUIsU0FBQTtBQUNELFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sWUFBYSxTQUFRLFNBQTJCLENBQUE7QUFDekQsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7QUFDdkIsS0FBQTtBQUNELElBQUEsR0FBRyxDQUFDLENBQW1CLEVBQUE7UUFDbkIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztBQUM5QyxRQUFBLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sU0FBVSxTQUFRLFNBQXdCLENBQUE7QUFDbkQsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7QUFDdEIsS0FBQTtBQUNELElBQUEsR0FBRyxDQUFDLENBQWdCLEVBQUE7UUFDaEIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztBQUM5QyxRQUFBLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sWUFBYSxTQUFRLFNBQXVCLENBQUE7QUFDckQsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsS0FBQTtBQUNELElBQUEsR0FBRyxDQUFDLENBQXVCLEVBQUE7UUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztBQUM5QyxRQUFBLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8saUJBQWtCLFNBQVEsU0FBMEIsQ0FBQTtBQUM3RCxJQUFBLFVBQVUsR0FBQTtBQUNOLFFBQUEsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQztBQUMzQixLQUFBO0FBQ0QsSUFBQSxHQUFHLENBQUMsQ0FBa0IsRUFBQTtRQUNsQixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO0FBQzlDLFFBQUEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekIsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNqQixRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLEtBQUE7QUFDSixDQUFBO0FBRUssTUFBTyxRQUFTLFNBQVEsU0FBdUIsQ0FBQTtBQUNqRCxJQUFBLFVBQVUsR0FBQTtBQUNOLFFBQUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNuQixRQUFBLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUNoRSxLQUFBO0FBQ0QsSUFBQSxHQUFHLENBQUMsQ0FBZSxFQUFBO0FBQ2YsUUFBQSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3ZCLFFBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBQzVGLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sZUFBZ0IsU0FBUSxTQUEyQixDQUFBO0FBQzVELElBQUEsVUFBVSxHQUFBO0FBQ04sUUFBQSxPQUFPLElBQUksQ0FBQztBQUNmLEtBQUE7QUFDRCxJQUFBLEdBQUcsQ0FBQyxDQUEyQixFQUFBO1FBQzNCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87QUFDOUMsUUFBQSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25CLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0QyxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdEIsS0FBQTtBQUNKLENBQUE7QUFFSyxNQUFPLGdCQUFpQixTQUFRLFNBQTRCLENBQUE7QUFDOUQsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsS0FBQTtBQUNELElBQUEsR0FBRyxDQUFDLENBQTRCLEVBQUE7UUFDNUIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztBQUM5QyxRQUFBLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkIsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEMsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNqQixRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLEtBQUE7QUFDSixDQUFBO0FBRUssTUFBTyxXQUFZLFNBQVEsU0FBdUIsQ0FBQTtBQUNwRCxJQUFBLFVBQVUsR0FBQTtBQUNOLFFBQUEsT0FBTyxJQUFJLENBQUM7QUFDZixLQUFBO0FBQ0QsSUFBQSxHQUFHLENBQUMsQ0FBdUIsRUFBQTtRQUN2QixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO0FBQzlDLFFBQUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNuQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNqQixRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLEtBQUE7QUFDSixDQUFBO0FBRUssTUFBTyxnQkFBaUIsU0FBUSxTQUFzQixDQUFBO0FBQ3hELElBQUEsVUFBVSxHQUFBO0FBQ04sUUFBQSxPQUFPLElBQUksQ0FBQztBQUNmLEtBQUE7QUFDRCxJQUFBLEdBQUcsQ0FBQyxDQUFzQixFQUFBO1FBQ3RCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87QUFDOUMsUUFBQSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25CLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsQyxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdEIsS0FBQTtBQUNKLENBQUE7QUFFSyxNQUFPLGlCQUFrQixTQUFRLFNBQXNCLENBQUE7QUFDekQsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sSUFBSSxDQUFDO0FBQ2YsS0FBQTtBQUNELElBQUEsR0FBRyxDQUFDLENBQXNCLEVBQUE7O0FBRXRCLFFBQUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNuQixFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdEIsS0FBQTtBQUNKLENBQUE7QUFFSyxNQUFPLGtCQUFtQixTQUFRLFNBQWMsQ0FBQTtBQUdsRCxJQUFBLFdBQUEsQ0FBWSxPQUFnQixFQUFBO1FBQ3hCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNmLFFBQUEsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUM7QUFDM0MsS0FBQTtBQUNELElBQUEsVUFBVSxHQUFBO0FBQ04sUUFBQSxPQUFPLElBQUksQ0FBQztBQUNmLEtBQUE7QUFDRCxJQUFBLEdBQUcsQ0FBQyxDQUFNLEVBQUE7QUFDTixRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO0FBQzNELFFBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdEIsS0FBQTtBQUNKLENBQUE7QUFFSyxNQUFPLGdCQUFpQixTQUFRLFNBQWlCLENBQUE7QUFDbkQsSUFBQSxVQUFVLEdBQUE7QUFDTixRQUFBLE9BQU8sQ0FBQyxDQUFDO0FBQ1osS0FBQTtBQUNELElBQUEsR0FBRyxDQUFDLENBQVMsRUFBQTtRQUNULElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87QUFDOUMsUUFBQSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25CLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8sZ0NBQWlDLFNBQVEsU0FBa0IsQ0FBQTtBQUNwRSxJQUFBLFVBQVUsR0FBQTtBQUNOLFFBQUEsT0FBTyxLQUFLLENBQUM7QUFDaEIsS0FBQTtBQUNELElBQUEsR0FBRyxDQUFDLENBQVUsRUFBQTtRQUNWLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87QUFDOUMsUUFBQSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25CLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLDhCQUE4QixFQUFJLENBQVUsQ0FBQyxDQUFDO0FBQ2hFLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVLLE1BQU8scUJBQXNCLFNBQVEsU0FBa0IsQ0FBQTtBQUN6RCxJQUFBLFVBQVUsR0FBQTtBQUNOLFFBQUEsT0FBTyxLQUFLLENBQUM7QUFDaEIsS0FBQTtBQUNELElBQUEsR0FBRyxDQUFDLENBQVUsRUFBQTtRQUNWLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87QUFDOUMsUUFBQSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25CLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFJLENBQVUsQ0FBQyxDQUFDO0FBQ3JELFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixLQUFBO0FBQ0osQ0FBQTtBQUVELE1BQU0scUJBQXlCLFNBQVEsU0FBWSxDQUFBO0FBSS9DLElBQUEsV0FBWSxDQUFBLE9BQWdCLEVBQUUsTUFBd0IsRUFBQTtRQUNsRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDZixRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDeEIsS0FBQTtBQUNELElBQUEsVUFBVSxHQUFBO0FBQ04sUUFBQSxPQUFPLElBQUksQ0FBQztBQUNmLEtBQUE7QUFDSixDQUFBO0FBRUssTUFBTyxlQUFnQixTQUFRLHFCQUFtQyxDQUFBO0FBQ3BFLElBQUEsUUFBUSxHQUFBO0FBQ0osUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNyQixLQUFBO0FBQ0QsSUFBQSxHQUFHLENBQUMsQ0FBdUIsRUFBQTtRQUN2QixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7OztBQUc5QyxRQUFBLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDbkIsUUFBQSxFQUFFLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkYsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNqQixRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLEtBQUE7QUFDSixDQUFBO0FBRUssTUFBTyxlQUFnQixTQUFRLHFCQUF3QyxDQUFBO0FBQ3pFLElBQUEsR0FBRyxDQUFDLENBQTRCLEVBQUE7UUFDNUIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDOzs7QUFHOUMsUUFBQSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ25CLFFBQUEsRUFBRSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEYsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNqQixRQUFBLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLEtBQUE7QUFDSixDQUFBOztBQ2hnQkQsTUFBTSxXQUFXLENBQUE7QUFRYixJQUFBLFdBQUEsQ0FBWSxPQUFnQixFQUFFLEtBQWEsRUFBRSxNQUFjLEVBQUUsUUFBaUIsRUFBQTtBQUMxRSxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDbkIsUUFBQSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNyQixRQUFBLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV0RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN6RCxRQUFBLElBQUksUUFBUSxFQUFFO1lBQ1YsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUQsU0FBQTtBQUNELFFBQUF6UyxXQUFNLENBQUEsTUFBQSxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDakYsS0FBQTtBQUVELElBQUEsT0FBTyxHQUFBO0FBQ0gsUUFBQSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUUzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzNDLFFBQUEsSUFBSSxPQUFPO0FBQUUsWUFBQSxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXZDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hELFlBQUEsSUFBSSxZQUFZO0FBQUUsZ0JBQUEsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3pELFNBQUE7QUFFRCxRQUFBLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUMsS0FBQTtBQUNKLENBQUE7O0FDcENELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQztBQUNwQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUM7QUFDbkIsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUM7QUFFbkMsTUFBTSxTQUFTLENBQUE7QUFLWCxJQUFBLFdBQUEsQ0FBWSxhQUE0QixFQUFFLFVBQWlCLEVBQUUsSUFBbUIsRUFBQTtBQUM1RSxRQUFBLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQ25DLFFBQUEsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDN0IsUUFBQSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNwQixLQUFBO0FBT0osQ0FBQTtBQUVELFNBQVMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFaEMsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFeVMsV0FBSyxDQUFBLEtBQUEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3ZHLFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRUEsV0FBSyxDQUFBLEtBQUEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3BHLFNBQVMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLENBQUMsRUFBRUEsaUJBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBOztBQ04vRyxNQUFNLE9BQU8sQ0FBQTtBQTRDVCxJQUFBLFdBQUEsQ0FBWSxFQUF5QixFQUFBO0FBQ2pDLFFBQUEsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUU1RSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JELFFBQUEsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxJQUFJLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTdELElBQUksQ0FBQywyQkFBMkIsSUFDNUIsRUFBRSxDQUFDLFlBQVksQ0FBQyxnQ0FBZ0MsQ0FBQztBQUNqRCxZQUFBLEVBQUUsQ0FBQyxZQUFZLENBQUMsb0NBQW9DLENBQUM7QUFDckQsWUFBQSxFQUFFLENBQUMsWUFBWSxDQUFDLHVDQUF1QyxDQUFDLENBQzNELENBQUM7UUFDRixJQUFJLElBQUksQ0FBQywyQkFBMkIsRUFBRTtBQUNsQyxZQUFBLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0FBQzFILFNBQUE7UUFFRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3JFLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO0FBQzFCLFlBQUEsRUFBRSxDQUFDLFlBQVksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQywyQkFBMkIsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLDZCQUE2QixDQUFDLENBQUM7QUFDckYsU0FBQTtRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUM5RCxLQUFBO0FBRUQsSUFBQSxVQUFVLEdBQUE7UUFDTixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7QUFFakIsUUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzdCLFFBQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM3QixRQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDL0IsUUFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM1QixRQUFBLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDOUIsUUFBQSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzlCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM1QixRQUFBLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDOUIsUUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzdCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM1QixRQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDNUIsUUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3hCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM1QixRQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDN0IsUUFBQSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2hDLFFBQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMzQixRQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDL0IsUUFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMxQixRQUFBLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDaEMsUUFBQSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2xDLFFBQUEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ25DLFFBQUEsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ25ELFFBQUEsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzNDLEtBQUE7QUFFRCxJQUFBLFFBQVEsR0FBQTtBQUNKLFFBQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzdCLFFBQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzdCLFFBQUEsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQy9CLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFFBQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFFBQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzdCLFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzVCLFFBQUEsSUFBSSxD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Q0FBQyxDQUFDO0FBQzdDLFNBQUE7UUFFRCxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUksRUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7UUFDN0QsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFJLEVBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO0FBQzdELFFBQUEsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFJLEVBQUEsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7O0FBRzlDLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7QUFJaEIsUUFBQSxJQUFJLENBQUMsR0FBMEIsVUFBVSxDQUFDLEVBQUE7QUFDdEMsWUFBQSxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUMzQyxTQUFDLENBQUM7OztBQUlGLFFBQUEsSUFBSSxDQUFDLEdBQTBCLFVBQVUsQ0FBQyxFQUFBO0FBQ3RDLFlBQUEsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN6RSxTQUFDLENBQUM7O0FBR0YsUUFBQSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDOztBQUcxQixRQUFBLElBQUksSUFBSSxD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
|